summaryrefslogblamecommitdiffstats
path: root/hw/arm/fsl-imx25.c
blob: 24c437459033c26f3970fa2e956389e52242de84 (plain) (tree)























                                                                               
                       
                       

                             
                               
                         
 

                                               




                                       
                                                                              
 
                                                                  
 
                                                                 

                                               
                                                                              


                                              
                                                                           


                                               
                                                                            

     
                                                               
 
                                                                  
 
                                              
                                                                         
     

                                               
                                                                            
     

                                                
                                                                              
     

                                              
                                                                          

     
                                                                







                                                             
                                                     


               
                                                          







                                                                       
                                                         
















                                                                    
                                                                        
 
                                                                 



















                                                                              
                                         
 
                                                                

















                                                                          
                                          
 
                                                                 







                                                                            
                                                                           
                                                           
 
                                                         





                                                                              
                                                          




                                                                               











                                                        
                                                                







                                                                          











                                                          
                                                                 








                                                                            









                                                            
                                                                            
                                               



                                                                         
                                                                  







                                                                              









                                                        
                                                                 





                                                                          
                  
                                                                         
                                           
                                                          




                                                                           
                                  

                                                                 





                                                                         

                                                                 







                                                                         
                                                                             






                                                                         

                                                               
                                                                             




                                                                               




                                                                 



                                                             
                                                     
                                    
                            




                                                                      















                                               
/*
 * Copyright (c) 2013 Jean-Christophe Dubois <jcd@tribudubois.net>
 *
 * i.MX25 SOC emulation.
 *
 * Based on hw/arm/xlnx-zynqmp.c
 *
 * Copyright (C) 2015 Xilinx Inc
 * Written by Peter Crosthwaite <peter.crosthwaite@xilinx.com>
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the
 *  Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but WITHOUT
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 *  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 *  for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#include "qemu/osdep.h"
#include "qapi/error.h"
#include "hw/arm/fsl-imx25.h"
#include "sysemu/sysemu.h"
#include "hw/qdev-properties.h"
#include "chardev/char.h"

#define IMX25_ESDHC_CAPABILITIES     0x07e20000

static void fsl_imx25_init(Object *obj)
{
    FslIMX25State *s = FSL_IMX25(obj);
    int i;

    object_initialize_child(obj, "cpu", &s->cpu, ARM_CPU_TYPE_NAME("arm926"));

    object_initialize_child(obj, "avic", &s->avic, TYPE_IMX_AVIC);

    object_initialize_child(obj, "ccm", &s->ccm, TYPE_IMX25_CCM);

    for (i = 0; i < FSL_IMX25_NUM_UARTS; i++) {
        object_initialize_child(obj, "uart[*]", &s->uart[i], TYPE_IMX_SERIAL);
    }

    for (i = 0; i < FSL_IMX25_NUM_GPTS; i++) {
        object_initialize_child(obj, "gpt[*]", &s->gpt[i], TYPE_IMX25_GPT);
    }

    for (i = 0; i < FSL_IMX25_NUM_EPITS; i++) {
        object_initialize_child(obj, "epit[*]", &s->epit[i], TYPE_IMX_EPIT);
    }

    object_initialize_child(obj, "fec", &s->fec, TYPE_IMX_FEC);

    object_initialize_child(obj, "rngc", &s->rngc, TYPE_IMX_RNGC);

    for (i = 0; i < FSL_IMX25_NUM_I2CS; i++) {
        object_initialize_child(obj, "i2c[*]", &s->i2c[i], TYPE_IMX_I2C);
    }

    for (i = 0; i < FSL_IMX25_NUM_GPIOS; i++) {
        object_initialize_child(obj, "gpio[*]", &s->gpio[i], TYPE_IMX_GPIO);
    }

    for (i = 0; i < FSL_IMX25_NUM_ESDHCS; i++) {
        object_initialize_child(obj, "sdhc[*]", &s->esdhc[i], TYPE_IMX_USDHC);
    }

    for (i = 0; i < FSL_IMX25_NUM_USBS; i++) {
        object_initialize_child(obj, "usb[*]", &s->usb[i], TYPE_CHIPIDEA);
    }

    object_initialize_child(obj, "wdt", &s->wdt, TYPE_IMX2_WDT);
}

static void fsl_imx25_realize(DeviceState *dev, Error **errp)
{
    FslIMX25State *s = FSL_IMX25(dev);
    uint8_t i;
    Error *err = NULL;

    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
        return;
    }

    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
        return;
    }
    sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX25_AVIC_ADDR);
    sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 0,
                       qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
    sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                       qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));

    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
        return;
    }
    sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX25_CCM_ADDR);

    /* Initialize all UARTs */
    for (i = 0; i < FSL_IMX25_NUM_UARTS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } serial_table[FSL_IMX25_NUM_UARTS] = {
            { FSL_IMX25_UART1_ADDR, FSL_IMX25_UART1_IRQ },
            { FSL_IMX25_UART2_ADDR, FSL_IMX25_UART2_IRQ },
            { FSL_IMX25_UART3_ADDR, FSL_IMX25_UART3_IRQ },
            { FSL_IMX25_UART4_ADDR, FSL_IMX25_UART4_IRQ },
            { FSL_IMX25_UART5_ADDR, FSL_IMX25_UART5_IRQ }
        };

        qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));

        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
            return;
        }
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            serial_table[i].irq));
    }

    /* Initialize all GPT timers */
    for (i = 0; i < FSL_IMX25_NUM_GPTS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } gpt_table[FSL_IMX25_NUM_GPTS] = {
            { FSL_IMX25_GPT1_ADDR, FSL_IMX25_GPT1_IRQ },
            { FSL_IMX25_GPT2_ADDR, FSL_IMX25_GPT2_IRQ },
            { FSL_IMX25_GPT3_ADDR, FSL_IMX25_GPT3_IRQ },
            { FSL_IMX25_GPT4_ADDR, FSL_IMX25_GPT4_IRQ }
        };

        s->gpt[i].ccm = IMX_CCM(&s->ccm);

        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), errp)) {
            return;
        }
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, gpt_table[i].addr);
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpt[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            gpt_table[i].irq));
    }

    /* Initialize all EPIT timers */
    for (i = 0; i < FSL_IMX25_NUM_EPITS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } epit_table[FSL_IMX25_NUM_EPITS] = {
            { FSL_IMX25_EPIT1_ADDR, FSL_IMX25_EPIT1_IRQ },
            { FSL_IMX25_EPIT2_ADDR, FSL_IMX25_EPIT2_IRQ }
        };

        s->epit[i].ccm = IMX_CCM(&s->ccm);

        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
            return;
        }
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->epit[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            epit_table[i].irq));
    }

    object_property_set_uint(OBJECT(&s->fec), "phy-num", s->phy_num, &err);
    qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);

    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fec), errp)) {
        return;
    }
    sysbus_mmio_map(SYS_BUS_DEVICE(&s->fec), 0, FSL_IMX25_FEC_ADDR);
    sysbus_connect_irq(SYS_BUS_DEVICE(&s->fec), 0,
                       qdev_get_gpio_in(DEVICE(&s->avic), FSL_IMX25_FEC_IRQ));

    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rngc), errp)) {
        return;
    }
    sysbus_mmio_map(SYS_BUS_DEVICE(&s->rngc), 0, FSL_IMX25_RNGC_ADDR);
    sysbus_connect_irq(SYS_BUS_DEVICE(&s->rngc), 0,
                       qdev_get_gpio_in(DEVICE(&s->avic), FSL_IMX25_RNGC_IRQ));

    /* Initialize all I2C */
    for (i = 0; i < FSL_IMX25_NUM_I2CS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } i2c_table[FSL_IMX25_NUM_I2CS] = {
            { FSL_IMX25_I2C1_ADDR, FSL_IMX25_I2C1_IRQ },
            { FSL_IMX25_I2C2_ADDR, FSL_IMX25_I2C2_IRQ },
            { FSL_IMX25_I2C3_ADDR, FSL_IMX25_I2C3_IRQ }
        };

        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
            return;
        }
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            i2c_table[i].irq));
    }

    /* Initialize all GPIOs */
    for (i = 0; i < FSL_IMX25_NUM_GPIOS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } gpio_table[FSL_IMX25_NUM_GPIOS] = {
            { FSL_IMX25_GPIO1_ADDR, FSL_IMX25_GPIO1_IRQ },
            { FSL_IMX25_GPIO2_ADDR, FSL_IMX25_GPIO2_IRQ },
            { FSL_IMX25_GPIO3_ADDR, FSL_IMX25_GPIO3_IRQ },
            { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
        };

        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
            return;
        }
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
        /* Connect GPIO IRQ to PIC */
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            gpio_table[i].irq));
    }

    /* Initialize all SDHC */
    for (i = 0; i < FSL_IMX25_NUM_ESDHCS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } esdhc_table[FSL_IMX25_NUM_ESDHCS] = {
            { FSL_IMX25_ESDHC1_ADDR, FSL_IMX25_ESDHC1_IRQ },
            { FSL_IMX25_ESDHC2_ADDR, FSL_IMX25_ESDHC2_IRQ },
        };

        object_property_set_uint(OBJECT(&s->esdhc[i]), "sd-spec-version", 2,
                                 &error_abort);
        object_property_set_uint(OBJECT(&s->esdhc[i]), "capareg",
                                 IMX25_ESDHC_CAPABILITIES, &error_abort);
        object_property_set_uint(OBJECT(&s->esdhc[i]), "vendor",
                                 SDHCI_VENDOR_IMX, &error_abort);
        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
            return;
        }
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->esdhc[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            esdhc_table[i].irq));
    }

    /* USB */
    for (i = 0; i < FSL_IMX25_NUM_USBS; i++) {
        static const struct {
            hwaddr addr;
            unsigned int irq;
        } usb_table[FSL_IMX25_NUM_USBS] = {
            { FSL_IMX25_USB1_ADDR, FSL_IMX25_USB1_IRQ },
            { FSL_IMX25_USB2_ADDR, FSL_IMX25_USB2_IRQ },
        };

        sysbus_realize(SYS_BUS_DEVICE(&s->usb[i]), &error_abort);
        sysbus_mmio_map(SYS_BUS_DEVICE(&s->usb[i]), 0, usb_table[i].addr);
        sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i]), 0,
                           qdev_get_gpio_in(DEVICE(&s->avic),
                                            usb_table[i].irq));
    }

    /* Watchdog */
    object_property_set_bool(OBJECT(&s->wdt), "pretimeout-support", true,
                             &error_abort);
    sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_abort);
    sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt), 0, FSL_IMX25_WDT_ADDR);
    sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt), 0,
                                      qdev_get_gpio_in(DEVICE(&s->avic),
                                                       FSL_IMX25_WDT_IRQ));

    /* initialize 2 x 16 KB ROM */
    memory_region_init_rom(&s->rom[0], OBJECT(dev), "imx25.rom0",
                           FSL_IMX25_ROM0_SIZE, &err);
    if (err) {
        error_propagate(errp, err);
        return;
    }
    memory_region_add_subregion(get_system_memory(), FSL_IMX25_ROM0_ADDR,
                                &s->rom[0]);
    memory_region_init_rom(&s->rom[1], OBJECT(dev), "imx25.rom1",
                           FSL_IMX25_ROM1_SIZE, &err);
    if (err) {
        error_propagate(errp, err);
        return;
    }
    memory_region_add_subregion(get_system_memory(), FSL_IMX25_ROM1_ADDR,
                                &s->rom[1]);

    /* initialize internal RAM (128 KB) */
    memory_region_init_ram(&s->iram, NULL, "imx25.iram", FSL_IMX25_IRAM_SIZE,
                           &err);
    if (err) {
        error_propagate(errp, err);
        return;
    }
    memory_region_add_subregion(get_system_memory(), FSL_IMX25_IRAM_ADDR,
                                &s->iram);

    /* internal RAM (128 KB) is aliased over 128 MB - 128 KB */
    memory_region_init_alias(&s->iram_alias, OBJECT(dev), "imx25.iram_alias",
                             &s->iram, 0, FSL_IMX25_IRAM_ALIAS_SIZE);
    memory_region_add_subregion(get_system_memory(), FSL_IMX25_IRAM_ALIAS_ADDR,
                                &s->iram_alias);
}

static Property fsl_imx25_properties[] = {
    DEFINE_PROP_UINT32("fec-phy-num", FslIMX25State, phy_num, 0),
    DEFINE_PROP_END_OF_LIST(),
};

static void fsl_imx25_class_init(ObjectClass *oc, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(oc);

    device_class_set_props(dc, fsl_imx25_properties);
    dc->realize = fsl_imx25_realize;
    dc->desc = "i.MX25 SOC";
    /*
     * Reason: uses serial_hds in realize and the imx25 board does not
     * support multiple CPUs
     */
    dc->user_creatable = false;
}

static const TypeInfo fsl_imx25_type_info = {
    .name = TYPE_FSL_IMX25,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(FslIMX25State),
    .instance_init = fsl_imx25_init,
    .class_init = fsl_imx25_class_init,
};

static void fsl_imx25_register_types(void)
{
    type_register_static(&fsl_imx25_type_info);
}

type_init(fsl_imx25_register_types)
at' width='100%'> -rw-r--r--hacks/config/ifs.xml65
-rw-r--r--hacks/config/imsmap.xml46
-rw-r--r--hacks/config/interaggregate.xml33
-rw-r--r--hacks/config/interference.xml57
-rw-r--r--hacks/config/intermomentary.xml37
-rw-r--r--hacks/config/jigglypuff.xml95
-rw-r--r--hacks/config/jigsaw.xml51
-rw-r--r--hacks/config/juggle.xml60
-rw-r--r--hacks/config/juggler3d.xml55
-rw-r--r--hacks/config/julia.xml39
-rw-r--r--hacks/config/kaleidescope.xml42
-rw-r--r--hacks/config/kaleidocycle.xml57
-rw-r--r--hacks/config/klein.xml135
-rw-r--r--hacks/config/kumppa.xml32
-rw-r--r--hacks/config/lament.xml29
-rw-r--r--hacks/config/laser.xml38
-rw-r--r--hacks/config/lavalite.xml90
-rw-r--r--hacks/config/lcdscrub.xml58
-rw-r--r--hacks/config/lightning.xml30
-rw-r--r--hacks/config/lisa.xml50
-rw-r--r--hacks/config/lissie.xml52
-rw-r--r--hacks/config/lmorph.xml51
-rw-r--r--hacks/config/lockward.xml67
-rw-r--r--hacks/config/loop.xml37
-rw-r--r--hacks/config/m6502.xml55
-rw-r--r--hacks/config/maze.xml71
-rwxr-xr-xhacks/config/maze3d.xml122
-rw-r--r--hacks/config/memscroller.xml35
-rw-r--r--hacks/config/menger.xml51
-rw-r--r--hacks/config/metaballs.xml53
-rw-r--r--hacks/config/mirrorblob.xml75
-rw-r--r--hacks/config/mismunch.xml44
-rw-r--r--hacks/config/moebius.xml29
-rw-r--r--hacks/config/moebiusgears.xml47
-rw-r--r--hacks/config/moire.xml38
-rw-r--r--hacks/config/moire2.xml34
-rw-r--r--hacks/config/molecule.xml60
-rw-r--r--hacks/config/morph3d.xml34
-rw-r--r--hacks/config/mountain.xml31
-rw-r--r--hacks/config/munch.xml63
-rw-r--r--hacks/config/nerverot.xml62
-rw-r--r--hacks/config/noof.xml23
-rw-r--r--hacks/config/noseguy.xml19
-rw-r--r--hacks/config/pacman.xml28
-rw-r--r--hacks/config/pedal.xml33
-rw-r--r--hacks/config/peepers.xml47
-rw-r--r--hacks/config/penetrate.xml34
-rw-r--r--hacks/config/penrose.xml55
-rw-r--r--hacks/config/petri.xml83
-rw-r--r--hacks/config/phosphor.xml49
-rw-r--r--hacks/config/photopile.xml65
-rw-r--r--hacks/config/piecewise.xml45
-rw-r--r--hacks/config/pinion.xml49
-rw-r--r--hacks/config/pipes.xml49
-rw-r--r--hacks/config/polyhedra.xml201
-rw-r--r--hacks/config/polyominoes.xml36
-rw-r--r--hacks/config/polytopes.xml112
-rw-r--r--hacks/config/pong.xml46
-rw-r--r--hacks/config/popsquares.xml56
-rw-r--r--hacks/config/projectiveplane.xml157
-rw-r--r--hacks/config/providence.xml29
-rw-r--r--hacks/config/pulsar.xml42
-rw-r--r--hacks/config/pyro.xml37
-rw-r--r--hacks/config/qix.xml74
-rw-r--r--hacks/config/quasicrystal.xml56
-rw-r--r--hacks/config/queens.xml31
-rw-r--r--hacks/config/raverhoop.xml54
-rw-r--r--hacks/config/razzledazzle.xml66
-rw-r--r--hacks/config/rd-bomb.xml67
l---------hacks/config/rdbomb.xml1
-rw-r--r--hacks/config/ripples.xml54
-rw-r--r--hacks/config/rocks.xml45
-rw-r--r--hacks/config/romanboy.xml132
-rw-r--r--hacks/config/rorschach.xml36
-rw-r--r--hacks/config/rotor.xml40
-rw-r--r--hacks/config/rotzoomer.xml43
-rw-r--r--hacks/config/rubik.xml39
-rw-r--r--hacks/config/rubikblocks.xml67
-rw-r--r--hacks/config/sballs.xml37
-rw-r--r--hacks/config/scooter.xml42
-rw-r--r--hacks/config/shadebobs.xml38
-rw-r--r--hacks/config/sierpinski.xml37
-rw-r--r--hacks/config/sierpinski3d.xml34
-rw-r--r--hacks/config/skytentacles.xml71
-rw-r--r--hacks/config/slidescreen.xml54
-rw-r--r--hacks/config/slip.xml43
-rw-r--r--hacks/config/sonar.xml85
-rw-r--r--hacks/config/speedmine.xml62
-rw-r--r--hacks/config/sphere.xml30
-rw-r--r--hacks/config/sphereeversion.xml98
-rw-r--r--hacks/config/spheremonics.xml60
-rw-r--r--hacks/config/spiral.xml38
-rw-r--r--hacks/config/splitflap.xml72
-rw-r--r--hacks/config/splodesic.xml32
-rw-r--r--hacks/config/spotlight.xml34
-rw-r--r--hacks/config/sproingies.xml36
-rw-r--r--hacks/config/squiral.xml51
-rw-r--r--hacks/config/stairs.xml25
-rw-r--r--hacks/config/starfish.xml43
-rw-r--r--hacks/config/starwars.xml63
-rw-r--r--hacks/config/stonerview.xml27
-rw-r--r--hacks/config/strange.xml58
-rw-r--r--hacks/config/substrate.xml47
-rw-r--r--hacks/config/superquadrics.xml36
-rw-r--r--hacks/config/surfaces.xml75
-rw-r--r--hacks/config/swirl.xml33
-rw-r--r--hacks/config/t3d.xml60
-rw-r--r--hacks/config/tangram.xml45
-rw-r--r--hacks/config/tessellimage.xml66
-rw-r--r--hacks/config/testx11.xml17
-rw-r--r--hacks/config/thornbird.xml37
-rw-r--r--hacks/config/timetunnel.xml42
-rw-r--r--hacks/config/topblock.xml64
-rw-r--r--hacks/config/triangle.xml28
-rw-r--r--hacks/config/tronbit.xml41
-rw-r--r--hacks/config/truchet.xml41
-rw-r--r--hacks/config/twang.xml61
-rw-r--r--hacks/config/unicrud.xml44
-rw-r--r--hacks/config/unknownpleasures.xml68
-rw-r--r--hacks/config/vermiculate.xml22
-rw-r--r--hacks/config/vfeedback.xml39
-rw-r--r--hacks/config/vidwhacker.xml32
-rw-r--r--hacks/config/vigilance.xml30
-rw-r--r--hacks/config/vines.xml30
-rw-r--r--hacks/config/voronoi.xml63
-rw-r--r--hacks/config/wander.xml55
-rw-r--r--hacks/config/webcollage.xml56
-rw-r--r--hacks/config/whirlwindwarp.xml28
-rw-r--r--hacks/config/whirlygig.xml90
-rw-r--r--hacks/config/winduprobot.xml62
-rw-r--r--hacks/config/worm.xml39
-rw-r--r--hacks/config/wormhole.xml31
-rw-r--r--hacks/config/xanalogtv.xml48
-rw-r--r--hacks/config/xflame.xml34
-rw-r--r--hacks/config/xjack.xml25
-rw-r--r--hacks/config/xlyap.xml52
-rw-r--r--hacks/config/xmatrix.xml68
-rw-r--r--hacks/config/xrayswarm.xml23
-rw-r--r--hacks/config/xspirograph.xml32
-rw-r--r--hacks/config/xss.dtd109
-rw-r--r--hacks/config/xss.xsd375
-rw-r--r--hacks/config/zoom.xml54
-rw-r--r--hacks/coral.c318
-rw-r--r--hacks/coral.man64
-rw-r--r--hacks/critical.c461
-rw-r--r--hacks/critical.man94
-rw-r--r--hacks/crystal.c1285
-rw-r--r--hacks/crystal.man81
-rw-r--r--hacks/cwaves.c218
-rw-r--r--hacks/cwaves.man76
-rw-r--r--hacks/cynosure.c448
-rw-r--r--hacks/cynosure.man64
-rw-r--r--hacks/decayscreen.c399
-rw-r--r--hacks/decayscreen.man92
-rw-r--r--hacks/deco.c341
-rw-r--r--hacks/deco.man105
-rw-r--r--hacks/delaunay.c303
-rw-r--r--hacks/delaunay.h48
-rw-r--r--hacks/deluxe.c478
-rw-r--r--hacks/deluxe.man72
-rw-r--r--hacks/demon.c952
-rw-r--r--hacks/demon.man69
-rw-r--r--hacks/discrete.c440
-rw-r--r--hacks/discrete.man61
-rw-r--r--hacks/distort.c897
-rw-r--r--hacks/distort.man137
-rw-r--r--hacks/drift.c673
-rw-r--r--hacks/drift.man79
-rw-r--r--hacks/epicycle.c798
-rw-r--r--hacks/epicycle.man167
-rw-r--r--hacks/eruption.c607
-rw-r--r--hacks/eruption.man77
-rw-r--r--hacks/euler2d.c887
-rw-r--r--hacks/euler2d.man69
-rw-r--r--hacks/euler2d.tex337
-rw-r--r--hacks/fadeplot.c233
-rw-r--r--hacks/fadeplot.man65
-rw-r--r--hacks/fiberlamp.c474
-rw-r--r--hacks/fiberlamp.man65
-rw-r--r--hacks/filmleader.c561
-rw-r--r--hacks/filmleader.man69
-rw-r--r--hacks/fireworkx.c879
-rw-r--r--hacks/fireworkx.man88
-rw-r--r--hacks/flag.c573
-rw-r--r--hacks/flag.man92
-rw-r--r--hacks/flame.c468
-rw-r--r--hacks/flame.man74
-rw-r--r--hacks/flow.c1211
-rw-r--r--hacks/flow.man137
-rw-r--r--hacks/fluidballs.c877
-rw-r--r--hacks/fluidballs.man90
-rw-r--r--hacks/fontglide.c2582
-rw-r--r--hacks/fontglide.man124
-rw-r--r--hacks/fonts/Makefile.in96
-rw-r--r--hacks/fonts/OCRAStd.otfbin30636 -> 0 bytes-rw-r--r--hacks/fonts/SpecialElite.ttfbin166224 -> 0 bytes-rw-r--r--hacks/fonts/clacon.ttfbin103892 -> 0 bytes-rw-r--r--hacks/fonts/gallant12x22.ttfbin25644 -> 0 bytes-rw-r--r--hacks/fonts/luximr.ttfbin71784 -> 0 bytes-rw-r--r--hacks/forest.c240
-rw-r--r--hacks/forest.man62
-rw-r--r--hacks/fps.c300
-rw-r--r--hacks/fps.h31
-rw-r--r--hacks/fpsI.h40
-rw-r--r--hacks/fuzzyflakes.c654
-rw-r--r--hacks/fuzzyflakes.man112
-rw-r--r--hacks/galaxy.c451
-rw-r--r--hacks/galaxy.man87
-rw-r--r--hacks/glitchpeg.c465
-rw-r--r--hacks/glitchpeg.man79
-rw-r--r--hacks/glx/Makefile.in4757
-rw-r--r--hacks/glx/README9
-rw-r--r--hacks/glx/antinspect.c695
-rw-r--r--hacks/glx/antinspect.man56
-rw-r--r--hacks/glx/antmaze.c1611
-rw-r--r--hacks/glx/antmaze.man52
-rw-r--r--hacks/glx/ants.h45
-rw-r--r--hacks/glx/antspotlight.c796
-rw-r--r--hacks/glx/antspotlight.man56
-rw-r--r--hacks/glx/atlantis.c578
-rw-r--r--hacks/glx/atlantis.h118
-rw-r--r--hacks/glx/atlantis.man78
-rw-r--r--hacks/glx/atunnel.c314
-rw-r--r--hacks/glx/atunnel.man70
-rw-r--r--hacks/glx/b_draw.c239
-rw-r--r--hacks/glx/b_lockglue.c238
-rw-r--r--hacks/glx/b_sphere.c219
-rw-r--r--hacks/glx/beats.c439
-rw-r--r--hacks/glx/beats.man75
-rw-r--r--hacks/glx/blinkbox.c614
-rw-r--r--hacks/glx/blinkbox.man73
-rw-r--r--hacks/glx/blocktube.c453
-rw-r--r--hacks/glx/blocktube.man73
-rw-r--r--hacks/glx/boing.c665
-rw-r--r--hacks/glx/boing.man105
-rw-r--r--hacks/glx/bouncingcow.c648
-rw-r--r--hacks/glx/bouncingcow.man78
-rw-r--r--hacks/glx/boxed.c1360
-rw-r--r--hacks/glx/boxed.h4116
-rw-r--r--hacks/glx/boxed.man56
-rw-r--r--hacks/glx/bubble3d.c281
-rw-r--r--hacks/glx/bubble3d.h88
-rw-r--r--hacks/glx/bubble3d.man62
-rw-r--r--hacks/glx/buildlwo.c98
-rw-r--r--hacks/glx/buildlwo.h24
-rw-r--r--hacks/glx/cage.c497
-rw-r--r--hacks/glx/cage.man61
-rw-r--r--hacks/glx/carousel.c958
-rw-r--r--hacks/glx/carousel.man109
-rw-r--r--hacks/glx/chessgames.h343
-rw-r--r--hacks/glx/chessmodels.c1720
-rw-r--r--hacks/glx/chessmodels.h44
-rw-r--r--hacks/glx/circuit.c2105
-rw-r--r--hacks/glx/circuit.man72
-rw-r--r--hacks/glx/cityflow.c560
-rw-r--r--hacks/glx/cityflow.man77
-rw-r--r--hacks/glx/companion.c604
-rw-r--r--hacks/glx/companion_disc.c9593
-rw-r--r--hacks/glx/companion_heart.c653
-rw-r--r--hacks/glx/companion_quad.c389
-rw-r--r--hacks/glx/companioncube.man85
-rw-r--r--hacks/glx/covid19.c656
-rw-r--r--hacks/glx/covid19.man72
-rw-r--r--hacks/glx/cow_face.c341
-rw-r--r--hacks/glx/cow_hide.c13055
-rw-r--r--hacks/glx/cow_hoofs.c1037
-rw-r--r--hacks/glx/cow_horns.c1025
-rw-r--r--hacks/glx/cow_tail.c464
-rw-r--r--hacks/glx/cow_udder.c1520
-rw-r--r--hacks/glx/crackberg.c1483
-rw-r--r--hacks/glx/crackberg.man123
-rw-r--r--hacks/glx/crumbler.c922
-rw-r--r--hacks/glx/crumbler.man77
-rw-r--r--hacks/glx/cube21.c942
-rw-r--r--hacks/glx/cube21.man147
-rw-r--r--hacks/glx/cubenetic.c615
-rw-r--r--hacks/glx/cubenetic.man89
-rw-r--r--hacks/glx/cubestack.c470
-rw-r--r--hacks/glx/cubestack.man72
-rw-r--r--hacks/glx/cubestorm.c484
-rw-r--r--hacks/glx/cubestorm.man77
-rw-r--r--hacks/glx/cubetwist.c596
-rw-r--r--hacks/glx/cubetwist.man80
-rw-r--r--hacks/glx/cubicgrid.c320
-rw-r--r--hacks/glx/cubicgrid.man88
-rw-r--r--hacks/glx/curlicue.h261
-rw-r--r--hacks/glx/dangerball.c375
-rw-r--r--hacks/glx/dangerball.man72
-rw-r--r--hacks/glx/deepstars.c384
-rw-r--r--hacks/glx/deepstars.man57
-rw-r--r--hacks/glx/discoball.c708
-rw-r--r--hacks/glx/discoball.man72
-rw-r--r--hacks/glx/dnalogo.c3656
-rw-r--r--hacks/glx/dnapizza.h122
-rw-r--r--hacks/glx/dolphin.c2061
-rw-r--r--hacks/glx/dropshadow.c178
-rw-r--r--hacks/glx/dropshadow.h34
-rwxr-xr-xhacks/glx/dxf2gl.pl736
-rw-r--r--hacks/glx/dymaxionmap-coords.c685
-rw-r--r--hacks/glx/dymaxionmap-coords.h6
-rw-r--r--hacks/glx/dymaxionmap.c1652
-rw-r--r--hacks/glx/dymaxionmap.man117
-rw-r--r--hacks/glx/e_textures.h1478
-rw-r--r--hacks/glx/endgame.c983
-rw-r--r--hacks/glx/endgame.man72
-rw-r--r--hacks/glx/energystream.c535
-rw-r--r--hacks/glx/energystream.man56
-rw-r--r--hacks/glx/engine.c1014
-rw-r--r--hacks/glx/engine.man80
-rw-r--r--hacks/glx/erase-gl.c38
-rw-r--r--hacks/glx/esper.c2481
-rw-r--r--hacks/glx/esper.man68
-rw-r--r--hacks/glx/etruscanvenus.c2776
-rw-r--r--hacks/glx/etruscanvenus.man372
-rw-r--r--hacks/glx/extrusion-helix2.c47
-rw-r--r--hacks/glx/extrusion-helix3.c46
-rw-r--r--hacks/glx/extrusion-helix4.c63
-rw-r--r--hacks/glx/extrusion-joinoffset.c148
-rw-r--r--hacks/glx/extrusion-screw.c114
-rw-r--r--hacks/glx/extrusion-taper.c218
-rw-r--r--hacks/glx/extrusion-twistoid.c215
-rw-r--r--hacks/glx/extrusion.c551
-rw-r--r--hacks/glx/extrusion.h47
-rw-r--r--hacks/glx/extrusion.man71
-rw-r--r--hacks/glx/flipflop.c875
-rw-r--r--hacks/glx/flipflop.man95
-rw-r--r--hacks/glx/flipscreen3d.c523
-rw-r--r--hacks/glx/flipscreen3d.man61
-rw-r--r--hacks/glx/fliptext.c1003
-rw-r--r--hacks/glx/fliptext.man114
-rw-r--r--hacks/glx/flurry-smoke.c1441
-rw-r--r--hacks/glx/flurry-spark.c285
-rw-r--r--hacks/glx/flurry-star.c106
-rw-r--r--hacks/glx/flurry-texture.c225
-rw-r--r--hacks/glx/flurry.c549
-rw-r--r--hacks/glx/flurry.h286
-rw-r--r--hacks/glx/flurry.man73
-rw-r--r--hacks/glx/flyingtoasters.c905
-rw-r--r--hacks/glx/flyingtoasters.man90
-rw-r--r--hacks/glx/fps-gl.c94
-rw-r--r--hacks/glx/gears.c952
-rw-r--r--hacks/glx/gears.man79
-rw-r--r--hacks/glx/geodesic.c824
-rw-r--r--hacks/glx/geodesic.man79
-rw-r--r--hacks/glx/geodesicgears.c1801
-rw-r--r--hacks/glx/geodesicgears.man78
-rw-r--r--hacks/glx/gflux.c798
-rw-r--r--hacks/glx/gflux.man111
-rw-r--r--hacks/glx/gibson.c1333
-rw-r--r--hacks/glx/gibson.man88
-rw-r--r--hacks/glx/glblur.c629
-rw-r--r--hacks/glx/glblur.man76
-rw-r--r--hacks/glx/glcells.c1381
-rw-r--r--hacks/glx/glcells.man97
-rw-r--r--hacks/glx/gleidescope.c1619
-rw-r--r--hacks/glx/gleidescope.man77
-rw-r--r--hacks/glx/glforestfire.c1088
-rw-r--r--hacks/glx/glforestfire.man117
-rw-r--r--hacks/glx/glhanoi.c2091
-rw-r--r--hacks/glx/glhanoi.man83
-rw-r--r--hacks/glx/glknots.c454
-rw-r--r--hacks/glx/glknots.man81
-rw-r--r--hacks/glx/gllist.c127
-rw-r--r--hacks/glx/gllist.h29
-rw-r--r--hacks/glx/glmatrix.c1076
-rw-r--r--hacks/glx/glmatrix.man116
-rw-r--r--hacks/glx/glplanet.c1007
-rw-r--r--hacks/glx/glplanet.man85
-rw-r--r--hacks/glx/glschool.c228
-rw-r--r--hacks/glx/glschool.h17
-rw-r--r--hacks/glx/glschool.man126
-rw-r--r--hacks/glx/glschool_alg.c364
-rw-r--r--hacks/glx/glschool_alg.h126
-rw-r--r--hacks/glx/glschool_gl.c274
-rw-r--r--hacks/glx/glschool_gl.h30
-rw-r--r--hacks/glx/glsl-utils.c391
-rw-r--r--hacks/glx/glsl-utils.h73
-rw-r--r--hacks/glx/glslideshow.c1308
-rw-r--r--hacks/glx/glslideshow.man131
-rw-r--r--hacks/glx/glsnake.c2685
-rw-r--r--hacks/glx/glsnake.man94
-rw-r--r--hacks/glx/gltext.c618
-rw-r--r--hacks/glx/gltext.man143
-rw-r--r--hacks/glx/gltrackball.c327
-rw-r--r--hacks/glx/gltrackball.h73
-rw-r--r--hacks/glx/glut_mroman.h2456
-rw-r--r--hacks/glx/glut_roman.h2455
-rw-r--r--hacks/glx/glut_stroke.c49
-rw-r--r--hacks/glx/glut_swidth.c65
-rw-r--r--hacks/glx/glutstroke.h47
-rw-r--r--hacks/glx/grab-ximage.c1187
-rw-r--r--hacks/glx/grab-ximage.h127
-rw-r--r--hacks/glx/gravitywell.c769
-rw-r--r--hacks/glx/gravitywell.man64
-rw-r--r--hacks/glx/handsy.c1173
-rw-r--r--hacks/glx/handsy.dxf67706
-rw-r--r--hacks/glx/handsy.man76
-rw-r--r--hacks/glx/handsy_anim.h805
-rw-r--r--hacks/glx/handsy_model.c6684
-rw-r--r--hacks/glx/headroom.c559
-rw-r--r--hacks/glx/headroom.dxf259600
-rw-r--r--hacks/glx/headroom.man72
-rw-r--r--hacks/glx/headroom_model.c26005
-rw-r--r--hacks/glx/hexstrut.c513
-rw-r--r--hacks/glx/hexstrut.man77
-rw-r--r--hacks/glx/hilbert.c1164
-rw-r--r--hacks/glx/hilbert.man103
-rw-r--r--hacks/glx/hydrostat.c816
-rw-r--r--hacks/glx/hydrostat.man103
-rw-r--r--hacks/glx/hypertorus.c1983
-rw-r--r--hacks/glx/hypertorus.man214
-rw-r--r--hacks/glx/hypnowheel.c334
-rw-r--r--hacks/glx/hypnowheel.man80
-rw-r--r--hacks/glx/involute.c976
-rw-r--r--hacks/glx/involute.h78
-rw-r--r--hacks/glx/jigglypuff.c1124
-rw-r--r--hacks/glx/jigglypuff.man121
-rw-r--r--hacks/glx/jigsaw.c1511
-rw-r--r--hacks/glx/jigsaw.man90
-rw-r--r--hacks/glx/juggler3d.c3024
-rw-r--r--hacks/glx/juggler3d.man183
-rw-r--r--hacks/glx/kaleidocycle.c583
-rw-r--r--hacks/glx/kaleidocycle.man83
-rw-r--r--hacks/glx/klein.c3581
-rw-r--r--hacks/glx/klein.man340
-rw-r--r--hacks/glx/lament.c1800
-rw-r--r--hacks/glx/lament.dxf163404
-rw-r--r--hacks/glx/lament.man68
-rw-r--r--hacks/glx/lament_model.c16258
-rw-r--r--hacks/glx/lavalite.c1550
-rw-r--r--hacks/glx/lavalite.man147
-rw-r--r--hacks/glx/lockward.c963
-rw-r--r--hacks/glx/lockward.man79
-rw-r--r--hacks/glx/marching.c628
-rw-r--r--hacks/glx/marching.h48
-rwxr-xr-xhacks/glx/maze3d.c1954
-rw-r--r--hacks/glx/maze3d.man116
-rw-r--r--hacks/glx/menger.c573
-rw-r--r--hacks/glx/menger.man78
-rw-r--r--hacks/glx/mirrorblob.c1840
-rw-r--r--hacks/glx/mirrorblob.man107
-rw-r--r--hacks/glx/moebius.c793
-rw-r--r--hacks/glx/moebius.man65
-rw-r--r--hacks/glx/moebiusgears.c445
-rw-r--r--hacks/glx/moebiusgears.man86
-rw-r--r--hacks/glx/molecule.c1720
-rw-r--r--hacks/glx/molecule.man160
-rwxr-xr-xhacks/glx/molecules.sh23
-rw-r--r--hacks/glx/morph3d.c840
-rw-r--r--hacks/glx/morph3d.man57
-rw-r--r--hacks/glx/noof.c529
-rw-r--r--hacks/glx/noof.man52
-rw-r--r--hacks/glx/normals.c49
-rw-r--r--hacks/glx/normals.h32
-rw-r--r--hacks/glx/peepers.c1471
-rw-r--r--hacks/glx/peepers.man80
-rw-r--r--hacks/glx/photopile.c855
-rw-r--r--hacks/glx/photopile.man113
-rw-r--r--hacks/glx/pinion.c1486
-rw-r--r--hacks/glx/pinion.man82
-rw-r--r--hacks/glx/pipeobjs.c3264
-rw-r--r--hacks/glx/pipes.c1207
-rw-r--r--hacks/glx/pipes.man85
-rw-r--r--hacks/glx/polyhedra-gl.c686
-rw-r--r--hacks/glx/polyhedra.c2458
-rw-r--r--hacks/glx/polyhedra.h52
-rw-r--r--hacks/glx/polyhedra.man124
-rw-r--r--hacks/glx/polytopes.c3193
-rw-r--r--hacks/glx/polytopes.man207
-rw-r--r--hacks/glx/projectiveplane.c2664
-rw-r--r--hacks/glx/projectiveplane.man424
-rw-r--r--hacks/glx/providence.c810
-rw-r--r--hacks/glx/providence.man66
-rw-r--r--hacks/glx/pulsar.c507
-rw-r--r--hacks/glx/pulsar.man102
-rw-r--r--hacks/glx/quasicrystal.c493
-rw-r--r--hacks/glx/quasicrystal.man83
-rw-r--r--hacks/glx/queens.c607
-rw-r--r--hacks/glx/queens.man66
-rw-r--r--hacks/glx/quickhull.c1367
-rw-r--r--hacks/glx/quickhull.h52
-rw-r--r--hacks/glx/raverhoop.c788
-rw-r--r--hacks/glx/raverhoop.man83
-rw-r--r--hacks/glx/razzledazzle.c727
-rw-r--r--hacks/glx/razzledazzle.man76
-rw-r--r--hacks/glx/robot-wireframe.c154
-rw-r--r--hacks/glx/robot-wireframe.dxf1160
-rw-r--r--hacks/glx/robot.c18539
-rw-r--r--hacks/glx/robot.dxf185616
-rw-r--r--hacks/glx/romanboy.c2586
-rw-r--r--hacks/glx/romanboy.man412
-rw-r--r--hacks/glx/rotator.c274
-rw-r--r--hacks/glx/rotator.h60
-rw-r--r--hacks/glx/rubik.c2155
-rw-r--r--hacks/glx/rubik.man69
-rw-r--r--hacks/glx/rubikblocks.c650
-rw-r--r--hacks/glx/rubikblocks.man117
-rw-r--r--hacks/glx/s1_1.c1733
-rw-r--r--hacks/glx/s1_2.c1733
-rw-r--r--hacks/glx/s1_3.c1733
-rw-r--r--hacks/glx/s1_4.c1733
-rw-r--r--hacks/glx/s1_5.c1733
-rw-r--r--hacks/glx/s1_6.c1733
-rw-r--r--hacks/glx/s1_b.c505
-rw-r--r--hacks/glx/sballs.c829
-rw-r--r--hacks/glx/sballs.man112
-rw-r--r--hacks/glx/seccam.c1388
-rw-r--r--hacks/glx/seccam.dxf13606
-rw-r--r--hacks/glx/shark.c1395
-rw-r--r--hacks/glx/ships.c4976
-rw-r--r--hacks/glx/ships.dxf49148
-rw-r--r--hacks/glx/sierpinski3d.c578
-rw-r--r--hacks/glx/sierpinski3d.man67
-rw-r--r--hacks/glx/skytentacles.c1123
-rw-r--r--hacks/glx/skytentacles.man102
-rw-r--r--hacks/glx/sonar-icmp.c1789
-rw-r--r--hacks/glx/sonar-sim.c112
-rw-r--r--hacks/glx/sonar.c1277
-rw-r--r--hacks/glx/sonar.h71
-rw-r--r--hacks/glx/sonar.man170
-rw-r--r--hacks/glx/sphere.c141
-rw-r--r--hacks/glx/sphere.h24
-rw-r--r--hacks/glx/sphereeversion.c3339
-rw-r--r--hacks/glx/sphereeversion.man256
-rw-r--r--hacks/glx/spheremonics.c925
-rw-r--r--hacks/glx/spheremonics.man92
-rw-r--r--hacks/glx/splitflap.c1426
-rw-r--r--hacks/glx/splitflap.dxf1658
-rw-r--r--hacks/glx/splitflap.man98
-rw-r--r--hacks/glx/splitflap_obj.c200
-rw-r--r--hacks/glx/splodesic.c644
-rw-r--r--hacks/glx/splodesic.man69
-rw-r--r--hacks/glx/sproingies.c902
-rw-r--r--hacks/glx/sproingies.h43
-rw-r--r--hacks/glx/sproingies.man68
-rw-r--r--hacks/glx/sproingiewrap.c225
-rw-r--r--hacks/glx/stairs.c600
-rw-r--r--hacks/glx/stairs.man56
-rw-r--r--hacks/glx/starwars.c1082
-rw-r--r--hacks/glx/starwars.h363
-rw-r--r--hacks/glx/starwars.man170
-rw-r--r--hacks/glx/starwars.txt466
-rw-r--r--hacks/glx/stonerview-move.c147
-rw-r--r--hacks/glx/stonerview-move.h32
-rw-r--r--hacks/glx/stonerview-osc.c341
-rw-r--r--hacks/glx/stonerview-osc.h175
-rw-r--r--hacks/glx/stonerview-view.c119
-rw-r--r--hacks/glx/stonerview.c155
-rw-r--r--hacks/glx/stonerview.h55
-rw-r--r--hacks/glx/stonerview.man53
-rw-r--r--hacks/glx/superquadrics.c810
-rw-r--r--hacks/glx/superquadrics.man70
-rw-r--r--hacks/glx/surfaces.c652
-rw-r--r--hacks/glx/surfaces.man127
-rw-r--r--hacks/glx/swim.c232
-rw-r--r--hacks/glx/tangram.c1073
-rw-r--r--hacks/glx/tangram.man67
-rw-r--r--hacks/glx/tangram_shapes.c225
-rw-r--r--hacks/glx/tangram_shapes.h15
-rw-r--r--hacks/glx/teapot.c273
-rw-r--r--hacks/glx/teapot.h7
-rw-r--r--hacks/glx/teapot2.h6330
-rw-r--r--hacks/glx/texfont.c1429
-rw-r--r--hacks/glx/texfont.h84
-rw-r--r--hacks/glx/timetunnel.c1258
-rw-r--r--hacks/glx/timetunnel.man105
-rw-r--r--hacks/glx/toast.c190
-rw-r--r--hacks/glx/toast.dxf1814
-rw-r--r--hacks/glx/toast2.c214
-rw-r--r--hacks/glx/toast2.dxf2054
-rw-r--r--hacks/glx/toaster.c376
-rw-r--r--hacks/glx/toaster.dxf3674
-rw-r--r--hacks/glx/toaster_base.c130
-rw-r--r--hacks/glx/toaster_base.dxf1214
-rw-r--r--hacks/glx/toaster_handle.c64
-rw-r--r--hacks/glx/toaster_handle.dxf554
-rw-r--r--hacks/glx/toaster_handle2.c40
-rw-r--r--hacks/glx/toaster_handle2.dxf314
-rw-r--r--hacks/glx/toaster_jet.c178
-rw-r--r--hacks/glx/toaster_jet.dxf1694
-rw-r--r--hacks/glx/toaster_knob.c76
-rw-r--r--hacks/glx/toaster_knob.dxf674
-rw-r--r--hacks/glx/toaster_slots.c106
-rw-r--r--hacks/glx/toaster_slots.dxf974
-rw-r--r--hacks/glx/toaster_wing.c43
-rw-r--r--hacks/glx/toaster_wing.dxf344
-rw-r--r--hacks/glx/topblock.c889
-rw-r--r--hacks/glx/topblock.h45
-rw-r--r--hacks/glx/topblock.man170
-rw-r--r--hacks/glx/trackball.c331
-rw-r--r--hacks/glx/trackball.h82
-rw-r--r--hacks/glx/tronbit.c547
-rw-r--r--hacks/glx/tronbit.man79
-rw-r--r--hacks/glx/tronbit_idle1.c247
-rw-r--r--hacks/glx/tronbit_idle2.c175
-rw-r--r--hacks/glx/tronbit_no.c1087
-rw-r--r--hacks/glx/tronbit_yes.c31
-rw-r--r--hacks/glx/tube.c387
-rw-r--r--hacks/glx/tube.h32
-rw-r--r--hacks/glx/tunnel_draw.c493
-rw-r--r--hacks/glx/tunnel_draw.h11
-rw-r--r--hacks/glx/unicrud.c978
-rw-r--r--hacks/glx/unicrud.man74
-rw-r--r--hacks/glx/unknownpleasures.c770
-rw-r--r--hacks/glx/unknownpleasures.man96
-rw-r--r--hacks/glx/vigilance.c1170
-rw-r--r--hacks/glx/vigilance.man57
-rw-r--r--hacks/glx/voronoi.c557
-rw-r--r--hacks/glx/voronoi.man88
-rwxr-xr-xhacks/glx/vrml2gl.pl361
-rwxr-xr-xhacks/glx/wfront2gl.pl361
-rw-r--r--hacks/glx/whale.c1887
-rw-r--r--hacks/glx/winduprobot.c2504
-rw-r--r--hacks/glx/winduprobot.man85
-rw-r--r--hacks/glx/xlock-gl-utils.c379
-rw-r--r--hacks/glx/xscreensaver-gl-helper.c74
-rw-r--r--hacks/glx/xscreensaver-gl-helper.man33
-rw-r--r--hacks/glx/xscreensaver-gl-visual.c87
-rw-r--r--hacks/glx/xscreensaver-gl-visual.man33
-rw-r--r--hacks/glx/zalgo.txt30
-rw-r--r--hacks/goop.c650
-rw-r--r--hacks/goop.man84
-rw-r--r--hacks/grav.c356
-rw-r--r--hacks/grav.man78
-rw-r--r--hacks/greynetic.c296
-rw-r--r--hacks/greynetic.man56
-rw-r--r--hacks/halftone.c409
-rw-r--r--hacks/halftone.man83
-rw-r--r--hacks/halo.c453
-rw-r--r--hacks/halo.man75
-rw-r--r--hacks/helix.c357
-rw-r--r--hacks/helix.man62
-rw-r--r--hacks/hexadrop.c445
-rw-r--r--hacks/hexadrop.man74
-rw-r--r--hacks/hopalong.c555
-rw-r--r--hacks/hopalong.man82
-rw-r--r--hacks/hyperball.c2463
-rw-r--r--hacks/hyperball.man88
-rw-r--r--hacks/hypercube.c575
-rw-r--r--hacks/hypercube.man97
-rw-r--r--hacks/ifs.c550
-rw-r--r--hacks/ifs.man111
-rw-r--r--hacks/images/6x10font.pngbin1968 -> 0 bytes-rw-r--r--hacks/images/Makefile63
-rw-r--r--hacks/images/Makefile.in63
-rw-r--r--hacks/images/amiga.pngbin1136 -> 0 bytes-rw-r--r--hacks/images/android.pngbin1091 -> 0 bytes-rw-r--r--hacks/images/apple.pngbin1562 -> 0 bytes-rw-r--r--hacks/images/apple2font.pngbin651 -> 0 bytes-rw-r--r--hacks/images/atari.pngbin148 -> 0 bytes-rw-r--r--hacks/images/atm.pngbin982 -> 0 bytes-rw-r--r--hacks/images/blocktube.pngbin23571 -> 0 bytes-rw-r--r--hacks/images/bob.pngbin1491 -> 0 bytes-rw-r--r--hacks/images/brick1.pngbin8544 -> 0 bytes-rw-r--r--hacks/images/brick2.pngbin688 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood.pov24
-rw-r--r--hacks/images/bubbles/blood1.pngbin583 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood10.pngbin8605 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood11.pngbin11682 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood2.pngbin781 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood3.pngbin1020 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood4.pngbin1276 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood5.pngbin1768 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood6.pngbin2612 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood7.pngbin3571 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood8.pngbin5076 -> 0 bytes-rw-r--r--hacks/images/bubbles/blood9.pngbin6324 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue.pov22
-rw-r--r--hacks/images/bubbles/blue1.pngbin583 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue10.pngbin7064 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue11.pngbin9455 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue2.pngbin781 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue3.pngbin1018 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue4.pngbin1184 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue5.pngbin1626 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue6.pngbin2354 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue7.pngbin3133 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue8.pngbin4300 -> 0 bytes-rw-r--r--hacks/images/bubbles/blue9.pngbin5286 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass.pov27
-rw-r--r--hacks/images/bubbles/glass1.pngbin583 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass10.pngbin6805 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass11.pngbin9200 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass2.pngbin781 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass3.pngbin1018 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass4.pngbin1045 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass5.pngbin1425 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass6.pngbin2110 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass7.pngbin2856 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass8.pngbin4014 -> 0 bytes-rw-r--r--hacks/images/bubbles/glass9.pngbin4996 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade.pov24
-rw-r--r--hacks/images/bubbles/jade1.pngbin583 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade10.pngbin7853 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade11.pngbin10816 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade2.pngbin781 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade3.pngbin1018 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade4.pngbin1202 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade5.pngbin1670 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade6.pngbin2416 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade7.pngbin3255 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade8.pngbin4670 -> 0 bytes-rw-r--r--hacks/images/bubbles/jade9.pngbin5758 -> 0 bytes-rw-r--r--hacks/images/chromesphere.pngbin33091 -> 0 bytes-rw-r--r--hacks/images/dvd.pngbin2727 -> 0 bytes-rw-r--r--hacks/images/earth.pngbin433159 -> 0 bytes-rw-r--r--hacks/images/earth_flat.pngbin16698 -> 0 bytes-rw-r--r--hacks/images/earth_night.pngbin390020 -> 0 bytes-rw-r--r--hacks/images/gnome1.pngbin17901 -> 0 bytes-rw-r--r--hacks/images/gnome2.pngbin1867 -> 0 bytes-rw-r--r--hacks/images/ground.pngbin13299 -> 0 bytes-rw-r--r--hacks/images/hmac.pngbin439 -> 0 bytes-rw-r--r--hacks/images/iris.pngbin143843 -> 0 bytes-rw-r--r--hacks/images/jigglymap.pngbin29863 -> 0 bytes-rw-r--r--hacks/images/lament512.pngbin566651 -> 0 bytes-rw-r--r--hacks/images/logo-180.pngbin8734 -> 0 bytes-rw-r--r--hacks/images/logo-32.pngbin1614 -> 0 bytes-rw-r--r--hacks/images/logo-360.pngbin27394 -> 0 bytes-rw-r--r--hacks/images/logo-50.pngbin2030 -> 0 bytes-rw-r--r--hacks/images/m6502/amiga.asm120
-rw-r--r--hacks/images/m6502/breakout.asm195
-rw-r--r--hacks/images/m6502/byterun.asm100
-rw-r--r--hacks/images/m6502/cellular-30.asm67
-rw-r--r--hacks/images/m6502/cellular-600.asm209
-rw-r--r--hacks/images/m6502/colors.asm46
-rw-r--r--hacks/images/m6502/crunch6502.asm292
-rw-r--r--hacks/images/m6502/demoscene.asm457
-rw-r--r--hacks/images/m6502/disco.asm23
-rw-r--r--hacks/images/m6502/dmsc.asm130
-rw-r--r--hacks/images/m6502/dmsc.txt768
-rw-r--r--hacks/images/m6502/dragon-fractal.asm49
-rw-r--r--hacks/images/m6502/fullscreenlogo.asm107
-rw-r--r--hacks/images/m6502/greynetic.asm96
-rw-r--r--hacks/images/m6502/keftal.asm82
-rw-r--r--hacks/images/m6502/life.asm127
-rw-r--r--hacks/images/m6502/lines.asm313
-rw-r--r--hacks/images/m6502/matrix.asm67
-rw-r--r--hacks/images/m6502/noise.asm16
-rw-r--r--hacks/images/m6502/random-walk.asm82
-rw-r--r--hacks/images/m6502/random.asm11
-rw-r--r--hacks/images/m6502/random2.asm11
-rw-r--r--hacks/images/m6502/rorschach.asm124
-rw-r--r--hacks/images/m6502/santa.asm142
-rw-r--r--hacks/images/m6502/selfmodify.asm12
-rw-r--r--hacks/images/m6502/sflake.asm320
-rw-r--r--hacks/images/m6502/sierpinski.asm24
-rw-r--r--hacks/images/m6502/sierpinsky.asm131
-rw-r--r--hacks/images/m6502/softsprite.asm132
-rw-r--r--hacks/images/m6502/spacer.asm235
-rw-r--r--hacks/images/m6502/starfield2d.asm50
-rw-r--r--hacks/images/m6502/texture.asm393
-rw-r--r--hacks/images/m6502/wave6502.asm164
-rw-r--r--hacks/images/m6502/zookeeper.asm109
-rw-r--r--hacks/images/mac.pngbin211 -> 0 bytes-rw-r--r--hacks/images/macbomb.pngbin697 -> 0 bytes-rw-r--r--hacks/images/matrix1.pngbin29412 -> 0 bytes-rw-r--r--hacks/images/matrix1b.pngbin11525 -> 0 bytes-rw-r--r--hacks/images/matrix2.pngbin27982 -> 0 bytes-rw-r--r--hacks/images/matrix2b.pngbin11468 -> 0 bytes-rw-r--r--hacks/images/matrix3.pngbin125539 -> 0 bytes-rw-r--r--hacks/images/molecules/adenine.pdb37
-rw-r--r--hacks/images/molecules/adrenochrome.pdb55
-rw-r--r--hacks/images/molecules/bucky.pdb156
-rw-r--r--hacks/images/molecules/caffeine.pdb54
-rw-r--r--hacks/images/molecules/capsaicin.pdb49
-rw-r--r--hacks/images/molecules/chlordecone.pdb49
-rw-r--r--hacks/images/molecules/cocaine.pdb93
-rw-r--r--hacks/images/molecules/codeine.pdb93
-rw-r--r--hacks/images/molecules/cyclohexane.pdb151
-rw-r--r--hacks/images/molecules/cytosine.pdb33
-rw-r--r--hacks/images/molecules/dna.pdb972
-rw-r--r--hacks/images/molecules/dodecahedrane.pdb87
-rw-r--r--hacks/images/molecules/dthc.pdb107
-rw-r--r--hacks/images/molecules/dynamite.pdb47
-rw-r--r--hacks/images/molecules/glycol.pdb27
-rw-r--r--hacks/images/molecules/guanine.pdb39
-rw-r--r--hacks/images/molecules/heroin.pdb107
-rw-r--r--hacks/images/molecules/hexahelicene.pdb90
-rw-r--r--hacks/images/molecules/ibuprofen.pdb72
-rw-r--r--hacks/images/molecules/lsd.pdb104
-rw-r--r--hacks/images/molecules/menthol.pdb69
-rw-r--r--hacks/images/molecules/mescaline.pdb71
-rw-r--r--hacks/images/molecules/methamphetamine.pdb88
-rw-r--r--hacks/images/molecules/morphine.pdb87
-rw-r--r--hacks/images/molecules/nicotine.pdb59
-rw-r--r--hacks/images/molecules/novocaine.pdb81
-rw-r--r--hacks/images/molecules/olestra.pdb913
-rw-r--r--hacks/images/molecules/penicillin.pdb89
-rw-r--r--hacks/images/molecules/salvinorin.pdb92
-rw-r--r--hacks/images/molecules/sarin.pdb43
-rw-r--r--hacks/images/molecules/strychnine.pdb101
-rw-r--r--hacks/images/molecules/sucrose.pdb97
-rw-r--r--hacks/images/molecules/thalidomide.pdb65
-rw-r--r--hacks/images/molecules/thymine.pdb37
-rw-r--r--hacks/images/molecules/viagra.pdb133
-rw-r--r--hacks/images/molecules/vitaminb6.pdb56
-rw-r--r--hacks/images/molecules/vitaminc.pdb47
-rw-r--r--hacks/images/molecules/vx.pdb92
-rw-r--r--hacks/images/noseguy/nose-f1.pngbin454 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-f2.pngbin397 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-f3.pngbin396 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-f4.pngbin448 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-l1.pngbin388 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-l2.pngbin470 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-r1.pngbin386 -> 0 bytes-rw-r--r--hacks/images/noseguy/nose-r2.pngbin467 -> 0 bytes-rw-r--r--hacks/images/osx_10_2.pngbin53621 -> 0 bytes-rw-r--r--hacks/images/osx_10_3.pngbin28292 -> 0 bytes-rw-r--r--hacks/images/pacman.pngbin2695 -> 0 bytes-rw-r--r--hacks/images/ransomware.pngbin976 -> 0 bytes-rw-r--r--hacks/images/sball-bg.pngbin31249 -> 0 bytes-rw-r--r--hacks/images/sball.pngbin2334 -> 0 bytes-rw-r--r--hacks/images/scales.pngbin8573 -> 0 bytes-rw-r--r--hacks/images/sclera.pngbin230321 -> 0 bytes-rw-r--r--hacks/images/sea-texture.pngbin6933 -> 0 bytes-rw-r--r--hacks/images/som.pngbin7593 -> 0 bytes-rw-r--r--hacks/images/start.pngbin1153 -> 0 bytes-rw-r--r--hacks/images/sun.pngbin415 -> 0 bytes-rw-r--r--hacks/images/testcard_bbcf.pngbin67094 -> 0 bytes-rw-r--r--hacks/images/testcard_pm5544.pngbin20774 -> 0 bytes-rw-r--r--hacks/images/testcard_rca.pngbin96263 -> 0 bytes-rw-r--r--hacks/images/timetunnel0.pngbin35798 -> 0 bytes-rw-r--r--hacks/images/timetunnel1.pngbin131957 -> 0 bytes-rw-r--r--hacks/images/timetunnel2.pngbin50547 -> 0 bytes-rw-r--r--hacks/images/toast.pngbin11667 -> 0 bytes-rw-r--r--hacks/images/tree.pngbin5944 -> 0 bytes-rw-r--r--hacks/images/tunnel0.pngbin6996 -> 0 bytes-rw-r--r--hacks/images/tunnel1.pngbin3449 -> 0 bytes-rw-r--r--hacks/images/tunnel2.pngbin11424 -> 0 bytes-rw-r--r--hacks/images/tunnel3.pngbin6725 -> 0 bytes-rw-r--r--hacks/images/tunnel4.pngbin3297 -> 0 bytes-rw-r--r--hacks/images/tunnel5.pngbin3340 -> 0 bytes-rw-r--r--hacks/images/tunnelstar.pngbin23414 -> 0 bytes-rw-r--r--hacks/images/win10_spinner.gifbin64501 -> 0 bytes-rw-r--r--hacks/images/wood.pngbin2130 -> 0 bytes-rw-r--r--hacks/images/wood2.pngbin3274 -> 0 bytes-rw-r--r--hacks/imsmap.c425
-rw-r--r--hacks/imsmap.man64
-rw-r--r--hacks/interaggregate.c988
-rw-r--r--hacks/interaggregate.man72
-rw-r--r--hacks/interference.c1000
-rw-r--r--hacks/interference.man86
-rw-r--r--hacks/intermomentary.c593
-rw-r--r--hacks/intermomentary.man82
-rw-r--r--hacks/juggle.c2797
-rw-r--r--hacks/juggle.man181
-rw-r--r--hacks/julia.c442
-rw-r--r--hacks/julia.man81
-rw-r--r--hacks/kaleidescope.c505
-rw-r--r--hacks/kaleidescope.man76
-rw-r--r--hacks/kumppa.c536
-rw-r--r--hacks/kumppa.man65
-rw-r--r--hacks/laser.c355
-rw-r--r--hacks/laser.man68
-rw-r--r--hacks/lcdscrub.c398
-rw-r--r--hacks/lcdscrub.man73
-rw-r--r--hacks/lightning.c601
-rw-r--r--hacks/lightning.man62
-rw-r--r--hacks/link_axp.com107
-rw-r--r--hacks/link_decc.com107
-rw-r--r--hacks/lisa.c739
-rw-r--r--hacks/lisa.man71
-rw-r--r--hacks/lissie.c322
-rw-r--r--hacks/lissie.man69
-rwxr-xr-xhacks/ljlatest1
-rw-r--r--hacks/ljlatest.man61
-rw-r--r--hacks/lmorph.c579
-rw-r--r--hacks/lmorph.man65
-rw-r--r--hacks/loop.c1694
-rw-r--r--hacks/loop.man65
-rw-r--r--hacks/m6502.c304
-rwxr-xr-xhacks/m6502.sh26
-rw-r--r--hacks/maze.c1678
-rw-r--r--hacks/maze.man148
-rw-r--r--hacks/memscroller.c622
-rw-r--r--hacks/memscroller.man78
-rw-r--r--hacks/metaballs.c437
-rw-r--r--hacks/metaballs.man73
-rw-r--r--hacks/moire.c252
-rw-r--r--hacks/moire.man68
-rw-r--r--hacks/moire2.c362
-rw-r--r--hacks/moire2.man63
-rw-r--r--hacks/mountain.c282
-rw-r--r--hacks/mountain.man60
-rw-r--r--hacks/munch.c461
-rw-r--r--hacks/munch.man141
-rwxr-xr-xhacks/munge-ad.pl239
-rw-r--r--hacks/nerverot.c1358
-rw-r--r--hacks/nerverot.man132
-rw-r--r--hacks/noseguy.c715
-rw-r--r--hacks/noseguy.man84
-rw-r--r--hacks/pacman.c1473
-rw-r--r--hacks/pacman.h212
-rw-r--r--hacks/pacman.man67
-rw-r--r--hacks/pacman_ai.c878
-rw-r--r--hacks/pacman_ai.h32
-rw-r--r--hacks/pacman_level.c773
-rw-r--r--hacks/pacman_level.h33
-rw-r--r--hacks/pedal.c338
-rw-r--r--hacks/pedal.man60
-rw-r--r--hacks/penetrate.c1018
-rw-r--r--hacks/penetrate.man85
-rw-r--r--hacks/penrose.c1341
-rw-r--r--hacks/penrose.man106
-rw-r--r--hacks/petri.c776
-rw-r--r--hacks/petri.man129
-rw-r--r--hacks/phosphor.c1514
-rw-r--r--hacks/phosphor.man165
-rw-r--r--hacks/piecewise.c1031
-rw-r--r--hacks/piecewise.man77
-rw-r--r--hacks/polyominoes.c2369
-rw-r--r--hacks/polyominoes.man65
-rw-r--r--hacks/pong.c1120
-rw-r--r--hacks/pong.man86
-rw-r--r--hacks/popsquares.c309
-rw-r--r--hacks/pyro.c372
-rw-r--r--hacks/pyro.man64
-rw-r--r--hacks/qix.c641
-rw-r--r--hacks/qix.man132
-rw-r--r--hacks/rd-bomb.c570
-rw-r--r--hacks/rd-bomb.man100
-rw-r--r--hacks/recanim.c480
-rw-r--r--hacks/recanim.h32
-rw-r--r--hacks/ripples.c1131
-rw-r--r--hacks/ripples.man96
-rw-r--r--hacks/rocks.c561
-rw-r--r--hacks/rocks.man90
-rw-r--r--hacks/rorschach.c215
-rw-r--r--hacks/rorschach.man75
-rw-r--r--hacks/rotor.c389
-rw-r--r--hacks/rotor.man68
-rw-r--r--hacks/rotzoomer.c603
-rw-r--r--hacks/rotzoomer.man88
-rw-r--r--hacks/scooter.c957
-rw-r--r--hacks/scooter.man79
-rw-r--r--hacks/screenhack.c1013
-rw-r--r--hacks/screenhack.h68
-rw-r--r--hacks/screenhackI.h218
-rw-r--r--hacks/shadebobs.c473
-rw-r--r--hacks/shadebobs.man65
-rw-r--r--hacks/sierpinski.c213
-rw-r--r--hacks/sierpinski.man69
-rw-r--r--hacks/slidescreen.c512
-rw-r--r--hacks/slidescreen.man97
-rw-r--r--hacks/slip.c375
-rw-r--r--hacks/slip.man86
-rw-r--r--hacks/speedmine.c1658
-rw-r--r--hacks/speedmine.man208
-rw-r--r--hacks/sphere.c303
-rw-r--r--hacks/sphere.man62
-rw-r--r--hacks/spiral.c330
-rw-r--r--hacks/spiral.man71
-rw-r--r--hacks/spotlight.c356
-rw-r--r--hacks/spotlight.man80
-rw-r--r--hacks/squiral.c296
-rw-r--r--hacks/squiral.man80
-rw-r--r--hacks/starfish.c563
-rw-r--r--hacks/starfish.man84
-rw-r--r--hacks/strange.c1341
-rw-r--r--hacks/strange.man79
-rw-r--r--hacks/substrate.c779
-rw-r--r--hacks/substrate.man73
-rw-r--r--hacks/swirl.c1445
-rw-r--r--hacks/swirl.man70
-rw-r--r--hacks/t3d.c990
-rw-r--r--hacks/t3d.man131
-rw-r--r--hacks/tessellimage.c1012
-rw-r--r--hacks/tessellimage.man86
-rw-r--r--hacks/testx11.c967
-rw-r--r--hacks/thornbird.c264
-rw-r--r--hacks/thornbird.man64
-rw-r--r--hacks/triangle.c354
-rw-r--r--hacks/triangle.man56
-rw-r--r--hacks/truchet.c540
-rw-r--r--hacks/truchet.man139
-rw-r--r--hacks/twang.c783
-rw-r--r--hacks/twang.man132
-rw-r--r--hacks/vermiculate.c1222
-rw-r--r--hacks/vermiculate.man48
-rw-r--r--hacks/vfeedback.c620
-rw-r--r--hacks/vfeedback.man71
-rwxr-xr-xhacks/vidwhacker497
-rw-r--r--hacks/vidwhacker.man89
-rw-r--r--hacks/vines.c179
-rw-r--r--hacks/vines.man66
-rw-r--r--hacks/vms_axp.opt4
-rw-r--r--hacks/vms_axp_12.opt4
-rw-r--r--hacks/vms_decc.opt4
-rw-r--r--hacks/vms_decc_12.opt4
-rw-r--r--hacks/wander.c281
-rw-r--r--hacks/wander.man76
-rwxr-xr-xhacks/webcollage4049
-rw-r--r--hacks/webcollage-cocoa.m428
-rw-r--r--hacks/webcollage-helper-cocoa.m510
-rw-r--r--hacks/webcollage-helper.c604
-rw-r--r--hacks/webcollage.man240
-rw-r--r--hacks/whirlwindwarp.c508
-rw-r--r--hacks/whirlwindwarp.man64
-rw-r--r--hacks/whirlygig.c740
-rw-r--r--hacks/whirlygig.man137
-rw-r--r--hacks/worm.c433
-rw-r--r--hacks/worm.man65
-rw-r--r--hacks/wormhole.c730
-rw-r--r--hacks/wormhole.man69
-rw-r--r--hacks/xanalogtv.c688
-rw-r--r--hacks/xanalogtv.man84
-rw-r--r--hacks/xflame.c825
-rw-r--r--hacks/xflame.man72
-rw-r--r--hacks/ximage-loader.c695
-rw-r--r--hacks/ximage-loader.h37
-rw-r--r--hacks/xjack.c501
-rw-r--r--hacks/xjack.man52
-rw-r--r--hacks/xlockmore.c794
-rw-r--r--hacks/xlockmore.h254
-rw-r--r--hacks/xlockmoreI.h187
-rw-r--r--hacks/xlyap.c1938
-rw-r--r--hacks/xlyap.man223
-rw-r--r--hacks/xmatrix.c1871
-rw-r--r--hacks/xmatrix.man136
-rwxr-xr-xhacks/xml2man.pl266
-rw-r--r--hacks/xrayswarm.c1225
-rw-r--r--hacks/xrayswarm.man50
-rwxr-xr-xhacks/xscreensaver-getimage-file1342
-rw-r--r--hacks/xscreensaver-getimage-file.man63
-rwxr-xr-xhacks/xscreensaver-getimage-video141
-rw-r--r--hacks/xscreensaver-getimage-video.man51
-rw-r--r--hacks/xscreensaver-getimage.c2068
-rw-r--r--hacks/xscreensaver-getimage.man76
-rw-r--r--hacks/xscreensaver-sgigl.c266
-rwxr-xr-xhacks/xscreensaver-text1000
-rw-r--r--hacks/xscreensaver-text.man88
-rw-r--r--hacks/xspirograph.c334
-rw-r--r--hacks/xspirograph.man71
-rw-r--r--hacks/xsublim.c804
-rw-r--r--hacks/xsublim.man91
-rw-r--r--hacks/zoom.c291
-rw-r--r--hacks/zoom.man111
-rw-r--r--jwxyz/Makefile.in6
-rw-r--r--jwxyz/jwxyz-android.c6
-rw-r--r--jwxyz/jwxyz-cocoa.m2
-rw-r--r--jwxyz/jwxyz-common.c15
-rw-r--r--jwxyz/jwxyz.m13
-rw-r--r--jwxyz/jwzgles.c37
-rw-r--r--jwxyz/jwzglesI.h3
-rw-r--r--po/ChangeLog300
-rw-r--r--po/Makefile.in.in390
-rw-r--r--po/POTFILES.in272
-rw-r--r--po/da.po9938
-rw-r--r--po/de.po9219
-rw-r--r--po/es.po10021
-rw-r--r--po/et.po8995
-rw-r--r--po/fi.po8939
-rw-r--r--po/fr.po9248
-rw-r--r--po/hu.po9760
-rw-r--r--po/it.po8967
-rw-r--r--po/ja.po11306
-rw-r--r--po/ko.po9340
-rw-r--r--po/nb.po9071
-rw-r--r--po/nl.po10290
-rw-r--r--po/pl.po9387
-rw-r--r--po/pt.po9995
-rw-r--r--po/pt_BR.po9563
-rw-r--r--po/ru.po10240
-rw-r--r--po/sk.po9242
-rw-r--r--po/sv.po11236
-rwxr-xr-xpo/update.sh24
-rw-r--r--po/vi.po9347
-rw-r--r--po/wa.po9138
-rw-r--r--po/zh_CN.po9513
-rw-r--r--po/zh_TW.po9358
-rw-r--r--utils/Makefile.in38
-rw-r--r--utils/async_netdb.c7
-rw-r--r--utils/compile_axp.com34
-rw-r--r--utils/compile_decc.com34
-rw-r--r--utils/fade.h21
-rw-r--r--utils/font-retry.c27
-rw-r--r--utils/grabclient.c114
-rw-r--r--utils/grabclient.h (renamed from utils/grabscreen.h)42
-rw-r--r--utils/grabscreen.c924
-rw-r--r--utils/images/logo-512.pngbin0 -> 10950 bytes-rw-r--r--utils/images/logo.eps8058
-rw-r--r--utils/images/screensaver-cmndln.pngbin1040 -> 0 bytes-rw-r--r--utils/images/screensaver-colorselector.pngbin1104 -> 0 bytes-rw-r--r--utils/images/screensaver-diagnostic.pngbin1307 -> 0 bytes-rw-r--r--utils/images/screensaver-locking.pngbin944 -> 0 bytes-rw-r--r--utils/images/screensaver-power.pngbin973 -> 0 bytes-rw-r--r--utils/images/screensaver-snap.pngbin1272 -> 0 bytes-rw-r--r--utils/pow2.c7
-rw-r--r--utils/pow2.h8
-rw-r--r--utils/resources.c1
-rw-r--r--utils/screenshot.c331
-rw-r--r--utils/screenshot.h34
-rw-r--r--utils/thread_util.c16
-rw-r--r--utils/utf8wc.c39
-rw-r--r--utils/version.h6
-rw-r--r--utils/visual-gl.c19
-rw-r--r--utils/xft.c3
-rw-r--r--utils/xft.h13
-rw-r--r--utils/xftwrap.c2
-rw-r--r--xscreensaver.spec195
1376 files changed, 26241 insertions, 1505706 deletions
diff --git a/.gitignore b/.gitignore
index 8067b62..9540944 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,4 +16,8 @@ po/Makefile.in
po/POTFILES
po/stamp-it
utils/Makefile
-
+tmp/
+po/
+OSX/
+android/
+hacks/
diff --git a/INSTALL b/INSTALL
index 67d57d3..4522d8e 100644
--- a/INSTALL
+++ b/INSTALL
@@ -11,14 +11,13 @@ XScreenSaver Installation
xscreensaver &
xscreensaver-settings
- There are many compilation dependencies. The configure script will
- tell you what is missing. At the least, you will need development
- versions of these libraries:
-
- perl pkg-config gettext intltool libx11 libxext libxi libxt
- libxft libxinerama libxrandr libxxf86vm libgl libglu libgle
- libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam
- dbus libsystemd elogind
+ There are many compilation dependencies. The configure script will tell
+ you what is missing. At the least, you will need development versions of
+ these libraries. Append "-dev" or "-devel" to most of these:
+
+ perl pkg-config gettext intltool libx11 libxext libxi libxt libxft
+ libxinerama libxrandr libxxf86vm libgl libglu libgle libgtk-3-0
+ libgdk-pixbuf2.0 libjpeg libxml2 libpam libsystemd elogind
BSD systems might need gmake instead of make.
diff --git a/Makefile.in b/Makefile.in
index 42742d3..c713f1f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in --- xscreensaver, Copyright © 1999-2021 Jamie Zawinski.
+# Makefile.in --- xscreensaver, Copyright © 1999-2024 Jamie Zawinski.
# the `../configure' script generates `Makefile' from this file.
@SET_MAKE@
@@ -11,12 +11,14 @@ SUBDIRS = utils jwxyz hacks/images hacks hacks/glx hacks/fonts \
SUBDIRS2 = $(SUBDIRS) OSX android
TARFILES = README README.hacking INSTALL \
configure configure.ac Makefile.in config.h.in \
- install-sh config.guess aclocal.m4 \
+ install-sh config.guess config.rpath aclocal.m4 \
ax_pthread.m4 config.sub \
intltool-merge.in intltool-extract.in intltool-update.in \
xscreensaver.spec
-TAR = tar
+TAR = gnutar
+TAR_ARGS = --owner=0 --group=0 --posix --no-acls --no-xattrs --no-selinux
+
# Using $(MAKE) directly means the shell executes things even with "make -n"
MAKE2 = $(MAKE)
@@ -54,7 +56,7 @@ tags::
@$(MAKE_SUBDIR)
clean::
- @$(MAKE_SUBDIR2)
+ @$(MAKE_SUBDIR)
distclean:: clean
@$(MAKE_SUBDIR2)
@@ -94,7 +96,7 @@ _tar:
echo creating tar file $$ADIR$$NAME.tar.gz... ; \
export COPYFILE_DISABLE=true ; \
export GZIP="-9v" ; \
- $(TAR) -vczf $$ADIR$$NAME.tar.gz -T "$$LIST" ; \
+ $(TAR) -vczf $$ADIR$$NAME.tar.gz -T "$$LIST" $(TAR_ARGS) ; \
rm "$$LIST" "$$NAME"
@@ -205,7 +207,7 @@ bump-version::
\
echo "Updated $$SRC version to \"$$VERS3\"" ; \
\
- $(MAKE) version-date ; \
+ $(MAKE2) version-date ; \
ls -lFd $$SRC
bump_version:: bump-version
@@ -284,6 +286,22 @@ dmg::
apk::
$(MAKE2) -C android apk
+# Update the version numbers in faq.html, bugs.html, etc.
+www_versions::
+ @ \
+ DEST=$$HOME/www/xscreensaver ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \
+ head -1` ; \
+ TMP=/tmp/xd.$$$$ ; \
+ for f in $$DEST/*.html ; do \
+ sed "s/\(CLASS=.latest.>\)[^<>]*\(<\)/\1$$VERS\2/gi" < "$$f" > "$$TMP" ;\
+ if ! cmp -s "$$f" "$$TMP" ; then \
+ diff -U0 "$$f" "$$TMP" ; \
+ cp -p "$$TMP" "$$f" ; \
+ fi ; \
+ rm -f "$$TMP" ; \
+ done
+
www::
@ \
DEST=$$HOME/www/xscreensaver ; \
@@ -306,6 +324,7 @@ www::
exit 1 ; \
fi ; \
\
+ $(MAKE2) www_versions ; \
$(MAKE2) -C OSX updates.xml ; \
\
if [ ! -f $$NAME ]; then \
@@ -356,15 +375,16 @@ www::
cd $$DEST ; \
\
TMP=/tmp/xd.$$$$ ; \
- sed "s/xscreensaver-5\.[0-9][0-9ab]*/$$HEAD/g" download.html > $$TMP ; \
+ sed "s/xscreensaver-[56]\.[0-9][0-9ab]*/$$HEAD/g" download.html > $$TMP ; \
echo '' ; \
diff -U0 download.html $$TMP ; \
echo '' ; \
\
- for EXT in tar.gz dmg ; do \
+ for EXT in tar.gz dmg apk ; do \
OLDEST=`ls xscreensaver*.$$EXT | \
fgrep -v 5.14 | \
fgrep -v 5.34 | \
+ fgrep -v 6.00 | \
head -n 1` ; \
/bin/echo -n "Delete $$DEST/$$OLDEST? "; \
read line; \
@@ -409,11 +429,30 @@ count::
echo " Total:" $$C ; \
-#cerebrum::
-# rsync -vax . cerebrum:src/xscreensaver/ \
+# Install symlinks pointing back to the source directory, for debugging.
+install_links::
+ @ \
+ cwd=`pwd` ; \
+ for d in $(SUBDIRS) ; do ( \
+ cd $$d ; \
+ $(MAKE2) install -k INSTALL=true INSTALL_DATA=true \
+ INSTALL_DIRS=false SUID_FLAGS= 2>&- | \
+ while read s ; do \
+ set - $$s ; \
+ if [ $$1 = true ]; then \
+ a="$$cwd/$$d/$$2" ; \
+ b="$$3" ; \
+ a=`echo "$$a" | sed -e 's@/\./@/@' \
+ -e 's@/[^/]*/\.\./@/@'` ; \
+ echo "ln -sf $$a $$b" ; \
+ ln -sf "$$a" "$$b" ; \
+ fi ; \
+ done ; \
+ ) ; done
+
cerebrum::
- rsync -vax . pi@10.0.1.19:xscreensaver/ \
+ rsync -vax . 10.0.1.12:xscreensaver/ \
--omit-dir-times \
--delete-during \
--exclude .git \
@@ -428,6 +467,10 @@ cerebrum::
--include xscreensaver-getimage-file \
--include xscreensaver-getimage-video \
--include xscreensaver-text \
+ --exclude xscreensaver-5.45 \
+ --exclude xscreensaver-6.00 \
+ --exclude xscreensaver-6.01 \
+ --exclude xscreensaver-6.02 \
--exclude '*~' \
--include '*.asm' \
--include '*.c' \
@@ -446,7 +489,19 @@ cerebrum::
--include '*.ttf' \
--include '*.otf' \
--include '*.ui' \
+ --include '*.sh' \
+ --include '*.pl' \
+ --include '*.spec' \
+ --include '*.ad' \
--include 'configure*' \
+ --include 'config.sub' \
+ --include 'config.guess' \
+ --include 'config.rpath' \
+ --include 'install-sh' \
+ --include 'bin2c' \
+ --include 'ad2c' \
+ --include 'vidwhacker' \
+ --include 'webcollage' \
--include '*/' \
--exclude '*'
diff --git a/README b/README
index ddb9786..2b6dc96 100644
--- a/README
+++ b/README
@@ -33,14 +33,13 @@ To compile for a Unix system with X11:
xscreensaver &
xscreensaver-settings
- There are many compilation dependencies. The configure script will
- tell you what is missing. At the least, you will need development
- versions of these libraries:
+ There are many compilation dependencies. The configure script will tell
+ you what is missing. At the least, you will need development versions of
+ these libraries. Append "-dev" or "-devel" to most of these:
- perl pkg-config gettext intltool libx11 libxext libxi libxt
- libxft libxinerama libxrandr libxxf86vm libgl libglu libgle
- libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam
- dbus libsystemd elogind
+ perl pkg-config gettext intltool libx11 libxext libxi libxt libxft
+ libxinerama libxrandr libxxf86vm libgl libglu libgle libgtk-3-0
+ libgdk-pixbuf2.0 libjpeg libxml2 libpam libsystemd elogind
BSD systems might need gmake instead of make.
@@ -70,6 +69,92 @@ Interested in writing a new screen saver?
Version History
===============================================================================
+6.09 * New hacks,`kallisti' and `highvoltage'.
+ * Formal-wear for `headroom'.
+
+6.08 * macOS: Worked around a macOS 14.0 bug where savers would continue
+ running invisibly in the background after un-blanking.
+ * macOS: Upgraded Sparkle (the "Check for Updates" library) for
+ macOS 14.0 compatibility.
+
+6.07 * New hacks, `droste', `skulloop', `papercube' and `cubocteversion'.
+ * `xscreensaver-settings' was sometimes turning off the DPMS checkbox.
+ * Log pid of caller of `deactivate' command, to give a hint about who
+ is preventing the screen from blanking.
+ * recanim uses libffmpeg.
+ * Updates to `sphereeversion'.
+ * Added some new map sources to `mapscroller'.
+ * macOS: Worked around a macOS 13.4 bug where multi-head systems would
+ fail to launch savers on some or all screens.
+ * Minimum compiler target is now ISO C99 instead of ANSI C89.
+ Didn't want to rush into it.
+ * macOS, Android: Better looking thunbmail images.
+ * Various other minor bug fixes.
+
+6.06 * New hack, `hextrail'.
+ * `marbling' works again.
+ * Adjusted some of the very old hacks, which were written when pixels
+ were larger, to be more visible on today's higher rez displays.
+ * X11: More robust desktop image grabbing.
+ * X11: Various improvements to `xscreensaver-settings'.
+ * X11: Silence new new Perl warnings from `xscreensaver-getimage-file'.
+ * X11: Supports "Lock" messages from systemd, e.g. when logind.conf
+ has "HandleLidSwitch=lock" instead of "suspend".
+
+6.05 * X11: Cope with dumb DPMS settings that existed pre-startup.
+ * X11: Silence new Perl warnings from `xscreensaver-getimage-file'.
+ * X11: Fix `sonar' pthreads crash on recent Pi systems.
+ * X11: Removed dependence on `gdk-pixbuf-xlib-2.0'.
+ * X11: GTK 3 is now required.
+ * macOS: Fixed the "Run savers on screens" preference in Random mode
+ on multi-screen M1 systems.
+ * Retired `thornbird', which is redundant with `discrete'.
+
+6.04 * New hacks, `nakagin' and `chompytower'.
+ * Settings dialog shows diagnostics for bad image folders and feeds.
+ * URLs for `imageDirectory' can now point at archive.org collections.
+ * Sliders for various "Speed" preferences are easier to use.
+ * X11: Settings dialog shows saver description below embedded preview.
+ * X11: Better behavior when zero monitors are attached.
+ * X11: Improvements to inhibiting blanking while videos are playing:
+ No longer necessary to hack GNOME and KDE to get them to not usurp
+ the org.freedesktop.ScreenSaver endpoint.
+ * X11: `unicrud' displays character names.
+ * Updated `webcollage'.
+
+6.03 * New hack, `squirtorus'.
+ * New hack, `mapscroller' (X11 and macOS only).
+ * `sphereeversion' now has corrugation-mode, and can evert the Earth.
+ * `glplanet' is higher resolution, and displays time zones.
+ * `glslideshow' displays relative pathnames again.
+ * iOS: Apple broke drag-to-rotate again. Fixed.
+ * macOS: fixed spurious error message in auto-update installer.
+ * X11: fixed `sonar' failing to ping on some Linux systems.
+ * X11: Touch-screens work.
+ * X11: Hold down Backspace to clear the whole password field.
+
+6.02 * New hacks, `marbling' and `binaryhorizon'.
+ * `atlantis' behaviors are more random and lifelike.
+ * `headroom' is now Mask Headroom.
+ * X11: `fontglide' skips fonts that can't display ASCII.
+ * X11: Use asterisks in the password dialog if the system fonts don't
+ have bullets in them.
+ * X11: "Disable Screen Saver" was behaving like "Blank Screen Only".
+ * Android: These hacks work now: `antinspect', `barcode',
+ `energystream', `fliptext', `fontglide', `glsnake', `raverhoop',
+ `starwars', `unicrud'.
+
+6.01 * X11: Properly disable the server's built-in screen saver.
+ * X11: The passwdTimeout option was being ignored.
+ * X11: The display of the unlock thermometer was weird.
+ * X11: Fixed password entry on old-school multi-screen setups (:0.1).
+ * X11: Worked around a KDE 5 compositor bug that caused the desktop
+ to momentarily become visible when cycling.
+ * X11: Fixed possible high CPU usage in `xscreensaver-systemd'.
+ * X11: Fixed some spurious warnings in `xscreensaver-text'.
+ * X11: Warn when Wayland is in use, since it makes both screen saving
+ and locking impossible.
+
6.00 * X11: Major refactor of the `xscreensaver' daemon for improved
security, dividing it into three programs: `xscreensaver',
`xscreensaver-gfx' and `xscreensaver-auth'.
@@ -277,7 +362,7 @@ Version History
5.26 * More auto-updater tweaks.
-5.25 * Try harder to bypass Quarrantine and Gatekeeper in macOS installer.
+5.25 * Try harder to bypass Quarantine and Gatekeeper in macOS installer.
* Some files were missing from the tarball.
5.24 * Added "Automatically check for updates" option on macOS.
@@ -1693,7 +1778,7 @@ Version History
the parameters which are normally read as minutes can be specified
in seconds.
* Added colormap cycling to `imsmap'.
- * Made hyper work with K&R compilers.
+ * Made `hyper' work with K&R compilers.
1.14 * Added `orbit' option to `attraction' hack.
* Added `lock-timeout' option.
@@ -1702,14 +1787,26 @@ Version History
1.09 * Added demo mode, and locking.
* Added `maze' hack.
* Added `norotate' option to `rocks' hack.
+ * Uploaded to export.lcs.mit.edu:contrib/xscreensaver.tar.Z and posted
+ to comp.windows.x.announce, 25-Feb-1993.
+ * Added `hypercube' and `slidescreen' (or they may have been added
+ earlier).
1.05 * Works when run from XDM before anyone logs in.
* Sped up `imsmap'.
* Can use `xv' as a slideshow without using up colormap entries while
the screen is not blanked.
* Fixed a BadDrawable error in non-XIdle mode.
- * Added `blitspin' and `imsmap'.
+ * Uploaded to export.lcs.mit.edu:contrib/xsaver.tar.Z and posted to
+ comp.windows.x.announce, 30-Nov-1992.
+
+1.04 * Added `blitspin' and `imsmap' (or they may have been earlier).
+ * Appeared on the X11R5 contrib tape, a mirror of export.lcs.mit.edu,
+ 29-Nov-1992.
+
+1.00 * Uploaded to export.lcs.mit.edu:contrib/xsaver.tar.Z and posted to
+ comp.windows.x.announce, 17-Aug-1992.
+ * Initial list of included hacks:
+ `qix', `helix', `rorschach', `attraction', `greynetic', `rocks',
+ `pyro', `hopalong', and `noseguy'.
-1.01 * Current list of included hacks is now: `qix', `helix', `rorschach',
- `attraction', `greynetic', `rocks', `pyro', `hopalong', and
- `noseguy'.
diff --git a/README.hacking b/README.hacking
index 39f9e14..39d8b16 100644
--- a/README.hacking
+++ b/README.hacking
@@ -39,9 +39,7 @@ Requirements for inclusion with the XScreenSaver collection
include it in the xscreensaver distribution. However, there are a few
requirements for me to distribute it:
- - Write in portable ANSI C. No C++. No nonstandard libraries.
-
- - Write a .man page describing all command-line options.
+ - Write in portable ISO C99. No C++. No nonstandard libraries.
- Write an .xml file describing the graphical configuration dialog box.
@@ -97,7 +95,8 @@ The XScreenSaver API
You may not store global state in global variables, or in function-local
static variables. All of your runtime state must be encapsulated in the
"state" object created by your "init" function. If you use global or
- static variables, your screen saver will not work properly on macOS.
+ static variables, your screen saver will not work properly on macOS,
+ iOS or Android.
Do not call XSync() or XFlush(). If you think you need to do that, it
probably means that you are you are relying on the speed of the graphics
diff --git a/aclocal.m4 b/aclocal.m4
index 45eab98..c3a710b 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -12,492 +12,1383 @@
# PARTICULAR PURPOSE.
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
-# Copyright (C) 1995-2002 Free Software Foundation, Inc.
-# Copyright (C) 2001-2003,2004 Red Hat, Inc.
-#
-# This file is free software, distributed under the terms of the GNU
-# General Public License. As a special exception to the GNU General
-# Public License, this file may be distributed as part of a program
-# that contains a configuration script generated by Autoconf, under
-# the same distribution terms as the rest of that program.
-#
-# This file can be copied and used freely without restrictions. It can
-# be used in projects which are not available under the GNU Public License
-# but which still want to provide support for the GNU gettext functionality.
-#
-# Macro to add for using GNU gettext.
-# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
-#
-# Modified to never use included libintl.
-# Owen Taylor <otaylor@redhat.com>, 12/15/1998
-#
-# Major rework to remove unused code
-# Owen Taylor <otaylor@redhat.com>, 12/11/2002
-#
-# Added better handling of ALL_LINGUAS from GNU gettext version
-# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
-#
-# Modified to require ngettext
-# Matthias Clasen <mclasen@redhat.com> 08/06/2004
-
-# Increment this whenever this file is changed.
-#serial 1
+# build-to-host.m4 serial 3
+dnl Copyright (C) 2023-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
-# We need this here as well, since someone might use autoconf-2.5x
-# to configure GLib then an older version to configure a package
-# using AM_GLIB_GNU_GETTEXT
-AC_PREREQ(2.53)
+dnl Written by Bruno Haible.
+dnl When the build environment ($build_os) is different from the target runtime
+dnl environment ($host_os), file names may need to be converted from the build
+dnl environment syntax to the target runtime environment syntax. This is
+dnl because the Makefiles are executed (mostly) by build environment tools and
+dnl therefore expect file names in build environment syntax, whereas the runtime
+dnl expects file names in target runtime environment syntax.
dnl
-dnl We go to great lengths to make sure that aclocal won't
-dnl try to pull in the installed version of these macros
-dnl when running aclocal in the glib directory.
-dnl
-m4_copy([AC_DEFUN],[glib_DEFUN])
-m4_copy([AC_REQUIRE],[glib_REQUIRE])
-dnl
-dnl At the end, if we're not within glib, we'll define the public
-dnl definitions in terms of our private definitions.
+dnl For example, if $build_os = cygwin and $host_os = mingw32, filenames need
+dnl be converted from Cygwin syntax to native Windows syntax:
+dnl /cygdrive/c/foo/bar -> C:\foo\bar
+dnl /usr/local/share -> C:\cygwin64\usr\local\share
dnl
+dnl gl_BUILD_TO_HOST([somedir])
+dnl This macro takes as input an AC_SUBSTed variable 'somedir', which must
+dnl already have its final value assigned, and produces two additional
+dnl AC_SUBSTed variables 'somedir_c' and 'somedir_c_make', that designate the
+dnl same file name value, just in different syntax:
+dnl - somedir_c is the file name in target runtime environment syntax,
+dnl as a C string (starting and ending with a double-quote,
+dnl and with escaped backslashes and double-quotes in
+dnl between).
+dnl - somedir_c_make is the same thing, escaped for use in a Makefile.
-# GLIB_LC_MESSAGES
-#--------------------
-glib_DEFUN([GLIB_LC_MESSAGES],
- [AC_CHECK_HEADERS([locale.h])
- if test $ac_cv_header_locale_h = yes; then
- AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
- [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
- am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
- if test $am_cv_val_LC_MESSAGES = yes; then
- AC_DEFINE(HAVE_LC_MESSAGES, 1,
- [Define if your <locale.h> file defines LC_MESSAGES.])
- fi
- fi])
+AC_DEFUN([gl_BUILD_TO_HOST],
+[
+ AC_REQUIRE([AC_CANONICAL_BUILD])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_BUILD_TO_HOST_INIT])
-# GLIB_PATH_PROG_WITH_TEST
-#----------------------------
-dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
-dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
-glib_DEFUN([GLIB_PATH_PROG_WITH_TEST],
-[# Extract the first word of "$2", so it can be a program name with args.
-set dummy $2; ac_word=[$]2
-AC_MSG_CHECKING([for $ac_word])
-AC_CACHE_VAL(ac_cv_path_$1,
-[case "[$]$1" in
- /*)
- ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
- for ac_dir in ifelse([$5], , $PATH, [$5]); do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- if [$3]; then
- ac_cv_path_$1="$ac_dir/$ac_word"
- break
- fi
- fi
- done
- IFS="$ac_save_ifs"
-dnl If no 4th arg is given, leave the cache variable unset,
-dnl so AC_PATH_PROGS will keep looking.
-ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
-])dnl
- ;;
-esac])dnl
-$1="$ac_cv_path_$1"
-if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
- AC_MSG_RESULT([$]$1)
-else
- AC_MSG_RESULT(no)
-fi
-AC_SUBST($1)dnl
+ dnl Define somedir_c.
+ gl_final_[$1]="$[$1]"
+ dnl Translate it from build syntax to host syntax.
+ case "$build_os" in
+ cygwin*)
+ case "$host_os" in
+ mingw* | windows*)
+ gl_final_[$1]=`cygpath -w "$gl_final_[$1]"` ;;
+ esac
+ ;;
+ esac
+ dnl Convert it to C string syntax.
+ [$1]_c=`printf '%s\n' "$gl_final_[$1]" | sed -e "$gl_sed_double_backslashes" -e "$gl_sed_escape_doublequotes" | tr -d "$gl_tr_cr"`
+ [$1]_c='"'"$[$1]_c"'"'
+ AC_SUBST([$1_c])
+
+ dnl Define somedir_c_make.
+ [$1]_c_make=`printf '%s\n' "$[$1]_c" | sed -e "$gl_sed_escape_for_make_1" -e "$gl_sed_escape_for_make_2" | tr -d "$gl_tr_cr"`
+ dnl Use the substituted somedir variable, when possible, so that the user
+ dnl may adjust somedir a posteriori when there are no special characters.
+ if test "$[$1]_c_make" = '\"'"${gl_final_[$1]}"'\"'; then
+ [$1]_c_make='\"$([$1])\"'
+ fi
+ AC_SUBST([$1_c_make])
])
-dnl Checks for special options needed on Mac OS X.
-dnl Defines INTL_MACOSX_LIBS.
-dnl
-dnl Copied from intlmacosx.m4 in gettext, GPL.
-dnl Copyright (C) 2004-2013 Free Software Foundation, Inc.
-glib_DEFUN([glib_gt_INTL_MACOSX],
+dnl Some initializations for gl_BUILD_TO_HOST.
+AC_DEFUN([gl_BUILD_TO_HOST_INIT],
[
- dnl Check for API introduced in Mac OS X 10.2.
- AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
- [gt_cv_func_CFPreferencesCopyAppValue],
- [gt_save_LIBS="$LIBS"
- LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[#include <CoreFoundation/CFPreferences.h>]],
- [[CFPreferencesCopyAppValue(NULL, NULL)]])],
- [gt_cv_func_CFPreferencesCopyAppValue=yes],
- [gt_cv_func_CFPreferencesCopyAppValue=no])
- LIBS="$gt_save_LIBS"])
- if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
- AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
- [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
- fi
- dnl Check for API introduced in Mac OS X 10.3.
- AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
- [gt_save_LIBS="$LIBS"
- LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[#include <CoreFoundation/CFLocale.h>]],
- [[CFLocaleCopyCurrent();]])],
- [gt_cv_func_CFLocaleCopyCurrent=yes],
- [gt_cv_func_CFLocaleCopyCurrent=no])
- LIBS="$gt_save_LIBS"])
- if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
- AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
- [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
- fi
- INTL_MACOSX_LIBS=
- if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
- INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
- fi
- AC_SUBST([INTL_MACOSX_LIBS])
+ gl_sed_double_backslashes='s/\\/\\\\/g'
+ gl_sed_escape_doublequotes='s/"/\\"/g'
+changequote(,)dnl
+ gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g"
+changequote([,])dnl
+ gl_sed_escape_for_make_2='s,\$,\\$$,g'
+ dnl Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+ dnl does not understand '\r'.
+ case `echo r | tr -d '\r'` in
+ '') gl_tr_cr='\015' ;;
+ *) gl_tr_cr='\r' ;;
+ esac
])
-# GLIB_WITH_NLS
-#-----------------
-glib_DEFUN([GLIB_WITH_NLS],
- dnl NLS is obligatory
- [USE_NLS=yes
- AC_SUBST(USE_NLS)
+# gettext.m4 serial 78 (gettext-0.22.4)
+dnl Copyright (C) 1995-2014, 2016, 2018-2023 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Lesser General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Lesser General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL must be one of 'external', 'use-libtool', 'here'.
+dnl INTLSYMBOL should be 'external' for packages other than GNU gettext.
+dnl It should be 'use-libtool' for the packages 'gettext-runtime' and
+dnl 'gettext-tools'.
+dnl It should be 'here' for the package 'gettext-runtime/intl'.
+dnl If INTLSYMBOL is 'here', then a libtool library
+dnl $(top_builddir)/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED).
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored. If NEEDSYMBOL is specified and is
+dnl 'need-formatstring-macros', then GNU gettext implementations that don't
+dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries. If empty,
+dnl the value '$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ m4_if([$1], [], , [m4_if([$1], [external], , [m4_if([$1], [use-libtool], , [m4_if([$1], [here], ,
+ [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+ m4_if(m4_if([$1], [], [old])[]m4_if([$1], [no-libtool], [old]), [old],
+ [errprint([ERROR: Use of AM_GNU_GETTEXT without [external] argument is no longer supported.
+])])
+ m4_if([$2], [], , [m4_if([$2], [need-ngettext], , [m4_if([$2], [need-formatstring-macros], ,
+ [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+ define([gt_building_libintl_in_same_build_tree],
+ m4_if([$1], [use-libtool], [yes], [m4_if([$1], [here], [yes], [no])]))
+ gt_NEEDS_INIT
+ AM_GNU_GETTEXT_NEED([$2])
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ dnl Ideally we would do this search only after the
+ dnl if test "$USE_NLS" = "yes"; then
+ dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl tests. But if configure.ac invokes AM_ICONV after AM_GNU_GETTEXT
+ dnl the configure script would need to contain the same shell code
+ dnl again, outside any 'if'. There are two solutions:
+ dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+ dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+ dnl Since AC_PROVIDE_IFELSE is not documented, we avoid it.
+ m4_if(gt_building_libintl_in_same_build_tree, yes, , [
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+ ])
+
+ dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
+ gt_INTL_MACOSX
- gt_cv_have_gettext=no
+ dnl Set USE_NLS.
+ AC_REQUIRE([AM_NLS])
- CATOBJEXT=NONE
- XGETTEXT=:
- INTLLIBS=
+ m4_if(gt_building_libintl_in_same_build_tree, yes, [
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl Add a version number to the cache macros.
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
- glib_gt_INTL_MACOSX
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ m4_if(gt_building_libintl_in_same_build_tree, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH([included-gettext],
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
- AC_CHECK_HEADER(libintl.h,
- [gt_cv_func_dgettext_libintl="no"
- libintl_extra_libs=""
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
- #
- # First check in libc
- #
- AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,
- [AC_TRY_LINK([
+ AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
#include <libintl.h>
-],
- [return !ngettext ("","", 1)],
- gt_cv_func_ngettext_libc=yes,
- gt_cv_func_ngettext_libc=no)
- ])
-
- if test "$gt_cv_func_ngettext_libc" = "yes" ; then
- AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
- [AC_TRY_LINK([
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings)
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+ ]])],
+ [eval "$gt_func_gnugettext_libc=yes"],
+ [eval "$gt_func_gnugettext_libc=no"])])
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ m4_if(gt_building_libintl_in_same_build_tree, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ [$gt_func_gnugettext_libintl],
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
#include <libintl.h>
-],
- [return !dgettext ("","")],
- gt_cv_func_dgettext_libc=yes,
- gt_cv_func_dgettext_libc=no)
- ])
- fi
-
- if test "$gt_cv_func_ngettext_libc" = "yes" ; then
- AC_CHECK_FUNCS(bind_textdomain_codeset)
- fi
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+ ]])],
+ [eval "$gt_func_gnugettext_libintl=yes"],
+ [eval "$gt_func_gnugettext_libintl=no"])
+ dnl Now see whether libintl exists and depends on libiconv or other
+ dnl OS dependent libraries, specifically on macOS and AIX.
+ gt_LIBINTL_EXTRA="$INTL_MACOSX_LIBS"
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ aix*) gt_LIBINTL_EXTRA="-lpthread" ;;
+ esac
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } \
+ && { test -n "$LIBICONV" || test -n "$gt_LIBINTL_EXTRA"; }; then
+ LIBS="$LIBS $LIBICONV $gt_LIBINTL_EXTRA"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+ ]])],
+ [LIBINTL="$LIBINTL $LIBICONV $gt_LIBINTL_EXTRA"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV $gt_LIBINTL_EXTRA"
+ eval "$gt_func_gnugettext_libintl=yes"
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
- #
- # If we don't have everything we want, check in libintl
- #
- if test "$gt_cv_func_dgettext_libc" != "yes" \
- || test "$gt_cv_func_ngettext_libc" != "yes" \
- || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
-
- AC_CHECK_LIB(intl, bindtextdomain,
- [AC_CHECK_LIB(intl, ngettext,
- [AC_CHECK_LIB(intl, dgettext,
- gt_cv_func_dgettext_libintl=yes)])])
-
- if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
- AC_MSG_CHECKING([if -liconv is needed to use gettext])
- AC_MSG_RESULT([])
- AC_CHECK_LIB(intl, ngettext,
- [AC_CHECK_LIB(intl, dcgettext,
- [gt_cv_func_dgettext_libintl=yes
- libintl_extra_libs=-liconv],
- :,-liconv)],
- :,-liconv)
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools \
+ && test "$PACKAGE" != libintl; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
fi
- #
- # If we found libintl, then check in it for bind_textdomain_codeset();
- # we'll prefer libc if neither have bind_textdomain_codeset(),
- # and both have dgettext and ngettext
- #
- if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
- glib_save_LIBS="$LIBS"
- LIBS="$LIBS -lintl $libintl_extra_libs"
- unset ac_cv_func_bind_textdomain_codeset
- AC_CHECK_FUNCS(bind_textdomain_codeset)
- LIBS="$glib_save_LIBS"
-
- if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
- gt_cv_func_dgettext_libc=no
- else
- if test "$gt_cv_func_dgettext_libc" = "yes" \
- && test "$gt_cv_func_ngettext_libc" = "yes"; then
- gt_cv_func_dgettext_libintl=no
- fi
- fi
+ m4_if(gt_building_libintl_in_same_build_tree, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
fi
fi
- if test "$gt_cv_func_dgettext_libc" = "yes" \
- || test "$gt_cv_func_dgettext_libintl" = "yes"; then
- gt_cv_have_gettext=yes
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="m4_if([$3],[],\${top_builddir}/intl,[$3])/libintl.la $LIBICONV $LIBTHREAD"
+ LTLIBINTL="m4_if([$3],[],\${top_builddir}/intl,[$3])/libintl.la $LTLIBICONV $LTLIBTHREAD"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
fi
-
- if test "$gt_cv_func_dgettext_libintl" = "yes"; then
- INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS"
- fi
-
- if test "$gt_cv_have_gettext" = "yes"; then
- AC_DEFINE(HAVE_GETTEXT,1,
- [Define if the GNU gettext() function is already present or preinstalled.])
- GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
- [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
- if test "$MSGFMT" != "no"; then
- glib_save_LIBS="$LIBS"
- LIBS="$LIBS $INTLLIBS"
- AC_CHECK_FUNCS(dcgettext)
- MSGFMT_OPTS=
- AC_MSG_CHECKING([if msgfmt accepts -c])
- GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[
-msgid ""
-msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
-"Project-Id-Version: test 1.0\n"
-"PO-Revision-Date: 2007-02-15 12:01+0100\n"
-"Last-Translator: test <foo@bar.xx>\n"
-"Language-Team: C <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
- AC_SUBST(MSGFMT_OPTS)
- AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
- GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
- [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
- AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
- return _nl_msg_cat_cntr],
- [CATOBJEXT=.gmo
- DATADIRNAME=share],
- [case $host in
- *-*-solaris*)
- dnl On Solaris, if bind_textdomain_codeset is in libc,
- dnl GNU format message catalog is always supported,
- dnl since both are added to the libc all together.
- dnl Hence, we'd like to go with DATADIRNAME=share and
- dnl and CATOBJEXT=.gmo in this case.
- AC_CHECK_FUNC(bind_textdomain_codeset,
- [CATOBJEXT=.gmo
- DATADIRNAME=share],
- [CATOBJEXT=.mo
- DATADIRNAME=lib])
- ;;
- *-*-openbsd*)
- CATOBJEXT=.mo
- DATADIRNAME=share
- ;;
- *)
- CATOBJEXT=.mo
- DATADIRNAME=lib
- ;;
- esac])
- LIBS="$glib_save_LIBS"
- INSTOBJEXT=.mo
- else
- gt_cv_have_gettext=no
- fi
+
+ CATOBJEXT=
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
fi
])
- if test "$gt_cv_have_gettext" = "yes" ; then
- AC_DEFINE(ENABLE_NLS, 1,
- [always defined to indicate that i18n is enabled])
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Some extra flags are needed during linking.
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE([ENABLE_NLS], [1],
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
fi
+ fi
- dnl Test whether we really found GNU xgettext.
- if test "$XGETTEXT" != ":"; then
- dnl If it is not GNU xgettext we define it as : so that the
- dnl Makefiles still can work.
- if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
- : ;
+ AC_MSG_CHECKING([whether to use NLS])
+ AC_MSG_RESULT([$USE_NLS])
+ if test "$USE_NLS" = "yes"; then
+ AC_MSG_CHECKING([where the gettext function comes from])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
else
- AC_MSG_RESULT(
- [found xgettext program is not GNU xgettext; ignore it])
- XGETTEXT=":"
+ gt_source="libc"
fi
+ else
+ gt_source="included intl directory"
fi
+ AC_MSG_RESULT([$gt_source])
+ fi
- # We need to process the po/ directory.
- POSUB=po
+ if test "$USE_NLS" = "yes"; then
- AC_OUTPUT_COMMANDS(
- [case "$CONFIG_FILES" in *po/Makefile.in*)
- sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
- esac])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
- dnl These rules are solely for the distribution goal. While doing this
- dnl we only have to keep exactly one list of the available catalogs
- dnl in configure.ac.
- for lang in $ALL_LINGUAS; do
- GMOFILES="$GMOFILES $lang.gmo"
- POFILES="$POFILES $lang.po"
- done
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE([HAVE_GETTEXT], [1],
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE([HAVE_DCGETTEXT], [1],
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+ m4_if(gt_building_libintl_in_same_build_tree, yes, [
dnl Make all variables we use known to autoconf.
- AC_SUBST(CATALOGS)
- AC_SUBST(CATOBJEXT)
- AC_SUBST(DATADIRNAME)
- AC_SUBST(GMOFILES)
- AC_SUBST(INSTOBJEXT)
- AC_SUBST(INTLLIBS)
- AC_SUBST(PO_IN_DATADIR_TRUE)
- AC_SUBST(PO_IN_DATADIR_FALSE)
- AC_SUBST(POFILES)
- AC_SUBST(POSUB)
+ AC_SUBST([USE_INCLUDED_LIBINTL])
+ AC_SUBST([CATOBJEXT])
])
-# AM_GLIB_GNU_GETTEXT
-# -------------------
-# Do checks necessary for use of gettext. If a suitable implementation
-# of gettext is found in either in libintl or in the C library,
-# it will set INTLLIBS to the libraries needed for use of gettext
-# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
-# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
-# on various variables needed by the Makefile.in.in installed by
-# glib-gettextize.
+ m4_if(gt_building_libintl_in_same_build_tree, yes, [], [
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST([INTLLIBS])
+ ])
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ AC_SUBST([POSUB])
+
+ dnl Define localedir_c and localedir_c_make.
+ dnl Find the final value of localedir.
+ gt_save_prefix="${prefix}"
+ gt_save_datarootdir="${datarootdir}"
+ gt_save_localedir="${localedir}"
+ dnl Unfortunately, prefix gets only finally determined at the end of
+ dnl configure.
+ if test "X$prefix" = "XNONE"; then
+ prefix="$ac_default_prefix"
+ fi
+ eval datarootdir="$datarootdir"
+ eval localedir="$localedir"
+ gl_BUILD_TO_HOST([localedir])
+ localedir="${gt_save_localedir}"
+ datarootdir="${gt_save_datarootdir}"
+ prefix="${gt_save_prefix}"
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+ m4_divert_text([DEFAULTS], [gt_needs=])
+ m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
+
+
+dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], [])
+
+# host-cpu-c-abi.m4 serial 17
+dnl Copyright (C) 2002-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible and Sam Steingold.
+
+dnl Sets the HOST_CPU variable to the canonical name of the CPU.
+dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its
+dnl C language ABI (application binary interface).
+dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in
+dnl config.h.
dnl
-AU_DEFUN([GLIB_GNU_GETTEXT],
- [AC_REQUIRE([AC_PROG_CC])dnl
-
- GLIB_LC_MESSAGES
- GLIB_WITH_NLS
-
- if test "$gt_cv_have_gettext" = "yes"; then
- if test "x$ALL_LINGUAS" = "x"; then
- LINGUAS=
- else
- AC_MSG_CHECKING(for catalogs to be installed)
- NEW_LINGUAS=
- for presentlang in $ALL_LINGUAS; do
- useit=no
- if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
- desiredlanguages="$LINGUAS"
+dnl This canonical name can be used to select a particular assembly language
+dnl source file that will interoperate with C code on the given host.
+dnl
+dnl For example:
+dnl * 'i386' and 'sparc' are different canonical names, because code for i386
+dnl will not run on SPARC CPUs and vice versa. They have different
+dnl instruction sets.
+dnl * 'sparc' and 'sparc64' are different canonical names, because code for
+dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code
+dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit
+dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit
+dnl mode, but not both.
+dnl * 'mips' and 'mipsn32' are different canonical names, because they use
+dnl different argument passing and return conventions for C functions, and
+dnl although the instruction set of 'mips' is a large subset of the
+dnl instruction set of 'mipsn32'.
+dnl * 'mipsn32' and 'mips64' are different canonical names, because they use
+dnl different sizes for the C types like 'int' and 'void *', and although
+dnl the instruction sets of 'mipsn32' and 'mips64' are the same.
+dnl * The same canonical name is used for different endiannesses. You can
+dnl determine the endianness through preprocessor symbols:
+dnl - 'arm': test __ARMEL__.
+dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL.
+dnl - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN.
+dnl * The same name 'i386' is used for CPUs of type i386, i486, i586
+dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because
+dnl - Instructions that do not exist on all of these CPUs (cmpxchg,
+dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your
+dnl assembly language source files use such instructions, you will
+dnl need to make the distinction.
+dnl - Speed of execution of the common instruction set is reasonable across
+dnl the entire family of CPUs. If you have assembly language source files
+dnl that are optimized for particular CPU types (like GNU gmp has), you
+dnl will need to make the distinction.
+dnl See <https://en.wikipedia.org/wiki/X86_instruction_listings>.
+AC_DEFUN([gl_HOST_CPU_C_ABI],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_C_ASM])
+ AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi],
+ [case "$host_cpu" in
+
+changequote(,)dnl
+ i[34567]86 )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi=i386
+ ;;
+
+ x86_64 )
+ # On x86_64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+ # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+ # with native Windows (mingw, MSVC).
+ # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if (defined __x86_64__ || defined __amd64__ \
+ || defined _M_X64 || defined _M_AMD64)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __ILP32__ || defined _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=x86_64-x32],
+ [gl_cv_host_cpu_c_abi=x86_64])],
+ [gl_cv_host_cpu_c_abi=i386])
+ ;;
+
+changequote(,)dnl
+ alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi=alpha
+ ;;
+
+ arm* | aarch64 )
+ # Assume arm with EABI.
+ # On arm64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+ # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef __aarch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __ILP32__ || defined _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=arm64-ilp32],
+ [gl_cv_host_cpu_c_abi=arm64])],
+ [# Don't distinguish little-endian and big-endian arm, since they
+ # don't require different machine code for simple operations and
+ # since the user can distinguish them through the preprocessor
+ # defines __ARMEL__ vs. __ARMEB__.
+ # But distinguish arm which passes floating-point arguments and
+ # return values in integer registers (r0, r1, ...) - this is
+ # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which
+ # passes them in float registers (s0, s1, ...) and double registers
+ # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer
+ # sets the preprocessor defines __ARM_PCS (for the first case) and
+ # __ARM_PCS_VFP (for the second case), but older GCC does not.
+ echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c
+ # Look for a reference to the register d0 in the .s file.
+ AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1
+ if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then
+ gl_cv_host_cpu_c_abi=armhf
+ else
+ gl_cv_host_cpu_c_abi=arm
+ fi
+ rm -f conftest*
+ ])
+ ;;
+
+ hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+ # On hppa, the C compiler may be generating 32-bit code or 64-bit
+ # code. In the latter case, it defines _LP64 and __LP64__.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=hppa64],
+ [gl_cv_host_cpu_c_abi=hppa])
+ ;;
+
+ ia64* )
+ # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+ # 32-bit code. In the latter case, it defines _ILP32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=ia64-ilp32],
+ [gl_cv_host_cpu_c_abi=ia64])
+ ;;
+
+ mips* )
+ # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+ # at 32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=mips64],
+ [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but
+ # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32.
+ # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but
+ # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if (_MIPS_SIM == _ABIN32)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=mipsn32],
+ [gl_cv_host_cpu_c_abi=mips])])
+ ;;
+
+ powerpc* )
+ # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+ # No need to distinguish them here; the caller may distinguish
+ # them based on the OS.
+ # On powerpc64 systems, the C compiler may still be generating
+ # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+ # be generating 64-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __powerpc64__ || defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [# On powerpc64, there are two ABIs on Linux: The AIX compatible
+ # one and the ELFv2 one. The latter defines _CALL_ELF=2.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined _CALL_ELF && _CALL_ELF == 2
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=powerpc64-elfv2],
+ [gl_cv_host_cpu_c_abi=powerpc64])
+ ],
+ [gl_cv_host_cpu_c_abi=powerpc])
+ ;;
+
+ rs6000 )
+ gl_cv_host_cpu_c_abi=powerpc
+ ;;
+
+ riscv32 | riscv64 )
+ # There are 2 architectures (with variants): rv32* and rv64*.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if __riscv_xlen == 64
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [cpu=riscv64],
+ [cpu=riscv32])
+ # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+ # Size of 'long' and 'void *':
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [main_abi=lp64],
+ [main_abi=ilp32])
+ # Float ABIs:
+ # __riscv_float_abi_double:
+ # 'float' and 'double' are passed in floating-point registers.
+ # __riscv_float_abi_single:
+ # 'float' are passed in floating-point registers.
+ # __riscv_float_abi_soft:
+ # No values are passed in floating-point registers.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __riscv_float_abi_double
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [float_abi=d],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __riscv_float_abi_single
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [float_abi=f],
+ [float_abi=''])
+ ])
+ gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}"
+ ;;
+
+ s390* )
+ # On s390x, the C compiler may be generating 64-bit (= s390x) code
+ # or 31-bit (= s390) code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __s390x__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=s390x],
+ [gl_cv_host_cpu_c_abi=s390])
+ ;;
+
+ sparc | sparc64 )
+ # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+ # C compiler still generates 32-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=sparc64],
+ [gl_cv_host_cpu_c_abi=sparc])
+ ;;
+
+ *)
+ gl_cv_host_cpu_c_abi="$host_cpu"
+ ;;
+ esac
+ ])
+
+ dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same.
+ HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'`
+ HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi"
+ AC_SUBST([HOST_CPU])
+ AC_SUBST([HOST_CPU_C_ABI])
+
+ # This was
+ # AC_DEFINE_UNQUOTED([__${HOST_CPU}__])
+ # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__])
+ # earlier, but KAI C++ 3.2d doesn't like this.
+ sed -e 's/-/_/g' >> confdefs.h <<EOF
+#ifndef __${HOST_CPU}__
+#define __${HOST_CPU}__ 1
+#endif
+#ifndef __${HOST_CPU_C_ABI}__
+#define __${HOST_CPU_C_ABI}__ 1
+#endif
+EOF
+ AH_TOP([/* CPU and C ABI indicator */
+#ifndef __i386__
+#undef __i386__
+#endif
+#ifndef __x86_64_x32__
+#undef __x86_64_x32__
+#endif
+#ifndef __x86_64__
+#undef __x86_64__
+#endif
+#ifndef __alpha__
+#undef __alpha__
+#endif
+#ifndef __arm__
+#undef __arm__
+#endif
+#ifndef __armhf__
+#undef __armhf__
+#endif
+#ifndef __arm64_ilp32__
+#undef __arm64_ilp32__
+#endif
+#ifndef __arm64__
+#undef __arm64__
+#endif
+#ifndef __hppa__
+#undef __hppa__
+#endif
+#ifndef __hppa64__
+#undef __hppa64__
+#endif
+#ifndef __ia64_ilp32__
+#undef __ia64_ilp32__
+#endif
+#ifndef __ia64__
+#undef __ia64__
+#endif
+#ifndef __loongarch64__
+#undef __loongarch64__
+#endif
+#ifndef __m68k__
+#undef __m68k__
+#endif
+#ifndef __mips__
+#undef __mips__
+#endif
+#ifndef __mipsn32__
+#undef __mipsn32__
+#endif
+#ifndef __mips64__
+#undef __mips64__
+#endif
+#ifndef __powerpc__
+#undef __powerpc__
+#endif
+#ifndef __powerpc64__
+#undef __powerpc64__
+#endif
+#ifndef __powerpc64_elfv2__
+#undef __powerpc64_elfv2__
+#endif
+#ifndef __riscv32__
+#undef __riscv32__
+#endif
+#ifndef __riscv64__
+#undef __riscv64__
+#endif
+#ifndef __riscv32_ilp32__
+#undef __riscv32_ilp32__
+#endif
+#ifndef __riscv32_ilp32f__
+#undef __riscv32_ilp32f__
+#endif
+#ifndef __riscv32_ilp32d__
+#undef __riscv32_ilp32d__
+#endif
+#ifndef __riscv64_ilp32__
+#undef __riscv64_ilp32__
+#endif
+#ifndef __riscv64_ilp32f__
+#undef __riscv64_ilp32f__
+#endif
+#ifndef __riscv64_ilp32d__
+#undef __riscv64_ilp32d__
+#endif
+#ifndef __riscv64_lp64__
+#undef __riscv64_lp64__
+#endif
+#ifndef __riscv64_lp64f__
+#undef __riscv64_lp64f__
+#endif
+#ifndef __riscv64_lp64d__
+#undef __riscv64_lp64d__
+#endif
+#ifndef __s390__
+#undef __s390__
+#endif
+#ifndef __s390x__
+#undef __s390x__
+#endif
+#ifndef __sh__
+#undef __sh__
+#endif
+#ifndef __sparc__
+#undef __sparc__
+#endif
+#ifndef __sparc64__
+#undef __sparc64__
+#endif
+])
+
+])
+
+
+dnl Sets the HOST_CPU_C_ABI_32BIT variable to 'yes' if the C language ABI
+dnl (application binary interface) is a 32-bit one, to 'no' if it is a 64-bit
+dnl one.
+dnl This is a simplified variant of gl_HOST_CPU_C_ABI.
+AC_DEFUN([gl_HOST_CPU_C_ABI_32BIT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([32-bit host C ABI], [gl_cv_host_cpu_c_abi_32bit],
+ [case "$host_cpu" in
+
+ # CPUs that only support a 32-bit ABI.
+ arc \
+ | bfin \
+ | cris* \
+ | csky \
+ | epiphany \
+ | ft32 \
+ | h8300 \
+ | m68k \
+ | microblaze | microblazeel \
+ | nds32 | nds32le | nds32be \
+ | nios2 | nios2eb | nios2el \
+ | or1k* \
+ | or32 \
+ | sh | sh[1234] | sh[1234]e[lb] \
+ | tic6x \
+ | xtensa* )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ # CPUs that only support a 64-bit ABI.
+changequote(,)dnl
+ alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
+ | mmix )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi_32bit=no
+ ;;
+
+ *)
+ if test -n "$gl_cv_host_cpu_c_abi"; then
+ dnl gl_HOST_CPU_C_ABI has already been run. Use its result.
+ case "$gl_cv_host_cpu_c_abi" in
+ i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
+ gl_cv_host_cpu_c_abi_32bit=yes ;;
+ x86_64 | alpha | arm64 | aarch64c | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
+ gl_cv_host_cpu_c_abi_32bit=no ;;
+ *)
+ gl_cv_host_cpu_c_abi_32bit=unknown ;;
+ esac
else
- desiredlanguages="$ALL_LINGUAS"
+ gl_cv_host_cpu_c_abi_32bit=unknown
fi
- for desiredlang in $desiredlanguages; do
- # Use the presentlang catalog if desiredlang is
- # a. equal to presentlang, or
- # b. a variant of presentlang (because in this case,
- # presentlang can be used as a fallback for messages
- # which are not translated in the desiredlang catalog).
- case "$desiredlang" in
- "$presentlang"*) useit=yes;;
- esac
- done
- if test $useit = yes; then
- NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ if test $gl_cv_host_cpu_c_abi_32bit = unknown; then
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[int test_pointer_size[sizeof (void *) - 5];
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
fi
- done
- LINGUAS=$NEW_LINGUAS
- AC_MSG_RESULT($LINGUAS)
- fi
+ ;;
+ esac
+ ])
- dnl Construct list of names of catalog files to be constructed.
- if test -n "$LINGUAS"; then
- for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
- fi
- fi
-
- dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
- dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
- dnl Try to locate is.
- MKINSTALLDIRS=
- if test -n "$ac_aux_dir"; then
- MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
- fi
- if test -z "$MKINSTALLDIRS"; then
- MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
- fi
- AC_SUBST(MKINSTALLDIRS)
-
- dnl Generate list of files to be processed by xgettext which will
- dnl be included in po/Makefile.
- test -d po || mkdir po
- if test "x$srcdir" != "x."; then
- if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
- posrcprefix="$srcdir/"
- else
- posrcprefix="../$srcdir/"
+ HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
+])
+
+# iconv.m4 serial 27
+dnl Copyright (C) 2000-2002, 2007-2014, 2016-2024 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.64])
+
+dnl Note: AM_ICONV is documented in the GNU gettext manual
+dnl <https://www.gnu.org/software/gettext/manual/html_node/AM_005fICONV.html>.
+dnl Don't make changes that are incompatible with that documentation!
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
+ gl_saved_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_func_iconv=yes])
+ if test "$am_cv_func_iconv" != yes; then
+ gl_saved_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_lib_iconv=yes]
+ [am_cv_func_iconv=yes])
+ LIBS="$gl_saved_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+ dnl Solaris 10.
+ gl_saved_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+ ]],
+ [[int result = 0;
+ /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from
+ successful returns. This is even documented in
+ <https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ {
+ /* Try standardized names. */
+ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+ /* Try IRIX, OSF/1 names. */
+ iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+ /* Try AIX names. */
+ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+ /* Try HP-UX names. */
+ iconv_t cd4 = iconv_open ("utf8", "eucJP");
+ if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+ && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+ result |= 16;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd2 != (iconv_t)(-1))
+ iconv_close (cd2);
+ if (cd3 != (iconv_t)(-1))
+ iconv_close (cd3);
+ if (cd4 != (iconv_t)(-1))
+ iconv_close (cd4);
+ }
+ return result;
+]])],
+ [am_cv_func_iconv_works=yes], ,
+ [case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$gl_saved_LIBS"
+ ])
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+ AC_DEFINE([HAVE_ICONV], [1],
+ [Define if you have the iconv() function and it works.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$gl_saved_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST([LIBICONV])
+ AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE, in order to avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+AC_DEFUN_ONCE([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([whether iconv is compatible with its POSIX signature],
+ [gl_cv_iconv_nonconst],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+ ]],
+ [[]])],
+ [gl_cv_iconv_nonconst=yes],
+ [gl_cv_iconv_nonconst=no])
+ ])
+ else
+ dnl When compiling GNU libiconv on a system that does not have iconv yet,
+ dnl pick the POSIX compliant declaration without 'const'.
+ gl_cv_iconv_nonconst=yes
+ fi
+ if test $gl_cv_iconv_nonconst = yes; then
+ iconv_arg1=""
+ else
+ iconv_arg1="const"
+ fi
+ AC_DEFINE_UNQUOTED([ICONV_CONST], [$iconv_arg1],
+ [Define as const if the declaration of iconv() needs const.])
+ dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+ m4_ifdef([gl_ICONV_H_DEFAULTS],
+ [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ if test $gl_cv_iconv_nonconst != yes; then
+ ICONV_CONST="const"
fi
- else
- posrcprefix="../"
- fi
- rm -f po/POTFILES
- sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
- < $srcdir/po/POTFILES.in > po/POTFILES
- ],
- [[$0: This macro is deprecated. You should use upstream gettext instead.]])
-
-# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
-# -------------------------------
-# Define VARIABLE to the location where catalog files will
-# be installed by po/Makefile.
-glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
-[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
-glib_save_prefix="$prefix"
-glib_save_exec_prefix="$exec_prefix"
-glib_save_datarootdir="$datarootdir"
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix=$prefix
-datarootdir=`eval echo "${datarootdir}"`
-if test "x$CATOBJEXT" = "x.mo" ; then
- localedir=`eval echo "${libdir}/locale"`
-else
- localedir=`eval echo "${datadir}/locale"`
-fi
-prefix="$glib_save_prefix"
-exec_prefix="$glib_save_exec_prefix"
-datarootdir="$glib_save_datarootdir"
-AC_DEFINE_UNQUOTED($1, "$localedir",
- [Define the location where the catalogs will be installed])
+ ])
+
+ dnl A summary result, for those packages which want to print a summary at the
+ dnl end of the configuration.
+ if test "$am_func_iconv" = yes; then
+ if test -n "$LIBICONV"; then
+ am_cv_func_iconv_summary='yes, in libiconv'
+ else
+ am_cv_func_iconv_summary='yes, in libc'
+ fi
+ else
+ if test "$am_cv_func_iconv" = yes; then
+ am_cv_func_iconv_summary='not working, consider installing GNU libiconv'
+ else
+ am_cv_func_iconv_summary='no, consider installing GNU libiconv'
+ fi
+ fi
])
+# intlmacosx.m4 serial 10 (gettext-0.23)
+dnl Copyright (C) 2004-2014, 2016, 2019-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
dnl
-dnl Now the definitions that aclocal will find
-dnl
-ifdef(glib_configure_ac,[],[
-AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
-AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
-])dnl
-
-# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])
-#
-# Create a temporary file with TEST-FILE as its contents and pass the
-# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with
-# 0 and perform ACTION-IF-FAIL for any other exit status.
-AC_DEFUN([GLIB_RUN_PROG],
-[cat >conftest.foo <<_ACEOF
-$2
-_ACEOF
-if AC_RUN_LOG([$1 conftest.foo]); then
- m4_ifval([$3], [$3], [:])
-m4_ifvaln([$4], [else $4])dnl
-echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD
-sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD
-fi])
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Lesser General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Lesser General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+dnl Checks for special options needed on Mac OS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+ dnl Check for API introduced in Mac OS X 10.4.
+ AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+ [gt_cv_func_CFPreferencesCopyAppValue],
+ [gt_saved_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <CoreFoundation/CFPreferences.h>]],
+ [[CFPreferencesCopyAppValue(NULL, NULL)]])],
+ [gt_cv_func_CFPreferencesCopyAppValue=yes],
+ [gt_cv_func_CFPreferencesCopyAppValue=no])
+ LIBS="$gt_saved_LIBS"])
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+ AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
+ [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+ dnl Don't check for the API introduced in Mac OS X 10.5, CFLocaleCopyCurrent,
+ dnl because in macOS 10.13.4 it has the following behaviour:
+ dnl When two or more languages are specified in the
+ dnl "System Preferences > Language & Region > Preferred Languages" panel,
+ dnl it returns en_CC where CC is the territory (even when English is not among
+ dnl the preferred languages!). What we want instead is what
+ dnl CFLocaleCopyCurrent returned in earlier macOS releases and what
+ dnl CFPreferencesCopyAppValue still returns, namely ll_CC where ll is the
+ dnl first among the preferred languages and CC is the territory.
+ AC_CACHE_CHECK([for CFLocaleCopyPreferredLanguages], [gt_cv_func_CFLocaleCopyPreferredLanguages],
+ [gt_saved_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <CoreFoundation/CFLocale.h>]],
+ [[CFLocaleCopyPreferredLanguages();]])],
+ [gt_cv_func_CFLocaleCopyPreferredLanguages=yes],
+ [gt_cv_func_CFLocaleCopyPreferredLanguages=no])
+ LIBS="$gt_saved_LIBS"])
+ if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then
+ AC_DEFINE([HAVE_CFLOCALECOPYPREFERREDLANGUAGES], [1],
+ [Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework.])
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes \
+ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then
+ dnl Starting with macOS version 14, CoreFoundation relies on CoreServices,
+ dnl and we have to link it in explicitly, otherwise an exception
+ dnl NSInvalidArgumentException "unrecognized selector sent to instance"
+ dnl occurs.
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices"
+ fi
+ AC_SUBST([INTL_MACOSX_LIBS])
+])
dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml])
@@ -668,19 +1559,1335 @@ AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL])
# AC_DEFUN([AC_PROG_INTLTOOL], ...)
-# nls.m4 serial 5 (gettext-0.18)
-dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software
-dnl Foundation, Inc.
+# lib-ld.m4 serial 13
+dnl Copyright (C) 1996-2003, 2009-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes
+ ;;
+*)
+ acl_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([[--with-gnu-ld]],
+ [assume the C compiler uses GNU ld [default=no]])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+if test -n "$LD"; then
+ AC_MSG_CHECKING([for ld])
+elif test "$GCC" = yes; then
+ AC_MSG_CHECKING([for ld used by $CC])
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+if test -n "$LD"; then
+ # Let the user override the test with a path.
+ :
+else
+ AC_CACHE_VAL([acl_cv_path_LD],
+ [
+ acl_cv_path_LD= # Final result of this test
+ ac_prog=ld # Program to search in $PATH
+ if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ case $host in
+ *-*-mingw* | windows*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ acl_output=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $acl_output in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'`
+ while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do
+ acl_output=`echo $acl_output | sed "s%$re_direlt%/%"`
+ done
+ # Got the pathname. No search in PATH is needed.
+ acl_cv_path_LD="$acl_output"
+ ac_prog=
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+ fi
+ if test -n "$ac_prog"; then
+ # Search for $ac_prog in $PATH.
+ acl_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$acl_saved_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_saved_IFS"
+ fi
+ case $host in
+ *-*-aix*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __powerpc64__ || defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [# The compiler produces 64-bit code. Add option '-b64' so that the
+ # linker groks 64-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -b64 "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;;
+ esac
+ ], [])
+ ;;
+ sparc64-*-netbsd*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [],
+ [# The compiler produces 32-bit code. Add option '-m elf32_sparc'
+ # so that the linker groks 32-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -m elf32_sparc "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;;
+ esac
+ ])
+ ;;
+ esac
+ ])
+ LD="$acl_cv_path_LD"
+fi
+if test -n "$LD"; then
+ AC_MSG_RESULT([$LD])
+else
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([no acceptable ld found in \$PATH])
+fi
+AC_LIB_PROG_LD_GNU
+])
+
+# lib-link.m4 serial 34
+dnl Copyright (C) 2001-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.61])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ acl_saved_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ acl_saved_LIBS="$LIBS"
+ dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+ dnl because these -l options might require -L options that are present in
+ dnl LIBS. -l options benefit only from the -L options listed before it.
+ dnl Otherwise, add it to the front of LIBS, because it may be a static
+ dnl library that depends on another static library that is present in LIBS.
+ dnl Static libraries benefit only from the static libraries listed after
+ dnl it.
+ case " $LIB[]NAME" in
+ *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+ *) LIBS="$LIB[]NAME $LIBS" ;;
+ esac
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[$3]], [[$4]])],
+ [ac_cv_lib[]Name=yes],
+ [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+ LIBS="$acl_saved_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$acl_saved_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ LIB[]NAME[]_PREFIX=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl acl_libext,
+dnl acl_shlibext,
+dnl acl_libname_spec,
+dnl acl_library_names_spec,
+dnl acl_hardcode_libdir_flag_spec,
+dnl acl_hardcode_libdir_separator,
+dnl acl_hardcode_direct,
+dnl acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Complain if config.rpath is missing.
+ AC_REQUIRE_AUX_FILE([config.rpath])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE([rpath],
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_frompackage_]NAME, [$2])
+ popdef([NAME])
+ pushdef([PACK],[$2])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_libsinpackage_]PACKUP,
+ m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+ popdef([PACKUP])
+ popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+ ])
+ AC_ARG_WITH(PACK[-prefix],
+[[ --with-]]PACK[[-prefix[=DIR] search for ]]PACKLIBS[[ in DIR/include and DIR/lib
+ --without-]]PACK[[-prefix don't search for ]]PACKLIBS[[ in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+])
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Use breadth-first search.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ LIB[]NAME[]_PREFIX=
+ dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+ dnl computed. So it has to be reset here.
+ HAVE_LIB[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ dnl The same code as in the loop below:
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$acl_hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ saved_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$saved_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $dependency_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ dnl Really add $dependency_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ dnl Really add $dependency_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ dnl But on GNU systems, ignore -lc options, because
+ dnl - linking with libc is the default anyway,
+ dnl - linking with libc.a may produce an error
+ dnl "/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie"
+ dnl or may produce an executable that always crashes, see
+ dnl <https://lists.gnu.org/archive/html/grep-devel/2020-09/msg00052.html>.
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_saved_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_saved_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+ popdef([PACKLIBS])
+ popdef([PACKUP])
+ popdef([PACK])
+ popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+ AC_REQUIRE([AC_LIB_RPATH])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ $1=
+ if test "$enable_rpath" != no; then
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode directories into the resulting
+ dnl binary.
+ rpathdirs=
+ next=
+ for opt in $2; do
+ if test -n "$next"; then
+ dir="$next"
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dir" != "X/usr/$acl_libdirstem3"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next=
+ else
+ case $opt in
+ -L) next=yes ;;
+ -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dir" != "X/usr/$acl_libdirstem3"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next= ;;
+ *) next= ;;
+ esac
+ fi
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n ""$3""; then
+ dnl libtool is used for linking. Use -R options.
+ for dir in $rpathdirs; do
+ $1="${$1}${$1:+ }-R$dir"
+ done
+ else
+ dnl The linker is used for linking directly.
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user
+ dnl must pass all path elements in one option.
+ alldirs=
+ for dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+ done
+ acl_saved_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ $1="$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for dir in $rpathdirs; do
+ acl_saved_libdir="$libdir"
+ libdir="$dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ $1="${$1}${$1:+ }$flag"
+ done
+ fi
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST([$1])
+])
+
+# lib-prefix.m4 serial 22
+dnl Copyright (C) 2001-2005, 2008-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_ARG_WITH([lib-prefix],
+[[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_saved_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a function acl_is_expected_elfclass, that tests whether standard input
+dn; has a 32-bit or 64-bit ELF header, depending on the host CPU ABI,
+dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing
+dnl the basename of the libdir to try in turn, either "lib" or "lib64" or
+dnl "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar.
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+ dnl There is no formal standard regarding lib, lib32, and lib64.
+ dnl On most glibc systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. However, on
+ dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go
+ dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib.
+ dnl We determine the compiler's default mode by looking at the compiler's
+ dnl library search path. If at least one of its elements ends in /lib64 or
+ dnl points to a directory whose absolute pathname ends in /lib64, we use that
+ dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default,
+ dnl namely "lib".
+ dnl On Solaris systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+ dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT])
+
+ AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf],
+ [AC_EGREP_CPP([Extensible Linking Format],
+ [#if defined __ELF__ || (defined __linux__ && defined __EDG__)
+ Extensible Linking Format
+ #endif
+ ],
+ [gl_cv_elf=yes],
+ [gl_cv_elf=no])
+ ])
+ if test $gl_cv_elf = yes; then
+ # Extract the ELF class of a file (5th byte) in decimal.
+ # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+ if od -A x < /dev/null >/dev/null 2>/dev/null; then
+ # Use POSIX od.
+ func_elfclass ()
+ {
+ od -A n -t d1 -j 4 -N 1
+ }
+ else
+ # Use BSD hexdump.
+ func_elfclass ()
+ {
+ dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
+ echo
+ }
+ fi
+ # Use 'expr', not 'test', to compare the values of func_elfclass, because on
+ # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
+ # not 1 or 2.
+changequote(,)dnl
+ case $HOST_CPU_C_ABI_32BIT in
+ yes)
+ # 32-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null
+ }
+ ;;
+ no)
+ # 64-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null
+ }
+ ;;
+ *)
+ # Unknown.
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ ;;
+ esac
+changequote([,])dnl
+ else
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ fi
+
+ dnl Allow the user to override the result by setting acl_cv_libdirstems.
+ AC_CACHE_CHECK([for the common suffixes of directories in the library search path],
+ [acl_cv_libdirstems],
+ [dnl Try 'lib' first, because that's the default for libdir in GNU, see
+ dnl <https://www.gnu.org/prep/standards/html_node/Directory-Variables.html>.
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ acl_libdirstem3=
+ case "$host_os" in
+ solaris*)
+ dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+ dnl <https://docs.oracle.com/cd/E19253-01/816-5138/dev-env/index.html>.
+ dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+ dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+ dnl symlink is missing, so we set acl_libdirstem2 too.
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ acl_libdirstem2=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem3=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ netbsd*)
+ dnl On NetBSD/sparc64, there is a 'sparc' subdirectory that contains
+ dnl 32-bit libraries.
+ if test $HOST_CPU_C_ABI_32BIT != no; then
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparc ;;
+ esac
+ fi
+ ;;
+ *)
+ dnl If $CC generates code for a 32-bit ABI, the libraries are
+ dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64.
+ dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries
+ dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32.
+ dnl Find the compiler's search path. However, non-system compilers
+ dnl sometimes have odd library search paths. But we can't simply invoke
+ dnl '/usr/bin/gcc -print-search-dirs' because that would not take into
+ dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS.
+ searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
+ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test $HOST_CPU_C_ABI_32BIT != no; then
+ # 32-bit or unknown ABI.
+ if test -d /usr/lib32; then
+ acl_libdirstem2=lib32
+ fi
+ fi
+ if test $HOST_CPU_C_ABI_32BIT != yes; then
+ # 64-bit or unknown ABI.
+ if test -d /usr/lib64; then
+ acl_libdirstem3=lib64
+ fi
+ fi
+ if test -n "$searchpath"; then
+ acl_saved_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64 ) acl_libdirstem3=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_saved_IFS"
+ if test $HOST_CPU_C_ABI_32BIT = yes; then
+ # 32-bit ABI.
+ acl_libdirstem3=
+ fi
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ # 64-bit ABI.
+ acl_libdirstem2=
+ fi
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+ test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
+ acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
+ ])
+ dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and
+ dnl acl_libdirstem3.
+changequote(,)dnl
+ acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
+ acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
+ acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
+changequote([,])dnl
+])
+
+# nls.m4 serial 6 (gettext-0.20.2)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016, 2019-2024 Free
+dnl Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl
dnl This file can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
+dnl the GNU General Public License or the GNU Lesser General Public
dnl License but which still want to provide support for the GNU gettext
dnl functionality.
dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
+dnl by the GNU Lesser General Public License, and the rest of the GNU
dnl gettext package is covered by the GNU General Public License.
dnl They are *not* in the public domain.
@@ -701,7 +2908,555 @@ AC_DEFUN([AM_NLS],
AC_SUBST([USE_NLS])
])
-# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# po.m4 serial 32 (gettext-0.21.1)
+dnl Copyright (C) 1995-2014, 2016, 2018-2022, 2024 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Lesser General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Lesser General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+ AC_REQUIRE([AC_PROG_SED])dnl
+ AC_REQUIRE([AM_NLS])dnl
+
+ dnl Release version of the gettext macros. This is used to ensure that
+ dnl the gettext macros and po/Makefile.in.in are in sync.
+ AC_SUBST([GETTEXT_MACRO_VERSION], [0.20])
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
+
+ dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([GMSGFMT_015])
+
+ dnl Search for GNU xgettext 0.12 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([XGETTEXT_015])
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+ dnl Test whether it is GNU msgmerge >= 0.20.
+ if LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then
+ MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt'
+ else
+ dnl Test whether it is GNU msgmerge >= 0.12.
+ if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then
+ MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet'
+ else
+ dnl With these old versions, $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) is
+ dnl slow. But this is not a big problem, as such old gettext versions are
+ dnl hardly in use any more.
+ MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet'
+ fi
+ fi
+ AC_SUBST([MSGMERGE_FOR_MSGFMT_OPTION])
+
+ dnl Support for AM_XGETTEXT_OPTION.
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+ AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+ AC_CONFIG_COMMANDS([po-directories], [[
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ gt_tab=`printf '\t'`
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ ALL_LINGUAS=$OBSOLETE_ALL_LINGUAS
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang" | "$presentlang"_* | "$presentlang".* | "$presentlang"@*)
+ useit=yes
+ ;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done]],
+ [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS.
+ OBSOLETE_ALL_LINGUAS="$ALL_LINGUAS"
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+ # When this code is run, in config.status, two variables have already been
+ # set:
+ # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+ # - LINGUAS is the value of the environment variable LINGUAS at configure
+ # time.
+
+changequote(,)dnl
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ # Find a way to echo strings without interpreting backslash.
+ if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='echo'
+ else
+ if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='printf %s\n'
+ else
+ echo_func () {
+ cat <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ fi
+
+ # A sed script that extracts the value of VARIABLE from a Makefile.
+ tab=`printf '\t'`
+ sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
+ # Seen the first line of the variable definition.
+ s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+ ALL_LINGUAS=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ PROPERTIESFILES="$PROPERTIESFILES \$(srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang" | "$presentlang"_* | "$presentlang".* | "$presentlang"@*)
+ useit=yes
+ ;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ fi
+
+ sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+ tab=`printf '\t'`
+ if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+ XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
+
+# progtest.m4 serial 10 (gettext-0.23)
+dnl Copyright (C) 1996-2003, 2005, 2008-2024 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Lesser General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Lesser General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+AC_PREREQ([2.53])
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL([ac_cv_path_$1],
+[case "[$]$1" in
+ [[\\/]]* | ?:[[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in m4_if([$5], , $PATH, [$5]); do
+ IFS="$gt_saved_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$gt_saved_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+m4_if([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test m4_if([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$][$1])
+else
+ AC_MSG_RESULT([no])
+fi
+AC_SUBST([$1])dnl
+])
+
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
diff --git a/config.h.in b/config.h.in
index 11a0ab9..88405d9 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,7 +1,7 @@
/* config.h.in. Generated from configure.ac by autoheader. */
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski.
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski.
* Generate this file by running 'configure' rather than editing it by hand.
*/
@@ -9,7 +9,8 @@
/* Define this to allow root to unlock, when not using PAM. */
#undef ALLOW_ROOT_PASSWD
-/* always defined to indicate that i18n is enabled */
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */
#undef ENABLE_NLS
/* This is the name of the gettext package to use. */
@@ -21,32 +22,22 @@
/* Define this for Solaris getpwanam. */
#undef HAVE_ADJUNCT_PASSWD
-/* Define to 1 if you have the `bind_textdomain_codeset' function. */
-#undef HAVE_BIND_TEXTDOMAIN_CODESET
-
-/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
- CoreFoundation framework. */
-#undef HAVE_CFLOCALECOPYCURRENT
+/* Define to 1 if you have the Mac OS X function
+ CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES
/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
the CoreFoundation framework. */
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
-/* Define this if you have Gnome and want to build support for the
- xscreensaver control panel in the Gtk 1.x Gnome Control Center. */
-#undef HAVE_CRAPPLET
-
-/* Define this if HAVE_CRAPPLET is defined, and the function
- capplet_widget_changes_are_immediate is available. */
-#undef HAVE_CRAPPLET_IMMEDIATE
-
/* Define to 1 if you have the <crypt.h> header file. */
#undef HAVE_CRYPT_H
-/* Define to 1 if you have the `dcgettext' function. */
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+ */
#undef HAVE_DCGETTEXT
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+/* Define to 1 if you have the <dirent.h> header file, and it defines 'DIR'.
*/
#undef HAVE_DIRENT_H
@@ -62,23 +53,29 @@
/* Define this for DEC/SCO "Enhanced Security" with getprpwnam. */
#undef HAVE_ENHANCED_PASSWD
-/* Define to 1 if you have the `fcntl' function. */
+/* Define to 1 if you have the 'fcntl' function. */
#undef HAVE_FCNTL
+/* Define this if you have the ffmpeg libraries. */
+#undef HAVE_FFMPEG
+
/* Define this if you have forkpty. */
#undef HAVE_FORKPTY
-/* Define this if you have GDK_Pixbuf. */
+/* Define this if you have GDK-Pixbuf. */
#undef HAVE_GDK_PIXBUF
/* Define this if you have the gdk_pixbuf_apply_embedded_orientation function
(gdk-pixbuf 2.12). */
#undef HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION
-/* Define to 1 if you have the `getaddrinfo' function. */
+/* Define this if you have GDK-Pixbuf-Xlib. */
+#undef HAVE_GDK_PIXBUF_XLIB
+
+/* Define to 1 if you have the 'getaddrinfo' function. */
#undef HAVE_GETADDRINFO
-/* Define to 1 if you have the `getcwd' function. */
+/* Define to 1 if you have the 'getcwd' function. */
#undef HAVE_GETCWD
/* Define this if you have getifaddrs. */
@@ -90,7 +87,7 @@
/* Define this if you have gettimeofday. */
#undef HAVE_GETTIMEOFDAY
-/* Define to 1 if you have the `getwd' function. */
+/* Define to 1 if you have the 'getwd' function. */
#undef HAVE_GETWD
/* Define this if you have OpenGL. */
@@ -117,11 +114,8 @@
/* Define this if OpenGL supports the OpenGL Shading Language. */
#undef HAVE_GLSL
-/* Define this if you have Gtk */
-#undef HAVE_GTK
-
/* Define this if you have Gtk 2.x. */
-#undef HAVE_GTK2
+#undef HAVE_GTK
/* Define this for HPUX so-called "Secure Passwords". */
#undef HAVE_HPUX_PASSWD
@@ -132,6 +126,9 @@
/* Define this if ping uses struct icmphdr.un.echo.id. */
#undef HAVE_ICMPHDR
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
@@ -148,24 +145,18 @@
/* Define this if you have Kerberos 5. */
#undef HAVE_KERBEROS5
-/* Define if your <locale.h> file defines LC_MESSAGES. */
-#undef HAVE_LC_MESSAGES
-
/* Define this if your system has libcap. */
#undef HAVE_LIBCAP
+/* Define this if you have libelogind. */
+#undef HAVE_LIBELOGIND
+
/* Define this if you have the Portable Network Graphics library. */
#undef HAVE_LIBPNG
/* Define this if you have libsystemd. */
#undef HAVE_LIBSYSTEMD
-/* Define to 1 if you have the <locale.h> header file. */
-#undef HAVE_LOCALE_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
/* Using the MIT-SCREEN-SAVER extension means that the X server will crash at
random times, and fading and hysteresis won't work. Don't use this. You'll
be sorry. See comment in xscreensaver.c. */
@@ -174,16 +165,12 @@
/* Define this if you have Motif. */
#undef HAVE_MOTIF
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+/* Define to 1 if you have the <ndir.h> header file, and it defines 'DIR'. */
#undef HAVE_NDIR_H
-/* Define to 1 if you have the `nice' function. */
+/* Define to 1 if you have the 'nice' function. */
#undef HAVE_NICE
-/* Define this if you the XML library headers lack the gnome-xml/libxml
- symlink. */
-#undef HAVE_OLD_XML_HEADERS
-
/* Define this if you have Pluggable Authentication Modules. */
#undef HAVE_PAM
@@ -208,7 +195,7 @@
/* Define to 1 if you have the <pty.h> header file. */
#undef HAVE_PTY_H
-/* Define to 1 if you have the `putenv' function. */
+/* Define to 1 if you have the 'putenv' function. */
#undef HAVE_PUTENV
/* Define this if your system uses getpwnam_shadow. */
@@ -220,28 +207,25 @@
/* Define this if the RANDR library is version 1.2 or newer. */
#undef HAVE_RANDR_12
-/* Define this if you have the SGI XReadDisplay extension. */
-#undef HAVE_READ_DISPLAY_EXTENSION
-
-/* Define to 1 if you have the `realpath' function. */
+/* Define to 1 if you have the 'realpath' function. */
#undef HAVE_REALPATH
/* Define this to enable recording of videos. */
#undef HAVE_RECORD_ANIM
-/* Define to 1 if you have the `sbrk' function. */
+/* Define to 1 if you have the 'sbrk' function. */
#undef HAVE_SBRK
-/* Define to 1 if you have the `select' function. */
+/* Define to 1 if you have the 'select' function. */
#undef HAVE_SELECT
-/* Define to 1 if you have the `setlocale' function. */
+/* Define to 1 if you have the 'setlocale' function. */
#undef HAVE_SETLOCALE
-/* Define to 1 if you have the `setpriority' function. */
+/* Define to 1 if you have the 'setpriority' function. */
#undef HAVE_SETPRIORITY
-/* Define to 1 if you have the `setrlimit' function. */
+/* Define to 1 if you have the 'setrlimit' function. */
#undef HAVE_SETRLIMIT
/* Define this if you have the SGI SCREEN_SAVER extension. */
@@ -253,18 +237,21 @@
/* Define this if your system uses /etc/shadow. */
#undef HAVE_SHADOW_PASSWD
-/* Define to 1 if you have the `sigaction' function. */
+/* Define to 1 if you have the 'sigaction' function. */
#undef HAVE_SIGACTION
/* Define to 1 if you have the `sigtimedwait' function. */
#undef HAVE_SIGTIMEDWAIT
-/* Define to 1 if you have the `sqrtf' function. */
+/* Define to 1 if you have the 'sqrtf' function. */
#undef HAVE_SQRTF
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
@@ -274,17 +261,17 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
-/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
+/* Define to 1 if 'sa_len' is a member of 'struct sockaddr'. */
#undef HAVE_STRUCT_SOCKADDR_SA_LEN
-/* Define to 1 if you have the `syslog' function. */
+/* Define to 1 if you have the 'syslog' function. */
#undef HAVE_SYSLOG
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines 'DIR'.
*/
#undef HAVE_SYS_DIR_H
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines 'DIR'.
*/
#undef HAVE_SYS_NDIR_H
@@ -303,7 +290,7 @@
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
#undef HAVE_SYS_WAIT_H
-/* Define to 1 if you have the `uname' function. */
+/* Define to 1 if you have the 'uname' function. */
#undef HAVE_UNAME
/* Define to 1 if you have the <unistd.h> header file. */
@@ -390,7 +377,9 @@
/* Return type of signal handlers */
#undef RETSIGTYPE
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C89 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
#undef STDC_HEADERS
/* Stare into the void. */
@@ -399,33 +388,25 @@
/* Define to 1 if the X Window System is missing or not being used. */
#undef X_DISPLAY_MISSING
-/* Enable large inode numbers on Mac OS X 10.5. */
-#ifndef _DARWIN_USE_64_BIT_INODE
-# define _DARWIN_USE_64_BIT_INODE 1
-#endif
-
/* Number of bits in a file offset, on hosts where this is settable. */
#undef _FILE_OFFSET_BITS
-/* Define for large files, on AIX-style hosts. */
+/* Define to 1 on platforms where this makes off_t a 64-bit type. */
#undef _LARGE_FILES
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
+/* Number of bits in time_t, on hosts where this is settable. */
+#undef _TIME_BITS
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-#undef inline
-#endif
+/* Define to 1 on platforms where this makes time_t a 64-bit type. */
+#undef __MINGW_USE_VC2005_COMPAT
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define to 'int' if <sys/types.h> does not define. */
#undef mode_t
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define as a signed integer type capable of holding a process identifier. */
#undef pid_t
-/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* Define as 'unsigned int' if <stddef.h> doesn't define. */
#undef size_t
/* Define to `int' if <sys/types.h> or <sys/socket.h> does not define. */
diff --git a/config.rpath b/config.rpath
new file mode 100755
index 0000000..24be79c
--- /dev/null
+++ b/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2020 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
+ wl='-Wl,'
+ ;;
+ nagfor*)
+ wl='-Wl,-Wl,,'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ F* | *Sun*Fortran*)
+ wl=
+ ;;
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ newsos6)
+ ;;
+ *nto* | *qnx*)
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ wl='-Qoption ld '
+ ;;
+ *)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ haiku*)
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd2.[01]*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ *nto* | *qnx*)
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc*)
+ library_names_spec='$libname$shrext' ;;
+ m68k)
+ library_names_spec='$libname.a' ;;
+ esac
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd[23].*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ freebsd* | dragonfly*)
+ library_names_spec='$libname$shrext'
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ haiku*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ *nto* | *qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ tpf*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/configure b/configure
index 4a03e1e..5bba409 100755
--- a/configure
+++ b/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.72.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,62 +15,63 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
+else case e in #(
+ e) case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
+esac ;;
esac
fi
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -77,13 +79,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
}
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -92,44 +87,27 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
;;
esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
+# We did not find ourselves, most probably we were run as 'sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
@@ -149,26 +127,28 @@ case $- in # ((((
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+# out after a failed 'exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in #(
+else case e in #(
+ e) case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
+esac ;;
esac
fi
"
@@ -183,42 +163,55 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
- exitcode=1; echo positional parameters were not saved.
+else case e in #(
+ e) exitcode=1; echo positional parameters were not saved. ;;
+esac
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
- as_have_required=no
+else case e in #(
+ e) as_have_required=no ;;
+esac
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+else case e in #(
+ e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -226,13 +219,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
- if test "x$CONFIG_SHELL" != x; then :
+else case e in #(
+ e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi ;;
+esac
+fi
+
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -249,25 +250,27 @@ case $- in # ((((
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+# out after a failed 'exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
fi
exit 1
-fi
+fi ;;
+esac
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
@@ -319,7 +322,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -328,7 +331,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -366,16 +369,18 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
- as_fn_append ()
+else case e in #(
+ e) as_fn_append ()
{
eval $1=\$$1\$2
- }
+ } ;;
+esac
fi # as_fn_append
# as_fn_arith ARG...
@@ -383,16 +388,18 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
- as_fn_arith ()
+else case e in #(
+ e) as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
- }
+ } ;;
+esac
fi # as_fn_arith
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -405,9 +412,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -434,7 +441,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -466,6 +473,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
/[$]LINENO/=
' <$as_myself |
sed '
+ t clear
+ :clear
s/[$]LINENO.*/&-/
t lineno
b
@@ -477,7 +486,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -491,6 +500,9 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -504,6 +516,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -515,9 +533,9 @@ if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
+ # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.
+ # In both cases, we have to default to 'cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
@@ -542,10 +560,12 @@ as_test_x='test -x'
as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated
# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed '$as_sed_sh'" # deprecated
test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1
@@ -568,56 +588,57 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
ac_unique_file="driver/subprocs.c"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
+gt_needs=
+enable_year2038=no
ac_subst_vars='LTLIBOBJS
LIBOBJS
DEPEND_DEFINES
DEPEND_FLAGS
DEPEND
APPDEFAULTS
+FFMPEG_LIBS
+FFMPEG_CFLAGS
+FFMPEG_OBJS
ANIM_LIBS
ANIM_OBJS
FONT_DIR
@@ -659,6 +680,7 @@ NEW_LOGIN_COMMAND_P
NEW_LOGIN_COMMAND
COMMENT_PAM_CHECK_ACCOUNT
HAVE_PAM_FAIL_DELAY
+GLIB_COMPILE_RESOURCES
INSTALL_PAM
INSTALL_DIRS
SETCAP_HACKS
@@ -688,7 +710,6 @@ PTHREAD_LIBS
PTHREAD_CXX
PTHREAD_CC
ax_pthread_config
-SED
target_os
target_vendor
target_cpu
@@ -696,19 +717,23 @@ target
login_manager_tmp
gnome_url_show_program
gnome_open_program
-MKINSTALLDIRS
+CATALOGS
+localedir_c_make
+localedir_c
POSUB
-POFILES
-PO_IN_DATADIR_FALSE
-PO_IN_DATADIR_TRUE
+LTLIBINTL
+LIBINTL
INTLLIBS
-INSTOBJEXT
-GMOFILES
-DATADIRNAME
-CATOBJEXT
-CATALOGS
-MSGFMT_OPTS
+LTLIBICONV
+LIBICONV
INTL_MACOSX_LIBS
+XGETTEXT_EXTRA_OPTIONS
+MSGMERGE_FOR_MSGFMT_OPTION
+XGETTEXT_015
+GMSGFMT_015
+GETTEXT_MACRO_VERSION
+SED
+MKDIR_P
GETTEXT_PACKAGE
ALL_LINGUAS
GMSGFMT
@@ -752,8 +777,6 @@ X_PRE_LIBS
X_CFLAGS
XMKMF
PERL
-EGREP
-GREP
SET_MAKE
INSTALL_DATA
INSTALL_SCRIPT
@@ -793,6 +816,7 @@ infodir
docdir
oldincludedir
includedir
+runstatedir
localstatedir
sharedstatedir
sysconfdir
@@ -818,6 +842,10 @@ enable_option_checking
enable_largefile
with_x
enable_nls
+with_gnu_ld
+enable_rpath
+with_libiconv_prefix
+with_libintl_prefix
with_app_defaults
with_hackdir
enable_subdir
@@ -832,13 +860,13 @@ with_xf86gamma_ext
with_xidle_ext
with_sgi_ext
with_sgivc_ext
-with_readdisplay
with_xshm_ext
with_xdbe_ext
with_xkb_ext
with_proc_interrupts
with_proc_oom
with_systemd
+with_elogind
enable_locking
enable_root_passwd
with_pam
@@ -863,6 +891,7 @@ with_pixbuf
with_xft
with_setuid_hacks
with_record_animation
+enable_year2038
'
ac_precious_vars='build_alias
host_alias
@@ -911,6 +940,7 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE}'
@@ -940,8 +970,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -982,9 +1010,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1008,9 +1036,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1163,6 +1191,15 @@ do
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1212,9 +1249,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1228,9 +1265,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1258,8 +1295,8 @@ do
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
- -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
+ -*) as_fn_error $? "unrecognized option: '$ac_option'
+Try '$0 --help' for more information"
;;
*=*)
@@ -1267,16 +1304,16 @@ Try \`$0 --help' for more information"
# Reject names that are not valid shell variable names.
case $ac_envvar in #(
'' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ as_fn_error $? "invalid variable name: '$ac_envvar'" ;;
esac
eval $ac_envvar=\$ac_optarg
export $ac_envvar ;;
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1292,7 +1329,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1300,7 +1337,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir
+ libdir localedir mandir runstatedir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
@@ -1317,7 +1354,7 @@ do
as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done
-# There might be people who depend on the old broken behavior: `$host'
+# There might be people who depend on the old broken behavior: '$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
@@ -1354,7 +1391,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1383,7 +1420,7 @@ if test ! -r "$srcdir/$ac_unique_file"; then
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work"
ac_abs_confdir=`(
cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
pwd)`
@@ -1411,7 +1448,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures this package to adapt to many kinds of systems.
+'configure' configures this package to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1425,22 +1462,23 @@ Configuration:
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking ...' messages
+ -q, --quiet, --silent do not print 'checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
+ -C, --config-cache alias for '--cache-file=config.cache'
-n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
+ --srcdir=DIR find the sources in DIR [configure dir or '..']
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
+By default, 'make install' will install all the files in
+'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than '$ac_default_prefix' using '--prefix',
+for instance '--prefix=\$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--libexecdir=DIR program executables [EPREFIX/libexec]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
@@ -1467,6 +1505,8 @@ if test -n "$ac_init_help"; then
cat <<\_ACEOF
+ --enable-year2038 support timestamps after 2038
+
Installation Options:
--prefix=PREFIX Install root of architecture-independent files.
@@ -1482,12 +1522,11 @@ Server Extension Options:
--with-xf86vmode-ext Include support for virtual screens.
--with-xinerama-ext Include support for multiple monitors.
--with-randr-ext Include support for multiple monitors.
- --with-xinput-ext Include support for the XInput2 extension.
+ --with-xinput-ext The XInput2 extension is required.
--with-xf86gamma-ext Include support for XFree86 gamma fading.
--with-xidle-ext Include support for the X11R5 XIDLE extension.
--with-sgi-ext Include support for the SGI SCREEN_SAVER extension.
--with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.
- --with-readdisplay Include support for the SGI XReadDisplay extension.
--with-xshm-ext Include support for the Shared Memory extension.
--with-xdbe-ext Include support for the DOUBLE-BUFFER extension.
--with-xkb-ext Include support for the X Keyboard extension.
@@ -1496,16 +1535,17 @@ Server Extension Options:
--with-proc-oom Include support to duck the out-of-memory killer.
--with-systemd Support systemd requests to lock on suspend, and to
allow video players to inhibit the screen saver.
+ --with-elogind Use elogind instead of systemd.
Screen Locking Options:
--disable-locking Do not allow locking of the display at all.
- --with-pam Include support for PAM (Pluggable Auth Modules).
+ --with-pam Use Pluggable Authentication Modules.
--with-pam-service-name Set the name of the xscreensaver PAM service.
--enable-pam-account Whether PAM should check the result of account
modules when authenticating. Only do this if you
have "account" modules configured on your system.
- --enable-root-passwd Allow the root passwd to unlock, if not using PAM.
+ --enable-root-passwd Allow the root password to unlock, if not using PAM.
--with-kerberos Include support for Kerberos authentication.
--with-shadow Include support for shadow password authentication.
@@ -1521,7 +1561,6 @@ User Interface Options:
Graphics Options:
- --with-gl Build those demos which depend on OpenGL.
--with-gles Emulate OpenGL 1.3 in terms of OpenGL ES 1.x.
--with-glx Use GLX to interface OpenGL and X11 instead of EGL.
--with-gle Include support for the GL Extrusion library.
@@ -1546,7 +1585,7 @@ Some influential environment variables:
CPP C preprocessor
XMKMF Path to xmkmf, Makefile generator for X Window System
-Use these variables to override the choices made by `configure' or to help
+Use these variables to override the choices made by 'configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to the package provider.
@@ -1565,9 +1604,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1595,7 +1634,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1603,7 +1643,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1613,9 +1653,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.72
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2023 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1632,14 +1672,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -rf conftest.$ac_objext
+ rm -rf conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1647,17 +1687,19 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=1
+ ac_retval=1 ;;
+esac
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
@@ -1676,7 +1718,7 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1684,151 +1726,24 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -rf conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
+ ac_retval=1 ;;
esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
-} # ac_fn_c_try_run
+} # ac_fn_c_try_cpp
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
@@ -1837,26 +1752,30 @@ fi
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
- eval "$3=no"
+else case e in #(
+ e) eval "$3=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
@@ -1868,17 +1787,18 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_type ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=no"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof ($2))
return 0;
@@ -1886,12 +1806,13 @@ if (sizeof ($2))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof (($2)))
return 0;
@@ -1899,18 +1820,21 @@ if (sizeof (($2)))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
- eval "$3=yes"
+else case e in #(
+ e) eval "$3=yes" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
@@ -1921,14 +1845,14 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -rf conftest.$ac_objext conftest$ac_exeext
+ rm -rf conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1936,20 +1860,22 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=1
+ ac_retval=1 ;;
+esac
fi
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
@@ -1967,28 +1893,22 @@ fi
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (void); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -1997,7 +1917,7 @@ else
#ifdef __cplusplus
extern "C"
#endif
-char $2 ();
+char $2 (void);
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
@@ -2006,24 +1926,27 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
- eval "$3=no"
+else case e in #(
+ e) eval "$3=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
@@ -2035,16 +1958,17 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_member ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if eval \${$4+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+printf %s "checking for $2.$3... " >&6; }
+if eval test \${$4+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
-main ()
+main (void)
{
static $2 ac_aggr;
if (ac_aggr.$3)
@@ -2053,14 +1977,15 @@ return 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$4=yes"
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
-main ()
+main (void)
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
@@ -2069,29 +1994,97 @@ return 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$4=yes"
-else
- eval "$4=no"
+else case e in #(
+ e) eval "$4=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$4
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_member
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else case e in #(
+ e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status ;;
+esac
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.72. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2124,8 +2117,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2158,7 +2155,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2193,11 +2190,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2208,8 +2207,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2233,7 +2232,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2241,14 +2240,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2256,15 +2255,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2272,8 +2271,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2287,64 +2286,49 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
fi
done
@@ -2352,19 +2336,452 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (char **p, int i)
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* C89 style stringification. */
+#define noexpand_stringify(a) #a
+const char *stringified = noexpand_stringify(arbitrary+token=sequence);
+
+/* C89 style token pasting. Exercises some of the corner cases that
+ e.g. old MSVC gets wrong, but not very hard. */
+#define noexpand_concat(a,b) a##b
+#define expand_concat(a,b) noexpand_concat(a,b)
+extern int vA;
+extern int vbee;
+#define aye A
+#define bee B
+int *pvA = &expand_concat(v,aye);
+int *pvbee = &noexpand_concat(v,bee);
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+/* Does the compiler advertise C99 conformance? */
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+// See if C++-style comments work.
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+extern void free (void *);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+ // Work around memory leak warnings.
+ free (ia);
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+/* Does the compiler advertise C11 conformance? */
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+gt_needs="$gt_needs "
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.rpath install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else case e in #(
+ e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;;
+esac
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2375,12 +2792,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2389,24 +2806,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2416,11 +2833,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2437,6 +2855,11 @@ ac_config_headers="$ac_config_headers config.h"
echo "current directory: `pwd`"
echo "command line was: $0 $@"
+if ! test -z "$ac_unrecognized_opts" ; then
+ echo "" >&2
+ exit 2
+fi
+
###############################################################################
#
# Autoheader stuff
@@ -2479,9 +2902,6 @@ echo "command line was: $0 $@"
# Locking.
#
-#AH_TEMPLATE([PASSWD_HELPER_PROGRAM],
-# [Define this to use a third-party password helper program.])
-
# After checking to see that --srcdir is correct (which AC_INIT does)
# check for some random other files that come later in the tar file,
# to make sure everything is here.
@@ -2609,54 +3029,29 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
# random compiler setup
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_build_alias=$build_alias
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2674,21 +3069,23 @@ build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "x$host_alias" = x; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2707,6 +3104,7 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
ac_original_cc=$CC
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2715,38 +3113,44 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -2754,38 +3158,44 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2793,8 +3203,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2807,38 +3217,44 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -2846,12 +3262,13 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
@@ -2859,15 +3276,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2883,18 +3304,19 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -2904,38 +3326,44 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$CC" && break
@@ -2947,38 +3375,44 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$ac_ct_CC" && break
@@ -2989,33 +3423,138 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi ;;
+esac
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi ;;
+esac
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
+else
+ CC="$ac_cv_prog_CC"
fi
fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -3025,7 +3564,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -rf conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -3033,7 +3572,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3045,9 +3584,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -3068,13 +3607,14 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'.
+# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
@@ -3089,12 +3629,12 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
# We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
+ # safe: cross compilers may not add the suffix if given an '-o'
# argument, so we may need to know it at that point already.
# Even if this section looks crufty: it has the advantage of
# actually working.
@@ -3105,48 +3645,52 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
- ac_file=''
+else case e in #(
+ e) ac_file='' ;;
+esac
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+See 'config.log' for more details" "$LINENO" 5; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; } ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both 'conftest.exe' and 'conftest' are 'present' (well, observable)
+# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will
+# work properly (i.e., refer to 'conftest.exe'), while it won't with
+# 'rm'.
for ac_file in conftest.exe conftest conftest.*; do
test -f "$ac_file" || continue
case $ac_file in
@@ -3156,15 +3700,16 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; } ;;
+esac
fi
rm -rf conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -rf conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -3173,9 +3718,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
+ if (!f)
+ return 1;
return ferror (f) || fclose (f) != 0;
;
@@ -3185,8 +3732,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -3194,10 +3741,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -3205,39 +3752,41 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use '--host'.
+See 'config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
-rm -rf conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+rm -rf conftest.$ac_ext conftest$ac_cv_exeext \
+ conftest.o conftest.obj conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3251,11 +3800,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -3264,31 +3814,34 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; } ;;
+esac
fi
-rm -rf conftest.$ac_cv_objext conftest.$ac_ext
+rm -rf conftest.$ac_cv_objext conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3298,30 +3851,36 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
+else case e in #(
+ e) ac_compiler_gnu=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
CFLAGS="-g"
@@ -3329,57 +3888,63 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
+else case e in #(
+ e) CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
+else case e in #(
+ e) ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3394,94 +3959,153 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -rf conftest.$ac_ext
+CC=$ac_save_CC ;;
+esac
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11" ;;
+esac
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11 ;;
+esac
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -rf conftest.$ac_ext
+CC=$ac_save_CC ;;
+esac
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99" ;;
+esac
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99 ;;
+esac
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -rf conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
+fi
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89" ;;
+esac
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89 ;;
esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
+fi
fi
ac_ext=c
@@ -3492,35 +4116,25 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -z "$GCC"; then
# not using GCC
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to request ANSI compilation" >&5
-$as_echo_n "checking how to request ANSI compilation... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for extra compiler flags" >&5
+printf %s "checking for extra compiler flags... " >&6; }
case "$host" in
- *-hpux* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: HPUX: adding -Ae" >&5
-$as_echo "HPUX: adding -Ae" >&6; }
- CC="$CC -Ae"
- ;;
*-aix* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: AIX: adding -qlanglvl=ansi -qhalt=e" >&5
-$as_echo "AIX: adding -qlanglvl=ansi -qhalt=e" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: AIX: adding -qhalt=e" >&5
+printf "%s\n" "AIX: adding -qhalt=e" >&6; }
CC="$CC -qlanglvl=ansi -qhalt=e"
;;
- *-dec-* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: DEC: adding -std1 -ieee" >&5
-$as_echo "DEC: adding -std1 -ieee" >&6; }
- CC="$CC -std1"
- ;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no idea" >&5
-$as_echo "no idea" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
;;
esac
else
# using GCC
case "$host" in
*-solaris*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Solaris: adding -D__EXTENSIONS__" >&5
-$as_echo "Solaris: adding -D__EXTENSIONS__" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Solaris: adding -D__EXTENSIONS__" >&5
+printf "%s\n" "Solaris: adding -D__EXTENSIONS__" >&6; }
CC="$CC -D__EXTENSIONS__"
;;
esac
@@ -3531,226 +4145,243 @@ $as_echo "Solaris: adding -D__EXTENSIONS__" >&6; }
# extensions (such as allowing C++ style "//" comments in C code, and
# declarations after statements) were not supported by non-gcc compilers
# for many years, so we continued to use "-std=c89" to prevent those
- # GNU-isms from sneaking in to the code. Well, these days various
- # vendors have sloppily allowed non-ANSI syntax to slip into their
- # library header files. GTK and OpenGL have been major offenders in this
- # way. So... as of 2021, I guess we are forced to use "-std=gnu89", to
- # allow those extensions, and hope that the warnings generated by
- # "-pedantic" are heeded.
+ # GNU-isms from sneaking in to the code.
+ #
+ # These days XScreenSaver uses C99, which supports "//" comments and
+ # declarations after statements.
#
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=gnu89" >&5
-$as_echo_n "checking whether gcc accepts -std=gnu89... " >&6; }
-if ${ac_cv_gcc_accepts_gnu89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=gnu99" >&5
+printf %s "checking whether gcc accepts -std=gnu99... " >&6; }
+if test ${ac_cv_gcc_accepts_gnu99+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -std=gnu89 conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -std=gnu99 | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_gnu89=no
+ ac_cv_gcc_accepts_gnu99=no
else
- ac_cv_gcc_accepts_gnu89=yes
- CC="$CC -std=gnu89"
- fi
+ ac_cv_gcc_accepts_gnu99=yes
+ CC="$CC -std=gnu99"
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_gnu89" >&5
-$as_echo "$ac_cv_gcc_accepts_gnu89" >&6; }
- ac_gcc_accepts_gnu89="$ac_cv_gcc_accepts_gnu89"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_gnu99" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_gnu99" >&6; }
+ ac_gcc_accepts_gnu99="$ac_cv_gcc_accepts_gnu99"
fi
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -pedantic" >&5
-$as_echo_n "checking whether gcc accepts -pedantic... " >&6; }
-if ${ac_cv_gcc_accepts_pedantic+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -pedantic" >&5
+printf %s "checking whether gcc accepts -pedantic... " >&6; }
+if test ${ac_cv_gcc_accepts_pedantic+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -pedantic conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -pedantic | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_pedantic=no
else
ac_cv_gcc_accepts_pedantic=yes
CC="$CC -pedantic"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_pedantic" >&5
-$as_echo "$ac_cv_gcc_accepts_pedantic" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_pedantic" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_pedantic" >&6; }
ac_gcc_accepts_pedantic="$ac_cv_gcc_accepts_pedantic"
fi
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wall" >&5
-$as_echo_n "checking whether gcc accepts -Wall... " >&6; }
-if ${ac_cv_gcc_accepts_Wall+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wall" >&5
+printf %s "checking whether gcc accepts -Wall... " >&6; }
+if test ${ac_cv_gcc_accepts_Wall+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -Wall conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -Wall | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_Wall=no
else
ac_cv_gcc_accepts_Wall=yes
CC="$CC -Wall"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_Wall" >&5
-$as_echo "$ac_cv_gcc_accepts_Wall" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_Wall" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_Wall" >&6; }
ac_gcc_accepts_Wall="$ac_cv_gcc_accepts_Wall"
fi
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wnested-externs" >&5
-$as_echo_n "checking whether gcc accepts -Wnested-externs... " >&6; }
-if ${ac_cv_gcc_accepts_wnested_externs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wnested-externs" >&5
+printf %s "checking whether gcc accepts -Wnested-externs... " >&6; }
+if test ${ac_cv_gcc_accepts_wnested_externs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -Wnested-externs conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -Wnested-externs | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_wnested_externs=no
else
ac_cv_gcc_accepts_wnested_externs=yes
CC="$CC -Wnested-externs"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wnested_externs" >&5
-$as_echo "$ac_cv_gcc_accepts_wnested_externs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wnested_externs" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_wnested_externs" >&6; }
ac_gcc_accepts_wnested_externs="$ac_cv_gcc_accepts_wnested_externs"
fi
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wstrict-prototypes" >&5
-$as_echo_n "checking whether gcc accepts -Wstrict-prototypes... " >&6; }
-if ${ac_cv_gcc_accepts_wstrict_prototypes+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wstrict-prototypes" >&5
+printf %s "checking whether gcc accepts -Wstrict-prototypes... " >&6; }
+if test ${ac_cv_gcc_accepts_wstrict_prototypes+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -Wstrict-prototypes conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -Wstrict-prototypes | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_wstrict_prototypes=no
else
ac_cv_gcc_accepts_wstrict_prototypes=yes
CC="$CC -Wstrict-prototypes"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wstrict_prototypes" >&5
-$as_echo "$ac_cv_gcc_accepts_wstrict_prototypes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wstrict_prototypes" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_wstrict_prototypes" >&6; }
ac_gcc_accepts_wstrict_prototypes="$ac_cv_gcc_accepts_wstrict_prototypes"
fi
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-prototypes" >&5
-$as_echo_n "checking whether gcc accepts -Wmissing-prototypes... " >&6; }
-if ${ac_cv_gcc_accepts_wmissing_prototypes+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-prototypes" >&5
+printf %s "checking whether gcc accepts -Wmissing-prototypes... " >&6; }
+if test ${ac_cv_gcc_accepts_wmissing_prototypes+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -Wmissing-prototypes conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -Wmissing-prototypes | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_wmissing_prototypes=no
else
ac_cv_gcc_accepts_wmissing_prototypes=yes
CC="$CC -Wmissing-prototypes"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wmissing_prototypes" >&5
-$as_echo "$ac_cv_gcc_accepts_wmissing_prototypes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wmissing_prototypes" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_wmissing_prototypes" >&6; }
ac_gcc_accepts_wmissing_prototypes="$ac_cv_gcc_accepts_wmissing_prototypes"
fi
- if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wdeclaration-after-statement" >&5
-$as_echo_n "checking whether gcc accepts -Wdeclaration-after-statement... " >&6; }
-if ${ac_cv_gcc_accepts_declaration_after+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
- touch conftest.$ac_ext
- if ( ( gcc -c -Wdeclaration-after-statement conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
- grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_declaration_after=no
- else
- ac_cv_gcc_accepts_declaration_after=yes
- CC="$CC -Wdeclaration-after-statement"
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_declaration_after" >&5
-$as_echo "$ac_cv_gcc_accepts_declaration_after" >&6; }
- ac_gcc_accepts_declaration_after="$ac_cv_gcc_accepts_declaration_after"
- fi
-
# "string length is greater than ISO C89 compilers required to support"
if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5
-$as_echo_n "checking whether gcc accepts -Wno-overlength-strings... " >&6; }
-if ${ac_cv_gcc_accepts_no_overlength_strings+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5
+printf %s "checking whether gcc accepts -Wno-overlength-strings... " >&6; }
+if test ${ac_cv_gcc_accepts_no_overlength_strings+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c -Wno-overlength-strings conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo -Wno-overlength-strings | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_no_overlength_strings=no
else
ac_cv_gcc_accepts_no_overlength_strings=yes
CC="$CC -Wno-overlength-strings"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength_strings" >&5
-$as_echo "$ac_cv_gcc_accepts_no_overlength_strings" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength_strings" >&5
+printf "%s\n" "$ac_cv_gcc_accepts_no_overlength_strings" >&6; }
ac_gcc_accepts_no_overlength_strings="$ac_cv_gcc_accepts_no_overlength_strings"
fi
- # Ignore warnings about using "inline"
- if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-language-extension-token" >&5
-$as_echo_n "checking whether gcc accepts -Wno-language-extension-token... " >&6; }
-if ${ac_cv_gcc_accepts_no_language_ext_token+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
- touch conftest.$ac_ext
- if ( ( gcc -c -Wno-language-extension-token conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
- grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_no_language_ext_token=no
- else
- ac_cv_gcc_accepts_no_language_ext_token=yes
- CC="$CC -Wno-language-extension-token"
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_language_ext_token" >&5
-$as_echo "$ac_cv_gcc_accepts_no_language_ext_token" >&6; }
- ac_gcc_accepts_no_language_ext_token="$ac_cv_gcc_accepts_no_language_ext_token"
- fi
-
- # Xlib headers use named variadic macros.
- if test -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-variadic-macros" >&5
-$as_echo_n "checking whether gcc accepts -Wno-variadic-macros... " >&6; }
-if ${ac_cv_gcc_accepts_no_variadic_macros+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -rf conftest.$ac_ext
- touch conftest.$ac_ext
- if ( ( gcc -c -Wno-variadic-macros conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
- grep unrecognized >/dev/null ); then
- ac_cv_gcc_accepts_no_variadic_macros=no
- else
- ac_cv_gcc_accepts_no_variadic_macros=yes
- CC="$CC -Wno-variadic-macros"
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_variadic_macros" >&5
-$as_echo "$ac_cv_gcc_accepts_no_variadic_macros" >&6; }
- ac_gcc_accepts_no_variadic_macros="$ac_cv_gcc_accepts_no_variadic_macros"
- fi
-
fi
ac_ext=c
@@ -3758,42 +4389,39 @@ ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
do
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
-else
- # Broken: fails on valid input.
-continue
+else case e in #(
+ e) # Broken: fails on valid input.
+continue ;;
+esac
fi
rm -rf conftest.err conftest.i conftest.$ac_ext
@@ -3803,56 +4431,56 @@ rm -rf conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
- # Passes both tests.
+else case e in #(
+ e) # Passes both tests.
ac_preproc_ok=:
-break
+break ;;
+esac
fi
rm -rf conftest.err conftest.i conftest.$ac_ext
done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -rf conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
break
fi
done
ac_cv_prog_CPP=$CPP
-
+ ;;
+esac
fi
CPP=$ac_cv_prog_CPP
else
ac_cv_prog_CPP=$CPP
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
-else
- # Broken: fails on valid input.
-continue
+else case e in #(
+ e) # Broken: fails on valid input.
+continue ;;
+esac
fi
rm -rf conftest.err conftest.i conftest.$ac_ext
@@ -3862,26 +4490,30 @@ rm -rf conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
- # Passes both tests.
+else case e in #(
+ e) # Passes both tests.
ac_preproc_ok=:
-break
+break ;;
+esac
fi
rm -rf conftest.err conftest.i conftest.$ac_ext
done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -rf conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; } ;;
+esac
fi
ac_ext=c
@@ -3890,131 +4522,9 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if ${ac_cv_c_const+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
-#ifndef __cplusplus
- /* Ultrix mips cc rejects this sort of thing. */
- typedef int charset[2];
- const charset cs = { 0, 0 };
- /* SunOS 4.1.1 cc rejects this. */
- char const *const *pcpcc;
- char **ppc;
- /* NEC SVR4.0.2 mips cc rejects this. */
- struct point {int x, y;};
- static struct point const zero = {0,0};
- /* AIX XL C 1.02.0.0 rejects this.
- It does not let you subtract one const X* pointer from another in
- an arm of an if-expression whose if-part is not a constant
- expression */
- const char *g = "string";
- pcpcc = &g + (g ? g-g : 0);
- /* HPUX 7.0 cc rejects these. */
- ++pcpcc;
- ppc = (char**) pcpcc;
- pcpcc = (char const *const *) ppc;
- { /* SCO 3.2v4 cc rejects this sort of thing. */
- char tx;
- char *t = &tx;
- char const *s = 0 ? (char *) 0 : (char const *) 0;
-
- *t++ = 0;
- if (s) return 0;
- }
- { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
- int x[] = {25, 17};
- const int *foo = &x[0];
- ++foo;
- }
- { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
- typedef const int *iptr;
- iptr p = 0;
- ++p;
- }
- { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
- "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
- struct s { int j; const int *ap[3]; } bx;
- struct s *b = &bx; b->j = 5;
- }
- { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
- const int foo = 10;
- if (!foo) return 0;
- }
- return !cs[0] && !zero.x;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_c_const=yes
-else
- ac_cv_c_const=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
-if test $ac_cv_c_const = no; then
-
-$as_echo "#define const /**/" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
-$as_echo_n "checking for inline... " >&6; }
-if ${ac_cv_c_inline+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_c_inline=no
-for ac_kw in inline __inline__ __inline; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifndef __cplusplus
-typedef int foo_t;
-static $ac_kw foo_t static_foo () {return 0; }
-$ac_kw foo_t foo () {return 0; }
-#endif
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_c_inline=$ac_kw
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- test "$ac_cv_c_inline" != no && break
-done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
-$as_echo "$ac_cv_c_inline" >&6; }
-
-case $ac_cv_c_inline in
- inline | yes) ;;
- *)
- case $ac_cv_c_inline in
- no) ac_val=;;
- *) ac_val=$ac_cv_c_inline;;
- esac
- cat >>confdefs.h <<_ACEOF
-#ifndef __cplusplus
-#define inline $ac_val
-#endif
-_ACEOF
- ;;
-esac
-
# stuff for Makefiles
-# Find a good install program. We prefer a C program (faster),
+
+ # Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
@@ -4028,20 +4538,25 @@ esac
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
- ./ | .// | /[cC]/* | \
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
/etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
/usr/ucb/* ) ;;
@@ -4051,13 +4566,13 @@ case $as_dir/ in #((
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# program-specific install script used by HP pwplus--don't use.
:
else
@@ -4065,12 +4580,12 @@ case $as_dir/ in #((
echo one > conftest.one
echo two > conftest.two
mkdir conftest.dir
- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
test -s conftest.one && test -s conftest.two &&
test -s conftest.dir/conftest.one &&
test -s conftest.dir/conftest.two
then
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
break 3
fi
fi
@@ -4084,9 +4599,10 @@ esac
IFS=$as_save_IFS
rm -rf conftest.one conftest.two conftest.dir
-
+ ;;
+esac
fi
- if test "${ac_cv_path_install+set}" = set; then
+ if test ${ac_cv_path_install+y}; then
INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. Don't cache a
@@ -4096,8 +4612,8 @@ fi
INSTALL=$ac_install_sh
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
@@ -4107,12 +4623,13 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
-$as_echo_n "checking whether \"\${INSTALL} -d\" creates intermediate directories... " >&6; }
-if ${ac_cv_install_d_creates_dirs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_install_d_creates_dirs=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
+printf %s "checking whether \"\${INSTALL} -d\" creates intermediate directories... " >&6; }
+if test ${ac_cv_install_d_creates_dirs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_install_d_creates_dirs=no
rm -rf conftestdir
if mkdir conftestdir; then
cd conftestdir 2>/dev/null
@@ -4123,18 +4640,20 @@ else
cd .. 2>/dev/null
rm -rf conftestdir
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_install_d_creates_dirs" >&5
-$as_echo "$ac_cv_install_d_creates_dirs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_install_d_creates_dirs" >&5
+printf "%s\n" "$ac_cv_install_d_creates_dirs" >&6; }
if test "$ac_cv_install_d_creates_dirs" = no ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \"mkdir -p\" creates intermediate directories" >&5
-$as_echo_n "checking whether \"mkdir -p\" creates intermediate directories... " >&6; }
-if ${ac_cv_mkdir_p_creates_dirs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_mkdir_p_creates_dirs=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \"mkdir -p\" creates intermediate directories" >&5
+printf %s "checking whether \"mkdir -p\" creates intermediate directories... " >&6; }
+if test ${ac_cv_mkdir_p_creates_dirs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_mkdir_p_creates_dirs=no
rm -rf conftestdir
if mkdir conftestdir; then
cd conftestdir 2>/dev/null
@@ -4145,10 +4664,11 @@ else
cd .. 2>/dev/null
rm -rf conftestdir
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mkdir_p_creates_dirs" >&5
-$as_echo "$ac_cv_mkdir_p_creates_dirs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mkdir_p_creates_dirs" >&5
+printf "%s\n" "$ac_cv_mkdir_p_creates_dirs" >&6; }
fi
if test "$ac_cv_install_d_creates_dirs" = yes ; then
@@ -4160,14 +4680,15 @@ $as_echo "$ac_cv_mkdir_p_creates_dirs" >&6; }
INSTALL_DIRS='${INSTALL} -d'
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat >conftest.make <<\_ACEOF
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
@echo '@@@%%%=$(MAKE)=@@@%%%'
@@ -4179,15 +4700,16 @@ case `${MAKE-make} -f conftest.make 2>/dev/null` in
*)
eval ac_cv_prog_make_${ac_make}_set=no;;
esac
-rm -rf conftest.make
+rm -rf conftest.make ;;
+esac
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
SET_MAKE=
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
SET_MAKE="MAKE=${MAKE-make}"
fi
@@ -4200,318 +4722,109 @@ INSTALL_SCRIPT='${INSTALL}'
# random libc stuff
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
fi
-else
- ac_cv_path_GREP=$GREP
-fi
+done
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
fi
+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
- fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
+ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_inttypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes
+then :
-else
- ac_cv_header_stdc=no
+else case e in #(
+ e)
+printf "%s\n" "#define mode_t int" >>confdefs.h
+ ;;
+esac
fi
-rm -rf conftest*
-fi
+ ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
+"
+if test "x$ac_cv_type_pid_t" = xyes
+then :
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -rf conftest*
-
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
+ #if defined _WIN64 && !defined __CYGWIN__
+ LLP64
+ #endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
-main ()
+main (void)
{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
+
+ ;
return 0;
}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-for ac_header in unistd.h inttypes.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
-if test "x$ac_cv_type_mode_t" = xyes; then :
-else
-
-cat >>confdefs.h <<_ACEOF
-#define mode_t int
_ACEOF
-
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_pid_type='int'
+else case e in #(
+ e) ac_pid_type='__int64' ;;
+esac
fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
-if test "x$ac_cv_type_pid_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define pid_t int
-_ACEOF
+printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
+if test "x$ac_cv_type_size_t" = xyes
+then :
+else case e in #(
+ e)
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
+ ;;
+esac
fi
-cat >>confdefs.h <<_ACEOF
-#define RETSIGTYPE void
-_ACEOF
+printf "%s\n" "#define RETSIGTYPE void" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
-$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
-if ${ac_cv_header_sys_wait_h+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+printf %s "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if test ${ac_cv_header_sys_wait_h+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
#include <sys/wait.h>
@@ -4523,7 +4836,7 @@ else
#endif
int
-main ()
+main (void)
{
int s;
wait (&s);
@@ -4532,36 +4845,40 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_header_sys_wait_h=yes
-else
- ac_cv_header_sys_wait_h=no
+else case e in #(
+ e) ac_cv_header_sys_wait_h=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
-$as_echo "$ac_cv_header_sys_wait_h" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+printf "%s\n" "$ac_cv_header_sys_wait_h" >&6; }
if test $ac_cv_header_sys_wait_h = yes; then
-$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
fi
ac_header_dirent=no
for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
- as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
-$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
-if eval \${$as_ac_Header+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+printf %s "checking for $ac_hdr that defines DIR... " >&6; }
+if eval test \${$as_ac_Header+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
#include <$ac_hdr>
int
-main ()
+main (void)
{
if ((DIR *) 0)
return 0;
@@ -4569,19 +4886,23 @@ return 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_ac_Header=yes"
-else
- eval "$as_ac_Header=no"
+else case e in #(
+ e) eval "$as_ac_Header=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$as_ac_Header
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+#define `printf "%s\n" "HAVE_$ac_hdr" | sed "$as_sed_cpp"` 1
_ACEOF
ac_header_dirent=$ac_hdr; break
@@ -4590,132 +4911,155 @@ fi
done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
-$as_echo_n "checking for library containing opendir... " >&6; }
-if ${ac_cv_search_opendir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+printf %s "checking for library containing opendir... " >&6; }
+if test ${ac_cv_search_opendir+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char opendir ();
+char opendir (void);
int
-main ()
+main (void)
{
return opendir ();
;
return 0;
}
_ACEOF
-for ac_lib in '' dir; do
+for ac_lib in '' dir
+do
if test -z "$ac_lib"; then
ac_res="none required"
else
ac_res=-l$ac_lib
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
fi
- if ac_fn_c_try_link "$LINENO"; then :
+ if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_search_opendir=$ac_res
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext
- if ${ac_cv_search_opendir+:} false; then :
+ if test ${ac_cv_search_opendir+y}
+then :
break
fi
done
-if ${ac_cv_search_opendir+:} false; then :
+if test ${ac_cv_search_opendir+y}
+then :
-else
- ac_cv_search_opendir=no
+else case e in #(
+ e) ac_cv_search_opendir=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
-$as_echo "$ac_cv_search_opendir" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+printf "%s\n" "$ac_cv_search_opendir" >&6; }
ac_res=$ac_cv_search_opendir
-if test "$ac_res" != no; then :
+if test "$ac_res" != no
+then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
-$as_echo_n "checking for library containing opendir... " >&6; }
-if ${ac_cv_search_opendir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+printf %s "checking for library containing opendir... " >&6; }
+if test ${ac_cv_search_opendir+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char opendir ();
+char opendir (void);
int
-main ()
+main (void)
{
return opendir ();
;
return 0;
}
_ACEOF
-for ac_lib in '' x; do
+for ac_lib in '' x
+do
if test -z "$ac_lib"; then
ac_res="none required"
else
ac_res=-l$ac_lib
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
fi
- if ac_fn_c_try_link "$LINENO"; then :
+ if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_search_opendir=$ac_res
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext
- if ${ac_cv_search_opendir+:} false; then :
+ if test ${ac_cv_search_opendir+y}
+then :
break
fi
done
-if ${ac_cv_search_opendir+:} false; then :
+if test ${ac_cv_search_opendir+y}
+then :
-else
- ac_cv_search_opendir=no
+else case e in #(
+ e) ac_cv_search_opendir=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
-$as_echo "$ac_cv_search_opendir" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+printf "%s\n" "$ac_cv_search_opendir" >&6; }
ac_res=$ac_cv_search_opendir
-if test "$ac_res" != no; then :
+if test "$ac_res" != no
+then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to call gettimeofday" >&5
-$as_echo_n "checking how to call gettimeofday... " >&6; }
- if ${ac_cv_gettimeofday_args+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to call gettimeofday" >&5
+printf %s "checking how to call gettimeofday... " >&6; }
+ if test ${ac_cv_gettimeofday_args+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include <sys/time.h>
int
-main ()
+main (void)
{
struct timeval tv; struct timezone tzp;
gettimeofday(&tv, &tzp);
@@ -4723,295 +5067,327 @@ struct timeval tv; struct timezone tzp;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_gettimeofday_args=2
-else
- ac_gettimeofday_args=1
+else case e in #(
+ e) ac_gettimeofday_args=1 ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cv_gettimeofday_args=$ac_gettimeofday_args
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cv_gettimeofday_args=$ac_gettimeofday_args ;;
+esac
fi
ac_gettimeofday_args=$ac_cv_gettimeofday_args
if test "$ac_gettimeofday_args" = 1 ; then
- $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: one argument" >&5
-$as_echo "one argument" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: one argument" >&5
+printf "%s\n" "one argument" >&6; }
elif test "$ac_gettimeofday_args" = 2 ; then
- $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
- $as_echo "#define GETTIMEOFDAY_TWO_ARGS 1" >>confdefs.h
+ printf "%s\n" "#define GETTIMEOFDAY_TWO_ARGS 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: two arguments" >&5
-$as_echo "two arguments" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: two arguments" >&5
+printf "%s\n" "two arguments" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
+printf "%s\n" "unknown" >&6; }
fi
# Check whether --enable-largefile was given.
-if test "${enable_largefile+set}" = set; then :
+if test ${enable_largefile+y}
+then :
enableval=$enable_largefile;
fi
-
-if test "$enable_largefile" != no; then
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
-$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
-if ${ac_cv_sys_largefile_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_sys_largefile_CC=no
- if test "$GCC" != yes; then
- ac_save_CC=$CC
- while :; do
- # IRIX 6.2 and later do not support large files by default,
- # so use the C compiler's -n32 option if that helps.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+if test "$enable_largefile,$enable_year2038" != no,no
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5
+printf %s "checking for $CC option to enable large file support... " >&6; }
+if test ${ac_cv_sys_largefile_opts+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_save_CC="$CC"
+ ac_opt_found=no
+ for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do
+ if test x"$ac_opt" != x"none needed"
+then :
+ CC="$ac_save_CC $ac_opt"
+fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
+#ifndef FTYPE
+# define FTYPE off_t
+#endif
+ /* Check that FTYPE can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_FTYPE to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
+#define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31))
+ int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721
+ && LARGE_FTYPE % 2147483647 == 1)
? 1 : -1];
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
- if ac_fn_c_try_compile "$LINENO"; then :
- break
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test x"$ac_opt" = x"none needed"
+then :
+ # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t.
+ CC="$CC -DFTYPE=ino_t"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+
+else case e in #(
+ e) CC="$CC -D_FILE_OFFSET_BITS=64"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_opt='-D_FILE_OFFSET_BITS=64'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext
- CC="$CC -n32"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_sys_largefile_CC=' -n32'; break
+rm -f core conftest.err conftest.$ac_objext conftest.beam
fi
-rm -f core conftest.err conftest.$ac_objext
- break
- done
- CC=$ac_save_CC
- rm -rf conftest.$ac_ext
- fi
+ ac_cv_sys_largefile_opts=$ac_opt
+ ac_opt_found=yes
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
-$as_echo "$ac_cv_sys_largefile_CC" >&6; }
- if test "$ac_cv_sys_largefile_CC" != no; then
- CC=$CC$ac_cv_sys_largefile_CC
- fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test $ac_opt_found = no || break
+ done
+ CC="$ac_save_CC"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
-if ${ac_cv_sys_file_offset_bits+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-int
-main ()
-{
+ test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5
+printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; }
+
+ac_have_largefile=yes
+case $ac_cv_sys_largefile_opts in #(
+ "none needed") :
+ ;; #(
+ "supported through gnulib") :
+ ;; #(
+ "support not detected") :
+ ac_have_largefile=no ;; #(
+ "-D_FILE_OFFSET_BITS=64") :
+
+printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h
+ ;; #(
+ "-D_LARGE_FILES=1") :
+
+printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h
+ ;; #(
+ "-n32") :
+ CC="$CC -n32" ;; #(
+ *) :
+ as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;;
+esac
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_sys_file_offset_bits=no; break
+if test "$enable_year2038" != no
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5
+printf %s "checking for $CC option for timestamps after 2038... " >&6; }
+if test ${ac_cv_sys_year2038_opts+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_opt_found=no
+ for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do
+ if test x"$ac_opt" != x"none needed"
+then :
+ CPPFLAGS="$ac_save_CPPFLAGS $ac_opt"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#define _FILE_OFFSET_BITS 64
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
+
+ #include <time.h>
+ /* Check that time_t can represent 2**32 - 1 correctly. */
+ #define LARGE_TIME_T \\
+ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
+ int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
+ && LARGE_TIME_T % 65537 == 0)
+ ? 1 : -1];
+
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_sys_file_offset_bits=64; break
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_sys_year2038_opts="$ac_opt"
+ ac_opt_found=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cv_sys_file_offset_bits=unknown
- break
-done
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test $ac_opt_found = no || break
+ done
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
-$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
-case $ac_cv_sys_file_offset_bits in #(
- no | unknown) ;;
- *)
-cat >>confdefs.h <<_ACEOF
-#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
-_ACEOF
-;;
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5
+printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; }
+
+ac_have_year2038=yes
+case $ac_cv_sys_year2038_opts in #(
+ "none needed") :
+ ;; #(
+ "support not detected") :
+ ac_have_year2038=no ;; #(
+ "-D_TIME_BITS=64") :
+
+printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h
+ ;; #(
+ "-D__MINGW_USE_VC2005_COMPAT") :
+
+printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h
+ ;; #(
+ "-U_USE_32_BIT_TIME_T"*) :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error $? "the 'time_t' type is currently forced to be 32-bit. It
+will stop working after mid-January 2038. Remove
+_USE_32BIT_TIME_T from the compiler flags.
+See 'config.log' for more details" "$LINENO" 5; } ;; #(
+ *) :
+ as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;;
esac
-rm -rf conftest*
- if test $ac_cv_sys_file_offset_bits = unknown; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
-$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
-if ${ac_cv_sys_large_files+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-int
-main ()
-{
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_sys_large_files=no; break
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#define _LARGE_FILES 1
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-int
-main ()
-{
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_sys_large_files=1; break
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cv_sys_large_files=unknown
- break
-done
+ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select"
+if test "x$ac_cv_func_select" = xyes
+then :
+ printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h
+
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
-$as_echo "$ac_cv_sys_large_files" >&6; }
-case $ac_cv_sys_large_files in #(
- no | unknown) ;;
- *)
-cat >>confdefs.h <<_ACEOF
-#define _LARGE_FILES $ac_cv_sys_large_files
-_ACEOF
-;;
-esac
-rm -rf conftest*
- fi
+ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl"
+if test "x$ac_cv_func_fcntl" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h
fi
+ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname"
+if test "x$ac_cv_func_uname" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNAME 1" >>confdefs.h
-for ac_func in select fcntl uname nice setpriority getcwd getwd putenv sbrk
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+fi
+ac_fn_c_check_func "$LINENO" "nice" "ac_cv_func_nice"
+if test "x$ac_cv_func_nice" = xyes
+then :
+ printf "%s\n" "#define HAVE_NICE 1" >>confdefs.h
fi
-done
+ac_fn_c_check_func "$LINENO" "setpriority" "ac_cv_func_setpriority"
+if test "x$ac_cv_func_setpriority" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETPRIORITY 1" >>confdefs.h
-for ac_func in sigaction syslog realpath setrlimit
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+fi
+ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
+if test "x$ac_cv_func_getcwd" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h
fi
-done
+ac_fn_c_check_func "$LINENO" "getwd" "ac_cv_func_getwd"
+if test "x$ac_cv_func_getwd" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETWD 1" >>confdefs.h
-for ac_func in setlocale sqrtf
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+fi
+ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv"
+if test "x$ac_cv_func_putenv" = xyes
+then :
+ printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h
fi
-done
+ac_fn_c_check_func "$LINENO" "sbrk" "ac_cv_func_sbrk"
+if test "x$ac_cv_func_sbrk" = xyes
+then :
+ printf "%s\n" "#define HAVE_SBRK 1" >>confdefs.h
-for ac_func in getaddrinfo
-do :
- ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
-if test "x$ac_cv_func_getaddrinfo" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GETADDRINFO 1
-_ACEOF
+fi
+
+ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction"
+if test "x$ac_cv_func_sigaction" = xyes
+then :
+ printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog"
+if test "x$ac_cv_func_syslog" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYSLOG 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath"
+if test "x$ac_cv_func_realpath" = xyes
+then :
+ printf "%s\n" "#define HAVE_REALPATH 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setrlimit" "ac_cv_func_setrlimit"
+if test "x$ac_cv_func_setrlimit" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETRLIMIT 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
+if test "x$ac_cv_func_setlocale" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
+if test "x$ac_cv_func_sqrtf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SQRTF 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
+if test "x$ac_cv_func_getaddrinfo" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETADDRINFO 1" >>confdefs.h
fi
-done
ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include <sys/socket.h>
"
-if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :
+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
-_ACEOF
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_SA_LEN 1" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct icmp" >&5
-$as_echo_n "checking for struct icmp... " >&6; }
-if ${ac_cv_have_icmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct icmp" >&5
+printf %s "checking for struct icmp... " >&6; }
+if test ${ac_cv_have_icmp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include <stdio.h>
@@ -5033,7 +5409,7 @@ else
#include <arpa/inet.h>
#include <netdb.h>
int
-main ()
+main (void)
{
struct icmp i;
struct sockaddr s;
@@ -5055,25 +5431,29 @@ struct icmp i;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_have_icmp=yes
-else
- ac_cv_have_icmp=no
+else case e in #(
+ e) ac_cv_have_icmp=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_icmp" >&5
-$as_echo "$ac_cv_have_icmp" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_icmp" >&5
+printf "%s\n" "$ac_cv_have_icmp" >&6; }
if test "$ac_cv_have_icmp" = yes ; then
- $as_echo "#define HAVE_ICMP 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_ICMP 1" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct icmphdr" >&5
-$as_echo_n "checking for struct icmphdr... " >&6; }
-if ${ac_cv_have_icmphdr+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct icmphdr" >&5
+printf %s "checking for struct icmphdr... " >&6; }
+if test ${ac_cv_have_icmphdr+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include <stdio.h>
@@ -5095,7 +5475,7 @@ else
#include <arpa/inet.h>
#include <netdb.h>
int
-main ()
+main (void)
{
struct icmphdr i;
struct sockaddr s;
@@ -5112,32 +5492,36 @@ struct icmphdr i;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_have_icmphdr=yes
-else
- ac_cv_have_icmphdr=no
+else case e in #(
+ e) ac_cv_have_icmphdr=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_icmphdr" >&5
-$as_echo "$ac_cv_have_icmphdr" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_icmphdr" >&5
+printf "%s\n" "$ac_cv_have_icmphdr" >&6; }
if test "$ac_cv_have_icmphdr" = yes ; then
- $as_echo "#define HAVE_ICMPHDR 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_ICMPHDR 1" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getifaddrs" >&5
-$as_echo_n "checking for getifaddrs... " >&6; }
-if ${ac_cv_have_getifaddrs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getifaddrs" >&5
+printf %s "checking for getifaddrs... " >&6; }
+if test ${ac_cv_have_getifaddrs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
int
-main ()
+main (void)
{
struct ifaddrs *ifa;
getifaddrs (&ifa);
@@ -5147,74 +5531,82 @@ struct ifaddrs *ifa;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_have_getifaddrs=yes
-else
- ac_cv_have_getifaddrs=no
+else case e in #(
+ e) ac_cv_have_getifaddrs=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_getifaddrs" >&5
-$as_echo "$ac_cv_have_getifaddrs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_getifaddrs" >&5
+printf "%s\n" "$ac_cv_have_getifaddrs" >&6; }
if test "$ac_cv_have_getifaddrs" = yes ; then
- $as_echo "#define HAVE_GETIFADDRS 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GETIFADDRS 1" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5
-$as_echo_n "checking for socklen_t... " >&6; }
-if ${ac_cv_type_socklen_t+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5
+printf %s "checking for socklen_t... " >&6; }
+if test ${ac_cv_type_socklen_t+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
#include <sys/socket.h>
int
-main ()
+main (void)
{
socklen_t socklen;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_type_socklen_t=yes
-else
- ac_cv_type_socklen_t=no
+else case e in #(
+ e) ac_cv_type_socklen_t=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5
-$as_echo "$ac_cv_type_socklen_t" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5
+printf "%s\n" "$ac_cv_type_socklen_t" >&6; }
if test "$ac_cv_type_socklen_t" != yes; then
-$as_echo "#define socklen_t int" >>confdefs.h
+printf "%s\n" "#define socklen_t int" >>confdefs.h
fi
-for ac_header in crypt.h sys/select.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+ac_fn_c_check_header_compile "$LINENO" "crypt.h" "ac_cv_header_crypt_h" "$ac_includes_default"
+if test "x$ac_cv_header_crypt_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_CRYPT_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_select_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h
-done
+fi
for ac_prog in perl5 perl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PERL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PERL in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PERL+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $PERL in
[\\/]* | ?:[\\/]*)
ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
;;
@@ -5223,11 +5615,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5235,15 +5631,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
PERL=$ac_cv_path_PERL
if test -n "$PERL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$PERL" && break
@@ -5252,15 +5649,17 @@ done
if test -z "$PERL" ; then
PERL_VERSION=0
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
-$as_echo_n "checking perl version... " >&6; }
-if ${ac_cv_perl_version+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_perl_version=`$PERL -e "$perl_version_cmd"`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
+printf %s "checking perl version... " >&6; }
+if test ${ac_cv_perl_version+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_perl_version=`$PERL -e "$perl_version_cmd"` ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_perl_version" >&5
-$as_echo "$ac_cv_perl_version" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_perl_version" >&5
+printf "%s\n" "$ac_cv_perl_version" >&6; }
PERL_VERSION=$ac_cv_perl_version
fi
@@ -5269,27 +5668,57 @@ if test -z "$PERL" ; then
PERL=/usr/bin/perl
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
-$as_echo_n "checking for X... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for X" >&5
+printf %s "checking for X... " >&6; }
# Check whether --with-x was given.
-if test "${with_x+set}" = set; then :
+if test ${with_x+y}
+then :
withval=$with_x;
fi
-# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+# $have_x is 'yes', 'no', 'disabled', or empty when we do not yet know.
if test "x$with_x" = xno; then
# The user explicitly disabled X.
have_x=disabled
else
case $x_includes,$x_libraries in #(
*\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
- *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # One or both of the vars are not set, and there is no cached value.
-ac_x_includes=no ac_x_libraries=no
-rm -f -r conftest.dir
+ *,NONE | NONE,*) if test ${ac_cv_have_x+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no
+ac_x_libraries=no
+# Do we need to do anything special at all?
+ac_save_LIBS=$LIBS
+LIBS="-lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main (void)
+{
+XrmInitialize ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ # We can compile and link X programs with no special options.
+ ac_x_includes=
+ ac_x_libraries=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS="$ac_save_LIBS"
+# If that didn't work, only try xmkmf and file system searches
+# for native compilation.
+if test x"$ac_x_includes" = xno && test "$cross_compiling" = no
+then :
+ rm -f -r conftest.dir
if mkdir conftest.dir; then
cd conftest.dir
cat >Imakefile <<'_ACEOF'
@@ -5328,7 +5757,7 @@ _ACEOF
rm -f -r conftest.dir
fi
-# Standard set of common directories for X headers.
+ # Standard set of common directories for X headers.
# Check X11 before X11Rn because it is often a symlink to the current release.
ac_x_header_dirs='
/usr/X11/include
@@ -5355,6 +5784,8 @@ ac_x_header_dirs='
/usr/local/include/X11R5
/usr/local/include/X11R4
+/opt/X11/include
+
/usr/X386/include
/usr/x386/include
/usr/XFree86/include/X11
@@ -5376,16 +5807,18 @@ if test "$ac_x_includes" = no; then
/* end confdefs.h. */
#include <X11/Xlib.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# We can compile using X headers with no special include directory.
ac_x_includes=
-else
- for ac_dir in $ac_x_header_dirs; do
+else case e in #(
+ e) for ac_dir in $ac_x_header_dirs; do
if test -r "$ac_dir/X11/Xlib.h"; then
ac_x_includes=$ac_dir
break
fi
-done
+done ;;
+esac
fi
rm -rf conftest.err conftest.i conftest.$ac_ext
fi # $ac_x_includes = no
@@ -5400,20 +5833,21 @@ if test "$ac_x_libraries" = no; then
/* end confdefs.h. */
#include <X11/Xlib.h>
int
-main ()
+main (void)
{
XrmInitialize ()
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
LIBS=$ac_save_LIBS
# We can link X programs with no special library path.
ac_x_libraries=
-else
- LIBS=$ac_save_LIBS
-for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+else case e in #(
+ e) LIBS=$ac_save_LIBS
+for ac_dir in `printf "%s\n" "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
do
# Don't even attempt the hair of trying to link an X program!
for ac_extension in a so sl dylib la dll; do
@@ -5422,21 +5856,25 @@ do
break 2
fi
done
-done
+done ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi # $ac_x_libraries = no
+fi
+# Record the results.
case $ac_x_includes,$ac_x_libraries in #(
- no,* | *,no | *\'*)
+ no,* | *,no | *\'*) :
# Didn't find X, or a directory has "'" in its name.
- ac_cv_have_x="have_x=no";; #(
- *)
+ ac_cv_have_x="have_x=no" ;; #(
+ *) :
# Record where we found X for the cache.
ac_cv_have_x="have_x=yes\
ac_x_includes='$ac_x_includes'\
- ac_x_libraries='$ac_x_libraries'"
+ ac_x_libraries='$ac_x_libraries'" ;;
+esac ;;
esac
fi
;; #(
@@ -5446,8 +5884,8 @@ fi
fi # $with_x != no
if test "$have_x" != yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
-$as_echo "$have_x" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
+printf "%s\n" "$have_x" >&6; }
no_x=yes
else
# If each of the values was on the command line, it overrides each guess.
@@ -5457,14 +5895,14 @@ else
ac_cv_have_x="have_x=yes\
ac_x_includes='$x_includes'\
ac_x_libraries='$x_libraries'"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
-$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
+printf "%s\n" "libraries $x_libraries, headers $x_includes" >&6; }
fi
if test "$no_x" = yes; then
# Not all programs may use this symbol, but it does not hurt to define it.
-$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h
+printf "%s\n" "#define X_DISPLAY_MISSING 1" >>confdefs.h
X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
else
@@ -5477,8 +5915,8 @@ else
X_LIBS="$X_LIBS -L$x_libraries"
# For Solaris; some versions of Sun CC require a space after -R and
# others require no space. Words are not sufficient . . . .
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
-$as_echo_n "checking whether -R must be followed by a space... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
+printf %s "checking whether -R must be followed by a space... " >&6; }
ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
ac_xsave_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
@@ -5486,42 +5924,46 @@ $as_echo_n "checking whether -R must be followed by a space... " >&6; }
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
X_LIBS="$X_LIBS -R$x_libraries"
-else
- LIBS="$ac_xsave_LIBS -R $x_libraries"
+else case e in #(
+ e) LIBS="$ac_xsave_LIBS -R $x_libraries"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+if ac_fn_c_try_link "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
X_LIBS="$X_LIBS -R $x_libraries"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
-$as_echo "neither works" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
+printf "%s\n" "neither works" >&6; } ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
ac_c_werror_flag=$ac_xsave_c_werror_flag
LIBS=$ac_xsave_LIBS
@@ -5543,106 +5985,127 @@ rm -f core conftest.err conftest.$ac_objext \
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XOpenDisplay ();
+char XOpenDisplay (void);
int
-main ()
+main (void)
{
return XOpenDisplay ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
-$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
-if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
+printf %s "checking for dnet_ntoa in -ldnet... " >&6; }
+if test ${ac_cv_lib_dnet_dnet_ntoa+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldnet $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dnet_ntoa ();
+char dnet_ntoa (void);
int
-main ()
+main (void)
{
return dnet_ntoa ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dnet_dnet_ntoa=yes
-else
- ac_cv_lib_dnet_dnet_ntoa=no
+else case e in #(
+ e) ac_cv_lib_dnet_dnet_ntoa=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
-$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+printf "%s\n" "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes
+then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
-$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
-if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
+printf %s "checking for dnet_ntoa in -ldnet_stub... " >&6; }
+if test ${ac_cv_lib_dnet_stub_dnet_ntoa+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldnet_stub $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dnet_ntoa ();
+char dnet_ntoa (void);
int
-main ()
+main (void)
{
return dnet_ntoa ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dnet_stub_dnet_ntoa=yes
-else
- ac_cv_lib_dnet_stub_dnet_ntoa=no
+else case e in #(
+ e) ac_cv_lib_dnet_stub_dnet_ntoa=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
-$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+printf "%s\n" "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes
+then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
fi
- fi
+ fi ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS="$ac_xsave_LIBS"
@@ -5655,89 +6118,106 @@ rm -f core conftest.err conftest.$ac_objext \
# The functions gethostbyname, getservbyname, and inet_addr are
# in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = xyes; then :
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
fi
if test $ac_cv_func_gethostbyname = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
-$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
-if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+printf %s "checking for gethostbyname in -lnsl... " >&6; }
+if test ${ac_cv_lib_nsl_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lnsl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gethostbyname ();
+char gethostbyname (void);
int
-main ()
+main (void)
{
return gethostbyname ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_nsl_gethostbyname=yes
-else
- ac_cv_lib_nsl_gethostbyname=no
+else case e in #(
+ e) ac_cv_lib_nsl_gethostbyname=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
-$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
-if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
+printf "%s\n" "$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes
+then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
fi
if test $ac_cv_lib_nsl_gethostbyname = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
-$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
-if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
+printf %s "checking for gethostbyname in -lbsd... " >&6; }
+if test ${ac_cv_lib_bsd_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gethostbyname ();
+char gethostbyname (void);
int
-main ()
+main (void)
{
return gethostbyname ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_bsd_gethostbyname=yes
-else
- ac_cv_lib_bsd_gethostbyname=no
+else case e in #(
+ e) ac_cv_lib_bsd_gethostbyname=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
-$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
-if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
+printf "%s\n" "$ac_cv_lib_bsd_gethostbyname" >&6; }
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes
+then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
fi
@@ -5752,48 +6232,57 @@ fi
# must be given before -lnsl if both are needed. We assume that
# if connect needs -lnsl, so does gethostbyname.
ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = xyes; then :
+if test "x$ac_cv_func_connect" = xyes
+then :
fi
if test $ac_cv_func_connect = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
-$as_echo_n "checking for connect in -lsocket... " >&6; }
-if ${ac_cv_lib_socket_connect+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
+printf %s "checking for connect in -lsocket... " >&6; }
+if test ${ac_cv_lib_socket_connect+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char connect ();
+char connect (void);
int
-main ()
+main (void)
{
return connect ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_socket_connect=yes
-else
- ac_cv_lib_socket_connect=no
+else case e in #(
+ e) ac_cv_lib_socket_connect=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
-$as_echo "$ac_cv_lib_socket_connect" >&6; }
-if test "x$ac_cv_lib_socket_connect" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
+printf "%s\n" "$ac_cv_lib_socket_connect" >&6; }
+if test "x$ac_cv_lib_socket_connect" = xyes
+then :
X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
fi
@@ -5801,48 +6290,57 @@ fi
# Guillermo Gomez says -lposix is necessary on A/UX.
ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
-if test "x$ac_cv_func_remove" = xyes; then :
+if test "x$ac_cv_func_remove" = xyes
+then :
fi
if test $ac_cv_func_remove = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
-$as_echo_n "checking for remove in -lposix... " >&6; }
-if ${ac_cv_lib_posix_remove+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
+printf %s "checking for remove in -lposix... " >&6; }
+if test ${ac_cv_lib_posix_remove+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lposix $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char remove ();
+char remove (void);
int
-main ()
+main (void)
{
return remove ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_posix_remove=yes
-else
- ac_cv_lib_posix_remove=no
+else case e in #(
+ e) ac_cv_lib_posix_remove=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
-$as_echo "$ac_cv_lib_posix_remove" >&6; }
-if test "x$ac_cv_lib_posix_remove" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
+printf "%s\n" "$ac_cv_lib_posix_remove" >&6; }
+if test "x$ac_cv_lib_posix_remove" = xyes
+then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
fi
@@ -5850,48 +6348,57 @@ fi
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
-if test "x$ac_cv_func_shmat" = xyes; then :
+if test "x$ac_cv_func_shmat" = xyes
+then :
fi
if test $ac_cv_func_shmat = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
-$as_echo_n "checking for shmat in -lipc... " >&6; }
-if ${ac_cv_lib_ipc_shmat+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
+printf %s "checking for shmat in -lipc... " >&6; }
+if test ${ac_cv_lib_ipc_shmat+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lipc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char shmat ();
+char shmat (void);
int
-main ()
+main (void)
{
return shmat ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_ipc_shmat=yes
-else
- ac_cv_lib_ipc_shmat=no
+else case e in #(
+ e) ac_cv_lib_ipc_shmat=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
-$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
-if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
+printf "%s\n" "$ac_cv_lib_ipc_shmat" >&6; }
+if test "x$ac_cv_lib_ipc_shmat" = xyes
+then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
fi
@@ -5907,43 +6414,51 @@ fi
# These have to be linked with before -lX11, unlike the other
# libraries we check for below, so use a different variable.
# John Interrante, Karl Berry
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
-$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
-if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
+printf %s "checking for IceConnectionNumber in -lICE... " >&6; }
+if test ${ac_cv_lib_ICE_IceConnectionNumber+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char IceConnectionNumber ();
+char IceConnectionNumber (void);
int
-main ()
+main (void)
{
return IceConnectionNumber ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_ICE_IceConnectionNumber=yes
-else
- ac_cv_lib_ICE_IceConnectionNumber=no
+else case e in #(
+ e) ac_cv_lib_ICE_IceConnectionNumber=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
-$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
-if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+printf "%s\n" "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes
+then :
X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
fi
@@ -5999,7 +6514,8 @@ case "$host" in
#
for version in X11R6 X11R5 X11R4 ; do
# if either pair of directories exists...
- if test -d /usr/include/$version || test -d /usr/contrib/$version/include
+ if test -d /usr/include/$version || \
+ test -d /usr/contrib/$version/include
then
# if contrib exists, use it...
if test -d /usr/contrib/$version/include ; then
@@ -6065,43 +6581,51 @@ case "$host" in
MOTIF_LIBS="$MOTIF_LIBS -L/usr/dt/lib -R/usr/dt/lib"
# Some versions of Slowlaris Motif require -lgen. But not all. Why?
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcmp in -lgen" >&5
-$as_echo_n "checking for regcmp in -lgen... " >&6; }
-if ${ac_cv_lib_gen_regcmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for regcmp in -lgen" >&5
+printf %s "checking for regcmp in -lgen... " >&6; }
+if test ${ac_cv_lib_gen_regcmp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lgen $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char regcmp ();
+char regcmp (void);
int
-main ()
+main (void)
{
return regcmp ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_gen_regcmp=yes
-else
- ac_cv_lib_gen_regcmp=no
+else case e in #(
+ e) ac_cv_lib_gen_regcmp=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_regcmp" >&5
-$as_echo "$ac_cv_lib_gen_regcmp" >&6; }
-if test "x$ac_cv_lib_gen_regcmp" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_regcmp" >&5
+printf "%s\n" "$ac_cv_lib_gen_regcmp" >&6; }
+if test "x$ac_cv_lib_gen_regcmp" = xyes
+then :
MOTIF_LIBS="$MOTIF_LIBS -lgen"
fi
@@ -6135,12 +6659,13 @@ fi
fi
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XPointer" >&5
-$as_echo_n "checking for XPointer... " >&6; }
-if ${ac_cv_xpointer+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XPointer" >&5
+printf %s "checking for XPointer... " >&6; }
+if test ${ac_cv_xpointer+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -6151,33 +6676,37 @@ else
/* end confdefs.h. */
#include <X11/Xlib.h>
int
-main ()
+main (void)
{
XPointer foo = (XPointer) 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_xpointer=yes
-else
- ac_cv_xpointer=no
+else case e in #(
+ e) ac_cv_xpointer=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xpointer" >&5
-$as_echo "$ac_cv_xpointer" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xpointer" >&5
+printf "%s\n" "$ac_cv_xpointer" >&6; }
if test "$ac_cv_xpointer" != yes; then
- $as_echo "#define XPointer char*" >>confdefs.h
+ printf "%s\n" "#define XPointer char*" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xt" >&5
-$as_echo_n "checking for Xt... " >&6; }
-if ${ac_cv_libxt+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xt" >&5
+printf %s "checking for Xt... " >&6; }
+if test ${ac_cv_libxt+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -6189,26 +6718,29 @@ else
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
int
-main ()
+main (void)
{
Widget foo = (Widget) 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_libxt=yes
-else
- ac_cv_libxt=no
+else case e in #(
+ e) ac_cv_libxt=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libxt" >&5
-$as_echo "$ac_cv_libxt" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libxt" >&5
+printf "%s\n" "$ac_cv_libxt" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is macOS" >&5
-$as_echo_n "checking whether this is macOS... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether this is macOS" >&5
+printf %s "checking whether this is macOS... " >&6; }
ac_macosx=no
ac_irix=no
case "$host" in
@@ -6219,8 +6751,8 @@ $as_echo_n "checking whether this is macOS... " >&6; }
ac_irix=yes
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_macosx" >&5
-$as_echo "$ac_macosx" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_macosx" >&5
+printf "%s\n" "$ac_macosx" >&6; }
###############################################################################
#
@@ -6228,15 +6760,19 @@ $as_echo "$ac_macosx" >&6; }
#
###############################################################################
+# Note: In the decades since I wrote this, PKG_CHECK_MODULES came into
+# existence, which could probably simplify the following quite a bit.
+
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_pkg_config+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $pkg_config in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_pkg_config+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $pkg_config in
[\\/]* | ?:[\\/]*)
ac_cv_path_pkg_config="$pkg_config" # Let the user override the test with a path.
;;
@@ -6245,11 +6781,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_pkg_config="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_pkg_config="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6257,15 +6797,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
pkg_config=$ac_cv_path_pkg_config
if test -n "$pkg_config"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkg_config" >&5
-$as_echo "$pkg_config" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pkg_config" >&5
+printf "%s\n" "$pkg_config" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -6273,12 +6814,13 @@ if test -z "$ac_cv_path_pkg_config"; then
ac_pt_pkg_config=$pkg_config
# Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_pkg_config+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_pkg_config in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_pkg_config+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $ac_pt_pkg_config in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_pkg_config="$ac_pt_pkg_config" # Let the user override the test with a path.
;;
@@ -6287,11 +6829,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_pkg_config="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_pkg_config="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6299,15 +6845,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
ac_pt_pkg_config=$ac_cv_path_ac_pt_pkg_config
if test -n "$ac_pt_pkg_config"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_pkg_config" >&5
-$as_echo "$ac_pt_pkg_config" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_pkg_config" >&5
+printf "%s\n" "$ac_pt_pkg_config" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_pt_pkg_config" = x; then
@@ -6315,8 +6862,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
pkg_config=$ac_pt_pkg_config
@@ -6326,8 +6873,8 @@ else
fi
if test -z "$pkg_config" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found!" >&5
-$as_echo "$as_me: WARNING: pkg-config not found!" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found!" >&5
+printf "%s\n" "$as_me: WARNING: pkg-config not found!" >&2;}
pkg_config="false"
fi
@@ -6338,24 +6885,24 @@ pkg_check_version() {
if test "$ok" = yes ; then
req="$1"
min="$2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $req" >&5
-$as_echo_n "checking for $req... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $req" >&5
+printf %s "checking for $req... " >&6; }
if $pkg_config --exists "$req" ; then
vers=`$pkg_config --modversion "$req"`
if $pkg_config --exists "$req >= $min" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers" >&5
-$as_echo "$vers" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $vers" >&5
+printf "%s\n" "$vers" >&6; }
pkgs="$pkgs $req"
return 1
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers (wanted >= $min)" >&5
-$as_echo "$vers (wanted >= $min)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $vers (wanted >= $min)" >&5
+printf "%s\n" "$vers (wanted >= $min)" >&6; }
ok=no
return 0
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
ok=no
return 0
fi
@@ -6376,17 +6923,19 @@ $as_echo "no" >&6; }
# that uses wildcards, and write a sane set of rules to detect gettext(3) and
# msgfmt(1) and just do the obviously straightforward thing?
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
-$as_echo_n "checking whether NLS is requested... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+printf %s "checking whether NLS is requested... " >&6; }
# Check whether --enable-nls was given.
-if test "${enable_nls+set}" = set; then :
+if test ${enable_nls+y}
+then :
enableval=$enable_nls; USE_NLS=$enableval
-else
- USE_NLS=yes
+else case e in #(
+ e) USE_NLS=yes ;;
+esac
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
-$as_echo "$USE_NLS" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+printf "%s\n" "$USE_NLS" >&6; }
case "$am__api_version" in
1.01234)
@@ -6400,22 +6949,23 @@ INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 10
INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3`
INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
if test -n ""; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5
-$as_echo_n "checking for intltool >= ... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5
-$as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5
+printf %s "checking for intltool >= ... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5
+printf "%s\n" "$INTLTOOL_APPLIED_VERSION found" >&6; }
test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
as_fn_error $? "Your intltool is too old. You need intltool or later." "$LINENO" 5
fi
# Extract the first word of "intltool-update", so it can be a program name with args.
set dummy intltool-update; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $INTLTOOL_UPDATE in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_INTLTOOL_UPDATE+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $INTLTOOL_UPDATE in
[\\/]* | ?:[\\/]*)
ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path.
;;
@@ -6424,11 +6974,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_INTLTOOL_UPDATE="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6436,25 +6990,27 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE
if test -n "$INTLTOOL_UPDATE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5
-$as_echo "$INTLTOOL_UPDATE" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5
+printf "%s\n" "$INTLTOOL_UPDATE" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
# Extract the first word of "intltool-merge", so it can be a program name with args.
set dummy intltool-merge; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_INTLTOOL_MERGE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $INTLTOOL_MERGE in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_INTLTOOL_MERGE+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $INTLTOOL_MERGE in
[\\/]* | ?:[\\/]*)
ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path.
;;
@@ -6463,11 +7019,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_INTLTOOL_MERGE="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6475,25 +7035,27 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE
if test -n "$INTLTOOL_MERGE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5
-$as_echo "$INTLTOOL_MERGE" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5
+printf "%s\n" "$INTLTOOL_MERGE" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
# Extract the first word of "intltool-extract", so it can be a program name with args.
set dummy intltool-extract; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $INTLTOOL_EXTRACT in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_INTLTOOL_EXTRACT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $INTLTOOL_EXTRACT in
[\\/]* | ?:[\\/]*)
ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path.
;;
@@ -6502,11 +7064,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_INTLTOOL_EXTRACT="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6514,15 +7080,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT
if test -n "$INTLTOOL_EXTRACT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5
-$as_echo "$INTLTOOL_EXTRACT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5
+printf "%s\n" "$INTLTOOL_EXTRACT" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then
@@ -6568,12 +7135,13 @@ fi
# Check the gettext tools to make sure they are GNU
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XGETTEXT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $XGETTEXT in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_XGETTEXT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $XGETTEXT in
[\\/]* | ?:[\\/]*)
ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
;;
@@ -6582,11 +7150,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_XGETTEXT="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6594,25 +7166,27 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
XGETTEXT=$ac_cv_path_XGETTEXT
if test -n "$XGETTEXT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
-$as_echo "$XGETTEXT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+printf "%s\n" "$XGETTEXT" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
# Extract the first word of "msgmerge", so it can be a program name with args.
set dummy msgmerge; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGMERGE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MSGMERGE in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGMERGE+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $MSGMERGE in
[\\/]* | ?:[\\/]*)
ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
;;
@@ -6621,11 +7195,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_MSGMERGE="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6633,25 +7211,27 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
MSGMERGE=$ac_cv_path_MSGMERGE
if test -n "$MSGMERGE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
-$as_echo "$MSGMERGE" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+printf "%s\n" "$MSGMERGE" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGFMT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MSGFMT in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGFMT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $MSGFMT in
[\\/]* | ?:[\\/]*)
ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
;;
@@ -6660,11 +7240,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_MSGFMT="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6672,25 +7256,27 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
MSGFMT=$ac_cv_path_MSGFMT
if test -n "$MSGFMT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
-$as_echo "$MSGFMT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+printf "%s\n" "$MSGFMT" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GMSGFMT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $GMSGFMT in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GMSGFMT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $GMSGFMT in
[\\/]* | ?:[\\/]*)
ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
;;
@@ -6699,11 +7285,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6712,15 +7302,16 @@ IFS=$as_save_IFS
test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
;;
+esac ;;
esac
fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
-$as_echo "$GMSGFMT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+printf "%s\n" "$GMSGFMT" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then
@@ -6737,774 +7328,2723 @@ fi
GETTEXT_PACKAGE=xscreensaver
-cat >>confdefs.h <<_ACEOF
-#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE"
-_ACEOF
+printf "%s\n" "#define GETTEXT_PACKAGE \"$GETTEXT_PACKAGE\"" >>confdefs.h
ALL_LINGUAS="da de es et fi fr hu it ja ko nb nl pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
- for ac_header in locale.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
-if test "x$ac_cv_header_locale_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LOCALE_H 1
-_ACEOF
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ *'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+ ;;
+esac
+fi
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use plain mkdir -p,
+ # in the hope it doesn't have the bugs of ancient mkdir.
+ MKDIR_P='mkdir -p'
+ fi
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in #(
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+#(
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -rf conftest.sed
+
+ GETTEXT_MACRO_VERSION=0.20
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGFMT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case "$MSGFMT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$gt_saved_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$gt_saved_IFS"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+printf "%s\n" "$MSGFMT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GMSGFMT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+printf "%s\n" "$GMSGFMT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
- if test $ac_cv_header_locale_h = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5
-$as_echo_n "checking for LC_MESSAGES... " >&6; }
-if ${am_cv_val_LC_MESSAGES+:} false; then :
- $as_echo_n "(cached) " >&6
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_XGETTEXT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case "$XGETTEXT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$gt_saved_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$gt_saved_IFS"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+printf "%s\n" "$XGETTEXT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ rm -f messages.po
+
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGMERGE+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case "$MSGMERGE" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$gt_saved_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$gt_saved_IFS"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+ ;;
+esac ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+printf "%s\n" "$MSGMERGE" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then
+ MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt'
+ else
+ if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then
+ MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet'
+ else
+ MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet'
+ fi
+ fi
+
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+ ac_config_commands="$ac_config_commands po-directories"
+
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_saved_prefix"
+
+# Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else case e in #(
+ e) with_gnu_ld=no ;;
+esac
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld" >&5
+printf %s "checking for ld... " >&6; }
+elif test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+elif test "$with_gnu_ld" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test -n "$LD"; then
+ # Let the user override the test with a path.
+ :
+else
+ if test ${acl_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
+ acl_cv_path_LD= # Final result of this test
+ ac_prog=ld # Program to search in $PATH
+ if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ case $host in
+ *-*-mingw* | windows*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ acl_output=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $acl_output in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'`
+ while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do
+ acl_output=`echo $acl_output | sed "s%$re_direlt%/%"`
+ done
+ # Got the pathname. No search in PATH is needed.
+ acl_cv_path_LD="$acl_output"
+ ac_prog=
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+ fi
+ if test -n "$ac_prog"; then
+ # Search for $ac_prog in $PATH.
+ acl_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$acl_saved_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_saved_IFS"
+ fi
+ case $host in
+ *-*-aix*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <locale.h>
-int
-main ()
-{
-return LC_MESSAGES
- ;
- return 0;
-}
+#if defined __powerpc64__ || defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # The compiler produces 64-bit code. Add option '-b64' so that the
+ # linker groks 64-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -b64 "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;;
+ esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ sparc64-*-netbsd*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- am_cv_val_LC_MESSAGES=yes
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else case e in #(
+ e) # The compiler produces 32-bit code. Add option '-m elf32_sparc'
+ # so that the linker groks 32-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -m elf32_sparc "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;;
+ esac
+ ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ esac
+ ;;
+esac
+fi
+
+ LD="$acl_cv_path_LD"
+fi
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- am_cv_val_LC_MESSAGES=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${acl_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes
+ ;;
+*)
+ acl_cv_prog_gnu_ld=no
+ ;;
+esac ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+printf %s "checking for shared library run path origin... " >&6; }
+if test ${acl_cv_rpath+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+printf "%s\n" "$acl_cv_rpath" >&6; }
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ # Check whether --enable-rpath was given.
+if test ${enable_rpath+y}
+then :
+ enableval=$enable_rpath; :
+else case e in #(
+ e) enable_rpath=yes ;;
+esac
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5
+printf %s "checking 32-bit host C ABI... " >&6; }
+if test ${gl_cv_host_cpu_c_abi_32bit+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case "$host_cpu" in
+
+ # CPUs that only support a 32-bit ABI.
+ arc \
+ | bfin \
+ | cris* \
+ | csky \
+ | epiphany \
+ | ft32 \
+ | h8300 \
+ | m68k \
+ | microblaze | microblazeel \
+ | nds32 | nds32le | nds32be \
+ | nios2 | nios2eb | nios2el \
+ | or1k* \
+ | or32 \
+ | sh | sh1234 | sh1234elb \
+ | tic6x \
+ | xtensa* )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ # CPUs that only support a 64-bit ABI.
+ alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
+ | mmix )
+ gl_cv_host_cpu_c_abi_32bit=no
+ ;;
+
+ *)
+ if test -n "$gl_cv_host_cpu_c_abi"; then
+ case "$gl_cv_host_cpu_c_abi" in
+ i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
+ gl_cv_host_cpu_c_abi_32bit=yes ;;
+ x86_64 | alpha | arm64 | aarch64c | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
+ gl_cv_host_cpu_c_abi_32bit=no ;;
+ *)
+ gl_cv_host_cpu_c_abi_32bit=unknown ;;
+ esac
+ else
+ gl_cv_host_cpu_c_abi_32bit=unknown
+ fi
+ if test $gl_cv_host_cpu_c_abi_32bit = unknown; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int test_pointer_size[sizeof (void *) - 5];
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else case e in #(
+ e) gl_cv_host_cpu_c_abi_32bit=yes ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5
-$as_echo "$am_cv_val_LC_MESSAGES" >&6; }
- if test $am_cv_val_LC_MESSAGES = yes; then
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ ;;
+ esac
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5
+printf "%s\n" "$gl_cv_host_cpu_c_abi_32bit" >&6; }
-$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h
+ HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5
+printf %s "checking for egrep -e... " >&6; }
+if test ${ac_cv_path_EGREP_TRADITIONAL+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -z "$EGREP_TRADITIONAL"; then
+ ac_path_EGREP_TRADITIONAL_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue
+# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found.
+ # Check for GNU $ac_path_EGREP_TRADITIONAL
+case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #(
+*GNU*)
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;;
+#(
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl"
+ "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL"
+ ac_path_EGREP_TRADITIONAL_max=$ac_count
fi
- fi
- USE_NLS=yes
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
- gt_cv_have_gettext=no
+ $ac_path_EGREP_TRADITIONAL_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then
+ :
+ fi
+else
+ ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL
+fi
- CATOBJEXT=NONE
- XGETTEXT=:
- INTLLIBS=
+ if test "$ac_cv_path_EGREP_TRADITIONAL"
+then :
+ ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E"
+else case e in #(
+ e) if test -z "$EGREP_TRADITIONAL"; then
+ ac_path_EGREP_TRADITIONAL_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue
+# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found.
+ # Check for GNU $ac_path_EGREP_TRADITIONAL
+case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #(
+*GNU*)
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;;
+#(
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl"
+ "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL"
+ ac_path_EGREP_TRADITIONAL_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
-$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
-if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
- $as_echo_n "(cached) " >&6
+ $ac_path_EGREP_TRADITIONAL_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
else
- gt_save_LIBS="$LIBS"
+ ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL
+fi
+ ;;
+esac
+fi ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5
+printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; }
+ EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ELF binary format" >&5
+printf %s "checking for ELF binary format... " >&6; }
+if test ${gl_cv_elf+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __ELF__ || (defined __linux__ && defined __EDG__)
+ Extensible Linking Format
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP_TRADITIONAL "Extensible Linking Format" >/dev/null 2>&1
+then :
+ gl_cv_elf=yes
+else case e in #(
+ e) gl_cv_elf=no ;;
+esac
+fi
+rm -rf conftest*
+
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5
+printf "%s\n" "$gl_cv_elf" >&6; }
+ if test $gl_cv_elf = yes; then
+ # Extract the ELF class of a file (5th byte) in decimal.
+ # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+ if od -A x < /dev/null >/dev/null 2>/dev/null; then
+ # Use POSIX od.
+ func_elfclass ()
+ {
+ od -A n -t d1 -j 4 -N 1
+ }
+ else
+ # Use BSD hexdump.
+ func_elfclass ()
+ {
+ dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
+ echo
+ }
+ fi
+ # Use 'expr', not 'test', to compare the values of func_elfclass, because on
+ # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
+ # not 1 or 2.
+ case $HOST_CPU_C_ABI_32BIT in
+ yes)
+ # 32-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null
+ }
+ ;;
+ no)
+ # 64-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null
+ }
+ ;;
+ *)
+ # Unknown.
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ ;;
+ esac
+ else
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5
+printf %s "checking for the common suffixes of directories in the library search path... " >&6; }
+if test ${acl_cv_libdirstems+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) acl_libdirstem=lib
+ acl_libdirstem2=
+ acl_libdirstem3=
+ case "$host_os" in
+ solaris*)
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ acl_libdirstem2=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem3=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ netbsd*)
+ if test $HOST_CPU_C_ABI_32BIT != no; then
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparc ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
+ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test $HOST_CPU_C_ABI_32BIT != no; then
+ # 32-bit or unknown ABI.
+ if test -d /usr/lib32; then
+ acl_libdirstem2=lib32
+ fi
+ fi
+ if test $HOST_CPU_C_ABI_32BIT != yes; then
+ # 64-bit or unknown ABI.
+ if test -d /usr/lib64; then
+ acl_libdirstem3=lib64
+ fi
+ fi
+ if test -n "$searchpath"; then
+ acl_saved_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64 ) acl_libdirstem3=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_saved_IFS"
+ if test $HOST_CPU_C_ABI_32BIT = yes; then
+ # 32-bit ABI.
+ acl_libdirstem3=
+ fi
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ # 64-bit ABI.
+ acl_libdirstem2=
+ fi
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+ test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
+ acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5
+printf "%s\n" "$acl_cv_libdirstems" >&6; }
+ acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
+ acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
+ acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
+
+ use_additional=yes
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+# Check whether --with-libiconv-prefix was given.
+if test ${with_libiconv_prefix+y}
+then :
+ withval=$with_libiconv_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ LIBICONV_PREFIX=
+ HAVE_LIBICONV=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='iconv '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCICONV; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ saved_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$saved_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_saved_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_saved_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+ done
+ fi
+
+ gl_sed_double_backslashes='s/\\/\\\\/g'
+ gl_sed_escape_doublequotes='s/"/\\"/g'
+ gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g"
+ gl_sed_escape_for_make_2='s,\$,\\$$,g'
+ case `echo r | tr -d '\r'` in
+ '') gl_tr_cr='\015' ;;
+ *) gl_tr_cr='\r' ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+printf %s "checking for CFPreferencesCopyAppValue... " >&6; }
+if test ${gt_cv_func_CFPreferencesCopyAppValue+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) gt_saved_LIBS="$LIBS"
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <CoreFoundation/CFPreferences.h>
int
-main ()
+main (void)
{
CFPreferencesCopyAppValue(NULL, NULL)
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
gt_cv_func_CFPreferencesCopyAppValue=yes
-else
- gt_cv_func_CFPreferencesCopyAppValue=no
+else case e in #(
+ e) gt_cv_func_CFPreferencesCopyAppValue=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- LIBS="$gt_save_LIBS"
+ LIBS="$gt_saved_LIBS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
-$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+printf "%s\n" "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
-$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+printf "%s\n" "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
-$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
-if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- gt_save_LIBS="$LIBS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyPreferredLanguages" >&5
+printf %s "checking for CFLocaleCopyPreferredLanguages... " >&6; }
+if test ${gt_cv_func_CFLocaleCopyPreferredLanguages+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) gt_saved_LIBS="$LIBS"
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <CoreFoundation/CFLocale.h>
int
-main ()
+main (void)
{
-CFLocaleCopyCurrent();
+CFLocaleCopyPreferredLanguages();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- gt_cv_func_CFLocaleCopyCurrent=yes
-else
- gt_cv_func_CFLocaleCopyCurrent=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ gt_cv_func_CFLocaleCopyPreferredLanguages=yes
+else case e in #(
+ e) gt_cv_func_CFLocaleCopyPreferredLanguages=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- LIBS="$gt_save_LIBS"
+ LIBS="$gt_saved_LIBS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
-$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
- if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyPreferredLanguages" >&5
+printf "%s\n" "$gt_cv_func_CFLocaleCopyPreferredLanguages" >&6; }
+ if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then
-$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_CFLOCALECOPYPREFERREDLANGUAGES 1" >>confdefs.h
fi
INTL_MACOSX_LIBS=
- if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
- INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes \
+ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices"
fi
- ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default"
-if test "x$ac_cv_header_libintl_h" = xyes; then :
- gt_cv_func_dgettext_libintl="no"
- libintl_extra_libs=""
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
- #
- # First check in libc
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5
-$as_echo_n "checking for ngettext in libc... " >&6; }
-if ${gt_cv_func_ngettext_libc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#include <libintl.h>
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
-int
-main ()
-{
-return !ngettext ("","", 1)
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- gt_cv_func_ngettext_libc=yes
-else
- gt_cv_func_ngettext_libc=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5
-$as_echo "$gt_cv_func_ngettext_libc" >&6; }
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
- if test "$gt_cv_func_ngettext_libc" = "yes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5
-$as_echo_n "checking for dgettext in libc... " >&6; }
-if ${gt_cv_func_dgettext_libc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+printf %s "checking for GNU gettext in libc... " >&6; }
+if eval test \${$gt_func_gnugettext_libc+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings)
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
int
-main ()
+main (void)
{
-return !dgettext ("","")
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- gt_cv_func_dgettext_libc=yes
-else
- gt_cv_func_dgettext_libc=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$gt_func_gnugettext_libc=yes"
+else case e in #(
+ e) eval "$gt_func_gnugettext_libc=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5
-$as_echo "$gt_cv_func_dgettext_libc" >&6; }
- fi
+eval ac_res=\$$gt_func_gnugettext_libc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
- if test "$gt_cv_func_ngettext_libc" = "yes" ; then
- for ac_func in bind_textdomain_codeset
-do :
- ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
-if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_BIND_TEXTDOMAIN_CODESET 1
-_ACEOF
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
-fi
-done
+ gl_saved_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
- #
- # If we don't have everything we want, check in libintl
- #
- if test "$gt_cv_func_dgettext_libc" != "yes" \
- || test "$gt_cv_func_ngettext_libc" != "yes" \
- || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5
-$as_echo_n "checking for bindtextdomain in -lintl... " >&6; }
-if ${ac_cv_lib_intl_bindtextdomain+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lintl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+printf %s "checking for iconv... " >&6; }
+if test ${am_cv_func_iconv+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char bindtextdomain ();
+#include <stdlib.h>
+#include <iconv.h>
+
int
-main ()
+main (void)
{
-return bindtextdomain ();
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_intl_bindtextdomain=yes
-else
- ac_cv_lib_intl_bindtextdomain=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_func_iconv=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5
-$as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; }
-if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5
-$as_echo_n "checking for ngettext in -lintl... " >&6; }
-if ${ac_cv_lib_intl_ngettext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lintl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ gl_saved_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char ngettext ();
+#include <stdlib.h>
+#include <iconv.h>
+
int
-main ()
+main (void)
{
-return ngettext ();
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_intl_ngettext=yes
-else
- ac_cv_lib_intl_ngettext=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5
-$as_echo "$ac_cv_lib_intl_ngettext" >&6; }
-if test "x$ac_cv_lib_intl_ngettext" = xyes; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5
-$as_echo_n "checking for dgettext in -lintl... " >&6; }
-if ${ac_cv_lib_intl_dgettext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lintl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ LIBS="$gl_saved_LIBS"
+ fi
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+printf "%s\n" "$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+printf %s "checking for working iconv... " >&6; }
+if test ${am_cv_func_iconv_works+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
+ gl_saved_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
#endif
-char dgettext ();
+
int
-main ()
+main (void)
{
-return dgettext ();
+int result = 0;
+ /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from
+ successful returns. This is even documented in
+ <https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ {
+ /* Try standardized names. */
+ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+ /* Try IRIX, OSF/1 names. */
+ iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+ /* Try AIX names. */
+ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+ /* Try HP-UX names. */
+ iconv_t cd4 = iconv_open ("utf8", "eucJP");
+ if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+ && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+ result |= 16;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd2 != (iconv_t)(-1))
+ iconv_close (cd2);
+ if (cd3 != (iconv_t)(-1))
+ iconv_close (cd3);
+ if (cd4 != (iconv_t)(-1))
+ iconv_close (cd4);
+ }
+ return result;
+
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_intl_dgettext=yes
-else
- ac_cv_lib_intl_dgettext=no
+if ac_fn_c_try_run "$LINENO"
+then :
+ am_cv_func_iconv_works=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5
-$as_echo "$ac_cv_lib_intl_dgettext" >&6; }
-if test "x$ac_cv_lib_intl_dgettext" = xyes; then :
- gt_cv_func_dgettext_libintl=yes
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$gl_saved_LIBS"
+ ;;
+esac
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+printf "%s\n" "$am_cv_func_iconv_works" >&6; }
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+
+printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+printf %s "checking how to link with libiconv... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+printf "%s\n" "$LIBICONV" >&6; }
+ else
+ CPPFLAGS="$gl_saved_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+ use_additional=yes
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+# Check whether --with-libintl-prefix was given.
+if test ${with_libintl_prefix+y}
+then :
+ withval=$with_libintl_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
fi
- if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5
-$as_echo_n "checking if -liconv is needed to use gettext... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5
-$as_echo_n "checking for ngettext in -lintl... " >&6; }
-if ${ac_cv_lib_intl_ngettext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lintl -liconv $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ LIBINTL_PREFIX=
+ HAVE_LIBINTL=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='intl '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCINTL; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ saved_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$saved_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_saved_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_saved_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_saved_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+ done
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+printf %s "checking for GNU gettext in libintl... " >&6; }
+if eval test \${$gt_func_gnugettext_libintl+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
#ifdef __cplusplus
-extern "C"
+"C"
#endif
-char ngettext ();
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+
int
-main ()
+main (void)
{
-return ngettext ();
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_intl_ngettext=yes
-else
- ac_cv_lib_intl_ngettext=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$gt_func_gnugettext_libintl=yes"
+else case e in #(
+ e) eval "$gt_func_gnugettext_libintl=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5
-$as_echo "$ac_cv_lib_intl_ngettext" >&6; }
-if test "x$ac_cv_lib_intl_ngettext" = xyes; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5
-$as_echo_n "checking for dcgettext in -lintl... " >&6; }
-if ${ac_cv_lib_intl_dcgettext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lintl -liconv $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ gt_LIBINTL_EXTRA="$INTL_MACOSX_LIBS"
+
+ case "$host_os" in
+ aix*) gt_LIBINTL_EXTRA="-lpthread" ;;
+ esac
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } \
+ && { test -n "$LIBICONV" || test -n "$gt_LIBINTL_EXTRA"; }; then
+ LIBS="$LIBS $LIBICONV $gt_LIBINTL_EXTRA"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
#ifdef __cplusplus
-extern "C"
+"C"
#endif
-char dcgettext ();
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+
int
-main ()
+main (void)
{
-return dcgettext ();
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_intl_dcgettext=yes
-else
- ac_cv_lib_intl_dcgettext=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ LIBINTL="$LIBINTL $LIBICONV $gt_LIBINTL_EXTRA"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV $gt_LIBINTL_EXTRA"
+ eval "$gt_func_gnugettext_libintl=yes"
+
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5
-$as_echo "$ac_cv_lib_intl_dcgettext" >&6; }
-if test "x$ac_cv_lib_intl_dcgettext" = xyes; then :
- gt_cv_func_dgettext_libintl=yes
- libintl_extra_libs=-liconv
-else
- :
-fi
-
-else
- :
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS" ;;
+esac
fi
+eval ac_res=\$$gt_func_gnugettext_libintl
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ fi
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools \
+ && test "$PACKAGE" != libintl; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
fi
- #
- # If we found libintl, then check in it for bind_textdomain_codeset();
- # we'll prefer libc if neither have bind_textdomain_codeset(),
- # and both have dgettext and ngettext
- #
- if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
- glib_save_LIBS="$LIBS"
- LIBS="$LIBS -lintl $libintl_extra_libs"
- unset ac_cv_func_bind_textdomain_codeset
- for ac_func in bind_textdomain_codeset
-do :
- ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
-if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_BIND_TEXTDOMAIN_CODESET 1
-_ACEOF
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
-fi
-done
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
- LIBS="$glib_save_LIBS"
+printf "%s\n" "#define ENABLE_NLS 1" >>confdefs.h
- if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
- gt_cv_func_dgettext_libc=no
- else
- if test "$gt_cv_func_dgettext_libc" = "yes" \
- && test "$gt_cv_func_ngettext_libc" = "yes"; then
- gt_cv_func_dgettext_libintl=no
- fi
- fi
- fi
- fi
+ else
+ USE_NLS=no
+ fi
+ fi
- if test "$gt_cv_func_dgettext_libc" = "yes" \
- || test "$gt_cv_func_dgettext_libintl" = "yes"; then
- gt_cv_have_gettext=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+printf %s "checking whether to use NLS... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+printf "%s\n" "$USE_NLS" >&6; }
+ if test "$USE_NLS" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+printf %s "checking where the gettext function comes from... " >&6; }
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
fi
+ else
+ gt_source="included intl directory"
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+printf "%s\n" "$gt_source" >&6; }
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+printf %s "checking how to link with libintl... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+printf "%s\n" "$LIBINTL" >&6; }
+
+ for element in $INCINTL; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_saved_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_saved_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_saved_exec_prefix"
+ prefix="$acl_saved_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
- if test "$gt_cv_func_dgettext_libintl" = "yes"; then
- INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS"
fi
- if test "$gt_cv_have_gettext" = "yes"; then
+printf "%s\n" "#define HAVE_GETTEXT 1" >>confdefs.h
-$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_DCGETTEXT 1" >>confdefs.h
- # Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGFMT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case "$MSGFMT" in
- /*)
- ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
- ac_cv_path_MSGFMT="$ac_dir/$ac_word"
- break
- fi
fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
- ;;
-esac
-fi
-MSGFMT="$ac_cv_path_MSGFMT"
-if test "$MSGFMT" != "no"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
-$as_echo "$MSGFMT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
- if test "$MSGFMT" != "no"; then
- glib_save_LIBS="$LIBS"
- LIBS="$LIBS $INTLLIBS"
- for ac_func in dcgettext
-do :
- ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext"
-if test "x$ac_cv_func_dcgettext" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_DCGETTEXT 1
-_ACEOF
-fi
-done
+ POSUB=po
+ fi
- MSGFMT_OPTS=
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5
-$as_echo_n "checking if msgfmt accepts -c... " >&6; }
- cat >conftest.foo <<_ACEOF
-
-msgid ""
-msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
-"Project-Id-Version: test 1.0\n"
-"PO-Revision-Date: 2007-02-15 12:01+0100\n"
-"Last-Translator: test <foo@bar.xx>\n"
-"Language-Team: C <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
+ INTLLIBS="$LIBINTL"
-_ACEOF
-if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5
- ($MSGFMT -c -o /dev/null conftest.foo) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-echo "$as_me: failed input was:" >&5
-sed 's/^/| /' conftest.foo >&5
-fi
+ gt_save_prefix="${prefix}"
+ gt_save_datarootdir="${datarootdir}"
+ gt_save_localedir="${localedir}"
+ if test "X$prefix" = "XNONE"; then
+ prefix="$ac_default_prefix"
+ fi
+ eval datarootdir="$datarootdir"
+ eval localedir="$localedir"
- # Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GMSGFMT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $GMSGFMT in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
+ gl_final_localedir="$localedir"
+ case "$build_os" in
+ cygwin*)
+ case "$host_os" in
+ mingw* | windows*)
+ gl_final_localedir=`cygpath -w "$gl_final_localedir"` ;;
+ esac
+ ;;
+ esac
+ localedir_c=`printf '%s\n' "$gl_final_localedir" | sed -e "$gl_sed_double_backslashes" -e "$gl_sed_escape_doublequotes" | tr -d "$gl_tr_cr"`
+ localedir_c='"'"$localedir_c"'"'
+
+ localedir_c_make=`printf '%s\n' "$localedir_c" | sed -e "$gl_sed_escape_for_make_1" -e "$gl_sed_escape_for_make_2" | tr -d "$gl_tr_cr"`
+ if test "$localedir_c_make" = '\"'"${gl_final_localedir}"'\"'; then
+ localedir_c_make='\"$(localedir)\"'
fi
-done
- done
-IFS=$as_save_IFS
- test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
- ;;
-esac
-fi
-GMSGFMT=$ac_cv_path_GMSGFMT
-if test -n "$GMSGFMT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
-$as_echo "$GMSGFMT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+ localedir="${gt_save_localedir}"
+ datarootdir="${gt_save_datarootdir}"
+ prefix="${gt_save_prefix}"
- # Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XGETTEXT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case "$XGETTEXT" in
- /*)
- ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
- ;;
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
- ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
- break
- fi
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
- ;;
-esac
-fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test "$XGETTEXT" != ":"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
-$as_echo "$XGETTEXT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+MKINSTALLDIRS="$INSTALL_DIRS"
+
+# The library is there, but neither $INTLLIBS nor $LIBINTL are getting set.
+if test -z "$INTLLIBS" ; then INTLLIBS="$LIBINTL" ; fi
+if test -z "$INTLLIBS" ; then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettext in -lintl" >&5
+printf %s "checking for gettext in -lintl... " >&6; }
+if test ${ac_cv_lib_intl_gettext+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gettext (void);
int
-main ()
+main (void)
{
-extern int _nl_msg_cat_cntr;
- return _nl_msg_cat_cntr
+return gettext ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- CATOBJEXT=.gmo
- DATADIRNAME=share
-else
- case $host in
- *-*-solaris*)
- ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
-if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
- CATOBJEXT=.gmo
- DATADIRNAME=share
-else
- CATOBJEXT=.mo
- DATADIRNAME=lib
-fi
-
- ;;
- *-*-openbsd*)
- CATOBJEXT=.mo
- DATADIRNAME=share
- ;;
- *)
- CATOBJEXT=.mo
- DATADIRNAME=lib
- ;;
- esac
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_intl_gettext=yes
+else case e in #(
+ e) ac_cv_lib_intl_gettext=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- LIBS="$glib_save_LIBS"
- INSTOBJEXT=.mo
- else
- gt_cv_have_gettext=no
- fi
- fi
-
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_gettext" >&5
+printf "%s\n" "$ac_cv_lib_intl_gettext" >&6; }
+if test "x$ac_cv_lib_intl_gettext" = xyes
+then :
+ INTLLIBS="-lintl"
fi
- if test "$gt_cv_have_gettext" = "yes" ; then
-
-$as_echo "#define ENABLE_NLS 1" >>confdefs.h
-
- fi
-
- if test "$XGETTEXT" != ":"; then
- if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
- : ;
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5
-$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; }
- XGETTEXT=":"
- fi
- fi
-
- # We need to process the po/ directory.
- POSUB=po
-
- ac_config_commands="$ac_config_commands default-1"
-
- for lang in $ALL_LINGUAS; do
- GMOFILES="$GMOFILES $lang.gmo"
- POFILES="$POFILES $lang.po"
- done
-
- if test "$gt_cv_have_gettext" = "yes"; then
- if test "x$ALL_LINGUAS" = "x"; then
- LINGUAS=
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5
-$as_echo_n "checking for catalogs to be installed... " >&6; }
- NEW_LINGUAS=
- for presentlang in $ALL_LINGUAS; do
- useit=no
- if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
- desiredlanguages="$LINGUAS"
- else
- desiredlanguages="$ALL_LINGUAS"
- fi
- for desiredlang in $desiredlanguages; do
- # Use the presentlang catalog if desiredlang is
- # a. equal to presentlang, or
- # b. a variant of presentlang (because in this case,
- # presentlang can be used as a fallback for messages
- # which are not translated in the desiredlang catalog).
- case "$desiredlang" in
- "$presentlang"*) useit=yes;;
- esac
- done
- if test $useit = yes; then
- NEW_LINGUAS="$NEW_LINGUAS $presentlang"
- fi
- done
- LINGUAS=$NEW_LINGUAS
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5
-$as_echo "$LINGUAS" >&6; }
- fi
-
- if test -n "$LINGUAS"; then
- for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
- fi
- fi
-
- MKINSTALLDIRS=
- if test -n "$ac_aux_dir"; then
- MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
- fi
- if test -z "$MKINSTALLDIRS"; then
- MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
- fi
-
- test -d po || mkdir po
- if test "x$srcdir" != "x."; then
- if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
- posrcprefix="$srcdir/"
- else
- posrcprefix="../$srcdir/"
- fi
- else
- posrcprefix="../"
- fi
- rm -f po/POTFILES
- sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
- < $srcdir/po/POTFILES.in > po/POTFILES
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
-MKINSTALLDIRS="$INSTALL_DIRS"
+fi
+LIBINTL="$INTLLIBS"
###############################################################################
#
@@ -7515,18 +10055,21 @@ MKINSTALLDIRS="$INSTALL_DIRS"
#### H1
# Check whether --with-app-defaults was given.
-if test "${with_app_defaults+set}" = set; then :
+if test ${with_app_defaults+y}
+then :
withval=$with_app_defaults; ac_cv_x_app_defaults="$withval"
-else
- eval ac_x_app_defaults="$withval"
+else case e in #(
+ e) eval ac_x_app_defaults="$withval" ;;
+esac
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X app-defaults directory" >&5
-$as_echo_n "checking for X app-defaults directory... " >&6; }
-if ${ac_cv_x_app_defaults+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # skip this, it's always wrong these days.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for X app-defaults directory" >&5
+printf %s "checking for X app-defaults directory... " >&6; }
+if test ${ac_cv_x_app_defaults+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) # skip this, it's always wrong these days.
# AC_PATH_X_APP_DEFAULTS_XMKMF
if test x"$ac_x_app_defaults" = x; then
true
@@ -7599,10 +10142,11 @@ else
else
# Record where we found app-defaults for the cache.
ac_cv_x_app_defaults="$ac_x_app_defaults"
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x_app_defaults" >&5
-$as_echo "$ac_cv_x_app_defaults" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x_app_defaults" >&5
+printf "%s\n" "$ac_cv_x_app_defaults" >&6; }
eval ac_x_app_defaults="$ac_cv_x_app_defaults"
###############################################################################
@@ -7615,10 +10159,12 @@ have_hackdir=yes
with_hackdir_req=unspecified
# Check whether --with-hackdir was given.
-if test "${with_hackdir+set}" = set; then :
+if test ${with_hackdir+y}
+then :
withval=$with_hackdir; with_hackdir="$withval"; with_hackdir_req="$withval"
-else
- with_hackdir=yes
+else case e in #(
+ e) with_hackdir=yes ;;
+esac
fi
if test x"$with_hackdir" = xyes; then
@@ -7640,7 +10186,8 @@ HACKDIR_FULL=`eval eval eval eval eval eval eval eval eval echo $HACKDIR`
obsolete_enable=
# Check whether --enable-subdir was given.
-if test "${enable_subdir+set}" = set; then :
+if test ${enable_subdir+y}
+then :
enableval=$enable_subdir; obsolete_enable=yes
fi
@@ -7661,10 +10208,12 @@ have_configdir=yes
with_configdir_req=unspecified
# Check whether --with-configdir was given.
-if test "${with_configdir+set}" = set; then :
+if test ${with_configdir+y}
+then :
withval=$with_configdir; with_configdir="$withval"; with_configdir_req="$withval"
-else
- with_configdir=yes
+else case e in #(
+ e) with_configdir=yes ;;
+esac
fi
if test x"$with_configdir" = xyes; then
@@ -7693,10 +10242,12 @@ have_fontdir=yes
with_fontdir_req=unspecified
# Check whether --with-fontdir was given.
-if test "${with_fontdir+set}" = set; then :
+if test ${with_fontdir+y}
+then :
withval=$with_fontdir; with_fontdir="$withval"; with_fontdir_req="$withval"
-else
- with_fontdir=yes
+else case e in #(
+ e) with_fontdir=yes ;;
+esac
fi
if test x"$with_fontdir" = xyes; then
@@ -7729,10 +10280,12 @@ have_dpms=no
with_dpms_req=unspecified
# Check whether --with-dpms-ext was given.
-if test "${with_dpms_ext+set}" = set; then :
+if test ${with_dpms_ext+y}
+then :
withval=$with_dpms_ext; with_dpms="$withval"; with_dpms_req="$withval"
-else
- with_dpms=yes
+else case e in #(
+ e) with_dpms=yes ;;
+esac
fi
case "$with_dpms" in
@@ -7740,28 +10293,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMS headers" >&5
-$as_echo_n "checking for DPMS headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DPMS headers" >&5
+printf %s "checking for DPMS headers... " >&6; }
d=$with_dpms/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMS libs" >&5
-$as_echo_n "checking for DPMS libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DPMS libs" >&5
+printf %s "checking for DPMS libs... " >&6; }
d=$with_dpms/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -7791,7 +10344,8 @@ if test "$with_dpms" = yes; then
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/dpms.h" "ac_cv_header_X11_extensions_dpms_h" "#include <X11/Xlib.h>
#include <X11/Xmd.h>
"
-if test "x$ac_cv_header_X11_extensions_dpms_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_dpms_h" = xyes
+then :
have_dpms=yes
fi
@@ -7821,46 +10375,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMSInfo in -lXext" >&5
-$as_echo_n "checking for DPMSInfo in -lXext... " >&6; }
-if ${ac_cv_lib_Xext_DPMSInfo+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DPMSInfo in -lXext" >&5
+printf %s "checking for DPMSInfo in -lXext... " >&6; }
+if test ${ac_cv_lib_Xext_DPMSInfo+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXext -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char DPMSInfo ();
+char DPMSInfo (void);
int
-main ()
+main (void)
{
return DPMSInfo ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xext_DPMSInfo=yes
-else
- ac_cv_lib_Xext_DPMSInfo=no
+else case e in #(
+ e) ac_cv_lib_Xext_DPMSInfo=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_DPMSInfo" >&5
-$as_echo "$ac_cv_lib_Xext_DPMSInfo" >&6; }
-if test "x$ac_cv_lib_Xext_DPMSInfo" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_DPMSInfo" >&5
+printf "%s\n" "$ac_cv_lib_Xext_DPMSInfo" >&6; }
+if test "x$ac_cv_lib_Xext_DPMSInfo" = xyes
+then :
have_dpms=yes
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -7888,46 +10451,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMSInfo in -lXdpms" >&5
-$as_echo_n "checking for DPMSInfo in -lXdpms... " >&6; }
-if ${ac_cv_lib_Xdpms_DPMSInfo+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DPMSInfo in -lXdpms" >&5
+printf %s "checking for DPMSInfo in -lXdpms... " >&6; }
+if test ${ac_cv_lib_Xdpms_DPMSInfo+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXdpms -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char DPMSInfo ();
+char DPMSInfo (void);
int
-main ()
+main (void)
{
return DPMSInfo ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xdpms_DPMSInfo=yes
-else
- ac_cv_lib_Xdpms_DPMSInfo=no
+else case e in #(
+ e) ac_cv_lib_Xdpms_DPMSInfo=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xdpms_DPMSInfo" >&5
-$as_echo "$ac_cv_lib_Xdpms_DPMSInfo" >&6; }
-if test "x$ac_cv_lib_Xdpms_DPMSInfo" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xdpms_DPMSInfo" >&5
+printf "%s\n" "$ac_cv_lib_Xdpms_DPMSInfo" >&6; }
+if test "x$ac_cv_lib_Xdpms_DPMSInfo" = xyes
+then :
have_dpms=yes; XDPMS_LIBS="-lXdpms"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -7939,7 +10511,7 @@ fi
# if that succeeded, then we've really got it.
if test "$have_dpms" = yes; then
- $as_echo "#define HAVE_DPMS_EXTENSION 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_DPMS_EXTENSION 1" >>confdefs.h
fi
@@ -7958,10 +10530,12 @@ have_xf86vmode=no
with_xf86vmode_req=unspecified
# Check whether --with-xf86vmode-ext was given.
-if test "${with_xf86vmode_ext+set}" = set; then :
+if test ${with_xf86vmode_ext+y}
+then :
withval=$with_xf86vmode_ext; with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
-else
- with_xf86vmode=yes
+else case e in #(
+ e) with_xf86vmode=yes ;;
+esac
fi
case "$with_xf86vmode" in
@@ -7969,28 +10543,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode headers" >&5
-$as_echo_n "checking for xf86vmode headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xf86vmode headers" >&5
+printf %s "checking for xf86vmode headers... " >&6; }
d=$with_xf86vmode/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode libs" >&5
-$as_echo_n "checking for xf86vmode libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xf86vmode libs" >&5
+printf %s "checking for xf86vmode libs... " >&6; }
d=$with_xf86vmode/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -8021,7 +10595,8 @@ if test "$with_xf86vmode" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes
+then :
have_xf86vmode=yes
fi
@@ -8049,48 +10624,57 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
-$as_echo_n "checking for XF86VidModeGetViewPort in -lXxf86vm... " >&6; }
-if ${ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+printf %s "checking for XF86VidModeGetViewPort in -lXxf86vm... " >&6; }
+if test ${ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXxf86vm -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XF86VidModeGetViewPort ();
+char XF86VidModeGetViewPort (void);
int
-main ()
+main (void)
{
return XF86VidModeGetViewPort ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=yes
-else
- ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=no
+else case e in #(
+ e) ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&5
-$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&6; }
-if test "x$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&5
+printf "%s\n" "$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" = xyes
+then :
have_xf86vmode=yes;
VIDMODE_LIBS="-lXxf86vm";
SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8101,7 +10685,7 @@ fi
# if that succeeded, then we've really got it.
if test "$have_xf86vmode" = yes; then
- $as_echo "#define HAVE_XF86VMODE 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XF86VMODE 1" >>confdefs.h
fi
@@ -8120,10 +10704,12 @@ have_xinerama=no
with_xinerama_req=unspecified
# Check whether --with-xinerama-ext was given.
-if test "${with_xinerama_ext+set}" = set; then :
+if test ${with_xinerama_ext+y}
+then :
withval=$with_xinerama_ext; with_xinerama="$withval"; with_xinerama_req="$withval"
-else
- with_xinerama=yes
+else case e in #(
+ e) with_xinerama=yes ;;
+esac
fi
case "$with_xinerama" in
@@ -8131,28 +10717,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA headers" >&5
-$as_echo_n "checking for XINERAMA headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XINERAMA headers" >&5
+printf %s "checking for XINERAMA headers... " >&6; }
d=$with_xinerama/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA libs" >&5
-$as_echo_n "checking for XINERAMA libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XINERAMA libs" >&5
+printf %s "checking for XINERAMA libs... " >&6; }
d=$with_xinerama/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -8181,7 +10767,8 @@ if test "$with_xinerama" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xinerama.h" "ac_cv_header_X11_extensions_Xinerama_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_Xinerama_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_Xinerama_h" = xyes
+then :
have_xinerama=yes
fi
@@ -8211,46 +10798,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaQueryScreens in -lXext" >&5
-$as_echo_n "checking for XineramaQueryScreens in -lXext... " >&6; }
-if ${ac_cv_lib_Xext_XineramaQueryScreens+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XineramaQueryScreens in -lXext" >&5
+printf %s "checking for XineramaQueryScreens in -lXext... " >&6; }
+if test ${ac_cv_lib_Xext_XineramaQueryScreens+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXext -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XineramaQueryScreens ();
+char XineramaQueryScreens (void);
int
-main ()
+main (void)
{
return XineramaQueryScreens ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xext_XineramaQueryScreens=yes
-else
- ac_cv_lib_Xext_XineramaQueryScreens=no
+else case e in #(
+ e) ac_cv_lib_Xext_XineramaQueryScreens=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XineramaQueryScreens" >&5
-$as_echo "$ac_cv_lib_Xext_XineramaQueryScreens" >&6; }
-if test "x$ac_cv_lib_Xext_XineramaQueryScreens" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XineramaQueryScreens" >&5
+printf "%s\n" "$ac_cv_lib_Xext_XineramaQueryScreens" >&6; }
+if test "x$ac_cv_lib_Xext_XineramaQueryScreens" = xyes
+then :
have_xinerama=yes
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8278,46 +10874,56 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaQueryScreens in -lXinerama" >&5
-$as_echo_n "checking for XineramaQueryScreens in -lXinerama... " >&6; }
-if ${ac_cv_lib_Xinerama_XineramaQueryScreens+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XineramaQueryScreens in -lXinerama" >&5
+printf %s "checking for XineramaQueryScreens in -lXinerama... " >&6; }
+if test ${ac_cv_lib_Xinerama_XineramaQueryScreens+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXinerama -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XineramaQueryScreens ();
+char XineramaQueryScreens (void);
int
-main ()
+main (void)
{
return XineramaQueryScreens ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xinerama_XineramaQueryScreens=yes
-else
- ac_cv_lib_Xinerama_XineramaQueryScreens=no
+else case e in #(
+ e) ac_cv_lib_Xinerama_XineramaQueryScreens=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xinerama_XineramaQueryScreens" >&5
-$as_echo "$ac_cv_lib_Xinerama_XineramaQueryScreens" >&6; }
-if test "x$ac_cv_lib_Xinerama_XineramaQueryScreens" = xyes; then :
- have_xinerama=yes; XINERAMA_LIBS="-lXinerama"
-else
- true
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xinerama_XineramaQueryScreens" >&5
+printf "%s\n" "$ac_cv_lib_Xinerama_XineramaQueryScreens" >&6; }
+if test "x$ac_cv_lib_Xinerama_XineramaQueryScreens" = xyes
+then :
+ have_xinerama=yes;
+ XINERAMA_LIBS="$XINERAMA_LIBS -lXinerama"
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8329,7 +10935,7 @@ fi
# if that succeeded, then we've really got it.
if test "$have_xinerama" = yes; then
- $as_echo "#define HAVE_XINERAMA 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XINERAMA 1" >>confdefs.h
fi
@@ -8352,10 +10958,12 @@ have_randr=no
with_randr_req=unspecified
# Check whether --with-randr-ext was given.
-if test "${with_randr_ext+set}" = set; then :
+if test ${with_randr_ext+y}
+then :
withval=$with_randr_ext; with_randr="$withval"; with_randr_req="$withval"
-else
- with_randr=yes
+else case e in #(
+ e) with_randr=yes ;;
+esac
fi
case "$with_randr" in
@@ -8363,28 +10971,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR headers" >&5
-$as_echo_n "checking for RANDR headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for RANDR headers" >&5
+printf %s "checking for RANDR headers... " >&6; }
d=$with_randr/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR libs" >&5
-$as_echo_n "checking for RANDR libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for RANDR libs" >&5
+printf %s "checking for RANDR libs... " >&6; }
d=$with_randr/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -8413,7 +11021,8 @@ if test "$with_randr" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrandr.h" "ac_cv_header_X11_extensions_Xrandr_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_Xrandr_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_Xrandr_h" = xyes
+then :
have_randr=yes
fi
@@ -8443,46 +11052,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderSetSubpixelOrder in -lXrender" >&5
-$as_echo_n "checking for XRenderSetSubpixelOrder in -lXrender... " >&6; }
-if ${ac_cv_lib_Xrender_XRenderSetSubpixelOrder+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XRenderSetSubpixelOrder in -lXrender" >&5
+printf %s "checking for XRenderSetSubpixelOrder in -lXrender... " >&6; }
+if test ${ac_cv_lib_Xrender_XRenderSetSubpixelOrder+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXrender -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XRenderSetSubpixelOrder ();
+char XRenderSetSubpixelOrder (void);
int
-main ()
+main (void)
{
return XRenderSetSubpixelOrder ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xrender_XRenderSetSubpixelOrder=yes
-else
- ac_cv_lib_Xrender_XRenderSetSubpixelOrder=no
+else case e in #(
+ e) ac_cv_lib_Xrender_XRenderSetSubpixelOrder=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&5
-$as_echo "$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&6; }
-if test "x$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&5
+printf "%s\n" "$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&6; }
+if test "x$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" = xyes
+then :
xrender_libs="-lXrender"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8510,46 +11128,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXext" >&5
-$as_echo_n "checking for XRRGetScreenInfo in -lXext... " >&6; }
-if ${ac_cv_lib_Xext_XRRGetScreenInfo+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXext" >&5
+printf %s "checking for XRRGetScreenInfo in -lXext... " >&6; }
+if test ${ac_cv_lib_Xext_XRRGetScreenInfo+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXext $xrender_libs -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XRRGetScreenInfo ();
+char XRRGetScreenInfo (void);
int
-main ()
+main (void)
{
return XRRGetScreenInfo ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xext_XRRGetScreenInfo=yes
-else
- ac_cv_lib_Xext_XRRGetScreenInfo=no
+else case e in #(
+ e) ac_cv_lib_Xext_XRRGetScreenInfo=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XRRGetScreenInfo" >&5
-$as_echo "$ac_cv_lib_Xext_XRRGetScreenInfo" >&6; }
-if test "x$ac_cv_lib_Xext_XRRGetScreenInfo" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XRRGetScreenInfo" >&5
+printf "%s\n" "$ac_cv_lib_Xext_XRRGetScreenInfo" >&6; }
+if test "x$ac_cv_lib_Xext_XRRGetScreenInfo" = xyes
+then :
have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8577,46 +11204,56 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXrandr" >&5
-$as_echo_n "checking for XRRGetScreenInfo in -lXrandr... " >&6; }
-if ${ac_cv_lib_Xrandr_XRRGetScreenInfo+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXrandr" >&5
+printf %s "checking for XRRGetScreenInfo in -lXrandr... " >&6; }
+if test ${ac_cv_lib_Xrandr_XRRGetScreenInfo+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXrandr $xrender_libs -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XRRGetScreenInfo ();
+char XRRGetScreenInfo (void);
int
-main ()
+main (void)
{
return XRRGetScreenInfo ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xrandr_XRRGetScreenInfo=yes
-else
- ac_cv_lib_Xrandr_XRRGetScreenInfo=no
+else case e in #(
+ e) ac_cv_lib_Xrandr_XRRGetScreenInfo=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrandr_XRRGetScreenInfo" >&5
-$as_echo "$ac_cv_lib_Xrandr_XRRGetScreenInfo" >&6; }
-if test "x$ac_cv_lib_Xrandr_XRRGetScreenInfo" = xyes; then :
- have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"
-else
- true
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrandr_XRRGetScreenInfo" >&5
+printf "%s\n" "$ac_cv_lib_Xrandr_XRRGetScreenInfo" >&6; }
+if test "x$ac_cv_lib_Xrandr_XRRGetScreenInfo" = xyes
+then :
+ have_randr=yes;
+ XINERAMA_LIBS="$XINERAMA_LIBS -lXrandr $xrender_libs"
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8628,16 +11265,17 @@ fi
# if that succeeded, then we've really got it.
if test "$have_randr" = yes; then
- $as_echo "#define HAVE_RANDR 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_RANDR 1" >>confdefs.h
# Now check for version 1.2 in the same libs.
# Try to compile, since on macOS 10.5.7, headers are older than libs!
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenResources" >&5
-$as_echo_n "checking for XRRGetScreenResources... " >&6; }
-if ${ac_cv_randr_12+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_randr_12=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenResources" >&5
+printf %s "checking for XRRGetScreenResources... " >&6; }
+if test ${ac_cv_randr_12+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_randr_12=no
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -8651,7 +11289,7 @@ else
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
int
-main ()
+main (void)
{
XRRScreenResources *res =
XRRGetScreenResources (0, 0);
@@ -8659,18 +11297,21 @@ XRRScreenResources *res =
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_randr_12=yes
-else
- ac_cv_randr_12=no
+else case e in #(
+ e) ac_cv_randr_12=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_randr_12" >&5
-$as_echo "$ac_cv_randr_12" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_randr_12" >&5
+printf "%s\n" "$ac_cv_randr_12" >&6; }
if test "$ac_cv_randr_12" = yes ; then
- $as_echo "#define HAVE_RANDR_12 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_RANDR_12 1" >>confdefs.h
fi
# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
@@ -8693,10 +11334,12 @@ with_xinput_req=unspecified
xinput_halfassed=no
# Check whether --with-xinput-ext was given.
-if test "${with_xinput_ext+set}" = set; then :
+if test ${with_xinput_ext+y}
+then :
withval=$with_xinput_ext; with_xinput="$withval"; with_xinput_req="$withval"
-else
- with_xinput=yes
+else case e in #(
+ e) with_xinput=yes ;;
+esac
fi
case "$with_xinput" in
@@ -8704,28 +11347,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT headers" >&5
-$as_echo_n "checking for XINPUT headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XINPUT headers" >&5
+printf %s "checking for XINPUT headers... " >&6; }
d=$with_xinput/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT libs" >&5
-$as_echo_n "checking for XINPUT libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XINPUT libs" >&5
+printf %s "checking for XINPUT libs... " >&6; }
d=$with_xinput/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -8754,7 +11397,8 @@ if test "$with_xinput" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XInput2.h" "ac_cv_header_X11_extensions_XInput2_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_XInput2_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_XInput2_h" = xyes
+then :
have_xinput=yes
fi
@@ -8783,47 +11427,56 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XISelectEvents in -lXi" >&5
-$as_echo_n "checking for XISelectEvents in -lXi... " >&6; }
-if ${ac_cv_lib_Xi_XISelectEvents+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XISelectEvents in -lXi" >&5
+printf %s "checking for XISelectEvents in -lXi... " >&6; }
+if test ${ac_cv_lib_Xi_XISelectEvents+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXi -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XISelectEvents ();
+char XISelectEvents (void);
int
-main ()
+main (void)
{
return XISelectEvents ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xi_XISelectEvents=yes
-else
- ac_cv_lib_Xi_XISelectEvents=no
+else case e in #(
+ e) ac_cv_lib_Xi_XISelectEvents=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XISelectEvents" >&5
-$as_echo "$ac_cv_lib_Xi_XISelectEvents" >&6; }
-if test "x$ac_cv_lib_Xi_XISelectEvents" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XISelectEvents" >&5
+printf "%s\n" "$ac_cv_lib_Xi_XISelectEvents" >&6; }
+if test "x$ac_cv_lib_Xi_XISelectEvents" = xyes
+then :
have_xinput=yes; xinput_halfassed=no;
SAVER_LIBS="$SAVER_LIBS -lXi"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -8834,10 +11487,14 @@ fi
# if that succeeded, then we've really got it.
if test "$have_xinput" = yes; then
- $as_echo "#define HAVE_XINPUT 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XINPUT 1" >>confdefs.h
fi
+elif test "$with_xinput" = no; then
+ echo "error: --without-xinput-ext is not supported."
+ exit 1
+
elif test "$with_xinput" != no; then
echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
exit 1
@@ -8854,10 +11511,12 @@ have_xf86gamma_ramp=no
with_xf86gamma_req=unspecified
# Check whether --with-xf86gamma-ext was given.
-if test "${with_xf86gamma_ext+set}" = set; then :
+if test ${with_xf86gamma_ext+y}
+then :
withval=$with_xf86gamma_ext; with_xf86gamma="$withval"; with_xf86gamma_req="$withval"
-else
- with_xf86gamma=yes
+else case e in #(
+ e) with_xf86gamma=yes ;;
+esac
fi
case "$with_xf86gamma" in
@@ -8865,28 +11524,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86gamma headers" >&5
-$as_echo_n "checking for xf86gamma headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xf86gamma headers" >&5
+printf %s "checking for xf86gamma headers... " >&6; }
d=$with_xf86gamma/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86gamma libs" >&5
-$as_echo_n "checking for xf86gamma libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xf86gamma libs" >&5
+printf %s "checking for xf86gamma libs... " >&6; }
d=$with_xf86gamma/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -8918,7 +11577,8 @@ if test "$with_xf86gamma" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes
+then :
have_xf86gamma=yes
fi
@@ -8947,46 +11607,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeSetGamma in -lXxf86vm" >&5
-$as_echo_n "checking for XF86VidModeSetGamma in -lXxf86vm... " >&6; }
-if ${ac_cv_lib_Xxf86vm_XF86VidModeSetGamma+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeSetGamma in -lXxf86vm" >&5
+printf %s "checking for XF86VidModeSetGamma in -lXxf86vm... " >&6; }
+if test ${ac_cv_lib_Xxf86vm_XF86VidModeSetGamma+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXxf86vm -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XF86VidModeSetGamma ();
+char XF86VidModeSetGamma (void);
int
-main ()
+main (void)
{
return XF86VidModeSetGamma ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xxf86vm_XF86VidModeSetGamma=yes
-else
- ac_cv_lib_Xxf86vm_XF86VidModeSetGamma=no
+else case e in #(
+ e) ac_cv_lib_Xxf86vm_XF86VidModeSetGamma=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" >&5
-$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" >&6; }
-if test "x$ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" >&5
+printf "%s\n" "$ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" = xyes
+then :
have_xf86gamma=yes
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9017,46 +11686,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeSetGammaRamp in -lXxf86vm" >&5
-$as_echo_n "checking for XF86VidModeSetGammaRamp in -lXxf86vm... " >&6; }
-if ${ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeSetGammaRamp in -lXxf86vm" >&5
+printf %s "checking for XF86VidModeSetGammaRamp in -lXxf86vm... " >&6; }
+if test ${ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXxf86vm -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XF86VidModeSetGammaRamp ();
+char XF86VidModeSetGammaRamp (void);
int
-main ()
+main (void)
{
return XF86VidModeSetGammaRamp ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp=yes
-else
- ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp=no
+else case e in #(
+ e) ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" >&5
-$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" >&6; }
-if test "x$ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" >&5
+printf "%s\n" "$ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" = xyes
+then :
have_xf86gamma_ramp=yes
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9067,12 +11745,12 @@ fi
# if those tests succeeded, then we've really got the functions.
if test "$have_xf86gamma" = yes; then
- $as_echo "#define HAVE_XF86VMODE_GAMMA 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XF86VMODE_GAMMA 1" >>confdefs.h
fi
if test "$have_xf86gamma_ramp" = yes; then
- $as_echo "#define HAVE_XF86VMODE_GAMMA_RAMP 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XF86VMODE_GAMMA_RAMP 1" >>confdefs.h
fi
@@ -9096,10 +11774,12 @@ have_xidle=no
with_xidle_req=unspecified
# Check whether --with-xidle-ext was given.
-if test "${with_xidle_ext+set}" = set; then :
+if test ${with_xidle_ext+y}
+then :
withval=$with_xidle_ext; with_xidle="$withval"; with_xidle_req="$withval"
-else
- with_xidle=yes
+else case e in #(
+ e) with_xidle=yes ;;
+esac
fi
case "$with_xidle" in
@@ -9107,28 +11787,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XIDLE headers" >&5
-$as_echo_n "checking for XIDLE headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XIDLE headers" >&5
+printf %s "checking for XIDLE headers... " >&6; }
d=$with_xidle/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XIDLE libs" >&5
-$as_echo_n "checking for XIDLE libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XIDLE libs" >&5
+printf %s "checking for XIDLE libs... " >&6; }
d=$with_xidle/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -9155,9 +11835,10 @@ if test "$with_xidle" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xidle.h" "ac_cv_header_X11_extensions_xidle_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_xidle_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_xidle_h" = xyes
+then :
have_xidle=yes
- $as_echo "#define HAVE_XIDLE_EXTENSION 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XIDLE_EXTENSION 1" >>confdefs.h
fi
@@ -9191,7 +11872,8 @@ if test "$with_mit" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/scrnsaver.h" "ac_cv_header_X11_extensions_scrnsaver_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_scrnsaver_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_scrnsaver_h" = xyes
+then :
have_mit=yes
fi
@@ -9220,46 +11902,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXext" >&5
-$as_echo_n "checking for XScreenSaverRegister in -lXext... " >&6; }
-if ${ac_cv_lib_Xext_XScreenSaverRegister+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXext" >&5
+printf %s "checking for XScreenSaverRegister in -lXext... " >&6; }
+if test ${ac_cv_lib_Xext_XScreenSaverRegister+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XScreenSaverRegister ();
+char XScreenSaverRegister (void);
int
-main ()
+main (void)
{
return XScreenSaverRegister ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xext_XScreenSaverRegister=yes
-else
- ac_cv_lib_Xext_XScreenSaverRegister=no
+else case e in #(
+ e) ac_cv_lib_Xext_XScreenSaverRegister=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XScreenSaverRegister" >&5
-$as_echo "$ac_cv_lib_Xext_XScreenSaverRegister" >&6; }
-if test "x$ac_cv_lib_Xext_XScreenSaverRegister" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XScreenSaverRegister" >&5
+printf "%s\n" "$ac_cv_lib_Xext_XScreenSaverRegister" >&6; }
+if test "x$ac_cv_lib_Xext_XScreenSaverRegister" = xyes
+then :
true
-else
- have_mit=no
+else case e in #(
+ e) have_mit=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9288,46 +11979,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXExExt" >&5
-$as_echo_n "checking for XScreenSaverRegister in -lXExExt... " >&6; }
-if ${ac_cv_lib_XExExt_XScreenSaverRegister+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXExExt" >&5
+printf %s "checking for XScreenSaverRegister in -lXExExt... " >&6; }
+if test ${ac_cv_lib_XExExt_XScreenSaverRegister+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXExExt -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XScreenSaverRegister ();
+char XScreenSaverRegister (void);
int
-main ()
+main (void)
{
return XScreenSaverRegister ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_XExExt_XScreenSaverRegister=yes
-else
- ac_cv_lib_XExExt_XScreenSaverRegister=no
+else case e in #(
+ e) ac_cv_lib_XExExt_XScreenSaverRegister=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XExExt_XScreenSaverRegister" >&5
-$as_echo "$ac_cv_lib_XExExt_XScreenSaverRegister" >&6; }
-if test "x$ac_cv_lib_XExExt_XScreenSaverRegister" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XExExt_XScreenSaverRegister" >&5
+printf "%s\n" "$ac_cv_lib_XExExt_XScreenSaverRegister" >&6; }
+if test "x$ac_cv_lib_XExExt_XScreenSaverRegister" = xyes
+then :
have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9360,46 +12060,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXss" >&5
-$as_echo_n "checking for XScreenSaverRegister in -lXss... " >&6; }
-if ${ac_cv_lib_Xss_XScreenSaverRegister+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverRegister in -lXss" >&5
+printf %s "checking for XScreenSaverRegister in -lXss... " >&6; }
+if test ${ac_cv_lib_Xss_XScreenSaverRegister+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXss -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XScreenSaverRegister ();
+char XScreenSaverRegister (void);
int
-main ()
+main (void)
{
return XScreenSaverRegister ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xss_XScreenSaverRegister=yes
-else
- ac_cv_lib_Xss_XScreenSaverRegister=no
+else case e in #(
+ e) ac_cv_lib_Xss_XScreenSaverRegister=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xss_XScreenSaverRegister" >&5
-$as_echo "$ac_cv_lib_Xss_XScreenSaverRegister" >&6; }
-if test "x$ac_cv_lib_Xss_XScreenSaverRegister" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xss_XScreenSaverRegister" >&5
+printf "%s\n" "$ac_cv_lib_Xss_XScreenSaverRegister" >&6; }
+if test "x$ac_cv_lib_Xss_XScreenSaverRegister" = xyes
+then :
have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9431,10 +12140,12 @@ have_sgi=no
with_sgi_req=unspecified
# Check whether --with-sgi-ext was given.
-if test "${with_sgi_ext+set}" = set; then :
+if test ${with_sgi_ext+y}
+then :
withval=$with_sgi_ext; with_sgi="$withval"; with_sgi_req="$withval"
-else
- with_sgi=$ac_irix
+else case e in #(
+ e) with_sgi=$ac_irix ;;
+esac
fi
case "$with_sgi" in
@@ -9442,28 +12153,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI SCREEN_SAVER headers" >&5
-$as_echo_n "checking for SGI SCREEN_SAVER headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SGI SCREEN_SAVER headers" >&5
+printf %s "checking for SGI SCREEN_SAVER headers... " >&6; }
d=$with_sgi/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI SCREEN_SAVER libs" >&5
-$as_echo_n "checking for SGI SCREEN_SAVER libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SGI SCREEN_SAVER libs" >&5
+printf %s "checking for SGI SCREEN_SAVER libs... " >&6; }
d=$with_sgi/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -9490,9 +12201,10 @@ if test "$with_sgi" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XScreenSaver.h" "ac_cv_header_X11_extensions_XScreenSaver_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_XScreenSaver_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_XScreenSaver_h" = xyes
+then :
have_sgi=yes
- $as_echo "#define HAVE_SGI_SAVER_EXTENSION 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_SGI_SAVER_EXTENSION 1" >>confdefs.h
fi
@@ -9513,10 +12225,12 @@ have_sgivc=no
with_sgivc_req=unspecified
# Check whether --with-sgivc-ext was given.
-if test "${with_sgivc_ext+set}" = set; then :
+if test ${with_sgivc_ext+y}
+then :
withval=$with_sgivc_ext; with_sgivc="$withval"; with_sgivc_req="$withval"
-else
- with_sgivc=$ac_irix
+else case e in #(
+ e) with_sgivc=$ac_irix ;;
+esac
fi
case "$with_sgivc" in
@@ -9524,28 +12238,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI-VIDEO-CONTROL headers" >&5
-$as_echo_n "checking for SGI-VIDEO-CONTROL headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SGI-VIDEO-CONTROL headers" >&5
+printf %s "checking for SGI-VIDEO-CONTROL headers... " >&6; }
d=$with_sgivc/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SGI-VIDEO-CONTROL libs" >&5
-$as_echo_n "checking for SGI-VIDEO-CONTROL libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SGI-VIDEO-CONTROL libs" >&5
+printf %s "checking for SGI-VIDEO-CONTROL libs... " >&6; }
d=$with_sgivc/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -9574,7 +12288,8 @@ if test "$with_sgivc" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XSGIvc.h" "ac_cv_header_X11_extensions_XSGIvc_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_XSGIvc_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_XSGIvc_h" = xyes
+then :
have_sgivc=yes
fi
@@ -9602,46 +12317,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
-$as_echo_n "checking for XSGIvcQueryGammaMap in -lXsgivc... " >&6; }
-if ${ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
+printf %s "checking for XSGIvcQueryGammaMap in -lXsgivc... " >&6; }
+if test ${ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXsgivc -lXext -lX11 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XSGIvcQueryGammaMap ();
+char XSGIvcQueryGammaMap (void);
int
-main ()
+main (void)
{
return XSGIvcQueryGammaMap ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap=yes
-else
- ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap=no
+else case e in #(
+ e) ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" >&5
-$as_echo "$ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" >&6; }
-if test "x$ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" >&5
+printf "%s\n" "$ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" >&6; }
+if test "x$ac_cv_lib_Xsgivc_XSGIvcQueryGammaMap" = xyes
+then :
have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9652,7 +12376,7 @@ fi
# if that succeeded, then we've really got it.
if test "$have_sgivc" = yes; then
- $as_echo "#define HAVE_SGI_VC_EXTENSION 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_SGI_VC_EXTENSION 1" >>confdefs.h
fi
@@ -9663,86 +12387,6 @@ fi
###############################################################################
#
-# Check for the SGI XReadDisplay server extension.
-#
-###############################################################################
-
-have_readdisplay=no
-with_readdisplay_req=unspecified
-
-# Check whether --with-readdisplay was given.
-if test "${with_readdisplay+set}" = set; then :
- withval=$with_readdisplay; with_readdisplay="$withval"; with_readdisplay_req="$withval"
-else
- with_readdisplay=$ac_irix
-fi
-
- case "$with_readdisplay" in
- yes) ;;
- no) ;;
-
- /*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay headers" >&5
-$as_echo_n "checking for XReadDisplay headers... " >&6; }
- d=$with_readdisplay/include
- if test -d $d; then
- X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay libs" >&5
-$as_echo_n "checking for XReadDisplay libs... " >&6; }
- d=$with_readdisplay/lib
- if test -d $d; then
- X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
- fi
-
- # replace the directory string with "yes".
- with_readdisplay_req="yes"
- with_readdisplay=$with_readdisplay_req
- ;;
-
- *)
- echo ""
- echo "error: argument to --with-readdisplay must be \"yes\", \"no\", or a directory."
- echo " If it is a directory, then \`DIR/include' will be added to"
- echo " the -I list, and \`DIR/lib' will be added to the -L list."
- exit 1
- ;;
- esac
-
-if test "$with_readdisplay" = yes; then
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_compile "$LINENO" "X11/extensions/readdisplay.h" "ac_cv_header_X11_extensions_readdisplay_h" "#include <X11/Xlib.h>
-"
-if test "x$ac_cv_header_X11_extensions_readdisplay_h" = xyes; then :
- $as_echo "#define HAVE_READ_DISPLAY_EXTENSION 1" >>confdefs.h
-
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-elif test "$with_readdisplay" != no; then
- echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
- exit 1
-fi
-
-###############################################################################
-#
# Check for the XSHM server extension.
#
###############################################################################
@@ -9751,10 +12395,12 @@ have_xshm=no
with_xshm_req=unspecified
# Check whether --with-xshm-ext was given.
-if test "${with_xshm_ext+set}" = set; then :
+if test ${with_xshm_ext+y}
+then :
withval=$with_xshm_ext; with_xshm="$withval"; with_xshm_req="$withval"
-else
- with_xshm=yes
+else case e in #(
+ e) with_xshm=yes ;;
+esac
fi
case "$with_xshm" in
@@ -9762,28 +12408,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM headers" >&5
-$as_echo_n "checking for XSHM headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XSHM headers" >&5
+printf %s "checking for XSHM headers... " >&6; }
d=$with_xshm/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM libs" >&5
-$as_echo_n "checking for XSHM libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XSHM libs" >&5
+printf %s "checking for XSHM libs... " >&6; }
d=$with_xshm/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -9812,7 +12458,8 @@ if test "$with_xshm" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XShm.h" "ac_cv_header_X11_extensions_XShm_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_XShm_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_XShm_h" = xyes
+then :
have_xshm=yes
fi
@@ -9828,8 +12475,9 @@ fi
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_ipc_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_ipc_h" = xyes
+then :
have_xshm=yes
fi
@@ -9846,8 +12494,9 @@ fi
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_shm_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_shm_h" = xyes
+then :
have_xshm=yes
fi
@@ -9883,46 +12532,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmQueryExtension in -lXextSam" >&5
-$as_echo_n "checking for XShmQueryExtension in -lXextSam... " >&6; }
-if ${ac_cv_lib_XextSam_XShmQueryExtension+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XShmQueryExtension in -lXextSam" >&5
+printf %s "checking for XShmQueryExtension in -lXextSam... " >&6; }
+if test ${ac_cv_lib_XextSam_XShmQueryExtension+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XShmQueryExtension ();
+char XShmQueryExtension (void);
int
-main ()
+main (void)
{
return XShmQueryExtension ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_XextSam_XShmQueryExtension=yes
-else
- ac_cv_lib_XextSam_XShmQueryExtension=no
+else case e in #(
+ e) ac_cv_lib_XextSam_XShmQueryExtension=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmQueryExtension" >&5
-$as_echo "$ac_cv_lib_XextSam_XShmQueryExtension" >&6; }
-if test "x$ac_cv_lib_XextSam_XShmQueryExtension" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmQueryExtension" >&5
+printf "%s\n" "$ac_cv_lib_XextSam_XShmQueryExtension" >&6; }
+if test "x$ac_cv_lib_XextSam_XShmQueryExtension" = xyes
+then :
have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -9935,7 +12593,7 @@ fi
# if that succeeded, then we've really got it.
if test "$have_xshm" = yes; then
- $as_echo "#define HAVE_XSHM_EXTENSION 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XSHM_EXTENSION 1" >>confdefs.h
fi
@@ -9954,10 +12612,12 @@ have_xdbe=no
with_xdbe_req=unspecified
# Check whether --with-xdbe-ext was given.
-if test "${with_xdbe_ext+set}" = set; then :
+if test ${with_xdbe_ext+y}
+then :
withval=$with_xdbe_ext; with_xdbe="$withval"; with_xdbe_req="$withval"
-else
- with_xdbe=yes
+else case e in #(
+ e) with_xdbe=yes ;;
+esac
fi
case "$with_xdbe" in
@@ -9965,28 +12625,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER headers" >&5
-$as_echo_n "checking for DOUBLE-BUFFER headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER headers" >&5
+printf %s "checking for DOUBLE-BUFFER headers... " >&6; }
d=$with_xdbe/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER libs" >&5
-$as_echo_n "checking for DOUBLE-BUFFER libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER libs" >&5
+printf %s "checking for DOUBLE-BUFFER libs... " >&6; }
d=$with_xdbe/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -10013,13 +12673,14 @@ if test "$with_xdbe" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_extensions_Xdbe_h" = xyes; then :
+if test "x$ac_cv_header_X11_extensions_Xdbe_h" = xyes
+then :
have_xdbe=yes
fi
CPPFLAGS="$ac_save_CPPFLAGS"
if test "$have_xdbe" = yes; then
- $as_echo "#define HAVE_DOUBLE_BUFFER_EXTENSION 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_DOUBLE_BUFFER_EXTENSION 1" >>confdefs.h
fi
@@ -10067,10 +12728,12 @@ have_xkb=no
with_xkb_req=unspecified
# Check whether --with-xkb-ext was given.
-if test "${with_xkb_ext+set}" = set; then :
+if test ${with_xkb_ext+y}
+then :
withval=$with_xkb_ext; with_xkb="$withval"; with_xkb_req="$withval"
-else
- with_xkb=yes
+else case e in #(
+ e) with_xkb=yes ;;
+esac
fi
case "$with_xkb" in
@@ -10078,28 +12741,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB headers" >&5
-$as_echo_n "checking for XKB headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XKB headers" >&5
+printf %s "checking for XKB headers... " >&6; }
d=$with_xkb/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB libs" >&5
-$as_echo_n "checking for XKB libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XKB libs" >&5
+printf %s "checking for XKB libs... " >&6; }
d=$with_xkb/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -10126,13 +12789,14 @@ if test "$with_xkb" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "X11/XKBlib.h" "ac_cv_header_X11_XKBlib_h" "#include <X11/Xlib.h>
"
-if test "x$ac_cv_header_X11_XKBlib_h" = xyes; then :
+if test "x$ac_cv_header_X11_XKBlib_h" = xyes
+then :
have_xkb=yes
fi
CPPFLAGS="$ac_save_CPPFLAGS"
if test "$have_xkb" = yes; then
- $as_echo "#define HAVE_XKB 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XKB 1" >>confdefs.h
fi
@@ -10147,8 +12811,8 @@ fi
#
###############################################################################
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XHPDisableReset in X11/XHPlib.h" >&5
-$as_echo_n "checking for XHPDisableReset in X11/XHPlib.h... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XHPDisableReset in X11/XHPlib.h" >&5
+printf %s "checking for XHPDisableReset in X11/XHPlib.h... " >&6; }
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
@@ -10162,15 +12826,17 @@ $as_echo_n "checking for XHPDisableReset in X11/XHPlib.h... " >&6; }
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "XHPDisableReset" >/dev/null 2>&1; then :
- $as_echo "#define HAVE_XHPDISABLERESET 1" >>confdefs.h
+ $EGREP_TRADITIONAL "XHPDisableReset" >/dev/null 2>&1
+then :
+ printf "%s\n" "#define HAVE_XHPDISABLERESET 1" >>confdefs.h
SAVER_LIBS="-lXhp11 $SAVER_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -rf conftest*
@@ -10186,10 +12852,12 @@ have_proc_interrupts=no
with_proc_interrupts_req=unspecified
# Check whether --with-proc-interrupts was given.
-if test "${with_proc_interrupts+set}" = set; then :
+if test ${with_proc_interrupts+y}
+then :
withval=$with_proc_interrupts; with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"
-else
- with_proc_interrupts=no
+else case e in #(
+ e) with_proc_interrupts=no ;;
+esac
fi
if test "$with_proc_interrupts" = yes; then
@@ -10201,24 +12869,26 @@ if test "$with_proc_interrupts" = yes; then
have_proc_interrupts=yes
if test -f /proc/interrupts; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /proc/interrupts contains keyboard data" >&5
-$as_echo_n "checking whether /proc/interrupts contains keyboard data... " >&6; }
-if ${ac_cv_have_proc_interrupts+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_have_proc_interrupts=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether /proc/interrupts contains keyboard data" >&5
+printf %s "checking whether /proc/interrupts contains keyboard data... " >&6; }
+if test ${ac_cv_have_proc_interrupts+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_have_proc_interrupts=no
if grep 'keyboard\|i8042' /proc/interrupts >/dev/null 2>&1 ; then
ac_cv_have_proc_interrupts=yes
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_proc_interrupts" >&5
-$as_echo "$ac_cv_have_proc_interrupts" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_proc_interrupts" >&5
+printf "%s\n" "$ac_cv_have_proc_interrupts" >&6; }
have_proc_interrupts=$ac_cv_have_proc_interrupts
fi
if test "$have_proc_interrupts" = yes; then
- $as_echo "#define HAVE_PROC_INTERRUPTS 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_PROC_INTERRUPTS 1" >>confdefs.h
fi
@@ -10238,10 +12908,12 @@ have_proc_oom=no
with_proc_oom_req=unspecified
# Check whether --with-proc-oom was given.
-if test "${with_proc_oom+set}" = set; then :
+if test ${with_proc_oom+y}
+then :
withval=$with_proc_oom; with_proc_oom="$withval"; with_proc_oom_req="$withval"
-else
- with_proc_oom=yes
+else case e in #(
+ e) with_proc_oom=yes ;;
+esac
fi
if test "$with_proc_oom_req" = yes; then
@@ -10250,32 +12922,34 @@ if test "$with_proc_oom_req" = yes; then
# without a proper /proc filesystem.
#
have_proc_oom=yes
- $as_echo "#define HAVE_PROC_OOM 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_PROC_OOM 1" >>confdefs.h
elif test "$with_proc_oom_req" = unspecified; then
have_proc_oom=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /proc/$$/oom_score_adj exists" >&5
-$as_echo_n "checking whether /proc/$$/oom_score_adj exists... " >&6; }
-if ${ac_cv_have_proc_oom+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_have_proc_oom=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether /proc/$$/oom_score_adj exists" >&5
+printf %s "checking whether /proc/$$/oom_score_adj exists... " >&6; }
+if test ${ac_cv_have_proc_oom+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_have_proc_oom=no
if test -f /proc/$$/oom_score_adj; then
ac_cv_have_proc_oom=yes
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_proc_oom" >&5
-$as_echo "$ac_cv_have_proc_oom" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_proc_oom" >&5
+printf "%s\n" "$ac_cv_have_proc_oom" >&6; }
have_proc_oom=$ac_cv_have_proc_oom
if test "$have_proc_oom" = yes; then
- $as_echo "#define HAVE_PROC_OOM 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_PROC_OOM 1" >>confdefs.h
# Only root can write to /proc/$$/oom_score_adj, even though it's us.
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabling setuid to opt out of OOM-killer." >&5
-$as_echo "enabling setuid to opt out of OOM-killer." >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: enabling setuid to opt out of OOM-killer." >&5
+printf "%s\n" "enabling setuid to opt out of OOM-killer." >&6; }
setuid_auth=yes
fi
@@ -10296,10 +12970,12 @@ systemd_halfassed=no
systemd_too_old=no
# Check whether --with-systemd was given.
-if test "${with_systemd+set}" = set; then :
+if test ${with_systemd+y}
+then :
withval=$with_systemd; with_systemd="$withval"; with_systemd_req="$withval"
-else
- with_systemd=yes
+else case e in #(
+ e) with_systemd=yes ;;
+esac
fi
case "$with_systemd" in
@@ -10307,28 +12983,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd headers" >&5
-$as_echo_n "checking for systemd headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for systemd headers" >&5
+printf %s "checking for systemd headers... " >&6; }
d=$with_systemd/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd libs" >&5
-$as_echo_n "checking for systemd libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for systemd libs" >&5
+printf %s "checking for systemd libs... " >&6; }
d=$with_systemd/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -10364,24 +13040,28 @@ if test "$with_systemd" = yes; then
fi
if test "$have_systemd" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd includes" >&5
-$as_echo_n "checking for libsystemd includes... " >&6; }
-if ${ac_cv_systemd_config_cflags+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs`
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_cflags" >&5
-$as_echo "$ac_cv_systemd_config_cflags" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsystemd libs" >&5
-$as_echo_n "checking for libsystemd libs... " >&6; }
-if ${ac_cv_systemd_config_libs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd includes" >&5
+printf %s "checking for libsystemd includes... " >&6; }
+if test ${ac_cv_systemd_config_cflags+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_systemd_config_cflags=`$pkg_config --cflags $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_cflags" >&5
+printf "%s\n" "$ac_cv_systemd_config_cflags" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd libs" >&5
+printf %s "checking for libsystemd libs... " >&6; }
+if test ${ac_cv_systemd_config_libs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_systemd_config_libs=`$pkg_config --libs $pkgs` ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_libs" >&5
-$as_echo "$ac_cv_systemd_config_libs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_systemd_config_libs" >&5
+printf "%s\n" "$ac_cv_systemd_config_libs" >&6; }
fi
ac_systemd_config_cflags=$ac_cv_systemd_config_cflags
@@ -10402,8 +13082,9 @@ $as_echo "$ac_cv_systemd_config_libs" >&6; }
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-bus.h" "ac_cv_header_systemd_sd_bus_h" "$ac_includes_default"
-if test "x$ac_cv_header_systemd_sd_bus_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "systemd/sd-bus.h" "ac_cv_header_systemd_sd_bus_h" "$ac_includes_default"
+if test "x$ac_cv_header_systemd_sd_bus_h" = xyes
+then :
have_systemd=yes
fi
@@ -10416,8 +13097,9 @@ fi
# we have the headers, now check for the libraries
have_systemd=no
systemd_halfassed=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability..." >&5
-$as_echo "checking for libsystemd usability..." >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability..." >&5
+printf "%s\n" "checking for libsystemd usability..." >&6; }
+ # sd_bus_track_count_name was added in some later version of systemd.
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -10437,43 +13119,51 @@ $as_echo "checking for libsystemd usability..." >&6; }
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sd_bus_open_system in -lc" >&5
-$as_echo_n "checking for sd_bus_open_system in -lc... " >&6; }
-if ${ac_cv_lib_c_sd_bus_open_system+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sd_bus_track_count_name in -lc" >&5
+printf %s "checking for sd_bus_track_count_name in -lc... " >&6; }
+if test ${ac_cv_lib_c_sd_bus_track_count_name+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $ac_systemd_config_libs -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char sd_bus_open_system ();
+char sd_bus_track_count_name (void);
int
-main ()
+main (void)
{
-return sd_bus_open_system ();
+return sd_bus_track_count_name ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_c_sd_bus_open_system=yes
-else
- ac_cv_lib_c_sd_bus_open_system=no
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_c_sd_bus_track_count_name=yes
+else case e in #(
+ e) ac_cv_lib_c_sd_bus_track_count_name=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_open_system" >&5
-$as_echo "$ac_cv_lib_c_sd_bus_open_system" >&6; }
-if test "x$ac_cv_lib_c_sd_bus_open_system" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_track_count_name" >&5
+printf "%s\n" "$ac_cv_lib_c_sd_bus_track_count_name" >&6; }
+if test "x$ac_cv_lib_c_sd_bus_track_count_name" = xyes
+then :
have_systemd=yes; systemd_halfassed=no
fi
@@ -10484,8 +13174,8 @@ fi
fi
if test "$have_systemd" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability... no" >&5
-$as_echo "checking for libsystemd usability... no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability... no" >&5
+printf "%s\n" "checking for libsystemd usability... no" >&6; }
fi
fi
@@ -10493,7 +13183,7 @@ if test "$have_systemd" = yes; then
INCLUDES="$INCLUDES $ac_systemd_config_cflags"
EXES_SYSTEMD='$(EXES_SYSTEMD)'
SYSTEMD_LIBS="$ac_systemd_config_libs"
- $as_echo "#define HAVE_LIBSYSTEMD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_LIBSYSTEMD 1" >>confdefs.h
else
EXES_SYSTEMD=''
@@ -10502,6 +13192,234 @@ fi
###############################################################################
#
+# Check for -lelogind, a stripped down subset of systemd.
+#
+###############################################################################
+
+have_elogind=no
+with_elogind_req=unspecified
+elogind_halfassed=no
+elogind_too_old=no
+
+# Check whether --with-elogind was given.
+if test ${with_elogind+y}
+then :
+ withval=$with_elogind; with_elogind="$withval"; with_elogind_req="$withval"
+else case e in #(
+ e) with_elogind=yes ;;
+esac
+fi
+
+ case "$with_elogind" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for elogind headers" >&5
+printf %s "checking for elogind headers... " >&6; }
+ d=$with_elogind/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for elogind libs" >&5
+printf %s "checking for elogind libs... " >&6; }
+ d=$with_elogind/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_elogind_req="yes"
+ with_elogind=$with_elogind_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-elogind must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+if test "$with_elogind" != yes -a "$with_elogind" != no ; then
+ echo "error: must be yes or no: --with-elogind=$with_elogind"
+ exit 1
+fi
+
+if test "$with_elogind" = yes; then
+
+ pkgs=''
+ ok="yes"
+ pkg_check_version libelogind 221
+ have_elogind="$ok"
+
+ if test "$have_elogind" = no; then
+ if $pkg_config --exists libelogind ; then
+ elogind_too_old=yes
+ fi
+ fi
+
+ if test "$have_elogind" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libelogind includes" >&5
+printf %s "checking for libelogind includes... " >&6; }
+if test ${ac_cv_elogind_config_cflags+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_elogind_config_cflags=`$pkg_config --cflags $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_elogind_config_cflags" >&5
+printf "%s\n" "$ac_cv_elogind_config_cflags" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libelogind libs" >&5
+printf %s "checking for libelogind libs... " >&6; }
+if test ${ac_cv_elogind_config_libs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_elogind_config_libs=`$pkg_config --libs $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_elogind_config_libs" >&5
+printf "%s\n" "$ac_cv_elogind_config_libs" >&6; }
+ fi
+
+ ac_elogind_config_cflags=$ac_cv_elogind_config_cflags
+ ac_elogind_config_libs=$ac_cv_elogind_config_libs
+
+ if test "$have_elogind" = yes; then
+ #
+ # we appear to have libelogind; check for headers/libs to be sure.
+ #
+ ac_save_elogind_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_elogind_config_cflags"
+
+ have_elogind=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "elogind/sd-bus.h" "ac_cv_header_elogind_sd_bus_h" "$ac_includes_default"
+if test "x$ac_cv_header_elogind_sd_bus_h" = xyes
+then :
+ have_elogind=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ CPPFLAGS="$ac_save_elogind_CPPFLAGS"
+ fi
+
+ if test "$have_elogind" = yes; then
+ # we have the headers, now check for the libraries
+ have_elogind=no
+ elogind_halfassed=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libelogind usability..." >&5
+printf "%s\n" "checking for libelogind usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sd_bus_track_count_name in -lc" >&5
+printf %s "checking for sd_bus_track_count_name in -lc... " >&6; }
+if test ${ac_cv_lib_c_sd_bus_track_count_name+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $ac_elogind_config_libs -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sd_bus_track_count_name (void);
+int
+main (void)
+{
+return sd_bus_track_count_name ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_c_sd_bus_track_count_name=yes
+else case e in #(
+ e) ac_cv_lib_c_sd_bus_track_count_name=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_track_count_name" >&5
+printf "%s\n" "$ac_cv_lib_c_sd_bus_track_count_name" >&6; }
+if test "x$ac_cv_lib_c_sd_bus_track_count_name" = xyes
+then :
+ have_elogind=yes; elogind_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ if test "$have_elogind" = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libelogind usability... no" >&5
+printf "%s\n" "checking for libelogind usability... no" >&6; }
+ fi
+fi
+
+if test "$have_elogind" = yes; then
+ INCLUDES="$INCLUDES $ac_elogind_config_cflags"
+ EXES_SYSTEMD='$(EXES_SYSTEMD)'
+ SYSTEMD_LIBS="$ac_elogind_config_libs"
+ printf "%s\n" "#define HAVE_LIBELOGIND 1" >>confdefs.h
+
+fi
+
+###############################################################################
+#
# The --enable-locking option
#
# Note: "configure --help" list all "--enable" options before any
@@ -10512,24 +13430,26 @@ fi
###############################################################################
# Check whether --enable-locking was given.
-if test "${enable_locking+set}" = set; then :
+if test ${enable_locking+y}
+then :
enableval=$enable_locking; # This is documented elsewhere because of --enable/--with option sorting.
enable_locking="$enableval"
-else
- if test "$ac_macosx" = yes; then
+else case e in #(
+ e) if test "$ac_macosx" = yes; then
# We can't lock on macOS, so default to not compiling in support for it.
# But allow --enable-locking to override that, so I can debug Linux locking
# under macOS X11.
enable_locking=no
else
enable_locking=yes
- fi
+ fi ;;
+esac
fi
if test "$enable_locking" = yes; then
true
elif test "$enable_locking" = no; then
- $as_echo "#define NO_LOCKING 1" >>confdefs.h
+ printf "%s\n" "#define NO_LOCKING 1" >>confdefs.h
else
echo "error: must be yes or no: --enable-locking=$enable_locking"
@@ -10543,15 +13463,17 @@ fi
###############################################################################
# Check whether --enable-root-passwd was given.
-if test "${enable_root_passwd+set}" = set; then :
+if test ${enable_root_passwd+y}
+then :
enableval=$enable_root_passwd; # This is documented elsewhere because of --enable/--with option sorting.
enable_root_passwd="$enableval"
-else
- enable_root_passwd=no
+else case e in #(
+ e) enable_root_passwd=no ;;
+esac
fi
if test "$enable_root_passwd" = yes; then
- $as_echo "#define ALLOW_ROOT_PASSWD 1" >>confdefs.h
+ printf "%s\n" "#define ALLOW_ROOT_PASSWD 1" >>confdefs.h
true
elif test "$enable_root_passwd" != no; then
@@ -10587,29 +13509,35 @@ have_pam=no
with_pam_req=unspecified
# Check whether --with-pam was given.
-if test "${with_pam+set}" = set; then :
+if test ${with_pam+y}
+then :
withval=$with_pam; with_pam="$withval"; with_pam_req="$withval"
-else
- with_pam=$with_pam_default
+else case e in #(
+ e) with_pam=$with_pam_default ;;
+esac
fi
# Check whether --with-pam_service_name was given.
-if test "${with_pam_service_name+set}" = set; then :
+if test ${with_pam_service_name+y}
+then :
withval=$with_pam_service_name; pam_service_name="$withval"
-else
- pam_service_name="xscreensaver"
+else case e in #(
+ e) pam_service_name="xscreensaver" ;;
+esac
fi
# Check whether --enable-pam-check-account-type was given.
-if test "${enable_pam_check_account_type+set}" = set; then :
+if test ${enable_pam_check_account_type+y}
+then :
enableval=$enable_pam_check_account_type; # This is documented elsewhere because of --enable/--with option sorting.
enable_pam_check_account_type="$enableval"
-else
- enable_pam_check_account_type=no
+else case e in #(
+ e) enable_pam_check_account_type=no ;;
+esac
fi
if test "$enable_pam_check_account_type" = yes ; then
- $as_echo "#define PAM_CHECK_ACCOUNT_TYPE 1" >>confdefs.h
+ printf "%s\n" "#define PAM_CHECK_ACCOUNT_TYPE 1" >>confdefs.h
true
elif test "$enable_pam_check_account_type" != no ; then
@@ -10622,28 +13550,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM headers" >&5
-$as_echo_n "checking for PAM headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM headers" >&5
+printf %s "checking for PAM headers... " >&6; }
d=$with_pam/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM libs" >&5
-$as_echo_n "checking for PAM libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM libs" >&5
+printf %s "checking for PAM libs... " >&6; }
d=$with_pam/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -10661,12 +13589,13 @@ $as_echo "not found ($d: no such directory)" >&6; }
esac
if test "$enable_locking" = yes -a "$with_pam" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM" >&5
-$as_echo_n "checking for PAM... " >&6; }
-if ${ac_cv_pam+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM" >&5
+printf %s "checking for PAM... " >&6; }
+if test ${ac_cv_pam+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -10677,171 +13606,197 @@ else
/* end confdefs.h. */
#include <security/pam_appl.h>
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_pam=yes
-else
- ac_cv_pam=no
+else case e in #(
+ e) ac_cv_pam=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pam" >&5
-$as_echo "$ac_cv_pam" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pam" >&5
+printf "%s\n" "$ac_cv_pam" >&6; }
if test "$ac_cv_pam" = yes ; then
have_pam=yes
- $as_echo "#define HAVE_PAM 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_PAM 1" >>confdefs.h
- cat >>confdefs.h <<_ACEOF
-#define PAM_SERVICE_NAME "$pam_service_name"
-_ACEOF
+ printf "%s\n" "#define PAM_SERVICE_NAME \"$pam_service_name\"" >>confdefs.h
PASSWD_LIBS="${PASSWD_LIBS} -lpam"
# libpam typically requires dlopen and dlsym. On FreeBSD,
# those are in libc. On Linux and Solaris, they're in libdl.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dlopen ();
+char dlopen (void);
int
-main ()
+main (void)
{
return dlopen ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dl_dlopen=yes
-else
- ac_cv_lib_dl_dlopen=no
+else case e in #(
+ e) ac_cv_lib_dl_dlopen=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
PASSWD_LIBS="${PASSWD_LIBS} -ldl"
fi
# On Linux, sigtimedwait() is in libc; on Solaris, it's in librt.
have_timedwait=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lc" >&5
-$as_echo_n "checking for sigtimedwait in -lc... " >&6; }
-if ${ac_cv_lib_c_sigtimedwait+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lc" >&5
+printf %s "checking for sigtimedwait in -lc... " >&6; }
+if test ${ac_cv_lib_c_sigtimedwait+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char sigtimedwait ();
+char sigtimedwait (void);
int
-main ()
+main (void)
{
return sigtimedwait ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_sigtimedwait=yes
-else
- ac_cv_lib_c_sigtimedwait=no
+else case e in #(
+ e) ac_cv_lib_c_sigtimedwait=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sigtimedwait" >&5
-$as_echo "$ac_cv_lib_c_sigtimedwait" >&6; }
-if test "x$ac_cv_lib_c_sigtimedwait" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sigtimedwait" >&5
+printf "%s\n" "$ac_cv_lib_c_sigtimedwait" >&6; }
+if test "x$ac_cv_lib_c_sigtimedwait" = xyes
+then :
have_timedwait=yes
- $as_echo "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
fi
if test "$have_timedwait" = no ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lrt" >&5
-$as_echo_n "checking for sigtimedwait in -lrt... " >&6; }
-if ${ac_cv_lib_rt_sigtimedwait+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lrt" >&5
+printf %s "checking for sigtimedwait in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sigtimedwait+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char sigtimedwait ();
+char sigtimedwait (void);
int
-main ()
+main (void)
{
return sigtimedwait ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_rt_sigtimedwait=yes
-else
- ac_cv_lib_rt_sigtimedwait=no
+else case e in #(
+ e) ac_cv_lib_rt_sigtimedwait=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sigtimedwait" >&5
-$as_echo "$ac_cv_lib_rt_sigtimedwait" >&6; }
-if test "x$ac_cv_lib_rt_sigtimedwait" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sigtimedwait" >&5
+printf "%s\n" "$ac_cv_lib_rt_sigtimedwait" >&6; }
+if test "x$ac_cv_lib_rt_sigtimedwait" = xyes
+then :
have_timedwait=yes
- $as_echo "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
PASSWD_LIBS="${PASSWD_LIBS} -lrt"
fi
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to call pam_strerror" >&5
-$as_echo_n "checking how to call pam_strerror... " >&6; }
- if ${ac_cv_pam_strerror_args+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to call pam_strerror" >&5
+printf %s "checking how to call pam_strerror... " >&6; }
+ if test ${ac_cv_pam_strerror_args+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -10854,18 +13809,19 @@ else
#include <stdlib.h>
#include <security/pam_appl.h>
int
-main ()
+main (void)
{
pam_handle_t *pamh = 0;
- char *s = pam_strerror(pamh, PAM_SUCCESS);
+ const char *s = pam_strerror(pamh, PAM_SUCCESS);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_pam_strerror_args=2
-else
-
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -10878,54 +13834,59 @@ else
#include <stdlib.h>
#include <security/pam_appl.h>
int
-main ()
+main (void)
{
-char *s =
+const char *s =
pam_strerror(PAM_SUCCESS);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_pam_strerror_args=1
-else
- ac_pam_strerror_args=0
+else case e in #(
+ e) ac_pam_strerror_args=0 ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CPPFLAGS="$ac_save_CPPFLAGS"
- ac_cv_pam_strerror_args=$ac_pam_strerror_args
+ ac_cv_pam_strerror_args=$ac_pam_strerror_args ;;
+esac
fi
ac_pam_strerror_args=$ac_cv_pam_strerror_args
if test "$ac_pam_strerror_args" = 1 ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: one argument" >&5
-$as_echo "one argument" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: one argument" >&5
+printf "%s\n" "one argument" >&6; }
elif test "$ac_pam_strerror_args" = 2 ; then
- $as_echo "#define PAM_STRERROR_TWO_ARGS 1" >>confdefs.h
+ printf "%s\n" "#define PAM_STRERROR_TWO_ARGS 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: two arguments" >&5
-$as_echo "two arguments" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: two arguments" >&5
+printf "%s\n" "two arguments" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
+printf "%s\n" "unknown" >&6; }
fi
# Check pam_fail_delay
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking pam_fail_delay in -lpam" >&5
-$as_echo_n "checking pam_fail_delay in -lpam... " >&6; }
- if ${ac_cv_pam_fail_delay+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_LDFLAGS="$LDFLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pam_fail_delay in -lpam" >&5
+printf %s "checking pam_fail_delay in -lpam... " >&6; }
+ if test ${ac_cv_pam_fail_delay+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_save_LDFLAGS="$LDFLAGS"
LDFLAGS="-lpam"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <security/pam_appl.h>
int
-main ()
+main (void)
{
pam_handle_t *pamh = 0;
unsigned int usec = 1;
@@ -10934,25 +13895,28 @@ pam_handle_t *pamh = 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_pam_fail_delay=yes
-else
- ac_pam_fail_delay=no
+else case e in #(
+ e) ac_pam_fail_delay=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
ac_cv_pam_fail_delay=$ac_pam_fail_delay,
- LDFLAGS=$ac_save_LDFLAGS
+ LDFLAGS=$ac_save_LDFLAGS ;;
+esac
fi
if test "$ac_pam_fail_delay" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- $as_echo "#define HAVE_PAM_FAIL_DELAY 1" >>confdefs.h
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ printf "%s\n" "#define HAVE_PAM_FAIL_DELAY 1" >>confdefs.h
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -10969,10 +13933,12 @@ have_kerberos5=no
with_kerberos_req=unspecified
# Check whether --with-kerberos was given.
-if test "${with_kerberos+set}" = set; then :
+if test ${with_kerberos+y}
+then :
withval=$with_kerberos; with_kerberos="$withval"; with_kerberos_req="$withval"
-else
- with_kerberos=yes
+else case e in #(
+ e) with_kerberos=yes ;;
+esac
fi
case "$with_kerberos" in
@@ -10980,28 +13946,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos headers" >&5
-$as_echo_n "checking for Kerberos headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Kerberos headers" >&5
+printf %s "checking for Kerberos headers... " >&6; }
d=$with_kerberos/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos libs" >&5
-$as_echo_n "checking for Kerberos libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Kerberos libs" >&5
+printf %s "checking for Kerberos libs... " >&6; }
d=$with_kerberos/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -11019,12 +13985,13 @@ $as_echo "not found ($d: no such directory)" >&6; }
esac
if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos 4" >&5
-$as_echo_n "checking for Kerberos 4... " >&6; }
-if ${ac_cv_kerberos+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Kerberos 4" >&5
+printf %s "checking for Kerberos 4... " >&6; }
+if test ${ac_cv_kerberos+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11035,29 +14002,33 @@ else
/* end confdefs.h. */
#include <krb.h>
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_kerberos=yes
-else
- ac_cv_kerberos=no
+else case e in #(
+ e) ac_cv_kerberos=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kerberos" >&5
-$as_echo "$ac_cv_kerberos" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos 5" >&5
-$as_echo_n "checking for Kerberos 5... " >&6; }
-if ${ac_cv_kerberos5+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kerberos" >&5
+printf "%s\n" "$ac_cv_kerberos" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Kerberos 5" >&5
+printf %s "checking for Kerberos 5... " >&6; }
+if test ${ac_cv_kerberos5+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11068,27 +14039,30 @@ else
/* end confdefs.h. */
#include <kerberosIV/krb.h>
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_kerberos5=yes
-else
- ac_cv_kerberos5=no
+else case e in #(
+ e) ac_cv_kerberos5=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kerberos5" >&5
-$as_echo "$ac_cv_kerberos5" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kerberos5" >&5
+printf "%s\n" "$ac_cv_kerberos5" >&6; }
if test "$ac_cv_kerberos" = yes ; then
have_kerberos=yes
- $as_echo "#define HAVE_KERBEROS 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_KERBEROS 1" >>confdefs.h
fi
@@ -11123,46 +14097,55 @@ $as_echo "$ac_cv_kerberos5" >&6; }
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for krb_get_tf_realm in -lkrb4" >&5
-$as_echo_n "checking for krb_get_tf_realm in -lkrb4... " >&6; }
-if ${ac_cv_lib_krb4_krb_get_tf_realm+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for krb_get_tf_realm in -lkrb4" >&5
+printf %s "checking for krb_get_tf_realm in -lkrb4... " >&6; }
+if test ${ac_cv_lib_krb4_krb_get_tf_realm+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lkrb4 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char krb_get_tf_realm ();
+char krb_get_tf_realm (void);
int
-main ()
+main (void)
{
return krb_get_tf_realm ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_krb4_krb_get_tf_realm=yes
-else
- ac_cv_lib_krb4_krb_get_tf_realm=no
+else case e in #(
+ e) ac_cv_lib_krb4_krb_get_tf_realm=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_krb4_krb_get_tf_realm" >&5
-$as_echo "$ac_cv_lib_krb4_krb_get_tf_realm" >&6; }
-if test "x$ac_cv_lib_krb4_krb_get_tf_realm" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_krb4_krb_get_tf_realm" >&5
+printf "%s\n" "$ac_cv_lib_krb4_krb_get_tf_realm" >&6; }
+if test "x$ac_cv_lib_krb4_krb_get_tf_realm" = xyes
+then :
have_kerberos=yes
-else
- have_kerberos=no
+else case e in #(
+ e) have_kerberos=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -11171,14 +14154,14 @@ fi
if test "$have_kerberos" = yes ; then
have_kerberos5=yes
- $as_echo "#define HAVE_KERBEROS 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_KERBEROS 1" >>confdefs.h
- $as_echo "#define HAVE_KERBEROS5 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_KERBEROS5 1" >>confdefs.h
else
have_kerberos5=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&5
-$as_echo "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&5
+printf "%s\n" "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&2;}
fi
fi
@@ -11209,43 +14192,51 @@ $as_echo "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerber
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
-$as_echo_n "checking for crypt in -lcrypt... " >&6; }
-if ${ac_cv_lib_crypt_crypt+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
+printf %s "checking for crypt in -lcrypt... " >&6; }
+if test ${ac_cv_lib_crypt_crypt+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lcrypt $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char crypt ();
+char crypt (void);
int
-main ()
+main (void)
{
return crypt ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_crypt_crypt=yes
-else
- ac_cv_lib_crypt_crypt=no
+else case e in #(
+ e) ac_cv_lib_crypt_crypt=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
-$as_echo "$ac_cv_lib_crypt_crypt" >&6; }
-if test "x$ac_cv_lib_crypt_crypt" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
+printf "%s\n" "$ac_cv_lib_crypt_crypt" >&6; }
+if test "x$ac_cv_lib_crypt_crypt" = xyes
+then :
PASSWD_LIBS="$PASSWD_LIBS -lcrypt"
fi
@@ -11260,53 +14251,64 @@ fi
if test "$have_kerberos" = yes ; then
ac_fn_c_check_func "$LINENO" "res_search" "ac_cv_func_res_search"
-if test "x$ac_cv_func_res_search" = xyes; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search in -lresolv" >&5
-$as_echo_n "checking for res_search in -lresolv... " >&6; }
-if ${ac_cv_lib_resolv_res_search+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+if test "x$ac_cv_func_res_search" = xyes
+then :
+
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_search in -lresolv" >&5
+printf %s "checking for res_search in -lresolv... " >&6; }
+if test ${ac_cv_lib_resolv_res_search+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lresolv $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char res_search ();
+char res_search (void);
int
-main ()
+main (void)
{
return res_search ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_resolv_res_search=yes
-else
- ac_cv_lib_resolv_res_search=no
+else case e in #(
+ e) ac_cv_lib_resolv_res_search=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_search" >&5
-$as_echo "$ac_cv_lib_resolv_res_search" >&6; }
-if test "x$ac_cv_lib_resolv_res_search" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_search" >&5
+printf "%s\n" "$ac_cv_lib_resolv_res_search" >&6; }
+if test "x$ac_cv_lib_resolv_res_search" = xyes
+then :
PASSWD_LIBS="${PASSWD_LIBS} -lresolv"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't find DNS resolver libraries needed for Kerberos" >&5
-$as_echo "$as_me: WARNING: Can't find DNS resolver libraries needed for Kerberos" >&2;}
-
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Can't find DNS resolver libraries needed for Kerberos" >&5
+printf "%s\n" "$as_me: WARNING: Can't find DNS resolver libraries needed for Kerberos" >&2;}
+ ;;
+esac
fi
-
+ ;;
+esac
fi
fi
@@ -11322,10 +14324,12 @@ have_shadow=no
with_shadow_req=unspecified
# Check whether --with-shadow was given.
-if test "${with_shadow+set}" = set; then :
+if test ${with_shadow+y}
+then :
withval=$with_shadow; with_shadow="$withval"; with_shadow_req="$withval"
-else
- with_shadow=yes
+else case e in #(
+ e) with_shadow=yes ;;
+esac
fi
case "$with_shadow" in
@@ -11333,28 +14337,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shadow password headers" >&5
-$as_echo_n "checking for shadow password headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shadow password headers" >&5
+printf %s "checking for shadow password headers... " >&6; }
d=$with_shadow/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shadow password libs" >&5
-$as_echo_n "checking for shadow password libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shadow password libs" >&5
+printf %s "checking for shadow password libs... " >&6; }
d=$with_shadow/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -11383,12 +14387,13 @@ fi
###############################################################################
if test "$with_shadow" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sun-style shadow passwords" >&5
-$as_echo_n "checking for Sun-style shadow passwords... " >&6; }
-if ${ac_cv_sun_adjunct+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Sun-style shadow passwords" >&5
+printf %s "checking for Sun-style shadow passwords... " >&6; }
+if test ${ac_cv_sun_adjunct+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11404,7 +14409,7 @@ else
#include <sys/audit.h>
#include <pwdadj.h>
int
-main ()
+main (void)
{
struct passwd_adjunct *p = getpwanam("nobody");
const char *pw = p->pwa_passwd;
@@ -11412,16 +14417,19 @@ struct passwd_adjunct *p = getpwanam("nobody");
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_sun_adjunct=yes
-else
- ac_cv_sun_adjunct=no
+else case e in #(
+ e) ac_cv_sun_adjunct=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sun_adjunct" >&5
-$as_echo "$ac_cv_sun_adjunct" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sun_adjunct" >&5
+printf "%s\n" "$ac_cv_sun_adjunct" >&6; }
if test "$ac_cv_sun_adjunct" = yes; then
have_shadow_adjunct=yes
have_shadow=yes
@@ -11436,12 +14444,13 @@ fi
###############################################################################
if test "$with_shadow" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DEC-style shadow passwords" >&5
-$as_echo_n "checking for DEC-style shadow passwords... " >&6; }
-if ${ac_cv_enhanced_passwd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DEC-style shadow passwords" >&5
+printf %s "checking for DEC-style shadow passwords... " >&6; }
+if test ${ac_cv_enhanced_passwd+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11457,7 +14466,7 @@ else
#include <sys/security.h>
#include <prot.h>
int
-main ()
+main (void)
{
struct pr_passwd *p;
const char *pw;
@@ -11469,16 +14478,19 @@ struct pr_passwd *p;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_enhanced_passwd=yes
-else
- ac_cv_enhanced_passwd=no
+else case e in #(
+ e) ac_cv_enhanced_passwd=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enhanced_passwd" >&5
-$as_echo "$ac_cv_enhanced_passwd" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enhanced_passwd" >&5
+printf "%s\n" "$ac_cv_enhanced_passwd" >&6; }
if test $ac_cv_enhanced_passwd = yes; then
have_shadow_enhanced=yes
have_shadow=yes
@@ -11488,85 +14500,102 @@ $as_echo "$ac_cv_enhanced_passwd" >&6; }
# (I'm told it needs -lcurses too, but I don't understand why.)
# But on DEC, it's in -lsecurity.
#
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getprpwnam in -lprot" >&5
-$as_echo_n "checking for getprpwnam in -lprot... " >&6; }
-if ${ac_cv_lib_prot_getprpwnam+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getprpwnam in -lprot" >&5
+printf %s "checking for getprpwnam in -lprot... " >&6; }
+if test ${ac_cv_lib_prot_getprpwnam+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lprot -lx $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char getprpwnam ();
+char getprpwnam (void);
int
-main ()
+main (void)
{
return getprpwnam ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_prot_getprpwnam=yes
-else
- ac_cv_lib_prot_getprpwnam=no
+else case e in #(
+ e) ac_cv_lib_prot_getprpwnam=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_prot_getprpwnam" >&5
-$as_echo "$ac_cv_lib_prot_getprpwnam" >&6; }
-if test "x$ac_cv_lib_prot_getprpwnam" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_prot_getprpwnam" >&5
+printf "%s\n" "$ac_cv_lib_prot_getprpwnam" >&6; }
+if test "x$ac_cv_lib_prot_getprpwnam" = xyes
+then :
PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getprpwnam in -lsecurity" >&5
-$as_echo_n "checking for getprpwnam in -lsecurity... " >&6; }
-if ${ac_cv_lib_security_getprpwnam+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getprpwnam in -lsecurity" >&5
+printf %s "checking for getprpwnam in -lsecurity... " >&6; }
+if test ${ac_cv_lib_security_getprpwnam+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsecurity $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char getprpwnam ();
+char getprpwnam (void);
int
-main ()
+main (void)
{
return getprpwnam ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_security_getprpwnam=yes
-else
- ac_cv_lib_security_getprpwnam=no
+else case e in #(
+ e) ac_cv_lib_security_getprpwnam=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_security_getprpwnam" >&5
-$as_echo "$ac_cv_lib_security_getprpwnam" >&6; }
-if test "x$ac_cv_lib_security_getprpwnam" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_security_getprpwnam" >&5
+printf "%s\n" "$ac_cv_lib_security_getprpwnam" >&6; }
+if test "x$ac_cv_lib_security_getprpwnam" = xyes
+then :
PASSWD_LIBS="$PASSWD_LIBS -lsecurity"
fi
-
+ ;;
+esac
fi
fi
@@ -11579,12 +14608,13 @@ fi
###############################################################################
if test "$with_shadow" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HP-style shadow passwords" >&5
-$as_echo_n "checking for HP-style shadow passwords... " >&6; }
-if ${ac_cv_hpux_passwd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HP-style shadow passwords" >&5
+printf %s "checking for HP-style shadow passwords... " >&6; }
+if test ${ac_cv_hpux_passwd+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11600,7 +14630,7 @@ else
#include <hpsecurity.h>
#include <prot.h>
int
-main ()
+main (void)
{
struct s_passwd *p = getspwnam("nobody");
const char *pw = p->pw_passwd;
@@ -11608,59 +14638,70 @@ struct s_passwd *p = getspwnam("nobody");
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_hpux_passwd=yes
-else
- ac_cv_hpux_passwd=no
+else case e in #(
+ e) ac_cv_hpux_passwd=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hpux_passwd" >&5
-$as_echo "$ac_cv_hpux_passwd" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hpux_passwd" >&5
+printf "%s\n" "$ac_cv_hpux_passwd" >&6; }
if test "$ac_cv_hpux_passwd" = yes; then
have_shadow_hpux=yes
have_shadow=yes
setuid_auth=yes
# on HPUX, bigcrypt is in -lsec
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bigcrypt in -lsec" >&5
-$as_echo_n "checking for bigcrypt in -lsec... " >&6; }
-if ${ac_cv_lib_sec_bigcrypt+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bigcrypt in -lsec" >&5
+printf %s "checking for bigcrypt in -lsec... " >&6; }
+if test ${ac_cv_lib_sec_bigcrypt+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsec $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char bigcrypt ();
+char bigcrypt (void);
int
-main ()
+main (void)
{
return bigcrypt ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_sec_bigcrypt=yes
-else
- ac_cv_lib_sec_bigcrypt=no
+else case e in #(
+ e) ac_cv_lib_sec_bigcrypt=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sec_bigcrypt" >&5
-$as_echo "$ac_cv_lib_sec_bigcrypt" >&6; }
-if test "x$ac_cv_lib_sec_bigcrypt" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sec_bigcrypt" >&5
+printf "%s\n" "$ac_cv_lib_sec_bigcrypt" >&6; }
+if test "x$ac_cv_lib_sec_bigcrypt" = xyes
+then :
PASSWD_LIBS="$PASSWD_LIBS -lsec"
fi
@@ -11680,19 +14721,21 @@ fi
###############################################################################
if test "$with_shadow" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FreeBSD-style shadow passwords" >&5
-$as_echo_n "checking for FreeBSD-style shadow passwords... " >&6; }
-if ${ac_cv_master_passwd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -f /etc/master.passwd ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for FreeBSD-style shadow passwords" >&5
+printf %s "checking for FreeBSD-style shadow passwords... " >&6; }
+if test ${ac_cv_master_passwd+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -f /etc/master.passwd ; then
ac_cv_master_passwd=yes
else
ac_cv_master_passwd=no
- fi
+ fi ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_master_passwd" >&5
-$as_echo "$ac_cv_master_passwd" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_master_passwd" >&5
+printf "%s\n" "$ac_cv_master_passwd" >&6; }
if test "$ac_cv_master_passwd" = yes; then
setuid_auth=yes
fi
@@ -11706,12 +14749,13 @@ fi
###############################################################################
if test "$with_shadow" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenBSD-style shadow passwords" >&5
-$as_echo_n "checking for OpenBSD-style shadow passwords... " >&6; }
-if ${ac_cv_pwnam_shadow+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenBSD-style shadow passwords" >&5
+printf %s "checking for OpenBSD-style shadow passwords... " >&6; }
+if test ${ac_cv_pwnam_shadow+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11725,7 +14769,7 @@ else
#include <sys/types.h>
#include <pwd.h>
int
-main ()
+main (void)
{
struct spwd *p = getspnam_shadow("nobody");
const char *pw = p->pw_passwd;
@@ -11733,16 +14777,19 @@ struct spwd *p = getspnam_shadow("nobody");
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_pwnam_shadow=yes
-else
- ac_cv_pwnam_shadow=no
+else case e in #(
+ e) ac_cv_pwnam_shadow=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pwnam_shadow" >&5
-$as_echo "$ac_cv_pwnam_shadow" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pwnam_shadow" >&5
+printf "%s\n" "$ac_cv_pwnam_shadow" >&6; }
if test "$ac_cv_pwnam_shadow" = yes; then
have_pwnam_shadow=yes
@@ -11760,12 +14807,13 @@ fi
###############################################################################
if test "$with_shadow" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for generic shadow passwords" >&5
-$as_echo_n "checking for generic shadow passwords... " >&6; }
-if ${ac_cv_shadow+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for generic shadow passwords" >&5
+printf %s "checking for generic shadow passwords... " >&6; }
+if test ${ac_cv_shadow+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -11780,7 +14828,7 @@ else
#include <pwd.h>
#include <shadow.h>
int
-main ()
+main (void)
{
struct spwd *p = getspnam("nobody");
const char *pw = p->sp_pwdp;
@@ -11788,16 +14836,19 @@ struct spwd *p = getspnam("nobody");
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_shadow=yes
-else
- ac_cv_shadow=no
+else case e in #(
+ e) ac_cv_shadow=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_shadow" >&5
-$as_echo "$ac_cv_shadow" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_shadow" >&5
+printf "%s\n" "$ac_cv_shadow" >&6; }
if test "$ac_cv_shadow" = yes; then
have_shadow=yes
@@ -11808,84 +14859,100 @@ $as_echo "$ac_cv_shadow" >&6; }
# On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
have_getspnam=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lc" >&5
-$as_echo_n "checking for getspnam in -lc... " >&6; }
-if ${ac_cv_lib_c_getspnam+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lc" >&5
+printf %s "checking for getspnam in -lc... " >&6; }
+if test ${ac_cv_lib_c_getspnam+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char getspnam ();
+char getspnam (void);
int
-main ()
+main (void)
{
return getspnam ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_getspnam=yes
-else
- ac_cv_lib_c_getspnam=no
+else case e in #(
+ e) ac_cv_lib_c_getspnam=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_getspnam" >&5
-$as_echo "$ac_cv_lib_c_getspnam" >&6; }
-if test "x$ac_cv_lib_c_getspnam" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_getspnam" >&5
+printf "%s\n" "$ac_cv_lib_c_getspnam" >&6; }
+if test "x$ac_cv_lib_c_getspnam" = xyes
+then :
have_getspnam=yes
fi
if test "$have_getspnam" = no ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lgen" >&5
-$as_echo_n "checking for getspnam in -lgen... " >&6; }
-if ${ac_cv_lib_gen_getspnam+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lgen" >&5
+printf %s "checking for getspnam in -lgen... " >&6; }
+if test ${ac_cv_lib_gen_getspnam+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lgen $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char getspnam ();
+char getspnam (void);
int
-main ()
+main (void)
{
return getspnam ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_gen_getspnam=yes
-else
- ac_cv_lib_gen_getspnam=no
+else case e in #(
+ e) ac_cv_lib_gen_getspnam=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_getspnam" >&5
-$as_echo "$ac_cv_lib_gen_getspnam" >&6; }
-if test "x$ac_cv_lib_gen_getspnam" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_getspnam" >&5
+printf "%s\n" "$ac_cv_lib_gen_getspnam" >&6; }
+if test "x$ac_cv_lib_gen_getspnam" = xyes
+then :
have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen"
fi
@@ -11903,129 +14970,106 @@ if test "$enable_locking" = yes ; then
# On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
have_crypt=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lc" >&5
-$as_echo_n "checking for crypt in -lc... " >&6; }
-if ${ac_cv_lib_c_crypt+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for crypt in -lc" >&5
+printf %s "checking for crypt in -lc... " >&6; }
+if test ${ac_cv_lib_c_crypt+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char crypt ();
+char crypt (void);
int
-main ()
+main (void)
{
return crypt ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_crypt=yes
-else
- ac_cv_lib_c_crypt=no
+else case e in #(
+ e) ac_cv_lib_c_crypt=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_crypt" >&5
-$as_echo "$ac_cv_lib_c_crypt" >&6; }
-if test "x$ac_cv_lib_c_crypt" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_crypt" >&5
+printf "%s\n" "$ac_cv_lib_c_crypt" >&6; }
+if test "x$ac_cv_lib_c_crypt" = xyes
+then :
have_crypt=yes
fi
if test "$have_crypt" = no ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
-$as_echo_n "checking for crypt in -lcrypt... " >&6; }
-if ${ac_cv_lib_crypt_crypt+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
+printf %s "checking for crypt in -lcrypt... " >&6; }
+if test ${ac_cv_lib_crypt_crypt+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lcrypt $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char crypt ();
+char crypt (void);
int
-main ()
+main (void)
{
return crypt ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_crypt_crypt=yes
-else
- ac_cv_lib_crypt_crypt=no
+else case e in #(
+ e) ac_cv_lib_crypt_crypt=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
-$as_echo "$ac_cv_lib_crypt_crypt" >&6; }
-if test "x$ac_cv_lib_crypt_crypt" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
+printf "%s\n" "$ac_cv_lib_crypt_crypt" >&6; }
+if test "x$ac_cv_lib_crypt_crypt" = xyes
+then :
have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt"
fi
fi
fi
-###############################################################################
-#
-# Strongly suspect that this hasn't been used in years. Also, the same
-# goal is achieved by xscreensaver-auth in XScreenSaver 6. -- jwz, 2021
-#
-# Check for external password helper
-# On SuSE in 1993, instead of having xscreensaver be a setuid program,
-# they fork an external program that takes the password on stdin, and
-# returns true if that password is a valid one. Then only that smaller
-# program needs to be setuid.
-#
-# (Note that this external program is not a GUI: the GUI is still
-# all in xscreensaver itself; the external program just does auth.)
-#
-###############################################################################
-
-#have_passwd_helper=no
-#with_passwd_helper_req=unspecified
-#
-#AC_ARG_WITH(passwd-helper,
-#[ --with-passwd-helper Include support for external password verification.],
-# [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
-## no HANDLE_X_PATH_ARG for this one
-#
-#if test "$enable_locking" = no ; then
-# with_passwd_helper_req=no
-# with_passwd_helper=no
-#fi
-#
-#case "$with_passwd_helper" in
-# ""|no) : ;;
-# /*)
-# AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
-# have_passwd_helper=yes;;
-# *)
-# echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
-# exit 1
-#esac
-
# Most of the above shadow mechanisms will have set setuid_auth to yes,
# if they were found. But, on some systems, we need setuid even when
# using plain old vanilla passwords.
@@ -12039,19 +15083,19 @@ if test "$enable_locking" = yes -a "$have_pam" = no ; then
fi
if test "$have_shadow_adjunct" = yes ; then
- $as_echo "#define HAVE_ADJUNCT_PASSWD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_ADJUNCT_PASSWD 1" >>confdefs.h
elif test "$have_shadow_enhanced" = yes ; then
- $as_echo "#define HAVE_ENHANCED_PASSWD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_ENHANCED_PASSWD 1" >>confdefs.h
elif test "$have_shadow_hpux" = yes ; then
- $as_echo "#define HAVE_HPUX_PASSWD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_HPUX_PASSWD 1" >>confdefs.h
elif test "$have_shadow" = yes ; then
- $as_echo "#define HAVE_SHADOW_PASSWD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_SHADOW_PASSWD 1" >>confdefs.h
elif test "$have_pwnam_shadow" = yes ; then
- $as_echo "#define HAVE_PWNAM_SHADOW_PASSWD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_PWNAM_SHADOW_PASSWD 1" >>confdefs.h
fi
@@ -12067,10 +15111,12 @@ have_gtk=no
with_gtk_req=unspecified
# Check whether --with-gtk was given.
-if test "${with_gtk+set}" = set; then :
+if test ${with_gtk+y}
+then :
withval=$with_gtk; with_gtk="$withval"; with_gtk_req="$withval"
-else
- with_gtk=yes
+else case e in #(
+ e) with_gtk=yes ;;
+esac
fi
# if --with-gtk=/directory/ was specified, remember that directory so that
@@ -12089,28 +15135,28 @@ esac
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk headers" >&5
-$as_echo_n "checking for Gtk headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Gtk headers" >&5
+printf %s "checking for Gtk headers... " >&6; }
d=$with_gtk/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk libs" >&5
-$as_echo_n "checking for Gtk libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Gtk libs" >&5
+printf %s "checking for Gtk libs... " >&6; }
d=$with_gtk/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -12137,13 +15183,14 @@ gtk_halfassed=no
if test "$with_gtk" = yes; then
have_gtk=no
+ pkgs=''
ok="yes"
- pkg_check_version gtk+-2.0 2.22.0 ; ac_gtk_version_string="$vers"
- pkg_check_version gmodule-2.0 2.0.0
- pkg_check_version libxml-2.0 2.4.6
- pkg_check_version gdk-pixbuf-2.0 2.0.0
- pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+ pkg_check_version gtk+-3.0 3.0.0 ; ac_gtk_version_string="$vers"
+ pkg_check_version gmodule-2.0 2.0.0
+ pkg_check_version libxml-2.0 2.4.6
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
have_gtk="$ok"
+ gtk_pkgs="$pkgs"
if test "$have_gtk" = no; then
if test -n "$ac_gtk_version_string" ; then
@@ -12153,24 +15200,28 @@ if test "$with_gtk" = yes; then
fi
if test "$have_gtk" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk includes" >&5
-$as_echo_n "checking for Gtk includes... " >&6; }
-if ${ac_cv_gtk_config_cflags+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gtk_config_cflags" >&5
-$as_echo "$ac_cv_gtk_config_cflags" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk libs" >&5
-$as_echo_n "checking for Gtk libs... " >&6; }
-if ${ac_cv_gtk_config_libs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Gtk includes" >&5
+printf %s "checking for Gtk includes... " >&6; }
+if test ${ac_cv_gtk_config_cflags+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs` ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gtk_config_libs" >&5
-$as_echo "$ac_cv_gtk_config_libs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gtk_config_cflags" >&5
+printf "%s\n" "$ac_cv_gtk_config_cflags" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Gtk libs" >&5
+printf %s "checking for Gtk libs... " >&6; }
+if test ${ac_cv_gtk_config_libs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gtk_config_libs" >&5
+printf "%s\n" "$ac_cv_gtk_config_libs" >&6; }
fi
ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
@@ -12178,20 +15229,34 @@ $as_echo "$ac_cv_gtk_config_libs" >&6; }
GTK_DATADIR=""
if test "$have_gtk" = yes; then
- GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ GTK_DATADIR=`$pkg_config --variable=prefix gtk+-3.0`
GTK_DATADIR="$GTK_DATADIR/share"
fi
if test "$have_gtk" = yes; then
INCLUDES="$INCLUDES $ac_gtk_config_cflags"
GTK_LIBS="$GTK_LIBS $ac_gtk_config_libs"
- $as_echo "#define HAVE_GTK 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GTK 1" >>confdefs.h
- $as_echo "#define HAVE_GTK2 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XML 1" >>confdefs.h
- $as_echo "#define HAVE_XML 1" >>confdefs.h
+ fi
+ if test "$have_gtk" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Glib resource compiler" >&5
+printf %s "checking for Glib resource compiler... " >&6; }
+if test ${ac_cv_glib_res+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_glib_res=`$pkg_config --variable=glib_compile_resources gio-2.0` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_glib_res" >&5
+printf "%s\n" "$ac_cv_glib_res" >&6; }
+ GLIB_COMPILE_RESOURCES="$ac_cv_glib_res"
fi
+
fi
# Check for the various Gnome help and URL loading programs.
@@ -12202,38 +15267,44 @@ if test "$have_gtk" = yes; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_gnome_open_program+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$gnome_open_program"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_gnome_open_program+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$gnome_open_program"; then
ac_cv_prog_gnome_open_program="$gnome_open_program" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_gnome_open_program="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
gnome_open_program=$ac_cv_prog_gnome_open_program
if test -n "$gnome_open_program"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gnome_open_program" >&5
-$as_echo "$gnome_open_program" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gnome_open_program" >&5
+printf "%s\n" "$gnome_open_program" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$gnome_open_program" && break
@@ -12243,38 +15314,44 @@ done
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_gnome_url_show_program+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$gnome_url_show_program"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_gnome_url_show_program+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$gnome_url_show_program"; then
ac_cv_prog_gnome_url_show_program="$gnome_url_show_program" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_gnome_url_show_program="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
gnome_url_show_program=$ac_cv_prog_gnome_url_show_program
if test -n "$gnome_url_show_program"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gnome_url_show_program" >&5
-$as_echo "$gnome_url_show_program" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gnome_url_show_program" >&5
+printf "%s\n" "$gnome_url_show_program" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$gnome_url_show_program" && break
@@ -12292,10 +15369,12 @@ have_motif=no
with_motif_req=unspecified
# Check whether --with-motif was given.
-if test "${with_motif+set}" = set; then :
+if test ${with_motif+y}
+then :
withval=$with_motif; with_motif="$withval"; with_motif_req="$withval"
-else
- with_motif=no
+else case e in #(
+ e) with_motif=no ;;
+esac
fi
case "$with_motif" in
@@ -12303,28 +15382,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Motif headers" >&5
-$as_echo_n "checking for Motif headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Motif headers" >&5
+printf %s "checking for Motif headers... " >&6; }
d=$with_motif/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Motif libs" >&5
-$as_echo_n "checking for Motif libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Motif libs" >&5
+printf %s "checking for Motif libs... " >&6; }
d=$with_motif/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -12359,9 +15438,10 @@ if test "$with_motif" = yes; then
#include <stdio.h>
#include <X11/Intrinsic.h>
"
-if test "x$ac_cv_header_Xm_Xm_h" = xyes; then :
+if test "x$ac_cv_header_Xm_Xm_h" = xyes
+then :
have_motif=yes
- $as_echo "#define HAVE_MOTIF 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_MOTIF 1" >>confdefs.h
MOTIF_LIBS="$MOTIF_LIBS -lXm"
fi
@@ -12381,8 +15461,9 @@ if test "$have_motif" = yes; then
#include <stdio.h>
#include <X11/Intrinsic.h>
"
-if test "x$ac_cv_header_Xm_ComboBox_h" = xyes; then :
- $as_echo "#define HAVE_XMCOMBOBOX 1" >>confdefs.h
+if test "x$ac_cv_header_Xm_ComboBox_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_XMCOMBOBOX 1" >>confdefs.h
fi
@@ -12397,12 +15478,13 @@ fi
have_lesstif=no
if test "$have_motif" = yes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Motif is really LessTif" >&5
-$as_echo_n "checking whether Motif is really LessTif... " >&6; }
-if ${ac_cv_have_lesstif+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Motif is really LessTif" >&5
+printf %s "checking whether Motif is really LessTif... " >&6; }
+if test ${ac_cv_have_lesstif+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
@@ -12413,23 +15495,26 @@ else
/* end confdefs.h. */
#include <Xm/Xm.h>
int
-main ()
+main (void)
{
long vers = LesstifVersion;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_have_lesstif=yes
-else
- ac_cv_have_lesstif=no
+else case e in #(
+ e) ac_cv_have_lesstif=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CPPFLAGS="$ac_save_CPPFLAGS"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_lesstif" >&5
-$as_echo "$ac_cv_have_lesstif" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_lesstif" >&5
+printf "%s\n" "$ac_cv_have_lesstif" >&6; }
have_lesstif=$ac_cv_have_lesstif
fi
@@ -12439,23 +15524,25 @@ lesstif_version_string=unknown
if test "$have_lesstif" = yes ; then
ltv=unknown
echo unknown > conftest-lt
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking LessTif version number" >&5
-$as_echo_n "checking LessTif version number... " >&6; }
-if ${ac_cv_lesstif_version_string+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LessTif version number" >&5
+printf %s "checking LessTif version number... " >&6; }
+if test ${ac_cv_lesstif_version_string+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- if test "$cross_compiling" = yes; then :
+ if test "$cross_compiling" = yes
+then :
ac_cv_lesstif_version=unknown
ac_cv_lesstif_version_string=unknown
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
#include <Xm/Xm.h>
@@ -12468,22 +15555,26 @@ else
exit(0);
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
ltv=`cat conftest-lt`
ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
ac_cv_lesstif_version_string=`echo $ltv | sed 's/.* //'`
-else
- ac_cv_lesstif_version=unknown
- ac_cv_lesstif_version_string=unknown
+else case e in #(
+ e) ac_cv_lesstif_version=unknown
+ ac_cv_lesstif_version_string=unknown ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
- CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lesstif_version_string" >&5
-$as_echo "$ac_cv_lesstif_version_string" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lesstif_version_string" >&5
+printf "%s\n" "$ac_cv_lesstif_version_string" >&6; }
rm -rf conftest-lt
lesstif_version=$ac_cv_lesstif_version
lesstif_version_string=$ac_cv_lesstif_version_string
@@ -12493,23 +15584,25 @@ fi
if test "$have_motif" = yes ; then
mtv=unknown
echo unknown > conftest-mt
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking Motif version number" >&5
-$as_echo_n "checking Motif version number... " >&6; }
-if ${ac_cv_motif_version_string+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking Motif version number" >&5
+printf %s "checking Motif version number... " >&6; }
+if test ${ac_cv_motif_version_string+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- if test "$cross_compiling" = yes; then :
+ if test "$cross_compiling" = yes
+then :
ac_cv_motif_version=unknown
ac_cv_motif_version_string=unknown
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
#include <Xm/Xm.h>
@@ -12522,22 +15615,26 @@ else
exit(0);
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
mtv=`cat conftest-mt`
ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
ac_cv_motif_version_string=`echo $mtv | sed 's/.* //'`
-else
- ac_cv_motif_version=unknown
- ac_cv_motif_version_string=unknown
+else case e in #(
+ e) ac_cv_motif_version=unknown
+ ac_cv_motif_version_string=unknown ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
- CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_CPPFLAGS" ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_motif_version_string" >&5
-$as_echo "$ac_cv_motif_version_string" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_motif_version_string" >&5
+printf "%s\n" "$ac_cv_motif_version_string" >&6; }
rm -rf conftest-mt
motif_version=$ac_cv_motif_version
motif_version_string=$ac_cv_motif_version_string
@@ -12576,46 +15673,55 @@ if test "$have_motif" = yes ; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XpQueryExtension in -lXp" >&5
-$as_echo_n "checking for XpQueryExtension in -lXp... " >&6; }
-if ${ac_cv_lib_Xp_XpQueryExtension+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XpQueryExtension in -lXp" >&5
+printf %s "checking for XpQueryExtension in -lXp... " >&6; }
+if test ${ac_cv_lib_Xp_XpQueryExtension+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXp -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XpQueryExtension ();
+char XpQueryExtension (void);
int
-main ()
+main (void)
{
return XpQueryExtension ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xp_XpQueryExtension=yes
-else
- ac_cv_lib_Xp_XpQueryExtension=no
+else case e in #(
+ e) ac_cv_lib_Xp_XpQueryExtension=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xp_XpQueryExtension" >&5
-$as_echo "$ac_cv_lib_Xp_XpQueryExtension" >&6; }
-if test "x$ac_cv_lib_Xp_XpQueryExtension" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xp_XpQueryExtension" >&5
+printf "%s\n" "$ac_cv_lib_Xp_XpQueryExtension" >&6; }
+if test "x$ac_cv_lib_Xp_XpQueryExtension" = xyes
+then :
have_xp_ext=yes; MOTIF_LIBS="$MOTIF_LIBS -lXp"
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -12651,46 +15757,55 @@ if test "$have_motif" = yes ; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Xsetlocale in -lXintl" >&5
-$as_echo_n "checking for _Xsetlocale in -lXintl... " >&6; }
-if ${ac_cv_lib_Xintl__Xsetlocale+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _Xsetlocale in -lXintl" >&5
+printf %s "checking for _Xsetlocale in -lXintl... " >&6; }
+if test ${ac_cv_lib_Xintl__Xsetlocale+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lXintl -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char _Xsetlocale ();
+char _Xsetlocale (void);
int
-main ()
+main (void)
{
return _Xsetlocale ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_Xintl__Xsetlocale=yes
-else
- ac_cv_lib_Xintl__Xsetlocale=no
+else case e in #(
+ e) ac_cv_lib_Xintl__Xsetlocale=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xintl__Xsetlocale" >&5
-$as_echo "$ac_cv_lib_Xintl__Xsetlocale" >&6; }
-if test "x$ac_cv_lib_Xintl__Xsetlocale" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xintl__Xsetlocale" >&5
+printf "%s\n" "$ac_cv_lib_Xintl__Xsetlocale" >&6; }
+if test "x$ac_cv_lib_Xintl__Xsetlocale" = xyes
+then :
have_xintl=yes
-else
- have_xintl=no
+else case e in #(
+ e) have_xintl=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -12716,10 +15831,12 @@ default_login_manager_3='lxdm -c USER_SWITCH'
default_login_manager_4='dm-tool switch-to-greeter'
# Check whether --with-login-manager was given.
-if test "${with_login_manager+set}" = set; then :
+if test ${with_login_manager+y}
+then :
withval=$with_login_manager; with_login_manager="$withval"; with_login_manager_req="$withval"
-else
- with_login_manager=yes
+else case e in #(
+ e) with_login_manager=yes ;;
+esac
fi
# no HANDLE_X_PATH_ARG for this one
@@ -12744,12 +15861,13 @@ case "$with_login_manager_req" in
unset ac_cv_path_login_manager_tmp # don't cache
# Extract the first word of "$login_manager_tmp", so it can be a program name with args.
set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_login_manager_tmp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $login_manager_tmp in
[\\/]* | ?:[\\/]*)
ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
;;
@@ -12758,11 +15876,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -12770,15 +15892,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
login_manager_tmp=$ac_cv_path_login_manager_tmp
if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+printf "%s\n" "$login_manager_tmp" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test ! -z "$login_manager_tmp" ; then
@@ -12791,12 +15914,13 @@ fi
unset ac_cv_path_login_manager_tmp # don't cache
# Extract the first word of "$login_manager_tmp", so it can be a program name with args.
set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_login_manager_tmp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $login_manager_tmp in
[\\/]* | ?:[\\/]*)
ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
;;
@@ -12805,11 +15929,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -12817,15 +15945,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
login_manager_tmp=$ac_cv_path_login_manager_tmp
if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+printf "%s\n" "$login_manager_tmp" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test ! -z "$login_manager_tmp" ; then
@@ -12838,12 +15967,13 @@ fi
unset ac_cv_path_login_manager_tmp # don't cache
# Extract the first word of "$login_manager_tmp", so it can be a program name with args.
set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_login_manager_tmp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $login_manager_tmp in
[\\/]* | ?:[\\/]*)
ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
;;
@@ -12852,11 +15982,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -12864,15 +15998,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
login_manager_tmp=$ac_cv_path_login_manager_tmp
if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+printf "%s\n" "$login_manager_tmp" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test ! -z "$login_manager_tmp" ; then
@@ -12885,12 +16020,13 @@ fi
unset ac_cv_path_login_manager_tmp # don't cache
# Extract the first word of "$login_manager_tmp", so it can be a program name with args.
set dummy $login_manager_tmp; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_login_manager_tmp+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $login_manager_tmp in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_login_manager_tmp+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) case $login_manager_tmp in
[\\/]* | ?:[\\/]*)
ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
;;
@@ -12899,11 +16035,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -12911,15 +16051,16 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
login_manager_tmp=$ac_cv_path_login_manager_tmp
if test -n "$login_manager_tmp"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
-$as_echo "$login_manager_tmp" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+printf "%s\n" "$login_manager_tmp" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test ! -z "$login_manager_tmp" ; then
@@ -12939,16 +16080,16 @@ ac_cv_login_manager_program="$with_login_manager"
NEW_LOGIN_COMMAND_P=''
NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for login manager" >&5
-$as_echo_n "checking for login manager... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for login manager" >&5
+printf %s "checking for login manager... " >&6; }
if test -z "$NEW_LOGIN_COMMAND" ; then
NEW_LOGIN_COMMAND="$default_login_manager_1"
NEW_LOGIN_COMMAND_P='! '
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND (disabled)" >&5
-$as_echo "$NEW_LOGIN_COMMAND (disabled)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND (disabled)" >&5
+printf "%s\n" "$NEW_LOGIN_COMMAND (disabled)" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND" >&5
-$as_echo "$NEW_LOGIN_COMMAND" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND" >&5
+printf "%s\n" "$NEW_LOGIN_COMMAND" >&6; }
fi
###############################################################################
@@ -12962,10 +16103,12 @@ have_imagedir=no
with_imagedir_req=unspecified
# Check whether --with-image-directory was given.
-if test "${with_image_directory+set}" = set; then :
+if test ${with_image_directory+y}
+then :
withval=$with_image_directory; with_imagedir="$withval"; with_imagedir_req="$withval"
-else
- with_imagedir=yes
+else case e in #(
+ e) with_imagedir=yes ;;
+esac
fi
# no HANDLE_X_PATH_ARG for this one
@@ -12973,14 +16116,14 @@ fi
case "$with_imagedir" in
/*)
# absolute path
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $with_imagedir" >&5
-$as_echo_n "checking for image directory $with_imagedir... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for image directory $with_imagedir" >&5
+printf %s "checking for image directory $with_imagedir... " >&6; }
if test -d "$with_imagedir" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
with_imagedir=""
fi
;;
@@ -12998,23 +16141,23 @@ $as_echo "no" >&6; }
"/Library/Desktop Pictures/" \
; do
if test -z "$with_imagedir"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $dd" >&5
-$as_echo_n "checking for image directory $dd... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for image directory $dd" >&5
+printf %s "checking for image directory $dd... " >&6; }
if test -d "$dd"; then
if ( ls "$dd" | grep -q ... ) >&- 2>&- ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
with_imagedir="$dd"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: empty" >&5
-$as_echo "empty" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: empty" >&5
+printf "%s\n" "empty" >&6; }
if test -z "$fallback_imgdir"; then
fallback_imgdir="$dd"
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
done
@@ -13052,10 +16195,12 @@ have_textfile=no
with_textfile_req=unspecified
# Check whether --with-text-file was given.
-if test "${with_text_file+set}" = set; then :
+if test ${with_text_file+y}
+then :
withval=$with_text_file; with_textfile="$withval"; with_textfile_req="$withval"
-else
- with_textfile=yes
+else case e in #(
+ e) with_textfile=yes ;;
+esac
fi
# no HANDLE_X_PATH_ARG for this one
@@ -13063,14 +16208,14 @@ fi
case "$with_textfile" in
/*)
# absolute path
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $with_textfile" >&5
-$as_echo_n "checking for text file $with_textfile... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for text file $with_textfile" >&5
+printf %s "checking for text file $with_textfile... " >&6; }
if test -f "$with_textfile" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
with_textfile=""
fi
;;
@@ -13088,16 +16233,16 @@ $as_echo "no" >&6; }
"/usr/share/doc/debian/debian-manifesto" \
; do
if test -z "$with_textfile"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $f" >&5
-$as_echo_n "checking for text file $f... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for text file $f" >&5
+printf %s "checking for text file $f... " >&6; }
f=`/bin/ls $f 2>&- | head -1`
if test -f "$f" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
with_textfile="$f"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
done
@@ -13126,10 +16271,12 @@ have_browser=no
with_browser_req=unspecified
# Check whether --with-browser was given.
-if test "${with_browser+set}" = set; then :
+if test ${with_browser+y}
+then :
withval=$with_browser; with_browser="$withval"; with_browser_req="$withval"
-else
- with_browser=no
+else case e in #(
+ e) with_browser=no ;;
+esac
fi
# no HANDLE_X_PATH_ARG for this one
@@ -13140,18 +16287,18 @@ case "$with_browser" in
* )
WITH_BROWSER=$with_browser
gnome_open_program=$with_browser
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for browser $with_browser" >&5
-$as_echo_n "checking for browser $with_browser... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for browser $with_browser" >&5
+printf %s "checking for browser $with_browser... " >&6; }
with_browser_fullpath=`which $with_browser 2>/dev/null`
case $with_browser_fullpath in
/* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
have_browser=yes
;;
* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
# Only warning: we don't want to install all packages for the
# dependency of the browser in building stage...
echo "WARNING: browser not found: --with-browser=$with_browser"
@@ -13264,10 +16411,11 @@ with_pthread_req=unspecified
#serial 30
-# This is what autoupdate's m4 run will expand. It fires
-# the warning (with _au_warn_XXX), outputs it into the
-# updated configure.ac (with AC_DIAGNOSE), and then outputs
-# the replacement expansion.
+# This is what autoupdate's m4 run will expand. It fires the warning
+# (with _au_warn_XXX), outputs it into the updated configure.ac (with
+# m4_warn), and then outputs the replacement expansion. We need extra
+# quotation around the m4_warn and dnl so they will be written
+# unexpanded into the updated configure.ac.
# This is an auxiliary macro that is also run when
# autoupdate runs m4. It simply calls m4_warning, but
@@ -13276,36 +16424,41 @@ with_pthread_req=unspecified
# order to expand this macro's arguments, not AU_DEFUN's.
# Finally, this is the expansion that is picked up by
-# autoconf. It tells the user to run autoupdate, and
-# then outputs the replacement expansion. We do not care
-# about autoupdate's warning because that contains
-# information on what to do *after* running autoupdate.
+# autoconf, causing NAME to expand to NEW-CODE, plus
+# (if SILENT is not "silent") a m4_warning telling the
+# maintainer to run autoupdate. We don't issue MESSAGE
+# from autoconf, because that's instructions for what
+# to do *after* running autoupdate.
# Check whether --with-pthread was given.
-if test "${with_pthread+set}" = set; then :
+if test ${with_pthread+y}
+then :
withval=$with_pthread; # This is documented after --with-gl in --with-xft.
with_pthread="$withval"; with_pthread_req="$withval"
-else
- with_pthread=yes
+else case e in #(
+ e) with_pthread=yes ;;
+esac
fi
if test "$with_pthread" = yes; then
# AX_PTHREAD might want a different compiler.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if ${ac_cv_target+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "x$target_alias" = x; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test "x$target_alias" = x; then
ac_cv_target=$ac_cv_host
else
- ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
@@ -13329,74 +16482,6 @@ test -n "$target_alias" &&
test "$program_prefix$program_suffix$program_transform_name" = \
NONENONEs,x,x, &&
program_prefix=${target_alias}-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
- for ac_i in 1 2 3 4 5 6 7; do
- ac_script="$ac_script$as_nl$ac_script"
- done
- echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
- { ac_script=; unset ac_script;}
- if test -z "$SED"; then
- ac_path_SED_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_SED" || continue
-# Check for GNU ac_path_SED and select it if it is found.
- # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
- ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo '' >> "conftest.nl"
- "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_SED_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_SED="$ac_path_SED"
- ac_path_SED_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_SED_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_SED"; then
- as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
- fi
-else
- ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
- rm -rf conftest.sed
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@@ -13417,41 +16502,47 @@ if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
ax_pthread_save_CC="$CC"
ax_pthread_save_CFLAGS="$CFLAGS"
ax_pthread_save_LIBS="$LIBS"
- if test "x$PTHREAD_CC" != "x"; then :
+ if test "x$PTHREAD_CC" != "x"
+then :
CC="$PTHREAD_CC"
fi
- if test "x$PTHREAD_CXX" != "x"; then :
+ if test "x$PTHREAD_CXX" != "x"
+then :
CXX="$PTHREAD_CXX"
fi
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
-$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
+printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char pthread_join ();
+char pthread_join (void);
int
-main ()
+main (void)
{
return pthread_join ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ax_pthread_ok=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
-$as_echo "$ax_pthread_ok" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+printf "%s\n" "$ax_pthread_ok" >&6; }
if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
@@ -13529,9 +16620,10 @@ case $target_os in
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
-$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
+ $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
+printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
fi
rm -rf conftest*
@@ -13553,12 +16645,13 @@ esac
# Are we compiling with Clang?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
-$as_echo_n "checking whether $CC is Clang... " >&6; }
-if ${ax_cv_PTHREAD_CLANG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ax_cv_PTHREAD_CLANG=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
+printf %s "checking whether $CC is Clang... " >&6; }
+if test ${ax_cv_PTHREAD_CLANG+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ax_cv_PTHREAD_CLANG=no
# Note that Autoconf sets GCC=yes for Clang as well as GCC
if test "x$GCC" = "xyes"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -13570,16 +16663,18 @@ else
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then :
+ $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1
+then :
ax_cv_PTHREAD_CLANG=yes
fi
rm -rf conftest*
fi
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
-$as_echo "$ax_cv_PTHREAD_CLANG" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
+printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; }
ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
@@ -13592,13 +16687,15 @@ ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
# To solve this, first try -pthread together with -lpthread for GCC
-if test "x$GCC" = "xyes"; then :
+if test "x$GCC" = "xyes"
+then :
ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"
fi
# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
-if test "x$ax_pthread_clang" = "xyes"; then :
+if test "x$ax_pthread_clang" = "xyes"
+then :
ax_pthread_flags="-pthread,-lpthread -pthread"
fi
@@ -13619,10 +16716,12 @@ case $target_os in
ax_pthread_check_macro="--"
;;
esac
-if test "x$ax_pthread_check_macro" = "x--"; then :
+if test "x$ax_pthread_check_macro" = "x--"
+then :
ax_pthread_check_cond=0
-else
- ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+else case e in #(
+ e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;;
+esac
fi
if test "x$ax_pthread_ok" = "xno"; then
@@ -13630,43 +16729,48 @@ for ax_pthread_try_flag in $ax_pthread_flags; do
case $ax_pthread_try_flag in
none)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
-$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+printf %s "checking whether pthreads work without any flags... " >&6; }
;;
*,*)
PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5
-$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5
+printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; }
;;
-*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
-$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
+printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
# Extract the first word of "pthread-config", so it can be a program name with args.
set dummy pthread-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ax_pthread_config+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ax_pthread_config"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ax_pthread_config+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$ax_pthread_config"; then
ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ax_pthread_config="yes"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -13674,18 +16778,20 @@ done
IFS=$as_save_IFS
test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
-fi
+fi ;;
+esac
fi
ax_pthread_config=$ac_cv_prog_ax_pthread_config
if test -n "$ax_pthread_config"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
-$as_echo "$ax_pthread_config" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
+printf "%s\n" "$ax_pthread_config" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- if test "x$ax_pthread_config" = "xno"; then :
+ if test "x$ax_pthread_config" = "xno"
+then :
continue
fi
PTHREAD_CFLAGS="`pthread-config --cflags`"
@@ -13693,8 +16799,8 @@ fi
;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
-$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
+printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
@@ -13729,7 +16835,7 @@ $as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
}
static void *start_routine(void *a) { return a; }
int
-main ()
+main (void)
{
pthread_t th; pthread_attr_t attr;
pthread_create(&th, 0, start_routine, 0);
@@ -13741,18 +16847,20 @@ pthread_t th; pthread_attr_t attr;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ax_pthread_ok=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$ax_pthread_save_CFLAGS"
LIBS="$ax_pthread_save_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
-$as_echo "$ax_pthread_ok" >&6; }
- if test "x$ax_pthread_ok" = "xyes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+printf "%s\n" "$ax_pthread_ok" >&6; }
+ if test "x$ax_pthread_ok" = "xyes"
+then :
break
fi
@@ -13797,23 +16905,25 @@ if test "x$ax_pthread_clang" = "xyes"; then
# that build with -Werror. So if the active version of Clang has
# this misfeature, we search for an option to squash it.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
-$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
-if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
+printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
+if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
# Create an alternate version of $ac_link that compiles and
# links in two steps (.c -> .o, .o -> exe) instead of one
# (.c -> exe), because the warning occurs only in the second
# step
ax_pthread_save_ac_link="$ac_link"
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
- ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+ ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"`
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
ax_pthread_save_CFLAGS="$CFLAGS"
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
- if test "x$ax_pthread_try" = "xunknown"; then :
+ if test "x$ax_pthread_try" = "xunknown"
+then :
break
fi
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
@@ -13822,32 +16932,36 @@ fi
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_link="$ax_pthread_2step_ac_link"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(void){return 0;}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
break
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
done
ac_link="$ax_pthread_save_ac_link"
CFLAGS="$ax_pthread_save_CFLAGS"
- if test "x$ax_pthread_try" = "x"; then :
+ if test "x$ax_pthread_try" = "x"
+then :
ax_pthread_try=no
fi
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
-$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
+printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
no | unknown) ;;
@@ -13864,77 +16978,83 @@ if test "x$ax_pthread_ok" = "xyes"; then
LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
-$as_echo_n "checking for joinable pthread attribute... " >&6; }
-if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+printf %s "checking for joinable pthread attribute... " >&6; }
+if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown
for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
-main ()
+main (void)
{
int attr = $ax_pthread_attr; return attr /* ; */
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
done
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
-$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
+printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
- test "x$ax_pthread_joinable_attr_defined" != "xyes"; then :
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"
+then :
-cat >>confdefs.h <<_ACEOF
-#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR
-_ACEOF
+printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h
ax_pthread_joinable_attr_defined=yes
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
-$as_echo_n "checking whether more special flags are required for pthreads... " >&6; }
-if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
+printf %s "checking whether more special flags are required for pthreads... " >&6; }
+if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ax_cv_PTHREAD_SPECIAL_FLAGS=no
case $target_os in
solaris*)
ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
;;
esac
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
-$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
+printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
- test "x$ax_pthread_special_flags_added" != "xyes"; then :
+ test "x$ax_pthread_special_flags_added" != "xyes"
+then :
PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
ax_pthread_special_flags_added=yes
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
-$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
-if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
+printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; }
+if test ${ax_cv_PTHREAD_PRIO_INHERIT+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
-main ()
+main (void)
{
int i = PTHREAD_PRIO_INHERIT;
return i;
@@ -13942,21 +17062,25 @@ int i = PTHREAD_PRIO_INHERIT;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ax_cv_PTHREAD_PRIO_INHERIT=yes
-else
- ax_cv_PTHREAD_PRIO_INHERIT=no
+else case e in #(
+ e) ax_cv_PTHREAD_PRIO_INHERIT=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
-$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
+printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
- test "x$ax_pthread_prio_inherit_defined" != "xyes"; then :
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"
+then :
-$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
ax_pthread_prio_inherit_defined=yes
@@ -13975,11 +17099,14 @@ fi
case "x$CC" in #(
x/*) :
- if as_fn_executable_p ${CC}_r; then :
+ if as_fn_executable_p ${CC}_r
+then :
PTHREAD_CC="${CC}_r"
fi
- if test "x${CXX}" != "x"; then :
- if as_fn_executable_p ${CXX}_r; then :
+ if test "x${CXX}" != "x"
+then :
+ if as_fn_executable_p ${CXX}_r
+then :
PTHREAD_CXX="${CXX}_r"
fi
fi
@@ -13990,81 +17117,94 @@ fi
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PTHREAD_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$PTHREAD_CC"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PTHREAD_CC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$PTHREAD_CC"; then
ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_PTHREAD_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
if test -n "$PTHREAD_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
-$as_echo "$PTHREAD_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+printf "%s\n" "$PTHREAD_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$PTHREAD_CC" && break
done
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
- if test "x${CXX}" != "x"; then :
+ if test "x${CXX}" != "x"
+then :
for ac_prog in ${CXX}_r
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PTHREAD_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$PTHREAD_CXX"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PTHREAD_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -n "$PTHREAD_CXX"; then
ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_PTHREAD_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX
if test -n "$PTHREAD_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5
-$as_echo "$PTHREAD_CXX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5
+printf "%s\n" "$PTHREAD_CXX" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$PTHREAD_CXX" && break
@@ -14107,7 +17247,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test "$have_pthread" = yes; then
- $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h
CC="$PTHREAD_CC"
fi
@@ -14124,11 +17264,13 @@ with_jwzgles_req=unspecified
have_jwzgles=no
# Check whether --with-gles was given.
-if test "${with_gles+set}" = set; then :
+if test ${with_gles+y}
+then :
withval=$with_gles; # This is documented after --with-gl
with_jwzgles="$withval"; with_jwzgles_req="$withval"
-else
- with_jwzgles=no
+else case e in #(
+ e) with_jwzgles=no ;;
+esac
fi
case "$with_jwzgles" in
@@ -14136,28 +17278,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5
-$as_echo_n "checking for JWZGLES headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5
+printf %s "checking for JWZGLES headers... " >&6; }
d=$with_jwzgles/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5
-$as_echo_n "checking for JWZGLES libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5
+printf %s "checking for JWZGLES libs... " >&6; }
d=$with_jwzgles/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -14177,8 +17319,8 @@ $as_echo "not found ($d: no such directory)" >&6; }
if test "$with_jwzgles" = yes; then
have_jwzgles=yes
JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&5
-$as_echo "emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&5
+printf "%s\n" "emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&6; }
elif test "$with_jwzgles" != no; then
echo "error: must be yes or no: --with-gles=$with_jwzgles"
exit 1
@@ -14199,10 +17341,12 @@ gl_halfassed=no
have_glext=no
# Check whether --with-gl was given.
-if test "${with_gl+set}" = set; then :
+if test ${with_gl+y}
+then :
withval=$with_gl; with_gl="$withval"; with_gl_req="$withval"
-else
- with_gl=yes
+else case e in #(
+ e) with_gl=yes ;;
+esac
fi
case "$with_gl" in
@@ -14210,28 +17354,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL headers" >&5
-$as_echo_n "checking for GL headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GL headers" >&5
+printf %s "checking for GL headers... " >&6; }
d=$with_gl/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL libs" >&5
-$as_echo_n "checking for GL libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GL libs" >&5
+printf %s "checking for GL libs... " >&6; }
d=$with_gl/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -14264,11 +17408,13 @@ if test "$with_gl" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_gl_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_gl_h" = xyes
+then :
have_gl=yes
-else
- have_gl=no
+else case e in #(
+ e) have_gl=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS";
@@ -14280,11 +17426,13 @@ fi
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_glu_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glu_h" = xyes
+then :
have_gl=yes
-else
- have_gl=no
+else case e in #(
+ e) have_gl=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS";
@@ -14350,43 +17498,51 @@ if test "$with_gl" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv3" >&5
-$as_echo_n "checking for glDrawElements in -lGLESv3... " >&6; }
-if ${ac_cv_lib_GLESv3_glDrawElements+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv3" >&5
+printf %s "checking for glDrawElements in -lGLESv3... " >&6; }
+if test ${ac_cv_lib_GLESv3_glDrawElements+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLESv3 $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glDrawElements ();
+char glDrawElements (void);
int
-main ()
+main (void)
{
return glDrawElements ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_GLESv3_glDrawElements=yes
-else
- ac_cv_lib_GLESv3_glDrawElements=no
+else case e in #(
+ e) ac_cv_lib_GLESv3_glDrawElements=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv3_glDrawElements" >&5
-$as_echo "$ac_cv_lib_GLESv3_glDrawElements" >&6; }
-if test "x$ac_cv_lib_GLESv3_glDrawElements" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv3_glDrawElements" >&5
+printf "%s\n" "$ac_cv_lib_GLESv3_glDrawElements" >&6; }
+if test "x$ac_cv_lib_GLESv3_glDrawElements" = xyes
+then :
have_gl=yes
gl_lib_1="GLESv3"
GL_LIBS="-lGLESv3 $GL_LIBS"
@@ -14416,43 +17572,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv2" >&5
-$as_echo_n "checking for glDrawElements in -lGLESv2... " >&6; }
-if ${ac_cv_lib_GLESv2_glDrawElements+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv2" >&5
+printf %s "checking for glDrawElements in -lGLESv2... " >&6; }
+if test ${ac_cv_lib_GLESv2_glDrawElements+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLESv2 $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glDrawElements ();
+char glDrawElements (void);
int
-main ()
+main (void)
{
return glDrawElements ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_GLESv2_glDrawElements=yes
-else
- ac_cv_lib_GLESv2_glDrawElements=no
+else case e in #(
+ e) ac_cv_lib_GLESv2_glDrawElements=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glDrawElements" >&5
-$as_echo "$ac_cv_lib_GLESv2_glDrawElements" >&6; }
-if test "x$ac_cv_lib_GLESv2_glDrawElements" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glDrawElements" >&5
+printf "%s\n" "$ac_cv_lib_GLESv2_glDrawElements" >&6; }
+if test "x$ac_cv_lib_GLESv2_glDrawElements" = xyes
+then :
have_gl=yes
gl_lib_1="GLESv2"
GL_LIBS="-lGLESv2 $GL_LIBS"
@@ -14482,43 +17646,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv1_CM" >&5
-$as_echo_n "checking for glDrawElements in -lGLESv1_CM... " >&6; }
-if ${ac_cv_lib_GLESv1_CM_glDrawElements+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv1_CM" >&5
+printf %s "checking for glDrawElements in -lGLESv1_CM... " >&6; }
+if test ${ac_cv_lib_GLESv1_CM_glDrawElements+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLESv1_CM $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glDrawElements ();
+char glDrawElements (void);
int
-main ()
+main (void)
{
return glDrawElements ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_GLESv1_CM_glDrawElements=yes
-else
- ac_cv_lib_GLESv1_CM_glDrawElements=no
+else case e in #(
+ e) ac_cv_lib_GLESv1_CM_glDrawElements=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv1_CM_glDrawElements" >&5
-$as_echo "$ac_cv_lib_GLESv1_CM_glDrawElements" >&6; }
-if test "x$ac_cv_lib_GLESv1_CM_glDrawElements" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv1_CM_glDrawElements" >&5
+printf "%s\n" "$ac_cv_lib_GLESv1_CM_glDrawElements" >&6; }
+if test "x$ac_cv_lib_GLESv1_CM_glDrawElements" = xyes
+then :
have_gl=yes
gl_lib_1="GLESv1_CM"
GL_LIBS="-lGLESv1_CM $GL_LIBS"
@@ -14550,43 +17722,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lGL" >&5
-$as_echo_n "checking for glEnable in -lGL... " >&6; }
-if ${ac_cv_lib_GL_glEnable+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lGL" >&5
+printf %s "checking for glEnable in -lGL... " >&6; }
+if test ${ac_cv_lib_GL_glEnable+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lGL $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glEnable ();
+char glEnable (void);
int
-main ()
+main (void)
{
return glEnable ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_GL_glEnable=yes
-else
- ac_cv_lib_GL_glEnable=no
+else case e in #(
+ e) ac_cv_lib_GL_glEnable=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glEnable" >&5
-$as_echo "$ac_cv_lib_GL_glEnable" >&6; }
-if test "x$ac_cv_lib_GL_glEnable" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glEnable" >&5
+printf "%s\n" "$ac_cv_lib_GL_glEnable" >&6; }
+if test "x$ac_cv_lib_GL_glEnable" = xyes
+then :
have_gl=yes
gl_lib_1="GL"
GL_LIBS="-lGL $GL_LIBS"
@@ -14617,43 +17797,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lMesaGL" >&5
-$as_echo_n "checking for glEnable in -lMesaGL... " >&6; }
-if ${ac_cv_lib_MesaGL_glEnable+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lMesaGL" >&5
+printf %s "checking for glEnable in -lMesaGL... " >&6; }
+if test ${ac_cv_lib_MesaGL_glEnable+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lMesaGL $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glEnable ();
+char glEnable (void);
int
-main ()
+main (void)
{
return glEnable ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_MesaGL_glEnable=yes
-else
- ac_cv_lib_MesaGL_glEnable=no
+else case e in #(
+ e) ac_cv_lib_MesaGL_glEnable=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glEnable" >&5
-$as_echo "$ac_cv_lib_MesaGL_glEnable" >&6; }
-if test "x$ac_cv_lib_MesaGL_glEnable" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glEnable" >&5
+printf "%s\n" "$ac_cv_lib_MesaGL_glEnable" >&6; }
+if test "x$ac_cv_lib_MesaGL_glEnable" = xyes
+then :
have_gl=yes
gl_lib_1="MesaGL"
GL_LIBS="-lMesaGL $GL_LIBS"
@@ -14691,53 +17879,62 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_gluBuild2DMipmaps" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -l$gl_lib_1" >&5
-$as_echo_n "checking for gluBuild2DMipmaps in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_gluBuild2DMipmaps" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -l$gl_lib_1" >&5
+printf %s "checking for gluBuild2DMipmaps in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gluBuild2DMipmaps ();
+char gluBuild2DMipmaps (void);
int
-main ()
+main (void)
{
return gluBuild2DMipmaps ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_LIB$gl_lib_1" | $as_tr_cpp` 1
+#define `printf "%s\n" "HAVE_LIB$gl_lib_1" | sed "$as_sed_cpp"` 1
_ACEOF
LIBS="-l$gl_lib_1 $LIBS"
-else
- have_gl=no
+else case e in #(
+ e) have_gl=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -14764,48 +17961,57 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -lGLU" >&5
-$as_echo_n "checking for gluBuild2DMipmaps in -lGLU... " >&6; }
-if ${ac_cv_lib_GLU_gluBuild2DMipmaps+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -lGLU" >&5
+printf %s "checking for gluBuild2DMipmaps in -lGLU... " >&6; }
+if test ${ac_cv_lib_GLU_gluBuild2DMipmaps+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLU $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gluBuild2DMipmaps ();
+char gluBuild2DMipmaps (void);
int
-main ()
+main (void)
{
return gluBuild2DMipmaps ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_GLU_gluBuild2DMipmaps=yes
-else
- ac_cv_lib_GLU_gluBuild2DMipmaps=no
+else case e in #(
+ e) ac_cv_lib_GLU_gluBuild2DMipmaps=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluBuild2DMipmaps" >&5
-$as_echo "$ac_cv_lib_GLU_gluBuild2DMipmaps" >&6; }
-if test "x$ac_cv_lib_GLU_gluBuild2DMipmaps" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluBuild2DMipmaps" >&5
+printf "%s\n" "$ac_cv_lib_GLU_gluBuild2DMipmaps" >&6; }
+if test "x$ac_cv_lib_GLU_gluBuild2DMipmaps" = xyes
+then :
have_gl=yes
GL_LIBS="-lGLU $GL_LIBS"
-else
- have_gl=no
- gl_halfassed=yes
+else case e in #(
+ e) have_gl=no
+ gl_halfassed=yes ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -14817,7 +18023,7 @@ fi
if test "$have_gl" = yes; then
- $as_echo "#define HAVE_GL 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GL 1" >>confdefs.h
# OpenGL 1.0 didn't have multiple textures.
@@ -14839,49 +18045,58 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindTexture" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindTexture in -l$gl_lib_1" >&5
-$as_echo_n "checking for glBindTexture in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_glBindTexture" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glBindTexture in -l$gl_lib_1" >&5
+printf %s "checking for glBindTexture in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glBindTexture ();
+char glBindTexture (void);
int
-main ()
+main (void)
{
return glBindTexture ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
- $as_echo "#define HAVE_GLBINDTEXTURE 1" >>confdefs.h
-
-else
- true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
+ printf "%s\n" "#define HAVE_GLBINDTEXTURE 1" >>confdefs.h
+
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -14908,49 +18123,58 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindBuffer" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindBuffer in -l$gl_lib_1" >&5
-$as_echo_n "checking for glBindBuffer in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_glBindBuffer" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glBindBuffer in -l$gl_lib_1" >&5
+printf %s "checking for glBindBuffer in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glBindBuffer ();
+char glBindBuffer (void);
int
-main ()
+main (void)
{
return glBindBuffer ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
- $as_echo "#define HAVE_GLES 1" >>confdefs.h
-
-else
- true
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
+ printf "%s\n" "#define HAVE_GLES 1" >>confdefs.h
+
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -14967,10 +18191,12 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "GL/glext.h" "ac_cv_header_GL_glext_h" "#include <GL/gl.h>
"
-if test "x$ac_cv_header_GL_glext_h" = xyes; then :
+if test "x$ac_cv_header_GL_glext_h" = xyes
+then :
have_glext=yes
-else
- have_glext=no
+else case e in #(
+ e) have_glext=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -14994,48 +18220,56 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glUseProgram" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glUseProgram in -l$gl_lib_1" >&5
-$as_echo_n "checking for glUseProgram in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_glUseProgram" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glUseProgram in -l$gl_lib_1" >&5
+printf %s "checking for glUseProgram in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glUseProgram ();
+char glUseProgram (void);
int
-main ()
+main (void)
{
return glUseProgram ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
- $as_echo "#define HAVE_GLSL 1" >>confdefs.h
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
+ printf "%s\n" "#define HAVE_GLSL 1" >>confdefs.h
- $as_echo "#define HAVE_GLES2 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GLES2 1" >>confdefs.h
fi
@@ -15065,46 +18299,54 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBlitFramebuffer" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBlitFramebuffer in -l$gl_lib_1" >&5
-$as_echo_n "checking for glBlitFramebuffer in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_glBlitFramebuffer" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glBlitFramebuffer in -l$gl_lib_1" >&5
+printf %s "checking for glBlitFramebuffer in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glBlitFramebuffer ();
+char glBlitFramebuffer (void);
int
-main ()
+main (void)
{
return glBlitFramebuffer ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
- $as_echo "#define HAVE_GLES3 1" >>confdefs.h
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
+ printf "%s\n" "#define HAVE_GLES3 1" >>confdefs.h
fi
@@ -15113,14 +18355,22 @@ fi
# LIBS="$ac_save_LIBS"
if test "$have_jwzgles" = yes; then
- $as_echo "#define HAVE_JWZGLES 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_JWZGLES 1" >>confdefs.h
- $as_echo "#define HAVE_GLES 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GLES 1" >>confdefs.h
fi
fi
+elif test "$with_gl" = no; then
+ echo "error: --without-opengl is not supported."
+ # You may be saying "but but but microcontrollers" -- bullshit.
+ # It is the Twenty-First Century, and in This Modern World, every
+ # extant microcontroller is more performant than the desktop
+ # computers on which I developed most of the OpenGL hacks.
+ exit 1
+
elif test "$with_gl" != no; then
echo "error: must be yes or no: --with-gl=$with_gl"
exit 1
@@ -15137,10 +18387,12 @@ have_egl=no
with_egl_req=unspecified
# Check whether --with-glx was given.
-if test "${with_glx+set}" = set; then :
+if test ${with_glx+y}
+then :
withval=$with_glx; with_egl="$withval"; with_egl_req="$withval"
-else
- with_glx=no
+else case e in #(
+ e) with_glx=no ;;
+esac
fi
case "$with_glx" in
@@ -15148,28 +18400,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLX headers" >&5
-$as_echo_n "checking for GLX headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLX headers" >&5
+printf %s "checking for GLX headers... " >&6; }
d=$with_glx/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLX libs" >&5
-$as_echo_n "checking for GLX libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLX libs" >&5
+printf %s "checking for GLX libs... " >&6; }
d=$with_glx/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -15194,11 +18446,13 @@ if test "$with_glx" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "GLX/glx.h" "ac_cv_header_GLX_glx_h" "$ac_includes_default"
-if test "x$ac_cv_header_GLX_glx_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "GLX/glx.h" "ac_cv_header_GLX_glx_h" "$ac_includes_default"
+if test "x$ac_cv_header_GLX_glx_h" = xyes
+then :
have_glx=yes
-else
- have_glx=no
+else case e in #(
+ e) have_glx=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15229,48 +18483,57 @@ if test "$have_gl" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glXCreateContext" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -l$gl_lib_1" >&5
-$as_echo_n "checking for glXCreateContext in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_glXCreateContext" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -l$gl_lib_1" >&5
+printf %s "checking for glXCreateContext in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char glXCreateContext ();
+char glXCreateContext (void);
int
-main ()
+main (void)
{
return glXCreateContext ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
have_glx=yes
-else
- have_glx=no
+else case e in #(
+ e) have_glx=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15298,48 +18561,57 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_eglCreatePlatformWindowSurface" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -l$gl_lib_1" >&5
-$as_echo_n "checking for eglCreatePlatformWindowSurface in -l$gl_lib_1... " >&6; }
-if eval \${$as_ac_Lib+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ as_ac_Lib=`printf "%s\n" "ac_cv_lib_$gl_lib_1""_eglCreatePlatformWindowSurface" | sed "$as_sed_sh"`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -l$gl_lib_1" >&5
+printf %s "checking for eglCreatePlatformWindowSurface in -l$gl_lib_1... " >&6; }
+if eval test \${$as_ac_Lib+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char eglCreatePlatformWindowSurface ();
+char eglCreatePlatformWindowSurface (void);
int
-main ()
+main (void)
{
return eglCreatePlatformWindowSurface ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_ac_Lib=yes"
-else
- eval "$as_ac_Lib=no"
+else case e in #(
+ e) eval "$as_ac_Lib=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Lib
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"
+then :
have_egl=yes
-else
- have_egl=no
+else case e in #(
+ e) have_egl=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15367,47 +18639,56 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -lEGL" >&5
-$as_echo_n "checking for eglCreatePlatformWindowSurface in -lEGL... " >&6; }
-if ${ac_cv_lib_EGL_eglCreatePlatformWindowSurface+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -lEGL" >&5
+printf %s "checking for eglCreatePlatformWindowSurface in -lEGL... " >&6; }
+if test ${ac_cv_lib_EGL_eglCreatePlatformWindowSurface+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lEGL $GL_LIBS -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char eglCreatePlatformWindowSurface ();
+char eglCreatePlatformWindowSurface (void);
int
-main ()
+main (void)
{
return eglCreatePlatformWindowSurface ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_EGL_eglCreatePlatformWindowSurface=yes
-else
- ac_cv_lib_EGL_eglCreatePlatformWindowSurface=no
+else case e in #(
+ e) ac_cv_lib_EGL_eglCreatePlatformWindowSurface=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&5
-$as_echo "$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&6; }
-if test "x$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&5
+printf "%s\n" "$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&6; }
+if test "x$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" = xyes
+then :
have_egl=yes
egl_lib="EGL"
-else
- have_egl=no
+else case e in #(
+ e) have_egl=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15422,7 +18703,7 @@ fi
fi
if test "$have_egl" = yes; then
- $as_echo "#define HAVE_EGL 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_EGL 1" >>confdefs.h
if test \! -z "$egl_lib"; then
GL_LIBS="-l$egl_lib $GL_LIBS"
@@ -15441,8 +18722,8 @@ fi
# There is no way to request a GLES 3.0 runtime context using GLX.
#
if test "$have_jwzgles" = yes -a "$have_egl" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using --with-glx and --with-gles together is a bad idea." >&5
-$as_echo "$as_me: WARNING: Using --with-glx and --with-gles together is a bad idea." >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Using --with-glx and --with-gles together is a bad idea." >&5
+printf "%s\n" "$as_me: WARNING: Using --with-glx and --with-gles together is a bad idea." >&2;}
fi
fi
@@ -15463,10 +18744,12 @@ with_gle_req=unspecified
gle_halfassed=no
# Check whether --with-gle was given.
-if test "${with_gle+set}" = set; then :
+if test ${with_gle+y}
+then :
withval=$with_gle; with_gle="$withval"; with_gle_req="$withval"
-else
- with_gle=yes
+else case e in #(
+ e) with_gle=yes ;;
+esac
fi
case "$with_gle" in
@@ -15474,28 +18757,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE headers" >&5
-$as_echo_n "checking for GLE headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLE headers" >&5
+printf %s "checking for GLE headers... " >&6; }
d=$with_gle/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE libs" >&5
-$as_echo_n "checking for GLE libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLE libs" >&5
+printf %s "checking for GLE libs... " >&6; }
d=$with_gle/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -15526,10 +18809,12 @@ elif test "$with_gle" = yes; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "GL/gle.h" "ac_cv_header_GL_gle_h" "#include <GL/gl.h>
"
-if test "x$ac_cv_header_GL_gle_h" = xyes; then :
+if test "x$ac_cv_header_GL_gle_h" = xyes
+then :
have_gle3=yes
-else
- have_gle3=no
+else case e in #(
+ e) have_gle3=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15545,10 +18830,12 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "GL/gutil.h" "ac_cv_header_GL_gutil_h" "#include <GL/gl.h>
"
-if test "x$ac_cv_header_GL_gutil_h" = xyes; then :
+if test "x$ac_cv_header_GL_gutil_h" = xyes
+then :
have_gle=yes
-else
- have_gle=no
+else case e in #(
+ e) have_gle=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15562,10 +18849,12 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
ac_fn_c_check_header_compile "$LINENO" "GL/tube.h" "ac_cv_header_GL_tube_h" "#include <GL/gl.h>
"
-if test "x$ac_cv_header_GL_tube_h" = xyes; then :
+if test "x$ac_cv_header_GL_tube_h" = xyes
+then :
have_gle=yes
-else
- have_gle=no
+else case e in #(
+ e) have_gle=no ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15594,43 +18883,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gleCreateGC in -lgle" >&5
-$as_echo_n "checking for gleCreateGC in -lgle... " >&6; }
-if ${ac_cv_lib_gle_gleCreateGC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gleCreateGC in -lgle" >&5
+printf %s "checking for gleCreateGC in -lgle... " >&6; }
+if test ${ac_cv_lib_gle_gleCreateGC+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gleCreateGC ();
+char gleCreateGC (void);
int
-main ()
+main (void)
{
return gleCreateGC ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_gle_gleCreateGC=yes
-else
- ac_cv_lib_gle_gleCreateGC=no
+else case e in #(
+ e) ac_cv_lib_gle_gleCreateGC=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_gleCreateGC" >&5
-$as_echo "$ac_cv_lib_gle_gleCreateGC" >&6; }
-if test "x$ac_cv_lib_gle_gleCreateGC" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_gleCreateGC" >&5
+printf "%s\n" "$ac_cv_lib_gle_gleCreateGC" >&6; }
+if test "x$ac_cv_lib_gle_gleCreateGC" = xyes
+then :
have_gle=yes; gle_halfassed=no; GLE_LIBS="-lgle"
fi
@@ -15675,43 +18972,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction in -lgle" >&5
-$as_echo_n "checking for uview_direction in -lgle... " >&6; }
-if ${ac_cv_lib_gle_uview_direction+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uview_direction in -lgle" >&5
+printf %s "checking for uview_direction in -lgle... " >&6; }
+if test ${ac_cv_lib_gle_uview_direction+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char uview_direction ();
+char uview_direction (void);
int
-main ()
+main (void)
{
return uview_direction ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_gle_uview_direction=yes
-else
- ac_cv_lib_gle_uview_direction=no
+else case e in #(
+ e) ac_cv_lib_gle_uview_direction=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_uview_direction" >&5
-$as_echo "$ac_cv_lib_gle_uview_direction" >&6; }
-if test "x$ac_cv_lib_gle_uview_direction" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_uview_direction" >&5
+printf "%s\n" "$ac_cv_lib_gle_uview_direction" >&6; }
+if test "x$ac_cv_lib_gle_uview_direction" = xyes
+then :
have_gle=yes; gle_halfassed=no
fi
@@ -15741,43 +19046,51 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction_d in -lmatrix" >&5
-$as_echo_n "checking for uview_direction_d in -lmatrix... " >&6; }
-if ${ac_cv_lib_matrix_uview_direction_d+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uview_direction_d in -lmatrix" >&5
+printf %s "checking for uview_direction_d in -lmatrix... " >&6; }
+if test ${ac_cv_lib_matrix_uview_direction_d+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lmatrix $GL_LIBS -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char uview_direction_d ();
+char uview_direction_d (void);
int
-main ()
+main (void)
{
return uview_direction_d ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_matrix_uview_direction_d=yes
-else
- ac_cv_lib_matrix_uview_direction_d=no
+else case e in #(
+ e) ac_cv_lib_matrix_uview_direction_d=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_matrix_uview_direction_d" >&5
-$as_echo "$ac_cv_lib_matrix_uview_direction_d" >&6; }
-if test "x$ac_cv_lib_matrix_uview_direction_d" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_matrix_uview_direction_d" >&5
+printf "%s\n" "$ac_cv_lib_matrix_uview_direction_d" >&6; }
+if test "x$ac_cv_lib_matrix_uview_direction_d" = xyes
+then :
have_gle=yes; gle_halfassed=no;
GLE_LIBS="$GLE_LIBS -lmatrix"
fi
@@ -15790,10 +19103,10 @@ fi
fi
if test "$have_gle" = yes ; then
- $as_echo "#define HAVE_GLE 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GLE 1" >>confdefs.h
if test "$have_gle3" = yes ; then
- $as_echo "#define HAVE_GLE3 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GLE3 1" >>confdefs.h
fi
fi
@@ -15815,10 +19128,12 @@ with_jpeg_req=unspecified
jpeg_halfassed=no
# Check whether --with-jpeg was given.
-if test "${with_jpeg+set}" = set; then :
+if test ${with_jpeg+y}
+then :
withval=$with_jpeg; with_jpeg="$withval"; with_jpeg_req="$withval"
-else
- with_jpeg=yes
+else case e in #(
+ e) with_jpeg=yes ;;
+esac
fi
case "$with_jpeg" in
@@ -15826,28 +19141,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5
-$as_echo_n "checking for JPEG headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5
+printf %s "checking for JPEG headers... " >&6; }
d=$with_jpeg/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5
-$as_echo_n "checking for JPEG libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5
+printf %s "checking for JPEG libs... " >&6; }
d=$with_jpeg/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -15879,8 +19194,9 @@ if test "$with_jpeg" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
-if test "x$ac_cv_header_jpeglib_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
+if test "x$ac_cv_header_jpeglib_h" = xyes
+then :
have_jpeg=yes
fi
@@ -15909,47 +19225,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5
-$as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; }
-if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5
+printf %s "checking for jpeg_start_compress in -ljpeg... " >&6; }
+if test ${ac_cv_lib_jpeg_jpeg_start_compress+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ljpeg $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char jpeg_start_compress ();
+char jpeg_start_compress (void);
int
-main ()
+main (void)
{
return jpeg_start_compress ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_jpeg_jpeg_start_compress=yes
-else
- ac_cv_lib_jpeg_jpeg_start_compress=no
+else case e in #(
+ e) ac_cv_lib_jpeg_jpeg_start_compress=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5
-$as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; }
-if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5
+printf "%s\n" "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; }
+if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes
+then :
have_jpeg=yes
jpeg_halfassed=no
JPEG_LIBS="-ljpeg"
- $as_echo "#define HAVE_JPEGLIB 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_JPEGLIB 1" >>confdefs.h
fi
@@ -15971,10 +19295,12 @@ with_png_req=unspecified
png_halfassed=no
# Check whether --with-png was given.
-if test "${with_png+set}" = set; then :
+if test ${with_png+y}
+then :
withval=$with_png; with_png="$withval"; with_png_req="$withval"
-else
- with_png=yes
+else case e in #(
+ e) with_png=yes ;;
+esac
fi
case "$with_png" in
@@ -15982,28 +19308,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG headers" >&5
-$as_echo_n "checking for PNG headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PNG headers" >&5
+printf %s "checking for PNG headers... " >&6; }
d=$with_png/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG libs" >&5
-$as_echo_n "checking for PNG libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PNG libs" >&5
+printf %s "checking for PNG libs... " >&6; }
d=$with_png/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -16035,8 +19361,9 @@ if test "$with_png" = yes; then
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default"
-if test "x$ac_cv_header_png_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default"
+if test "x$ac_cv_header_png_h" = xyes
+then :
have_png=yes
fi
@@ -16065,47 +19392,55 @@ fi
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_read_struct in -lpng" >&5
-$as_echo_n "checking for png_create_read_struct in -lpng... " >&6; }
-if ${ac_cv_lib_png_png_create_read_struct+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for png_create_read_struct in -lpng" >&5
+printf %s "checking for png_create_read_struct in -lpng... " >&6; }
+if test ${ac_cv_lib_png_png_create_read_struct+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lpng $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char png_create_read_struct ();
+char png_create_read_struct (void);
int
-main ()
+main (void)
{
return png_create_read_struct ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_png_png_create_read_struct=yes
-else
- ac_cv_lib_png_png_create_read_struct=no
+else case e in #(
+ e) ac_cv_lib_png_png_create_read_struct=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_read_struct" >&5
-$as_echo "$ac_cv_lib_png_png_create_read_struct" >&6; }
-if test "x$ac_cv_lib_png_png_create_read_struct" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_read_struct" >&5
+printf "%s\n" "$ac_cv_lib_png_png_create_read_struct" >&6; }
+if test "x$ac_cv_lib_png_png_create_read_struct" = xyes
+then :
have_png=yes
png_halfassed=no
PNG_LIBS="-lpng"
- $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_LIBPNG 1" >>confdefs.h
fi
@@ -16127,13 +19462,16 @@ fi
###############################################################################
have_gdk_pixbuf=no
+have_gdk_pixbuf_xlib=no
with_gdk_pixbuf_req=unspecified
# Check whether --with-pixbuf was given.
-if test "${with_pixbuf+set}" = set; then :
+if test ${with_pixbuf+y}
+then :
withval=$with_pixbuf; with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval"
-else
- with_gdk_pixbuf=yes
+else case e in #(
+ e) with_gdk_pixbuf=yes ;;
+esac
fi
# if --with-pixbuf=/directory/ was specified, remember that directory so that
@@ -16152,28 +19490,28 @@ esac
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF headers" >&5
-$as_echo_n "checking for GDK_PIXBUF headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF headers" >&5
+printf %s "checking for GDK_PIXBUF headers... " >&6; }
d=$with_gdk_pixbuf/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF libs" >&5
-$as_echo_n "checking for GDK_PIXBUF libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF libs" >&5
+printf %s "checking for GDK_PIXBUF libs... " >&6; }
d=$with_gdk_pixbuf/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -16200,31 +19538,34 @@ if test "$with_gdk_pixbuf" = yes; then
pkgs=''
ok="yes"
-
- pkg_check_version gdk-pixbuf-2.0 2.0.0
- pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
- pkg_check_version gio-2.0 2.0.0
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
+ pkg_check_version gio-2.0 2.0.0
have_gdk_pixbuf="$ok"
+ pixbuf_pkgs="$pkgs"
if test "$have_gdk_pixbuf" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf includes" >&5
-$as_echo_n "checking for gdk-pixbuf includes... " >&6; }
-if ${ac_cv_gdk_pixbuf_config_cflags+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs`
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_cflags" >&5
-$as_echo "$ac_cv_gdk_pixbuf_config_cflags" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf libs" >&5
-$as_echo_n "checking for gdk-pixbuf libs... " >&6; }
-if ${ac_cv_gdk_pixbuf_config_libs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf includes" >&5
+printf %s "checking for gdk-pixbuf includes... " >&6; }
+if test ${ac_cv_gdk_pixbuf_config_cflags+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs` ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_libs" >&5
-$as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_cflags" >&5
+printf "%s\n" "$ac_cv_gdk_pixbuf_config_cflags" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf libs" >&5
+printf %s "checking for gdk-pixbuf libs... " >&6; }
+if test ${ac_cv_gdk_pixbuf_config_libs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_libs" >&5
+printf "%s\n" "$ac_cv_gdk_pixbuf_config_libs" >&6; }
fi
ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
@@ -16236,75 +19577,29 @@ $as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; }
#
ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags"
-
have_gdk_pixbuf=no
- # check for header A...
-
ac_save_CPPFLAGS="$CPPFLAGS"
if test \! -z "$includedir" ; then
CPPFLAGS="$CPPFLAGS -I$includedir"
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" "$ac_includes_default"
-if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "gdk-pixbuf/gdk-pixbuf.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" "$ac_includes_default"
+if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" = xyes
+then :
have_gdk_pixbuf=yes
fi
CPPFLAGS="$ac_save_CPPFLAGS"
-
- # if that worked, check for header B...
- if test "$have_gdk_pixbuf" = yes; then
- have_gdk_pixbuf=no
- gdk_pixbuf_halfassed=yes
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" = xyes; then :
- have_gdk_pixbuf=yes
- gdk_pixbuf_halfassed=no
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
-
- # yay, it has a new name in Gtk 2.x...
- if test "$have_gdk_pixbuf" = no; then
- have_gdk_pixbuf=no
- gdk_pixbuf_halfassed=yes
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf-xlib/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" = xyes; then :
- have_gdk_pixbuf=yes
- gdk_pixbuf_halfassed=no
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- fi
- fi
CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS"
fi
if test "$have_gdk_pixbuf" = yes; then
# we have the headers, now check for the libraries
have_gdk_pixbuf=no
- gdk_pixbuf_halfassed=yes
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability..." >&5
-$as_echo "checking for gdk_pixbuf usability..." >&6; }
-
- # library A...
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability..." >&5
+printf "%s\n" "checking for gdk_pixbuf usability..." >&6; }
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -16324,128 +19619,68 @@ $as_echo "checking for gdk_pixbuf usability..." >&6; }
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_new_from_file in -lc" >&5
-$as_echo_n "checking for gdk_pixbuf_new_from_file in -lc... " >&6; }
-if ${ac_cv_lib_c_gdk_pixbuf_new_from_file+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_new_from_file in -lc" >&5
+printf %s "checking for gdk_pixbuf_new_from_file in -lc... " >&6; }
+if test ${ac_cv_lib_c_gdk_pixbuf_new_from_file+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gdk_pixbuf_new_from_file ();
+char gdk_pixbuf_new_from_file (void);
int
-main ()
+main (void)
{
return gdk_pixbuf_new_from_file ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_gdk_pixbuf_new_from_file=yes
-else
- ac_cv_lib_c_gdk_pixbuf_new_from_file=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_new_from_file" >&5
-$as_echo "$ac_cv_lib_c_gdk_pixbuf_new_from_file" >&6; }
-if test "x$ac_cv_lib_c_gdk_pixbuf_new_from_file" = xyes; then :
- have_gdk_pixbuf=yes
-fi
-
- CPPFLAGS="$ac_save_CPPFLAGS"
- LDFLAGS="$ac_save_LDFLAGS"
-# LIBS="$ac_save_LIBS"
-
- # library B...
- if test "$have_gdk_pixbuf" = yes; then
- have_gdk_pixbuf=no
-
- ac_save_CPPFLAGS="$CPPFLAGS"
- ac_save_LDFLAGS="$LDFLAGS"
-# ac_save_LIBS="$LIBS"
-
- if test \! -z "$includedir" ; then
- CPPFLAGS="$CPPFLAGS -I$includedir"
- fi
- # note: $X_CFLAGS includes $x_includes
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-
- if test \! -z "$libdir" ; then
- LDFLAGS="$LDFLAGS -L$libdir"
- fi
- # note: $X_LIBS includes $x_libraries
- LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
-
- CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_xlib_init in -lc" >&5
-$as_echo_n "checking for gdk_pixbuf_xlib_init in -lc... " >&6; }
-if ${ac_cv_lib_c_gdk_pixbuf_xlib_init+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gdk_pixbuf_xlib_init ();
-int
-main ()
-{
-return gdk_pixbuf_xlib_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_c_gdk_pixbuf_xlib_init=yes
-else
- ac_cv_lib_c_gdk_pixbuf_xlib_init=no
+else case e in #(
+ e) ac_cv_lib_c_gdk_pixbuf_new_from_file=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_xlib_init" >&5
-$as_echo "$ac_cv_lib_c_gdk_pixbuf_xlib_init" >&6; }
-if test "x$ac_cv_lib_c_gdk_pixbuf_xlib_init" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_new_from_file" >&5
+printf "%s\n" "$ac_cv_lib_c_gdk_pixbuf_new_from_file" >&6; }
+if test "x$ac_cv_lib_c_gdk_pixbuf_new_from_file" = xyes
+then :
have_gdk_pixbuf=yes
- gdk_pixbuf_halfassed=no
fi
CPPFLAGS="$ac_save_CPPFLAGS"
LDFLAGS="$ac_save_LDFLAGS"
# LIBS="$ac_save_LIBS"
- fi
fi
if test "$have_gdk_pixbuf" = yes; then
INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags"
PNG_LIBS="$ac_gdk_pixbuf_config_libs"
- $as_echo "#define HAVE_GDK_PIXBUF 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_GDK_PIXBUF 1" >>confdefs.h
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability... no" >&5
-$as_echo "checking for gdk_pixbuf usability... no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability... no" >&5
+printf "%s\n" "checking for gdk_pixbuf usability... no" >&6; }
fi
if test "$have_gdk_pixbuf" = yes; then
@@ -16468,44 +19703,52 @@ $as_echo "checking for gdk_pixbuf usability... no" >&6; }
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_apply_embedded_orientation in -lc" >&5
-$as_echo_n "checking for gdk_pixbuf_apply_embedded_orientation in -lc... " >&6; }
-if ${ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_apply_embedded_orientation in -lc" >&5
+printf %s "checking for gdk_pixbuf_apply_embedded_orientation in -lc... " >&6; }
+if test ${ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char gdk_pixbuf_apply_embedded_orientation ();
+char gdk_pixbuf_apply_embedded_orientation (void);
int
-main ()
+main (void)
{
return gdk_pixbuf_apply_embedded_orientation ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=yes
-else
- ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=no
+else case e in #(
+ e) ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&5
-$as_echo "$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&6; }
-if test "x$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" = xyes; then :
- $as_echo "#define HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION 1" >>confdefs.h
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&5
+printf "%s\n" "$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&6; }
+if test "x$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" = xyes
+then :
+ printf "%s\n" "#define HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION 1" >>confdefs.h
fi
@@ -16516,6 +19759,68 @@ fi
fi
fi
+# Now that we have checked for gdk_pixbuf, check for gdk_pixbuf_xlib
+# separately, since it has fallen out of fashion in recent years.
+#
+#have_gdk_pixbuf_xlib=no
+#gdk_pixbuf_xlib_halfassed=no
+#if test "$with_gdk_pixbuf" = yes -a "$have_gdk_pixbuf" = yes; then
+#
+# have_gdk_pixbuf_xlib=no
+# pkgs="$pixbuf_pkgs"
+# ok="yes"
+# pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+# pkg_check_version gdk-pixbuf-2.0 2.0.0
+# have_gdk_pixbuf_xlib="$ok"
+# pixbuf_xlib_pkgs="$pkgs"
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# AC_CACHE_CHECK([for gdk-pixbuf-xlib includes],
+# ac_cv_gdk_pixbuf_xlib_config_cflags,
+# [ac_cv_gdk_pixbuf_xlib_config_cflags=`$pkg_config --cflags $pkgs`])
+# AC_CACHE_CHECK([for gdk-pixbuf-xlib libs],
+# ac_cv_gdk_pixbuf_xlib_config_libs,
+# [ac_cv_gdk_pixbuf_xlib_config_libs=`$pkg_config --libs $pkgs`])
+# fi
+#
+# ac_gdk_pixbuf_xlib_config_cflags=$ac_cv_gdk_pixbuf_xlib_config_cflags
+# ac_gdk_pixbuf_xlib_config_libs=$ac_cv_gdk_pixbuf_xlib_config_libs
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# #
+# # we appear to have pixbuf_xlib; check for headers/libs to be sure.
+# #
+# ac_save_gdk_pixbuf_xlib_CPPFLAGS="$CPPFLAGS"
+# CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_xlib_config_cflags"
+# have_gdk_pixbuf_xlib=no
+# gdk_pixbuf_xlib_halfassed=yes
+# AC_CHECK_X_HEADER(gdk-pixbuf-xlib/gdk-pixbuf-xlib.h,
+# [have_gdk_pixbuf_xlib=yes
+# gdk_pixbuf_xlib_halfassed=no])
+# CPPFLAGS="$ac_save_gdk_pixbuf_xlib_CPPFLAGS"
+# fi
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# # we have the headers, now check for the libraries
+# have_gdk_pixbuf_xlib=no
+# gdk_pixbuf_xlib_halfassed=yes
+#
+# AC_MSG_RESULT(checking for gdk_pixbuf_xlib usability...)
+# AC_CHECK_X_LIB(c, gdk_pixbuf_xlib_init,
+# [have_gdk_pixbuf_xlib=yes
+# gdk_pixbuf_xlib_halfassed=no],,
+# $ac_gdk_pixbuf_xlib_config_libs -lX11 -lXext -lm)
+# fi
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# INCLUDES="$INCLUDES $ac_gdk_pixbuf_xlib_config_cflags"
+# PNG_LIBS="$ac_gdk_pixbuf_xlib_config_libs"
+# AC_DEFINE(HAVE_GDK_PIXBUF_XLIB)
+# else
+# AC_MSG_RESULT(checking for gdk_pixbuf_xlib usability... no)
+# fi
+#fi
+
###############################################################################
#
# Check for -lXft
@@ -16542,46 +19847,55 @@ have_xutf8drawstring=no
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xutf8DrawString in -lX11" >&5
-$as_echo_n "checking for Xutf8DrawString in -lX11... " >&6; }
-if ${ac_cv_lib_X11_Xutf8DrawString+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xutf8DrawString in -lX11" >&5
+printf %s "checking for Xutf8DrawString in -lX11... " >&6; }
+if test ${ac_cv_lib_X11_Xutf8DrawString+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lX11 -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char Xutf8DrawString ();
+char Xutf8DrawString (void);
int
-main ()
+main (void)
{
return Xutf8DrawString ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_X11_Xutf8DrawString=yes
-else
- ac_cv_lib_X11_Xutf8DrawString=no
+else case e in #(
+ e) ac_cv_lib_X11_Xutf8DrawString=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_Xutf8DrawString" >&5
-$as_echo "$ac_cv_lib_X11_Xutf8DrawString" >&6; }
-if test "x$ac_cv_lib_X11_Xutf8DrawString" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_Xutf8DrawString" >&5
+printf "%s\n" "$ac_cv_lib_X11_Xutf8DrawString" >&6; }
+if test "x$ac_cv_lib_X11_Xutf8DrawString" = xyes
+then :
have_xutf8drawstring=yes
-else
- true
+else case e in #(
+ e) true ;;
+esac
fi
CPPFLAGS="$ac_save_CPPFLAGS"
@@ -16589,7 +19903,7 @@ fi
# LIBS="$ac_save_LIBS"
if test "$have_xutf8drawstring" = yes ; then
- $as_echo "#define HAVE_XUTF8DRAWSTRING 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XUTF8DRAWSTRING 1" >>confdefs.h
fi
@@ -16598,10 +19912,12 @@ with_xft_req=unspecified
xft_halfassed=no
# Check whether --with-xft was given.
-if test "${with_xft+set}" = set; then :
+if test ${with_xft+y}
+then :
withval=$with_xft; with_xft="$withval"; with_xft_req="$withval"
-else
- with_xft=yes
+else case e in #(
+ e) with_xft=yes ;;
+esac
fi
case "$with_xft" in
@@ -16609,28 +19925,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft headers" >&5
-$as_echo_n "checking for Xft headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xft headers" >&5
+printf %s "checking for Xft headers... " >&6; }
d=$with_xft/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5
-$as_echo_n "checking for Xft libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5
+printf %s "checking for Xft libs... " >&6; }
d=$with_xft/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -16660,24 +19976,28 @@ if test "$with_xft" = yes; then
have_xft="$ok"
if test "$have_xft" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft includes" >&5
-$as_echo_n "checking for Xft includes... " >&6; }
-if ${ac_cv_xft_config_cflags+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs`
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_cflags" >&5
-$as_echo "$ac_cv_xft_config_cflags" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5
-$as_echo_n "checking for Xft libs... " >&6; }
-if ${ac_cv_xft_config_libs+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_xft_config_libs=`$pkg_config --libs $pkgs`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xft includes" >&5
+printf %s "checking for Xft includes... " >&6; }
+if test ${ac_cv_xft_config_cflags+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs` ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_libs" >&5
-$as_echo "$ac_cv_xft_config_libs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_cflags" >&5
+printf "%s\n" "$ac_cv_xft_config_cflags" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5
+printf %s "checking for Xft libs... " >&6; }
+if test ${ac_cv_xft_config_libs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_xft_config_libs=`$pkg_config --libs $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_libs" >&5
+printf "%s\n" "$ac_cv_xft_config_libs" >&6; }
fi
ac_xft_config_cflags=$ac_cv_xft_config_cflags
@@ -16698,8 +20018,9 @@ $as_echo "$ac_cv_xft_config_libs" >&6; }
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
- ac_fn_c_check_header_mongrel "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default"
-if test "x$ac_cv_header_X11_Xft_Xft_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default"
+if test "x$ac_cv_header_X11_Xft_Xft_h" = xyes
+then :
have_xft=yes
fi
@@ -16713,8 +20034,8 @@ fi
have_xft=no
xft_halfassed=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability..." >&5
-$as_echo "checking for Xft usability..." >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability..." >&5
+printf "%s\n" "checking for Xft usability..." >&6; }
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -16734,43 +20055,51 @@ $as_echo "checking for Xft usability..." >&6; }
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XftDrawStringUtf8 in -lc" >&5
-$as_echo_n "checking for XftDrawStringUtf8 in -lc... " >&6; }
-if ${ac_cv_lib_c_XftDrawStringUtf8+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XftDrawStringUtf8 in -lc" >&5
+printf %s "checking for XftDrawStringUtf8 in -lc... " >&6; }
+if test ${ac_cv_lib_c_XftDrawStringUtf8+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $ac_xft_config_libs -lX11 -lXext -lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char XftDrawStringUtf8 ();
+char XftDrawStringUtf8 (void);
int
-main ()
+main (void)
{
return XftDrawStringUtf8 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_XftDrawStringUtf8=yes
-else
- ac_cv_lib_c_XftDrawStringUtf8=no
+else case e in #(
+ e) ac_cv_lib_c_XftDrawStringUtf8=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_XftDrawStringUtf8" >&5
-$as_echo "$ac_cv_lib_c_XftDrawStringUtf8" >&6; }
-if test "x$ac_cv_lib_c_XftDrawStringUtf8" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_XftDrawStringUtf8" >&5
+printf "%s\n" "$ac_cv_lib_c_XftDrawStringUtf8" >&6; }
+if test "x$ac_cv_lib_c_XftDrawStringUtf8" = xyes
+then :
have_xft=yes
fi
@@ -16781,8 +20110,8 @@ fi
fi
if test "$have_xft" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability... no" >&5
-$as_echo "checking for Xft usability... no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability... no" >&5
+printf "%s\n" "checking for Xft usability... no" >&6; }
fi
fi
@@ -16791,7 +20120,7 @@ if test "$have_xft" = yes; then
XFT_LIBS="$ac_xft_config_libs"
XFT_SRCS=''
XFT_OBJS=''
- $as_echo "#define HAVE_XFT 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_XFT 1" >>confdefs.h
else
XFT_LIBS=''
@@ -16801,24 +20130,595 @@ fi
###############################################################################
#
+# Check for various ffmpeg libraries
+#
+###############################################################################
+
+pkgs=''
+ok="yes"
+pkg_check_version libavutil 54.0.0
+have_avutil="$ok"
+pkg_check_version libavcodec 56.0.0
+have_avcodec="$ok"
+pkg_check_version libavformat 56.0.0
+have_avformat="$ok"
+pkg_check_version libswscale 3.0.0
+have_swscale="$ok"
+pkg_check_version libswresample 1.0.0
+have_swresample="$ok"
+
+# Check includes
+if test "$have_avutil" = yes; then
+ ac_save_avutil_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_avutil_config_cflags"
+ have_avutil=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "libavutil/avutil.h" "ac_cv_header_libavutil_avutil_h" "$ac_includes_default"
+if test "x$ac_cv_header_libavutil_avutil_h" = xyes
+then :
+ have_avutil=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_avutil_CPPFLAGS"
+fi
+
+if test "$have_avcodec" = yes; then
+ ac_save_avcodec_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_avcodec_config_cflags"
+ have_avcodec=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "libavcodec/avcodec.h" "ac_cv_header_libavcodec_avcodec_h" "$ac_includes_default"
+if test "x$ac_cv_header_libavcodec_avcodec_h" = xyes
+then :
+ have_avcodec=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_avcodec_CPPFLAGS"
+fi
+
+if test "$have_avformat" = yes; then
+ ac_save_avformat_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_avformat_config_cflags"
+ have_avformat=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "libavformat/avformat.h" "ac_cv_header_libavformat_avformat_h" "$ac_includes_default"
+if test "x$ac_cv_header_libavformat_avformat_h" = xyes
+then :
+ have_avformat=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_avformat_CPPFLAGS"
+fi
+
+if test "$have_swscale" = yes; then
+ ac_save_swscale_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_swscale_config_cflags"
+ have_swscale=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "libswscale/swscale.h" "ac_cv_header_libswscale_swscale_h" "$ac_includes_default"
+if test "x$ac_cv_header_libswscale_swscale_h" = xyes
+then :
+ have_swscale=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_swscale_CPPFLAGS"
+fi
+
+if test "$have_swresample" = yes; then
+ ac_save_swresample_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_swresample_config_cflags"
+ have_swresample=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "libswresample/swresample.h" "ac_cv_header_libswresample_swresample_h" "$ac_includes_default"
+if test "x$ac_cv_header_libswresample_swresample_h" = xyes
+then :
+ have_swresample=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ CPPFLAGS="$ac_save_swresample_CPPFLAGS"
+fi
+
+# Check libs
+
+# My CentOS 7.9 build against ffmpeg 4.2.1 requires all this extra crap too.
+# Not required on Raspbian 11 or macOS.
+extra_ffmpeg_bs=""
+if grep -q '7\.' /etc/centos-release 2>/dev/null ; then
+ extra_ffmpeg_bs="-lfdk-aac -lmp3lame -lspeex -ltheora -ltheoraenc -ltheoradec -lvorbis -lvorbisenc -lx264 -lz -lbz2 -llzma -ldl -pthread"
+fi
+
+if test "$have_avutil" = yes; then
+ have_avutil=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libavutil usability..." >&5
+printf "%s\n" "checking for libavutil usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for avutil_version in -lavutil" >&5
+printf %s "checking for avutil_version in -lavutil... " >&6; }
+if test ${ac_cv_lib_avutil_avutil_version+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lavutil `$pkg_config --libs libavutil libswresample` $extra_ffmpeg_bs $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char avutil_version (void);
+int
+main (void)
+{
+return avutil_version ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_avutil_avutil_version=yes
+else case e in #(
+ e) ac_cv_lib_avutil_avutil_version=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avutil_avutil_version" >&5
+printf "%s\n" "$ac_cv_lib_avutil_avutil_version" >&6; }
+if test "x$ac_cv_lib_avutil_avutil_version" = xyes
+then :
+ have_avutil=yes; avutil_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+if test "$have_avcodec" = yes; then
+ have_avcodec=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libavcodec usability..." >&5
+printf "%s\n" "checking for libavcodec usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for avcodec_version in -lavcodec" >&5
+printf %s "checking for avcodec_version in -lavcodec... " >&6; }
+if test ${ac_cv_lib_avcodec_avcodec_version+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lavcodec `$pkg_config --libs libavcodec libswresample` $PTHREAD_LIBS
+ -lm $extra_ffmpeg_bs $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char avcodec_version (void);
+int
+main (void)
+{
+return avcodec_version ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_avcodec_avcodec_version=yes
+else case e in #(
+ e) ac_cv_lib_avcodec_avcodec_version=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avcodec_avcodec_version" >&5
+printf "%s\n" "$ac_cv_lib_avcodec_avcodec_version" >&6; }
+if test "x$ac_cv_lib_avcodec_avcodec_version" = xyes
+then :
+ have_avcodec=yes; avcodec_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+if test "$have_avformat" = yes; then
+ have_avformat=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libavformat usability..." >&5
+printf "%s\n" "checking for libavformat usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for avformat_version in -lavformat" >&5
+printf %s "checking for avformat_version in -lavformat... " >&6; }
+if test ${ac_cv_lib_avformat_avformat_version+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lavformat `$pkg_config --libs libavformat libswresample` $PTHREAD_LIBS
+ -lm $extra_ffmpeg_bs $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char avformat_version (void);
+int
+main (void)
+{
+return avformat_version ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_avformat_avformat_version=yes
+else case e in #(
+ e) ac_cv_lib_avformat_avformat_version=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avformat_avformat_version" >&5
+printf "%s\n" "$ac_cv_lib_avformat_avformat_version" >&6; }
+if test "x$ac_cv_lib_avformat_avformat_version" = xyes
+then :
+ have_avformat=yes; avformat_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+if test "$have_swscale" = yes; then
+ have_swscale=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libswscale usability..." >&5
+printf "%s\n" "checking for libswscale usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for swscale_version in -lswscale" >&5
+printf %s "checking for swscale_version in -lswscale... " >&6; }
+if test ${ac_cv_lib_swscale_swscale_version+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lswscale `$pkg_config --libs libswscale` $PTHREAD_LIBS -lm
+ $extra_ffmpeg_bs $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char swscale_version (void);
+int
+main (void)
+{
+return swscale_version ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_swscale_swscale_version=yes
+else case e in #(
+ e) ac_cv_lib_swscale_swscale_version=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_swscale_swscale_version" >&5
+printf "%s\n" "$ac_cv_lib_swscale_swscale_version" >&6; }
+if test "x$ac_cv_lib_swscale_swscale_version" = xyes
+then :
+ have_swscale=yes; swscale_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+if test "$have_swresample" = yes; then
+ have_swresample=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: checking for libswresample usability..." >&5
+printf "%s\n" "checking for libswresample usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for swresample_version in -lswresample" >&5
+printf %s "checking for swresample_version in -lswresample... " >&6; }
+if test ${ac_cv_lib_swresample_swresample_version+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
+LIBS="-lswresample `$pkg_config --libs libswresample` $PTHREAD_LIBS -lm
+ $extra_ffmpeg_bs $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char swresample_version (void);
+int
+main (void)
+{
+return swresample_version ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_swresample_swresample_version=yes
+else case e in #(
+ e) ac_cv_lib_swresample_swresample_version=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_swresample_swresample_version" >&5
+printf "%s\n" "$ac_cv_lib_swresample_swresample_version" >&6; }
+if test "x$ac_cv_lib_swresample_swresample_version" = xyes
+then :
+ have_swresample=yes; swresample_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+have_ffmpeg=no
+if test "$have_avformat" = yes -a \
+ "$have_avcodec" = yes -a \
+ "$have_avutil" = yes -a \
+ "$have_swscale" = yes -a \
+ "$have_swresample" = yes ; then
+ have_ffmpeg=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffmpeg includes" >&5
+printf %s "checking for ffmpeg includes... " >&6; }
+if test ${ac_cv_ffmpeg_config_cflags+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_ffmpeg_config_cflags=`$pkg_config --cflags $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ffmpeg_config_cflags" >&5
+printf "%s\n" "$ac_cv_ffmpeg_config_cflags" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffmpeg libs" >&5
+printf %s "checking for ffmpeg libs... " >&6; }
+if test ${ac_cv_ffmpeg_config_libs+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_cv_ffmpeg_config_libs=`$pkg_config --libs $pkgs` ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ffmpeg_config_libs" >&5
+printf "%s\n" "$ac_cv_ffmpeg_config_libs" >&6; }
+ printf "%s\n" "#define HAVE_FFMPEG 1" >>confdefs.h
+
+ FFMPEG_OBJS='$(FFMPEG_OBJS)'
+fi
+ac_ffmpeg_config_cflags=$ac_cv_ffmpeg_config_cflags
+ac_ffmpeg_config_libs=$ac_cv_ffmpeg_config_libs
+FFMPEG_CFLAGS="$ac_ffmpeg_config_cflags"
+FFMPEG_LIBS="$ac_ffmpeg_config_libs"
+
+if test "$have_ffmpeg" = yes ; then
+ FFMPEG_LIBS="$FFMPEG_LIBS $extra_ffmpeg_bs"
+fi
+
+###############################################################################
+#
# Check for pty support: this allows 'phosphor' and 'apple2'
# to run curses-based programs, or be used as terminal windows.
#
###############################################################################
PTY_LIBS=
-for ac_header in pty.h util.h sys/termios.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default"
+if test "x$ac_cv_header_pty_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_PTY_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default"
+if test "x$ac_cv_header_util_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UTIL_H 1" >>confdefs.h
-done
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/termios.h" "ac_cv_header_sys_termios_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_termios_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TERMIOS_H 1" >>confdefs.h
+
+fi
ac_save_CPPFLAGS="$CPPFLAGS"
ac_save_LDFLAGS="$LDFLAGS"
@@ -16838,46 +20738,54 @@ done
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5
-$as_echo_n "checking for forkpty in -lutil... " >&6; }
-if ${ac_cv_lib_util_forkpty+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5
+printf %s "checking for forkpty in -lutil... " >&6; }
+if test ${ac_cv_lib_util_forkpty+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lutil $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char forkpty ();
+char forkpty (void);
int
-main ()
+main (void)
{
return forkpty ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_util_forkpty=yes
-else
- ac_cv_lib_util_forkpty=no
+else case e in #(
+ e) ac_cv_lib_util_forkpty=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5
-$as_echo "$ac_cv_lib_util_forkpty" >&6; }
-if test "x$ac_cv_lib_util_forkpty" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5
+printf "%s\n" "$ac_cv_lib_util_forkpty" >&6; }
+if test "x$ac_cv_lib_util_forkpty" = xyes
+then :
PTY_LIBS="-lutil"
ac_have_forkpty=yes
- $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_FORKPTY 1" >>confdefs.h
fi
@@ -16906,45 +20814,53 @@ if test "$ac_have_forkpty" != yes ; then
CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lc" >&5
-$as_echo_n "checking for forkpty in -lc... " >&6; }
-if ${ac_cv_lib_c_forkpty+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lc" >&5
+printf %s "checking for forkpty in -lc... " >&6; }
+if test ${ac_cv_lib_c_forkpty+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char forkpty ();
+char forkpty (void);
int
-main ()
+main (void)
{
return forkpty ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_forkpty=yes
-else
- ac_cv_lib_c_forkpty=no
+else case e in #(
+ e) ac_cv_lib_c_forkpty=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_forkpty" >&5
-$as_echo "$ac_cv_lib_c_forkpty" >&6; }
-if test "x$ac_cv_lib_c_forkpty" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_forkpty" >&5
+printf "%s\n" "$ac_cv_lib_c_forkpty" >&6; }
+if test "x$ac_cv_lib_c_forkpty" = xyes
+then :
PTY_LIBS=""
- $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_FORKPTY 1" >>confdefs.h
fi
@@ -17009,10 +20925,12 @@ fi
setuid_hacks="$setuid_hacks_default"
# Check whether --with-setuid-hacks was given.
-if test "${with_setuid_hacks+set}" = set; then :
+if test ${with_setuid_hacks+y}
+then :
withval=$with_setuid_hacks; setuid_hacks="$withval"
-else
- setuid_hacks="$setuid_hacks_default"
+else case e in #(
+ e) setuid_hacks="$setuid_hacks_default" ;;
+esac
fi
case "$setuid_hacks" in
@@ -17020,28 +20938,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setuid hacks headers" >&5
-$as_echo_n "checking for setuid hacks headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setuid hacks headers" >&5
+printf %s "checking for setuid hacks headers... " >&6; }
d=$setuid_hacks/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setuid hacks libs" >&5
-$as_echo_n "checking for setuid hacks libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setuid hacks libs" >&5
+printf %s "checking for setuid hacks libs... " >&6; }
d=$setuid_hacks/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -17075,10 +20993,12 @@ record_anim_default=no
record_anim="$record_anim_default"
# Check whether --with-record-animation was given.
-if test "${with_record_animation+set}" = set; then :
+if test ${with_record_animation+y}
+then :
withval=$with_record_animation; record_anim="$withval"
-else
- record_anim="$record_anim_default"
+else case e in #(
+ e) record_anim="$record_anim_default" ;;
+esac
fi
case "$record_anim" in
@@ -17086,28 +21006,28 @@ fi
no) ;;
/*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for record animation headers" >&5
-$as_echo_n "checking for record animation headers... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for record animation headers" >&5
+printf %s "checking for record animation headers... " >&6; }
d=$record_anim/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for record animation libs" >&5
-$as_echo_n "checking for record animation libs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for record animation libs" >&5
+printf %s "checking for record animation libs... " >&6; }
d=$record_anim/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
-$as_echo "$d" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+printf "%s\n" "$d" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
-$as_echo "not found ($d: no such directory)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+printf "%s\n" "not found ($d: no such directory)" >&6; }
fi
# replace the directory string with "yes".
@@ -17132,12 +21052,13 @@ elif test "$record_anim" != no; then
fi
if test "$record_anim" = yes; then
- if test "$have_gdk_pixbuf" != yes; then
- as_fn_error $? "--with-record-animation requires GDK-Pixbuf" "$LINENO" 5
+ if test "$have_ffmpeg" != yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --with-record-animation requires the ffmpeg libraries" >&5
+printf "%s\n" "$as_me: WARNING: --with-record-animation requires the ffmpeg libraries" >&2;}
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabling --with-record-animation" >&5
-$as_echo "enabling --with-record-animation" >&6; }
- $as_echo "#define HAVE_RECORD_ANIM 1" >>confdefs.h
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: enabling --with-record-animation" >&5
+printf "%s\n" "enabling --with-record-animation" >&6; }
+ printf "%s\n" "#define HAVE_RECORD_ANIM 1" >>confdefs.h
ANIM_OBJS='$(ANIM_OBJS)'
ANIM_LIBS='$(ANIM_LIBS)'
@@ -17188,12 +21109,8 @@ if test "$enable_pam_check_account_type" = yes; then
else
COMMENT_PAM_CHECK_ACCOUNT="#"
fi
-#if test "$have_passwd_helper" = yes; then
-# PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
-# PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
-#fi
- PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
- PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
+PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
+PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
if test "$enable_locking" = yes; then
LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)'
@@ -17272,12 +21189,12 @@ fi
# Set PO_DATADIR to something sensible.
#
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for locale directory" >&5
-$as_echo_n "checking for locale directory... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for locale directory" >&5
+printf %s "checking for locale directory... " >&6; }
if test -n "$GTK_DATADIR" ; then
PO_DATADIR="$GTK_DATADIR"
elif test "$have_gtk" = yes; then
- PO_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ PO_DATADIR=`$pkg_config --variable=prefix gtk+-3.0`
PO_DATADIR="$PO_DATADIR/share"
fi
@@ -17291,8 +21208,8 @@ if test -z "$PO_DATADIR" ; then
PO_DATADIR=`echo $dd | sed 's@/X11R6/@/@'`
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PO_DATADIR/locale" >&5
-$as_echo "$PO_DATADIR/locale" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PO_DATADIR/locale" >&5
+printf "%s\n" "$PO_DATADIR/locale" >&6; }
# canonicalize slashes.
HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
@@ -17328,8 +21245,8 @@ cat >confcache <<\_ACEOF
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# 'ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* 'ac_cv_foo' will be assigned the
# following values.
_ACEOF
@@ -17345,8 +21262,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -17359,14 +21276,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
(set) 2>&1 |
case $as_nl`(ac_space=' '; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
- # `set' does not quote correctly, so add quotes: double-quote
+ # 'set' does not quote correctly, so add quotes: double-quote
# substitution turns \\\\ into \\, and sed turns \\ into \.
sed -n \
"s/'/'\\\\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
;; #(
*)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
+ # 'set' quotes correctly as required by POSIX, so do not add quotes.
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
@@ -17376,15 +21293,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -17398,8 +21315,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -17416,7 +21333,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -17426,14 +21343,20 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
+# Check whether --enable-year2038 was given.
+if test ${enable_year2038+y}
+then :
+ enableval=$enable_year2038;
+fi
+
ac_config_commands="$ac_config_commands po/stamp-it"
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -17456,62 +21379,63 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
+else case e in #(
+ e) case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
+esac ;;
esac
fi
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -17519,13 +21443,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
}
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -17534,44 +21451,27 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
;;
esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
+# We did not find ourselves, most probably we were run as 'sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
@@ -17582,9 +21482,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -17614,22 +21514,25 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
- as_fn_append ()
+else case e in #(
+ e) as_fn_append ()
{
eval $1=\$$1\$2
- }
+ } ;;
+esac
fi # as_fn_append
# as_fn_arith ARG...
@@ -17637,16 +21540,18 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
- as_fn_arith ()
+else case e in #(
+ e) as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
- }
+ } ;;
+esac
fi # as_fn_arith
if expr a : '\(a\)' >/dev/null 2>&1 &&
@@ -17672,7 +21577,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -17694,6 +21599,9 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -17707,6 +21615,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -17718,9 +21632,9 @@ if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
+ # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.
+ # In both cases, we have to default to 'cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
@@ -17747,7 +21661,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -17756,7 +21670,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -17798,10 +21712,12 @@ as_test_x='test -x'
as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated
# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed '$as_sed_sh'" # deprecated
exec 6>&1
## ----------------------------------- ##
@@ -17816,7 +21732,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -17847,7 +21763,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
+'$as_me' instantiates files and other configuration actions
from templates according to the current configuration. Unless the files
and actions are specified as TAGs, all are instantiated by default.
@@ -17877,20 +21793,23 @@ $config_commands
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2023 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
test -n "\$AWK" || AWK=awk
_ACEOF
@@ -17922,15 +21841,15 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
@@ -17938,23 +21857,23 @@ do
--header | --heade | --head | --hea )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
as_fn_append CONFIG_HEADERS " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h)
# Conflict between --help and --header
- as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
+ as_fn_error $? "ambiguous option: '$1'
+Try '$0 --help' for more information.";;
--help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
# This is an error.
- -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
+ -*) as_fn_error $? "unrecognized option: '$1'
+Try '$0 --help' for more information." ;;
*) as_fn_append ac_config_targets " $1"
ac_need_defaults=false ;;
@@ -17975,7 +21894,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -17989,7 +21908,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -17997,6 +21916,11 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS.
+ OBSOLETE_ALL_LINGUAS="$ALL_LINGUAS"
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
_ACEOF
@@ -18007,7 +21931,7 @@ for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
- "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+ "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
"jwxyz/Makefile") CONFIG_FILES="$CONFIG_FILES jwxyz/Makefile" ;;
@@ -18021,7 +21945,7 @@ do
"driver/XScreenSaver.ad") CONFIG_FILES="$CONFIG_FILES driver/XScreenSaver.ad" ;;
"po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;;
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;;
esac
done
@@ -18030,9 +21954,9 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -18040,7 +21964,7 @@ fi
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
+# after its creation but before its name has been assigned to '$tmp'.
$debug ||
{
tmp= ac_tmp=
@@ -18064,7 +21988,7 @@ ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
+# This happens for instance with './config.status config.h'.
if test -n "$CONFIG_FILES"; then
ac_cr=`echo X | tr X '\015'`
@@ -18220,13 +22144,13 @@ fi # test -n "$CONFIG_FILES"
# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
+# This happens for instance with './config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF
-# Transform confdefs.h into an awk script `defines.awk', embedded as
+# Transform confdefs.h into an awk script 'defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.
@@ -18335,7 +22259,7 @@ do
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
@@ -18357,33 +22281,33 @@ do
-) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
- # because $ac_f cannot contain `:'.
+ # because $ac_f cannot contain ':'.
test -f "$ac_f" ||
case $ac_f in
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
- # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # Let's still pretend it is 'configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -18400,7 +22324,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -18424,9 +22348,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -18463,6 +22387,11 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
[\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
*) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
@@ -18482,8 +22411,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -18496,7 +22425,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
esac
_ACEOF
-# Neutralize VPATH when `$srcdir' = `.'.
+# Neutralize VPATH when '$srcdir' = '.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
@@ -18517,6 +22446,7 @@ s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
@@ -18526,9 +22456,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -18544,34 +22474,144 @@ which seems to be undefined. Please make sure it is defined" >&2;}
#
if test x"$ac_file" != x-; then
{
- $as_echo "/* $configure_input */" \
+ printf "%s\n" "/* $configure_input */" >&1 \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
} >"$ac_tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
mv "$ac_tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
- $as_echo "/* $configure_input */" \
+ printf "%s\n" "/* $configure_input */" >&1 \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5
fi
;;
- :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
;;
esac
case $ac_file$ac_mode in
- "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*)
- sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
- esac ;;
+ "po-directories":C)
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ gt_tab=`printf '\t'`
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ ALL_LINGUAS=$OBSOLETE_ALL_LINGUAS
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang" | "$presentlang"_* | "$presentlang".* | "$presentlang"@*)
+ useit=yes
+ ;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done ;;
"po/stamp-it":C)
if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then
as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5
@@ -18624,8 +22664,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
###############################################################################
@@ -18634,6 +22674,8 @@ fi
#
###############################################################################
+CONF_STATUS=0
+
warn_prefix_1=" Warning:"
warn_prefix_2=" Note:"
warn_prefix="$warn_prefix_1"
@@ -18691,65 +22733,81 @@ if test "$ac_prog_cc_no_pthread" ; then
warn2 "support POSIX threads."
echo ""
warn2 "If you have multiple CPU cores, try CC=$PTHREAD_CC."
+ CONF_STATUS=1
elif test "$with_pthread_req" = yes -a "$have_pthread" = no ; then
warn 'POSIX threads were requested, but were not found.'
+ CONF_STATUS=1
fi
if test "$with_sgi_req" = yes -a "$have_sgi" = no ; then
warn 'The SGI saver extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
warn 'The XIdle extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_mit_req" = yes -a "$have_mit" = no ; then
warn 'The MIT-SCREEN-SAVER extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
warn 'The XSHM extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
+ CONF_STATUS=1
fi
#if test "$with_xcomposite_req" = yes -a "$have_xcomposite" = no ; then
# warn 'The XCOMPOSITE extension was requested, but was not found.'
+# CONF_STATUS=1
#fi
if test "$with_xkb_req" = yes -a "$have_xkb" = no ; then
warn 'The X Keyboard extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
warn 'The DPMS extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xinerama_req" = yes -a "$have_xinerama" = no ; then
warn 'The Xinerama extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
warn 'The XF86VMODE extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_randr_req" = yes -a "$have_randr" = no ; then
warn 'The RANDR extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
warn "Checking of /proc/interrupts was requested, but it's bogus."
+ CONF_STATUS=1
fi
if test "$pkg_config" = false ; then
warnL 'The "pkg-config" program was not found. Without that,'
warn2 "detection of the various GTK libraries won't work."
+ CONF_STATUS=1
else
pkgerr=`$pkg_config --list-all 2>&1 >/dev/null`
if test "x$pkgerr" != "x" ; then
@@ -18758,20 +22816,20 @@ else
warn2 "The errors are:"
echo ''
echo "$pkgerr" | sed 's/^/ > /g'
+ CONF_STATUS=1
fi
fi
if test "$gtk_halfassed" != no ; then
- warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK can't be used."
+ warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK"
+ warn2 "can't be used."
+ CONF_STATUS=1
fi
motif_warn2() {
- warn2 'Though the Motif front-end to xscreensaver is still'
- warn2 'maintained, it is no longer being updated with new'
- warn2 'features: all new development on the xscreensaver-settings'
- warn2 'program is happening in the GTK version, and not in the'
- warn2 'Motif version. It is recommended that you build against'
- warn2 'GTK instead of Motif. See <http://www.gtk.org/>.'
+ warn2 "The Motif version of \`xscreensaver-settings' is missing many"
+ warn2 'features. It is strongly recommended that you build the GTK'
+ warn2 'version instead.'
}
if test "$have_motif" = no -a "$have_gtk" = no; then
@@ -18781,9 +22839,11 @@ if test "$have_motif" = no -a "$have_gtk" = no; then
warn2 "\`xscreensaver-settings' program requires one of these."
echo ''
motif_warn2
+ CONF_STATUS=1
else
warnL "The GTK libraries do not seem to be available; the"
warn2 "\`xscreensaver-settings' program requires them."
+ CONF_STATUS=1
# echo ''
# warn2 'You can use Motif or Lesstif instead of GTK (use the'
# warn2 "\`--with-motif' option) but that is NOT recommended."
@@ -18793,19 +22853,23 @@ if test "$have_motif" = no -a "$have_gtk" = no; then
elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
warnL "Use of Motif was requested, but it wasn't found;"
warn2 "Gtk will be used instead."
+ CONF_STATUS=1
elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
warnL "Use of Gtk was requested, but it wasn't found."
+ CONF_STATUS=1
fi
if test "$ac_cv_libxt" != yes ; then
warnL 'The Xt library was not found. It is required.'
+ CONF_STATUS=1
fi
if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then
warn "GTK is being used, but the GDK-Pixbuf library and/or"
warn2 "headers were not found. That can't be good. Please"
warn2 "install the GDK-Pixbuf development kit and re-configure."
+ CONF_STATUS=1
fi
if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
@@ -18823,6 +22887,7 @@ if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
warn2 "use with XScreenSaver; it is strongly recommended"
warn2 "that you upgrade to at least version $preferred_lesstif!"
warn2 "See <http://www.lesstif.org/>."
+ CONF_STATUS=1
fi
fi
@@ -18840,10 +22905,10 @@ halfassery() {
if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then
warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
+ CONF_STATUS=1
fi
-if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
- test "$have_gdk_pixbuf" = no ; then
+if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes ; then
if test "$with_gdk_pixbuf_req" = yes ; then
true
@@ -18865,9 +22930,29 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
warn2 'configure.'
fi
+#if test "$have_gdk_pixbuf" = yes -a "$have_gdk_pixbuf_xlib" = no ; then
+#
+# warnL 'The GDK-Pixbuf-Xlib library was not found.'
+#
+# if test "$gdk_pixbuf_xlib_halfassed" = yes ; then halfassery ; fi
+# if test "$have_png" = yes ; then
+# echo ''
+# warn2 'The PNG library is being used instead.'
+# fi
+#
+# echo ''
+# warn2 'Some of the demos will not use images as much as they could.'
+# warn2 'You should consider installing GDK-Pixbuf-Xlib and re-running'
+# warn2 'configure.'
+# echo ''
+# warn2 "Recently, some distros have stopped distributing"
+# warn2 "GDK-Pixbuf-Xlib entirely. So good luck with that."
+#fi
+
if test "$have_jpeg" = no ; then
if test "$with_jpeg_req" = yes ; then
warnL 'Use of libjpeg was requested, but it was not found.'
+ CONF_STATUS=1
elif test "$with_jpeg_req" = no ; then
warnL 'The JPEG library is not being used.'
else
@@ -18880,6 +22965,7 @@ if test "$have_jpeg" = no ; then
warn2 "This means that it won't be possible for the image-manipulating"
warn2 "display modes to load files from disk; and it also means that"
warn2 "the \`webcollage' program will be much slower."
+ CONF_STATUS=1
else
warn2 "This means the \`webcollage' program will be much slower."
fi
@@ -18888,6 +22974,7 @@ fi
if test "$have_png" = no ; then
if test "$with_png_req" = yes ; then
warnL 'Use of libpng was requested, but it was not found.'
+ CONF_STATUS=1
elif test "$with_png_req" = no ; then
warnL 'The PNG library is not being used.'
else
@@ -18896,16 +22983,19 @@ if test "$have_png" = no ; then
if test "$png_halfassed" = yes ; then halfassery ; fi
warn2 "Many things aren't going to work right."
+ CONF_STATUS=1
fi
if test "$have_xinput" = no ; then
warnL 'The XInput2 library was not found. It is required.'
if test "$xinput_halfassed" = yes ; then halfassery ; else echo '' ; fi
+ CONF_STATUS=1
fi
if test "$have_xft" = no ; then
warnL 'The XFreeType library was not found. It is required.'
if test "$xft_halfassed" = yes ; then halfassery ; else echo '' ; fi
+ CONF_STATUS=1
fi
if test "$have_systemd" = no ; then
@@ -18913,9 +23003,11 @@ if test "$have_systemd" = no ; then
if test "$systemd_too_old" = yes ; then
warnL "The systemd library is too old."
systemd_warned=yes
+ CONF_STATUS=1
elif test "$with_systemd_req" = yes ; then
warnL "Use of systemd was requested, but it was not found."
systemd_warned=yes
+ CONF_STATUS=1
elif test "$ac_macosx" = yes; then
true
elif test "$with_systemd_req" = no ; then
@@ -18929,6 +23021,7 @@ if test "$have_systemd" = no ; then
if test "$systemd_halfassed" = yes ; then
halfassery
systemd_warned=yes
+ CONF_STATUS=1
fi
if test "$systemd_warned" = yes; then
@@ -18942,11 +23035,14 @@ fi
if test "$have_gl" = no ; then
if test "$with_gl_req" = yes ; then
- warnL 'Use of GL was requested, but it was not found.'
+ warnL 'The OpenGL 3D library is required, but it was not found.'
+ CONF_STATUS=1
elif test "$with_gl_req" = no ; then
noteL 'The OpenGL 3D library is not being used.'
+ CONF_STATUS=1
else
noteL 'The OpenGL 3D library was not found.'
+ CONF_STATUS=1
fi
if test "$gl_halfassed" = yes ; then
@@ -18959,9 +23055,7 @@ if test "$have_gl" = no ; then
echo ''
warn2 'Those demos which use 3D will not be built or installed.'
- warn2 'You might want to consider installing OpenGL and'
- warn2 're-running configure.'
-
+ warn2 'That is most of them.'
fi
if test "$have_gl" = yes -a "$have_gle" = no ; then
@@ -18974,6 +23068,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
noteL 'Use of the GLE (GL Extrusion) library was requested, but'
warn2 'it was not found (though the OpenGL library was found, and'
warn2 'is being used.)'
+ CONF_STATUS=1
elif test "$with_gle_req" = no ; then
noteL 'The OpenGL Library is being used, but the GLE (GL Extrusion)'
warn2 'library is not.'
@@ -18995,28 +23090,33 @@ fi
if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
warn 'Use of XReadDisplay was requested, but it was not found.'
+ CONF_STATUS=1
fi
if test "$with_kerberos_req" = yes -a "$have_kerberos" = no ; then
warn 'Use of Kerberos was requested, but it was not found.'
+ CONF_STATUS=1
fi
if test "$with_pam_req" = yes -a "$have_pam" = no ; then
warn 'Use of PAM was requested, but it was not found.'
-elif test "$have_pam" = no ; then
+ CONF_STATUS=1
+elif test "$have_pam" = no -a "$enable_locking" = yes ; then
if test -d /etc/pam.d -o -f /etc/pam.conf ; then
warn "Your system seems to have PAM, but PAM is not being used."
warn2 "That is probably not going to work out well."
-
+ CONF_STATUS=1
fi
fi
if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
warn 'Use of shadow passwords was requested, but they were not found.'
+ CONF_STATUS=1
fi
if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then
warn 'Use of libcap was requested, but it was not found.'
+ CONF_STATUS=1
fi
if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then
@@ -19024,6 +23124,17 @@ if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then
warn2 "THIS DOES NOT WORK! Don't do this!"
fi
+if test "$have_jwzgles" = yes ; then
+ warn "Do not use --with-gles unless you are sure that you know"
+ warn2 "what you are doing! It is not recommended on normal X11"
+ warn2 "systems."
+
+ if test "$have_egl" = no; then
+ warn2 ""
+ warn2 "Using --with-gles and --with-glx probably won't work."
+ fi
+fi
+
# You are in a twisty maze of namespaces and syntaxes, all alike.
# Expand all of these as the Makefile will probably expand them.
# Fuck the skull of Unix.
@@ -19080,7 +23191,7 @@ if test \! -z "$rpm_vers" ; then
pkg_bindir2=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
pkg_hackdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'`
pkg_confdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
- pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\).*\.ttf$@\1@p' | head -1`
pkg_addir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'`
if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
@@ -19109,7 +23220,7 @@ if test \! -z "$deb_vers" ; then
pkg_bindir2=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
pkg_hackdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'`
pkg_confdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
- pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\).*\.ttf$@\1@p' | head -1`
pkg_addir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'`
if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
@@ -19161,3 +23272,6 @@ echo " Configuration: ${HACK_CONF_DIR}/$confdir_err"
echo " Extra Fonts: ${FONT_DIR}$fontdir_err"
echo " App Defaults: ${APPDEFAULTS}/$addir_err"
echo ""
+
+exit $CONF_STATUS
+
diff --git a/configure.ac b/configure.ac
index c3f0b5b..dc2ad2f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,9 +1,18 @@
-# configure.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
+# configure.in --- xscreensaver, Copyright © 1997-2023 Jamie Zawinski.
#
-# Note: upgrading past 2.69_5 breaks the world.
+# Note: upgrading past 2.69_5 breaks the world, mostly the po/ shitshow.
AC_PREREQ([2.69])
+# If you accidentally upgraded autoconf, re-install the 2019-08-23 version:
+#
+# git clone --single-branch https://github.com/macports/macports-ports.git
+# cd macports-ports/
+# git checkout 1d802b48a7b00b6c154e971119a2a309550c79c2
+# cd devel/autoconf
+# sudo port install
+# port installed autoconf
+
AC_INIT
AC_CONFIG_SRCDIR([driver/subprocs.c])
AC_CONFIG_HEADERS([config.h])
@@ -11,6 +20,11 @@ AC_CONFIG_HEADERS([config.h])
echo "current directory: `pwd`"
echo "command line was: $0 $@"
+if ! test -z "$ac_unrecognized_opts" ; then
+ echo "" >&2
+ exit 2
+fi
+
###############################################################################
#
# Autoheader stuff
@@ -18,7 +32,7 @@ echo "command line was: $0 $@"
###############################################################################
AH_TOP([
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski.
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski.
* Generate this file by running 'configure' rather than editing it by hand.
*/
])
@@ -62,9 +76,6 @@ AH_TEMPLATE([HAVE_LIBCAP],
AH_TEMPLATE([XPointer],
[Stare into the void.])
-AH_TEMPLATE([HAVE_READ_DISPLAY_EXTENSION],
- [Define this if you have the SGI XReadDisplay extension.])
-
AH_TEMPLATE([HAVE_XINPUT],
[Define this if you have the XInput2 extension.])
@@ -126,6 +137,9 @@ AH_TEMPLATE([HAVE_XKB],
AH_TEMPLATE([HAVE_LIBSYSTEMD],
[Define this if you have libsystemd.])
+AH_TEMPLATE([HAVE_LIBELOGIND],
+ [Define this if you have libelogind.])
+
AH_TEMPLATE([HAVE_PROC_INTERRUPTS],
[Define this if you have a Linux-like /proc/interrupts file which
can be examined to determine when keyboard activity has
@@ -146,27 +160,15 @@ AH_TEMPLATE([HAVE_XMCOMBOBOX],
[Define this if you have the XmComboBox Motif 2.0 widget.])
AH_TEMPLATE([HAVE_GTK],
- [Define this if you have Gtk])
-AH_TEMPLATE([HAVE_GTK2],
[Define this if you have Gtk 2.x.])
-AH_TEMPLATE([HAVE_CRAPPLET],
- [Define this if you have Gnome and want to build support for the
- xscreensaver control panel in the Gtk 1.x Gnome Control Center.])
-
-AH_TEMPLATE([HAVE_CRAPPLET_IMMEDIATE],
- [Define this if HAVE_CRAPPLET is defined, and the function
- capplet_widget_changes_are_immediate is available.])
-
AH_TEMPLATE([HAVE_XML],
[Define this if you have the XML library.])
-AH_TEMPLATE([HAVE_OLD_XML_HEADERS],
- [Define this if you the XML library headers lack the
- gnome-xml/libxml symlink.])
-
AH_TEMPLATE([HAVE_GDK_PIXBUF],
- [Define this if you have GDK_Pixbuf.])
+ [Define this if you have GDK-Pixbuf.])
+AH_TEMPLATE([HAVE_GDK_PIXBUF_XLIB],
+ [Define this if you have GDK-Pixbuf-Xlib.])
AH_TEMPLATE([HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION],
[Define this if you have the gdk_pixbuf_apply_embedded_orientation
@@ -221,6 +223,9 @@ AH_TEMPLATE([HAVE_GLE3],
[Define this if GL Extrusion is version 3.])
+AH_TEMPLATE([HAVE_FFMPEG],
+ [Define this if you have the ffmpeg libraries.])
+
AH_TEMPLATE([HAVE_RECORD_ANIM],
[Define this to enable recording of videos.])
@@ -271,9 +276,6 @@ AH_TEMPLATE([HAVE_ADJUNCT_PASSWD],
AH_TEMPLATE([HAVE_HPUX_PASSWD],
[Define this for HPUX so-called "Secure Passwords".])
-#AH_TEMPLATE([PASSWD_HELPER_PROGRAM],
-# [Define this to use a third-party password helper program.])
-
AH_TEMPLATE([HAVE_SYSLOG],
[Define this if you have openlog/syslog/closelog.])
@@ -305,7 +307,17 @@ AC_DEFUN([AC_CHECK_GCC_ARG],
ac_cv_gcc_accepts_[$1],
[rm -rf conftest.$ac_ext
touch conftest.$ac_ext
- if ( ( gcc -c [$2] conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ #
+ # July 2023: With gcc 10.2.1 We get the "unrecognized" warning with
+ # "-Wlanguage-extension-token" but no warning is printed with
+ # "-Wno-language-extension-token"... And then later other unrelated
+ # warnings will volunteer that "unrecognized command-line option
+ # ‘-Wno-language-extension-token’ may have been intended to silence
+ # earlier diagnostics".
+ #
+ without_no=`echo $2 | sed s/Wno-/W/`
+ if ( ( gcc -c $without_no conftest.$ac_ext -o/dev/null >/dev/null ) \
+ 2>&1 | \
grep unrecognized >/dev/null ); then
ac_cv_gcc_accepts_[$1]=no
else
@@ -328,22 +340,14 @@ AC_DEFUN([AC_PROG_CC_ANSI],
if test -z "$GCC"; then
# not using GCC
- AC_MSG_CHECKING(how to request ANSI compilation)
+ AC_MSG_CHECKING(for extra compiler flags)
case "$host" in
- *-hpux* )
- AC_MSG_RESULT(HPUX: adding -Ae)
- CC="$CC -Ae"
- ;;
*-aix* )
- AC_MSG_RESULT(AIX: adding -qlanglvl=ansi -qhalt=e)
+ AC_MSG_RESULT(AIX: adding -qhalt=e)
CC="$CC -qlanglvl=ansi -qhalt=e"
;;
- *-dec-* )
- AC_MSG_RESULT(DEC: adding -std1 -ieee)
- CC="$CC -std1"
- ;;
*)
- AC_MSG_RESULT(no idea)
+ AC_MSG_RESULT(none)
;;
esac
else
@@ -361,26 +365,19 @@ AC_DEFUN([AC_PROG_CC_ANSI],
# extensions (such as allowing C++ style "//" comments in C code, and
# declarations after statements) were not supported by non-gcc compilers
# for many years, so we continued to use "-std=c89" to prevent those
- # GNU-isms from sneaking in to the code. Well, these days various
- # vendors have sloppily allowed non-ANSI syntax to slip into their
- # library header files. GTK and OpenGL have been major offenders in this
- # way. So... as of 2021, I guess we are forced to use "-std=gnu89", to
- # allow those extensions, and hope that the warnings generated by
- # "-pedantic" are heeded.
+ # GNU-isms from sneaking in to the code.
+ #
+ # These days XScreenSaver uses C99, which supports "//" comments and
+ # declarations after statements.
#
- AC_CHECK_GCC_ARG(gnu89, -std=gnu89)
+ AC_CHECK_GCC_ARG(gnu99, -std=gnu99)
AC_CHECK_GCC_ARG(pedantic, -pedantic)
AC_CHECK_GCC_ARG(Wall, -Wall)
AC_CHECK_GCC_ARG(wnested_externs, -Wnested-externs)
AC_CHECK_GCC_ARG(wstrict_prototypes, -Wstrict-prototypes)
AC_CHECK_GCC_ARG(wmissing_prototypes, -Wmissing-prototypes)
- AC_CHECK_GCC_ARG(declaration_after, -Wdeclaration-after-statement)
# "string length is greater than ISO C89 compilers required to support"
AC_CHECK_GCC_ARG(no_overlength_strings, -Wno-overlength-strings)
- # Ignore warnings about using "inline"
- AC_CHECK_GCC_ARG(no_language_ext_token, -Wno-language-extension-token)
- # Xlib headers use named variadic macros.
- AC_CHECK_GCC_ARG(no_variadic_macros, -Wno-variadic-macros)
fi
])
@@ -756,7 +753,8 @@ AC_DEFUN([AC_X_RANDOM_PATHS],
#
for version in X11R6 X11R5 X11R4 ; do
# if either pair of directories exists...
- if test -d /usr/include/$version || test -d /usr/contrib/$version/include
+ if test -d /usr/include/$version || \
+ test -d /usr/contrib/$version/include
then
# if contrib exists, use it...
if test -d /usr/contrib/$version/include ; then
@@ -1051,8 +1049,6 @@ ac_original_cc=$CC
AC_PROG_CC
AC_PROG_CC_ANSI
AC_PROG_CPP
-AC_C_CONST
-AC_C_INLINE
AC_EXEEXT
# stuff for Makefiles
@@ -1125,6 +1121,9 @@ AC_MSG_RESULT($ac_macosx)
#
###############################################################################
+# Note: In the decades since I wrote this, PKG_CHECK_MODULES came into
+# existence, which could probably simplify the following quite a bit.
+
AC_PATH_TOOL(pkg_config, pkg-config)
if test -z "$pkg_config" ; then
@@ -1182,9 +1181,19 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
AC_SUBST(GETTEXT_PACKAGE)
ALL_LINGUAS="da de es et fi fr hu it ja ko nb nl pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
-AM_GLIB_GNU_GETTEXT
+AM_GNU_GETTEXT([external])
MKINSTALLDIRS="$INSTALL_DIRS"
+# The library is there, but neither $INTLLIBS nor $LIBINTL are getting set.
+if test -z "$INTLLIBS" ; then INTLLIBS="$LIBINTL" ; fi
+if test -z "$INTLLIBS" ; then
+ AC_CHECK_X_LIB(intl, gettext, [INTLLIBS="-lintl"])
+fi
+LIBINTL="$INTLLIBS"
+AC_SUBST(INTLLIBS)
+AC_SUBST(LIBINTL)
+AC_SUBST(CATALOGS)
+
###############################################################################
#
@@ -1436,7 +1445,8 @@ if test "$with_xinerama" = yes; then
# if that failed, look in -lXinerama (this is where it is in XFree86 4.1.)
if test "$have_xinerama" = no; then
AC_CHECK_X_LIB(Xinerama, XineramaQueryScreens,
- [have_xinerama=yes; XINERAMA_LIBS="-lXinerama"],
+ [have_xinerama=yes;
+ XINERAMA_LIBS="$XINERAMA_LIBS -lXinerama"],
[true], -lXext -lX11)
fi
fi
@@ -1493,7 +1503,8 @@ if test "$with_randr" = yes; then
# if that failed, look in -lXrandr
if test "$have_randr" = no; then
AC_CHECK_X_LIB(Xrandr, XRRGetScreenInfo,
- [have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"],
+ [have_randr=yes;
+ XINERAMA_LIBS="$XINERAMA_LIBS -lXrandr $xrender_libs"],
[true], $xrender_libs -lXext -lX11)
fi
fi
@@ -1537,7 +1548,7 @@ have_xinput=no
with_xinput_req=unspecified
xinput_halfassed=no
AC_ARG_WITH(xinput-ext,
-[ --with-xinput-ext Include support for the XInput2 extension.],
+[ --with-xinput-ext The XInput2 extension is required.],
[with_xinput="$withval"; with_xinput_req="$withval"], [with_xinput=yes])
HANDLE_X_PATH_ARG(with_xinput, --with-xinput-ext, XINPUT)
@@ -1563,6 +1574,10 @@ if test "$with_xinput" = yes; then
AC_DEFINE(HAVE_XINPUT)
fi
+elif test "$with_xinput" = no; then
+ echo "error: --without-xinput-ext is not supported."
+ exit 1
+
elif test "$with_xinput" != no; then
echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
exit 1
@@ -1779,31 +1794,6 @@ fi
###############################################################################
#
-# Check for the SGI XReadDisplay server extension.
-#
-###############################################################################
-
-have_readdisplay=no
-with_readdisplay_req=unspecified
-AC_ARG_WITH(readdisplay,
-[ --with-readdisplay Include support for the SGI XReadDisplay extension.],
- [with_readdisplay="$withval"; with_readdisplay_req="$withval"],
- [with_readdisplay=$ac_irix])
-
-HANDLE_X_PATH_ARG(with_readdisplay, --with-readdisplay, XReadDisplay)
-
-if test "$with_readdisplay" = yes; then
- AC_CHECK_X_HEADER(X11/extensions/readdisplay.h,
- AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION),,
- [#include <X11/Xlib.h>])
-elif test "$with_readdisplay" != no; then
- echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
- exit 1
-fi
-
-
-###############################################################################
-#
# Check for the XSHM server extension.
#
###############################################################################
@@ -2117,7 +2107,8 @@ if test "$with_systemd" = yes; then
have_systemd=no
systemd_halfassed=yes
AC_MSG_RESULT(checking for libsystemd usability...)
- AC_CHECK_X_LIB(c, sd_bus_open_system,
+ # sd_bus_track_count_name was added in some later version of systemd.
+ AC_CHECK_X_LIB(c, sd_bus_track_count_name,
[have_systemd=yes; systemd_halfassed=no],,
$ac_systemd_config_libs -lX11 -lXext -lm)
fi
@@ -2140,6 +2131,87 @@ fi
###############################################################################
#
+# Check for -lelogind, a stripped down subset of systemd.
+#
+###############################################################################
+
+have_elogind=no
+with_elogind_req=unspecified
+elogind_halfassed=no
+elogind_too_old=no
+AC_ARG_WITH(elogind,
+[ --with-elogind Use elogind instead of systemd.],
+ [with_elogind="$withval"; with_elogind_req="$withval"],
+ [with_elogind=yes])
+
+HANDLE_X_PATH_ARG(with_elogind, --with-elogind, elogind)
+
+if test "$with_elogind" != yes -a "$with_elogind" != no ; then
+ echo "error: must be yes or no: --with-elogind=$with_elogind"
+ exit 1
+fi
+
+if test "$with_elogind" = yes; then
+
+ pkgs=''
+ ok="yes"
+ pkg_check_version libelogind 221
+ have_elogind="$ok"
+
+ if test "$have_elogind" = no; then
+ if $pkg_config --exists libelogind ; then
+ elogind_too_old=yes
+ fi
+ fi
+
+ if test "$have_elogind" = yes; then
+ AC_CACHE_CHECK([for libelogind includes], ac_cv_elogind_config_cflags,
+ [ac_cv_elogind_config_cflags=`$pkg_config --cflags $pkgs`])
+ AC_CACHE_CHECK([for libelogind libs], ac_cv_elogind_config_libs,
+ [ac_cv_elogind_config_libs=`$pkg_config --libs $pkgs`])
+ fi
+
+ ac_elogind_config_cflags=$ac_cv_elogind_config_cflags
+ ac_elogind_config_libs=$ac_cv_elogind_config_libs
+
+ if test "$have_elogind" = yes; then
+ #
+ # we appear to have libelogind; check for headers/libs to be sure.
+ #
+ ac_save_elogind_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_elogind_config_cflags"
+
+ have_elogind=no
+ AC_CHECK_X_HEADER(elogind/sd-bus.h, [have_elogind=yes])
+
+ CPPFLAGS="$ac_save_elogind_CPPFLAGS"
+ fi
+
+ if test "$have_elogind" = yes; then
+ # we have the headers, now check for the libraries
+ have_elogind=no
+ elogind_halfassed=yes
+ AC_MSG_RESULT(checking for libelogind usability...)
+ AC_CHECK_X_LIB(c, sd_bus_track_count_name,
+ [have_elogind=yes; elogind_halfassed=no],,
+ $ac_elogind_config_libs -lX11 -lXext -lm)
+ fi
+
+ if test "$have_elogind" = no; then
+ AC_MSG_RESULT(checking for libelogind usability... no)
+ fi
+fi
+
+if test "$have_elogind" = yes; then
+ INCLUDES="$INCLUDES $ac_elogind_config_cflags"
+ EXES_SYSTEMD='$(EXES_SYSTEMD)'
+ SYSTEMD_LIBS="$ac_elogind_config_libs"
+ AC_DEFINE(HAVE_LIBELOGIND)
+fi
+
+
+###############################################################################
+#
# The --enable-locking option
#
# Note: "configure --help" list all "--enable" options before any
@@ -2219,7 +2291,7 @@ AC_ARG_WITH(pam,[
Screen Locking Options:
--disable-locking Do not allow locking of the display at all.
- --with-pam Include support for PAM (Pluggable Auth Modules).],
+ --with-pam Use Pluggable Authentication Modules.],
[with_pam="$withval"; with_pam_req="$withval"],[with_pam=$with_pam_default])
AC_ARG_WITH([pam_service_name],
@@ -2227,12 +2299,13 @@ AC_ARG_WITH([pam_service_name],
--enable-pam-account Whether PAM should check the result of account
modules when authenticating. Only do this if you
have "account" modules configured on your system.
- --enable-root-passwd Allow the root passwd to unlock, if not using PAM.],
+ --enable-root-passwd Allow the root password to unlock, if not using PAM.],
[pam_service_name="$withval"],[pam_service_name="xscreensaver"])
AC_ARG_ENABLE(pam-check-account-type,
[], # This is documented elsewhere because of --enable/--with option sorting.
- [enable_pam_check_account_type="$enableval"],[enable_pam_check_account_type=no])
+ [enable_pam_check_account_type="$enableval"],
+ [enable_pam_check_account_type=no])
if test "$enable_pam_check_account_type" = yes ; then
AC_DEFINE(PAM_CHECK_ACCOUNT_TYPE)
true
@@ -2276,12 +2349,12 @@ if test "$enable_locking" = yes -a "$with_pam" = yes; then
#include <stdlib.h>
#include <security/pam_appl.h>],
[pam_handle_t *pamh = 0;
- char *s = pam_strerror(pamh, PAM_SUCCESS);],
+ const char *s = pam_strerror(pamh, PAM_SUCCESS);],
[ac_pam_strerror_args=2],
[AC_TRY_X_COMPILE([#include <stdio.h>
#include <stdlib.h>
#include <security/pam_appl.h>],
- [char *s =
+ [const char *s =
pam_strerror(PAM_SUCCESS);],
[ac_pam_strerror_args=1],
[ac_pam_strerror_args=0])])
@@ -2624,47 +2697,6 @@ if test "$enable_locking" = yes ; then
fi
-###############################################################################
-#
-# Strongly suspect that this hasn't been used in years. Also, the same
-# goal is achieved by xscreensaver-auth in XScreenSaver 6. -- jwz, 2021
-#
-# Check for external password helper
-# On SuSE in 1993, instead of having xscreensaver be a setuid program,
-# they fork an external program that takes the password on stdin, and
-# returns true if that password is a valid one. Then only that smaller
-# program needs to be setuid.
-#
-# (Note that this external program is not a GUI: the GUI is still
-# all in xscreensaver itself; the external program just does auth.)
-#
-###############################################################################
-
-#have_passwd_helper=no
-#with_passwd_helper_req=unspecified
-#
-#AC_ARG_WITH(passwd-helper,
-#[ --with-passwd-helper Include support for external password verification.],
-# [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
-## no HANDLE_X_PATH_ARG for this one
-#
-#if test "$enable_locking" = no ; then
-# with_passwd_helper_req=no
-# with_passwd_helper=no
-#fi
-#
-#case "$with_passwd_helper" in
-# ""|no) : ;;
-# /*)
-# AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
-# have_passwd_helper=yes;;
-# *)
-# echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
-# exit 1
-#esac
-
-
-
# Most of the above shadow mechanisms will have set setuid_auth to yes,
# if they were found. But, on some systems, we need setuid even when
# using plain old vanilla passwords.
@@ -2732,13 +2764,14 @@ gtk_halfassed=no
if test "$with_gtk" = yes; then
have_gtk=no
+ pkgs=''
ok="yes"
- pkg_check_version gtk+-2.0 2.22.0 ; ac_gtk_version_string="$vers"
- pkg_check_version gmodule-2.0 2.0.0
- pkg_check_version libxml-2.0 2.4.6
- pkg_check_version gdk-pixbuf-2.0 2.0.0
- pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+ pkg_check_version gtk+-3.0 3.0.0 ; ac_gtk_version_string="$vers"
+ pkg_check_version gmodule-2.0 2.0.0
+ pkg_check_version libxml-2.0 2.4.6
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
have_gtk="$ok"
+ gtk_pkgs="$pkgs"
if test "$have_gtk" = no; then
if test -n "$ac_gtk_version_string" ; then
@@ -2759,7 +2792,7 @@ if test "$with_gtk" = yes; then
GTK_DATADIR=""
if test "$have_gtk" = yes; then
- GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ GTK_DATADIR=`$pkg_config --variable=prefix gtk+-3.0`
GTK_DATADIR="$GTK_DATADIR/share"
fi
@@ -2767,9 +2800,15 @@ if test "$with_gtk" = yes; then
INCLUDES="$INCLUDES $ac_gtk_config_cflags"
GTK_LIBS="$GTK_LIBS $ac_gtk_config_libs"
AC_DEFINE(HAVE_GTK)
- AC_DEFINE(HAVE_GTK2)
AC_DEFINE(HAVE_XML)
fi
+
+ if test "$have_gtk" = yes; then
+ AC_CACHE_CHECK([for Glib resource compiler], ac_cv_glib_res,
+ [ac_cv_glib_res=`$pkg_config --variable=glib_compile_resources gio-2.0`])
+ GLIB_COMPILE_RESOURCES="$ac_cv_glib_res"
+ fi
+
fi
@@ -3295,7 +3334,6 @@ AC_ARG_WITH(gl,
[
Graphics Options:
- --with-gl Build those demos which depend on OpenGL.
--with-gles Emulate OpenGL 1.3 in terms of OpenGL ES 1.x.],
[with_gl="$withval"; with_gl_req="$withval"],[with_gl=yes])
@@ -3451,6 +3489,13 @@ if test "$with_gl" = yes; then
fi
+elif test "$with_gl" = no; then
+ echo "error: --without-opengl is not supported."
+ # You may be saying "but but but microcontrollers" -- bullshit.
+ # It is the Twenty-First Century, and in This Modern World, every
+ # extant microcontroller is more performant than the desktop
+ # computers on which I developed most of the OpenGL hacks.
+ exit 1
elif test "$with_gl" != no; then
echo "error: must be yes or no: --with-gl=$with_gl"
@@ -3714,6 +3759,7 @@ fi
###############################################################################
have_gdk_pixbuf=no
+have_gdk_pixbuf_xlib=no
with_gdk_pixbuf_req=unspecified
AC_ARG_WITH(pixbuf,
[ --with-pixbuf Include support for the GDK-Pixbuf library, which
@@ -3744,11 +3790,10 @@ if test "$with_gdk_pixbuf" = yes; then
pkgs=''
ok="yes"
-
- pkg_check_version gdk-pixbuf-2.0 2.0.0
- pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
- pkg_check_version gio-2.0 2.0.0
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
+ pkg_check_version gio-2.0 2.0.0
have_gdk_pixbuf="$ok"
+ pixbuf_pkgs="$pkgs"
if test "$have_gdk_pixbuf" = yes; then
AC_CACHE_CHECK([for gdk-pixbuf includes], ac_cv_gdk_pixbuf_config_cflags,
@@ -3767,50 +3812,17 @@ if test "$with_gdk_pixbuf" = yes; then
#
ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags"
-
have_gdk_pixbuf=no
-
- # check for header A...
AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf.h, [have_gdk_pixbuf=yes])
-
- # if that worked, check for header B...
- if test "$have_gdk_pixbuf" = yes; then
- have_gdk_pixbuf=no
- gdk_pixbuf_halfassed=yes
- AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf-xlib.h,
- [have_gdk_pixbuf=yes
- gdk_pixbuf_halfassed=no])
-
- # yay, it has a new name in Gtk 2.x...
- if test "$have_gdk_pixbuf" = no; then
- have_gdk_pixbuf=no
- gdk_pixbuf_halfassed=yes
- AC_CHECK_X_HEADER(gdk-pixbuf-xlib/gdk-pixbuf-xlib.h,
- [have_gdk_pixbuf=yes
- gdk_pixbuf_halfassed=no])
- fi
- fi
CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS"
fi
if test "$have_gdk_pixbuf" = yes; then
# we have the headers, now check for the libraries
have_gdk_pixbuf=no
- gdk_pixbuf_halfassed=yes
-
AC_MSG_RESULT(checking for gdk_pixbuf usability...)
-
- # library A...
AC_CHECK_X_LIB(c, gdk_pixbuf_new_from_file, [have_gdk_pixbuf=yes],,
$ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
- # library B...
- if test "$have_gdk_pixbuf" = yes; then
- have_gdk_pixbuf=no
- AC_CHECK_X_LIB(c, gdk_pixbuf_xlib_init,
- [have_gdk_pixbuf=yes
- gdk_pixbuf_halfassed=no],,
- $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
- fi
fi
if test "$have_gdk_pixbuf" = yes; then
@@ -3829,6 +3841,69 @@ if test "$with_gdk_pixbuf" = yes; then
fi
+# Now that we have checked for gdk_pixbuf, check for gdk_pixbuf_xlib
+# separately, since it has fallen out of fashion in recent years.
+#
+#have_gdk_pixbuf_xlib=no
+#gdk_pixbuf_xlib_halfassed=no
+#if test "$with_gdk_pixbuf" = yes -a "$have_gdk_pixbuf" = yes; then
+#
+# have_gdk_pixbuf_xlib=no
+# pkgs="$pixbuf_pkgs"
+# ok="yes"
+# pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+# pkg_check_version gdk-pixbuf-2.0 2.0.0
+# have_gdk_pixbuf_xlib="$ok"
+# pixbuf_xlib_pkgs="$pkgs"
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# AC_CACHE_CHECK([for gdk-pixbuf-xlib includes],
+# ac_cv_gdk_pixbuf_xlib_config_cflags,
+# [ac_cv_gdk_pixbuf_xlib_config_cflags=`$pkg_config --cflags $pkgs`])
+# AC_CACHE_CHECK([for gdk-pixbuf-xlib libs],
+# ac_cv_gdk_pixbuf_xlib_config_libs,
+# [ac_cv_gdk_pixbuf_xlib_config_libs=`$pkg_config --libs $pkgs`])
+# fi
+#
+# ac_gdk_pixbuf_xlib_config_cflags=$ac_cv_gdk_pixbuf_xlib_config_cflags
+# ac_gdk_pixbuf_xlib_config_libs=$ac_cv_gdk_pixbuf_xlib_config_libs
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# #
+# # we appear to have pixbuf_xlib; check for headers/libs to be sure.
+# #
+# ac_save_gdk_pixbuf_xlib_CPPFLAGS="$CPPFLAGS"
+# CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_xlib_config_cflags"
+# have_gdk_pixbuf_xlib=no
+# gdk_pixbuf_xlib_halfassed=yes
+# AC_CHECK_X_HEADER(gdk-pixbuf-xlib/gdk-pixbuf-xlib.h,
+# [have_gdk_pixbuf_xlib=yes
+# gdk_pixbuf_xlib_halfassed=no])
+# CPPFLAGS="$ac_save_gdk_pixbuf_xlib_CPPFLAGS"
+# fi
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# # we have the headers, now check for the libraries
+# have_gdk_pixbuf_xlib=no
+# gdk_pixbuf_xlib_halfassed=yes
+#
+# AC_MSG_RESULT(checking for gdk_pixbuf_xlib usability...)
+# AC_CHECK_X_LIB(c, gdk_pixbuf_xlib_init,
+# [have_gdk_pixbuf_xlib=yes
+# gdk_pixbuf_xlib_halfassed=no],,
+# $ac_gdk_pixbuf_xlib_config_libs -lX11 -lXext -lm)
+# fi
+#
+# if test "$have_gdk_pixbuf_xlib" = yes; then
+# INCLUDES="$INCLUDES $ac_gdk_pixbuf_xlib_config_cflags"
+# PNG_LIBS="$ac_gdk_pixbuf_xlib_config_libs"
+# AC_DEFINE(HAVE_GDK_PIXBUF_XLIB)
+# else
+# AC_MSG_RESULT(checking for gdk_pixbuf_xlib usability... no)
+# fi
+#fi
+
+
###############################################################################
#
# Check for -lXft
@@ -3920,6 +3995,144 @@ fi
###############################################################################
#
+# Check for various ffmpeg libraries
+#
+###############################################################################
+
+pkgs=''
+ok="yes"
+pkg_check_version libavutil 54.0.0
+have_avutil="$ok"
+pkg_check_version libavcodec 56.0.0
+have_avcodec="$ok"
+pkg_check_version libavformat 56.0.0
+have_avformat="$ok"
+pkg_check_version libswscale 3.0.0
+have_swscale="$ok"
+pkg_check_version libswresample 1.0.0
+have_swresample="$ok"
+
+# Check includes
+if test "$have_avutil" = yes; then
+ ac_save_avutil_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_avutil_config_cflags"
+ have_avutil=no
+ AC_CHECK_X_HEADER(libavutil/avutil.h, [have_avutil=yes])
+ CPPFLAGS="$ac_save_avutil_CPPFLAGS"
+fi
+
+if test "$have_avcodec" = yes; then
+ ac_save_avcodec_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_avcodec_config_cflags"
+ have_avcodec=no
+ AC_CHECK_X_HEADER(libavcodec/avcodec.h, [have_avcodec=yes])
+ CPPFLAGS="$ac_save_avcodec_CPPFLAGS"
+fi
+
+if test "$have_avformat" = yes; then
+ ac_save_avformat_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_avformat_config_cflags"
+ have_avformat=no
+ AC_CHECK_X_HEADER(libavformat/avformat.h, [have_avformat=yes])
+ CPPFLAGS="$ac_save_avformat_CPPFLAGS"
+fi
+
+if test "$have_swscale" = yes; then
+ ac_save_swscale_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_swscale_config_cflags"
+ have_swscale=no
+ AC_CHECK_X_HEADER(libswscale/swscale.h, [have_swscale=yes])
+ CPPFLAGS="$ac_save_swscale_CPPFLAGS"
+fi
+
+if test "$have_swresample" = yes; then
+ ac_save_swresample_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_swresample_config_cflags"
+ have_swresample=no
+ AC_CHECK_X_HEADER(libswresample/swresample.h, [have_swresample=yes])
+ CPPFLAGS="$ac_save_swresample_CPPFLAGS"
+fi
+
+# Check libs
+
+# My CentOS 7.9 build against ffmpeg 4.2.1 requires all this extra crap too.
+# Not required on Raspbian 11 or macOS.
+extra_ffmpeg_bs=""
+if grep -q '7\.' /etc/centos-release 2>/dev/null ; then
+ extra_ffmpeg_bs="-lfdk-aac -lmp3lame -lspeex -ltheora -ltheoraenc -ltheoradec -lvorbis -lvorbisenc -lx264 -lz -lbz2 -llzma -ldl -pthread"
+fi
+
+if test "$have_avutil" = yes; then
+ have_avutil=no
+ AC_MSG_RESULT(checking for libavutil usability...)
+ AC_CHECK_X_LIB(avutil, avutil_version,
+ [have_avutil=yes; avutil_halfassed=no],,
+ `$pkg_config --libs libavutil libswresample` $extra_ffmpeg_bs)
+fi
+
+if test "$have_avcodec" = yes; then
+ have_avcodec=no
+ AC_MSG_RESULT(checking for libavcodec usability...)
+ AC_CHECK_X_LIB(avcodec, avcodec_version,
+ [have_avcodec=yes; avcodec_halfassed=no],,
+ `$pkg_config --libs libavcodec libswresample` $PTHREAD_LIBS
+ -lm $extra_ffmpeg_bs)
+fi
+
+if test "$have_avformat" = yes; then
+ have_avformat=no
+ AC_MSG_RESULT(checking for libavformat usability...)
+ AC_CHECK_X_LIB(avformat, avformat_version,
+ [have_avformat=yes; avformat_halfassed=no],,
+ `$pkg_config --libs libavformat libswresample` $PTHREAD_LIBS
+ -lm $extra_ffmpeg_bs)
+fi
+
+if test "$have_swscale" = yes; then
+ have_swscale=no
+ AC_MSG_RESULT(checking for libswscale usability...)
+ AC_CHECK_X_LIB(swscale, swscale_version,
+ [have_swscale=yes; swscale_halfassed=no],,
+ `$pkg_config --libs libswscale` $PTHREAD_LIBS -lm
+ $extra_ffmpeg_bs)
+fi
+
+if test "$have_swresample" = yes; then
+ have_swresample=no
+ AC_MSG_RESULT(checking for libswresample usability...)
+ AC_CHECK_X_LIB(swresample, swresample_version,
+ [have_swresample=yes; swresample_halfassed=no],,
+ `$pkg_config --libs libswresample` $PTHREAD_LIBS -lm
+ $extra_ffmpeg_bs)
+fi
+
+
+have_ffmpeg=no
+if test "$have_avformat" = yes -a \
+ "$have_avcodec" = yes -a \
+ "$have_avutil" = yes -a \
+ "$have_swscale" = yes -a \
+ "$have_swresample" = yes ; then
+ have_ffmpeg=yes
+ AC_CACHE_CHECK([for ffmpeg includes], ac_cv_ffmpeg_config_cflags,
+ [ac_cv_ffmpeg_config_cflags=`$pkg_config --cflags $pkgs`])
+ AC_CACHE_CHECK([for ffmpeg libs], ac_cv_ffmpeg_config_libs,
+ [ac_cv_ffmpeg_config_libs=`$pkg_config --libs $pkgs`])
+ AC_DEFINE(HAVE_FFMPEG)
+ FFMPEG_OBJS='$(FFMPEG_OBJS)'
+fi
+ac_ffmpeg_config_cflags=$ac_cv_ffmpeg_config_cflags
+ac_ffmpeg_config_libs=$ac_cv_ffmpeg_config_libs
+FFMPEG_CFLAGS="$ac_ffmpeg_config_cflags"
+FFMPEG_LIBS="$ac_ffmpeg_config_libs"
+
+if test "$have_ffmpeg" = yes ; then
+ FFMPEG_LIBS="$FFMPEG_LIBS $extra_ffmpeg_bs"
+fi
+
+
+###############################################################################
+#
# Check for pty support: this allows 'phosphor' and 'apple2'
# to run curses-based programs, or be used as terminal windows.
#
@@ -4031,8 +4244,8 @@ elif test "$record_anim" != no; then
fi
if test "$record_anim" = yes; then
- if test "$have_gdk_pixbuf" != yes; then
- AC_MSG_ERROR(--with-record-animation requires GDK-Pixbuf)
+ if test "$have_ffmpeg" != yes; then
+ AC_MSG_WARN(--with-record-animation requires the ffmpeg libraries)
else
AC_MSG_RESULT(enabling --with-record-animation)
AC_DEFINE(HAVE_RECORD_ANIM)
@@ -4089,12 +4302,8 @@ if test "$enable_pam_check_account_type" = yes; then
else
COMMENT_PAM_CHECK_ACCOUNT="#"
fi
-#if test "$have_passwd_helper" = yes; then
-# PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
-# PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
-#fi
- PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
- PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
+PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
+PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
if test "$enable_locking" = yes; then
@@ -4181,7 +4390,7 @@ AC_MSG_CHECKING([for locale directory])
if test -n "$GTK_DATADIR" ; then
PO_DATADIR="$GTK_DATADIR"
elif test "$have_gtk" = yes; then
- PO_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ PO_DATADIR=`$pkg_config --variable=prefix gtk+-3.0`
PO_DATADIR="$PO_DATADIR/share"
fi
@@ -4245,6 +4454,7 @@ AC_SUBST(SETUID_HACKS)
AC_SUBST(SETCAP_HACKS)
AC_SUBST(INSTALL_DIRS)
AC_SUBST(INSTALL_PAM)
+AC_SUBST(GLIB_COMPILE_RESOURCES)
AC_SUBST(HAVE_PAM_FAIL_DELAY)
AC_SUBST(COMMENT_PAM_CHECK_ACCOUNT)
AC_SUBST(NEW_LOGIN_COMMAND)
@@ -4288,6 +4498,9 @@ AC_SUBST(HACK_CONF_DIR)
AC_SUBST(FONT_DIR)
AC_SUBST(ANIM_OBJS)
AC_SUBST(ANIM_LIBS)
+AC_SUBST(FFMPEG_OBJS)
+AC_SUBST(FFMPEG_CFLAGS)
+AC_SUBST(FFMPEG_LIBS)
APPDEFAULTS=$ac_x_app_defaults
AC_SUBST(APPDEFAULTS)
@@ -4316,6 +4529,8 @@ AC_OUTPUT
#
###############################################################################
+CONF_STATUS=0
+
warn_prefix_1=" Warning:"
warn_prefix_2=" Note:"
warn_prefix="$warn_prefix_1"
@@ -4374,65 +4589,81 @@ if test "$ac_prog_cc_no_pthread" ; then
warn2 "support POSIX threads."
echo ""
warn2 "If you have multiple CPU cores, try CC=$PTHREAD_CC."
+ CONF_STATUS=1
elif test "$with_pthread_req" = yes -a "$have_pthread" = no ; then
warn 'POSIX threads were requested, but were not found.'
+ CONF_STATUS=1
fi
if test "$with_sgi_req" = yes -a "$have_sgi" = no ; then
warn 'The SGI saver extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
warn 'The XIdle extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_mit_req" = yes -a "$have_mit" = no ; then
warn 'The MIT-SCREEN-SAVER extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
warn 'The XSHM extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
+ CONF_STATUS=1
fi
#if test "$with_xcomposite_req" = yes -a "$have_xcomposite" = no ; then
# warn 'The XCOMPOSITE extension was requested, but was not found.'
+# CONF_STATUS=1
#fi
if test "$with_xkb_req" = yes -a "$have_xkb" = no ; then
warn 'The X Keyboard extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
warn 'The DPMS extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xinerama_req" = yes -a "$have_xinerama" = no ; then
warn 'The Xinerama extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
warn 'The XF86VMODE extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_randr_req" = yes -a "$have_randr" = no ; then
warn 'The RANDR extension was requested, but was not found.'
+ CONF_STATUS=1
fi
if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
warn "Checking of /proc/interrupts was requested, but it's bogus."
+ CONF_STATUS=1
fi
if test "$pkg_config" = false ; then
warnL 'The "pkg-config" program was not found. Without that,'
warn2 "detection of the various GTK libraries won't work."
+ CONF_STATUS=1
else
pkgerr=`$pkg_config --list-all 2>&1 >/dev/null`
if test "x$pkgerr" != "x" ; then
@@ -4441,20 +4672,20 @@ else
warn2 "The errors are:"
echo ''
echo "$pkgerr" | sed 's/^/ > /g'
+ CONF_STATUS=1
fi
fi
if test "$gtk_halfassed" != no ; then
- warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK can't be used."
+ warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK"
+ warn2 "can't be used."
+ CONF_STATUS=1
fi
motif_warn2() {
- warn2 'Though the Motif front-end to xscreensaver is still'
- warn2 'maintained, it is no longer being updated with new'
- warn2 'features: all new development on the xscreensaver-settings'
- warn2 'program is happening in the GTK version, and not in the'
- warn2 'Motif version. It is recommended that you build against'
- warn2 'GTK instead of Motif. See <http://www.gtk.org/>.'
+ warn2 "The Motif version of \`xscreensaver-settings' is missing many"
+ warn2 'features. It is strongly recommended that you build the GTK'
+ warn2 'version instead.'
}
if test "$have_motif" = no -a "$have_gtk" = no; then
@@ -4464,9 +4695,11 @@ if test "$have_motif" = no -a "$have_gtk" = no; then
warn2 "\`xscreensaver-settings' program requires one of these."
echo ''
motif_warn2
+ CONF_STATUS=1
else
warnL "The GTK libraries do not seem to be available; the"
warn2 "\`xscreensaver-settings' program requires them."
+ CONF_STATUS=1
# echo ''
# warn2 'You can use Motif or Lesstif instead of GTK (use the'
# warn2 "\`--with-motif' option) but that is NOT recommended."
@@ -4476,20 +4709,24 @@ if test "$have_motif" = no -a "$have_gtk" = no; then
elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
warnL "Use of Motif was requested, but it wasn't found;"
warn2 "Gtk will be used instead."
+ CONF_STATUS=1
elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
warnL "Use of Gtk was requested, but it wasn't found."
+ CONF_STATUS=1
fi
if test "$ac_cv_libxt" != yes ; then
warnL 'The Xt library was not found. It is required.'
+ CONF_STATUS=1
fi
if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then
warn "GTK is being used, but the GDK-Pixbuf library and/or"
warn2 "headers were not found. That can't be good. Please"
warn2 "install the GDK-Pixbuf development kit and re-configure."
+ CONF_STATUS=1
fi
if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
@@ -4507,6 +4744,7 @@ if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
warn2 "use with XScreenSaver; it is strongly recommended"
warn2 "that you upgrade to at least version $preferred_lesstif!"
warn2 "See <http://www.lesstif.org/>."
+ CONF_STATUS=1
fi
fi
@@ -4525,10 +4763,10 @@ halfassery() {
if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then
warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
+ CONF_STATUS=1
fi
-if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
- test "$have_gdk_pixbuf" = no ; then
+if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes ; then
if test "$with_gdk_pixbuf_req" = yes ; then
true
@@ -4551,9 +4789,30 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
fi
+#if test "$have_gdk_pixbuf" = yes -a "$have_gdk_pixbuf_xlib" = no ; then
+#
+# warnL 'The GDK-Pixbuf-Xlib library was not found.'
+#
+# if test "$gdk_pixbuf_xlib_halfassed" = yes ; then halfassery ; fi
+# if test "$have_png" = yes ; then
+# echo ''
+# warn2 'The PNG library is being used instead.'
+# fi
+#
+# echo ''
+# warn2 'Some of the demos will not use images as much as they could.'
+# warn2 'You should consider installing GDK-Pixbuf-Xlib and re-running'
+# warn2 'configure.'
+# echo ''
+# warn2 "Recently, some distros have stopped distributing"
+# warn2 "GDK-Pixbuf-Xlib entirely. So good luck with that."
+#fi
+
+
if test "$have_jpeg" = no ; then
if test "$with_jpeg_req" = yes ; then
warnL 'Use of libjpeg was requested, but it was not found.'
+ CONF_STATUS=1
elif test "$with_jpeg_req" = no ; then
warnL 'The JPEG library is not being used.'
else
@@ -4566,6 +4825,7 @@ if test "$have_jpeg" = no ; then
warn2 "This means that it won't be possible for the image-manipulating"
warn2 "display modes to load files from disk; and it also means that"
warn2 "the \`webcollage' program will be much slower."
+ CONF_STATUS=1
else
warn2 "This means the \`webcollage' program will be much slower."
fi
@@ -4575,6 +4835,7 @@ fi
if test "$have_png" = no ; then
if test "$with_png_req" = yes ; then
warnL 'Use of libpng was requested, but it was not found.'
+ CONF_STATUS=1
elif test "$with_png_req" = no ; then
warnL 'The PNG library is not being used.'
else
@@ -4583,18 +4844,21 @@ if test "$have_png" = no ; then
if test "$png_halfassed" = yes ; then halfassery ; fi
warn2 "Many things aren't going to work right."
+ CONF_STATUS=1
fi
if test "$have_xinput" = no ; then
warnL 'The XInput2 library was not found. It is required.'
if test "$xinput_halfassed" = yes ; then halfassery ; else echo '' ; fi
+ CONF_STATUS=1
fi
if test "$have_xft" = no ; then
warnL 'The XFreeType library was not found. It is required.'
if test "$xft_halfassed" = yes ; then halfassery ; else echo '' ; fi
+ CONF_STATUS=1
fi
@@ -4603,9 +4867,11 @@ if test "$have_systemd" = no ; then
if test "$systemd_too_old" = yes ; then
warnL "The systemd library is too old."
systemd_warned=yes
+ CONF_STATUS=1
elif test "$with_systemd_req" = yes ; then
warnL "Use of systemd was requested, but it was not found."
systemd_warned=yes
+ CONF_STATUS=1
elif test "$ac_macosx" = yes; then
true
elif test "$with_systemd_req" = no ; then
@@ -4619,6 +4885,7 @@ if test "$have_systemd" = no ; then
if test "$systemd_halfassed" = yes ; then
halfassery
systemd_warned=yes
+ CONF_STATUS=1
fi
if test "$systemd_warned" = yes; then
@@ -4633,11 +4900,14 @@ fi
if test "$have_gl" = no ; then
if test "$with_gl_req" = yes ; then
- warnL 'Use of GL was requested, but it was not found.'
+ warnL 'The OpenGL 3D library is required, but it was not found.'
+ CONF_STATUS=1
elif test "$with_gl_req" = no ; then
noteL 'The OpenGL 3D library is not being used.'
+ CONF_STATUS=1
else
noteL 'The OpenGL 3D library was not found.'
+ CONF_STATUS=1
fi
if test "$gl_halfassed" = yes ; then
@@ -4650,9 +4920,7 @@ if test "$have_gl" = no ; then
echo ''
warn2 'Those demos which use 3D will not be built or installed.'
- warn2 'You might want to consider installing OpenGL and'
- warn2 're-running configure.'
-
+ warn2 'That is most of them.'
fi
if test "$have_gl" = yes -a "$have_gle" = no ; then
@@ -4665,6 +4933,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
noteL 'Use of the GLE (GL Extrusion) library was requested, but'
warn2 'it was not found (though the OpenGL library was found, and'
warn2 'is being used.)'
+ CONF_STATUS=1
elif test "$with_gle_req" = no ; then
noteL 'The OpenGL Library is being used, but the GLE (GL Extrusion)'
warn2 'library is not.'
@@ -4687,28 +4956,33 @@ fi
if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
warn 'Use of XReadDisplay was requested, but it was not found.'
+ CONF_STATUS=1
fi
if test "$with_kerberos_req" = yes -a "$have_kerberos" = no ; then
warn 'Use of Kerberos was requested, but it was not found.'
+ CONF_STATUS=1
fi
if test "$with_pam_req" = yes -a "$have_pam" = no ; then
warn 'Use of PAM was requested, but it was not found.'
-elif test "$have_pam" = no ; then
+ CONF_STATUS=1
+elif test "$have_pam" = no -a "$enable_locking" = yes ; then
if test -d /etc/pam.d -o -f /etc/pam.conf ; then
warn "Your system seems to have PAM, but PAM is not being used."
warn2 "That is probably not going to work out well."
-
+ CONF_STATUS=1
fi
fi
if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
warn 'Use of shadow passwords was requested, but they were not found.'
+ CONF_STATUS=1
fi
if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then
warn 'Use of libcap was requested, but it was not found.'
+ CONF_STATUS=1
fi
if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then
@@ -4716,6 +4990,17 @@ if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then
warn2 "THIS DOES NOT WORK! Don't do this!"
fi
+if test "$have_jwzgles" = yes ; then
+ warn "Do not use --with-gles unless you are sure that you know"
+ warn2 "what you are doing! It is not recommended on normal X11"
+ warn2 "systems."
+
+ if test "$have_egl" = no; then
+ warn2 ""
+ warn2 "Using --with-gles and --with-glx probably won't work."
+ fi
+fi
+
# You are in a twisty maze of namespaces and syntaxes, all alike.
# Expand all of these as the Makefile will probably expand them.
@@ -4774,7 +5059,7 @@ if test \! -z "$rpm_vers" ; then
pkg_bindir2=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
pkg_hackdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'`
pkg_confdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
- pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\).*\.ttf$@\1@p' | head -1`
pkg_addir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'`
if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi
@@ -4804,7 +5089,7 @@ if test \! -z "$deb_vers" ; then
pkg_bindir2=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'`
pkg_hackdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'`
pkg_confdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'`
- pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)\.ttf$@\1@p'`
+ pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\).*\.ttf$@\1@p' | head -1`
pkg_addir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'`
changequote([,])
@@ -4857,3 +5142,5 @@ echo " Configuration: ${HACK_CONF_DIR}/$confdir_err"
echo " Extra Fonts: ${FONT_DIR}$fontdir_err"
echo " App Defaults: ${APPDEFAULTS}/$addir_err"
echo ""
+
+exit $CONF_STATUS
diff --git a/driver/.gdbinit b/driver/.gdbinit
deleted file mode 100644
index a585259..0000000
--- a/driver/.gdbinit
+++ /dev/null
@@ -1,27 +0,0 @@
-# If you're debugging xscreensaver and you are running a virtual root window
-# manager, you'd better let the process handle these signals: it remaps the
-# virtual root window when they arrive. If you don't do this, your window
-# manager will be hosed.
-#
-# Also, gdb copes badly with breakpoints in functions that are called on the
-# other side of a fork(). The Trace/BPT traps cause the spawned process to
-# die.
-#
-#handle 1 pass nostop
-#handle 3 pass nostop
-#handle 4 pass nostop
-#handle 6 pass nostop
-#handle 7 pass nostop
-#handle 8 pass nostop
-#handle 9 pass nostop
-#handle 10 pass nostop
-#handle 11 pass nostop
-#handle 12 pass nostop
-#handle 13 pass nostop
-#handle 15 pass nostop
-#handle 19 pass nostop
-set env MallocGuardEdges 1
-set env MallocPreScribble 1
-set env MallocScribble 1
-b exit
-set args -debug
diff --git a/driver/Makefile.in b/driver/Makefile.in
index 0e986a9..4b3c1cb 100644
--- a/driver/Makefile.in
+++ b/driver/Makefile.in
@@ -1,9 +1,9 @@
-# driver/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
+# driver/Makefile.in --- xscreensaver, Copyright © 1997-2023 Jamie Zawinski.
# the `../configure' script generates `driver/Makefile' from this file.
@SET_MAKE@
.SUFFIXES:
-.SUFFIXES: .c .m .o .desktop .desktop.in
+.SUFFIXES: .c .m .o .desktop .desktop.in .service .service.in
srcdir = @srcdir@
VPATH = @srcdir@
@@ -29,7 +29,9 @@ mansuffixB = 6
GTK_DATADIR = @GTK_DATADIR@
GTK_APPDIR = $(GTK_DATADIR)/applications
GTK_ICONDIR = $(GTK_DATADIR)/pixmaps
-GTK_UIDIR = $(GTK_DATADIR)/xscreensaver/ui
+GTK_SHAREDIR = $(GTK_DATADIR)/xscreensaver
+UPDATE_ICON_CACHE = gtk-update-icon-cache
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
HACKDIR = @HACKDIR@
HACK_CONF_DIR = @HACK_CONF_DIR@
@@ -51,6 +53,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SETUID = $(INSTALL_PROGRAM) $(SUID_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_DIRS = @INSTALL_DIRS@
+HACKDIR = @HACKDIR@
X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
@@ -81,8 +84,7 @@ PAM_DIR = $(PAM_ROOT)/pam.d
PAM_CONF = $(PAM_ROOT)/pam.conf
ICON_SRC = $(UTILS_SRC)/images
-LOGO = $(ICON_SRC)/logo-50.xpm
-GTK_ICONS = $(ICON_SRC)/screensaver-*.png
+LOGO = $(ICON_SRC)/logo-512.png
UTILS_SRC = $(srcdir)/../utils
UTILS_BIN = ../utils
@@ -94,7 +96,7 @@ LIBS_PRE = $(LIBS) $(X_LIBS) $(X_PRE_LIBS)
LIBS_POST = $(X_EXTRA_LIBS)
XDPMS_LIBS = @XDPMS_LIBS@
-XINERAMA_LIBS = @XINERAMA_LIBS@ $(FIXME)
+XINERAMA_LIBS = @XINERAMA_LIBS@
XINPUT_LIBS = -lXi
XML_LIBS = @XML_LIBS@
@@ -118,6 +120,7 @@ GFX_OBJS = xscreensaver-gfx.o screens.o windows.o subprocs.o \
$(UTILS_BIN)/font-retry.o \
$(UTILS_BIN)/logo.o \
$(UTILS_BIN)/minixpm.o \
+ $(UTILS_BIN)/screenshot.o \
$(UTILS_BIN)/xft.o \
$(UTILS_BIN)/utf8wc.o \
$(UTILS_BIN)/xshm.o \
@@ -134,9 +137,6 @@ KERBEROS_OBJS = passwd-kerberos.o
PAM_SRCS = passwd-pam.c
PAM_OBJS = passwd-pam.o
-PWHELPER_SRCS = passwd-helper.c
-PWHELPER_OBJS = passwd-helper.o
-
PASSWD_SRCS = @PASSWD_SRCS@
PASSWD_OBJS = @PASSWD_OBJS@
@@ -160,7 +160,7 @@ AUTH_OBJS_1 = dialog.o passwd.o setuid.o \
$(UTILS_BIN)/logo.o \
$(UTILS_BIN)/minixpm.o
AUTH_LIBS = $(LIBS_PRE) $(XFT_LIBS) $(XINPUT_LIBS) $(XINERAMA_LIBS) \
- @SAVER_LIBS@ -lXt -lX11 -lXext -lXi \
+ $(XDPMS_LIBS) @SAVER_LIBS@ -lXt -lX11 -lXext -lXi \
@PASSWD_LIBS@ $(LIBS_POST) $(INTL_LIBS)
SYSTEMD_DEFS =
@@ -175,16 +175,16 @@ CMD_LIBS = $(LIBS_PRE) $(XINPUT_LIBS) -lX11 -lXext $(LIBS_POST)
GTK_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"' \
-DDEFAULT_PATH_PREFIX='"@HACKDIR@"' \
- -DDEFAULT_ICONDIR='"$(GTK_UIDIR)"' \
-DLOCALEDIR=\"$(localedir)\" \
-I$(ICON_SRC)
GTK_SRCS = demo-Gtk.c demo-Gtk-conf.c
-GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o \
- blurb.o exec.o prefs.o prefsw.o dpms.o remote.o \
+GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o demo-Gtk-resources.o \
+ blurb.o exec.o prefs.o prefsw.o dpms.o remote.o screens.o \
clientmsg.o atoms.o \
$(UTILS_BIN)/xmu.o \
$(UTILS_BIN)/resources.o \
$(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/screenshot.o \
$(UTILS_BIN)/usleep.o
GTK_LIBS = $(LIBS_PRE) $(INTL_LIBS) $(XDPMS_LIBS) \
$(XINERAMA_LIBS) $(XML_LIBS) @GTK_LIBS@ \
@@ -217,6 +217,7 @@ UTIL_EXES = xscreensaver-gfx @EXES_SYSTEMD@
SETUID_EXES = xscreensaver-auth
DEMO_EXES = @ALL_DEMO_PROGRAMS@
EXES_SYSTEMD = xscreensaver-systemd
+DESKS = xscreensaver.desktop xscreensaver.service
HDRS = XScreenSaver_ad.h XScreenSaver_Xm_ad.h \
xscreensaver.h prefs.h remote.h exec.h \
@@ -225,22 +226,25 @@ HDRS = XScreenSaver_ad.h XScreenSaver_Xm_ad.h \
MENA = xscreensaver.man xscreensaver-settings.man \
xscreensaver-command.man
MENB = xscreensaver-gfx.man xscreensaver-auth.man \
- xscreensaver-command.man xscreensaver-systemd.man
+ xscreensaver-systemd.man
EXTRAS = README Makefile.in \
XScreenSaver.ad.in XScreenSaver-Xm.ad xscreensaver.pam.in \
- xscreensaver.ui screensaver-properties.desktop.in \
- .gdbinit
+ demo.ui prefs.ui gresource.xml xscreensaver.desktop.in \
+ xscreensaver-settings.desktop.in xscreensaver.service.in
TARFILES = $(DAEMON_SRCS) $(GFX_SRCS) $(AUTH_SRCS) $(SYSTEMD_SRCS) \
$(CMD_SRCS) $(GTK_SRCS) $(MOTIF_SRCS) $(PWENT_SRCS) \
- $(PWHELPER_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \
+ $(KERBEROS_SRCS) $(PAM_SRCS) \
$(HDRS) $(MENA) $(MENB) $(TEST_SRCS) $(EXTRAS)
-default: $(EXES) $(UTIL_EXES) $(SETUID_EXES)
-all: $(EXES) $(UTIL_EXES) $(SETUID_EXES) $(DEMO_EXES)
-tests: $(TEST_EXES)
+# Using $(MAKE) directly means the shell executes things even with "make -n"
+MAKE2 = $(MAKE)
+MAKE2CC = $(MAKE2) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+default:: $(EXES) $(UTIL_EXES) $(SETUID_EXES) $(DESKS)
+all:: default $(DEMO_EXES)
+tests:: $(TEST_EXES)
##############################################################################
#
@@ -254,7 +258,7 @@ uninstall: uninstall-program uninstall-ad uninstall-man uninstall-xml \
uninstall-gnome
install-strip:
- $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+ $(MAKE2) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
install-program:: $(EXES)
@if [ ! -d $(install_prefix)$(bindir) ]; then \
@@ -389,8 +393,8 @@ install-man::
echo ln -sf $$F1 $$D/$$F2 ; \
ln -sf $$F1 $$D/$$F2
-# These used to be in driver/ and installed into $(bindir)
-# Now they are in hacks/ and are installed into ${libexecdir}/xscreensaver/
+# These used to be in driver/ and installed into /usr/bin/
+# Now they are in hacks/ and are installed into /usr/libexec/xscreensaver/
OLD_EXES = xscreensaver-getimage xscreensaver-getimage-file \
xscreensaver-getimage-video xscreensaver-text \
xscreensaver-systemd
@@ -511,23 +515,45 @@ install-pam: xscreensaver.pam
$$e "" ;\
fi
-# screensaver-properties.desktop
+
+# xscreensaver.desktop
+# xscreensaver-settings.desktop
# into /usr/share/applications/
-install-gnome:: screensaver-properties.desktop
+install-gnome:: xscreensaver.desktop xscreensaver-settings.desktop
@if [ "$(GTK_DATADIR)" != "" ]; then \
if [ ! -d "$(install_prefix)$(GTK_APPDIR)" ]; then \
echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_APPDIR)" ;\
$(INSTALL_DIRS) "$(install_prefix)$(GTK_APPDIR)" ;\
fi ;\
- name2=xscreensaver-properties.desktop ;\
- echo $(INSTALL_DATA) screensaver-properties.desktop \
- $(install_prefix)$(GTK_APPDIR)/$$name2 ;\
- $(INSTALL_DATA) screensaver-properties.desktop \
- $(install_prefix)$(GTK_APPDIR)/$$name2 ;\
+ old=xscreensaver-properties.desktop ;\
+ if [ -f "$(install_prefix)$(GTK_APPDIR)/$$old" ]; then \
+ echo rm -f "$(install_prefix)$(GTK_APPDIR)/$$old" ;\
+ rm -f "$(install_prefix)$(GTK_APPDIR)/$$old" ;\
+ fi ;\
+ for name in xscreensaver.desktop xscreensaver-settings.desktop ; do\
+ echo $(INSTALL_DATA) $$name $(install_prefix)$(GTK_APPDIR)/$$name;\
+ $(INSTALL_DATA) $$name $(install_prefix)$(GTK_APPDIR)/$$name;\
+ echo chmod a+x $(install_prefix)$(GTK_APPDIR)/$$name ;\
+ chmod a+x $(install_prefix)$(GTK_APPDIR)/$$name ;\
+ done ;\
fi
-
-# xscreensaver.xpm
+# xscreensaver.service
+# into /usr/share/xscreensaver/
+# But maybe it should instead be installed as:
+# $(prefix)/share/dbus-1/system-services/org.jwz.xscreensaver.service
+# Or would that make it be enabled by default?
+#
+install-gnome:: xscreensaver.service
+ @if [ ! -d "$(install_prefix)$(GTK_SHAREDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_SHAREDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_SHAREDIR)" ;\
+ fi ;\
+ name=xscreensaver.service ;\
+ echo $(INSTALL_DATA) $$name $(install_prefix)$(GTK_SHAREDIR)/$$name ;\
+ $(INSTALL_DATA) $$name $(install_prefix)$(GTK_SHAREDIR)/$$name
+
+# xscreensaver.png
# into /usr/share/pixmaps/
install-gnome:: $(LOGO)
@if [ "$(GTK_DATADIR)" != "" ]; then \
@@ -535,70 +561,47 @@ install-gnome:: $(LOGO)
echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)" ;\
$(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)" ;\
fi ;\
- target=xscreensaver.xpm ;\
+ target=xscreensaver.png ;\
echo $(INSTALL_DATA) $(LOGO) \
$(install_prefix)$(GTK_ICONDIR)/$$target ;\
$(INSTALL_DATA) $(LOGO) \
$(install_prefix)$(GTK_ICONDIR)/$$target ;\
fi
-# ../utils/images/screensaver-*.png
-# into /usr/share/xscreensaver/ui/
-install-gnome::
- @if [ "$(GTK_DATADIR)" != "" ]; then \
- if [ ! -d "$(install_prefix)$(GTK_UIDIR)" ]; then \
- echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
- $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
- fi ;\
- for target in $(GTK_ICONS) ; do \
- dest=`echo $$target | sed 's@^.*/@@'` ;\
- echo $(INSTALL_DATA) $$target \
- $(install_prefix)$(GTK_UIDIR)/$$dest ;\
- $(INSTALL_DATA) $$target \
- $(install_prefix)$(GTK_UIDIR)/$$dest ;\
- done ;\
- fi
-
-# xscreensaver.ui
-# into /usr/share/xscreensaver/ui/
-install-gnome:: xscreensaver.ui
- @if [ "$(GTK_DATADIR)" != "" ]; then \
- if [ ! -d "$(install_prefix)$(GTK_UIDIR)" ]; then \
- echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
- $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\
- fi ;\
- target=xscreensaver.ui ;\
- echo $(INSTALL_DATA) $(srcdir)/$$target \
- $(install_prefix)$(GTK_UIDIR)/$$target ;\
- if $(INSTALL_DATA) $(srcdir)/$$target \
- $(install_prefix)$(GTK_UIDIR)/$$target ;\
- then true ;\
- else \
- e=echo ; \
- $$e "" ;\
- $$e " ####################################################################";\
- $$e " Warning: unable to install $$target into" ;\
- $$e " $(install_prefix)$(GTK_UIDIR)/." ;\
- $$e " Without this file, xscreensaver-settings will not" ;\
- $$e " be able to run properly." ;\
- $$e " ####################################################################";\
- $$e "" ;\
- exit 1 ; \
- fi ; \
- fi
-
+install-gnome:: uninstall-old-gnome-icons
+install-gnome:: update-icon-caches
+
+update-icon-caches::
+ @for f in /usr/share/icons/index.theme \
+ /usr/share/icons/*/index.theme \
+ /usr/share/pixmaps/index.theme \
+ /usr/share/pixmaps/*/index.theme \
+ ; do \
+ if [ -f $$f ]; then \
+ f=`dirname $$f` ;\
+ echo $(UPDATE_ICON_CACHE) --force --quiet $$f ;\
+ $(UPDATE_ICON_CACHE) --force --quiet $$f ;\
+ fi ;\
+ done
-# screensaver-properties.desktop
+# xscreensaver.desktop
+# xscreensaver-settings.desktop
# into /usr/share/applications/
uninstall-gnome::
@if [ "$(GTK_DATADIR)" != "" ]; then \
- f=xscreensaver-properties.desktop ;\
- echo rm -f $(install_prefix)$(GTK_APPDIR)/$$f ;\
- rm -f $(install_prefix)$(GTK_APPDIR)/$$f ;\
- fi
+ old=xscreensaver-properties.desktop ;\
+ if [ -f "$old" ]; then \
+ echo rm -f $(install_prefix)$(GTK_APPDIR)/$$old ;\
+ rm -f $(install_prefix)$(GTK_APPDIR)/$$old ;\
+ fi ;\
+ for f in xscreensaver.desktop xscreensaver-settings.desktop; do \
+ echo rm -f $(install_prefix)$(GTK_APPDIR)/$$f ;\
+ rm -f $(install_prefix)$(GTK_APPDIR)/$$f ;\
+ done ;\
+ fi
-# xscreensaver.xpm
-# into /usr/share/pixmaps/
+# xscreensaver.xpm (pre-2022)
+# from /usr/share/pixmaps/
uninstall-gnome::
@if [ "$(GTK_ICONDIR)" != "" ]; then \
target=xscreensaver.xpm ;\
@@ -606,31 +609,31 @@ uninstall-gnome::
rm -f $(install_prefix)$(GTK_ICONDIR)/$$target ;\
fi
-# ../utils/images/screensaver-*.png
-# into /usr/share/xscreensaver/ui/
-uninstall-gnome::
- @if [ "$(GTK_DATADIR)" != "" ]; then \
- for target in $(GTK_ICONS) ; do \
- dest=`echo $$target | sed 's@^.*/@@'` ;\
- echo rm -f $(install_prefix)$(GTK_UIDIR)/$$dest ;\
- rm -f $(install_prefix)$(GTK_UIDIR)/$$dest ;\
- done ;\
- fi
-
-# xscreensaver.ui
-# into /usr/share/xscreensaver/ui/
+# /usr/share/xscreensaver/ui/*.png and *.ui no longer used as of 2022, 6.05.
uninstall-gnome::
- @if [ "$(GTK_DATADIR)" != "" ]; then \
- for target in xscreensaver.ui xscreensaver-demo.ui ; do \
- echo rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\
- rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\
- done ;\
- rmdir "$(GTK_UIDIR)" ;\
- rmdir "$(GTK_DATADIR)/xscreensaver" ;\
- exit 0 ;\
+ @if [ "$(GTK_ICONDIR)" != "" ]; then \
+ echo rm -rf $(install_prefix)$(GTK_SHAREDIR)/ui ;\
+ rm -rf $(install_prefix)$(GTK_SHAREDIR)/ui ;\
fi
-# /usr/share/xscreensaver/glade/ no longer used
+# What is all this crap with the wrong logo?
+# /usr/share/icons/nuoveXT2/16x16/apps/xscreensaver.png through
+# /usr/share/icons/gnome-colors-common/32x32/apps/xscreensaver.png
+uninstall-gnome:: uninstall-old-gnome-icons
+uninstall-old-gnome-icons::
+ @for f in \
+ "$(install_prefix)$(GTK_DATADIR)/icons"/*/*/apps/xscreensaver.png \
+ "$(install_prefix)$(GTK_DATADIR)/icons"/*/*/apps/xscreensaver.svg \
+ "$(install_prefix)$(GTK_ICONDIR)/xscreensaver.xpm" \
+ "$(install_prefix)$(GTK_ICONDIR)/xscreensaver.svg" ;\
+ do \
+ if [ -f "$$f" ]; then \
+ echo rm -f "$$f" ;\
+ rm -f "$$f" ;\
+ fi ;\
+ done
+
+# /usr/share/xscreensaver/glade/ no longer used as of 2022.
uninstall-gnome::
-rm -rf $(GTK_DATADIR)/xscreensaver/glade
@@ -667,7 +670,6 @@ distclean: clean
TAGS *~ "#"* *.rej *.orig \
Makefile \
XScreenSaver.ad \
- screensaver-properties.desktop \
xscreensaver.pam
# Adds all current dependencies to Makefile
@@ -687,7 +689,7 @@ distdepend: check_men update_ad_version XScreenSaver_ad.h XScreenSaver_Xm_ad.h
-s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
$(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
$(SAVER_SRCS_1) $(SYSTEMD_SRCS) $(MOTIF_SRCS) $(GTK_SRCS) \
- $(PWENT_SRCS) $(PWHELPER_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \
+ $(PWENT_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \
$(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) \
$(TEST_SRCS) 2>/dev/null | \
sort -d | \
@@ -735,7 +737,7 @@ tags:
find $(srcdir) -name '*.[chly]' -print | xargs etags -a
list_tarfiles:
- @$(MAKE) XScreenSaver_ad.h XScreenSaver_Xm_ad.h 2>&1 >/dev/null
+ @$(MAKE2) XScreenSaver_ad.h XScreenSaver_Xm_ad.h 2>&1 >/dev/null
@find $(TARFILES) -type f -print | sort
check_men:
@@ -773,7 +775,7 @@ $(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
$(UTILS_BIN)/colorbars.o: $(UTILS_SRC)/colorbars.c
$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
-$(UTILS_BIN)/grabscreen.o: $(UTILS_SRC)/grabscreen.c
+$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
$(UTILS_BIN)/xftwrap.o: $(UTILS_SRC)/xftwrap.c
$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
@@ -792,7 +794,7 @@ UTIL_OBJS = $(UTILS_BIN)/overlay.o \
$(UTILS_BIN)/colorbars.o \
$(UTILS_BIN)/hsv.o \
$(UTILS_BIN)/colors.o \
- $(UTILS_BIN)/grabscreen.o \
+ $(UTILS_BIN)/grabclient.o \
$(UTILS_BIN)/xft.o \
$(UTILS_BIN)/xftwrap.o \
$(UTILS_BIN)/utf8wc.o \
@@ -801,8 +803,7 @@ UTIL_OBJS = $(UTILS_BIN)/overlay.o \
$(UTILS_BIN)/aligned_malloc.o
$(UTIL_OBJS):
- cd $(UTILS_BIN) ; \
- $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+ $(MAKE2CC) -C $(UTILS_BIN) $(@F)
##############################################################################
@@ -862,6 +863,14 @@ demo-Gtk.o: demo-Gtk.c
demo-Gtk-conf.o: demo-Gtk-conf.c
$(CC) -c $(CC_ALL) $(GTK_DEFS) $<
+GCRARGS = --sourcedir=$(srcdir) --sourcedir=$(ICON_SRC) --generate-source
+demo-Gtk-resources.c: gresource.xml demo.ui prefs.ui
+ $(GLIB_COMPILE_RESOURCES) $(srcdir)/gresource.xml --target=$@ $(GCRARGS)
+
+GTK_WARNINGS = -Wno-long-long -Wno-c99-extensions -Wno-pedantic
+demo-Gtk-resources.o: demo-Gtk-resources.c
+ $(CC) -c $(CC_ALL) $(GTK_DEFS) $(GTK_WARNINGS) $<
+
xscreensaver-settings-Gtk: $(GTK_OBJS)
$(CC) $(LDFLAGS) -o $@ $(GTK_OBJS) $(GTK_LIBS)
@@ -912,13 +921,8 @@ XScreenSaver_Xm_ad.h::
mv $$TMP $$OUT ; \
fi
-
-# Replace this with @INTLTOOL_DESKTOP_RULE@ once
-# https://bugs.launchpad.net/intltool/+bug/1749904 is fixed.
-.desktop.in.desktop: $(INTLTOOL_MERGE) $(top_srcdir)/po/*.po
- $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) \
- $(INTLTOOL_V_MERGE_OPTIONS) -d -u \
- -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+@INTLTOOL_DESKTOP_RULE@
+@INTLTOOL_SERVICE_RULE@
##############################################################################
@@ -992,6 +996,7 @@ xdpyinfo: xdpyinfo.o
#
# DO NOT DELETE: updated by make distdepend
+demo-Gtk-conf.o: $(srcdir)/blurb.h
demo-Gtk-conf.o: ../config.h
demo-Gtk-conf.o: $(srcdir)/demo-Gtk-conf.h
demo-Gtk-conf.o: $(UTILS_SRC)/xscreensaver-intl.h
@@ -1001,28 +1006,17 @@ demo-Gtk.o: $(srcdir)/blurb.h
demo-Gtk.o: ../config.h
demo-Gtk.o: $(srcdir)/demo-Gtk-conf.h
demo-Gtk.o: $(srcdir)/remote.h
+demo-Gtk.o: $(srcdir)/screens.h
demo-Gtk.o: $(srcdir)/types.h
demo-Gtk.o: $(UTILS_SRC)/resources.h
+demo-Gtk.o: $(UTILS_SRC)/screenshot.h
demo-Gtk.o: $(UTILS_SRC)/usleep.h
demo-Gtk.o: $(UTILS_SRC)/version.h
demo-Gtk.o: $(UTILS_SRC)/visual.h
demo-Gtk.o: $(UTILS_SRC)/xmu.h
demo-Gtk.o: $(UTILS_SRC)/xscreensaver-intl.h
-demo-Xm.o: XScreenSaver_Xm_ad.h
-demo-Xm.o: XScreenSaver_ad.h
-demo-Xm.o: $(srcdir)/atoms.h
-demo-Xm.o: $(srcdir)/blurb.h
demo-Xm.o: ../config.h
-demo-Xm.o: $(srcdir)/remote.h
-demo-Xm.o: $(srcdir)/types.h
-demo-Xm.o: $(UTILS_SRC)/resources.h
-demo-Xm.o: $(UTILS_SRC)/version.h
-demo-Xm.o: $(UTILS_SRC)/visual.h
-demo-Xm.o: $(UTILS_SRC)/xmu.h
demo-Xm-widgets.o: ../config.h
-passwd-helper.o: $(srcdir)/auth.h
-passwd-helper.o: $(srcdir)/blurb.h
-passwd-helper.o: ../config.h
passwd-kerberos.o: $(srcdir)/auth.h
passwd-kerberos.o: $(srcdir)/blurb.h
passwd-kerberos.o: ../config.h
@@ -1063,7 +1057,6 @@ test-xdpms.o: $(srcdir)/blurb.h
test-xdpms.o: ../config.h
test-xinerama.o: $(srcdir)/blurb.h
test-xinerama.o: ../config.h
-test-xinput.o: $(srcdir)/blurb.h
test-xinput.o: ../config.h
test-xinput.o: $(srcdir)/xinput.h
test-xkb.o: $(srcdir)/blurb.h
diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in
index bfc6414..d3e89f5 100644
--- a/driver/XScreenSaver.ad.in
+++ b/driver/XScreenSaver.ad.in
@@ -4,8 +4,8 @@
! a screen saver and locker for the X window system
! by Jamie Zawinski
!
-! version 6.00
-! 01-Apr-2021
+! version 6.09
+! 07-Jun-2024
!
! See "man xscreensaver" for more info. The latest version is always
! available at https://www.jwz.org/xscreensaver/
@@ -58,7 +58,7 @@
*ignoreUninstalledPrograms: False
*authWarningSlack: 20
-*textMode: file
+*textMode: url
*textLiteral: XScreenSaver
*textFile: @DEFAULT_TEXT_FILE@
*textProgram: fortune
@@ -98,7 +98,7 @@
! non-Gnome systems:
!
@NOGNOME@*loadURL: x-www-browser '%s' || firefox '%s' || chromium-browser '%s'
-@NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
+@NOGNOME@*manualCommand: lxterminal -T '%s manual' \
@NOGNOME@ -e /bin/sh -c 'man "%s" ; read foo'
@@ -324,248 +324,260 @@ XScreenSaver.bourneShell: /bin/sh
!=============================================================================
*programs: \
- maze -root \n\
-@GL_KLUDGE@ GL: superquadrics -root \n\
- attraction -root \n\
- blitspin -root \n\
- greynetic -root \n\
- helix -root \n\
- hopalong -root \n\
- imsmap -root \n\
-- noseguy -root \n\
-- pyro -root \n\
- qix -root \n\
-- rocks -root \n\
- rorschach -root \n\
- decayscreen -root \n\
- flame -root \n\
- halo -root \n\
- slidescreen -root \n\
- pedal -root \n\
- bouboule -root \n\
-- braid -root \n\
- coral -root \n\
- deco -root \n\
- drift -root \n\
-- fadeplot -root \n\
- galaxy -root \n\
- goop -root \n\
- grav -root \n\
- ifs -root \n\
-@GL_KLUDGE@ GL: jigsaw -root \n\
- julia -root \n\
-- kaleidescope -root \n\
-@GL_KLUDGE@ GL: moebius -root \n\
- moire -root \n\
-@GL_KLUDGE@ GL: morph3d -root \n\
- mountain -root \n\
- munch -root \n\
- penrose -root \n\
-@GL_KLUDGE@ GL: pipes -root \n\
- rd-bomb -root \n\
-@GL_KLUDGE@ GL: rubik -root \n\
-- sierpinski -root \n\
- slip -root \n\
-@GL_KLUDGE@ GL: sproingies -root \n\
- starfish -root \n\
- strange -root \n\
- swirl -root \n\
- triangle -root \n\
- xjack -root \n\
- xlyap -root \n\
-@GL_KLUDGE@ GL: atlantis -root \n\
- bsod -root \n\
-@GL_KLUDGE@ GL: bubble3d -root \n\
-@GL_KLUDGE@ GL: cage -root \n\
-- crystal -root \n\
- cynosure -root \n\
- discrete -root \n\
- distort -root \n\
- epicycle -root \n\
- flow -root \n\
-@GL_KLUDGE@ GL: glplanet -root \n\
- interference -root \n\
- kumppa -root \n\
-@GL_KLUDGE@ GL: lament -root \n\
- moire2 -root \n\
-@GL_KLUDGE@ GL: sonar -root \n\
-@GL_KLUDGE@ GL: stairs -root \n\
- truchet -root \n\
-- vidwhacker -root \n\
- blaster -root \n\
- bumps -root \n\
- ccurve -root \n\
- compass -root \n\
- deluxe -root \n\
-- demon -root \n\
-@GLE_KLUDGE@ GL: extrusion -root \n\
-- loop -root \n\
- penetrate -root \n\
- petri -root \n\
- phosphor -root \n\
-@GL_KLUDGE@ GL: pulsar -root \n\
- ripples -root \n\
- shadebobs -root \n\
-@GL_KLUDGE@ GL: sierpinski3d -root \n\
- spotlight -root \n\
- squiral -root \n\
- wander -root \n\
-- webcollage -root \n\
- xflame -root \n\
- xmatrix -root \n\
-@GL_KLUDGE@ GL: gflux -root \n\
-- nerverot -root \n\
- xrayswarm -root \n\
- xspirograph -root \n\
-@GL_KLUDGE@ GL: circuit -root \n\
-@GL_KLUDGE@ GL: dangerball -root \n\
-- GL: dnalogo -root \n\
-@GL_KLUDGE@ GL: engine -root \n\
-@GL_KLUDGE@ GL: flipscreen3d -root \n\
-@GL_KLUDGE@ GL: gltext -root \n\
-@GL_KLUDGE@ GL: menger -root \n\
-@GL_KLUDGE@ GL: molecule -root \n\
- rotzoomer -root \n\
- scooter -root \n\
- speedmine -root \n\
-@GL_KLUDGE@ GL: starwars -root \n\
-@GL_KLUDGE@ GL: stonerview -root \n\
- vermiculate -root \n\
- whirlwindwarp -root \n\
- zoom -root \n\
- anemone -root \n\
- apollonian -root \n\
-@GL_KLUDGE@ GL: boxed -root \n\
-@GL_KLUDGE@ GL: cubenetic -root \n\
-@GL_KLUDGE@ GL: endgame -root \n\
- euler2d -root \n\
- fluidballs -root \n\
-@GL_KLUDGE@ GL: flurry -root \n\
-- GL: glblur -root \n\
-@GL_KLUDGE@ GL: glsnake -root \n\
- halftone -root \n\
-@GL_KLUDGE@ GL: juggler3d -root \n\
-@GL_KLUDGE@ GL: lavalite -root \n\
-- polyominoes -root \n\
-@GL_KLUDGE@ GL: queens -root \n\
-- GL: sballs -root \n\
-@GL_KLUDGE@ GL: spheremonics -root \n\
-- thornbird -root \n\
- twang -root \n\
-- GL: antspotlight -root \n\
- apple2 -root \n\
-@GL_KLUDGE@ GL: atunnel -root \n\
- barcode -root \n\
-@GL_KLUDGE@ GL: blinkbox -root \n\
-@GL_KLUDGE@ GL: blocktube -root \n\
-@GL_KLUDGE@ GL: bouncingcow -root \n\
- cloudlife -root \n\
-@GL_KLUDGE@ GL: cubestorm -root \n\
- eruption -root \n\
-@GL_KLUDGE@ GL: flipflop -root \n\
-@GL_KLUDGE@ GL: flyingtoasters -root \n\
- fontglide -root \n\
-@GL_KLUDGE@ GL: gleidescope -root \n\
-@GL_KLUDGE@ GL: glknots -root \n\
-@GL_KLUDGE@ GL: glmatrix -root \n\
-- GL: glslideshow -root \n\
-@GL_KLUDGE@ GL: hypertorus -root \n\
-- GL: jigglypuff -root \n\
- metaballs -root \n\
-@GL_KLUDGE@ GL: mirrorblob -root \n\
- piecewise -root \n\
-@GL_KLUDGE@ GL: polytopes -root \n\
- pong -root \n\
- popsquares -root \n\
-@GL_KLUDGE@ GL: surfaces -root \n\
- xanalogtv -root \n\
- abstractile -root \n\
- anemotaxis -root \n\
-- GL: antinspect -root \n\
- fireworkx -root \n\
- fuzzyflakes -root \n\
- interaggregate -root \n\
- intermomentary -root \n\
- memscroller -root \n\
-@GL_KLUDGE@ GL: noof -root \n\
- pacman -root \n\
-@GL_KLUDGE@ GL: pinion -root \n\
-@GL_KLUDGE@ GL: polyhedra -root \n\
-- GL: providence -root \n\
- substrate -root \n\
- wormhole -root \n\
-- GL: antmaze -root \n\
-@GL_KLUDGE@ GL: boing -root \n\
- boxfit -root \n\
-@GL_KLUDGE@ GL: carousel -root \n\
- celtic -root \n\
-@GL_KLUDGE@ GL: crackberg -root \n\
-@GL_KLUDGE@ GL: cube21 -root \n\
- fiberlamp -root \n\
-@GL_KLUDGE@ GL: fliptext -root \n\
-@GL_KLUDGE@ GL: glhanoi -root \n\
-@GL_KLUDGE@ GL: tangram -root \n\
-@GL_KLUDGE@ GL: timetunnel -root \n\
-@GL_KLUDGE@ GL: glschool -root \n\
-@GL_KLUDGE@ GL: topblock -root \n\
-@GL_KLUDGE@ GL: cubicgrid -root \n\
- cwaves -root \n\
-@GL_KLUDGE@ GL: gears -root \n\
-@GL_KLUDGE@ GL: glcells -root \n\
-@GL_KLUDGE@ GL: lockward -root \n\
- m6502 -root \n\
-@GL_KLUDGE@ GL: moebiusgears -root \n\
-@GL_KLUDGE@ GL: voronoi -root \n\
-@GL_KLUDGE@ GL: hypnowheel -root \n\
-@GL_KLUDGE@ GL: klein -root \n\
-- lcdscrub -root \n\
-@GL_KLUDGE@ GL: photopile -root \n\
-@GL_KLUDGE@ GL: skytentacles -root \n\
-@GL_KLUDGE@ GL: rubikblocks -root \n\
-@GL_KLUDGE@ GL: companioncube -root \n\
-@GL_KLUDGE@ GL: hilbert -root \n\
-@GL_KLUDGE@ GL: tronbit -root \n\
-@GL_KLUDGE@ GL: geodesic -root \n\
- hexadrop -root \n\
-@GL_KLUDGE@ GL: kaleidocycle -root \n\
-@GL_KLUDGE@ GL: quasicrystal -root \n\
-@GL_KLUDGE@ GL: unknownpleasures -root \n\
- binaryring -root \n\
-@GL_KLUDGE@ GL: cityflow -root \n\
-@GL_KLUDGE@ GL: geodesicgears -root \n\
-@GL_KLUDGE@ GL: projectiveplane -root \n\
-@GL_KLUDGE@ GL: romanboy -root \n\
- tessellimage -root \n\
-@GL_KLUDGE@ GL: winduprobot -root \n\
-@GL_KLUDGE@ GL: splitflap -root \n\
-@GL_KLUDGE@ GL: cubestack -root \n\
-@GL_KLUDGE@ GL: cubetwist -root \n\
-@GL_KLUDGE@ GL: discoball -root \n\
-@GL_KLUDGE@ GL: dymaxionmap -root \n\
-@GL_KLUDGE@ GL: energystream -root \n\
-@GL_KLUDGE@ GL: hexstrut -root \n\
-@GL_KLUDGE@ GL: hydrostat -root \n\
-@GL_KLUDGE@ GL: raverhoop -root \n\
-@GL_KLUDGE@ GL: splodesic -root \n\
-@GL_KLUDGE@ GL: unicrud -root \n\
-@GL_KLUDGE@ GL: esper -root \n\
-@GL_KLUDGE@ GL: vigilance -root \n\
-@GL_KLUDGE@ GL: crumbler -root \n\
- filmleader -root \n\
- glitchpeg -root \n\
-@GL_KLUDGE@ GL: handsy -root \n\
-@GL_KLUDGE@ GL: maze3d -root \n\
-@GL_KLUDGE@ GL: peepers -root \n\
-@GL_KLUDGE@ GL: razzledazzle -root \n\
- vfeedback -root \n\
-@GL_KLUDGE@ GL: deepstars -root \n\
-@GL_KLUDGE@ GL: gravitywell -root \n\
-@GL_KLUDGE@ GL: beats -root \n\
-@GL_KLUDGE@ GL: covid19 -root \n\
-@GL_KLUDGE@ GL: etruscanvenus -root \n\
-@GL_KLUDGE@ GL: gibson -root \n\
-@GL_KLUDGE@ GL: headroom -root \n\
-@GL_KLUDGE@ GL: sphereeversion -root \n
+ maze --root \n\
+@GL_KLUDGE@ GL: superquadrics --root \n\
+ attraction --root \n\
+ blitspin --root \n\
+ greynetic --root \n\
+ helix --root \n\
+ hopalong --root \n\
+ imsmap --root \n\
+- noseguy --root \n\
+- pyro --root \n\
+ qix --root \n\
+- rocks --root \n\
+ rorschach --root \n\
+ decayscreen --root \n\
+ flame --root \n\
+ halo --root \n\
+ slidescreen --root \n\
+ pedal --root \n\
+ bouboule --root \n\
+- braid --root \n\
+ coral --root \n\
+ deco --root \n\
+ drift --root \n\
+- fadeplot --root \n\
+ galaxy --root \n\
+ goop --root \n\
+ grav --root \n\
+ ifs --root \n\
+@GL_KLUDGE@ GL: jigsaw --root \n\
+ julia --root \n\
+- kaleidescope --root \n\
+@GL_KLUDGE@ GL: moebius --root \n\
+ moire --root \n\
+@GL_KLUDGE@ GL: morph3d --root \n\
+ mountain --root \n\
+ munch --root \n\
+ penrose --root \n\
+@GL_KLUDGE@ GL: pipes --root \n\
+ rdbomb --root \n\
+@GL_KLUDGE@ GL: rubik --root \n\
+- sierpinski --root \n\
+ slip --root \n\
+@GL_KLUDGE@ GL: sproingies --root \n\
+ starfish --root \n\
+ strange --root \n\
+ swirl --root \n\
+ triangle --root \n\
+ xjack --root \n\
+ xlyap --root \n\
+@GL_KLUDGE@ GL: atlantis --root \n\
+ bsod --root \n\
+@GL_KLUDGE@ GL: bubble3d --root \n\
+@GL_KLUDGE@ GL: cage --root \n\
+- crystal --root \n\
+ cynosure --root \n\
+ discrete --root \n\
+ distort --root \n\
+ epicycle --root \n\
+ flow --root \n\
+@GL_KLUDGE@ GL: glplanet --root \n\
+ interference --root \n\
+ kumppa --root \n\
+@GL_KLUDGE@ GL: lament --root \n\
+ moire2 --root \n\
+@GL_KLUDGE@ GL: sonar --root \n\
+@GL_KLUDGE@ GL: stairs --root \n\
+ truchet --root \n\
+- vidwhacker --root \n\
+- webcollage --root \n\
+ blaster --root \n\
+ bumps --root \n\
+ ccurve --root \n\
+ compass --root \n\
+ deluxe --root \n\
+- demon --root \n\
+@GLE_KLUDGE@ GL: extrusion --root \n\
+- loop --root \n\
+ penetrate --root \n\
+ petri --root \n\
+ phosphor --root \n\
+@GL_KLUDGE@ GL: pulsar --root \n\
+ ripples --root \n\
+ shadebobs --root \n\
+@GL_KLUDGE@ GL: sierpinski3d --root \n\
+ spotlight --root \n\
+ squiral --root \n\
+ wander --root \n\
+ xflame --root \n\
+ xmatrix --root \n\
+@GL_KLUDGE@ GL: gflux --root \n\
+- nerverot --root \n\
+ xrayswarm --root \n\
+ xspirograph --root \n\
+@GL_KLUDGE@ GL: circuit --root \n\
+@GL_KLUDGE@ GL: dangerball --root \n\
+- GL: dnalogo --root \n\
+@GL_KLUDGE@ GL: engine --root \n\
+@GL_KLUDGE@ GL: flipscreen3d --root \n\
+@GL_KLUDGE@ GL: gltext --root \n\
+@GL_KLUDGE@ GL: menger --root \n\
+@GL_KLUDGE@ GL: molecule --root \n\
+ rotzoomer --root \n\
+ scooter --root \n\
+ speedmine --root \n\
+@GL_KLUDGE@ GL: starwars --root \n\
+@GL_KLUDGE@ GL: stonerview --root \n\
+ vermiculate --root \n\
+ whirlwindwarp --root \n\
+ zoom --root \n\
+ anemone --root \n\
+ apollonian --root \n\
+@GL_KLUDGE@ GL: boxed --root \n\
+@GL_KLUDGE@ GL: cubenetic --root \n\
+@GL_KLUDGE@ GL: endgame --root \n\
+ euler2d --root \n\
+ fluidballs --root \n\
+@GL_KLUDGE@ GL: flurry --root \n\
+- GL: glblur --root \n\
+@GL_KLUDGE@ GL: glsnake --root \n\
+ halftone --root \n\
+@GL_KLUDGE@ GL: juggler3d --root \n\
+@GL_KLUDGE@ GL: lavalite --root \n\
+- polyominoes --root \n\
+@GL_KLUDGE@ GL: queens --root \n\
+- GL: sballs --root \n\
+@GL_KLUDGE@ GL: spheremonics --root \n\
+ twang --root \n\
+- GL: antspotlight --root \n\
+ apple2 --root \n\
+@GL_KLUDGE@ GL: atunnel --root \n\
+ barcode --root \n\
+@GL_KLUDGE@ GL: blinkbox --root \n\
+@GL_KLUDGE@ GL: blocktube --root \n\
+@GL_KLUDGE@ GL: bouncingcow --root \n\
+ cloudlife --root \n\
+@GL_KLUDGE@ GL: cubestorm --root \n\
+ eruption --root \n\
+@GL_KLUDGE@ GL: flipflop --root \n\
+@GL_KLUDGE@ GL: flyingtoasters --root \n\
+ fontglide --root \n\
+@GL_KLUDGE@ GL: gleidescope --root \n\
+@GL_KLUDGE@ GL: glknots --root \n\
+@GL_KLUDGE@ GL: glmatrix --root \n\
+- GL: glslideshow --root \n\
+@GL_KLUDGE@ GL: hypertorus --root \n\
+- GL: jigglypuff --root \n\
+ metaballs --root \n\
+@GL_KLUDGE@ GL: mirrorblob --root \n\
+ piecewise --root \n\
+@GL_KLUDGE@ GL: polytopes --root \n\
+ pong --root \n\
+ popsquares --root \n\
+@GL_KLUDGE@ GL: surfaces --root \n\
+ xanalogtv --root \n\
+ abstractile --root \n\
+ anemotaxis --root \n\
+- GL: antinspect --root \n\
+ fireworkx --root \n\
+ fuzzyflakes --root \n\
+ interaggregate --root \n\
+ intermomentary --root \n\
+ memscroller --root \n\
+@GL_KLUDGE@ GL: noof --root \n\
+ pacman --root \n\
+@GL_KLUDGE@ GL: pinion --root \n\
+@GL_KLUDGE@ GL: polyhedra --root \n\
+- GL: providence --root \n\
+ substrate --root \n\
+ wormhole --root \n\
+- GL: antmaze --root \n\
+@GL_KLUDGE@ GL: boing --root \n\
+ boxfit --root \n\
+@GL_KLUDGE@ GL: carousel --root \n\
+ celtic --root \n\
+@GL_KLUDGE@ GL: crackberg --root \n\
+@GL_KLUDGE@ GL: cube21 --root \n\
+ fiberlamp --root \n\
+@GL_KLUDGE@ GL: fliptext --root \n\
+@GL_KLUDGE@ GL: glhanoi --root \n\
+@GL_KLUDGE@ GL: tangram --root \n\
+@GL_KLUDGE@ GL: timetunnel --root \n\
+@GL_KLUDGE@ GL: glschool --root \n\
+@GL_KLUDGE@ GL: topblock --root \n\
+@GL_KLUDGE@ GL: cubicgrid --root \n\
+ cwaves --root \n\
+@GL_KLUDGE@ GL: gears --root \n\
+@GL_KLUDGE@ GL: glcells --root \n\
+@GL_KLUDGE@ GL: lockward --root \n\
+ m6502 --root \n\
+@GL_KLUDGE@ GL: moebiusgears --root \n\
+@GL_KLUDGE@ GL: voronoi --root \n\
+@GL_KLUDGE@ GL: hypnowheel --root \n\
+@GL_KLUDGE@ GL: klein --root \n\
+- lcdscrub --root \n\
+@GL_KLUDGE@ GL: photopile --root \n\
+@GL_KLUDGE@ GL: skytentacles --root \n\
+@GL_KLUDGE@ GL: rubikblocks --root \n\
+@GL_KLUDGE@ GL: companioncube --root \n\
+@GL_KLUDGE@ GL: hilbert --root \n\
+@GL_KLUDGE@ GL: tronbit --root \n\
+@GL_KLUDGE@ GL: geodesic --root \n\
+ hexadrop --root \n\
+@GL_KLUDGE@ GL: kaleidocycle --root \n\
+@GL_KLUDGE@ GL: quasicrystal --root \n\
+@GL_KLUDGE@ GL: unknownpleasures --root \n\
+ binaryring --root \n\
+@GL_KLUDGE@ GL: cityflow --root \n\
+@GL_KLUDGE@ GL: geodesicgears --root \n\
+@GL_KLUDGE@ GL: projectiveplane --root \n\
+@GL_KLUDGE@ GL: romanboy --root \n\
+ tessellimage --root \n\
+@GL_KLUDGE@ GL: winduprobot --root \n\
+@GL_KLUDGE@ GL: splitflap --root \n\
+@GL_KLUDGE@ GL: cubestack --root \n\
+@GL_KLUDGE@ GL: cubetwist --root \n\
+@GL_KLUDGE@ GL: discoball --root \n\
+@GL_KLUDGE@ GL: dymaxionmap --root \n\
+@GL_KLUDGE@ GL: energystream --root \n\
+@GL_KLUDGE@ GL: hexstrut --root \n\
+@GL_KLUDGE@ GL: hydrostat --root \n\
+@GL_KLUDGE@ GL: raverhoop --root \n\
+@GL_KLUDGE@ GL: splodesic --root \n\
+@GL_KLUDGE@ GL: unicrud --root \n\
+@GL_KLUDGE@ GL: esper --root \n\
+@GL_KLUDGE@ GL: vigilance --root \n\
+@GL_KLUDGE@ GL: crumbler --root \n\
+ filmleader --root \n\
+ glitchpeg --root \n\
+@GL_KLUDGE@ GL: handsy --root \n\
+@GL_KLUDGE@ GL: maze3d --root \n\
+@GL_KLUDGE@ GL: peepers --root \n\
+@GL_KLUDGE@ GL: razzledazzle --root \n\
+ vfeedback --root \n\
+@GL_KLUDGE@ GL: deepstars --root \n\
+@GL_KLUDGE@ GL: gravitywell --root \n\
+@GL_KLUDGE@ GL: beats --root \n\
+@GL_KLUDGE@ GL: covid19 --root \n\
+@GL_KLUDGE@ GL: etruscanvenus --root \n\
+@GL_KLUDGE@ GL: gibson --root \n\
+@GL_KLUDGE@ GL: headroom --root \n\
+@GL_KLUDGE@ GL: sphereeversion --root \n\
+ binaryhorizon --root \n\
+ marbling --root \n\
+@GL_KLUDGE@ GL: chompytower --root \n\
+@GL_KLUDGE@ GL: hextrail --root \n\
+@GL_KLUDGE@ GL: mapscroller --root \n\
+@GL_KLUDGE@ GL: nakagin --root \n\
+@GL_KLUDGE@ GL: squirtorus --root \n\
+@GL_KLUDGE@ GL: cubocteversion --root \n\
+ droste --root \n\
+@GL_KLUDGE@ GL: papercube --root \n\
+@GL_KLUDGE@ GL: skulloop --root \n\
+@GL_KLUDGE@ GL: highvoltage --root \n\
+@GL_KLUDGE@ GL: kallisti --root \n
@@ -580,6 +592,7 @@ XScreenSaver.bourneShell: /bin/sh
*hacks.antmaze.name: Ant Maze
*hacks.antspotlight.name: Ant Spotlight
*hacks.apple2.name: Apple ][
+*hacks.binaryhorizon.name: Binary Horizon
*hacks.binaryring.name: Binary Ring
*hacks.blinkbox.name: Blink Box
*hacks.blitspin.name: Blit Spin
@@ -589,6 +602,7 @@ XScreenSaver.bourneShell: /bin/sh
*hacks.bsod.name: BSOD
*hacks.bubble3d.name: Bubble 3D
*hacks.ccurve.name: C Curve
+*hacks.chompytower.name: Chompy Tower
*hacks.cityflow.name: City Flow
*hacks.cloudlife.name: Cloud Life
*hacks.companioncube.name: Companion Cube
@@ -598,6 +612,7 @@ XScreenSaver.bourneShell: /bin/sh
*hacks.cubestorm.name: Cube Storm
*hacks.cubetwist.name: Cube Twist
*hacks.cubicgrid.name: Cubic Grid
+*hacks.cubocteversion.name: Cuboctahedron Eversion
*hacks.cwaves.name: C Waves
*hacks.dangerball.name: Danger Ball
*hacks.decayscreen.name: Decay Screen
@@ -634,6 +649,8 @@ XScreenSaver.bourneShell: /bin/sh
*hacks.gltext.name: GL Text
*hacks.gravitywell.name: Gravity Well
*hacks.hexstrut.name: Hex Strut
+*hacks.hextrail.name: Hex Trail
+*hacks.highvoltage.name: High Voltage
*hacks.ifs.name: IFS
*hacks.imsmap.name: IMS Map
*hacks.jigglypuff.name: Jiggly Puff
@@ -641,6 +658,7 @@ XScreenSaver.bourneShell: /bin/sh
*hacks.lcdscrub.name: LCD Scrub
*hacks.lmorph.name: LMorph
*hacks.m6502.name: m6502
+*hacks.mapscroller.name: Map Scroller
*hacks.maze3d.name: Maze 3D
*hacks.memscroller.name: Mem Scroller
*hacks.metaballs.name: Meta Balls
@@ -653,14 +671,14 @@ XScreenSaver.bourneShell: /bin/sh
*hacks.nerverot.name: Nerve Rot
*hacks.noseguy.name: Nose Guy
*hacks.pacman.name: Pac-Man
+*hacks.papercube.name: Paper Cube
*hacks.photopile.name: Photo Pile
*hacks.popsquares.name: Pop Squares
*hacks.projectiveplane.name:Projective Plane
*hacks.quasicrystal.name: Quasi-Crystal
*hacks.raverhoop.name: Raver Hoop
*hacks.razzledazzle.name: Razzle Dazzle
-*hacks.rd-bomb.name: RD-Bomb
-*hacks.rd-bomb.name: RD-Bomb
+*hacks.rdbomb.name: RD-Bomb
*hacks.romanboy.name: Roman Boy
*hacks.rotzoomer.name: Rot Zoomer
*hacks.rubikblocks.name: Rubik Blocks
diff --git a/driver/XScreenSaver_Xm_ad.h b/driver/XScreenSaver_Xm_ad.h
new file mode 100644
index 0000000..371e0a2
--- /dev/null
+++ b/driver/XScreenSaver_Xm_ad.h
@@ -0,0 +1,108 @@
+"*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1",
+"*cmdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*label0.fontList: *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver*doc.fontList: *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1",
+"*foreground: #000000",
+"*background: #C0C0C0",
+"*XmTextField.foreground: #000000",
+"*XmTextField.background: #FFFFFF",
+"*list.foreground: #000000",
+"*list.background: #FFFFFF",
+"*ApplicationShell.title: XScreenSaver",
+"*warning.title: XScreenSaver",
+"*warning_popup.title: XScreenSaver",
+"*allowShellResize: True",
+"*autoUnmanage: False",
+"*menubar*file.labelString: File",
+"*menubar*file.mnemonic: F",
+"*file.blank.labelString: Blank Screen Now",
+"*file.blank.mnemonic: B",
+"*file.lock.labelString: Lock Screen Now",
+"*file.lock.mnemonic: L",
+"*file.kill.labelString: Kill Daemon",
+"*file.kill.mnemonic: K",
+"*file.restart.labelString: Restart Daemon",
+"*file.restart.mnemonic: R",
+"*file.exit.labelString: Exit",
+"*file.exit.mnemonic: E",
+"*menubar*edit.labelString: Edit",
+"*menubar*edit.mnemonic: E",
+"*edit.cut.labelString: Cut",
+"*edit.cut.mnemonic: u",
+"*edit.copy.labelString: Copy",
+"*edit.copy.mnemonic: C",
+"*edit.paste.labelString: Paste",
+"*edit.paste.mnemonic: P",
+"*menubar*help.labelString: Help",
+"*menubar*help.mnemonic: H",
+"*help.about.labelString: About...",
+"*help.about.mnemonic: A",
+"*help.docMenu.labelString: Documentation...",
+"*help.docMenu.mnemonic: D",
+"*demoTab.marginWidth: 10",
+"*optionsTab.marginWidth: 10",
+"*XmScrolledWindow.topOffset: 10",
+"*XmScrolledWindow.leftOffset: 10",
+"*demoTab.topOffset: 4",
+"*form1.bottomOffset: 10",
+"*form3.leftOffset: 10",
+"*form3.rightOffset: 10",
+"*frame.topOffset: 10",
+"*frame.bottomOffset: 10",
+"*enabled.topOffset: 10",
+"*visLabel.topOffset: 10",
+"*combo.topOffset: 10",
+"*form4.bottomOffset: 4",
+"*hr.bottomOffset: 4",
+"*XmComboBox.marginWidth: 0",
+"*XmComboBox.marginHeight: 0",
+"*demo.marginWidth: 30",
+"*demo.marginHeight: 4",
+"*man.marginWidth: 10",
+"*man.marginHeight: 4",
+"*down.leftOffset: 40",
+"*down.marginWidth: 4",
+"*down.marginHeight: 4",
+"*up.marginWidth: 4",
+"*up.marginHeight: 4",
+"*frame.traversalOn: False",
+"*list.automaticSelection: True",
+"*list.visibleItemCount: 20",
+"*doc.columns: 60",
+"*combo.columns: 11",
+"*demoTab.labelString: Graphics Demos",
+"*optionsTab.labelString: Screensaver Options",
+"*down.labelString: \\\\/ ",
+"*up.labelString: /\\\\ ",
+"*frameLabel.labelString: ",
+"*cmdLabel.labelString: Command Line:",
+"*cmdLabel.alignment: ALIGNMENT_BEGINNING",
+"*enabled.labelString: Enabled",
+"*visLabel.labelString: Visual:",
+"*visLabel.alignment: ALIGNMENT_END",
+"*visLabel.leftOffset: 20",
+"*demo.labelString: Demo",
+"*man.labelString: Documentation...",
+"*done.labelString: Quit",
+"*preferencesLabel.labelString: XScreenSaver Parameters",
+"*timeoutLabel.labelString: Saver Timeout",
+"*cycleLabel.labelString: Cycle Timeout",
+"*fadeSecondsLabel.labelString: Fade Duration",
+"*fadeTicksLabel.labelString: Fade Ticks",
+"*lockLabel.labelString: Lock Timeout",
+"*passwdLabel.labelString: Password Timeout",
+"*preferencesForm*XmTextField.columns: 8",
+"*verboseToggle.labelString: Verbose",
+"*cmapToggle.labelString: Install Colormap",
+"*fadeToggle.labelString: Fade Colormap",
+"*unfadeToggle.labelString: Unfade Colormap",
+"*lockToggle.labelString: Require Password",
+"*OK.marginWidth: 30",
+"*OK.marginHeight: 4",
+"*OK.leftOffset: 10",
+"*OK.bottomOffset: 10",
+"*Cancel.marginWidth: 30",
+"*Cancel.marginHeight: 4",
+"*Cancel.rightOffset: 10",
+"*Cancel.bottomOffset: 10",
diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h
new file mode 100644
index 0000000..c469a3e
--- /dev/null
+++ b/driver/XScreenSaver_ad.h
@@ -0,0 +1,551 @@
+"#error Do not run app-defaults files through xrdb!",
+"#error That does not do what you might expect.",
+"#error Put this file in /usr/lib/X11/app-defaults/XScreenSaver instead.",
+"*mode: random",
+"*timeout: 0:10:00",
+"*cycle: 0:10:00",
+"*lockTimeout: 0:00:00",
+"*passwdTimeout: 0:00:30",
+"*dpmsEnabled: False",
+"*dpmsQuickoffEnabled: False",
+"*dpmsStandby: 2:00:00",
+"*dpmsSuspend: 2:00:00",
+"*dpmsOff: 4:00:00",
+"*grabDesktopImages: True",
+"*grabVideoFrames: False",
+"*chooseRandomImages: True",
+"*imageDirectory: /Library/Desktop Pictures/",
+"*nice: 10",
+"*memoryLimit: 0",
+"*lock: False",
+"*verbose: False",
+"*fade: True",
+"*unfade: True",
+"*fadeSeconds: 0:00:03",
+"*fadeTicks: 20",
+"*splash: True",
+"*splashDuration: 0:00:05",
+"*visualID: default",
+"*installColormap: True",
+"*ignoreUninstalledPrograms: False",
+"*authWarningSlack: 20",
+"*textMode: url",
+"*textLiteral: XScreenSaver",
+"*textFile: ",
+"*textProgram: fortune",
+"*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss",
+"*demoCommand: xscreensaver-settings",
+"*helpURL: https://www.jwz.org/xscreensaver/man.html",
+"*loadURL: x-www-browser '%s' || firefox '%s' || chromium-browser '%s'",
+"*manualCommand: lxterminal -T '%s manual' \
+ -e /bin/sh -c 'man \"%s\" ; read foo'",
+"*dateFormat: %I:%M %p, %a %b %e",
+"*newLoginCommand: no-such-login-manager",
+"XScreenSaver.pointerHysteresis: 10",
+"XScreenSaver.bourneShell: /bin/sh",
+"*dialogTheme: default",
+"*themeNames: Default, Borderless, Dark Gray, Borderless Black, \
+ Green Black, White, Blue, Aqua Black, Wine",
+"*Dialog.headingFont: sans-serif bold 16",
+"*Dialog.bodyFont: sans-serif 14",
+"*Dialog.errorFont: sans-serif bold 14",
+"*Dialog.labelFont: sans-serif bold 14",
+"*Dialog.unameFont: sans-serif 12",
+"*Dialog.buttonFont: sans-serif bold 14",
+"*Dialog.dateFont: sans-serif 9",
+"*passwd.uname: True",
+"*passwd.asterisks: True",
+"*default.Dialog.foreground: #000000",
+"*default.Dialog.background: #E6E6E6",
+"*default.Dialog.button.foreground: #000000",
+"*default.Dialog.button.background: #F5F5F5",
+"*default.Dialog.logo.background: #BBBBBB",
+"*default.Dialog.text.foreground: #000000",
+"*default.Dialog.error.foreground: #FF0000",
+"*default.Dialog.text.background: #FFFFFF",
+"*default.Dialog.topShadowColor: #FFFFFF",
+"*default.Dialog.bottomShadowColor: #CECECE",
+"*default.Dialog.shadowWidth: 2",
+"*default.Dialog.logo.width: 210",
+"*default.Dialog.logo.height: 210",
+"*default.Dialog.thermometer.foreground: #4464AC",
+"*default.Dialog.thermometer.background: #FFFFFF",
+"*default.Dialog.thermometer.width: 8",
+"*default.Dialog.borderColor: #CECECE",
+"*default.Dialog.borderWidth: 0",
+"*default.Dialog.internalPadding: 24",
+"*borderless.Dialog.topShadowColor: #E6E6E6",
+"*borderless.Dialog.button.background: #FFFFFF",
+"*borderless.Dialog.bottomShadowColor: #E6E6E6",
+"*borderless.Dialog.logo.background: #E6E6E6",
+"*borderless.Dialog.borderColor: #888888",
+"*borderless.Dialog.thermometer.width: 6",
+"*borderless.Dialog.borderWidth: 1",
+"*darkgray.Dialog.foreground: #CCCCCC",
+"*darkgray.Dialog.background: #333333",
+"*darkgray.Dialog.topShadowColor: #444444",
+"*darkgray.Dialog.bottomShadowColor: #111111",
+"*darkgray.Dialog.borderColor: #111111",
+"*darkgray.Dialog.text.foreground: #DDDDDD",
+"*darkgray.Dialog.text.background: #666666",
+"*darkgray.Dialog.button.foreground: #CCCCCC",
+"*darkgray.Dialog.button.background: #666666",
+"*darkgray.Dialog.logo.background: #444444",
+"*darkgray.Dialog.thermometer.foreground: #4464AC",
+"*darkgray.Dialog.thermometer.background: #666666",
+"*darkgray.Dialog.borderWidth: 0",
+"*borderlessblack.Dialog.foreground: #CCCCCC",
+"*borderlessblack.Dialog.background: #000000",
+"*borderlessblack.Dialog.topShadowColor: #000000",
+"*borderlessblack.Dialog.bottomShadowColor: #000000",
+"*borderlessblack.Dialog.text.foreground: #CCCCCC",
+"*borderlessblack.Dialog.text.background: #000000",
+"*borderlessblack.Dialog.button.foreground: #CCCCCC",
+"*borderlessblack.Dialog.button.background: #333333",
+"*borderlessblack.Dialog.logo.background: #000000",
+"*borderlessblack.Dialog.thermometer.foreground: #CCCCCC",
+"*borderlessblack.Dialog.thermometer.background: #333333",
+"*borderlessblack.Dialog.thermometer.width: 3",
+"*borderlessblack.Dialog.borderColor: #333333",
+"*borderlessblack.Dialog.borderWidth: 1",
+"*greenblack.Dialog.foreground: #00FF00",
+"*greenblack.Dialog.background: #000000",
+"*greenblack.Dialog.topShadowColor: #000000",
+"*greenblack.Dialog.bottomShadowColor: #000000",
+"*greenblack.Dialog.shadowWidth: 1",
+"*greenblack.Dialog.text.foreground: #00FF00",
+"*greenblack.Dialog.text.background: #006600",
+"*greenblack.Dialog.button.foreground: #00FF00",
+"*greenblack.Dialog.button.background: #006600",
+"*greenblack.Dialog.logo.background: #000000",
+"*greenblack.Dialog.thermometer.foreground: #00CC00",
+"*greenblack.Dialog.thermometer.background: #006600",
+"*greenblack.Dialog.borderColor: #006600",
+"*greenblack.Dialog.borderWidth: 1",
+"*white.Dialog.foreground: #000000",
+"*white.Dialog.background: #FFFFFF",
+"*white.Dialog.topShadowColor: #CCCCCC",
+"*white.Dialog.bottomShadowColor: #CCCCCC",
+"*white.Dialog.shadowWidth: 1",
+"*white.Dialog.borderColor: #CCCCCC",
+"*white.Dialog.text.foreground: #000000",
+"*white.Dialog.text.background: #FFFFFF",
+"*white.Dialog.button.foreground: #000000",
+"*white.Dialog.button.background: #FFFFFF",
+"*white.Dialog.logo.background: #FFFFFF",
+"*white.Dialog.borderWidth: 0",
+"*blue.Dialog.foreground: #000000",
+"*blue.Dialog.background: #BBCCDD",
+"*blue.Dialog.topShadowColor: #CCDDEE",
+"*blue.Dialog.bottomShadowColor: #AABBCC",
+"*blue.Dialog.borderColor: #AABBCC",
+"*blue.Dialog.text.foreground: #000000",
+"*blue.Dialog.text.background: #DDEEFF",
+"*blue.Dialog.button.foreground: #000000",
+"*blue.Dialog.button.background: #DDEEFF",
+"*blue.Dialog.logo.background: #BBCCDD",
+"*blue.Dialog.thermometer.foreground: #5566AA",
+"*blue.Dialog.thermometer.background: #BBCCDD",
+"*blue.Dialog.borderWidth: 0",
+"*aquablack.Dialog.foreground: #00EFEF",
+"*aquablack.Dialog.background: #000000",
+"*aquablack.Dialog.topShadowColor: #000000",
+"*aquablack.Dialog.bottomShadowColor: #000000",
+"*aquablack.Dialog.shadowWidth: 2",
+"*aquablack.Dialog.button.foreground: #000000",
+"*aquablack.Dialog.button.background: #2244EE",
+"*aquablack.Dialog.logo.background: #000000",
+"*aquablack.Dialog.text.foreground: #2244EE",
+"*aquablack.Dialog.text.background: #EEEEEE",
+"*aquablack.Dialog.thermometer.foreground: #2244EE",
+"*aquablack.Dialog.thermometer.background: #000088",
+"*aquablack.Dialog.borderColor: #000066",
+"*aquablack.Dialog.borderWidth: 1",
+"*aquablack.Dialog.internalPadding: 36",
+"*wine.Dialog.foreground: #AD8FA6",
+"*wine.Dialog.background: #2C041E",
+"*wine.Dialog.topShadowColor: #2C041E",
+"*wine.Dialog.bottomShadowColor: #2C041E",
+"*wine.Dialog.text.foreground: #706B70",
+"*wine.Dialog.text.background: #F9F9F8",
+"*wine.Dialog.button.foreground: #5F585B",
+"*wine.Dialog.logo.background: #2C041E",
+"*wine.Dialog.thermometer.foreground: #AD8FA6",
+"*wine.Dialog.thermometer.background: #4D2946",
+"*wine.Dialog.borderColor: #4D2946",
+"*wine.Dialog.thermometer.width: 6",
+"*wine.Dialog.borderWidth: 1",
+"*errorFont: sans-serif bold 18",
+"*errorColor: #FF0000",
+"*programs: \
+ maze --root \\n\
+ GL: superquadrics --root \\n\
+ attraction --root \\n\
+ blitspin --root \\n\
+ greynetic --root \\n\
+ helix --root \\n\
+ hopalong --root \\n\
+ imsmap --root \\n\
+- noseguy --root \\n\
+- pyro --root \\n\
+ qix --root \\n\
+- rocks --root \\n\
+ rorschach --root \\n\
+ decayscreen --root \\n\
+ flame --root \\n\
+ halo --root \\n\
+ slidescreen --root \\n\
+ pedal --root \\n\
+ bouboule --root \\n\
+- braid --root \\n\
+ coral --root \\n\
+ deco --root \\n\
+ drift --root \\n\
+- fadeplot --root \\n\
+ galaxy --root \\n\
+ goop --root \\n\
+ grav --root \\n\
+ ifs --root \\n\
+ GL: jigsaw --root \\n\
+ julia --root \\n\
+- kaleidescope --root \\n\
+ GL: moebius --root \\n\
+ moire --root \\n\
+ GL: morph3d --root \\n\
+ mountain --root \\n\
+ munch --root \\n\
+ penrose --root \\n\
+ GL: pipes --root \\n\
+ rdbomb --root \\n\
+ GL: rubik --root \\n\
+- sierpinski --root \\n\
+ slip --root \\n\
+ GL: sproingies --root \\n\
+ starfish --root \\n\
+ strange --root \\n\
+ swirl --root \\n\
+ triangle --root \\n\
+ xjack --root \\n\
+ xlyap --root \\n\
+ GL: atlantis --root \\n\
+ bsod --root \\n\
+ GL: bubble3d --root \\n\
+ GL: cage --root \\n\
+- crystal --root \\n\
+ cynosure --root \\n\
+ discrete --root \\n\
+ distort --root \\n\
+ epicycle --root \\n\
+ flow --root \\n\
+ GL: glplanet --root \\n\
+ interference --root \\n\
+ kumppa --root \\n\
+ GL: lament --root \\n\
+ moire2 --root \\n\
+ GL: sonar --root \\n\
+ GL: stairs --root \\n\
+ truchet --root \\n\
+- vidwhacker --root \\n\
+- webcollage --root \\n\
+ blaster --root \\n\
+ bumps --root \\n\
+ ccurve --root \\n\
+ compass --root \\n\
+ deluxe --root \\n\
+- demon --root \\n\
+- GL: extrusion --root \\n\
+- loop --root \\n\
+ penetrate --root \\n\
+ petri --root \\n\
+ phosphor --root \\n\
+ GL: pulsar --root \\n\
+ ripples --root \\n\
+ shadebobs --root \\n\
+ GL: sierpinski3d --root \\n\
+ spotlight --root \\n\
+ squiral --root \\n\
+ wander --root \\n\
+ xflame --root \\n\
+ xmatrix --root \\n\
+ GL: gflux --root \\n\
+- nerverot --root \\n\
+ xrayswarm --root \\n\
+ xspirograph --root \\n\
+ GL: circuit --root \\n\
+ GL: dangerball --root \\n\
+- GL: dnalogo --root \\n\
+ GL: engine --root \\n\
+ GL: flipscreen3d --root \\n\
+ GL: gltext --root \\n\
+ GL: menger --root \\n\
+ GL: molecule --root \\n\
+ rotzoomer --root \\n\
+ scooter --root \\n\
+ speedmine --root \\n\
+ GL: starwars --root \\n\
+ GL: stonerview --root \\n\
+ vermiculate --root \\n\
+ whirlwindwarp --root \\n\
+ zoom --root \\n\
+ anemone --root \\n\
+ apollonian --root \\n\
+ GL: boxed --root \\n\
+ GL: cubenetic --root \\n\
+ GL: endgame --root \\n\
+ euler2d --root \\n\
+ fluidballs --root \\n\
+ GL: flurry --root \\n\
+- GL: glblur --root \\n\
+ GL: glsnake --root \\n\
+ halftone --root \\n\
+ GL: juggler3d --root \\n\
+ GL: lavalite --root \\n\
+- polyominoes --root \\n\
+ GL: queens --root \\n\
+- GL: sballs --root \\n\
+ GL: spheremonics --root \\n\
+ twang --root \\n\
+- GL: antspotlight --root \\n\
+ apple2 --root \\n\
+ GL: atunnel --root \\n\
+ barcode --root \\n\
+ GL: blinkbox --root \\n\
+ GL: blocktube --root \\n\
+ GL: bouncingcow --root \\n\
+ cloudlife --root \\n\
+ GL: cubestorm --root \\n\
+ eruption --root \\n\
+ GL: flipflop --root \\n\
+ GL: flyingtoasters --root \\n\
+ fontglide --root \\n\
+ GL: gleidescope --root \\n\
+ GL: glknots --root \\n\
+ GL: glmatrix --root \\n\
+- GL: glslideshow --root \\n\
+ GL: hypertorus --root \\n\
+- GL: jigglypuff --root \\n\
+ metaballs --root \\n\
+ GL: mirrorblob --root \\n\
+ piecewise --root \\n\
+ GL: polytopes --root \\n\
+ pong --root \\n\
+ popsquares --root \\n\
+ GL: surfaces --root \\n\
+ xanalogtv --root \\n\
+ abstractile --root \\n\
+ anemotaxis --root \\n\
+- GL: antinspect --root \\n\
+ fireworkx --root \\n\
+ fuzzyflakes --root \\n\
+ interaggregate --root \\n\
+ intermomentary --root \\n\
+ memscroller --root \\n\
+ GL: noof --root \\n\
+ pacman --root \\n\
+ GL: pinion --root \\n\
+ GL: polyhedra --root \\n\
+- GL: providence --root \\n\
+ substrate --root \\n\
+ wormhole --root \\n\
+- GL: antmaze --root \\n\
+ GL: boing --root \\n\
+ boxfit --root \\n\
+ GL: carousel --root \\n\
+ celtic --root \\n\
+ GL: crackberg --root \\n\
+ GL: cube21 --root \\n\
+ fiberlamp --root \\n\
+ GL: fliptext --root \\n\
+ GL: glhanoi --root \\n\
+ GL: tangram --root \\n\
+ GL: timetunnel --root \\n\
+ GL: glschool --root \\n\
+ GL: topblock --root \\n\
+ GL: cubicgrid --root \\n\
+ cwaves --root \\n\
+ GL: gears --root \\n\
+ GL: glcells --root \\n\
+ GL: lockward --root \\n\
+ m6502 --root \\n\
+ GL: moebiusgears --root \\n\
+ GL: voronoi --root \\n\
+ GL: hypnowheel --root \\n\
+ GL: klein --root \\n\
+- lcdscrub --root \\n\
+ GL: photopile --root \\n\
+ GL: skytentacles --root \\n\
+ GL: rubikblocks --root \\n\
+ GL: companioncube --root \\n\
+ GL: hilbert --root \\n\
+ GL: tronbit --root \\n\
+ GL: geodesic --root \\n\
+ hexadrop --root \\n\
+ GL: kaleidocycle --root \\n\
+ GL: quasicrystal --root \\n\
+ GL: unknownpleasures --root \\n\
+ binaryring --root \\n\
+ GL: cityflow --root \\n\
+ GL: geodesicgears --root \\n\
+ GL: projectiveplane --root \\n\
+ GL: romanboy --root \\n\
+ tessellimage --root \\n\
+ GL: winduprobot --root \\n\
+ GL: splitflap --root \\n\
+ GL: cubestack --root \\n\
+ GL: cubetwist --root \\n\
+ GL: discoball --root \\n\
+ GL: dymaxionmap --root \\n\
+ GL: energystream --root \\n\
+ GL: hexstrut --root \\n\
+ GL: hydrostat --root \\n\
+ GL: raverhoop --root \\n\
+ GL: splodesic --root \\n\
+ GL: unicrud --root \\n\
+ GL: esper --root \\n\
+ GL: vigilance --root \\n\
+ GL: crumbler --root \\n\
+ filmleader --root \\n\
+ glitchpeg --root \\n\
+ GL: handsy --root \\n\
+ GL: maze3d --root \\n\
+ GL: peepers --root \\n\
+ GL: razzledazzle --root \\n\
+ vfeedback --root \\n\
+ GL: deepstars --root \\n\
+ GL: gravitywell --root \\n\
+ GL: beats --root \\n\
+ GL: covid19 --root \\n\
+ GL: etruscanvenus --root \\n\
+ GL: gibson --root \\n\
+ GL: headroom --root \\n\
+ GL: sphereeversion --root \\n\
+ binaryhorizon --root \\n\
+ marbling --root \\n\
+ GL: chompytower --root \\n\
+ GL: hextrail --root \\n\
+ GL: mapscroller --root \\n\
+ GL: nakagin --root \\n\
+ GL: squirtorus --root \\n\
+ GL: cubocteversion --root \\n\
+ droste --root \\n\
+ GL: papercube --root \\n\
+ GL: skulloop --root \\n\
+ GL: highvoltage --root \\n\
+ GL: kallisti --root \\n",
+"*hacks.antinspect.name: Ant Inspect",
+"*hacks.antmaze.name: Ant Maze",
+"*hacks.antspotlight.name: Ant Spotlight",
+"*hacks.apple2.name: Apple ][",
+"*hacks.binaryhorizon.name: Binary Horizon",
+"*hacks.binaryring.name: Binary Ring",
+"*hacks.blinkbox.name: Blink Box",
+"*hacks.blitspin.name: Blit Spin",
+"*hacks.blocktube.name: Block Tube",
+"*hacks.bouncingcow.name: Bouncing Cow",
+"*hacks.boxfit.name: Box Fit",
+"*hacks.bsod.name: BSOD",
+"*hacks.bubble3d.name: Bubble 3D",
+"*hacks.ccurve.name: C Curve",
+"*hacks.chompytower.name: Chompy Tower",
+"*hacks.cityflow.name: City Flow",
+"*hacks.cloudlife.name: Cloud Life",
+"*hacks.companioncube.name: Companion Cube",
+"*hacks.covid19.name: COVID19",
+"*hacks.cube21.name: Cube 21",
+"*hacks.cubestack.name: Cube Stack",
+"*hacks.cubestorm.name: Cube Storm",
+"*hacks.cubetwist.name: Cube Twist",
+"*hacks.cubicgrid.name: Cubic Grid",
+"*hacks.cubocteversion.name: Cuboctahedron Eversion",
+"*hacks.cwaves.name: C Waves",
+"*hacks.dangerball.name: Danger Ball",
+"*hacks.decayscreen.name: Decay Screen",
+"*hacks.deepstars.name: Deep Stars",
+"*hacks.dnalogo.name: DNA Logo",
+"*hacks.dymaxionmap.name: Dymaxion Map",
+"*hacks.energystream.name: Energy Stream",
+"*hacks.etruscanvenus.name: Etruscan Venus",
+"*hacks.euler2d.name: Euler 2D",
+"*hacks.fadeplot.name: Fade Plot",
+"*hacks.fiberlamp.name: Fiber Lamp",
+"*hacks.filmleader.name: Film Leader",
+"*hacks.flipflop.name: Flip Flop",
+"*hacks.flipscreen3d.name: Flip Screen 3D",
+"*hacks.fliptext.name: Flip Text",
+"*hacks.fluidballs.name: Fluid Balls",
+"*hacks.flyingtoasters.name: Flying Toasters",
+"*hacks.fontglide.name: Font Glide",
+"*hacks.fuzzyflakes.name: Fuzzy Flakes",
+"*hacks.geodesicgears.name: Geodesic Gears",
+"*hacks.gflux.name: GFlux",
+"*hacks.glblur.name: GL Blur",
+"*hacks.glcells.name: GL Cells",
+"*hacks.gleidescope.name: Gleidescope",
+"*hacks.glforestfire.name: GL Forest Fire",
+"*hacks.glhanoi.name: GL Hanoi",
+"*hacks.glitchpeg.name: GlitchPEG",
+"*hacks.glknots.name: GL Knots",
+"*hacks.glmatrix.name: GL Matrix",
+"*hacks.glplanet.name: GL Planet",
+"*hacks.glschool.name: GL School",
+"*hacks.glslideshow.name: GL Slideshow",
+"*hacks.glsnake.name: GL Snake",
+"*hacks.gltext.name: GL Text",
+"*hacks.gravitywell.name: Gravity Well",
+"*hacks.hexstrut.name: Hex Strut",
+"*hacks.hextrail.name: Hex Trail",
+"*hacks.highvoltage.name: High Voltage",
+"*hacks.ifs.name: IFS",
+"*hacks.imsmap.name: IMS Map",
+"*hacks.jigglypuff.name: Jiggly Puff",
+"*hacks.juggler3d.name: Juggler 3D",
+"*hacks.lcdscrub.name: LCD Scrub",
+"*hacks.lmorph.name: LMorph",
+"*hacks.m6502.name: m6502",
+"*hacks.mapscroller.name: Map Scroller",
+"*hacks.maze3d.name: Maze 3D",
+"*hacks.memscroller.name: Mem Scroller",
+"*hacks.metaballs.name: Meta Balls",
+"*hacks.mirrorblob.name: Mirror Blob",
+"*hacks.moebius.name: Möbius",
+"*hacks.moebiusgears.name: Möbius Gears",
+"*hacks.moire.name: Moiré",
+"*hacks.moire2.name: Moiré 2",
+"*hacks.morph3d.name: Morph 3D",
+"*hacks.nerverot.name: Nerve Rot",
+"*hacks.noseguy.name: Nose Guy",
+"*hacks.pacman.name: Pac-Man",
+"*hacks.papercube.name: Paper Cube",
+"*hacks.photopile.name: Photo Pile",
+"*hacks.popsquares.name: Pop Squares",
+"*hacks.projectiveplane.name:Projective Plane",
+"*hacks.quasicrystal.name: Quasi-Crystal",
+"*hacks.raverhoop.name: Raver Hoop",
+"*hacks.razzledazzle.name: Razzle Dazzle",
+"*hacks.rdbomb.name: RD-Bomb",
+"*hacks.romanboy.name: Roman Boy",
+"*hacks.rotzoomer.name: Rot Zoomer",
+"*hacks.rubikblocks.name: Rubik Blocks",
+"*hacks.sballs.name: SBalls",
+"*hacks.shadebobs.name: Shade Bobs",
+"*hacks.sierpinski3d.name: Sierpinski 3D",
+"*hacks.skytentacles.name: Sky Tentacles",
+"*hacks.slidescreen.name: Slide Screen",
+"*hacks.speedmine.name: Speed Mine",
+"*hacks.sphereeversion.name: Sphere Eversion",
+"*hacks.splitflap.name: Split-Flap",
+"*hacks.starwars.name: Star Wars",
+"*hacks.stonerview.name: Stoner View",
+"*hacks.t3d.name: T3D",
+"*hacks.testx11.name: Test X11",
+"*hacks.timetunnel.name: Time Tunnel",
+"*hacks.topblock.name: Top Block",
+"*hacks.tronbit.name: Tron Bit",
+"*hacks.unknownpleasures.name:Unknown Pleasures",
+"*hacks.vfeedback.name: VFeedback",
+"*hacks.vidwhacker.name: Vid Whacker",
+"*hacks.webcollage.name: Web Collage",
+"*hacks.whirlwindwarp.name: Whirlwind Warp",
+"*hacks.winduprobot.name: Windup Robot",
+"*hacks.xanalogtv.name: XAnalogTV",
+"*hacks.xrayswarm.name: XRaySwarm",
diff --git a/driver/atoms.c b/driver/atoms.c
index e8b6add..fc34707 100644
--- a/driver/atoms.c
+++ b/driver/atoms.c
@@ -1,4 +1,4 @@
-/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -25,9 +25,10 @@
Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE,
XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT,
XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV,
- XA_DEACTIVATE, XA_CYCLE, XA_RESTART, XA_PREFS,
+ XA_DEACTIVATE, XA_CYCLE, XA_RESTART,
XA_NET_WM_PID, XA_NET_WM_STATE, XA_NET_WM_STATE_ABOVE,
XA_NET_WM_STATE_FULLSCREEN, XA_NET_WM_BYPASS_COMPOSITOR,
+ XA_NET_WM_STATE_STAYS_ON_TOP, XA_KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
XA_NET_WM_WINDOW_TYPE, XA_NET_WM_WINDOW_TYPE_SPLASH,
XA_NET_WM_WINDOW_TYPE_DIALOG, XA_NET_WM_WINDOW_TYPE_NOTIFICATION,
XA_NET_WM_WINDOW_TYPE_NORMAL;
@@ -52,7 +53,6 @@ init_xscreensaver_atoms (Display *dpy)
XA_SELECT = A("SELECT");
XA_EXIT = A("EXIT");
XA_DEMO = A("DEMO");
- XA_PREFS = A("PREFS");
XA_LOCK = A("LOCK");
XA_BLANK = A("BLANK");
@@ -66,5 +66,8 @@ init_xscreensaver_atoms (Display *dpy)
XA_NET_WM_WINDOW_TYPE_DIALOG = A("_NET_WM_WINDOW_TYPE_DIALOG");
XA_NET_WM_WINDOW_TYPE_NOTIFICATION = A("_NET_WM_WINDOW_TYPE_NOTIFICATION");
XA_NET_WM_WINDOW_TYPE_NORMAL = A("_NET_WM_WINDOW_TYPE_NORMAL");
+ XA_NET_WM_STATE_STAYS_ON_TOP = A("_NET_WM_STATE_STAYS_ON_TOP");
+ XA_KDE_NET_WM_WINDOW_TYPE_OVERRIDE = A("_KDE_NET_WM_WINDOW_TYPE_OVERRIDE");
+
# undef A
}
diff --git a/driver/atoms.h b/driver/atoms.h
index b5a7b7c..3f65d81 100644
--- a/driver/atoms.h
+++ b/driver/atoms.h
@@ -1,4 +1,4 @@
-/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -15,9 +15,10 @@
extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE,
XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT,
XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV,
- XA_DEACTIVATE, XA_CYCLE, XA_RESTART, XA_PREFS,
+ XA_DEACTIVATE, XA_CYCLE, XA_RESTART,
XA_NET_WM_PID, XA_NET_WM_STATE, XA_NET_WM_STATE_ABOVE,
XA_NET_WM_STATE_FULLSCREEN, XA_NET_WM_BYPASS_COMPOSITOR,
+ XA_NET_WM_STATE_STAYS_ON_TOP, XA_KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
XA_NET_WM_WINDOW_TYPE, XA_NET_WM_WINDOW_TYPE_SPLASH,
XA_NET_WM_WINDOW_TYPE_DIALOG, XA_NET_WM_WINDOW_TYPE_NOTIFICATION,
XA_NET_WM_WINDOW_TYPE_NORMAL;
diff --git a/driver/atomswm.c b/driver/atomswm.c
index 887dc2c..1ddf47a 100644
--- a/driver/atomswm.c
+++ b/driver/atomswm.c
@@ -43,6 +43,7 @@ xscreensaver_set_wm_atoms (Display *dpy, Window window, int width, int height,
# endif
Atom va[10];
long vl[10];
+ int i;
class_hints.res_name = "xscreensaver"; /* not progname */
class_hints.res_class = "XScreenSaver";
size_hints.flags = PMinSize | PMaxSize;
@@ -73,22 +74,27 @@ xscreensaver_set_wm_atoms (Display *dpy, Window window, int width, int height,
grubby paws off of our windows.
*/
- vl[0] = 1; /* _NET_WM_BYPASS_COMPOSITOR = 1 */
+ i = 0;
+ vl[i++] = 1; /* _NET_WM_BYPASS_COMPOSITOR = 1 */
XChangeProperty (dpy, window, XA_NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
- PropModeReplace, (unsigned char *) vl, 1);
+ PropModeReplace, (unsigned char *) vl, i);
/* _NET_WM_STATE = [ _NET_WM_STATE_ABOVE, _NET_WM_STATE_FULLSCREEN ] */
- va[0] = XA_NET_WM_STATE_ABOVE;
- va[1] = XA_NET_WM_STATE_FULLSCREEN;
+ i = 0;
+ va[i++] = XA_NET_WM_STATE_ABOVE;
+ va[i++] = XA_NET_WM_STATE_FULLSCREEN;
+ va[i++] = XA_NET_WM_STATE_STAYS_ON_TOP; /* Does this do anything? */
XChangeProperty (dpy, window, XA_NET_WM_STATE, XA_ATOM, 32,
- PropModeReplace, (unsigned char *) va, 2);
+ PropModeReplace, (unsigned char *) va, i);
/* As there is no _NET_WM_WINDOW_TYPE_SCREENSAVER, which property is
most likely to effectively communicate "on top always" to the WM?
_NET_WM_WINDOW_TYPE = NORMAL, SPLASH, DIALOG or NOTIFICATION? */
- va[0] = XA_NET_WM_WINDOW_TYPE_NOTIFICATION;
+ i = 0;
+ va[i++] = XA_NET_WM_WINDOW_TYPE_NOTIFICATION;
+ va[i++] = XA_KDE_NET_WM_WINDOW_TYPE_OVERRIDE; /* Does this do anything? */
XChangeProperty (dpy, window, XA_NET_WM_WINDOW_TYPE, XA_ATOM, 32,
- PropModeReplace, (unsigned char *) va, 1);
+ PropModeReplace, (unsigned char *) va, i);
if (for_window) /* This is the error dialog for a saver window */
{
diff --git a/driver/auth.h b/driver/auth.h
index 40594ea..80a49ba 100644
--- a/driver/auth.h
+++ b/driver/auth.h
@@ -1,5 +1,5 @@
/* auth.h --- Providing authentication mechanisms.
- * Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * Copyright © 1993-2022 Jamie Zawinski <jwz@jwz.org>
* (c) 2007, Quest Software, Inc. All rights reserved.
* This file is part of XScreenSaver.
*
@@ -85,7 +85,7 @@ extern Bool xscreensaver_auth_conv (void *closure,
const auth_message *msg,
auth_response **resp);
extern void xscreensaver_auth_finished (void *closure, Bool authenticated_p);
-extern void xscreensaver_splash (void *root_widget);
+extern void xscreensaver_splash (void *root_widget, Bool disable_settings_p);
#endif /* __XSCREENSAVER_AUTH_H__ */
diff --git a/driver/blurb.c b/driver/blurb.c
index d732a9b..ddb8b18 100644
--- a/driver/blurb.c
+++ b/driver/blurb.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -17,20 +17,29 @@
#include <string.h>
#include <time.h>
+#include <sys/time.h>
const char *progname = "";
int verbose_p = 0;
+/* #define BLURB_CENTISECONDS */
+
const char *
blurb (void)
{
static char buf[255] = { 0 };
struct tm tm;
- time_t now;
+ struct timeval now;
int i;
- now = time ((time_t *) 0);
- localtime_r (&now, &tm);
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday (&now, &tzp);
+# else
+ gettimeofday (&now);
+# endif
+
+ localtime_r (&now.tv_sec, &tm);
i = strlen (progname);
if (i > 40) i = 40;
memcpy (buf, progname, i);
@@ -44,6 +53,16 @@ blurb (void)
buf[i++] = ':';
buf[i++] = '0' + (tm.tm_sec >= 10 ? tm.tm_sec/10 : 0);
buf[i++] = '0' + (tm.tm_sec % 10);
+
+# ifdef BLURB_CENTISECONDS
+ {
+ int c = now.tv_usec / 10000;
+ buf[i++] = '.';
+ buf[i++] = '0' + (c >= 10 ? c/10 : 0);
+ buf[i++] = '0' + (c % 10);
+ }
+# endif
+
buf[i] = 0;
return buf;
}
diff --git a/driver/clientmsg.c b/driver/clientmsg.c
index f3d9d71..475d72b 100644
--- a/driver/clientmsg.c
+++ b/driver/clientmsg.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -36,59 +36,68 @@ error_handler (Display *dpy, XErrorEvent *error)
Window
find_screensaver_window (Display *dpy, char **version)
{
- int i;
- Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
- Window root2, parent, *kids;
- unsigned int nkids;
- XErrorHandler old_handler;
+ int nscreens = ScreenCount (dpy);
+ int screen;
Window ret = 0;
+ XErrorHandler old_handler;
XSync (dpy, False);
old_handler = XSetErrorHandler (error_handler);
if (version) *version = 0;
- if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
- abort ();
- if (root != root2)
- abort ();
- if (parent)
- abort ();
- if (! (kids && nkids))
- goto DONE;
- for (i = 0; i < nkids; i++)
+ for (screen = 0; screen < nscreens; screen++)
{
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *v = 0;
- int status;
-
- /* We're walking the list of root-level windows and trying to find
- the one that has a particular property on it. We need to trap
- BadWindows errors while doing this, because it's possible that
- some random window might get deleted in the meantime. (That
- window won't have been the one we're looking for.)
- */
- status = XGetWindowProperty (dpy, kids[i],
- XA_SCREENSAVER_VERSION,
- 0, 200, False, XA_STRING,
- &type, &format, &nitems, &bytesafter,
- &v);
- if (status == Success && type != None)
- {
- ret = kids[i];
- if (version)
- *version = (char *) v;
- else
- XFree (v);
- goto DONE;
- }
- if (v) XFree (v);
+ Window root = RootWindow (dpy, screen);
+ Window root2, parent, *kids;
+ unsigned int nkids;
+ int i = 0;
+
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ abort ();
+ if (root != root2)
+ abort ();
+ if (parent)
+ abort ();
+ if (! (kids && nkids))
+ goto DONE;
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *v = 0;
+ int status;
+
+ /* We're walking the list of root-level windows and trying to find
+ the one that has a particular property on it. We need to trap
+ BadWindows errors while doing this, because it's possible that
+ some random window might get deleted in the meantime. (That
+ window won't have been the one we're looking for.)
+ */
+ status = XGetWindowProperty (dpy, kids[i],
+ XA_SCREENSAVER_VERSION,
+ 0, 200, False, XA_STRING,
+ &type, &format, &nitems, &bytesafter,
+ &v);
+ if (status == Success && type != None)
+ {
+ ret = kids[i];
+ if (version)
+ *version = (char *) v;
+ else
+ XFree (v);
+ goto DONE;
+ }
+ if (v) XFree (v);
+
+ DONE:
+ if (ret) break;
+ }
+ if (kids) XFree (kids);
+ if (ret) break;
}
- DONE:
- if (kids) XFree (kids);
XSetErrorHandler (old_handler);
return ret;
}
@@ -104,8 +113,15 @@ clientmessage_response (Display *dpy, XEvent *xev, Bool ok, const char *msg)
{
Atom cmd = xev->xclient.data.l[0];
char *name = XGetAtomName (dpy, cmd);
- fprintf (stderr, "%s: ClientMessage %s: %s\n", blurb(),
- (name ? name : "???"), msg);
+ pid_t caller = (cmd == XA_DEACTIVATE
+ ? (pid_t) xev->xclient.data.l[1]
+ : 0);
+ if (caller)
+ fprintf (stderr, "%s: ClientMessage %s: %s (from pid %lu)\n", blurb(),
+ (name ? name : "???"), msg, (unsigned long) caller);
+ else
+ fprintf (stderr, "%s: ClientMessage %s: %s\n", blurb(),
+ (name ? name : "???"), msg);
}
L = strlen (msg);
diff --git a/driver/compile_axp.com b/driver/compile_axp.com
deleted file mode 100644
index d6ed0e8..0000000
--- a/driver/compile_axp.com
+++ /dev/null
@@ -1,15 +0,0 @@
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C
-$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C
diff --git a/driver/compile_decc.com b/driver/compile_decc.com
deleted file mode 100644
index d6ed0e8..0000000
--- a/driver/compile_decc.com
+++ /dev/null
@@ -1,15 +0,0 @@
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C
-$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C
diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c
index 6d04215..86acea2 100644
--- a/driver/demo-Gtk-conf.c
+++ b/driver/demo-Gtk-conf.c
@@ -1,5 +1,5 @@
/* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001-2020 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2001-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -14,7 +14,7 @@
# include "config.h"
#endif
-#if defined(HAVE_GTK) && defined(HAVE_XML) /* whole file */
+#ifdef HAVE_GTK /* whole file */
#include <xscreensaver-intl.h>
@@ -28,36 +28,7 @@
#include <string.h>
#include <ctype.h>
-/*
- * Both of these workarounds can be removed when support for ancient
- * libxml versions is dropped. versions 1.8.11 and 2.3.4 provide the
- * correct fixes.
- */
-
-/*
- * Older libxml polluted the global headerspace, while libxml2 fixed
- * this. To support both old and recent libxmls, we have this
- * workaround.
- */
-#ifdef HAVE_OLD_XML_HEADERS
-# include <parser.h>
-#else /* ! HAVE_OLD_XML_HEADERS */
-# include <libxml/parser.h>
-#endif /* HAVE_OLD_XML_HEADERS */
-
-/*
- * handle non-native spelling mistakes in earlier versions and provide
- * the source-compat fix for this that may not be in older versions.
- */
-#ifndef xmlChildrenNode
-# if LIBXML_VERSION >= 20000
-# define xmlChildrenNode children
-# define xmlRootNode children
-# else
-# define xmlChildrenNode childs
-# define xmlRootNode root
-# endif /* LIBXML_VERSION */
-#endif /* xmlChildrenNode */
+#include <libxml/parser.h>
#if (__GNUC__ >= 4) /* Ignore useless warnings generated by gtk.h */
# undef inline
@@ -66,6 +37,7 @@
# pragma GCC diagnostic ignored "-Wlong-long"
# pragma GCC diagnostic ignored "-Wvariadic-macros"
# pragma GCC diagnostic ignored "-Wpedantic"
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#include <gtk/gtk.h>
@@ -74,6 +46,7 @@
# pragma GCC diagnostic pop
#endif
+#include "blurb.h"
#include "demo-Gtk-conf.h"
/* Deal with deprecation of direct access to struct fields on the way to GTK3
@@ -92,12 +65,7 @@
#endif
-extern const char *blurb (void);
-
-
-const char *hack_configuration_path = HACK_CONFIGURATION_PATH;
-
-static gboolean debug_p = FALSE;
+static gboolean debug_p = FALSE; /* Copied from s->debug_p in parent */
#define MIN_SLIDER_WIDTH 150
@@ -120,6 +88,11 @@ typedef enum {
} parameter_type;
+typedef enum {
+ NONE, INVERT, RATIO
+} convert_t;
+
+
typedef struct {
parameter_type type;
@@ -140,8 +113,9 @@ typedef struct {
float value; /* default value */
gboolean integer_p; /* whether the range is integral, or real */
xmlChar *arg; /* command-line option to set (substitute "%") */
- gboolean invert_p; /* whether to flip the value and pretend the
- range goes from hi-low instead of low-hi. */
+ convert_t convert; /* invert: whether to flip the value and pretend the
+ range goes from hi-low instead of low-hi.
+ ratio: position 1.0 at the center. */
/* boolean, select-option
*/
@@ -161,7 +135,9 @@ typedef struct {
static parameter *make_select_option (const char *file, xmlNodePtr);
static void make_parameter_widget (const char *filename,
- parameter *, GtkWidget *);
+ parameter *, GtkWidget *,
+ void (*changed_cb) (GtkWidget *, gpointer),
+ gpointer changed_data);
static void browse_button_cb (GtkButton *button, gpointer user_data);
@@ -221,7 +197,14 @@ describe_parameter (FILE *out, parameter *p)
if (p->high) fprintf (out, " high=\"%.2f\"", p->high);
if (p->value) fprintf (out, " default=\"%.2f\"", p->value);
if (p->arg) fprintf (out, " arg=\"%s\"", p->arg);
- if (p->invert_p) fprintf (out, " convert=\"invert\"");
+
+ switch (p->convert) {
+ case NONE: break;
+ case INVERT: fprintf (out, " convert=\"invert\""); break;
+ case RATIO: fprintf (out, " convert=\"ratio\""); break;
+ default: abort(); break;
+ }
+
if (p->arg_set) fprintf (out, " arg-set=\"%s\"", p->arg_set);
if (p->arg_unset) fprintf (out, " arg-unset=\"%s\"", p->arg_unset);
fprintf (out, ">\n");
@@ -366,7 +349,11 @@ make_parameter (const char *filename, xmlNodePtr node)
p->value = xml_get_float (node, (xmlChar *) "default", &floatp);
p->integer_p = !floatp;
convert = (char *) xmlGetProp (node, (xmlChar *) "convert");
- p->invert_p = (convert && !strcmp (convert, "invert"));
+
+ if (convert && !strcmp (convert, "invert")) p->convert = INVERT;
+ else if (convert && !strcmp (convert, "ratio")) p->convert = RATIO;
+ else p->convert = NONE;
+
p->arg = xmlGetProp (node, (xmlChar *) "arg");
p->arg_set = xmlGetProp (node, (xmlChar *) "arg-set");
p->arg_unset = xmlGetProp (node, (xmlChar *) "arg-unset");
@@ -461,7 +448,7 @@ sanity_check_parameter (const char *filename, const xmlChar *node_name,
gboolean high;
gboolean value;
gboolean arg;
- gboolean invert_p;
+ gboolean convert;
gboolean arg_set;
gboolean arg_unset;
} allowed, require;
@@ -511,7 +498,7 @@ sanity_check_parameter (const char *filename, const xmlChar *node_name,
/* require.high = TRUE; -- may be 0 */
allowed.value = TRUE;
/* require.value = TRUE; -- may be 0 */
- allowed.invert_p = TRUE;
+ allowed.convert = TRUE;
break;
case SPINBUTTON:
allowed.id = TRUE;
@@ -525,7 +512,7 @@ sanity_check_parameter (const char *filename, const xmlChar *node_name,
/* require.high = TRUE; -- may be 0 */
allowed.value = TRUE;
/* require.value = TRUE; -- may be 0 */
- allowed.invert_p = TRUE;
+ allowed.convert = FALSE;
break;
case BOOLEAN:
allowed.id = TRUE;
@@ -571,9 +558,15 @@ sanity_check_parameter (const char *filename, const xmlChar *node_name,
CHECK (high, "high");
CHECK (value, "default");
CHECK (arg, "arg");
- CHECK (invert_p, "convert");
+ CHECK (convert, "convert");
CHECK (arg_set, "arg-set");
CHECK (arg_unset, "arg-unset");
+
+ if (p->convert == RATIO)
+ {
+ if (p->low <= 0) WARN ("low must be > 0");
+ if (p->high <= 1) WARN ("high must be > 1");
+ }
# undef CHECK
# undef WARN
@@ -587,16 +580,13 @@ sanity_check_menu_options (const char *filename, const xmlChar *node_name,
parameter *p)
{
GList *opts;
- int noptions = 0;
int nulls = 0;
char *prefix = 0;
-/* fprintf (stderr, "\n## %s\n", p->id);*/
for (opts = p->options; opts; opts = opts->next)
{
parameter *s = (parameter *) opts->data;
if (!s->arg_set) nulls++;
- noptions++;
if (s->arg_set)
{
@@ -605,10 +595,12 @@ sanity_check_menu_options (const char *filename, const xmlChar *node_name,
if (spc) *spc = 0;
if (prefix)
{
+# if 0
if (strcmp (a, prefix))
fprintf (stderr,
"%s: %s: both \"%s\" and \"%s\" used in <select id=\"%s\">\n",
blurb(), filename, prefix, a, p->id);
+# endif
free (prefix);
}
prefix = a;
@@ -703,7 +695,9 @@ sanity_check_parameters (const char *filename, GList *parms)
/* Helper for make_parameters()
*/
static GList *
-make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent)
+make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent,
+ void (*changed_cb) (GtkWidget *, gpointer),
+ gpointer changed_data)
{
GList *list = 0;
@@ -713,14 +707,16 @@ make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent)
if (!strcmp (name, "hgroup") ||
!strcmp (name, "vgroup"))
{
- GtkWidget *box = (*name == 'h'
- ? gtk_hbox_new (FALSE, 0)
- : gtk_vbox_new (FALSE, 0));
+ GtkWidget *box = gtk_box_new (*name == 'h'
+ ? GTK_ORIENTATION_HORIZONTAL
+ : GTK_ORIENTATION_VERTICAL,
+ 0);
GList *list2;
gtk_widget_show (box);
gtk_box_pack_start (GTK_BOX (parent), box, FALSE, FALSE, 0);
- list2 = make_parameters_1 (filename, node->xmlChildrenNode, box);
+ list2 = make_parameters_1 (filename, node->xmlChildrenNode, box,
+ changed_cb, changed_data);
if (list2)
list = g_list_concat (list, list2);
}
@@ -730,7 +726,8 @@ make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent)
if (p)
{
list = g_list_append (list, p);
- make_parameter_widget (filename, p, parent);
+ make_parameter_widget (filename, p, parent,
+ changed_cb, changed_data);
}
}
}
@@ -743,13 +740,16 @@ make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent)
Returns a GList of `parameter' objects.
*/
static GList *
-make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent)
+make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent,
+ void (*changed_cb) (GtkWidget *, gpointer),
+ gpointer changed_data)
{
for (; node; node = node->next)
{
if (node->type == XML_ELEMENT_NODE &&
!strcmp ((char *) node->name, "screensaver"))
- return make_parameters_1 (filename, node->xmlChildrenNode, parent);
+ return make_parameters_1 (filename, node->xmlChildrenNode, parent,
+ changed_cb, changed_data);
}
return 0;
}
@@ -763,42 +763,62 @@ invert_range (gfloat low, gfloat high, gfloat value)
return (low + (range - off));
}
+/* In: 0-1; Out: low-high. */
+static gfloat
+ratio_to_range (gfloat low, gfloat high, gfloat ratio)
+{
+ return (ratio > 0.5
+ ? (1 + (2 * (ratio - 0.5) * (high - 1)))
+ : (low + (2 * ratio * (1 - low))));
+}
+
+/* In: low-high; Out: 0-1. */
+static gfloat
+range_to_ratio (gfloat low, gfloat high, gfloat value)
+{
+ return (value > 1
+ ? ((value - 1) / (2 * (high - 1))) + 0.5
+ : ((value - low) / (2 * (1 - low))));
+}
+
static GtkAdjustment *
make_adjustment (const char *filename, parameter *p)
{
- float range = (p->high - p->low);
- float value = (p->invert_p
- ? invert_range (p->low, p->high, p->value)
+ gfloat low = p->low;
+ gfloat high = p->high;
+ float range = (high - low);
+ float value = (p->convert == INVERT
+ ? invert_range (low, high, p->value)
: p->value);
- gfloat si = (p->high - p->low) / 100;
- gfloat pi = (p->high - p->low) / 10;
+ gfloat si = (high - low) / 100;
+ gfloat pi = (high - low) / 10;
gfloat page_size = ((p->type == SLIDER) ? 1 : 0);
- if (p->value < p->low || p->value > p->high)
+ if (p->value < low || p->value > high)
{
if (debug_p && p->integer_p)
fprintf (stderr, "%s: WARNING: %s: %d is not in range [%d, %d]\n",
blurb(), filename,
- (int) p->value, (int) p->low, (int) p->high);
+ (int) p->value, (int) low, (int) high);
else if (debug_p)
fprintf (stderr,
"%s: WARNING: %s: %.2f is not in range [%.2f, %.2f]\n",
- blurb(), filename, p->value, p->low, p->high);
- value = (value < p->low ? p->low : p->high);
+ blurb(), filename, p->value, low, high);
+ value = (value < low ? low : high);
}
#if 0
- else if (debug_p && p->value < 1000 && p->high >= 10000)
+ else if (debug_p && p->value < 1000 && high >= 10000)
{
if (p->integer_p)
fprintf (stderr,
"%s: WARNING: %s: %d is suspicious for range [%d, %d]\n",
blurb(), filename,
- (int) p->value, (int) p->low, (int) p->high);
+ (int) p->value, (int) low, (int) high);
else
fprintf (stderr,
"%s: WARNING: %s: %.2f is suspicious for range [%.2f, %.2f]\n",
- blurb(), filename, p->value, p->low, p->high);
+ blurb(), filename, p->value, low, high);
}
#endif /* 0 */
@@ -809,20 +829,26 @@ make_adjustment (const char *filename, parameter *p)
if (range <= 500) si = 1;
- return GTK_ADJUSTMENT (gtk_adjustment_new (value,
- p->low,
- p->high + page_size,
+ /* For simplicity, "ratio" sliders in the UI all run from 0.0 to 1.0. */
+ if (p->convert == RATIO)
+ {
+ value = range_to_ratio (low, high, value);
+ low = 0;
+ high = 1;
+ page_size = 0;
+ }
+
+ return GTK_ADJUSTMENT (gtk_adjustment_new (value, low, high + page_size,
si, pi, page_size));
}
-
static void
set_widget_min_width (GtkWidget *w, int width)
{
- GtkRequisition req;
- gtk_widget_size_request (GTK_WIDGET (w), &req);
- if (req.width < width)
+ GtkRequisition min, nat;
+ gtk_widget_get_preferred_size (w, &min, &nat);
+ if (min.width < width)
gtk_widget_set_size_request (GTK_WIDGET (w), width, -1);
}
@@ -834,9 +860,10 @@ set_widget_min_width (GtkWidget *w, int width)
static GtkWidget *
insert_fake_hbox (GtkWidget *parent)
{
- if (GTK_IS_VBOX (parent))
+ if (gtk_orientable_get_orientation (GTK_ORIENTABLE (parent)) ==
+ GTK_ORIENTATION_VERTICAL)
{
- GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+ GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start (GTK_BOX (parent), hbox, FALSE, FALSE, 4);
gtk_widget_show (hbox);
return hbox;
@@ -846,15 +873,15 @@ insert_fake_hbox (GtkWidget *parent)
static void
-link_atk_label_to_widget(GtkWidget *label, GtkWidget *widget)
+link_atk_label_to_widget (GtkWidget *label, GtkWidget *widget)
{
- AtkObject *atk_label = gtk_widget_get_accessible (label);
- AtkObject *atk_widget = gtk_widget_get_accessible (widget);
+ AtkObject *atk_label = gtk_widget_get_accessible (label);
+ AtkObject *atk_widget = gtk_widget_get_accessible (widget);
- atk_object_add_relationship (atk_label, ATK_RELATION_LABEL_FOR,
- atk_widget);
- atk_object_add_relationship (atk_widget, ATK_RELATION_LABELLED_BY,
- atk_label);
+ atk_object_add_relationship (atk_label, ATK_RELATION_LABEL_FOR,
+ atk_widget);
+ atk_object_add_relationship (atk_widget, ATK_RELATION_LABELLED_BY,
+ atk_label);
}
/* Given a `parameter' struct, allocates an appropriate GtkWidget for it,
@@ -862,7 +889,9 @@ link_atk_label_to_widget(GtkWidget *label, GtkWidget *widget)
`parent' must be a GtkBox.
*/
static void
-make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
+make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent,
+ void (*changed_cb) (GtkWidget *, gpointer data),
+ gpointer changed_data)
{
const char *label = (char *) p->label;
if (p->widget) return;
@@ -878,7 +907,8 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
GtkWidget *w = gtk_label_new (_(label));
link_atk_label_to_widget (w, entry);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
- gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (w), 1.0);
+ gtk_label_set_yalign (GTK_LABEL (w), 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
gtk_widget_show (w);
gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
@@ -888,6 +918,8 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
if (p->string)
gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) p->string);
gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
+ g_signal_connect (p->widget, "changed", G_CALLBACK (changed_cb),
+ changed_data);
break;
}
case FILENAME:
@@ -900,12 +932,12 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
gtk_widget_show (button);
p->widget = entry;
- gtk_signal_connect (GTK_OBJECT (button),
- "clicked", GTK_SIGNAL_FUNC (browse_button_cb),
- (gpointer) entry);
+ g_signal_connect (button, "clicked", G_CALLBACK (browse_button_cb),
+ (gpointer) entry);
gtk_label_set_justify (GTK_LABEL (L), GTK_JUSTIFY_RIGHT);
- gtk_misc_set_alignment (GTK_MISC (L), 1.0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (L), 1.0);
+ gtk_label_set_yalign (GTK_LABEL (L), 0.5);
set_widget_min_width (GTK_WIDGET (L), MIN_LABEL_WIDTH);
gtk_widget_show (L);
@@ -916,12 +948,14 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
gtk_box_pack_start (GTK_BOX (parent), L, FALSE, FALSE, 4);
gtk_box_pack_start (GTK_BOX (parent), entry, TRUE, TRUE, 4);
gtk_box_pack_start (GTK_BOX (parent), button, FALSE, FALSE, 4);
+ g_signal_connect (p->widget, "changed",
+ G_CALLBACK (changed_cb), changed_data);
break;
}
case SLIDER:
{
GtkAdjustment *adj = make_adjustment (filename, p);
- GtkWidget *scale = gtk_hscale_new (adj);
+ GtkWidget *scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj);
GtkWidget *labelw = 0;
if (label)
@@ -929,7 +963,8 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
labelw = gtk_label_new (_(label));
link_atk_label_to_widget (labelw, scale);
gtk_label_set_justify (GTK_LABEL (labelw), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (labelw), 0.0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (labelw), 0.0);
+ gtk_label_set_yalign (GTK_LABEL (labelw), 0.5);
set_widget_min_width (GTK_WIDGET (labelw), MIN_LABEL_WIDTH);
gtk_widget_show (labelw);
gtk_box_pack_start (GTK_BOX (parent), labelw, FALSE, FALSE, 2);
@@ -943,17 +978,21 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
GtkWidget *w = gtk_label_new (_((char *) p->low_label));
link_atk_label_to_widget (w, scale);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
- gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (w), 1.0);
+ gtk_label_set_yalign (GTK_LABEL (w), 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
gtk_widget_show (w);
gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
}
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_BOTTOM);
- gtk_scale_set_draw_value (GTK_SCALE (scale), debug_p);
gtk_scale_set_digits (GTK_SCALE (scale), (p->integer_p ? 0 : 2));
set_widget_min_width (GTK_WIDGET (scale), MIN_SLIDER_WIDTH);
+ /* We can't show the value as it is wrong for ratio and inverted
+ sliders. */
+ gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
+
gtk_box_pack_start (GTK_BOX (parent), scale, FALSE, FALSE, 4);
gtk_widget_show (scale);
@@ -963,13 +1002,16 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
GtkWidget *w = gtk_label_new (_((char *) p->high_label));
link_atk_label_to_widget (w, scale);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (w), 0.0);
+ gtk_label_set_yalign (GTK_LABEL (w), 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
gtk_widget_show (w);
gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
}
p->widget = scale;
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (changed_cb), changed_data);
break;
}
case SPINBUTTON:
@@ -986,7 +1028,8 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
GtkWidget *w = gtk_label_new (_(label));
link_atk_label_to_widget (w, spin);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
- gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (w), 1.0);
+ gtk_label_set_yalign (GTK_LABEL (w), 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
gtk_widget_show (w);
parent = insert_fake_hbox (parent);
@@ -997,6 +1040,8 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
gtk_box_pack_start (GTK_BOX (parent), spin, FALSE, FALSE, 4);
p->widget = spin;
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (changed_cb), changed_data);
break;
}
case BOOLEAN:
@@ -1006,26 +1051,37 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
parent = insert_fake_hbox (parent);
*/
gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
+ g_signal_connect (p->widget, "clicked",
+ G_CALLBACK (changed_cb), changed_data);
break;
}
case SELECT:
{
- GtkWidget *opt = gtk_option_menu_new ();
- GtkWidget *menu = gtk_menu_new ();
+ GtkComboBox *cbox = GTK_COMBO_BOX (gtk_combo_box_new());
+ GtkListStore *model = gtk_list_store_new (1, G_TYPE_STRING);
+ GtkCellRenderer *view = gtk_cell_renderer_text_new();
+ GtkTreeIter iter;
GList *opts;
+ g_object_set (G_OBJECT (cbox), "model", model, NULL);
+ g_object_unref (model);
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cbox), view, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (cbox), view,
+ "text", 0, NULL);
+
for (opts = p->options; opts; opts = opts->next)
{
parameter *s = (parameter *) opts->data;
- GtkWidget *i = gtk_menu_item_new_with_label (_((char *) s->label));
- gtk_widget_show (i);
- gtk_menu_append (GTK_MENU (menu), i);
+ const char *name = _((char *) s->label);
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter, 0, name, -1);
}
- gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu);
- p->widget = opt;
+ p->widget = GTK_WIDGET (cbox);
parent = insert_fake_hbox (parent);
gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
+ g_signal_connect (p->widget, "changed",
+ G_CALLBACK (changed_cb), changed_data);
break;
}
@@ -1045,76 +1101,28 @@ make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
}
}
-
-/* File selection.
- Absurdly, there is no GTK file entry widget, only a GNOME one,
- so in order to avoid depending on GNOME in this code, we have
- to do it ourselves.
- */
-
-/* cancel button on GtkFileSelection: user_data unused */
-static void
-file_sel_cancel (GtkWidget *button, gpointer user_data)
-{
- GtkWidget *dialog = button;
- while (GET_PARENT (dialog))
- dialog = GET_PARENT (dialog);
- gtk_widget_destroy (dialog);
-}
-
-/* ok button on GtkFileSelection: user_data is the corresponding GtkEntry */
-static void
-file_sel_ok (GtkWidget *button, gpointer user_data)
-{
- GtkWidget *entry = GTK_WIDGET (user_data);
- GtkWidget *dialog = button;
- const char *path;
-
- while (GET_PARENT (dialog))
- dialog = GET_PARENT (dialog);
- gtk_widget_hide (dialog);
-
- path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog));
- /* apparently one doesn't free `path' */
-
- gtk_entry_set_text (GTK_ENTRY (entry), path);
- gtk_entry_set_position (GTK_ENTRY (entry), strlen (path));
-
- gtk_widget_destroy (dialog);
-}
-
-/* WM close on GtkFileSelection: user_data unused */
-static void
-file_sel_close (GtkWidget *widget, GdkEvent *event, gpointer user_data)
-{
- file_sel_cancel (widget, user_data);
-}
/* "Browse" button: user_data is the corresponding GtkEntry */
static void
browse_button_cb (GtkButton *button, gpointer user_data)
{
- GtkWidget *entry = GTK_WIDGET (user_data);
- const char *text = gtk_entry_get_text (GTK_ENTRY (entry));
- GtkFileSelection *selector =
- GTK_FILE_SELECTION (gtk_file_selection_new (_("Select file.")));
-
- gtk_file_selection_set_filename (selector, text);
- gtk_signal_connect (GTK_OBJECT (selector->ok_button),
- "clicked", GTK_SIGNAL_FUNC (file_sel_ok),
- (gpointer) entry);
- gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
- "clicked", GTK_SIGNAL_FUNC (file_sel_cancel),
- (gpointer) entry);
- gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
- GTK_SIGNAL_FUNC (file_sel_close),
- (gpointer) entry);
-
- gtk_window_set_modal (GTK_WINDOW (selector), TRUE);
- gtk_widget_show (GTK_WIDGET (selector));
+ GtkEntry *entry = GTK_ENTRY (user_data);
+ GtkWindow *win = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button)));
+ const char *ofile = gtk_entry_get_text (entry);
+ char *file = strdup (ofile);
+
+ if (debug_p) fprintf (stderr, "%s: settings browse button\n", blurb());
+ if (file_chooser (win, entry, &file, _("Select file."),
+ debug_p, FALSE, FALSE))
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: file: \"%s\" -> \"%s\n", blurb(), ofile, file);
+ gtk_entry_set_text (entry, file);
+ }
+ free (file);
}
-
+
/* Converting to and from command-lines
*/
@@ -1223,6 +1231,23 @@ format_switch (parameter *p, const char *value)
}
+static void
+pretty_float (char *out, gfloat val)
+{
+ char *s1;
+ sprintf (out, "%.3f", val);
+ s1 = strchr (out, '.');
+ if (s1)
+ {
+ char *s2 = s1 + strlen(s1) - 1;
+ while (s2 > s1 && *s2 == '0') /* lose trailing zeroes */
+ *s2-- = 0;
+ if (s2 >= s1 && *s2 == '.') /* lose trailing decimal */
+ *s2-- = 0;
+ }
+}
+
+
/* Maps a `parameter' to a command-line switch.
Returns 0 if it can't, or if the parameter has the default value.
*/
@@ -1261,11 +1286,19 @@ parameter_to_switch (parameter *p)
? gtk_range_get_adjustment (GTK_RANGE (p->widget))
: gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (p->widget)));
char buf[255];
- char *s1;
- float value = (p->invert_p
- ? invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj),
- GET_ADJ_VALUE(adj)) - 1
- : GET_ADJ_VALUE(adj));
+ float value;
+ switch (p->convert) {
+ case INVERT:
+ value = invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj),
+ GET_ADJ_VALUE(adj)) - 1;
+ break;
+ case RATIO:
+ value = ratio_to_range (p->low, p->high, GET_ADJ_VALUE(adj));
+ break;
+ default:
+ value = GET_ADJ_VALUE(adj);
+ break;
+ }
if (value == p->value) /* same as default */
return 0;
@@ -1273,17 +1306,8 @@ parameter_to_switch (parameter *p)
if (p->integer_p)
sprintf (buf, "%d", (int) (value + (value > 0 ? 0.5 : -0.5)));
else
- sprintf (buf, "%.4f", value);
-
- s1 = strchr (buf, '.');
- if (s1)
- {
- char *s2 = s1 + strlen(s1) - 1;
- while (s2 > s1 && *s2 == '0') /* lose trailing zeroes */
- *s2-- = 0;
- if (s2 >= s1 && *s2 == '.') /* lose trailing decimal */
- *s2-- = 0;
- }
+ pretty_float (buf, value);
+
return format_switch (p, buf);
}
case BOOLEAN:
@@ -1301,21 +1325,19 @@ parameter_to_switch (parameter *p)
case SELECT:
if (!p->widget) return 0;
{
- GtkOptionMenu *opt = GTK_OPTION_MENU (p->widget);
- GtkMenu *menu = GTK_MENU (gtk_option_menu_get_menu (opt));
- GtkWidget *selected = gtk_menu_get_active (menu);
- GList *kids = gtk_container_children (GTK_CONTAINER (menu));
- int menu_elt = g_list_index (kids, (gpointer) selected);
- GList *ol = g_list_nth (p->options, menu_elt);
+ GtkComboBox *cbox = GTK_COMBO_BOX (p->widget);
+ int menu_elt = gtk_combo_box_get_active (cbox);
+ GList *ol = (menu_elt >= 0 ? g_list_nth (p->options, menu_elt) : NULL);
parameter *o = (ol ? (parameter *) ol->data : 0);
const char *s;
- if (!o) abort();
- if (o->type != SELECT_OPTION) abort();
- s = (char *) o->arg_set;
- if (s)
- return strdup (s);
- else
- return 0;
+ if (o)
+ {
+ if (o->type != SELECT_OPTION) abort();
+ s = (char *) o->arg_set;
+ if (s)
+ return strdup (s);
+ }
+ return 0;
}
default:
if (p->widget)
@@ -1454,10 +1476,12 @@ parse_command_line_into_parameters (const char *filename,
if (rest->next) /* pop off the arg to this option */
{
char *s = (char *) rest->next->data;
- /* the next token is the next switch iff it matches "-[a-z]".
+ /* the next token is the next switch if it matches ^-[-a-z]
(To avoid losing on "-x -3.1".)
*/
- if (s && (s[0] != '-' || !isalpha(s[1])))
+ if (! (s &&
+ s[0] == '-' &&
+ (s[1] == '-' || isalpha(s[1]))))
{
value = s;
rest->next->data = 0;
@@ -1479,9 +1503,14 @@ static gboolean
compare_opts (const char *option, const char *value,
const char *template)
{
- int ol = strlen (option);
+ int ol;
char *c;
+ /* -arg and --arg are the same. */
+ if (option[0] == '-' && option[1] == '-') option++;
+ if (template[0] == '-' && template[1] == '-') template++;
+ ol = strlen (option);
+
if (strncmp (option, template, ol))
return FALSE;
@@ -1625,8 +1654,15 @@ parameter_set_switch (parameter *p, gpointer value)
if (1 == sscanf ((char *) value, "%f %c", &f, &c))
{
- if (p->invert_p)
+ switch (p->convert) {
+ case INVERT:
f = invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj), f) - 1;
+ break;
+ case RATIO:
+ f = range_to_ratio (p->low, p->high, f);
+ break;
+ default: break;
+ }
gtk_adjustment_set_value (adj, f);
}
break;
@@ -1639,8 +1675,8 @@ parameter_set_switch (parameter *p, gpointer value)
}
case SELECT:
{
- gtk_option_menu_set_history (GTK_OPTION_MENU (p->widget),
- GPOINTER_TO_INT(value));
+ GtkComboBox *cbox = GTK_COMBO_BOX (p->widget);
+ gtk_combo_box_set_active (cbox, GPOINTER_TO_INT(value));
break;
}
default:
@@ -1666,18 +1702,33 @@ restore_defaults (const char *progname, GList *parms)
break;
}
case SLIDER:
- case SPINBUTTON:
{
GtkAdjustment *adj =
(p->type == SLIDER
? gtk_range_get_adjustment (GTK_RANGE (p->widget))
: gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (p->widget)));
- float value = (p->invert_p
- ? invert_range (p->low, p->high, p->value)
- : p->value);
+ gfloat value;
+ switch (p->convert) {
+ case INVERT:
+ value = invert_range (p->low, p->high, p->value);
+ break;
+ case RATIO:
+ value = range_to_ratio (p->low, p->high, p->value);
+ break;
+ default:
+ value = p->value;
+ break;
+ }
gtk_adjustment_set_value (adj, value);
break;
}
+ case SPINBUTTON:
+ {
+ GtkAdjustment *adj =
+ gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (p->widget));
+ gtk_adjustment_set_value (adj, p->value);
+ break;
+ }
case BOOLEAN:
{
/* A toggle button should be on by default if it inserts
@@ -1690,7 +1741,7 @@ restore_defaults (const char *progname, GList *parms)
}
case SELECT:
{
- GtkOptionMenu *opt = GTK_OPTION_MENU (p->widget);
+ GtkComboBox *cbox = GTK_COMBO_BOX (p->widget);
GList *opts;
int selected = 0;
int index;
@@ -1708,7 +1759,7 @@ restore_defaults (const char *progname, GList *parms)
}
}
- gtk_option_menu_set_history (GTK_OPTION_MENU (opt), selected);
+ gtk_combo_box_set_active (cbox, selected);
break;
}
default:
@@ -1718,7 +1769,7 @@ restore_defaults (const char *progname, GList *parms)
}
-
+
/* Documentation strings
*/
@@ -1796,15 +1847,49 @@ get_description (GList *parms, gboolean verbose_p)
}
}
-
+static int
+get_year (const char *desc)
+{
+ /* Find the last 4-digit year-like number on the last line of the string. */
+ const char *s = strrchr (desc, '\n');
+ int year = 0;
+ if (!s) return 0;
+ while (*s)
+ {
+ if ((s[0] == ' ' || s[0] == '\t' || s[0] == '\r' || s[0] == '\n' ||
+ s[0] == '-' || s[0] == '.') &&
+ s[1] >= '0' && s[1] <= '9' &&
+ s[2] >= '0' && s[2] <= '9' &&
+ s[3] >= '0' && s[3] <= '9' &&
+ s[4] >= '0' && s[4] <= '9' &&
+ (s[5] == ' ' || s[5] == '\t' || s[5] == '\r' || s[5] == '\n' ||
+ s[5] == '-' || s[5] == '.'))
+ {
+ int n = (((s[1]-'0') * 1000) +
+ ((s[2]-'0') * 100) +
+ ((s[3]-'0') * 10) +
+ ((s[4]-'0') * 1));
+ if (n > 1970 && n < 2100)
+ year = n;
+ s += 4;
+ }
+ s++;
+ }
+ return year;
+}
+
+
+
/* External interface.
*/
static conf_data *
load_configurator_1 (const char *program, const char *arguments,
+ void (*changed_cb) (GtkWidget *, gpointer),
+ gpointer changed_data,
gboolean verbose_p)
{
- const char *dir = hack_configuration_path;
+ const char *dir = HACK_CONFIGURATION_PATH;
char *base_program;
int L = strlen (dir);
char *file;
@@ -1865,10 +1950,11 @@ load_configurator_1 (const char *program, const char *arguments,
/* Parsed the XML file. Now make some widgets. */
- vbox0 = gtk_vbox_new (FALSE, 0);
+ vbox0 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_show (vbox0);
- parms = make_parameters (file, doc->xmlRootNode, vbox0);
+ parms = make_parameters (file, doc->xmlRootNode, vbox0,
+ changed_cb, changed_data);
sanity_check_parameters (file, parms);
xmlFreeDoc (doc);
@@ -1880,6 +1966,7 @@ load_configurator_1 (const char *program, const char *arguments,
data->widget = vbox0;
data->parameters = parms;
data->description = get_description (parms, verbose_p);
+ data->year = get_year (data->description);
}
else
{
@@ -1939,14 +2026,17 @@ split_command_line (const char *full_command_line,
conf_data *
-load_configurator (const char *full_command_line, gboolean verbose_p)
+load_configurator (const char *full_command_line,
+ void (*changed_cb) (GtkWidget *, gpointer),
+ gpointer changed_data,
+ gboolean verbose_p)
{
char *prog;
char *args;
conf_data *cd;
debug_p = verbose_p;
split_command_line (full_command_line, &prog, &args);
- cd = load_configurator_1 (prog, args, verbose_p);
+ cd = load_configurator_1 (prog, args, changed_cb, changed_data, verbose_p);
free (prog);
free (args);
return cd;
@@ -2009,4 +2099,4 @@ free_conf_data (conf_data *data)
}
-#endif /* HAVE_GTK && HAVE_XML -- whole file */
+#endif /* HAVE_GTK -- whole file */
diff --git a/driver/demo-Gtk-conf.h b/driver/demo-Gtk-conf.h
index f462152..ad94ee3 100644
--- a/driver/demo-Gtk-conf.h
+++ b/driver/demo-Gtk-conf.h
@@ -1,5 +1,5 @@
/* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2001-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -19,13 +19,61 @@ typedef struct {
char *progname;
char *progclass;
char *description;
+ int year;
} conf_data;
-extern conf_data *load_configurator (const char *cmd_line, gboolean verbose_p);
+/* Referenced by demo-Gtk.c; defined in demo-Gtk-conf.c.
+ */
+extern conf_data *load_configurator (const char *cmd_line,
+ void (*changed_cb) (GtkWidget *, gpointer),
+ gpointer changed_data,
+ gboolean verbose_p);
extern char *get_configurator_command_line (conf_data *, gboolean default_p);
extern void set_configurator_command_line (conf_data *, const char *cmd_line);
extern void free_conf_data (conf_data *);
-extern const char *hack_configuration_path;
+/* Referenced from demo.ui and prefs.ui; defined in demo-Gtk.c.
+ */
+extern void quit_menu_cb (GtkAction *, gpointer user_data);
+extern void about_menu_cb (GtkAction *, gpointer user_data);
+extern void doc_menu_cb (GtkAction *, gpointer user_data);
+extern void file_menu_cb (GtkAction *, gpointer user_data);
+extern void activate_menu_cb (GtkAction *, gpointer user_data);
+extern void lock_menu_cb (GtkAction *, gpointer user_data);
+extern void kill_menu_cb (GtkAction *, gpointer user_data);
+extern void restart_menu_cb (GtkWidget *, gpointer user_data);
+extern void run_this_cb (GtkButton *, gpointer user_data);
+extern void manual_cb (GtkButton *, gpointer user_data);
+extern void run_next_cb (GtkButton *, gpointer user_data);
+extern void run_prev_cb (GtkButton *, gpointer user_data);
+extern gboolean pref_changed_cb (GtkWidget *, gpointer user_data);
+extern gboolean pref_changed_event_cb (GtkWidget *, GdkEvent *, gpointer data);
+extern gboolean dpms_sanity_cb (GtkWidget *, gpointer user_data);
+extern gboolean dpms_sanity_event_cb (GtkWidget *, GdkEvent *, gpointer data);
+extern gboolean image_text_pref_changed_event_cb (GtkWidget *, GdkEvent *,
+ gpointer user_data);
+extern void mode_menu_item_cb (GtkWidget *, gpointer user_data);
+extern void switch_page_cb (GtkNotebook *, GtkWidget *,
+ gint page_num, gpointer user_data);
+extern void browse_image_dir_cb (GtkButton *, gpointer user_data);
+extern void browse_text_file_cb (GtkButton *, gpointer user_data);
+extern void browse_text_program_cb (GtkButton *, gpointer user_data);
+extern void settings_cb (GtkButton *, gpointer user_data);
+extern void settings_adv_cb (GtkButton *, gpointer user_data);
+extern void settings_std_cb (GtkButton *, gpointer user_data);
+extern void settings_reset_cb (GtkButton *, gpointer user_data);
+extern void settings_switch_page_cb (GtkNotebook *, GtkWidget *,
+ gint page_num, gpointer user_data);
+extern void settings_cancel_cb (GtkWidget *, gpointer user_data);
+extern void settings_ok_cb (GtkWidget *, gpointer user_data);
+extern void preview_theme_cb (GtkWidget *, gpointer user_data);
+
+/* Referenced by demo-Gtk-conf.c; defined in demo-Gtk.c.
+ */
+extern void warning_dialog (GtkWindow *, const char *title, const char *msg);
+extern gboolean file_chooser (GtkWindow *, GtkEntry *, char **retP,
+ const char *title,
+ gboolean verbose_p,
+ gboolean dir_p, gboolean program_p);
#endif /* _DEMO_GTK_CONF_H_ */
diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c
index b5e82e2..4950369 100644
--- a/driver/demo-Gtk.c
+++ b/driver/demo-Gtk.c
@@ -1,5 +1,5 @@
/* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2024 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -16,23 +16,6 @@
#ifdef HAVE_GTK /* whole file */
-#include "blurb.h"
-
-#include <xscreensaver-intl.h>
-
-#include <stdlib.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-# ifdef __GNUC__
-# define STFU __extension__ /* ignore gcc -pendantic warnings in next sexp */
-# else
-# define STFU /* */
-# endif
-
-
#ifdef ENABLE_NLS
# include <locale.h>
#endif /* ENABLE_NLS */
@@ -42,32 +25,22 @@
#endif /* HAVE_UNAME */
#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <ctype.h>
#include <time.h>
#include <pwd.h> /* for getpwuid() */
#include <sys/stat.h>
#include <sys/time.h>
-
#include <signal.h>
#include <errno.h>
#ifdef HAVE_SYS_WAIT_H
# include <sys/wait.h> /* for waitpid() and associated macros */
#endif
-
-#include <X11/Xproto.h> /* for CARD32 */
#include <X11/Xatom.h> /* for XA_INTEGER */
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-
-/* We don't actually use any widget internals, but these are included
- so that gdb will have debug info for the widgets... */
-#include <X11/IntrinsicP.h>
-#include <X11/ShellP.h>
-
-#ifdef HAVE_XINERAMA
-# include <X11/extensions/Xinerama.h>
-#endif /* HAVE_XINERAMA */
+#include <X11/Shell.h>
#if (__GNUC__ >= 4) /* Ignore useless warnings generated by gtk.h */
# undef inline
@@ -76,130 +49,78 @@
# pragma GCC diagnostic ignored "-Wlong-long"
# pragma GCC diagnostic ignored "-Wvariadic-macros"
# pragma GCC diagnostic ignored "-Wpedantic"
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#include <gtk/gtk.h>
-
-#ifdef HAVE_CRAPPLET
-# include <gnome.h>
-# include <capplet-widget.h>
-#endif
-
-#include <gdk/gdkx.h>
-
-#ifdef HAVE_GTK2
-# include <gmodule.h>
-#else /* !HAVE_GTK2 */
-# define G_MODULE_EXPORT /**/
-#endif /* !HAVE_GTK2 */
-
-#ifndef HAVE_XML
- /* Kludge: this is defined in demo-Gtk-conf.c when HAVE_XML.
- It is unused otherwise, so in that case, stub it out. */
- static const char *hack_configuration_path = 0;
-#endif
+#include <gdk/gdkx.h> /* For gdk_x11_get_default_xdisplay(), etc. */
#if (__GNUC__ >= 4)
# pragma GCC diagnostic pop
#endif
-
+#include "blurb.h"
+#include "xscreensaver-intl.h"
#include "version.h"
#include "types.h"
#include "resources.h" /* for parse_time() */
#include "remote.h" /* for xscreensaver_command() */
+#include "screens.h"
#include "visual.h"
#include "atoms.h"
#include "usleep.h"
+#include "atoms.h"
+#include "screenshot.h"
#include "xmu.h"
-#include "logo-50.xpm"
-#include "logo-180.xpm"
-
#include "demo-Gtk-conf.h"
-#include "atoms.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef HAVE_GTK2
-enum {
- COL_ENABLED,
- COL_NAME,
- COL_LAST
-};
-#endif /* HAVE_GTK2 */
-/* Deal with deprecation of direct access to struct fields on the way to GTK3
- See http://live.gnome.org/GnomeGoals/UseGseal
- */
-#if GTK_CHECK_VERSION(2,14,0)
-# define GET_PARENT(w) gtk_widget_get_parent (w)
-# define GET_WINDOW(w) gtk_widget_get_window (w)
-# define GET_ACTION_AREA(d) gtk_dialog_get_action_area (d)
-# define GET_CONTENT_AREA(d) gtk_dialog_get_content_area (d)
-# define GET_ADJ_VALUE(a) gtk_adjustment_get_value (a)
-# define SET_ADJ_VALUE(a,v) gtk_adjustment_set_value (a, v)
-# define SET_ADJ_UPPER(a,v) gtk_adjustment_set_upper (a, v)
-#else
-# define GET_PARENT(w) ((w)->parent)
-# define GET_WINDOW(w) ((w)->window)
-# define GET_ACTION_AREA(d) ((d)->action_area)
-# define GET_CONTENT_AREA(d) ((d)->vbox)
-# define GET_ADJ_VALUE(a) ((a)->value)
-# define SET_ADJ_VALUE(a,v) (a)->value = v
-# define SET_ADJ_UPPER(a,v) (a)->upper = v
-#endif
-
-#if GTK_CHECK_VERSION(2,18,0)
-# define SET_CAN_DEFAULT(w) gtk_widget_set_can_default ((w), TRUE)
-# define GET_SENSITIVE(w) gtk_widget_get_sensitive (w)
-#else
-# define SET_CAN_DEFAULT(w) GTK_WIDGET_SET_FLAGS ((w), GTK_CAN_DEFAULT)
-# define GET_SENSITIVE(w) GTK_WIDGET_IS_SENSITIVE (w)
-#endif
-
-#if GTK_CHECK_VERSION(2,20,0)
-# define GET_REALIZED(w) gtk_widget_get_realized (w)
-#else
-# define GET_REALIZED(w) GTK_WIDGET_REALIZED (w)
-#endif
/* from exec.c */
extern void exec_command (const char *shell, const char *command, int nice);
extern int on_path_p (const char *program);
-static void hack_subproc_environment (Window preview_window_id, Bool debug_p);
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
+const char *progclass = "XScreenSaver";
-char *progclass = "XScreenSaver";
-XrmDatabase db;
+#ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the
+ length ISO C89 compilers are required to support". */
+#endif
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
/* The order of the items in the mode menu. */
static int mode_menu_order[] = {
DONT_BLANK, BLANK_ONLY, ONE_HACK, RANDOM_HACKS, RANDOM_HACKS_SAME };
+enum { COL_ENABLED, COL_NAME, COL_LAST };
+typedef enum { D_NONE, D_LAUNCH, D_GNOME, D_KDE } dialog_button;
typedef struct {
char *short_version; /* version number of this xscreensaver build */
- GtkWidget *toplevel_widget; /* the main window */
- GtkWidget *base_widget; /* root of our hierarchy (for name lookups) */
- GtkWidget *popup_widget; /* the "Settings" dialog */
- conf_data *cdata; /* private data for per-hack configuration */
+ GtkWindow *window;
+ GtkWindow *dialog;
+
+ Display *dpy;
+ Bool wayland_p;
+ Pixmap screenshot;
+ Visual *gl_visual;
-#ifdef HAVE_GTK2
- GtkBuilder *gtk_ui; /* UI file */
-#endif /* HAVE_GTK2 */
+ conf_data *cdata; /* private data for per-hack configuration */
Bool debug_p; /* whether to print diagnostics */
Bool initializing_p; /* flag for breaking recursion loops */
+ Bool flushing_p; /* flag for breaking recursion loops */
Bool saving_p; /* flag for breaking recursion loops */
+ Bool dpms_supported_p; /* Whether XDPMS is available */
char *desired_preview_cmd; /* subprocess we intend to run */
char *running_preview_cmd; /* subprocess we are currently running */
@@ -222,16 +143,149 @@ typedef struct {
int _selected_list_element; /* don't use this: call
selected_list_element() instead */
- int nscreens; /* How many X or Xinerama screens there are */
+ Bool multi_screen_p; /* Is there more than one monitor */
saver_preferences prefs;
} state;
-/* Total fucking evilness due to the fact that it's rocket science to get
- a closure object of our own down into the various widget callbacks. */
-static state *global_state_kludge;
+/* Class definitions for the application and two windows. The classes are:
+
+ XScreenSaverApp -- The invisible GtkApplication main-loop framework.
+ XScreenSaverWindow -- The main window with the scrolling list of hacks.
+ XScreenSaverDialog -- The per-hack settings window.
+ */
+#define XSCREENSAVER_APP_TYPE (xscreensaver_app_get_type())
+G_DECLARE_FINAL_TYPE (XScreenSaverApp, xscreensaver_app, XSCREENSAVER, APP,
+ GtkApplication)
+
+struct _XScreenSaverApp {
+ GtkApplication parent;
+ Bool cmdline_debug_p;
+};
+
+
+G_DEFINE_TYPE (XScreenSaverApp, xscreensaver_app, GTK_TYPE_APPLICATION)
+
+/* The widgets we reference from the demo.ui file.
+ */
+#define ALL_WINDOW_WIDGETS \
+ W(activate_menuitem) \
+ W(lock_menuitem) \
+ W(kill_menuitem) \
+ W(restart_menuitem) \
+ W(list) \
+ W(scroller) \
+ W(preview_frame) \
+ W(short_preview_label) \
+ W(preview_author_label) \
+ W(timeout_spinbutton) \
+ W(cycle_spinbutton) \
+ W(lock_spinbutton) \
+ W(dpms_standby_spinbutton) \
+ W(dpms_suspend_spinbutton) \
+ W(dpms_off_spinbutton) \
+ W(fade_spinbutton) \
+ W(lock_button) \
+ W(dpms_button) \
+ W(dpms_quickoff_button) \
+ W(grab_desk_button) \
+ W(grab_video_button) \
+ W(grab_image_button) \
+ W(fade_button) \
+ W(unfade_button) \
+ W(preview) \
+ W(preview_notebook) \
+ W(text_radio) \
+ W(text_file_radio) \
+ W(text_file_browse) \
+ W(text_program_radio) \
+ W(text_url_radio) \
+ W(text_host_radio) \
+ W(image_text) \
+ W(image_browse_button) \
+ W(text_entry) \
+ W(text_file_entry) \
+ W(text_program_entry) \
+ W(text_url_entry) \
+ W(text_program_browse) \
+ W(theme_menu) \
+ W(mode_menu) \
+ W(next_prev_hbox) \
+ W(blanking_table) \
+ W(lock_mlabel) \
+ W(dpms_frame) \
+ W(dpms_standby_label) \
+ W(dpms_standby_mlabel) \
+ W(dpms_suspend_label) \
+ W(dpms_suspend_mlabel) \
+ W(dpms_off_label) \
+ W(dpms_off_mlabel) \
+ W(fade_label) \
+ W(demo) \
+ W(settings) \
+
+/* The widgets we reference from the prefs.ui file.
+ */
+#define ALL_DIALOG_WIDGETS \
+ W(opt_notebook) \
+ W(doc) \
+ W(settings_vbox) \
+ W(cmd_text) \
+ W(opt_frame) \
+ W(dialog_vbox) \
+ W(adv_button) \
+ W(std_button) \
+ W(cmd_label) \
+ W(manual) \
+ W(visual) \
+ W(visual_combo) \
+ W(reset_button) \
+ W(ok_button) \
+
+#define XSCREENSAVER_WINDOW_TYPE (xscreensaver_window_get_type())
+G_DECLARE_FINAL_TYPE (XScreenSaverWindow, xscreensaver_window,
+ XSCREENSAVER, WINDOW, GtkApplicationWindow)
+
+struct _XScreenSaverWindow {
+ GtkApplicationWindow parent;
+ state state;
+
+ GtkWidget
+# undef W
+# define W(NAME) * NAME,
+ ALL_WINDOW_WIDGETS
+ *_dummy;
+# undef W
+};
+
+G_DEFINE_TYPE (XScreenSaverWindow, xscreensaver_window,
+ GTK_TYPE_APPLICATION_WINDOW)
+
+
+#define XSCREENSAVER_DIALOG_TYPE (xscreensaver_dialog_get_type())
+G_DECLARE_FINAL_TYPE (XScreenSaverDialog, xscreensaver_dialog,
+ XSCREENSAVER, DIALOG, GtkDialog)
+
+struct _XScreenSaverDialog {
+ GtkApplicationWindow parent;
+ XScreenSaverWindow *main;
+ char *unedited_cmdline; /* Current hack command line before saving */
+
+ GtkWidget
+# undef W
+# define W(NAME) * NAME,
+ ALL_DIALOG_WIDGETS
+ *_dummy;
+# undef W
+};
+
+G_DEFINE_TYPE (XScreenSaverDialog, xscreensaver_dialog,
+ GTK_TYPE_DIALOG)
+
+
+static void hack_subproc_environment (Window preview_window_id, Bool debug_p);
static void populate_demo_window (state *, int list_elt);
static void populate_prefs_page (state *);
@@ -239,418 +293,379 @@ static void populate_popup_window (state *);
static Bool flush_dialog_changes_and_save (state *);
static Bool flush_popup_changes_and_save (state *);
+static Bool validate_image_directory (state *, const char *path);
static int maybe_reload_init_file (state *);
static void await_xscreensaver (state *);
static Bool xscreensaver_running_p (state *);
static void sensitize_menu_items (state *s, Bool force_p);
-static void force_dialog_repaint (state *s);
static void schedule_preview (state *, const char *cmd);
static void kill_preview_subproc (state *, Bool reset_p);
static void schedule_preview_check (state *);
+static void sensitize_demo_widgets (state *, Bool sensitive_p);
+static void kill_gnome_screensaver (state *);
+static void kill_kde_screensaver (state *);
-
-/* Prototypes of functions used by the Gtk-generated code, to avoid warnings.
- */
-void exit_menu_cb (GtkAction *, gpointer user_data);
-void about_menu_cb (GtkAction *, gpointer user_data);
-void doc_menu_cb (GtkAction *, gpointer user_data);
-void file_menu_cb (GtkAction *, gpointer user_data);
-void activate_menu_cb (GtkAction *, gpointer user_data);
-void lock_menu_cb (GtkAction *, gpointer user_data);
-void kill_menu_cb (GtkAction *, gpointer user_data);
-void restart_menu_cb (GtkWidget *, gpointer user_data);
-void run_this_cb (GtkButton *, gpointer user_data);
-void manual_cb (GtkButton *, gpointer user_data);
-void run_next_cb (GtkButton *, gpointer user_data);
-void run_prev_cb (GtkButton *, gpointer user_data);
-void pref_changed_cb (GtkWidget *, gpointer user_data);
-gboolean pref_changed_event_cb (GtkWidget *, GdkEvent *, gpointer user_data);
-void mode_menu_item_cb (GtkWidget *, gpointer user_data);
-void switch_page_cb (GtkNotebook *, GtkNotebookPage *,
- gint page_num, gpointer user_data);
-void browse_image_dir_cb (GtkButton *, gpointer user_data);
-void browse_text_file_cb (GtkButton *, gpointer user_data);
-void browse_text_program_cb (GtkButton *, gpointer user_data);
-void settings_cb (GtkButton *, gpointer user_data);
-void settings_adv_cb (GtkButton *, gpointer user_data);
-void settings_std_cb (GtkButton *, gpointer user_data);
-void settings_reset_cb (GtkButton *, gpointer user_data);
-void settings_switch_page_cb (GtkNotebook *, GtkNotebookPage *,
- gint page_num, gpointer user_data);
-void settings_cancel_cb (GtkButton *, gpointer user_data);
-void settings_ok_cb (GtkButton *, gpointer user_data);
-void preview_theme_cb (GtkWidget *, gpointer user_data);
-
-static void kill_gnome_screensaver (void);
-static void kill_kde_screensaver (void);
+/* Some pathname utilities */
-/* Some random utility functions
+/* Removed redundant . and .. components from the pathname.
+ Strip leading and trailing spaces.
+ Make it have a trailing slash if it should be a directory.
*/
-
-static GtkWidget *
-name_to_widget (state *s, const char *name)
+static char *
+normalize_pathname (const char *path, gboolean dir_p)
{
- GtkWidget *w;
- if (!s) abort();
- if (!name) abort();
- if (!*name) abort();
+ int L;
+ char *p2, *s;
+ if (!path) return 0;
+ if (!*path) return strdup ("");
-#ifdef HAVE_GTK2
- if (!s->gtk_ui)
- {
- /* First try to load the UI file from the current directory;
- if there isn't one there, check the installed directory.
- */
-# define UI_FILE "xscreensaver.ui"
- const char * const files[] = { UI_FILE,
- DEFAULT_ICONDIR "/" UI_FILE };
- int i;
+ /* Strip leading spaces */
+ while (isspace (*path)) path++;
- s->gtk_ui = gtk_builder_new ();
+ L = strlen (path);
+ p2 = (char *) malloc (L + 3);
+ strcpy (p2, path);
- for (i = 0; i < countof (files); i++)
+ /* Strip trailing spaces and slashes */
+ while (L > 0 && (isspace (p2[L-1]) || p2[L-1] == '/'))
+ p2[--L] = 0;
+
+ for (s = p2; s && *s; s++)
+ {
+ if (*s == '/' &&
+ (!strncmp (s, "/../", 4) || /* delete "XYZ/../" */
+ !strncmp (s, "/..\000", 4))) /* delete "XYZ/..$" */
{
- struct stat st;
- if (!stat (files[i], &st))
+ char *s0 = s;
+ while (s0 > p2 && s0[-1] != '/')
+ s0--;
+ if (s0 > p2)
{
- GError* error = NULL;
-
- if (gtk_builder_add_from_file (s->gtk_ui, files[i], &error))
- break;
- else
- {
- g_warning ("Couldn't load builder file %s: %s",
- files[i], error->message);
- g_error_free (error);
- }
+ s0--;
+ s += 3;
+ /* strcpy (s0, s); */
+ memmove(s0, s, strlen(s) + 1);
+ s = s0-1;
}
}
- if (i >= countof (files))
- {
- fprintf (stderr,
- "%s: could not load \"" UI_FILE "\"\n"
- "\tfrom " DEFAULT_ICONDIR "/ or current directory.\n",
- blurb());
- exit (-1);
- }
-# undef UI_FILE
-
- gtk_builder_connect_signals (s->gtk_ui, NULL);
+ else if (*s == '/' && !strncmp (s, "/./", 3)) { /* delete "/./" */
+ /* strcpy (s, s+2), s--; */
+ memmove(s, s+2, strlen(s+2) + 1);
+ s--;
+ }
+ else if (*s == '/' && !strncmp (s, "/.\000", 3)) /* delete "/.$" */
+ *s = 0, s--;
}
- w = GTK_WIDGET (gtk_builder_get_object (s->gtk_ui, name));
-
-#else /* !HAVE_GTK2 */
-
- w = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (s->base_widget),
- name);
- if (w) return w;
- w = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (s->popup_widget),
- name);
-#endif /* HAVE_GTK2 */
- if (w) return w;
-
- fprintf (stderr, "%s: no widget \"%s\" (wrong UI file?)\n",
- blurb(), name);
- abort();
-}
-
-
-/* Why this behavior isn't automatic in *either* toolkit, I'll never know.
- Takes a scroller, viewport, or list as an argument.
- */
-static void
-ensure_selected_item_visible (GtkWidget *widget)
-{
-#ifdef HAVE_GTK2
- GtkTreePath *path;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
- if (!gtk_tree_selection_get_selected (selection, &model, &iter))
- path = gtk_tree_path_new_first ();
- else
- path = gtk_tree_model_get_path (model, &iter);
-
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget), path, NULL, FALSE);
-
- gtk_tree_path_free (path);
+ /*
+ Normalize consecutive slashes.
+ Ignore doubled slashes after ":" to avoid mangling URLs.
+ */
-#else /* !HAVE_GTK2 */
+ for (s = p2; s && *s; s++){
+ if (*s == ':') continue;
+ if (!s[1] || !s[2]) continue;
+ while (s[1] == '/' && s[2] == '/')
+ /* strcpy (s+1, s+2); */
+ memmove (s+1, s+2, strlen(s+2) + 1);
+ }
- GtkScrolledWindow *scroller = 0;
- GtkViewport *vp = 0;
- GtkList *list_widget = 0;
- GList *slist;
- GList *kids;
- int nkids = 0;
- GtkWidget *selected = 0;
- int list_elt = -1;
- GtkAdjustment *adj;
- gint parent_h, child_y, child_h, children_h, ignore;
- double ratio_t, ratio_b;
+ /* and strip trailing whitespace for good measure. */
+ L = strlen(p2);
+ while (isspace(p2[L-1]))
+ p2[--L] = 0;
- if (GTK_IS_SCROLLED_WINDOW (widget))
- {
- scroller = GTK_SCROLLED_WINDOW (widget);
- vp = GTK_VIEWPORT (GTK_BIN (scroller)->child);
- list_widget = GTK_LIST (GTK_BIN(vp)->child);
- }
- else if (GTK_IS_VIEWPORT (widget))
- {
- vp = GTK_VIEWPORT (widget);
- scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
- list_widget = GTK_LIST (GTK_BIN(vp)->child);
- }
- else if (GTK_IS_LIST (widget))
+ if (dir_p)
{
- list_widget = GTK_LIST (widget);
- vp = GTK_VIEWPORT (GTK_WIDGET (list_widget)->parent);
- scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
+ p2[L++] = '/'; /* Add trailing slash */
+ p2[L] = 0;
}
- else
- abort();
-
- slist = list_widget->selection;
- selected = (slist ? GTK_WIDGET (slist->data) : 0);
- if (!selected)
- return;
- list_elt = gtk_list_child_position (list_widget, GTK_WIDGET (selected));
+ return p2;
+}
- for (kids = gtk_container_children (GTK_CONTAINER (list_widget));
- kids; kids = kids->next)
- nkids++;
- adj = gtk_scrolled_window_get_vadjustment (scroller);
-
- gdk_window_get_geometry (GET_WINDOW (GTK_WIDGET (vp)),
- &ignore, &ignore, &ignore, &parent_h, &ignore);
- gdk_window_get_geometry (GET_WINDOW (GTK_WIDGET (selected)),
- &ignore, &child_y, &ignore, &child_h, &ignore);
- children_h = nkids * child_h;
+/* Expand or un-expand ~/ to $HOME in a pathname, as requested.
+ Strip leading and trailing spaces.
+ Make it have a trailing slash if it should be a directory.
+ */
+static char *
+pathname_tilde (const char *p, gboolean add_p, gboolean dir_p)
+{
+ char *p2;
+ if (!p) return 0;
- ratio_t = ((double) child_y) / ((double) children_h);
- ratio_b = ((double) child_y + child_h) / ((double) children_h);
+ if (dir_p &&
+ (!strncasecmp (p, "http://", 7) ||
+ !strncasecmp (p, "https://", 8)))
+ dir_p = FALSE;
- if (adj->upper == 0.0) /* no items in list */
- return;
+ p2 = normalize_pathname (p, dir_p);
+ p = p2;
- if (ratio_t < (adj->value / adj->upper) ||
- ratio_b > ((adj->value + adj->page_size) / adj->upper))
+ if (add_p)
{
- double target;
- int slop = parent_h * 0.75; /* how much to overshoot by */
-
- if (ratio_t < (adj->value / adj->upper))
+ const char *home = getenv("HOME");
+ int L = strlen(home);
+ if (!strncmp (home, p, L) && p[L] == '/')
{
- double ratio_w = ((double) parent_h) / ((double) children_h);
- double ratio_l = (ratio_b - ratio_t);
- target = ((ratio_t - ratio_w + ratio_l) * adj->upper);
- target += slop;
+ char *p3 = (char *) malloc (strlen (p) + 4);
+ strcpy (p3, "~");
+ strcat (p3, p + L);
+ free (p2);
+ p2 = p3;
}
- else /* if (ratio_b > ((adj->value + adj->page_size) / adj->upper))*/
- {
- target = ratio_t * adj->upper;
- target -= slop;
- }
-
- if (target > adj->upper - adj->page_size)
- target = adj->upper - adj->page_size;
- if (target < 0)
- target = 0;
-
- gtk_adjustment_set_value (adj, target);
}
-#endif /* !HAVE_GTK2 */
-}
+ else if (!strncmp (p, "~/", 2))
+ {
+ const char *home = getenv("HOME");
+ char *p3 = (char *) malloc (strlen (p) + strlen (home) + 4);
+ strcpy (p3, home);
+ strcat (p3, p + 1);
+ free (p2);
+ p2 = p3;
+ }
-static void
-warning_dialog_dismiss_cb (GtkWidget *widget, gpointer user_data)
-{
- GtkWidget *shell = GTK_WIDGET (user_data);
- while (GET_PARENT (shell))
- shell = GET_PARENT (shell);
- gtk_widget_destroy (GTK_WIDGET (shell));
+ return p2;
}
-void restart_menu_cb (GtkWidget *widget, gpointer user_data);
-
-static void warning_dialog_restart_cb (GtkWidget *widget, gpointer user_data)
+/* Is the path a directory that exists? */
+static gboolean
+directory_p (const char *path)
{
- restart_menu_cb (widget, user_data);
- warning_dialog_dismiss_cb (widget, user_data);
-}
+ char *p2 = pathname_tilde (path, FALSE, FALSE); /* no slash on dir */
+ struct stat st;
+ gboolean ok = FALSE;
-static void warning_dialog_killg_cb (GtkWidget *widget, gpointer user_data)
-{
- kill_gnome_screensaver ();
- warning_dialog_dismiss_cb (widget, user_data);
+ if (!p2 || !*p2)
+ ok = FALSE;
+ else if (stat (p2, &st))
+ ok = FALSE;
+ else if (!S_ISDIR (st.st_mode))
+ ok = FALSE;
+ else
+ ok = TRUE;
+ free (p2);
+ return ok;
}
-static void warning_dialog_killk_cb (GtkWidget *widget, gpointer user_data)
+
+/* Is the path a file (not directory) that exists? */
+static gboolean
+file_p (const char *path)
{
- kill_kde_screensaver ();
- warning_dialog_dismiss_cb (widget, user_data);
+ char *p2 = pathname_tilde (path, FALSE, FALSE);
+ struct stat st;
+ gboolean ok = FALSE;
+ if (!p2 || !*p2)
+ ok = FALSE;
+ else if (stat (p2, &st))
+ ok = FALSE;
+ else if (S_ISDIR (st.st_mode))
+ ok = FALSE;
+ else
+ ok = TRUE;
+ free (p2);
+ return ok;
}
-typedef enum { D_NONE, D_LAUNCH, D_GNOME, D_KDE } dialog_button;
+
+/* See if the directory has at least one image file under it.
+ Recurses to at most the given depth, chasing symlinks.
+ To do this properly would mean running "xscreensaver-getimage-file"
+ and seeing if it found anything, but that might take a long time to
+ build the cache the first time, so this is close enough.
+ */
static Bool
-warning_dialog (GtkWidget *parent, const char *message,
- dialog_button button_type, int center)
+image_files_p (const char *path, int max_depth)
{
- char *msg = strdup (message);
- char *head;
+ const char * const exts[] = {
+ "jpg", "jpeg", "pjpeg", "pjpg", "png", "gif",
+ "tif", "tiff", "xbm", "xpm", "svg",
+ };
+ struct dirent *de;
+ Bool ok = FALSE;
+ char *p2 = pathname_tilde (path, FALSE, FALSE); /* no slash on dir */
+ DIR *dir = opendir (p2);
+ if (!dir) goto DONE;
+
+ while (!ok && (de = readdir (dir)))
+ {
+ struct stat st;
+ const char *f = de->d_name;
+ char *f2;
+ if (*f == '.') continue;
- GtkWidget *dialog = gtk_dialog_new ();
- GtkWidget *label = 0;
- GtkWidget *ok = 0;
- GtkWidget *cancel = 0;
- int i = 0;
+ f2 = (char *) malloc (strlen(p2) + strlen(f) + 10);
+ strcpy (f2, p2);
+ strcat (f2, "/");
+ strcat (f2, f);
- while (parent && !GET_WINDOW (parent))
- parent = GET_PARENT (parent);
+ if (!stat (f2, &st))
+ {
+ if (S_ISDIR (st.st_mode))
+ {
+ if (max_depth > 0 && image_files_p (f2, max_depth - 1))
+ ok = TRUE;
+ }
+ else
+ {
+ int i;
+ const char *ext = strrchr (f, '.');
+ if (ext)
+ for (i = 0; i < countof(exts); i++)
+ if (!strcasecmp (ext+1, exts[i]))
+ {
+ /* fprintf (stderr, "%s: found %s\n", blurb(), f2); */
+ ok = TRUE;
+ break;
+ }
+ }
+ }
- if (!parent ||
- !GET_WINDOW (parent)) /* too early to pop up transient dialogs */
- {
- fprintf (stderr,
- "%s: too early for warning dialog?"
- "\n\n\t%s\n\n",
- progname, message);
- free(msg);
- return False;
+ free (f2);
}
- head = msg;
- while (head)
- {
- char name[20];
- char *s = strchr (head, '\n');
- if (s) *s = 0;
+ closedir (dir);
+ DONE:
+ free (p2);
+ return ok;
+}
- sprintf (name, "label%d", i++);
- {
- label = gtk_label_new (head);
-#ifdef HAVE_GTK2
- gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-#endif /* HAVE_GTK2 */
+/* Some random utility functions
+ */
-#ifndef HAVE_GTK2
- if (i == 1)
- {
- GTK_WIDGET (label)->style =
- gtk_style_copy (GTK_WIDGET (label)->style);
- GTK_WIDGET (label)->style->font =
- gdk_font_load (get_string_resource("warning_dialog.headingFont",
- "Dialog.Font"));
- gtk_widget_set_style (GTK_WIDGET (label),
- GTK_WIDGET (label)->style);
- }
-#endif /* !HAVE_GTK2 */
- if (center <= 0)
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_box_pack_start (GTK_BOX (GET_CONTENT_AREA (GTK_DIALOG (dialog))),
- label, TRUE, TRUE, 0);
- gtk_widget_show (label);
- }
+/* Why this behavior isn't automatic, I'll never understand.
+ */
+static void
+ensure_selected_item_visible (state *s, GtkWidget *widget)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
- if (s)
- head = s+1;
- else
- head = 0;
+ /* Find the path of the selected row in the list.
+ */
+ GtkTreeView *list_widget = GTK_TREE_VIEW (win->list);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (list_widget);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreePath *path;
- center--;
- }
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ path = gtk_tree_path_new_first ();
+ else
+ path = gtk_tree_model_get_path (model, &iter);
- label = gtk_label_new ("");
- gtk_box_pack_start (GTK_BOX (GET_CONTENT_AREA (GTK_DIALOG (dialog))),
- label, TRUE, TRUE, 0);
- gtk_widget_show (label);
+ /* Make this item be visible and selected. */
+ gtk_tree_view_set_cursor (list_widget, path, NULL, FALSE);
- label = gtk_hbutton_box_new ();
- gtk_box_pack_start (GTK_BOX (GET_ACTION_AREA (GTK_DIALOG (dialog))),
- label, TRUE, TRUE, 0);
+ /* Make the scroller show that item at the center of the viewport.
+ The set_cursor() call, above, makes the item be visible, but it hugs
+ the top or bottom edge of the viewport, instead of providing more
+ surrounding context.
-#ifdef HAVE_GTK2
- if (button_type != D_NONE)
+ Doing the following in list_select_changed_cb() instead of here makes
+ the list vertically re-center when using the cursor keys instead of
+ hugging the top or bottom (good) but also makes it re-center when
+ clicking on a new item with the mouse (bad).
+ */
+ if (gtk_widget_get_realized (GTK_WIDGET (list_widget)))
{
- cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
- gtk_container_add (GTK_CONTAINER (label), cancel);
+ GdkWindow *bin = gtk_tree_view_get_bin_window (list_widget);
+ int binh = gdk_window_get_height (bin);
+ GdkRectangle r;
+ gtk_tree_view_get_cell_area (list_widget, path, NULL, &r);
+ gtk_tree_view_convert_widget_to_tree_coords (list_widget,
+ r.x, r.y, &r.x, &r.y);
+ gtk_tree_view_scroll_to_point (list_widget, r.x, r.y - binh / 2);
}
- ok = gtk_button_new_from_stock (GTK_STOCK_OK);
- gtk_container_add (GTK_CONTAINER (label), ok);
-
-#else /* !HAVE_GTK2 */
-
- ok = gtk_button_new_with_label ("OK");
- gtk_container_add (GTK_CONTAINER (label), ok);
-
- if (button_type != D_NONE)
- {
- cancel = gtk_button_new_with_label ("Cancel");
- gtk_container_add (GTK_CONTAINER (label), cancel);
- }
+ gtk_tree_path_free (path);
+}
-#endif /* !HAVE_GTK2 */
- gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
- gtk_window_set_title (GTK_WINDOW (dialog), progclass);
- SET_CAN_DEFAULT (ok);
- gtk_widget_show (ok);
- gtk_widget_grab_focus (ok);
+static void
+warning_dialog_cb (GtkDialog *dialog, gint response_id, gpointer user_data)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p)
+ fprintf (stderr, "%s: dialog response %d\n", blurb(), response_id);
+ switch (response_id) {
+ case D_LAUNCH: restart_menu_cb (GTK_WIDGET (dialog), user_data); break;
+ case D_GNOME: kill_gnome_screensaver (s); break;
+ case D_KDE: kill_kde_screensaver (s); break;
+ default: /* D_NONE or GTK_RESPONSE_DELETE_EVENT */
+ break;
+ }
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
- if (cancel)
- {
- SET_CAN_DEFAULT (cancel);
- gtk_widget_show (cancel);
- }
- gtk_widget_show (label);
- gtk_widget_show (dialog);
- if (button_type != D_NONE)
- {
- GtkSignalFunc fn;
- switch (button_type) {
- case D_LAUNCH: fn = GTK_SIGNAL_FUNC (warning_dialog_restart_cb); break;
- case D_GNOME: fn = GTK_SIGNAL_FUNC (warning_dialog_killg_cb); break;
- case D_KDE: fn = GTK_SIGNAL_FUNC (warning_dialog_killk_cb); break;
- default: abort(); break;
- }
- gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", fn,
- (gpointer) dialog);
- gtk_signal_connect_object (GTK_OBJECT (cancel), "clicked",
- GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
- (gpointer) dialog);
- }
- else
- {
- gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
- GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
- (gpointer) dialog);
- }
+static Bool
+warning_dialog_1 (GtkWindow *win,
+ const char *title,
+ const char *message,
+ dialog_button button_type)
+{
+ GtkWidget *dialog =
+ (button_type == D_NONE
+ ? gtk_dialog_new_with_buttons (title, win,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ _("_OK"), D_NONE,
+ NULL)
+ : gtk_dialog_new_with_buttons (title, win,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ (button_type == D_LAUNCH ? _("Launch") :
+ button_type == D_GNOME ? _("Kill") :
+ button_type == D_KDE ? _("Kill") :
+ _("_OK")),
+ button_type,
+ _("_Cancel"), D_NONE,
+ NULL));
+ GtkWidget *content_area =
+ gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ GtkWidget *im = gtk_image_new_from_icon_name ("dialog-warning",
+ GTK_ICON_SIZE_DIALOG);
+ GtkWidget *label = gtk_label_new (message);
+ int margin = 32;
+
+ gtk_box_pack_start (GTK_BOX (hbox), im, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (content_area), hbox);
+
+ gtk_widget_set_margin_start (hbox, margin);
+ gtk_widget_set_margin_end (hbox, margin);
+ gtk_widget_set_margin_top (hbox, margin);
+ gtk_widget_set_margin_bottom (hbox, margin / 2);
+
+ gtk_widget_set_margin_start (label, margin / 2);
+ gtk_widget_set_valign (im, GTK_ALIGN_START);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (warning_dialog_cb),
+ win);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), button_type);
+ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), win);
+ gtk_widget_show_all (dialog);
- gdk_window_set_transient_for (GET_WINDOW (GTK_WIDGET (dialog)),
- GET_WINDOW (GTK_WIDGET (parent)));
+ return TRUE;
+}
-#ifdef HAVE_GTK2
- gtk_window_present (GTK_WINDOW (dialog));
-#else /* !HAVE_GTK2 */
- gdk_window_show (GTK_WIDGET (dialog)->window);
- gdk_window_raise (GTK_WIDGET (dialog)->window);
-#endif /* !HAVE_GTK2 */
- free (msg);
- return True;
+void
+warning_dialog (GtkWindow *win, const char *title, const char *message)
+{
+ warning_dialog_1 (win, title, message, D_NONE);
}
@@ -660,8 +675,13 @@ run_cmd (state *s, Atom command, int arg)
char *err = 0;
int status;
+ if (!s->dpy) return;
flush_dialog_changes_and_save (s);
- status = xscreensaver_command (GDK_DISPLAY(), command, arg, False, &err);
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: command: %s %d\n", blurb(),
+ XGetAtomName (s->dpy, command), arg);
+ status = xscreensaver_command (s->dpy, command, arg, FALSE, &err);
/* Kludge: ignore the spurious "window unexpectedly deleted" errors... */
if (status < 0 && err && strstr (err, "unexpectedly deleted"))
@@ -670,16 +690,12 @@ run_cmd (state *s, Atom command, int arg)
if (status < 0)
{
char buf [255];
- if (err)
- sprintf (buf, "Error:\n\n%s", err);
- else
- strcpy (buf, "Unknown error!");
- warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
+ sprintf (buf, "%.100s", (err ? err : _("Unknown error!")));
+ warning_dialog (s->window, _("Error"), buf);
}
if (err) free (err);
- sensitize_menu_items (s, True);
- force_dialog_repaint (s);
+ sensitize_menu_items (s, TRUE);
}
@@ -690,14 +706,17 @@ run_hack (state *s, int list_elt, Bool report_errors_p)
char *err = 0;
int status;
+ if (!s->dpy) return;
if (list_elt < 0) return;
hack_number = s->list_elt_to_hack_number[list_elt];
flush_dialog_changes_and_save (s);
schedule_preview (s, 0);
- status = xscreensaver_command (GDK_DISPLAY(), XA_DEMO, hack_number + 1,
- False, &err);
+ if (s->debug_p)
+ fprintf (stderr, "%s: command: DEMO %d\n", blurb(), hack_number + 1);
+ status = xscreensaver_command (s->dpy, XA_DEMO, hack_number + 1,
+ FALSE, &err);
if (status < 0 && report_errors_p)
{
@@ -711,11 +730,8 @@ run_hack (state *s, int list_elt, Bool report_errors_p)
if (status < 0)
{
char buf [255];
- if (err)
- sprintf (buf, "Error:\n\n%s", err);
- else
- strcpy (buf, "Unknown error!");
- warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
+ sprintf (buf, "%.100s", err ? err : _("Unknown error!"));
+ warning_dialog (s->window, _("Error"), buf);
}
}
else
@@ -723,283 +739,232 @@ run_hack (state *s, int list_elt, Bool report_errors_p)
/* The error is that the daemon isn't running;
offer to restart it.
*/
- const char *d = DisplayString (GDK_DISPLAY());
+ const char *d = DisplayString (s->dpy);
char msg [1024];
sprintf (msg,
- _("Warning:\n\n"
- "The XScreenSaver daemon doesn't seem to be running\n"
- "on display \"%s\". Launch it now?"),
+ _("The XScreenSaver daemon doesn't seem to be running\n"
+ "on display \"%.25s\". Launch it now?"),
d);
- warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
+ warning_dialog_1 (s->window, _("Warning"), msg, D_LAUNCH);
}
}
if (err) free (err);
- sensitize_menu_items (s, False);
+ sensitize_menu_items (s, FALSE);
}
-
-/* Button callbacks
+static pid_t
+fork_and_exec (state *s, int argc, char **argv)
+{
+ char buf [255];
+ pid_t forked = fork();
+ switch ((int) forked) {
+ case -1:
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ break;
+
+ case 0:
+ if (s->dpy) close (ConnectionNumber (s->dpy));
+ execvp (argv[0], argv); /* shouldn't return. */
+
+ sprintf (buf, "%s: pid %lu: couldn't exec %s", blurb(),
+ (unsigned long) getpid(), argv[0]);
+ perror (buf);
+ exit (1); /* exits child fork */
+ break;
+
+ default: /* parent fork */
+
+ /* Put it in its own process group so that this process getting SIGTERM
+ does not propagate to the forked process. */
+ if (setpgid (forked, 0))
+ {
+ char buf [255];
+ sprintf (buf, "%s: setpgid %d", blurb(), forked);
+ perror (buf);
+ }
+
+ if (s->debug_p)
+ {
+ int i;
+ fprintf (stderr, "%s: pid %lu: forked:", blurb(),
+ (unsigned long) forked);
+ for (i = 0; i < argc; i++)
+ if (strchr (argv[i], ' '))
+ fprintf (stderr, " \"%s\"", argv[i]);
+ else
+ fprintf (stderr, " %s", argv[i]);
+ fprintf (stderr, "\n");
+ }
- According to Eric Lassauge, this G_MODULE_EXPORT crud is needed to make
- GTK work on Cygwin; apparently all GTK callbacks need this magic extra
- declaration. I do not pretend to understand.
- */
+ break;
+ }
-G_MODULE_EXPORT void
-exit_menu_cb (GtkAction *menu_action, gpointer user_data)
-{
- state *s = global_state_kludge; /* I hate C so much... */
- flush_dialog_changes_and_save (s);
- kill_preview_subproc (s, False);
- gtk_main_quit ();
+ return forked;
}
-static gboolean
-wm_toplevel_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
+
+
+/****************************************************************************
+
+ XScreenSaverWindow callbacks, referenced by demo.ui.
+
+ ****************************************************************************/
+
+/* File menu / Quit */
+G_MODULE_EXPORT void
+quit_menu_cb (GtkAction *menu_action, gpointer user_data)
{
- state *s = (state *) data;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: quit menu\n", blurb());
flush_dialog_changes_and_save (s);
- gtk_main_quit ();
- return TRUE;
+ kill_preview_subproc (s, FALSE);
+ g_application_quit (G_APPLICATION (
+ gtk_window_get_application (GTK_WINDOW (win))));
}
+/* Help menu / About */
G_MODULE_EXPORT void
about_menu_cb (GtkAction *menu_action, gpointer user_data)
{
-#if 1
- /* Let's just pop up the splash dialog instead. */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: about menu\n", blurb());
preview_theme_cb (NULL, user_data);
-#else
- char msg [2048];
- char copy[1024];
- char *desc = _("For updates, check https://www.jwz.org/xscreensaver/");
-
- char *version = strdup (screensaver_id + 17);
- char *year = strchr (version, '-');
- char *s = strchr (version, ' ');
- *s = 0;
- year = strchr (year+1, '-') + 1;
- s = strchr (year, ')');
- *s = 0;
-
- /* Ole Laursen <olau@hardworking.dk> says "don't use _() here because
- non-ASCII characters aren't allowed in localizable string keys."
- (I don't want to just use (c) instead of © because that doesn't
- look as good in the plain-old default Latin1 "C" locale.)
- */
-#ifdef HAVE_GTK2
- sprintf(copy, ("Copyright \xC2\xA9 1991-%s %s"), year, s);
-#else /* !HAVE_GTK2 */
- sprintf(copy, ("Copyright \251 1991-%s %s"), year, s);
-#endif /* !HAVE_GTK2 */
-
- sprintf (msg, "%s\n\n%s", copy, desc);
-
- /* I can't make gnome_about_new() work here -- it starts dying in
- gdk_imlib_get_visual() under gnome_about_new(). If this worked,
- then this might be the thing to do:
-
- #ifdef HAVE_CRAPPLET
- {
- const gchar *auth[] = { 0 };
- GtkWidget *about = gnome_about_new (progclass, version, "", auth, desc,
- "xscreensaver.xpm");
- gtk_widget_show (about);
- }
- #else / * GTK but not GNOME * /
- ...
- */
- {
- GdkColormap *colormap;
- GdkPixmap *gdkpixmap;
- GdkBitmap *mask;
-
- GtkWidget *dialog = gtk_dialog_new ();
- GtkWidget *hbox, *icon, *vbox, *label1, *label2, *hb, *ok;
- GSList *proxies = gtk_action_get_proxies (menu_action);
- GtkWidget *parent = GTK_WIDGET (proxies->data);
- while (GET_PARENT (parent))
- parent = GET_PARENT (parent);
-
- hbox = gtk_hbox_new (FALSE, 20);
- gtk_box_pack_start (GTK_BOX (GET_CONTENT_AREA (GTK_DIALOG (dialog))),
- hbox, TRUE, TRUE, 0);
-
- colormap = gtk_widget_get_colormap (parent);
- gdkpixmap =
- gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, NULL,
- (gchar **) logo_180_xpm);
- icon = gtk_pixmap_new (gdkpixmap, mask);
- gtk_misc_set_padding (GTK_MISC (icon), 10, 10);
-
- gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
-
- label1 = gtk_label_new (version);
- gtk_box_pack_start (GTK_BOX (vbox), label1, TRUE, TRUE, 0);
- gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.75);
-
-#ifndef HAVE_GTK2
- GTK_WIDGET (label1)->style = gtk_style_copy (GTK_WIDGET (label1)->style);
- GTK_WIDGET (label1)->style->font =
- gdk_font_load (get_string_resource ("about.headingFont","Dialog.Font"));
- gtk_widget_set_style (GTK_WIDGET (label1), GTK_WIDGET (label1)->style);
-#endif /* HAVE_GTK2 */
-
- label2 = gtk_label_new (msg);
- gtk_box_pack_start (GTK_BOX (vbox), label2, TRUE, TRUE, 0);
- gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (label2), 0.0, 0.25);
-
-#ifndef HAVE_GTK2
- GTK_WIDGET (label2)->style = gtk_style_copy (GTK_WIDGET (label2)->style);
- GTK_WIDGET (label2)->style->font =
- gdk_font_load (get_string_resource ("about.bodyFont","Dialog.Font"));
- gtk_widget_set_style (GTK_WIDGET (label2), GTK_WIDGET (label2)->style);
-#endif /* HAVE_GTK2 */
-
- hb = gtk_hbutton_box_new ();
-
- gtk_box_pack_start (GTK_BOX (GET_ACTION_AREA (GTK_DIALOG (dialog))),
- hb, TRUE, TRUE, 0);
-
-#ifdef HAVE_GTK2
- ok = gtk_button_new_from_stock (GTK_STOCK_OK);
-#else /* !HAVE_GTK2 */
- ok = gtk_button_new_with_label (_("OK"));
-#endif /* !HAVE_GTK2 */
- gtk_container_add (GTK_CONTAINER (hb), ok);
-
- gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
- gtk_window_set_title (GTK_WINDOW (dialog), progclass);
-
- gtk_widget_show (hbox);
- gtk_widget_show (icon);
- gtk_widget_show (vbox);
- gtk_widget_show (label1);
- gtk_widget_show (label2);
- gtk_widget_show (hb);
- gtk_widget_show (ok);
- gtk_widget_show (dialog);
-
- gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
- GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
- (gpointer) dialog);
- gdk_window_set_transient_for (GET_WINDOW (GTK_WIDGET (dialog)),
- GET_WINDOW (GTK_WIDGET (parent)));
- gdk_window_show (GET_WINDOW (GTK_WIDGET (dialog)));
- gdk_window_raise (GET_WINDOW (GTK_WIDGET (dialog)));
- }
-#endif /* 0 */
}
+/* Help menu / Documentation */
G_MODULE_EXPORT void
doc_menu_cb (GtkAction *menu_action, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
saver_preferences *p = &s->prefs;
char *help_command;
+ int ac = 0;
+ char *av[10];
+
+ if (s->debug_p) fprintf (stderr, "%s: doc menu\n", blurb());
if (!p->help_url || !*p->help_url)
{
- warning_dialog (s->toplevel_widget,
- _("Error:\n\n"
- "No Help URL has been specified.\n"), D_NONE, 100);
+ warning_dialog (GTK_WINDOW (win), _("Error"),
+ _("No Help URL has been specified.\n"));
return;
}
help_command = (char *) malloc (strlen (p->load_url_command) +
(strlen (p->help_url) * 5) + 20);
- strcpy (help_command, "( ");
- sprintf (help_command + strlen(help_command),
- p->load_url_command,
+ sprintf (help_command, p->load_url_command,
p->help_url, p->help_url, p->help_url, p->help_url, p->help_url);
- strcat (help_command, " ) &");
- if (system (help_command) < 0)
- fprintf (stderr, "%s: fork error\n", blurb());
+
+ av[ac++] = "/bin/sh";
+ av[ac++] = "-c";
+ av[ac++] = help_command;
+ av[ac] = 0;
+ fork_and_exec (s, ac, av);
free (help_command);
}
+/* File menu opened */
G_MODULE_EXPORT void
file_menu_cb (GtkAction *menu_action, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- sensitize_menu_items (s, False);
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: file menu post\n", blurb());
+ sensitize_menu_items (s, FALSE);
}
+/* File menu / Activate */
G_MODULE_EXPORT void
activate_menu_cb (GtkAction *menu_action, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: activate menu\n", blurb());
run_cmd (s, XA_ACTIVATE, 0);
}
+/* File menu / Lock */
G_MODULE_EXPORT void
lock_menu_cb (GtkAction *menu_action, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: lock menu\n", blurb());
run_cmd (s, XA_LOCK, 0);
}
+/* File menu / Kill daemon */
G_MODULE_EXPORT void
kill_menu_cb (GtkAction *menu_action, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: kill menu\n", blurb());
run_cmd (s, XA_EXIT, 0);
}
+/* File menu / Restart */
G_MODULE_EXPORT void
restart_menu_cb (GtkWidget *widget, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ int ac = 0;
+ char *av[10];
+ if (s->debug_p) fprintf (stderr, "%s: restart menu\n", blurb());
+ if (!s->dpy) return;
flush_dialog_changes_and_save (s);
- xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL);
+ xscreensaver_command (s->dpy, XA_EXIT, 0, FALSE, NULL);
sleep (1);
- if (system ("xscreensaver -splash &") < 0)
- fprintf (stderr, "%s: fork error\n", blurb());
+ av[ac++] = "xscreensaver";
+ av[ac++] = "--splash";
+ if (s->debug_p) av[ac++] = "--verbose";
+ av[ac] = 0;
+ fork_and_exec (s, ac, av);
await_xscreensaver (s);
}
+
static Bool
xscreensaver_running_p (state *s)
{
- Display *dpy = GDK_DISPLAY();
char *rversion = 0;
- server_xscreensaver_version (dpy, &rversion, 0, 0);
+ if (!s->dpy) return FALSE;
+ server_xscreensaver_version (s->dpy, &rversion, 0, 0);
if (!rversion)
- return False;
+ return FALSE;
free (rversion);
- return True;
+ return TRUE;
}
static void
await_xscreensaver (state *s)
{
int countdown = 5;
- Bool ok = False;
+ Bool ok = FALSE;
while (!ok && (--countdown > 0))
if (xscreensaver_running_p (s))
- ok = True;
+ ok = TRUE;
else
sleep (1); /* If it's not there yet, wait a second... */
- sensitize_menu_items (s, True);
+ sensitize_menu_items (s, TRUE);
if (! ok)
{
@@ -1009,37 +974,19 @@ await_xscreensaver (state *s)
Bool root_p = (geteuid () == 0);
strcpy (buf,
- _("Error:\n\n"
- "The xscreensaver daemon did not start up properly.\n"
+ _("The xscreensaver daemon did not start up properly.\n"
"\n"));
if (root_p)
- strcat (buf, STFU
- _("You are running as root. This usually means that xscreensaver\n"
- "was unable to contact your X server because access control is\n"
- "turned on."
-/*
- " Try running this command:\n"
- "\n"
- " xhost +localhost\n"
- "\n"
- "and then selecting `File / Restart Daemon'.\n"
- "\n"
- "Note that turning off access control will allow anyone logged\n"
- "on to this machine to access your screen, which might be\n"
- "considered a security problem. Please read the xscreensaver\n"
- "manual and FAQ for more information.\n"
- */
- "\n"
- "You shouldn't run X as root. Instead, you should log in as a\n"
- "normal user, and `sudo' as necessary."));
+ strcat (buf,
+ _("You are running as root. Don't do that. Instead, you should\n"
+ "log in as a normal user and use `sudo' as necessary.")
+ );
else
strcat (buf, _("Please check your $PATH and permissions."));
- warning_dialog (s->toplevel_widget, buf, D_NONE, 1);
+ warning_dialog (s->window, _("Error"), buf);
}
-
- force_dialog_repaint (s);
}
@@ -1050,12 +997,14 @@ selected_list_element (state *s)
}
+/* Write the settings to disk; call this only when changes have been made.
+ */
static int
demo_write_init_file (state *s, saver_preferences *p)
{
- Display *dpy = GDK_DISPLAY();
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
- if (!write_init_file (dpy, p, s->short_version, False))
+ if (!write_init_file (s->dpy, p, s->short_version, FALSE))
{
if (s->debug_p)
fprintf (stderr, "%s: wrote %s\n", blurb(), init_file_name());
@@ -1065,14 +1014,13 @@ demo_write_init_file (state *s, saver_preferences *p)
{
const char *f = init_file_name();
if (!f || !*f)
- warning_dialog (s->toplevel_widget,
- _("Error:\n\nCouldn't determine init file name!\n"),
- D_NONE, 100);
+ warning_dialog (GTK_WINDOW (win), _("Error"),
+ _("Couldn't determine init file name!\n"));
else
{
char *b = (char *) malloc (strlen(f) + 1024);
- sprintf (b, _("Error:\n\nCouldn't write %s\n"), f);
- warning_dialog (s->toplevel_widget, b, D_NONE, 100);
+ sprintf (b, _("Couldn't write %s\n"), f);
+ warning_dialog (GTK_WINDOW (win), _("Error"), b);
free (b);
}
return -1;
@@ -1080,106 +1028,57 @@ demo_write_init_file (state *s, saver_preferences *p)
}
+/* The "Preview" button on the main page. */
G_MODULE_EXPORT void
run_this_cb (GtkButton *button, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
int list_elt = selected_list_element (s);
if (list_elt < 0) return;
- if (!flush_dialog_changes_and_save (s))
- run_hack (s, list_elt, True);
-}
-
-
-G_MODULE_EXPORT void
-manual_cb (GtkButton *button, gpointer user_data)
-{
- Display *dpy = GDK_DISPLAY();
- state *s = global_state_kludge; /* I hate C so much... */
- saver_preferences *p = &s->prefs;
- GtkWidget *list_widget = name_to_widget (s, "list");
- int list_elt = selected_list_element (s);
- int hack_number;
- char *name, *name2, *cmd, *str;
- char *oname = 0;
- if (list_elt < 0) return;
- hack_number = s->list_elt_to_hack_number[list_elt];
-
+ if (s->debug_p) fprintf (stderr, "%s: preview button\n", blurb());
flush_dialog_changes_and_save (s);
- ensure_selected_item_visible (list_widget);
-
- name = strdup (p->screenhacks[hack_number]->command);
- name2 = name;
- oname = name;
- while (isspace (*name2)) name2++;
- str = name2;
- while (*str && !isspace (*str)) str++;
- *str = 0;
- str = strrchr (name2, '/');
- if (str) name2 = str+1;
-
- cmd = get_string_resource (dpy, "manualCommand", "ManualCommand");
- if (cmd)
- {
- char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100);
- strcpy (cmd2, "( ");
- sprintf (cmd2 + strlen (cmd2),
- cmd,
- name2, name2, name2, name2);
- strcat (cmd2, " ) &");
- if (system (cmd2) < 0)
- fprintf (stderr, "%s: fork error\n", blurb());
- free (cmd2);
- }
- else
- {
- warning_dialog (GTK_WIDGET (button),
- _("Error:\n\nno `manualCommand' resource set."),
- D_NONE, 100);
- }
-
- free (oname);
+ run_hack (s, list_elt, TRUE);
}
static void
force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
{
- GtkWidget *parent = name_to_widget (s, "scroller");
- gboolean was = GET_SENSITIVE (parent);
-#ifdef HAVE_GTK2
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkWidget *parent = win->scroller;
+ gboolean was = gtk_widget_get_sensitive (parent);
GtkTreeIter iter;
GtkTreeModel *model;
GtkTreeSelection *selection;
-#endif /* HAVE_GTK2 */
- if (!was) gtk_widget_set_sensitive (parent, True);
-#ifdef HAVE_GTK2
+ if (!was) gtk_widget_set_sensitive (parent, TRUE);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
if (!model) abort();
if (gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt))
{
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
gtk_tree_selection_select_iter (selection, &iter);
+ if (s->debug_p)
+ fprintf (stderr, "%s: select list elt %d\n", blurb(), list_elt);
}
-#else /* !HAVE_GTK2 */
- gtk_list_select_item (GTK_LIST (list), list_elt);
-#endif /* !HAVE_GTK2 */
- if (scroll_p) ensure_selected_item_visible (GTK_WIDGET (list));
- if (!was) gtk_widget_set_sensitive (parent, False);
+ if (scroll_p) ensure_selected_item_visible (s, GTK_WIDGET (list));
+ if (!was) gtk_widget_set_sensitive (parent, FALSE);
}
+/* The down arrow */
G_MODULE_EXPORT void
run_next_cb (GtkButton *button, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- /* saver_preferences *p = &s->prefs; */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
Bool ops = s->preview_suppressed_p;
-
- GtkWidget *list_widget = name_to_widget (s, "list");
+ GtkWidget *list_widget = win->list;
int list_elt = selected_list_element (s);
+ if (s->debug_p) fprintf (stderr, "%s: down arrow\n", blurb());
+
if (list_elt < 0)
list_elt = 0;
else
@@ -1188,27 +1087,30 @@ run_next_cb (GtkButton *button, gpointer user_data)
if (list_elt >= s->list_count)
list_elt = 0;
- s->preview_suppressed_p = True;
+ s->preview_suppressed_p = TRUE;
flush_dialog_changes_and_save (s);
- force_list_select_item (s, list_widget, list_elt, True);
+ force_list_select_item (s, list_widget, list_elt, TRUE);
populate_demo_window (s, list_elt);
- run_hack (s, list_elt, False);
+ populate_popup_window (s);
+ run_hack (s, list_elt, FALSE);
s->preview_suppressed_p = ops;
}
+/* The up arrow */
G_MODULE_EXPORT void
run_prev_cb (GtkButton *button, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- /* saver_preferences *p = &s->prefs; */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
Bool ops = s->preview_suppressed_p;
-
- GtkWidget *list_widget = name_to_widget (s, "list");
+ GtkWidget *list_widget = win->list;
int list_elt = selected_list_element (s);
+ if (s->debug_p) fprintf (stderr, "%s: up arrow\n", blurb());
+
if (list_elt < 0)
list_elt = s->list_count - 1;
else
@@ -1217,19 +1119,20 @@ run_prev_cb (GtkButton *button, gpointer user_data)
if (list_elt < 0)
list_elt = s->list_count - 1;
- s->preview_suppressed_p = True;
+ s->preview_suppressed_p = TRUE;
flush_dialog_changes_and_save (s);
- force_list_select_item (s, list_widget, list_elt, True);
+ force_list_select_item (s, list_widget, list_elt, TRUE);
populate_demo_window (s, list_elt);
- run_hack (s, list_elt, False);
+ populate_popup_window (s);
+ run_hack (s, list_elt, FALSE);
s->preview_suppressed_p = ops;
}
-/* Writes the given settings into prefs.
- Returns true if there was a change, False otherwise.
+/* Writes the settings of the given hack into prefs.
+ Returns true if there was a change, FALSE otherwise.
command and/or visual may be 0, or enabled_p may be -1, meaning "no change".
*/
static Bool
@@ -1240,7 +1143,7 @@ flush_changes (state *s,
const char *visual)
{
saver_preferences *p = &s->prefs;
- Bool changed = False;
+ Bool changed = FALSE;
screenhack *hack;
int hack_number;
if (list_elt < 0 || list_elt >= s->list_count)
@@ -1253,7 +1156,7 @@ flush_changes (state *s,
enabled_p != hack->enabled_p)
{
hack->enabled_p = enabled_p;
- changed = True;
+ changed = TRUE;
if (s->debug_p)
fprintf (stderr, "%s: \"%s\": enabled => %d\n",
blurb(), hack->name, enabled_p);
@@ -1265,7 +1168,7 @@ flush_changes (state *s,
{
if (hack->command) free (hack->command);
hack->command = strdup (command);
- changed = True;
+ changed = TRUE;
if (s->debug_p)
fprintf (stderr, "%s: \"%s\": command => \"%s\"\n",
blurb(), hack->name, command);
@@ -1281,7 +1184,7 @@ flush_changes (state *s,
{
if (hack->visual) free (hack->visual);
hack->visual = strdup (visual);
- changed = True;
+ changed = TRUE;
if (s->debug_p)
fprintf (stderr, "%s: \"%s\": visual => \"%s\"\n",
blurb(), hack->name, visual);
@@ -1302,7 +1205,7 @@ hack_time_text (state *s, const char *line, Time *store, Bool sec_p)
{
int value;
if (!sec_p || strchr (line, ':'))
- value = parse_time ((char *) line, sec_p, True);
+ value = parse_time ((char *) line, sec_p, TRUE);
else
{
char c;
@@ -1316,11 +1219,9 @@ hack_time_text (state *s, const char *line, Time *store, Bool sec_p)
if (value < 0)
{
char b[255];
- sprintf (b,
- _("Error:\n\n"
- "Unparsable time format: \"%s\"\n"),
+ sprintf (b, _("Unparsable time format: \"%.100s\"\n"),
line);
- warning_dialog (s->toplevel_widget, b, D_NONE, 100);
+ warning_dialog (s->window, _("Error"), b);
}
else
*store = value;
@@ -1328,97 +1229,6 @@ hack_time_text (state *s, const char *line, Time *store, Bool sec_p)
}
-static Bool
-directory_p (const char *path)
-{
- struct stat st;
- if (!path || !*path)
- return False;
- else if (stat (path, &st))
- return False;
- else if (!S_ISDIR (st.st_mode))
- return False;
- else
- return True;
-}
-
-static Bool
-file_p (const char *path)
-{
- struct stat st;
- if (!path || !*path)
- return False;
- else if (stat (path, &st))
- return False;
- else if (S_ISDIR (st.st_mode))
- return False;
- else
- return True;
-}
-
-static char *
-normalize_directory (const char *path)
-{
- int L;
- char *p2, *s;
- if (!path || !*path) return 0;
- L = strlen (path);
- p2 = (char *) malloc (L + 2);
- strcpy (p2, path);
- if (p2[L-1] == '/') /* remove trailing slash */
- p2[--L] = 0;
-
- for (s = p2; s && *s; s++)
- {
- if (*s == '/' &&
- (!strncmp (s, "/../", 4) || /* delete "XYZ/../" */
- !strncmp (s, "/..\000", 4))) /* delete "XYZ/..$" */
- {
- char *s0 = s;
- while (s0 > p2 && s0[-1] != '/')
- s0--;
- if (s0 > p2)
- {
- s0--;
- s += 3;
- /* strcpy (s0, s); */
- memmove(s0, s, strlen(s) + 1);
- s = s0-1;
- }
- }
- else if (*s == '/' && !strncmp (s, "/./", 3)) { /* delete "/./" */
- /* strcpy (s, s+2), s--; */
- memmove(s, s+2, strlen(s+2) + 1);
- s--;
- }
- else if (*s == '/' && !strncmp (s, "/.\000", 3)) /* delete "/.$" */
- *s = 0, s--;
- }
-
- /*
- Normalize consecutive slashes.
- Ignore doubled slashes after ":" to avoid mangling URLs.
- */
-
- for (s = p2; s && *s; s++){
- if (*s == ':') continue;
- if (!s[1] || !s[2]) continue;
- while (s[1] == '/' && s[2] == '/')
- /* strcpy (s+1, s+2); */
- memmove (s+1, s+2, strlen(s+2) + 1);
- }
-
- /* and strip trailing whitespace for good measure. */
- L = strlen(p2);
- while (isspace(p2[L-1]))
- p2[--L] = 0;
-
- return p2;
-}
-
-
-#ifdef HAVE_GTK2
-
typedef struct {
state *s;
int i;
@@ -1426,10 +1236,10 @@ typedef struct {
} FlushForeachClosure;
static gboolean
-flush_checkbox (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data)
+flush_checkbox (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
{
FlushForeachClosure *closure = data;
gboolean checked;
@@ -1440,7 +1250,7 @@ flush_checkbox (GtkTreeModel *model,
if (flush_changes (closure->s, closure->i,
checked, 0, 0))
- *closure->changed = True;
+ *closure->changed = TRUE;
closure->i++;
@@ -1448,8 +1258,6 @@ flush_checkbox (GtkTreeModel *model,
return FALSE;
}
-#endif /* HAVE_GTK2 */
-
static char *
theme_name_strip (const char *s)
@@ -1476,113 +1284,80 @@ theme_name_strip (const char *s)
static Bool
flush_dialog_changes_and_save (state *s)
{
- Display *dpy = GDK_DISPLAY();
saver_preferences *p = &s->prefs;
saver_preferences P2, *p2 = &P2;
-#ifdef HAVE_GTK2
- GtkTreeView *list_widget = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkTreeView *list_widget = GTK_TREE_VIEW (win->list);
GtkTreeModel *model = gtk_tree_view_get_model (list_widget);
FlushForeachClosure closure;
-#else /* !HAVE_GTK2 */
- GtkList *list_widget = GTK_LIST (name_to_widget (s, "list"));
- GList *kids = gtk_container_children (GTK_CONTAINER (list_widget));
- int i;
-#endif /* !HAVE_GTK2 */
- static Bool already_warned_about_missing_image_directory = False; /* very long name... */
+ Bool changed = FALSE;
- Bool changed = False;
- GtkWidget *w;
-
- if (s->saving_p) return False;
- s->saving_p = True;
+ if (s->initializing_p) return FALSE;
+ if (s->saving_p) return FALSE;
+ s->saving_p = TRUE;
*p2 = *p;
- /* Flush any checkbox changes in the list down into the prefs struct.
+ /* Flush any checkbox changes in the list down into the s2 prefs struct.
*/
-#ifdef HAVE_GTK2
closure.s = s;
closure.changed = &changed;
closure.i = 0;
gtk_tree_model_foreach (model, flush_checkbox, &closure);
-#else /* !HAVE_GTK2 */
-
- for (i = 0; kids; kids = kids->next, i++)
- {
- GtkWidget *line = GTK_WIDGET (kids->data);
- GtkWidget *line_hbox = GTK_WIDGET (GTK_BIN (line)->child);
- GtkWidget *line_check =
- GTK_WIDGET (gtk_container_children (GTK_CONTAINER (line_hbox))->data);
- Bool checked =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (line_check));
-
- if (flush_changes (s, i, (checked ? 1 : 0), 0, 0))
- changed = True;
- }
-#endif /* ~HAVE_GTK2 */
-
/* Flush the non-hack-specific settings down into the prefs struct.
*/
-# define SECONDS(FIELD,NAME) \
- w = name_to_widget (s, (NAME)); \
- hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (w)), (FIELD), True)
-
-# define MINUTES(FIELD,NAME) \
- w = name_to_widget (s, (NAME)); \
- hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (w)), (FIELD), False)
-
-# define CHECKBOX(FIELD,NAME) \
- w = name_to_widget (s, (NAME)); \
- (FIELD) = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))
-
-# define PATHNAME(FIELD,NAME) \
- w = name_to_widget (s, (NAME)); \
- (FIELD) = normalize_directory (gtk_entry_get_text (GTK_ENTRY (w)))
-
-# define TEXT(FIELD,NAME) \
- w = name_to_widget (s, (NAME)); \
- (FIELD) = (char *) g_strdup(gtk_entry_get_text (GTK_ENTRY (w)))
-
- MINUTES (&p2->timeout, "timeout_spinbutton");
- MINUTES (&p2->cycle, "cycle_spinbutton");
- CHECKBOX (p2->lock_p, "lock_button");
- MINUTES (&p2->lock_timeout, "lock_spinbutton");
-
- CHECKBOX (p2->dpms_enabled_p, "dpms_button");
- CHECKBOX (p2->dpms_quickoff_p, "dpms_quickoff_button");
- MINUTES (&p2->dpms_standby, "dpms_standby_spinbutton");
- MINUTES (&p2->dpms_suspend, "dpms_suspend_spinbutton");
- MINUTES (&p2->dpms_off, "dpms_off_spinbutton");
-
- CHECKBOX (p2->grab_desktop_p, "grab_desk_button");
- CHECKBOX (p2->grab_video_p, "grab_video_button");
- CHECKBOX (p2->random_image_p, "grab_image_button");
- PATHNAME (p2->image_directory, "image_text");
-
-#if 0
- CHECKBOX (p2->verbose_p, "verbose_button");
- CHECKBOX (p2->splash_p, "splash_button");
-#endif
+# define SECONDS(PREF,WIDGET) \
+ hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (win->WIDGET)), \
+ &(PREF), TRUE)
+# define MINUTES(PREF,WIDGET) \
+ hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (win->WIDGET)), \
+ &(PREF), FALSE)
+# define CHECKBOX(PREF,WIDGET) \
+ (PREF) = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (win->WIDGET))
+# define PATHNAME(PREF,WIDGET,DIRP) \
+ (PREF) = pathname_tilde ( \
+ gtk_entry_get_text (GTK_ENTRY (win->WIDGET)), TRUE, (DIRP))
+# define TEXT(PREF,WIDGET) \
+ (PREF) = (char *) g_strdup (gtk_entry_get_text (GTK_ENTRY (win->WIDGET)))
+
+ MINUTES (p2->timeout, timeout_spinbutton);
+ MINUTES (p2->cycle, cycle_spinbutton);
+ CHECKBOX (p2->lock_p, lock_button);
+ MINUTES (p2->lock_timeout, lock_spinbutton);
+
+ CHECKBOX (p2->dpms_enabled_p, dpms_button);
+ CHECKBOX (p2->dpms_quickoff_p, dpms_quickoff_button);
+ MINUTES (p2->dpms_standby, dpms_standby_spinbutton);
+ MINUTES (p2->dpms_suspend, dpms_suspend_spinbutton);
+ MINUTES (p2->dpms_off, dpms_off_spinbutton);
+
+ CHECKBOX (p2->grab_desktop_p, grab_desk_button);
+ CHECKBOX (p2->grab_video_p, grab_video_button);
+ CHECKBOX (p2->random_image_p, grab_image_button);
+ PATHNAME (p2->image_directory, image_text, TRUE);
{
- Bool v = False;
- CHECKBOX (v, "text_host_radio"); if (v) p2->tmode = TEXT_DATE;
- CHECKBOX (v, "text_radio"); if (v) p2->tmode = TEXT_LITERAL;
- CHECKBOX (v, "text_file_radio"); if (v) p2->tmode = TEXT_FILE;
- CHECKBOX (v, "text_program_radio"); if (v) p2->tmode = TEXT_PROGRAM;
- CHECKBOX (v, "text_url_radio"); if (v) p2->tmode = TEXT_URL;
- TEXT (p2->text_literal, "text_entry");
- PATHNAME (p2->text_file, "text_file_entry");
- PATHNAME (p2->text_program, "text_program_entry");
- PATHNAME (p2->text_program, "text_program_entry");
- TEXT (p2->text_url, "text_url_entry");
+ Bool v = FALSE;
+ Bool od = s->debug_p;
+ s->debug_p = FALSE;
+ CHECKBOX (v, text_host_radio); if (v) p2->tmode = TEXT_DATE;
+ CHECKBOX (v, text_radio); if (v) p2->tmode = TEXT_LITERAL;
+ CHECKBOX (v, text_file_radio); if (v) p2->tmode = TEXT_FILE;
+ CHECKBOX (v, text_program_radio); if (v) p2->tmode = TEXT_PROGRAM;
+ CHECKBOX (v, text_url_radio); if (v) p2->tmode = TEXT_URL;
+ s->debug_p = od;
}
- CHECKBOX (p2->fade_p, "fade_button");
- CHECKBOX (p2->unfade_p, "unfade_button");
- SECONDS (&p2->fade_seconds, "fade_spinbutton");
+ TEXT (p2->text_literal, text_entry);
+ PATHNAME (p2->text_file, text_file_entry, FALSE);
+ PATHNAME (p2->text_program, text_program_entry, FALSE);
+ TEXT (p2->text_url, text_url_entry);
+
+ CHECKBOX (p2->fade_p, fade_button);
+ CHECKBOX (p2->unfade_p, unfade_button);
+ SECONDS (p2->fade_seconds, fade_spinbutton);
# undef SECONDS
# undef MINUTES
@@ -1590,35 +1365,9 @@ flush_dialog_changes_and_save (state *s)
# undef PATHNAME
# undef TEXT
- /* Warn if the image directory doesn't exist, when:
- - not being warned before
- - image directory is changed and the directory doesn't exist
- - image directory is not a URL
- */
- if (p2->image_directory &&
- *p2->image_directory &&
- !directory_p (p2->image_directory) &&
- strncmp(p2->image_directory, "http://", 7) &&
- strncmp(p2->image_directory, "https://", 8) &&
- ( !already_warned_about_missing_image_directory ||
- ( p->image_directory &&
- *p->image_directory &&
- strcmp(p->image_directory, p2->image_directory)
- )
- )
- )
- {
- char b[255];
- sprintf (b, "Warning:\n\n" "Directory does not exist: \"%s\"\n",
- p2->image_directory);
- if (warning_dialog (s->toplevel_widget, b, D_NONE, 100))
- already_warned_about_missing_image_directory = True;
- }
-
-
/* Map the mode menu to `saver_mode' enum values. */
{
- GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu"));
+ GtkComboBox *opt = GTK_COMBO_BOX (win->mode_menu);
int menu_elt = gtk_combo_box_get_active (opt);
if (menu_elt < 0 || menu_elt >= countof(mode_menu_order)) abort();
p2->mode = mode_menu_order[menu_elt];
@@ -1634,10 +1383,10 @@ flush_dialog_changes_and_save (state *s)
/* Theme menu. */
{
- GtkComboBox *cbox = GTK_COMBO_BOX (name_to_widget (s, "theme_menu"));
- char *themes = get_string_resource (dpy, "themeNames", "ThemeNames");
+ GtkComboBox *cbox = GTK_COMBO_BOX (win->theme_menu);
+ char *themes = get_string_resource (s->dpy, "themeNames", "ThemeNames");
int menu_index = gtk_combo_box_get_active (cbox);
- char *token = themes;
+ char *token = themes ? themes : "default";
char *name, *last;
int i = 0;
while ((name = strtok_r (token, ",", &last)))
@@ -1646,199 +1395,238 @@ flush_dialog_changes_and_save (state *s)
if (i == menu_index)
{
char *name2 = theme_name_strip (name);
- if (p->dialog_theme) free (p->dialog_theme);
- p2->dialog_theme = name2;
+ if (p->dialog_theme && !!strcmp (p->dialog_theme, name2))
+ {
+ free (p->dialog_theme);
+ p2->dialog_theme = name2;
+ if (s->debug_p)
+ fprintf (stderr, "%s: theme => \"%s\"\n", blurb(),
+ p2->dialog_theme);
+ }
+ else
+ {
+ free (name2);
+ }
}
i++;
}
}
-# define COPY(field, name) \
- if (p->field != p2->field) { \
- changed = True; \
- if (s->debug_p) \
- fprintf (stderr, "%s: %s => %ld\n", blurb(), \
- name, (unsigned long) p2->field); \
- } \
- p->field = p2->field
-
- COPY(mode, "mode");
- COPY(selected_hack, "selected_hack");
-
- COPY(timeout, "timeout");
- COPY(cycle, "cycle");
- COPY(lock_p, "lock_p");
- COPY(lock_timeout, "lock_timeout");
-
- COPY(dpms_enabled_p, "dpms_enabled_p");
- COPY(dpms_quickoff_p, "dpms_quickoff_enabled_p");
- COPY(dpms_standby, "dpms_standby");
- COPY(dpms_suspend, "dpms_suspend");
- COPY(dpms_off, "dpms_off");
-
-#if 0
- COPY(verbose_p, "verbose_p");
- COPY(splash_p, "splash_p");
-#endif
-
- COPY(tmode, "tmode");
-
- COPY(install_cmap_p, "install_cmap_p");
- COPY(fade_p, "fade_p");
- COPY(unfade_p, "unfade_p");
- COPY(fade_seconds, "fade_seconds");
+ /* It is difficult to get "editing completed" events out of GtkEntry.
+ I want something that fires on RET or focus-out, but I can't seem
+ to find a consistent way to get that. So let's fake it here.
+ */
+ if (!s->initializing_p &&
+ !!strcmp (p->image_directory, p2->image_directory))
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: imagedir validating \"%s\" -> \"%s\"\n",
+ blurb(), p->image_directory, p2->image_directory);
+ if (! validate_image_directory (s, p2->image_directory))
+ {
+ /* Don't save the bad new value into the preferences. */
+ if (p2->image_directory != p->image_directory)
+ free (p2->image_directory);
+ p2->image_directory = strdup (p->image_directory);
+ }
+ }
- COPY(grab_desktop_p, "grab_desktop_p");
- COPY(grab_video_p, "grab_video_p");
- COPY(random_image_p, "random_image_p");
- COPY(dialog_theme, "dialog_theme");
+ /* Copy any changes from p2 into p, and log them.
+ */
+# undef STR
+# define STR(S) #S
+# define COPY(FIELD) \
+ if (p->FIELD != p2->FIELD) { \
+ changed = TRUE; \
+ if (s->debug_p) \
+ fprintf (stderr, "%s: %s: %ld => %ld\n", blurb(),\
+ STR(FIELD), (unsigned long) p->FIELD, \
+ (unsigned long) p2->FIELD); \
+ } \
+ p->FIELD = p2->FIELD
+
+ COPY(mode);
+ COPY(selected_hack);
+
+ COPY(timeout);
+ COPY(cycle);
+ COPY(lock_p);
+ COPY(lock_timeout);
+
+ COPY(dpms_enabled_p);
+ COPY(dpms_quickoff_p);
+ COPY(dpms_standby);
+ COPY(dpms_suspend);
+ COPY(dpms_off);
+
+ COPY(tmode);
+
+ COPY(install_cmap_p);
+ COPY(fade_p);
+ COPY(unfade_p);
+ COPY(fade_seconds);
+
+ COPY(grab_desktop_p);
+ COPY(grab_video_p);
+ COPY(random_image_p);
+
+ COPY(dialog_theme);
# undef COPY
-# define COPYSTR(FIELD,NAME) \
- if (!p->FIELD || \
- !p2->FIELD || \
- strcmp(p->FIELD, p2->FIELD)) \
- { \
- changed = True; \
- if (s->debug_p) \
- fprintf (stderr, "%s: %s => \"%s\"\n", blurb(), NAME, p2->FIELD); \
- } \
- if (p->FIELD && p->FIELD != p2->FIELD) \
- free (p->FIELD); \
- p->FIELD = p2->FIELD; \
+# define COPYSTR(FIELD) \
+ if (!p->FIELD || \
+ !p2->FIELD || \
+ strcmp(p->FIELD, p2->FIELD)) \
+ { \
+ changed = TRUE; \
+ if (s->debug_p) \
+ fprintf (stderr, "%s: %s => \"%s\"\n", blurb(), \
+ STR(FIELD), p2->FIELD); \
+ } \
+ if (p->FIELD && p->FIELD != p2->FIELD) \
+ free (p->FIELD); \
+ p->FIELD = p2->FIELD; \
p2->FIELD = 0
- COPYSTR(image_directory, "image_directory");
- COPYSTR(text_literal, "text_literal");
- COPYSTR(text_file, "text_file");
- COPYSTR(text_program, "text_program");
- COPYSTR(text_url, "text_url");
+ COPYSTR(image_directory);
+ COPYSTR(text_literal);
+ COPYSTR(text_file);
+ COPYSTR(text_program);
+ COPYSTR(text_url);
# undef COPYSTR
populate_prefs_page (s);
if (changed)
{
- sync_server_dpms_settings (GDK_DISPLAY(), p);
- changed = demo_write_init_file (s, p);
+ if (s->dpy)
+ sync_server_dpms_settings (s->dpy, p);
+ demo_write_init_file (s, p);
+
+ /* Tell the xscreensaver daemon to wake up and reload the init file,
+ in case the timeout has changed. Without this, it would wait
+ until the *old* timeout had expired before reloading. */
+ if (s->debug_p)
+ fprintf (stderr, "%s: command: DEACTIVATE\n", blurb());
+ if (s->dpy)
+ xscreensaver_command (s->dpy, XA_DEACTIVATE, 0, 0, 0);
}
- s->saving_p = False;
+ s->saving_p = FALSE;
+
return changed;
}
-/* Flush out any changes made in the popup dialog box (where changes
- take place only when the OK button is clicked.)
- */
-static Bool
-flush_popup_changes_and_save (state *s)
+/* Called when any field in the prefs dialog may have been changed.
+ Referenced by many items in demo.ui. */
+G_MODULE_EXPORT gboolean
+pref_changed_cb (GtkWidget *widget, gpointer user_data)
{
- Bool changed = False;
- saver_preferences *p = &s->prefs;
- int list_elt = selected_list_element (s);
-
- GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text"));
- GtkComboBoxEntry *vis = GTK_COMBO_BOX_ENTRY (name_to_widget (s, "visual_combo"));
- GtkEntry *visent = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (vis)));
-
- const char *visual = gtk_entry_get_text (visent);
- const char *command = gtk_entry_get_text (cmd);
-
- char c;
- unsigned long id;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
- if (s->saving_p) return False;
- s->saving_p = True;
-
- if (list_elt < 0)
- goto DONE;
-
- if (maybe_reload_init_file (s) != 0)
+ if (s->debug_p)
{
- changed = True;
- goto DONE;
+ if (s->flushing_p)
+ fprintf (stderr, "%s: (pref changed: %s)\n", blurb(),
+ gtk_widget_get_name (widget));
+ else
+ fprintf (stderr, "%s: pref changed: %s\n", blurb(),
+ gtk_widget_get_name (widget));
}
- /* Sanity-check and canonicalize whatever the user typed into the combo box.
- */
- if (!strcasecmp (visual, "")) visual = "";
- else if (!strcasecmp (visual, "any")) visual = "";
- else if (!strcasecmp (visual, "default")) visual = "Default";
- else if (!strcasecmp (visual, "default-n")) visual = "Default-N";
- else if (!strcasecmp (visual, "default-i")) visual = "Default-I";
- else if (!strcasecmp (visual, "best")) visual = "Best";
- else if (!strcasecmp (visual, "mono")) visual = "Mono";
- else if (!strcasecmp (visual, "monochrome")) visual = "Mono";
- else if (!strcasecmp (visual, "gray")) visual = "Gray";
- else if (!strcasecmp (visual, "grey")) visual = "Gray";
- else if (!strcasecmp (visual, "color")) visual = "Color";
- else if (!strcasecmp (visual, "gl")) visual = "GL";
- else if (!strcasecmp (visual, "staticgray")) visual = "StaticGray";
- else if (!strcasecmp (visual, "staticcolor")) visual = "StaticColor";
- else if (!strcasecmp (visual, "truecolor")) visual = "TrueColor";
- else if (!strcasecmp (visual, "grayscale")) visual = "GrayScale";
- else if (!strcasecmp (visual, "greyscale")) visual = "GrayScale";
- else if (!strcasecmp (visual, "pseudocolor")) visual = "PseudoColor";
- else if (!strcasecmp (visual, "directcolor")) visual = "DirectColor";
- else if (1 == sscanf (visual, " %lu %c", &id, &c)) ;
- else if (1 == sscanf (visual, " 0x%lx %c", &id, &c)) ;
- else
+ if (! s->flushing_p)
{
- gdk_beep (); /* unparsable */
- visual = "";
- gtk_entry_set_text (visent, _("Any"));
+ s->flushing_p = TRUE;
+ flush_dialog_changes_and_save (s);
+ s->flushing_p = FALSE;
}
+ return GDK_EVENT_PROPAGATE;
+}
- changed = flush_changes (s, list_elt, -1, command, visual);
- if (changed)
- {
- changed = demo_write_init_file (s, p);
-
- /* Do this to re-launch the hack if (and only if) the command line
- has changed. */
- populate_demo_window (s, selected_list_element (s));
- }
- DONE:
- s->saving_p = False;
- return changed;
+/* Same as pref_changed_cb but different. */
+G_MODULE_EXPORT gboolean
+pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ pref_changed_cb (widget, user_data);
+ return GDK_EVENT_PROPAGATE;
}
-G_MODULE_EXPORT void
-pref_changed_cb (GtkWidget *widget, gpointer user_data)
+/* Called when the timeout or DPMS spinbuttons are changed, by demo.ui.
+ */
+G_MODULE_EXPORT gboolean
+dpms_sanity_cb (GtkWidget *widget, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- if (! s->initializing_p)
- {
- s->initializing_p = True;
- flush_dialog_changes_and_save (s);
- s->initializing_p = False;
- }
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ Time timeout, standby, suspend, off;
+
+ if (s->flushing_p) return GDK_EVENT_PROPAGATE;
+ if (s->initializing_p) return GDK_EVENT_PROPAGATE;
+ if (! s->dpms_supported_p) return GDK_EVENT_PROPAGATE;
+
+ /* Read the current values from the four spinbuttons. */
+# define MINUTES(V,WIDGET) \
+ hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (win->WIDGET)), \
+ &(V), FALSE)
+ MINUTES (timeout, timeout_spinbutton);
+ MINUTES (standby, dpms_standby_spinbutton);
+ MINUTES (suspend, dpms_suspend_spinbutton);
+ MINUTES (off, dpms_off_spinbutton);
+# undef MINUTES
+
+ /* If the DPMS settings are non-zero, they must not go backwards:
+ standby >= timeout (screen saver activation)
+ suspend >= standby
+ off >= suspend
+ */
+# define MINUTES(V,LOWER,WIDGET) \
+ if ((V) != 0 && (V) < LOWER) \
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (win->WIDGET), \
+ (double) ((LOWER) + 59) / (60 * 1000))
+ MINUTES (standby, timeout, dpms_standby_spinbutton);
+ MINUTES (suspend, standby, dpms_suspend_spinbutton);
+ MINUTES (off, standby, dpms_off_spinbutton);
+ MINUTES (off, suspend, dpms_off_spinbutton);
+# undef MINUTES
+
+ return GDK_EVENT_PROPAGATE;
}
+
+/* Same as dpms_sanity_cb but different. */
G_MODULE_EXPORT gboolean
-pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+dpms_sanity_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
- pref_changed_cb (widget, user_data);
- return FALSE;
+ dpms_sanity_cb (widget, user_data);
+ return GDK_EVENT_PROPAGATE;
}
+
+
/* Callback on menu items in the "mode" options menu.
*/
G_MODULE_EXPORT void
mode_menu_item_cb (GtkWidget *widget, gpointer user_data)
{
- state *s = (state *) user_data;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
saver_preferences *p = &s->prefs;
- GtkWidget *list = name_to_widget (s, "list");
+ GtkWidget *list = win->list;
int list_elt;
int menu_index = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
saver_mode new_mode = mode_menu_order[menu_index];
+ if (s->flushing_p) return; /* Called as a spurious side-effect */
+ if (s->initializing_p) return;
+
+ if (s->debug_p) fprintf (stderr, "%s: mode menu\n", blurb());
+
/* Keep the same list element displayed as before; except if we're
switching *to* "one screensaver" mode from any other mode, set
"the one" to be that which is currently selected.
@@ -1851,7 +1639,8 @@ mode_menu_item_cb (GtkWidget *widget, gpointer user_data)
saver_mode old_mode = p->mode;
p->mode = new_mode;
populate_demo_window (s, list_elt);
- force_list_select_item (s, list, list_elt, True);
+ populate_popup_window (s);
+ force_list_select_item (s, list, list_elt, TRUE);
p->mode = old_mode; /* put it back, so the init file gets written */
}
@@ -1859,52 +1648,94 @@ mode_menu_item_cb (GtkWidget *widget, gpointer user_data)
}
+/* Remove the "random-same" item from the screen saver mode menu
+ (we don't display that unless there are multiple screens.)
+ */
+static void
+hide_mode_menu_random_same (state *s)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkComboBox *opt = GTK_COMBO_BOX (win->mode_menu);
+ GtkTreeModel *list = gtk_combo_box_get_model (opt);
+ unsigned int i;
+ for (i = 0; i < countof(mode_menu_order); i++)
+ {
+ if (mode_menu_order[i] == RANDOM_HACKS_SAME)
+ {
+ GtkTreeIter iter;
+ gtk_tree_model_iter_nth_child (list, &iter, NULL, i);
+ gtk_list_store_remove (GTK_LIST_STORE (list), &iter);
+ break;
+ }
+ }
+
+ /* recompute option-menu size */
+ gtk_widget_unrealize (GTK_WIDGET (opt));
+ gtk_widget_realize (GTK_WIDGET (opt));
+}
+
+
+/* Called when a new tab is selected. */
G_MODULE_EXPORT void
-switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page,
+switch_page_cb (GtkNotebook *notebook, GtkWidget *page,
gint page_num, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+
+ if (s->debug_p) fprintf (stderr, "%s: tab changed\n", blurb());
+ populate_prefs_page (s);
pref_changed_cb (GTK_WIDGET (notebook), user_data);
/* If we're switching to page 0, schedule the current hack to be run.
Otherwise, schedule it to stop. */
if (page_num == 0)
- populate_demo_window (s, selected_list_element (s));
+ {
+ populate_demo_window (s, selected_list_element (s));
+ populate_popup_window (s);
+ }
else
schedule_preview (s, 0);
}
-#ifdef HAVE_GTK2
+
+/* Called when a line is double-clicked in the saver list. */
static void
-list_activated_cb (GtkTreeView *list,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- gpointer data)
+list_activated_cb (GtkTreeView *list, GtkTreePath *path,
+ GtkTreeViewColumn *column, gpointer data)
{
state *s = data;
char *str;
int list_elt;
- if (gdk_pointer_is_grabbed()) return;
+ if (s->debug_p) fprintf (stderr, "%s: list activated\n", blurb());
+
+ /* I did this in Gtk 2 and I don't remember why:
+ if (gdk_pointer_is_grabbed()) return;
+ I don't understand how to use gdk_display_device_is_grabbed().
+ */
str = gtk_tree_path_to_string (path);
list_elt = strtol (str, NULL, 10);
g_free (str);
if (list_elt >= 0)
- run_hack (s, list_elt, True);
+ run_hack (s, list_elt, TRUE);
}
+/* Called when a line is selected/highlighted in the saver list. */
static void
list_select_changed_cb (GtkTreeSelection *selection, gpointer data)
{
- state *s = (state *)data;
+ state *s = (state *) data;
GtkTreeModel *model;
GtkTreeIter iter;
GtkTreePath *path;
char *str;
int list_elt;
+ if (s->debug_p) fprintf (stderr, "%s: list selection changed\n", blurb());
+
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
return;
@@ -1916,65 +1747,14 @@ list_select_changed_cb (GtkTreeSelection *selection, gpointer data)
g_free (str);
populate_demo_window (s, list_elt);
- flush_dialog_changes_and_save (s);
/* Re-populate the Settings window any time a new item is selected
- in the list, in case both windows are currently visible.
- */
+ in the list, in case both windows are currently visible. */
populate_popup_window (s);
-}
-
-#else /* !HAVE_GTK2 */
-
-static time_t last_doubleclick_time = 0; /* FMH! This is to suppress the
- list_select_cb that comes in
- *after* we've double-clicked.
- */
-
-static gint
-list_doubleclick_cb (GtkWidget *button, GdkEventButton *event,
- gpointer data)
-{
- state *s = (state *) data;
- if (event->type == GDK_2BUTTON_PRESS)
- {
- GtkList *list = GTK_LIST (name_to_widget (s, "list"));
- int list_elt = gtk_list_child_position (list, GTK_WIDGET (button));
-
- last_doubleclick_time = time ((time_t *) 0);
-
- if (list_elt >= 0)
- run_hack (s, list_elt, True);
- }
-
- return FALSE;
-}
-
-
-static void
-list_select_cb (GtkList *list, GtkWidget *child, gpointer data)
-{
- state *s = (state *) data;
- time_t now = time ((time_t *) 0);
- if (now >= last_doubleclick_time + 2)
- {
- int list_elt = gtk_list_child_position (list, GTK_WIDGET (child));
- populate_demo_window (s, list_elt);
- flush_dialog_changes_and_save (s);
- }
-}
-
-static void
-list_unselect_cb (GtkList *list, GtkWidget *child, gpointer data)
-{
- state *s = (state *) data;
- populate_demo_window (s, -1);
flush_dialog_changes_and_save (s);
}
-#endif /* !HAVE_GTK2 */
-
/* Called when the checkboxes that are in the left column of the
scrolling list are clicked. This both populates the right pane
@@ -1982,39 +1762,25 @@ list_unselect_cb (GtkList *list, GtkWidget *child, gpointer data)
also syncs this checkbox with the right pane Enabled checkbox.
*/
static void
-list_checkbox_cb (
-#ifdef HAVE_GTK2
- GtkCellRendererToggle *toggle,
- gchar *path_string,
-#else /* !HAVE_GTK2 */
- GtkWidget *cb,
-#endif /* !HAVE_GTK2 */
- gpointer data)
+list_checkbox_cb (GtkCellRendererToggle *toggle,
+ gchar *path_string, gpointer data)
{
state *s = (state *) data;
-#ifdef HAVE_GTK2
- GtkScrolledWindow *scroller =
- GTK_SCROLLED_WINDOW (name_to_widget (s, "scroller"));
- GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkScrolledWindow *scroller = GTK_SCROLLED_WINDOW (win->scroller);
+ GtkTreeView *list = GTK_TREE_VIEW (win->list);
GtkTreeModel *model = gtk_tree_view_get_model (list);
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
GtkTreeIter iter;
gboolean active;
-#else /* !HAVE_GTK2 */
- GtkWidget *line_hbox = GTK_WIDGET (cb)->parent;
- GtkWidget *line = GTK_WIDGET (line_hbox)->parent;
-
- GtkList *list = GTK_LIST (GTK_WIDGET (line)->parent);
- GtkViewport *vp = GTK_VIEWPORT (GTK_WIDGET (list)->parent);
- GtkScrolledWindow *scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
-#endif /* !HAVE_GTK2 */
GtkAdjustment *adj;
double scroll_top;
int list_elt;
-#ifdef HAVE_GTK2
+ if (s->debug_p) fprintf (stderr, "%s: list checkbox\n", blurb());
+
if (!gtk_tree_model_get_iter (model, &iter, path))
{
g_warning ("bad path: %s", path_string);
@@ -2031,17 +1797,15 @@ list_checkbox_cb (
-1);
list_elt = strtol (path_string, NULL, 10);
-#else /* !HAVE_GTK2 */
- list_elt = gtk_list_child_position (list, line);
-#endif /* !HAVE_GTK2 */
/* remember previous scroll position of the top of the list */
adj = gtk_scrolled_window_get_vadjustment (scroller);
- scroll_top = GET_ADJ_VALUE (adj);
+ scroll_top = gtk_adjustment_get_value (adj);
flush_dialog_changes_and_save (s);
- force_list_select_item (s, GTK_WIDGET (list), list_elt, False);
+ force_list_select_item (s, GTK_WIDGET (list), list_elt, FALSE);
populate_demo_window (s, list_elt);
+ populate_popup_window (s);
/* restore the previous scroll position of the top of the list.
this is weak, but I don't really know why it's moving... */
@@ -2049,373 +1813,538 @@ list_checkbox_cb (
}
-typedef struct {
- state *state;
- GtkFileSelection *widget;
-} file_selection_data;
-
-
-
+/* If the directory or URL does not have images in it, pop up a warning
+ dialog. This happens at startup, and is fast.
+ */
static void
-store_image_directory (GtkWidget *button, gpointer user_data)
+validate_image_directory_quick (state *s)
{
- file_selection_data *fsd = (file_selection_data *) user_data;
- state *s = fsd->state;
- GtkFileSelection *selector = fsd->widget;
- GtkWidget *top = s->toplevel_widget;
saver_preferences *p = &s->prefs;
- const char *path = gtk_file_selection_get_filename (selector);
+ char *warn = 0;
+ char buf[10240];
+
+ if (!p->random_image_p) return;
+
+ if (!p->image_directory || !*p->image_directory)
+ warn = _("Image directory is unset");
+ else if (!strncmp (p->image_directory, "http://", 7) ||
+ !strncmp (p->image_directory, "https://", 8))
+ warn = 0;
+ else if (!directory_p (p->image_directory))
+ warn = _("Image directory does not exist");
+ else if (!image_files_p (p->image_directory, 10))
+ warn = _("Image directory is empty");
+
+ if (!warn) return;
+
+ sprintf (buf,
+ _("%.100s:\n\n"
+ " %.100s\n\n"
+ "Select the 'Advanced' tab and choose a directory with some\n"
+ "pictures in it, or you're going to see a lot of boring colorbars!"),
+ warn,
+ (p->image_directory ? p->image_directory : ""));
+ warning_dialog (s->window, _("Warning"), buf);
+}
- if (p->image_directory && !strcmp(p->image_directory, path))
- return; /* no change */
- /* No warning for URLs. */
- if ((!directory_p (path)) && strncmp(path, "http://", 6))
- {
- char b[255];
- sprintf (b, _("Error:\n\n" "Directory does not exist: \"%s\"\n"), path);
- warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
- return;
- }
+/* "Cancel" button on the validate image directory progress dialog. */
+static void
+validate_image_directory_cancel_cb (GtkDialog *dialog, gint response_id,
+ gpointer user_data)
+{
+ Bool *closed = (Bool *) user_data;
+ *closed = TRUE;
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
- if (p->image_directory) free (p->image_directory);
- p->image_directory = normalize_directory (path);
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "image_text")),
- (p->image_directory ? p->image_directory : ""));
- demo_write_init_file (s, p);
+typedef struct {
+ GtkWidget *dialog;
+ int timer_id;
+} validate_timer_closure;
+
+static int
+validate_timer_show (gpointer data)
+{
+ validate_timer_closure *vtc = (validate_timer_closure *) data;
+ gtk_widget_show_all (vtc->dialog);
+ vtc->timer_id = 0;
+ return FALSE;
}
-static void
-store_text_file (GtkWidget *button, gpointer user_data)
+/* If the directory or URL does not have images in it, pop up a warning
+ dialog and return false. This happens when the imageDirectory preference
+ is edited, and might be slow.
+
+ It does this by running "xscreensaver-getimage-file", which has the side
+ effect of populating the image cache for that directory. Since that will
+ take a while if there are a lot of files, this also pops up a progress
+ dialog with a spinner in it, and a cancel button. That progress dialog
+ only pops up if the validation has already been running for a little
+ while, so that it doesn't flicker for small or pre-cached directories.
+ */
+static Bool
+validate_image_directory (state *s, const char *path)
{
- file_selection_data *fsd = (file_selection_data *) user_data;
- state *s = fsd->state;
- GtkFileSelection *selector = fsd->widget;
- GtkWidget *top = s->toplevel_widget;
- saver_preferences *p = &s->prefs;
- const char *path = gtk_file_selection_get_filename (selector);
+ validate_timer_closure vtc;
+ char buf[1024];
+ char err[1024];
+ GtkWidget *dialog, *content_area, *label, *spinner;
+ int margin = 32;
+ Bool closed_p = FALSE;
+
+ dialog = gtk_dialog_new_with_buttons (_("XScreenSaver Image Cache"),
+ s->window,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ _("_Cancel"), GTK_RESPONSE_CLOSE,
+ NULL);
+
+ sprintf (buf, _("Populating image cache for \"%.100s\"..."), path);
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ label = gtk_label_new (buf);
+
+ gtk_widget_set_margin_start (label, margin);
+ gtk_widget_set_margin_end (label, margin);
+ gtk_widget_set_margin_top (label, margin);
+ gtk_widget_set_margin_bottom (label, margin / 2);
+ gtk_container_add (GTK_CONTAINER (content_area), label);
+
+ spinner = gtk_spinner_new();
+ gtk_spinner_start (GTK_SPINNER (spinner));
+ gtk_container_add (GTK_CONTAINER (content_area), spinner);
+ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (validate_image_directory_cancel_cb),
+ &closed_p);
+ g_signal_connect (dialog, "close",
+ G_CALLBACK (validate_image_directory_cancel_cb),
+ &closed_p);
+
+ /* Only pop up the dialog box with the spinner if this has already taken
+ a little while, so that if it completes immediately, we don't flicker.
+ */
+ vtc.dialog = dialog;
+ vtc.timer_id = g_timeout_add (1000, validate_timer_show, &vtc);
- if (p->text_file && !strcmp(p->text_file, path))
- return; /* no change */
+ while (gtk_events_pending ()) /* Paint the window now. */
+ gtk_main_iteration ();
- if (!file_p (path))
- {
- char b[255];
- sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
- warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
- return;
- }
+ {
+ pid_t forked;
+ int fds [2];
+ int in, out;
- if (p->text_file) free (p->text_file);
- p->text_file = normalize_directory (path);
+ char *av[10];
+ int ac = 0;
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_file_entry")),
- (p->text_file ? p->text_file : ""));
- demo_write_init_file (s, p);
-}
+ *err = 0;
+ av[ac++] = "xscreensaver-getimage-file";
+ av[ac++] = (char *) path;
+ av[ac] = 0;
+ if (pipe (fds))
+ {
+ strcpy (err, "error creating pipe");
+ goto FAIL;
+ }
-static void
-store_text_program (GtkWidget *button, gpointer user_data)
-{
- file_selection_data *fsd = (file_selection_data *) user_data;
- state *s = fsd->state;
- GtkFileSelection *selector = fsd->widget;
- /*GtkWidget *top = s->toplevel_widget;*/
- saver_preferences *p = &s->prefs;
- const char *path = gtk_file_selection_get_filename (selector);
+ in = fds [0];
+ out = fds [1];
- if (p->text_program && !strcmp(p->text_program, path))
- return; /* no change */
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ strcpy (err, "couldn't fork");
+ goto FAIL;
+ }
+ case 0: /* Child fork */
+ {
+ int stderr_fd = 2;
-# if 0
- if (!file_p (path))
- {
- char b[255];
- sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
- warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
- return;
- }
-# endif
+ close (in); /* don't need this one */
+ if (! s->debug_p)
+ close (fileno (stdout));
+ close (ConnectionNumber (s->dpy)); /* close display fd */
- if (p->text_program) free (p->text_program);
- p->text_program = normalize_directory (path);
+ if (dup2 (out, stderr_fd) < 0) /* pipe stdout */
+ {
+ perror ("could not dup() a new stderr:");
+ exit (1);
+ }
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_program_entry")),
- (p->text_program ? p->text_program : ""));
- demo_write_init_file (s, p);
-}
+ execvp (av[0], av); /* shouldn't return. */
+ sprintf (buf, "%s: running %s", blurb(), av[0]);
+ perror (buf);
+ /* Note that one must use _exit() instead of exit() in procs forked
+ off of Gtk programs -- Gtk installs an atexit handler that has a
+ copy of the X connection (which we've already closed, for safety.)
+ If one uses exit() instead of _exit(), then one sometimes gets a
+ spurious "Gdk-ERROR: Fatal IO error on X server" error message.
+ */
+ _exit (1); /* exits fork */
+ break;
+ }
+ default: /* Parent fork */
+ {
+ char *ss = err;
+ int bufsiz = sizeof(err);
-static void
-browse_image_dir_cancel (GtkWidget *button, gpointer user_data)
-{
- file_selection_data *fsd = (file_selection_data *) user_data;
- gtk_widget_hide (GTK_WIDGET (fsd->widget));
-}
+ close (out); /* don't need this one */
-static void
-browse_image_dir_ok (GtkWidget *button, gpointer user_data)
-{
- browse_image_dir_cancel (button, user_data);
- store_image_directory (button, user_data);
-}
+ if (s->debug_p)
+ fprintf (stderr, "%s: forked %s\n", blurb(), av[0]);
-static void
-browse_text_file_ok (GtkWidget *button, gpointer user_data)
-{
- browse_image_dir_cancel (button, user_data);
- store_text_file (button, user_data);
-}
+ while (1)
+ {
+ fd_set rset;
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 1000000 / 10; /* Repaint widgets at 10 fps */
+ FD_ZERO (&rset);
+ FD_SET (in, &rset);
+ if (0 < select (in+1, &rset, 0, 0, &tv))
+ {
+ int n = read (in, (void *) ss, bufsiz);
+ if (n <= 0)
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: %s: read EOF\n", blurb(), av[0]);
+ break;
+ }
+ else
+ {
+ ss += n;
+ bufsiz -= n;
+ *ss = 0;
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: %s: read: \"%s\"\n", blurb(),
+ av[0], ss - n);
+ }
+ }
-static void
-browse_text_program_ok (GtkWidget *button, gpointer user_data)
-{
- browse_image_dir_cancel (button, user_data);
- store_text_program (button, user_data);
-}
+ /* Service Gtk events and timers */
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
-static void
-browse_image_dir_close (GtkWidget *widget, GdkEvent *event, gpointer user_data)
-{
- browse_image_dir_cancel (widget, user_data);
-}
+ if (closed_p)
+ {
+ kill (forked, SIGTERM);
+ if (s->debug_p)
+ fprintf (stderr, "%s: cancel\n", blurb());
+ break;
+ }
+ }
-G_MODULE_EXPORT void
-browse_image_dir_cb (GtkButton *button, gpointer user_data)
-{
- state *s = global_state_kludge; /* I hate C so much... */
- saver_preferences *p = &s->prefs;
- static file_selection_data *fsd = 0;
+ *ss = 0;
+ close (in);
- GtkFileSelection *selector = GTK_FILE_SELECTION(
- gtk_file_selection_new ("Please select the image directory."));
+ if (s->debug_p)
+ fprintf (stderr, "%s: %s exited\n", blurb(), av[0]);
- if (!fsd)
- fsd = (file_selection_data *) malloc (sizeof (*fsd));
+ /* Wait for the child to die. */
+ {
+ int wait_status = 0;
+ waitpid (-1, &wait_status, 0);
+ }
+ }
+ }
+ }
- fsd->widget = selector;
- fsd->state = s;
+ if (vtc.timer_id) /* Remove the popup timer if it hasn't fired. */
+ g_source_remove (vtc.timer_id);
- if (p->image_directory && *p->image_directory)
- gtk_file_selection_set_filename (selector, p->image_directory);
+ if (s->debug_p)
+ fprintf (stderr, "%s: dismiss\n", blurb());
- gtk_signal_connect (GTK_OBJECT (selector->ok_button),
- "clicked", GTK_SIGNAL_FUNC (browse_image_dir_ok),
- (gpointer *) fsd);
- gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
- "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
- (gpointer *) fsd);
- gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
- GTK_SIGNAL_FUNC (browse_image_dir_close),
- (gpointer *) fsd);
+ if (! closed_p)
+ gtk_widget_destroy (dialog);
- gtk_widget_set_sensitive (GTK_WIDGET (selector->file_list), False);
+ FAIL:
+ if (*err)
+ {
+ warning_dialog (s->window, _("Warning"), err);
+ return FALSE;
+ }
- gtk_window_set_modal (GTK_WINDOW (selector), True);
- gtk_widget_show (GTK_WIDGET (selector));
+ return TRUE;
}
-G_MODULE_EXPORT void
-browse_text_file_cb (GtkButton *button, gpointer user_data)
+/* Called when the imageDirectory text field is edited directly (focus-out).
+ */
+G_MODULE_EXPORT gboolean
+image_text_pref_changed_event_cb (GtkWidget *widget, GdkEvent *event,
+ gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
+#if 0 /* This is handled in flush_dialog_changes_and_save now */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
saver_preferences *p = &s->prefs;
- static file_selection_data *fsd = 0;
-
- GtkFileSelection *selector = GTK_FILE_SELECTION(
- gtk_file_selection_new ("Please select a text file."));
-
- if (!fsd)
- fsd = (file_selection_data *) malloc (sizeof (*fsd));
-
- fsd->widget = selector;
- fsd->state = s;
+ GtkEntry *w = GTK_ENTRY (win->image_text);
+ const char *str = gtk_entry_get_text (w);
+ char *path = pathname_tilde (str, TRUE, TRUE);
- if (p->text_file && *p->text_file)
- gtk_file_selection_set_filename (selector, p->text_file);
+ if (s->debug_p) fprintf (stderr, "%s: imagedir text edited\n", blurb());
- gtk_signal_connect (GTK_OBJECT (selector->ok_button),
- "clicked", GTK_SIGNAL_FUNC (browse_text_file_ok),
- (gpointer *) fsd);
- gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
- "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
- (gpointer *) fsd);
- gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
- GTK_SIGNAL_FUNC (browse_image_dir_close),
- (gpointer *) fsd);
+ if (p->image_directory && strcmp(p->image_directory, path))
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: imagedir validating \"%s\" -> \"%s\"\n", blurb(),
+ p->image_directory, path);
+ if (! validate_image_directory (s, path))
+ {
+ /* Don't save the bad new value into the preferences. */
+ free (path);
+ return GDK_EVENT_PROPAGATE;
+ }
+ }
- gtk_window_set_modal (GTK_WINDOW (selector), True);
- gtk_widget_show (GTK_WIDGET (selector));
+ free (path);
+# endif
+ pref_changed_event_cb (widget, event, user_data);
+ return GDK_EVENT_PROPAGATE;
}
-G_MODULE_EXPORT void
-browse_text_program_cb (GtkButton *button, gpointer user_data)
+/* Run a modal file selector dialog.
+ Select a file, directory, or program.
+ Normalize the resultant path and store it into the string pointer.
+ Also update the text field with the new path.
+ Returns true if any changes made.
+ */
+gboolean
+file_chooser (GtkWindow *parent, GtkEntry *entry, char **retP,
+ const char *title, gboolean verbose_p,
+ gboolean dir_p, gboolean program_p)
{
- state *s = global_state_kludge; /* I hate C so much... */
- saver_preferences *p = &s->prefs;
- static file_selection_data *fsd = 0;
-
- GtkFileSelection *selector = GTK_FILE_SELECTION(
- gtk_file_selection_new ("Please select a text-generating program."));
+ gint res;
+ gboolean changed_p = FALSE;
+ GtkWidget *dialog =
+ gtk_file_chooser_dialog_new (title, parent,
+ (dir_p
+ ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
+ : GTK_FILE_CHOOSER_ACTION_OPEN),
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Select"), GTK_RESPONSE_ACCEPT,
+ NULL);
+ const char *old = gtk_entry_get_text (entry); /* not *retP */
+
+ if (*old)
+ {
+ char *p2 = pathname_tilde (old, FALSE, dir_p);
+ GFile *gf;
- if (!fsd)
- fsd = (file_selection_data *) malloc (sizeof (*fsd));
+ /* If it's a command line and it begins with an absolute path,
+ default to that file and its directory. */
+ if (program_p && (*p2 == '/' || *p2 == '~'))
+ {
+ char *s = strpbrk (p2, " \t\r\n");
+ if (s) *s = 0;
+ program_p = FALSE;
+ }
- fsd->widget = selector;
- fsd->state = s;
+ gf = g_file_new_for_path (p2);
+ if (! program_p)
+ {
+ gtk_file_chooser_set_file (GTK_FILE_CHOOSER (dialog), gf, NULL);
+ if (verbose_p)
+ fprintf (stderr, "%s: chooser: default \"%s\"\n", blurb(), p2);
+ }
+ free (p2);
+ g_object_unref (gf);
+ }
- if (p->text_program && *p->text_program)
- gtk_file_selection_set_filename (selector, p->text_program);
+ res = gtk_dialog_run (GTK_DIALOG (dialog));
+ if (res == GTK_RESPONSE_ACCEPT)
+ {
+ GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
+ char *str = gtk_file_chooser_get_filename (chooser);
+ char *path = pathname_tilde (str, TRUE, dir_p);
+ g_free (str);
- gtk_signal_connect (GTK_OBJECT (selector->ok_button),
- "clicked", GTK_SIGNAL_FUNC (browse_text_program_ok),
- (gpointer *) fsd);
- gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
- "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
- (gpointer *) fsd);
- gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
- GTK_SIGNAL_FUNC (browse_image_dir_close),
- (gpointer *) fsd);
+ if (*retP && !strcmp (*retP, path))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: chooser: unchanged\n", blurb());
+ free (path); /* no change */
+ }
+ else if (dir_p && !directory_p (path))
+ {
+ char b[255];
+ sprintf (b, _("Directory does not exist: \"%.100s\"\n"), path);
+ warning_dialog (parent, _("Error"), b);
+ free (path); /* no change */
+ }
+ else if (!dir_p && !file_p (path))
+ {
+ char b[255];
+ sprintf (b, _("File does not exist: \"%.100s\"\n"), path);
+ warning_dialog (parent, _("Error"), b);
+ free (path); /* no change */
+ }
+ else
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: chooser: \"%s\" -> \"%s\n",
+ blurb(), *retP, path);
+ if (*retP) free (*retP);
+ *retP = path;
+ gtk_entry_set_text (entry, path);
+ changed_p = TRUE;
+ }
+ }
+ else if (verbose_p)
+ fprintf (stderr, "%s: chooser: cancelled\n", blurb());
- gtk_window_set_modal (GTK_WINDOW (selector), True);
- gtk_widget_show (GTK_WIDGET (selector));
+ gtk_widget_destroy (dialog);
+ return changed_p;
}
+/* The "Browse" button next to the imageDirectory text field. */
G_MODULE_EXPORT void
-preview_theme_cb (GtkWidget *w, gpointer user_data)
+browse_image_dir_cb (GtkButton *button, gpointer user_data)
{
- if (system ("xscreensaver-auth --splash &") < 0)
- fprintf (stderr, "%s: splash exec failed\n", blurb());
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ saver_preferences *p = &s->prefs;
+ char *old = strdup (p->image_directory);
+
+ if (s->debug_p) fprintf (stderr, "%s: imagedir browse button\n", blurb());
+ if (file_chooser (GTK_WINDOW (win),
+ GTK_ENTRY (win->image_text),
+ &p->image_directory,
+ _("Please select the image directory."),
+ s->debug_p, TRUE, FALSE))
+ {
+ if (validate_image_directory (s, p->image_directory))
+ demo_write_init_file (s, p);
+ else
+ {
+ /* Don't save the bad new value into the preferences. */
+ free (p->image_directory);
+ p->image_directory = old;
+ old = 0;
+ }
+ }
+
+ if (old) free (old);
}
+/* The "Browse" button next to the textFile text field. */
G_MODULE_EXPORT void
-settings_cb (GtkButton *button, gpointer user_data)
+browse_text_file_cb (GtkButton *button, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- int list_elt = selected_list_element (s);
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ saver_preferences *p = &s->prefs;
- populate_demo_window (s, list_elt); /* reset the widget */
- populate_popup_window (s); /* create UI on popup window */
- gtk_widget_show (s->popup_widget);
+ if (s->debug_p) fprintf (stderr, "%s: textfile browse button\n", blurb());
+ if (file_chooser (GTK_WINDOW (win),
+ GTK_ENTRY (win->text_file_entry),
+ &p->text_file,
+ _("Please select a text file."),
+ s->debug_p, FALSE, FALSE))
+ demo_write_init_file (s, p);
}
-static void
-settings_sync_cmd_text (state *s)
-{
-# ifdef HAVE_XML
- GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
- char *cmd_line = get_configurator_command_line (s->cdata, False);
- gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
- gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line));
- free (cmd_line);
-# endif /* HAVE_XML */
-}
+/* The "Browse" button next to the textProgram text field. */
G_MODULE_EXPORT void
-settings_adv_cb (GtkButton *button, gpointer user_data)
+browse_text_program_cb (GtkButton *button, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- GtkNotebook *notebook =
- GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ saver_preferences *p = &s->prefs;
- settings_sync_cmd_text (s);
- gtk_notebook_set_page (notebook, 1);
+ if (s->debug_p) fprintf (stderr, "%s: textprogram browse button\n", blurb());
+ if (file_chooser (GTK_WINDOW (win),
+ GTK_ENTRY (win->text_program_entry),
+ &p->text_program,
+ _("Please select a text-generating program."),
+ s->debug_p, FALSE, TRUE))
+ demo_write_init_file (s, p);
}
-G_MODULE_EXPORT void
-settings_std_cb (GtkButton *button, gpointer user_data)
-{
- state *s = global_state_kludge; /* I hate C so much... */
- GtkNotebook *notebook =
- GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
-
- /* Re-create UI to reflect the in-progress command-line settings. */
- populate_popup_window (s);
-
- gtk_notebook_set_page (notebook, 0);
-}
+/* The "Preview" button next to the Theme option menu. */
G_MODULE_EXPORT void
-settings_reset_cb (GtkButton *button, gpointer user_data)
+preview_theme_cb (GtkWidget *w, gpointer user_data)
{
-# ifdef HAVE_XML
- state *s = global_state_kludge; /* I hate C so much... */
- GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
- char *cmd_line = get_configurator_command_line (s->cdata, True);
- gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
- gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line));
- free (cmd_line);
- populate_popup_window (s);
-# endif /* HAVE_XML */
-}
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ int ac = 0;
+ char *av[10];
-G_MODULE_EXPORT void
-settings_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page,
- gint page_num, gpointer user_data)
-{
- state *s = global_state_kludge; /* I hate C so much... */
- GtkWidget *adv = name_to_widget (s, "adv_button");
- GtkWidget *std = name_to_widget (s, "std_button");
+ if (s->debug_p) fprintf (stderr, "%s: preview theme button\n", blurb());
- if (page_num == 0)
- {
- gtk_widget_show (adv);
- gtk_widget_hide (std);
- }
- else if (page_num == 1)
- {
- gtk_widget_hide (adv);
- gtk_widget_show (std);
- }
- else
- abort();
+ /* Settings button is disabled with --splash --splash so that we don't
+ end up with two copies of xscreensaver-settings running. */
+ av[ac++] = "xscreensaver-auth";
+ av[ac++] = "--splash";
+ av[ac++] = "--splash";
+ av[ac] = 0;
+ fork_and_exec (s, ac, av);
}
-
+/* The "Settings" button on the main page. */
G_MODULE_EXPORT void
-settings_cancel_cb (GtkButton *button, gpointer user_data)
+settings_cb (GtkButton *button, gpointer user_data)
{
- state *s = global_state_kludge; /* I hate C so much... */
- gtk_widget_hide (s->popup_widget);
-}
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data);
+ state *s = &win->state;
+ saver_preferences *p = &s->prefs;
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
+ int list_elt = selected_list_element (s);
-G_MODULE_EXPORT void
-settings_ok_cb (GtkButton *button, gpointer user_data)
-{
- state *s = global_state_kludge; /* I hate C so much... */
- GtkNotebook *notebook = GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
- int page = gtk_notebook_get_current_page (notebook);
+ if (s->debug_p) fprintf (stderr, "%s: settings button\n", blurb());
- if (page == 0)
- /* Regenerate the command-line from the widget contents before saving.
- But don't do this if we're looking at the command-line page already,
- or we will blow away what they typed... */
- settings_sync_cmd_text (s);
+ populate_demo_window (s, list_elt); /* reset the widget */
+ populate_popup_window (s); /* create UI on popup window */
- flush_popup_changes_and_save (s);
- gtk_widget_hide (s->popup_widget);
-}
+ /* Pre-select the "Standard" page. */
+ settings_std_cb (NULL, s->dialog);
+ settings_switch_page_cb (GTK_NOTEBOOK (dialog->opt_notebook), NULL, 0,
+ s->dialog);
-static gboolean
-wm_popup_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- state *s = (state *) data;
- settings_cancel_cb (0, (gpointer) s);
- return TRUE;
+ /* If there is no saved position for the dialog, position it to the
+ right of the main window. See also restore_window_position(),
+ which already ran at startup. */
+ {
+ int win_x, win_y, dialog_x, dialog_y;
+ char dummy;
+ char *old = p->settings_geom;
+
+ if (!old || !*old ||
+ 4 != sscanf (old, " %d , %d %d , %d %c",
+ &win_x, &win_y, &dialog_x, &dialog_y, &dummy))
+ win_x = win_y = dialog_x = dialog_y = -1;
+
+ if (dialog_x <= 0 && dialog_y <= 0)
+ {
+ int win_w, win_h;
+ gtk_window_get_position (GTK_WINDOW (s->window), &win_x, &win_y);
+ gtk_window_get_size (GTK_WINDOW (s->window), &win_w, &win_h);
+ dialog_x = win_x + win_w + 8;
+ dialog_y = win_y;
+ gtk_window_move (GTK_WINDOW (s->dialog), dialog_x, dialog_y);
+ }
+ }
+
+ gtk_widget_show (GTK_WIDGET (s->dialog));
}
-
/* Populating the various widgets
*/
@@ -2423,18 +2352,18 @@ wm_popup_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
/* Returns the number of the last hack run by the server.
*/
static int
-server_current_hack (void)
+server_current_hack (state *s)
{
Atom type;
int format;
unsigned long nitems, bytesafter;
unsigned char *dataP = 0;
- Display *dpy = GDK_DISPLAY();
int hack_number = -1;
- if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */
+ if (!s->dpy) return hack_number;
+ if (XGetWindowProperty (s->dpy, RootWindow(s->dpy, 0), /* always screen #0 */
XA_SCREENSAVER_STATUS,
- 0, 3, False, XA_INTEGER,
+ 0, 3, FALSE, XA_INTEGER,
&type, &format, &nitems, &bytesafter,
&dataP)
== Success
@@ -2458,13 +2387,14 @@ server_current_hack (void)
static void
scroll_to_current_hack (state *s)
{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
saver_preferences *p = &s->prefs;
int hack_number = -1;
if (p->mode == ONE_HACK) /* in "one" mode, use the one */
hack_number = p->selected_hack;
if (hack_number < 0) /* otherwise, use the last-run */
- hack_number = server_current_hack ();
+ hack_number = server_current_hack (s);
if (hack_number < 0) /* failing that, last "one mode" */
hack_number = p->selected_hack;
if (hack_number < 0) /* failing that, newest hack. */
@@ -2489,9 +2419,10 @@ scroll_to_current_hack (state *s)
if (hack_number >= 0 && hack_number < p->screenhacks_count)
{
int list_elt = s->hack_number_to_list_elt[hack_number];
- GtkWidget *list = name_to_widget (s, "list");
- force_list_select_item (s, list, list_elt, True);
+ GtkWidget *list = win->list;
+ force_list_select_item (s, list, list_elt, TRUE);
populate_demo_window (s, list_elt);
+ populate_popup_window (s);
}
}
@@ -2499,10 +2430,8 @@ scroll_to_current_hack (state *s)
static void
populate_hack_list (state *s)
{
- Display *dpy = GDK_DISPLAY();
-#ifdef HAVE_GTK2
saver_preferences *p = &s->prefs;
- GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ GtkTreeView *list = GTK_TREE_VIEW (XSCREENSAVER_WINDOW (s->window)->list);
GtkListStore *model;
GtkTreeSelection *selection;
GtkCellRenderer *ren;
@@ -2560,7 +2489,7 @@ populate_hack_list (state *s)
pretty_name = (hack->name
? strdup (hack->name)
- : make_hack_name (dpy, hack->command));
+ : make_hack_name (s->dpy, hack->command));
if (!available_p)
{
@@ -2568,16 +2497,15 @@ populate_hack_list (state *s)
(but don't actually make it be insensitive, since we still
want to be able to click on it.)
*/
- GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (list));
- GdkColor *fg = &style->fg[GTK_STATE_INSENSITIVE];
- /* GdkColor *bg = &style->bg[GTK_STATE_INSENSITIVE]; */
+ GtkStyleContext *c =
+ gtk_widget_get_style_context (GTK_WIDGET (list));
+ GdkRGBA fg;
char *buf = (char *) malloc (strlen (pretty_name) + 100);
-
- sprintf (buf, "<span foreground=\"#%02X%02X%02X\""
- /* " background=\"#%02X%02X%02X\"" */
- ">%s</span>",
- fg->red >> 8, fg->green >> 8, fg->blue >> 8,
- /* bg->red >> 8, bg->green >> 8, bg->blue >> 8, */
+ gtk_style_context_get_color (c, GTK_STATE_FLAG_INSENSITIVE, &fg);
+ sprintf (buf, "<span foreground=\"#%02X%02X%02X\">%s</span>",
+ (unsigned int) (0xFF * fg.red),
+ (unsigned int) (0xFF * fg.green),
+ (unsigned int) (0xFF * fg.blue),
pretty_name);
free (pretty_name);
pretty_name = buf;
@@ -2590,107 +2518,13 @@ populate_hack_list (state *s)
-1);
free (pretty_name);
}
-
-#else /* !HAVE_GTK2 */
-
- saver_preferences *p = &s->prefs;
- GtkList *list = GTK_LIST (name_to_widget (s, "list"));
- int i;
- for (i = 0; i < s->list_count; i++)
- {
- int hack_number = s->list_elt_to_hack_number[i];
- screenhack *hack = (hack_number < 0 ? 0 : p->screenhacks[hack_number]);
-
- /* A GtkList must contain only GtkListItems, but those can contain
- an arbitrary widget. We add an Hbox, and inside that, a Checkbox
- and a Label. We handle single and double click events on the
- line itself, for clicking on the text, but the interior checkbox
- also handles its own events.
- */
- GtkWidget *line;
- GtkWidget *line_hbox;
- GtkWidget *line_check;
- GtkWidget *line_label;
- char *pretty_name;
- Bool available_p = (hack && s->hacks_available_p [hack_number]);
-
- if (!hack) continue;
-
- /* If we're to suppress uninstalled hacks, check $PATH now. */
- if (p->ignore_uninstalled_p && !available_p)
- continue;
-
- pretty_name = (hack->name
- ? strdup (hack->name)
- : make_hack_name (hack->command));
-
- line = gtk_list_item_new ();
- line_hbox = gtk_hbox_new (FALSE, 0);
- line_check = gtk_check_button_new ();
- line_label = gtk_label_new (pretty_name);
-
- gtk_container_add (GTK_CONTAINER (line), line_hbox);
- gtk_box_pack_start (GTK_BOX (line_hbox), line_check, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (line_hbox), line_label, FALSE, FALSE, 0);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (line_check),
- hack->enabled_p);
- gtk_label_set_justify (GTK_LABEL (line_label), GTK_JUSTIFY_LEFT);
-
- gtk_widget_show (line_check);
- gtk_widget_show (line_label);
- gtk_widget_show (line_hbox);
- gtk_widget_show (line);
-
- free (pretty_name);
-
- gtk_container_add (GTK_CONTAINER (list), line);
- gtk_signal_connect (GTK_OBJECT (line), "button_press_event",
- GTK_SIGNAL_FUNC (list_doubleclick_cb),
- (gpointer) s);
-
- gtk_signal_connect (GTK_OBJECT (line_check), "toggled",
- GTK_SIGNAL_FUNC (list_checkbox_cb),
- (gpointer) s);
-
- gtk_widget_show (line);
-
- if (!available_p)
- {
- /* Make the widget be colored like insensitive widgets
- (but don't actually make it be insensitive, since we
- still want to be able to click on it.)
- */
- GtkRcStyle *rc_style;
- GdkColor fg, bg;
-
- gtk_widget_realize (GTK_WIDGET (line_label));
-
- fg = GTK_WIDGET (line_label)->style->fg[GTK_STATE_INSENSITIVE];
- bg = GTK_WIDGET (line_label)->style->bg[GTK_STATE_INSENSITIVE];
-
- rc_style = gtk_rc_style_new ();
- rc_style->fg[GTK_STATE_NORMAL] = fg;
- rc_style->bg[GTK_STATE_NORMAL] = bg;
- rc_style->color_flags[GTK_STATE_NORMAL] |= GTK_RC_FG|GTK_RC_BG;
-
- gtk_widget_modify_style (GTK_WIDGET (line_label), rc_style);
- gtk_rc_style_unref (rc_style);
- }
- }
-
- gtk_signal_connect (GTK_OBJECT (list), "select_child",
- GTK_SIGNAL_FUNC (list_select_cb),
- (gpointer) s);
- gtk_signal_connect (GTK_OBJECT (list), "unselect_child",
- GTK_SIGNAL_FUNC (list_unselect_cb),
- (gpointer) s);
-#endif /* !HAVE_GTK2 */
}
+
static void
update_list_sensitivity (state *s)
{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
saver_preferences *p = &s->prefs;
Bool sensitive = (p->mode == RANDOM_HACKS ||
p->mode == RANDOM_HACKS_SAME ||
@@ -2699,73 +2533,32 @@ update_list_sensitivity (state *s)
p->mode == RANDOM_HACKS_SAME);
Bool blankable = (p->mode != DONT_BLANK);
-#ifndef HAVE_GTK2
- GtkWidget *head = name_to_widget (s, "col_head_hbox");
- GtkWidget *use = name_to_widget (s, "use_col_frame");
-#endif /* HAVE_GTK2 */
- GtkWidget *scroller = name_to_widget (s, "scroller");
- GtkWidget *buttons = name_to_widget (s, "next_prev_hbox");
- GtkWidget *blanker = name_to_widget (s, "blanking_table");
-
-#ifdef HAVE_GTK2
- GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ GtkTreeView *list = GTK_TREE_VIEW (win->list);
GtkTreeViewColumn *use = gtk_tree_view_get_column (list, COL_ENABLED);
-#else /* !HAVE_GTK2 */
- GtkList *list = GTK_LIST (name_to_widget (s, "list"));
- GList *kids = gtk_container_children (GTK_CONTAINER (list));
-
- gtk_widget_set_sensitive (GTK_WIDGET (head), sensitive);
-#endif /* !HAVE_GTK2 */
- gtk_widget_set_sensitive (GTK_WIDGET (scroller), sensitive);
- gtk_widget_set_sensitive (GTK_WIDGET (buttons), sensitive);
- gtk_widget_set_sensitive (GTK_WIDGET (blanker), blankable);
-
-#ifdef HAVE_GTK2
+ gtk_widget_set_sensitive (GTK_WIDGET (win->scroller), sensitive);
+ gtk_widget_set_sensitive (GTK_WIDGET (win->next_prev_hbox), sensitive);
+ gtk_widget_set_sensitive (GTK_WIDGET (win->blanking_table), blankable);
gtk_tree_view_column_set_visible (use, checkable);
-#else /* !HAVE_GTK2 */
- if (checkable)
- gtk_widget_show (use); /* the "Use" column header */
- else
- gtk_widget_hide (use);
-
- while (kids)
- {
- GtkBin *line = GTK_BIN (kids->data);
- GtkContainer *line_hbox = GTK_CONTAINER (line->child);
- GtkWidget *line_check =
- GTK_WIDGET (gtk_container_children (line_hbox)->data);
-
- if (checkable)
- gtk_widget_show (line_check);
- else
- gtk_widget_hide (line_check);
-
- kids = kids->next;
- }
-#endif /* !HAVE_GTK2 */
}
static void
populate_prefs_page (state *s)
{
- Display *dpy = GDK_DISPLAY();
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
saver_preferences *p = &s->prefs;
- Bool can_lock_p = True;
+ Bool can_lock_p = TRUE;
- /* Disable all the "lock" controls if locking support was not provided
- at compile-time, or if running on MacOS. */
-# if defined(NO_LOCKING) || defined(__APPLE__)
- can_lock_p = False;
+# ifdef NO_LOCKING
+ can_lock_p = FALSE;
# endif
-
/* If there is only one screen, the mode menu contains
"random" but not "random-same".
*/
- if (s->nscreens <= 1 && p->mode == RANDOM_HACKS_SAME)
+ if (!s->multi_screen_p && p->mode == RANDOM_HACKS_SAME)
p->mode = RANDOM_HACKS;
@@ -2780,108 +2573,100 @@ populate_prefs_page (state *s)
# undef THROTTLE
# define FMT_MINUTES(NAME,N) \
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (name_to_widget (s, (NAME))), (double)((N) + 59) / (60 * 1000))
-
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (win->NAME), \
+ (double) ((N) + 59) / (60 * 1000))
# define FMT_SECONDS(NAME,N) \
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (name_to_widget (s, (NAME))), (double)((N) / 1000))
-
- FMT_MINUTES ("timeout_spinbutton", p->timeout);
- FMT_MINUTES ("cycle_spinbutton", p->cycle);
- FMT_MINUTES ("lock_spinbutton", p->lock_timeout);
- FMT_MINUTES ("dpms_standby_spinbutton", p->dpms_standby);
- FMT_MINUTES ("dpms_suspend_spinbutton", p->dpms_suspend);
- FMT_MINUTES ("dpms_off_spinbutton", p->dpms_off);
- FMT_SECONDS ("fade_spinbutton", p->fade_seconds);
-
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (win->NAME), \
+ (double) ((N) / 1000))
+
+ FMT_MINUTES (timeout_spinbutton, p->timeout);
+ FMT_MINUTES (cycle_spinbutton, p->cycle);
+ FMT_MINUTES (lock_spinbutton, p->lock_timeout);
+ FMT_MINUTES (dpms_standby_spinbutton, p->dpms_standby);
+ FMT_MINUTES (dpms_suspend_spinbutton, p->dpms_suspend);
+ FMT_MINUTES (dpms_off_spinbutton, p->dpms_off);
+ FMT_SECONDS (fade_spinbutton, p->fade_seconds);
# undef FMT_MINUTES
# undef FMT_SECONDS
# define TOGGLE_ACTIVE(NAME,ACTIVEP) \
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (name_to_widget (s,(NAME))),\
- (ACTIVEP))
-
- TOGGLE_ACTIVE ("lock_button", p->lock_p);
-#if 0
- TOGGLE_ACTIVE ("verbose_button", p->verbose_p);
- TOGGLE_ACTIVE ("splash_button", p->splash_p);
-#endif
- TOGGLE_ACTIVE ("dpms_button", p->dpms_enabled_p);
- TOGGLE_ACTIVE ("dpms_quickoff_button", p->dpms_quickoff_p);
- TOGGLE_ACTIVE ("grab_desk_button", p->grab_desktop_p);
- TOGGLE_ACTIVE ("grab_video_button", p->grab_video_p);
- TOGGLE_ACTIVE ("grab_image_button", p->random_image_p);
- TOGGLE_ACTIVE ("fade_button", p->fade_p);
- TOGGLE_ACTIVE ("unfade_button", p->unfade_p);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (win->NAME), (ACTIVEP))
+
+ TOGGLE_ACTIVE (lock_button, p->lock_p);
+ TOGGLE_ACTIVE (dpms_button, p->dpms_enabled_p && s->dpms_supported_p);
+ TOGGLE_ACTIVE (dpms_quickoff_button, (p->dpms_quickoff_p &&
+ s->dpms_supported_p));
+ TOGGLE_ACTIVE (grab_desk_button, p->grab_desktop_p);
+ TOGGLE_ACTIVE (grab_video_button, p->grab_video_p);
+ TOGGLE_ACTIVE (grab_image_button, p->random_image_p);
+ TOGGLE_ACTIVE (fade_button, p->fade_p);
+ TOGGLE_ACTIVE (unfade_button, p->unfade_p);
switch (p->tmode)
{
- case TEXT_LITERAL: TOGGLE_ACTIVE ("text_radio", True); break;
- case TEXT_FILE: TOGGLE_ACTIVE ("text_file_radio", True); break;
- case TEXT_PROGRAM: TOGGLE_ACTIVE ("text_program_radio", True); break;
- case TEXT_URL: TOGGLE_ACTIVE ("text_url_radio", True); break;
- default: TOGGLE_ACTIVE ("text_host_radio", True); break;
+ case TEXT_LITERAL: TOGGLE_ACTIVE (text_radio, TRUE); break;
+ case TEXT_FILE: TOGGLE_ACTIVE (text_file_radio, TRUE); break;
+ case TEXT_PROGRAM: TOGGLE_ACTIVE (text_program_radio, TRUE); break;
+ case TEXT_URL: TOGGLE_ACTIVE (text_url_radio, TRUE); break;
+ default: TOGGLE_ACTIVE (text_host_radio, TRUE); break;
}
# undef TOGGLE_ACTIVE
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "image_text")),
+ gtk_entry_set_text (GTK_ENTRY (win->image_text),
(p->image_directory ? p->image_directory : ""));
- gtk_widget_set_sensitive (name_to_widget (s, "image_text"),
- p->random_image_p);
- gtk_widget_set_sensitive (name_to_widget (s, "image_browse_button"),
+ gtk_widget_set_sensitive (win->image_text, p->random_image_p);
+ gtk_widget_set_sensitive (win->image_browse_button,
p->random_image_p);
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_entry")),
+ gtk_entry_set_text (GTK_ENTRY (win->text_entry),
(p->text_literal ? p->text_literal : ""));
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_file_entry")),
+ gtk_entry_set_text (GTK_ENTRY (win->text_file_entry),
(p->text_file ? p->text_file : ""));
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_program_entry")),
+ gtk_entry_set_text (GTK_ENTRY (win->text_program_entry),
(p->text_program ? p->text_program : ""));
- gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_url_entry")),
+ gtk_entry_set_text (GTK_ENTRY (win->text_url_entry),
(p->text_url ? p->text_url : ""));
- gtk_widget_set_sensitive (name_to_widget (s, "text_entry"),
+ gtk_widget_set_sensitive (win->text_entry,
p->tmode == TEXT_LITERAL);
- gtk_widget_set_sensitive (name_to_widget (s, "text_file_entry"),
+ gtk_widget_set_sensitive (win->text_file_entry,
p->tmode == TEXT_FILE);
- gtk_widget_set_sensitive (name_to_widget (s, "text_file_browse"),
+ gtk_widget_set_sensitive (win->text_file_browse,
p->tmode == TEXT_FILE);
- gtk_widget_set_sensitive (name_to_widget (s, "text_program_entry"),
+ gtk_widget_set_sensitive (win->text_program_entry,
p->tmode == TEXT_PROGRAM);
- gtk_widget_set_sensitive (name_to_widget (s, "text_program_browse"),
+ gtk_widget_set_sensitive (win->text_program_browse,
p->tmode == TEXT_PROGRAM);
- gtk_widget_set_sensitive (name_to_widget (s, "text_url_entry"),
+ gtk_widget_set_sensitive (win->text_url_entry,
p->tmode == TEXT_URL);
-
/* Theme menu */
{
- GtkComboBox *cbox = GTK_COMBO_BOX (name_to_widget (s, "theme_menu"));
-
- /* Without this, pref_changed_cb gets called an exponentially-increasing
- number of times on the themes menu, despite the call to
- gtk_list_store_clear(). */
- static Bool done_once = False;
+ GtkComboBox *cbox = GTK_COMBO_BOX (win->theme_menu);
- if (cbox && !done_once)
+ if (cbox)
{
- char *themes = get_string_resource (dpy, "themeNames", "ThemeNames");
- char *token = themes;
- char *name, *name2, *last;
+ char *themes = get_string_resource(s->dpy, "themeNames", "ThemeNames");
+ char *token = themes ? themes : strdup ("default");
+ char *name, *last = 0;
GtkListStore *model;
GtkTreeIter iter;
int i = 0;
- done_once = True;
-
- g_object_get (G_OBJECT (cbox), "model", &model, NULL);
- if (!model) abort();
- gtk_list_store_clear (model);
+ /* Bad things happen if we do these things more than once. */
+ static Bool model_built_p = FALSE;
+ static Bool signal_connected_p = FALSE;
- gtk_signal_connect (GTK_OBJECT (cbox), "changed",
- GTK_SIGNAL_FUNC (pref_changed_cb), (gpointer) s);
+ if (! model_built_p)
+ {
+ g_object_get (G_OBJECT (cbox), "model", &model, NULL);
+ if (!model) abort();
+ gtk_list_store_clear (model);
+ }
while ((name = strtok_r (token, ",", &last)))
{
+ char *name2;
int L;
token = 0;
@@ -2893,22 +2678,33 @@ populate_prefs_page (state *s)
name[L-1] == '\n'))
name[--L] = 0;
- gtk_list_store_append (model, &iter);
- gtk_list_store_set (model, &iter, 0, name, -1);
+ if (! model_built_p)
+ {
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter, 0, name, -1);
+ }
name2 = theme_name_strip (name);
- if (!strcmp (p->dialog_theme, name2))
+ if (p->dialog_theme && name2 && !strcmp (p->dialog_theme, name2))
gtk_combo_box_set_active (cbox, i);
free (name2);
i++;
}
+
+ model_built_p = TRUE;
+
+ if (! signal_connected_p)
+ {
+ g_signal_connect (G_OBJECT (cbox), "changed",
+ G_CALLBACK (pref_changed_cb), (gpointer) win);
+ signal_connected_p = TRUE;
+ }
}
}
-
/* Map the `saver_mode' enum to mode menu to values. */
{
- GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu"));
+ GtkComboBox *opt = GTK_COMBO_BOX (win->mode_menu);
int i;
for (i = 0; i < countof(mode_menu_order); i++)
@@ -2918,146 +2714,183 @@ populate_prefs_page (state *s)
update_list_sensitivity (s);
}
- {
- Bool dpms_supported = False;
- Display *dpy = GDK_DISPLAY();
-
-#ifdef HAVE_DPMS_EXTENSION
- {
- int op = 0, event = 0, error = 0;
- if (XQueryExtension (dpy, "DPMS", &op, &event, &error))
- dpms_supported = True;
- }
-#endif /* HAVE_DPMS_EXTENSION */
+# define SENSITIZE(NAME,SENSITIVEP) \
+ gtk_widget_set_sensitive (win->NAME, (SENSITIVEP))
+ /* Blanking and Locking
+ */
+ SENSITIZE (lock_button, can_lock_p);
+ SENSITIZE (lock_spinbutton, can_lock_p && p->lock_p);
+ SENSITIZE (lock_mlabel, can_lock_p && p->lock_p);
-# define SENSITIZE(NAME,SENSITIVEP) \
- gtk_widget_set_sensitive (name_to_widget (s, (NAME)), (SENSITIVEP))
-
- /* Blanking and Locking
- */
- SENSITIZE ("lock_button", can_lock_p);
- SENSITIZE ("lock_spinbutton", can_lock_p && p->lock_p);
- SENSITIZE ("lock_mlabel", can_lock_p && p->lock_p);
-
- /* DPMS
- */
- SENSITIZE ("dpms_frame", dpms_supported);
- SENSITIZE ("dpms_button", dpms_supported);
-
- SENSITIZE ("dpms_standby_label", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_standby_mlabel", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_standby_spinbutton", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_suspend_label", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_suspend_mlabel", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_suspend_spinbutton", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_off_label", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_off_mlabel", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_off_spinbutton", dpms_supported && p->dpms_enabled_p);
- SENSITIZE ("dpms_quickoff_button", dpms_supported);
-
- SENSITIZE ("fade_label", (p->fade_p || p->unfade_p));
- SENSITIZE ("fade_spinbutton", (p->fade_p || p->unfade_p));
+ /* DPMS
+ */
+ SENSITIZE (dpms_button, s->dpms_supported_p);
+ SENSITIZE (dpms_standby_label, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_standby_mlabel, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_standby_spinbutton,s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_suspend_label, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_suspend_mlabel, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_suspend_spinbutton,s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_off_label, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_off_mlabel, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_off_spinbutton, s->dpms_supported_p && p->dpms_enabled_p);
+ SENSITIZE (dpms_quickoff_button, s->dpms_supported_p);
+
+ SENSITIZE (fade_label, (p->fade_p || p->unfade_p));
+ SENSITIZE (fade_spinbutton, (p->fade_p || p->unfade_p));
# undef SENSITIZE
- }
-}
-
-/* Allow the documentation label to re-flow when the text is changed.
- http://blog.borovsak.si/2009/05/wrapping-adn-resizing-gtklabel.html
- */
-static void
-cb_allocate (GtkWidget *label, GtkAllocation *allocation, gpointer data)
-{
- gtk_widget_set_size_request (label, allocation->width - 8, -1);
+ if (!s->dpms_supported_p)
+ gtk_frame_set_label (GTK_FRAME (win->dpms_frame),
+ _("Display Power Management (not supported by this display)"));
}
-static void
-populate_popup_window (state *s)
+/* Creates a human-readable anchor to put on a URL.
+ */
+static char *
+anchorize (const char *url)
{
- GtkLabel *doc = GTK_LABEL (name_to_widget (s, "doc"));
- char *doc_string = 0;
-
- /* #### not in Gtk 1.2
- gtk_label_set_selectable (doc);
- */
-
- g_signal_connect (G_OBJECT (doc), "size-allocate",
- G_CALLBACK (cb_allocate), NULL);
-
-# ifdef HAVE_XML
- if (s->cdata)
- {
- free_conf_data (s->cdata);
- s->cdata = 0;
+ const char *wiki1 = "http://en.wikipedia.org/wiki/";
+ const char *wiki2 = "https://en.wikipedia.org/wiki/";
+ const char *math1 = "http://mathworld.wolfram.com/";
+ const char *math2 = "https://mathworld.wolfram.com/";
+ if (!strncmp (wiki1, url, strlen(wiki1)) ||
+ !strncmp (wiki2, url, strlen(wiki2))) {
+ char *anchor = (char *) malloc (strlen(url) * 3 + 10);
+ const char *in;
+ char *out;
+ strcpy (anchor, "Wikipedia: \"");
+ in = url + strlen(!strncmp (wiki1, url, strlen(wiki1)) ? wiki1 : wiki2);
+ out = anchor + strlen(anchor);
+ while (*in) {
+ if (*in == '_') {
+ *out++ = ' ';
+ } else if (*in == '#') {
+ *out++ = ':';
+ *out++ = ' ';
+ } else if (*in == '%') {
+ char hex[3];
+ unsigned int n = 0;
+ hex[0] = in[1];
+ hex[1] = in[2];
+ hex[2] = 0;
+ sscanf (hex, "%x", &n);
+ *out++ = (char) n;
+ in += 2;
+ } else {
+ *out++ = *in;
+ }
+ in++;
}
-
- {
- saver_preferences *p = &s->prefs;
- int list_elt = selected_list_element (s);
- int hack_number = (list_elt >= 0 && list_elt < s->list_count
- ? s->list_elt_to_hack_number[list_elt]
- : -1);
- screenhack *hack = (hack_number >= 0 ? p->screenhacks[hack_number] : 0);
- if (hack)
- {
- GtkWidget *parent = name_to_widget (s, "settings_vbox");
- GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
- const char *cmd_line = gtk_entry_get_text (GTK_ENTRY (cmd));
- s->cdata = load_configurator (cmd_line, s->debug_p);
- if (s->cdata && s->cdata->widget)
- gtk_box_pack_start (GTK_BOX (parent), s->cdata->widget,
- TRUE, TRUE, 0);
+ *out++ = '"';
+ *out = 0;
+ return anchor;
+
+ } else if (!strncmp (math1, url, strlen(math1)) ||
+ !strncmp (math2, url, strlen(math2))) {
+ char *anchor = (char *) malloc (strlen(url) * 3 + 10);
+ const char *start, *in;
+ char *out;
+ strcpy (anchor, "MathWorld: \"");
+ start = url + strlen(!strncmp (math1, url, strlen(math1)) ? math1 : math2);
+ in = start;
+ out = anchor + strlen(anchor);
+ while (*in) {
+ if (*in == '_') {
+ *out++ = ' ';
+ } else if (in != start && *in >= 'A' && *in <= 'Z') {
+ *out++ = ' ';
+ *out++ = *in;
+ } else if (!strncmp (in, ".htm", 4)) {
+ break;
+ } else {
+ *out++ = *in;
}
- }
-
- doc_string = (s->cdata
- ? s->cdata->description
- : 0);
-# else /* !HAVE_XML */
- doc_string = _("Descriptions not available: no XML support compiled in.");
-# endif /* !HAVE_XML */
-
- gtk_label_set_text (doc, (doc_string
- ? _(doc_string)
- : _("No description available.")));
+ in++;
+ }
+ *out++ = '"';
+ *out = 0;
+ return anchor;
- {
- GtkWidget *w = name_to_widget (s, "dialog_vbox");
- gtk_widget_hide (w);
- gtk_widget_unrealize (w);
- gtk_widget_realize (w);
- gtk_widget_show (w);
+ } else {
+ return strdup (url);
}
}
-static void
-sensitize_demo_widgets (state *s, Bool sensitive_p)
+/* Quote the text as HTML and make URLs be clickable links.
+ */
+static char *
+hreffify (const char *in)
{
- const char *names[] = { "demo", "settings",
- "cmd_label", "cmd_text", "manual",
- "visual", "visual_combo" };
- int i;
- for (i = 0; i < countof(names); i++)
+ char *ret, *out;
+ if (!in) return 0;
+
+ ret = out = malloc (strlen(in) * 3);
+ while (*in)
{
- GtkWidget *w = name_to_widget (s, names[i]);
- gtk_widget_set_sensitive (GTK_WIDGET(w), sensitive_p);
+ if (!strncmp (in, "http://", 7) ||
+ !strncmp (in, "https://", 8))
+ {
+ char *url, *anchor;
+ const char *end = in;
+ while (*end &&
+ *end != ' ' && *end != '\t' && *end != '\r' && *end != '\n')
+ end++;
+
+ url = (char *) malloc (end - in + 1);
+ strncpy (url, in, end-in);
+ url [end-in] = 0;
+
+ anchor = anchorize (url);
+
+ strcpy (out, "<a href=\""); out += strlen (out);
+ strcpy (out, url); out += strlen (out);
+ strcpy (out, "\">"); out += strlen (out);
+ strcpy (out, anchor); out += strlen (out);
+ strcpy (out, "</a>"); out += strlen (out);
+ free (url);
+ free (anchor);
+ in = end;
+ }
+ else if (*in == '<')
+ {
+ strcpy (out, "&lt;");
+ out += strlen (out);
+ in++;
+ }
+ else if (*in == '>')
+ {
+ strcpy (out, "&gt;");
+ out += strlen (out);
+ in++;
+ }
+ else if (*in == '&')
+ {
+ strcpy (out, "&amp;");
+ out += strlen (out);
+ in++;
+ }
+ else
+ {
+ *out++ = *in++;
+ }
}
+ *out = 0;
+ return ret;
}
static void
sensitize_menu_items (state *s, Bool force_p)
{
- static Bool running_p = False;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ static Bool running_p = FALSE;
static time_t last_checked = 0;
time_t now = time ((time_t *) 0);
- const char *names[] = { "activate_action", "lock_action", "kill_action",
- /* "demo" */ };
- int i;
if (force_p || now > last_checked + 10) /* check every 10 seconds */
{
@@ -3065,289 +2898,52 @@ sensitize_menu_items (state *s, Bool force_p)
last_checked = time ((time_t *) 0);
}
- for (i = 0; i < countof(names); i++)
- {
- GtkAction *a = GTK_ACTION (gtk_builder_get_object (s->gtk_ui, names[i]));
- gtk_action_set_sensitive (a, running_p);
- }
-}
-
-
-/* When the File menu is de-posted after a "Restart Daemon" command,
- the window underneath doesn't repaint for some reason. I guess this
- is a bug in exposure handling in GTK or GDK. This works around it.
- */
-static void
-force_dialog_repaint (state *s)
-{
-#if 1
- /* Tell GDK to invalidate and repaint the whole window.
- */
- GdkWindow *w = GET_WINDOW (s->toplevel_widget);
- GdkRegion *region = gdk_region_new ();
- GdkRectangle rect;
- rect.x = rect.y = 0;
- rect.width = rect.height = 32767;
- gdk_region_union_with_rect (region, &rect);
- gdk_window_invalidate_region (w, region, True);
- gdk_region_destroy (region);
- gdk_window_process_updates (w, True);
-#else
- /* Force the server to send an exposure event by creating and then
- destroying a window as a child of the top level shell.
- */
- Display *dpy = GDK_DISPLAY();
- Window parent = GDK_WINDOW_XWINDOW (s->toplevel_widget->window);
- Window w;
- XWindowAttributes xgwa;
- XGetWindowAttributes (dpy, parent, &xgwa);
- w = XCreateSimpleWindow (dpy, parent, 0, 0, xgwa.width, xgwa.height, 0,0,0);
- XMapRaised (dpy, w);
- XDestroyWindow (dpy, w);
- XSync (dpy, False);
-#endif
-}
-
-
-/* Even though we've given these text fields a maximum number of characters,
- their default size is still about 30 characters wide -- so measure out
- a string in their font, and resize them to just fit that.
- */
-static void
-fix_text_entry_sizes (state *s)
-{
- GtkWidget *w;
-
-# if 0 /* appears no longer necessary with Gtk 1.2.10 */
- const char * const spinbuttons[] = {
- "timeout_spinbutton", "cycle_spinbutton", "lock_spinbutton",
- "dpms_standby_spinbutton", "dpms_suspend_spinbutton",
- "dpms_off_spinbutton",
- "-fade_spinbutton" };
- int i;
- int width = 0;
-
- for (i = 0; i < countof(spinbuttons); i++)
- {
- const char *n = spinbuttons[i];
- int cols = 4;
- while (*n == '-') n++, cols--;
- w = GTK_WIDGET (name_to_widget (s, n));
- width = gdk_text_width (w->style->font, "MMMMMMMM", cols);
- gtk_widget_set_usize (w, width, -2);
- }
-
- /* Now fix the width of the combo box.
- */
- w = GTK_WIDGET (name_to_widget (s, "visual_combo"));
- w = GTK_COMBO_BOX_ENTRY (w)->entry;
- width = gdk_string_width (w->style->font, "PseudoColor___");
- gtk_widget_set_usize (w, width, -2);
-
- /* Now fix the width of the file entry text.
- */
- w = GTK_WIDGET (name_to_widget (s, "image_text"));
- width = gdk_string_width (w->style->font, "mmmmmmmmmmmmmm");
- gtk_widget_set_usize (w, width, -2);
-
- /* Now fix the width of the command line text.
- */
- w = GTK_WIDGET (name_to_widget (s, "cmd_text"));
- width = gdk_string_width (w->style->font, "mmmmmmmmmmmmmmmmmmmm");
- gtk_widget_set_usize (w, width, -2);
-
-# endif /* 0 */
-
- /* Now fix the height of the list widget:
- make it default to being around 10 text-lines high instead of 4.
- */
- w = GTK_WIDGET (name_to_widget (s, "list"));
- {
- int lines = 10;
- int height;
- int leading = 3; /* approximate is ok... */
- int border = 2;
-
-#ifdef HAVE_GTK2
- PangoFontMetrics *pain =
- pango_context_get_metrics (gtk_widget_get_pango_context (w),
- gtk_widget_get_style (w)->font_desc,
- gtk_get_default_language ());
- height = PANGO_PIXELS (pango_font_metrics_get_ascent (pain) +
- pango_font_metrics_get_descent (pain));
-#else /* !HAVE_GTK2 */
- height = w->style->font->ascent + w->style->font->descent;
-#endif /* !HAVE_GTK2 */
-
- height += leading;
- height *= lines;
- height += border * 2;
- w = GTK_WIDGET (name_to_widget (s, "scroller"));
- gtk_widget_set_usize (w, -2, height);
- }
-}
-
-
-#ifndef HAVE_GTK2
-
-/* Pixmaps for the up and down arrow buttons (yeah, this is sleazy...)
- */
-
-static char *up_arrow_xpm[] = {
- "15 15 4 1",
- " c None",
- "- c #FFFFFF",
- "+ c #D6D6D6",
- "@ c #000000",
-
- " @ ",
- " @ ",
- " -+@ ",
- " -+@ ",
- " -+++@ ",
- " -+++@ ",
- " -+++++@ ",
- " -+++++@ ",
- " -+++++++@ ",
- " -+++++++@ ",
- " -+++++++++@ ",
- " -+++++++++@ ",
- " -+++++++++++@ ",
- " @@@@@@@@@@@@@ ",
- " ",
-
- /* Need these here because gdk_pixmap_create_from_xpm_d() walks off
- the end of the array (Gtk 1.2.5.) */
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
-};
-
-static char *down_arrow_xpm[] = {
- "15 15 4 1",
- " c None",
- "- c #FFFFFF",
- "+ c #D6D6D6",
- "@ c #000000",
-
- " ",
- " ------------- ",
- " -+++++++++++@ ",
- " -+++++++++@ ",
- " -+++++++++@ ",
- " -+++++++@ ",
- " -+++++++@ ",
- " -+++++@ ",
- " -+++++@ ",
- " -+++@ ",
- " -+++@ ",
- " -+@ ",
- " -+@ ",
- " @ ",
- " @ ",
-
- /* Need these here because gdk_pixmap_create_from_xpm_d() walks off
- the end of the array (Gtk 1.2.5.) */
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
-};
+ gtk_widget_set_sensitive (win->activate_menuitem, running_p);
+ gtk_widget_set_sensitive (win->lock_menuitem, running_p);
+ gtk_widget_set_sensitive (win->kill_menuitem, running_p);
-static void
-pixmapify_button (state *s, int down_p)
-{
- GdkPixmap *pixmap;
- GdkBitmap *mask;
- GtkWidget *pixmapwid;
- GtkStyle *style;
- GtkWidget *w;
-
- w = GTK_WIDGET (name_to_widget (s, (down_p ? "next" : "prev")));
- style = gtk_widget_get_style (w);
- mask = 0;
- pixmap = gdk_pixmap_create_from_xpm_d (w->window, &mask,
- &style->bg[GTK_STATE_NORMAL],
- (down_p
- ? (gchar **) down_arrow_xpm
- : (gchar **) up_arrow_xpm));
- pixmapwid = gtk_pixmap_new (pixmap, mask);
- gtk_widget_show (pixmapwid);
- gtk_container_remove (GTK_CONTAINER (w), GTK_BIN (w)->child);
- gtk_container_add (GTK_CONTAINER (w), pixmapwid);
-}
-
-static void
-map_next_button_cb (GtkWidget *w, gpointer user_data)
-{
- state *s = (state *) user_data;
- pixmapify_button (s, 1);
-}
-
-static void
-map_prev_button_cb (GtkWidget *w, gpointer user_data)
-{
- state *s = (state *) user_data;
- pixmapify_button (s, 0);
+ gtk_menu_item_set_label (GTK_MENU_ITEM (win->restart_menuitem),
+ (running_p
+ ? _("Restart Daemon")
+ : _("Launch Daemon")));
}
-#endif /* !HAVE_GTK2 */
-
-
-#ifndef HAVE_GTK2
-/* Work around a Gtk bug that causes label widgets to wrap text too early.
- */
-
-static void
-you_are_not_a_unique_or_beautiful_snowflake (GtkWidget *label,
- GtkAllocation *allocation,
- void *foo)
-{
- GtkRequisition req;
- GtkWidgetAuxInfo *aux_info;
-
- aux_info = gtk_object_get_data (GTK_OBJECT (label), "gtk-aux-info");
- aux_info->width = allocation->width;
- aux_info->height = -2;
- aux_info->x = -1;
- aux_info->y = -1;
- gtk_widget_size_request (label, &req);
-}
-
-/* Feel the love. Thanks to Nat Friedman for finding this workaround.
+/* Fill in the contents of the main window, and a few things on the
+ settings dialog.
*/
static void
-eschew_gtk_lossage (GtkLabel *label)
-{
- GtkWidgetAuxInfo *aux_info = g_new0 (GtkWidgetAuxInfo, 1);
- aux_info->width = GTK_WIDGET (label)->allocation.width;
- aux_info->height = -2;
- aux_info->x = -1;
- aux_info->y = -1;
-
- gtk_object_set_data (GTK_OBJECT (label), "gtk-aux-info", aux_info);
-
- gtk_signal_connect (GTK_OBJECT (label), "size_allocate",
- GTK_SIGNAL_FUNC (you_are_not_a_unique_or_beautiful_snowflake),
- 0);
-
- gtk_widget_set_usize (GTK_WIDGET (label), -2, -2);
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
-}
-#endif /* !HAVE_GTK2 */
-
-
-static void
populate_demo_window (state *s, int list_elt)
{
- Display *dpy = GDK_DISPLAY();
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
saver_preferences *p = &s->prefs;
screenhack *hack;
char *pretty_name;
- GtkFrame *frame1 = GTK_FRAME (name_to_widget (s, "preview_frame"));
- GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "opt_frame"));
- GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text"));
- GtkComboBoxEntry *vis = GTK_COMBO_BOX_ENTRY (name_to_widget (s, "visual_combo"));
- GtkWidget *list = GTK_WIDGET (name_to_widget (s, "list"));
+ GtkFrame *frame1 = GTK_FRAME (win->preview_frame);
+ GtkFrame *frame2 = dialog ? GTK_FRAME (dialog->opt_frame) : 0;
+ GtkEntry *cmd = dialog ? GTK_ENTRY (dialog->cmd_text) : 0;
+ GtkComboBox *vis = dialog ? GTK_COMBO_BOX (dialog->visual_combo) : 0;
+
+ /* Enforce a minimum size on the preview pane. */
+ if (s->dpy)
+ {
+ int dw = DisplayWidth (s->dpy, 0);
+ int dh = DisplayHeight (s->dpy, 0);
+ int minw, minh;
+ # define TRY(W) do { \
+ minw = (W); minh = minw * 9/16 + 48; \
+ if (dw > minw * 1.5 && dh > minh * 1.5) \
+ gtk_widget_set_size_request (GTK_WIDGET (frame1), minw, minh); \
+ } while(0)
+ TRY (300);
+ TRY (400);
+ TRY (480);
+ TRY (640);
+ TRY (800);
+ /* TRY (960); */
+# undef TRY
+ }
if (p->mode == BLANK_ONLY)
{
@@ -3371,7 +2967,7 @@ populate_demo_window (state *s, int list_elt)
pretty_name = (hack
? (hack->name
? strdup (hack->name)
- : make_hack_name (dpy, hack->command))
+ : make_hack_name (s->dpy, hack->command))
: 0);
if (hack)
@@ -3383,31 +2979,40 @@ populate_demo_window (state *s, int list_elt)
if (!pretty_name)
pretty_name = strdup (_("Preview"));
- gtk_frame_set_label (frame1, _(pretty_name));
- gtk_frame_set_label (frame2, _(pretty_name));
+ if (dialog->unedited_cmdline) free (dialog->unedited_cmdline);
+ dialog->unedited_cmdline = strdup (hack ? hack->command : "");
- gtk_entry_set_text (cmd, (hack ? hack->command : ""));
- gtk_entry_set_position (cmd, 0);
+ gtk_frame_set_label (frame1, _(pretty_name));
+ if (frame2)
+ gtk_frame_set_label (frame2, _(pretty_name));
+ if (cmd)
+ gtk_entry_set_text (cmd, dialog->unedited_cmdline);
{
char title[255];
sprintf (title, _("%s: %.100s Settings"),
progclass, (pretty_name ? pretty_name : "???"));
- gtk_window_set_title (GTK_WINDOW (s->popup_widget), title);
+ gtk_window_set_title (GTK_WINDOW (s->window), title);
+ if (s->dialog)
+ gtk_window_set_title (GTK_WINDOW (s->dialog), title);
}
- gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (vis))),
- (hack
- ? (hack->visual && *hack->visual
- ? hack->visual
- : _("Any"))
- : ""));
+ /* Fill in the Visual combo-box */
+ if (vis)
+ gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (vis))),
+ (hack
+ ? (hack->visual && *hack->visual
+ ? hack->visual
+ : _("Any"))
+ : ""));
- sensitize_demo_widgets (s, (hack ? True : False));
+ sensitize_demo_widgets (s, (hack ? TRUE : FALSE));
if (pretty_name) free (pretty_name);
- ensure_selected_item_visible (list);
+ /* This causes the window to scroll out from under the mouse when
+ clicking on an item, vertically centering it. That's annoying. */
+ /* ensure_selected_item_visible (s, list); */
s->_selected_list_element = list_elt;
}
@@ -3416,19 +3021,7 @@ populate_demo_window (state *s, int list_elt)
static void
widget_deleter (GtkWidget *widget, gpointer data)
{
- /* #### Well, I want to destroy these widgets, but if I do that, they get
- referenced again, and eventually I get a SEGV. So instead of
- destroying them, I'll just hide them, and leak a bunch of memory
- every time the disk file changes. Go go go Gtk!
-
- #### Ok, that's a lie, I get a crash even if I just hide the widget
- and don't ever delete it. Fuck!
- */
-#if 0
gtk_widget_destroy (widget);
-#else
- gtk_widget_hide (widget);
-#endif
}
@@ -3452,7 +3045,6 @@ sort_hack_cmp (const void *a, const void *b)
static void
initialize_sort_map (state *s)
{
- Display *dpy = GDK_DISPLAY();
saver_preferences *p = &s->prefs;
int i, j;
@@ -3503,7 +3095,7 @@ initialize_sort_map (state *s)
screenhack *hack = p->screenhacks[i];
char *name = (hack->name && *hack->name
? strdup (hack->name)
- : make_hack_name (dpy, hack->command));
+ : make_hack_name (s->dpy, hack->command));
gchar *s2 = g_str_to_ascii (name, 0); /* Sort "Möbius" properly */
gchar *s3 = g_ascii_strdown (s2, -1);
free (name);
@@ -3538,13 +3130,13 @@ initialize_sort_map (state *s)
static int
maybe_reload_init_file (state *s)
{
- Display *dpy = GDK_DISPLAY();
saver_preferences *p = &s->prefs;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
int status = 0;
- static Bool reentrant_lock = False;
+ static Bool reentrant_lock = FALSE;
if (reentrant_lock) return 0;
- reentrant_lock = True;
+ reentrant_lock = TRUE;
if (init_file_changed_p (p))
{
@@ -3555,120 +3147,106 @@ maybe_reload_init_file (state *s)
if (!f || !*f) return 0;
b = (char *) malloc (strlen(f) + 1024);
- sprintf (b,
- _("Warning:\n\n"
- "file \"%s\" has changed, reloading.\n"),
- f);
- warning_dialog (s->toplevel_widget, b, D_NONE, 100);
+ sprintf (b, _("file \"%s\" has changed, reloading.\n"), f);
+ warning_dialog (s->window, _("Warning"), b);
free (b);
- load_init_file (dpy, p);
+ load_init_file (s->dpy, p);
initialize_sort_map (s);
list_elt = selected_list_element (s);
- list = name_to_widget (s, "list");
+ list = win->list;
gtk_container_foreach (GTK_CONTAINER (list), widget_deleter, NULL);
populate_hack_list (s);
- force_list_select_item (s, list, list_elt, True);
+ force_list_select_item (s, list, list_elt, TRUE);
populate_prefs_page (s);
populate_demo_window (s, list_elt);
- ensure_selected_item_visible (list);
+ populate_popup_window (s);
+ ensure_selected_item_visible (s, list);
status = 1;
}
- reentrant_lock = False;
+ reentrant_lock = FALSE;
return status;
}
-
/* Making the preview window have the right X visual (so that GL works.)
*/
static Visual *get_best_gl_visual (state *);
static GdkVisual *
-x_visual_to_gdk_visual (Visual *xv)
+x_visual_to_gdk_visual (GdkWindow *win, Visual *xv)
{
- GList *gvs = gdk_list_visuals();
- if (!xv) return gdk_visual_get_system();
- for (; gvs; gvs = gvs->next)
+ if (xv)
{
- GdkVisual *gv = (GdkVisual *) gvs->data;
- if (xv == GDK_VISUAL_XVISUAL (gv))
- return gv;
+ GdkScreen *screen = gdk_window_get_screen (win);
+ GList *gvs = gdk_screen_list_visuals (screen);
+ /* This list is sometimes NULL, not even the default visual! */
+ for (; gvs; gvs = gvs->next)
+ {
+ GdkVisual *gv = (GdkVisual *) gvs->data;
+ if (xv == GDK_VISUAL_XVISUAL (gv))
+ return gv;
+ }
}
- fprintf (stderr, "%s: couldn't convert X Visual 0x%lx to a GdkVisual\n",
- blurb(), (unsigned long) xv->visualid);
- abort();
+ return 0;
}
+
static void
clear_preview_window (state *s)
{
- GtkWidget *p;
- GdkWindow *window;
- GtkStyle *style;
-
- if (!s->toplevel_widget) return; /* very early */
- p = name_to_widget (s, "preview");
- window = GET_WINDOW (p);
-
- if (!window) return;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ int list_elt = selected_list_element (s);
+ int hack_number = (list_elt >= 0
+ ? s->list_elt_to_hack_number[list_elt]
+ : -1);
+ Bool available_p = (hack_number >= 0
+ ? s->hacks_available_p [hack_number]
+ : TRUE);
+ Bool nothing_p = (s->total_available < 5);
+
+ GtkWidget *notebook = win->preview_notebook;
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook),
+ (!s->running_preview_error_p ? 0 : /* ok */
+ nothing_p ? 3 : /* no hacks installed */
+ !available_p ? 2 : /* hack not installed */
+ s->wayland_p ? 4 : /* fucking wayland */
+ 1)); /* preview failed */
+}
- /* Flush the widget background down into the window, in case a subproc
- has changed it. */
- style = gtk_widget_get_style (p);
- gdk_window_set_background (window, &style->bg[GTK_STATE_NORMAL]);
- gdk_window_clear (window);
- {
- int list_elt = selected_list_element (s);
- int hack_number = (list_elt >= 0
- ? s->list_elt_to_hack_number[list_elt]
- : -1);
- Bool available_p = (hack_number >= 0
- ? s->hacks_available_p [hack_number]
- : True);
- Bool nothing_p = (s->total_available < 5);
-
-#ifdef HAVE_GTK2
- GtkWidget *notebook = name_to_widget (s, "preview_notebook");
- gtk_notebook_set_page (GTK_NOTEBOOK (notebook),
- (s->running_preview_error_p
- ? (available_p ? 1 :
- nothing_p ? 3 : 2)
- : 0));
-#else /* !HAVE_GTK2 */
- if (s->running_preview_error_p)
- {
- const char * const lines1[] = { N_("No Preview"), N_("Available") };
- const char * const lines2[] = { N_("Not"), N_("Installed") };
- int nlines = countof(lines1);
- int lh = p->style->font->ascent + p->style->font->descent;
- int y, i;
- gint w, h;
-
- const char * const *lines = (available_p ? lines1 : lines2);
-
- gdk_window_get_size (window, &w, &h);
- y = (h - (lh * nlines)) / 2;
- y += p->style->font->ascent;
- for (i = 0; i < nlines; i++)
- {
- int sw = gdk_string_width (p->style->font, _(lines[i]));
- int x = (w - sw) / 2;
- gdk_draw_string (window, p->style->font,
- p->style->fg_gc[GTK_STATE_NORMAL],
- x, y, _(lines[i]));
- y += lh;
- }
- }
-#endif /* !HAVE_GTK2 */
- }
+static gboolean
+preview_resize_cb (GtkWidget *self, GdkEvent *event, gpointer data)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (data);
+ state *s = &win->state;
- gdk_flush ();
+ /* If a subproc is running, clear the window to black when we resize.
+ Without this, sometimes turds get left behind. */
+ if (s->dpy && !s->wayland_p && s->running_preview_cmd)
+ {
+ GdkWindow *window = gtk_widget_get_window (self);
+ Window id;
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ GC gc;
+
+ if (! window) return TRUE;
+ id = gdk_x11_window_get_xid (window);
+ if (! id) return TRUE;
+
+ /* Not sure why XClearWindow is insufficient here, but it is. */
+ XGetWindowAttributes (s->dpy, id, &xgwa);
+ gcv.foreground = BlackPixelOfScreen (xgwa.screen);
+ gc = XCreateGC (s->dpy, id, GCForeground, &gcv);
+ XFillRectangle (s->dpy, id, gc, 0, 0, xgwa.width, xgwa.height);
+ XFreeGC (s->dpy, gc);
+ }
+ return FALSE;
}
@@ -3680,18 +3258,20 @@ reset_preview_window (state *s)
it's best to just always destroy and recreate the preview window
when changing hacks, instead of always trying to reuse the same one?
*/
- GtkWidget *pr = name_to_widget (s, "preview");
- if (GET_REALIZED (pr))
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkWidget *pr = win->preview;
+ if (s->dpy && !s->wayland_p && gtk_widget_get_realized (pr))
{
- GdkWindow *window = GET_WINDOW (pr);
- Window oid = (window ? GDK_WINDOW_XWINDOW (window) : 0);
+ GdkWindow *window = gtk_widget_get_window (pr);
+ Window oid = (window ? gdk_x11_window_get_xid (window) : 0);
Window id;
gtk_widget_hide (pr);
gtk_widget_unrealize (pr);
+ gtk_widget_set_has_window (pr, TRUE);
gtk_widget_realize (pr);
gtk_widget_show (pr);
- id = (window ? GDK_WINDOW_XWINDOW (window) : 0);
- if (s->debug_p)
+ id = (window ? gdk_x11_window_get_xid (window) : 0);
+ if (s->debug_p && oid != id)
fprintf (stderr, "%s: window id 0x%X -> 0x%X\n", blurb(),
(unsigned int) oid,
(unsigned int) id);
@@ -3699,60 +3279,47 @@ reset_preview_window (state *s)
}
+/* Make the preview widget use the best GL visual.
+ We just always use that one rather than switching.
+ */
static void
fix_preview_visual (state *s)
{
- GtkWidget *widget = name_to_widget (s, "preview");
- Visual *xvisual = get_best_gl_visual (s);
- GdkVisual *visual = x_visual_to_gdk_visual (xvisual);
- GdkVisual *dvisual = gdk_visual_get_system();
- GdkColormap *cmap = (visual == dvisual
- ? gdk_colormap_get_system ()
- : gdk_colormap_new (visual, False));
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ Visual *xvisual = s->gl_visual;
+ GtkWidget *widget = win->preview;
+ GdkWindow *gwindow = gtk_widget_get_window (GTK_WIDGET (win));
+ GdkScreen *gscreen = gdk_window_get_screen (gwindow);
+ GdkVisual *gvisual1 = gdk_screen_get_system_visual (gscreen);
+ GdkVisual *gvisual2 = x_visual_to_gdk_visual (gwindow, xvisual);
+
+ if (! gvisual2)
+ {
+ gvisual2 = gvisual1;
+ if (s->debug_p)
+ fprintf (stderr, "%s: couldn't convert X Visual 0x%lx to a GdkVisual;"
+ " winging it.\n", blurb(),
+ (xvisual ? (unsigned long) xvisual->visualid : 0L));
+ }
if (s->debug_p)
fprintf (stderr, "%s: using %s visual 0x%lx\n", blurb(),
- (visual == dvisual ? "default" : "non-default"),
+ (gvisual1 == gvisual2 ? "default" : "non-default"),
(xvisual ? (unsigned long) xvisual->visualid : 0L));
- if (!GET_REALIZED (widget) ||
- gtk_widget_get_visual (widget) != visual)
+ if (!gtk_widget_get_realized (widget) ||
+ gtk_widget_get_visual (widget) != gvisual2)
{
gtk_widget_unrealize (widget);
- gtk_widget_set_visual (widget, visual);
- gtk_widget_set_colormap (widget, cmap);
+ gtk_widget_set_has_window (widget, TRUE);
+ gtk_widget_set_visual (widget, gvisual2);
gtk_widget_realize (widget);
}
- /* Set the Widget colors to be white-on-black. */
- {
- GdkWindow *window = GET_WINDOW (widget);
- GtkStyle *style = gtk_style_copy (gtk_widget_get_style (widget));
- GdkColormap *cmap = gtk_widget_get_colormap (widget);
- GdkColor *fg = &style->fg[GTK_STATE_NORMAL];
- GdkColor *bg = &style->bg[GTK_STATE_NORMAL];
- GdkGC *fgc = gdk_gc_new(window);
- GdkGC *bgc = gdk_gc_new(window);
- if (!gdk_color_white (cmap, fg)) abort();
- if (!gdk_color_black (cmap, bg)) abort();
- gdk_gc_set_foreground (fgc, fg);
- gdk_gc_set_background (fgc, bg);
- gdk_gc_set_foreground (bgc, bg);
- gdk_gc_set_background (bgc, fg);
- style->fg_gc[GTK_STATE_NORMAL] = fgc;
- style->bg_gc[GTK_STATE_NORMAL] = fgc;
- gtk_widget_set_style (widget, style);
-
- /* For debugging purposes, put a title on the window (so that
- it can be easily found in the output of "xwininfo -tree".)
- */
- gdk_window_set_title (window, "Preview");
- }
-
gtk_widget_show (widget);
}
-
+
/* Subprocesses
*/
@@ -3803,11 +3370,12 @@ reap_zombies (state *s)
}
+#define EXEC_FAILED_EXIT_STATUS -33
+
/* Mostly lifted from driver/subprocs.c */
static Visual *
get_best_gl_visual (state *s)
{
- Display *dpy = GDK_DISPLAY();
pid_t forked;
int fds [2];
int in, out;
@@ -3838,12 +3406,10 @@ get_best_gl_visual (state *s)
}
case 0:
{
- int stdout_fd = 1;
-
close (in); /* don't need this one */
- close (ConnectionNumber (dpy)); /* close display fd */
+ close (ConnectionNumber (s->dpy)); /* close display fd */
- if (dup2 (out, stdout_fd) < 0) /* pipe stdout */
+ if (dup2 (out, STDOUT_FILENO) < 0) /* pipe stdout */
{
perror ("could not dup() a new stdout:");
return 0;
@@ -3865,27 +3431,44 @@ get_best_gl_visual (state *s)
If one uses exit() instead of _exit(), then one sometimes gets a
spurious "Gdk-ERROR: Fatal IO error on X server" error message.
*/
- _exit (1); /* exits fork */
+ _exit (EXEC_FAILED_EXIT_STATUS); /* exits fork */
break;
}
default:
{
int result = 0;
int wait_status = 0;
+ int exit_status = EXEC_FAILED_EXIT_STATUS;
FILE *f = fdopen (in, "r");
unsigned int v = 0;
char c;
+ int i = 0;
close (out); /* don't need this one */
*buf = 0;
- if (!fgets (buf, sizeof(buf)-1, f))
- *buf = 0;
+ do {
+ errno = 0;
+ if (! fgets (buf, sizeof(buf)-1, f))
+ *buf = 0;
+ } while (errno == EINTR && /* fgets might fail due to SIGCHLD. */
+ i++ < 1000); /* And just in case. */
+
fclose (f);
/* Wait for the child to die. */
- waitpid (-1, &wait_status, 0);
+ waitpid (forked, &wait_status, 0);
+
+ exit_status = WEXITSTATUS (wait_status);
+ /* Treat exit code as a signed 8-bit quantity. */
+ if (exit_status & 0x80) exit_status |= ~0xFF;
+
+ if (exit_status == EXEC_FAILED_EXIT_STATUS)
+ {
+ fprintf (stderr, "%s: %s is not installed\n", blurb(), av[0]);
+ return 0;
+ }
if (1 == sscanf (buf, "0x%x %c", &v, &c))
result = (int) v;
@@ -3899,10 +3482,9 @@ get_best_gl_visual (state *s)
}
else
{
- Visual *v = id_to_visual (DefaultScreenOfDisplay (dpy), result);
+ Visual *v = id_to_visual (DefaultScreenOfDisplay (s->dpy), result);
if (s->debug_p)
- fprintf (stderr, "%s: %s says the GL visual is 0x%X.\n",
- blurb(), av[0], result);
+ fprintf (stderr, "%s: GL visual is 0x%X\n", blurb(), result);
if (!v) abort();
return v;
}
@@ -3916,14 +3498,14 @@ get_best_gl_visual (state *s)
static void
kill_preview_subproc (state *s, Bool reset_p)
{
- s->running_preview_error_p = False;
+ s->running_preview_error_p = FALSE;
reap_zombies (s);
clear_preview_window (s);
if (s->subproc_check_timer_id)
{
- gtk_timeout_remove (s->subproc_check_timer_id);
+ g_source_remove (s->subproc_check_timer_id);
s->subproc_check_timer_id = 0;
s->subproc_check_countdown = 0;
}
@@ -3979,30 +3561,33 @@ kill_preview_subproc (state *s, Bool reset_p)
static void
launch_preview_subproc (state *s)
{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
saver_preferences *p = &s->prefs;
Window id;
char *new_cmd = 0;
pid_t forked;
const char *cmd = s->desired_preview_cmd;
- GtkWidget *pr = name_to_widget (s, "preview");
+ GtkWidget *pr = win->preview;
GdkWindow *window;
reset_preview_window (s);
- window = GET_WINDOW (pr);
+ window = gtk_widget_get_window (pr);
- s->running_preview_error_p = False;
+ s->running_preview_error_p = FALSE;
- if (s->preview_suppressed_p)
+ if (s->preview_suppressed_p || !s->gl_visual)
{
- kill_preview_subproc (s, False);
+ kill_preview_subproc (s, FALSE);
goto DONE;
}
new_cmd = malloc (strlen (cmd) + 40);
- id = (window ? GDK_WINDOW_XWINDOW (window) : 0);
+ id = (window && !s->wayland_p
+ ? gdk_x11_window_get_xid (window)
+ : 0);
if (id == 0)
{
/* No window id? No command to run. */
@@ -4012,19 +3597,22 @@ launch_preview_subproc (state *s)
else
{
/* We do this instead of relying on $XSCREENSAVER_WINDOW specifically
- so that third-party savers that don't implement -window-id will fail:
+ so that third-party savers that don't implement --window-id will fail:
otherwise we might have full-screen windows popping up when we were
just trying to get a preview thumbnail.
*/
strcpy (new_cmd, cmd);
- sprintf (new_cmd + strlen (new_cmd), " -window-id 0x%X",
+ sprintf (new_cmd + strlen (new_cmd), " --window-id 0x%X",
(unsigned int) id);
}
- kill_preview_subproc (s, False);
+ if (id && s->screenshot)
+ screenshot_save (s->dpy, id, s->screenshot);
+
+ kill_preview_subproc (s, FALSE);
if (! new_cmd)
{
- s->running_preview_error_p = True;
+ s->running_preview_error_p = TRUE;
clear_preview_window (s);
goto DONE;
}
@@ -4036,13 +3624,13 @@ launch_preview_subproc (state *s)
char buf[255];
sprintf (buf, "%s: couldn't fork", blurb());
perror (buf);
- s->running_preview_error_p = True;
+ s->running_preview_error_p = TRUE;
goto DONE;
break;
}
case 0:
{
- close (ConnectionNumber (GDK_DISPLAY()));
+ close (ConnectionNumber (s->dpy));
hack_subproc_environment (id, s->debug_p);
@@ -4081,6 +3669,16 @@ launch_preview_subproc (state *s)
}
}
+ /* Put some props on the embedded preview window, for debugging. */
+ XStoreName (s->dpy, id, "XScreenSaver Settings Preview");
+ XChangeProperty (s->dpy, id, XA_WM_COMMAND,
+ XA_STRING, 8, PropModeReplace,
+ (unsigned char *) new_cmd,
+ strlen (new_cmd));
+ XChangeProperty (s->dpy, id, XA_NET_WM_PID,
+ XA_CARDINAL, 32, PropModeReplace,
+ (unsigned char *) &forked, 1);
+
schedule_preview_check (s);
DONE:
@@ -4101,8 +3699,7 @@ hack_environment (state *s)
"";
# endif
- Display *dpy = GDK_DISPLAY();
- const char *odpy = DisplayString (dpy);
+ const char *odpy = s->dpy ? DisplayString (s->dpy) : ":0.0";
char *ndpy = (char *) malloc(strlen(odpy) + 20);
strcpy (ndpy, "DISPLAY=");
strcat (ndpy, odpy);
@@ -4141,7 +3738,7 @@ hack_subproc_environment (Window preview_window_id, Bool debug_p)
{
/* Store a window ID in $XSCREENSAVER_WINDOW -- this isn't strictly
necessary yet, but it will make programs work if we had invoked
- them with "-root" and not with "-window-id" -- which, of course,
+ them with "--root" and not with "--window-id" -- which, of course,
doesn't happen.
*/
char *nssw = (char *) malloc (40);
@@ -4159,6 +3756,7 @@ hack_subproc_environment (Window preview_window_id, Bool debug_p)
}
+
/* Called from a timer:
Launches the currently-chosen subprocess, if it's not already running.
If there's a different process running, kills it.
@@ -4168,7 +3766,7 @@ update_subproc_timer (gpointer data)
{
state *s = (state *) data;
if (! s->desired_preview_cmd)
- kill_preview_subproc (s, True);
+ kill_preview_subproc (s, TRUE);
else if (!s->running_preview_cmd ||
!!strcmp (s->desired_preview_cmd, s->running_preview_cmd))
launch_preview_subproc (s);
@@ -4177,13 +3775,6 @@ update_subproc_timer (gpointer data)
return FALSE; /* do not re-execute timer */
}
-static int
-settings_timer (gpointer data)
-{
- settings_cb (0, 0);
- return FALSE;
-}
-
/* Call this when you think you might want a preview process running.
It will set a timer that will actually launch that program a second
@@ -4207,8 +3798,8 @@ schedule_preview (state *s, const char *cmd)
s->desired_preview_cmd = (cmd ? strdup (cmd) : 0);
if (s->subproc_timer_id)
- gtk_timeout_remove (s->subproc_timer_id);
- s->subproc_timer_id = gtk_timeout_add (delay, update_subproc_timer, s);
+ g_source_remove (s->subproc_timer_id);
+ s->subproc_timer_id = g_timeout_add (delay, update_subproc_timer, s);
}
@@ -4219,12 +3810,12 @@ static int
check_subproc_timer (gpointer data)
{
state *s = (state *) data;
- Bool again_p = True;
+ Bool again_p = TRUE;
if (s->running_preview_error_p || /* already dead */
s->running_preview_pid <= 0)
{
- again_p = False;
+ again_p = FALSE;
}
else
{
@@ -4232,9 +3823,9 @@ check_subproc_timer (gpointer data)
reap_zombies (s);
status = kill (s->running_preview_pid, 0);
if (status < 0 && errno == ESRCH)
- s->running_preview_error_p = True;
+ s->running_preview_error_p = TRUE;
- if (s->debug_p)
+ if (s->debug_p && s->running_preview_error_p)
{
char *ss = subproc_pretty_name (s);
fprintf (stderr, "%s: timer: pid %lu (%s) is %s\n", blurb(),
@@ -4246,7 +3837,7 @@ check_subproc_timer (gpointer data)
if (s->running_preview_error_p)
{
clear_preview_window (s);
- again_p = False;
+ again_p = FALSE;
}
}
@@ -4254,7 +3845,7 @@ check_subproc_timer (gpointer data)
might be satisfied. */
if (--s->subproc_check_countdown <= 0)
- again_p = False;
+ again_p = FALSE;
if (again_p)
return TRUE; /* re-execute timer */
@@ -4272,7 +3863,7 @@ check_subproc_timer (gpointer data)
check whether the program is still running. The assumption here
is that if the process didn't stay up for more than a couple of
seconds, then either the program doesn't exist, or it doesn't
- take a -window-id argument.
+ take a --window-id argument.
*/
static void
schedule_preview_check (state *s)
@@ -4284,27 +3875,27 @@ schedule_preview_check (state *s)
fprintf (stderr, "%s: scheduling check\n", blurb());
if (s->subproc_check_timer_id)
- gtk_timeout_remove (s->subproc_check_timer_id);
+ g_source_remove (s->subproc_check_timer_id);
s->subproc_check_timer_id =
- gtk_timeout_add (1000 / ticks,
- check_subproc_timer, (gpointer) s);
+ g_timeout_add (1000 / ticks,
+ check_subproc_timer, (gpointer) s);
s->subproc_check_countdown = ticks * seconds;
}
static Bool
-screen_blanked_p (void)
+screen_blanked_p (state *s)
{
Atom type;
int format;
unsigned long nitems, bytesafter;
unsigned char *dataP = 0;
- Display *dpy = GDK_DISPLAY();
- Bool blanked_p = False;
+ Bool blanked_p = FALSE;
- if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */
+ if (!s->dpy) return FALSE;
+ if (XGetWindowProperty (s->dpy, RootWindow (s->dpy, 0), /* always screen 0 */
XA_SCREENSAVER_STATUS,
- 0, 3, False, XA_INTEGER,
+ 0, 3, FALSE, XA_INTEGER,
&type, &format, &nitems, &bytesafter,
&dataP)
== Success
@@ -4329,63 +3920,45 @@ static int
check_blanked_timer (gpointer data)
{
state *s = (state *) data;
- Bool blanked_p = screen_blanked_p ();
+ Bool blanked_p = screen_blanked_p (s);
if (blanked_p && s->running_preview_pid)
{
if (s->debug_p)
fprintf (stderr, "%s: screen is blanked: killing preview\n", blurb());
- kill_preview_subproc (s, True);
+ kill_preview_subproc (s, TRUE);
}
- return True; /* re-execute timer */
+ return TRUE; /* re-execute timer */
}
-/* How many screens are there (including Xinerama.)
- */
-static int
-screen_count (Display *dpy)
+/* Is there more than one active monitor? */
+static Bool
+multi_screen_p (Display *dpy)
{
- int nscreens = ScreenCount(dpy);
-# ifdef HAVE_XINERAMA
- if (nscreens <= 1)
+ monitor **monitors = dpy ? scan_monitors (dpy) : NULL;
+ Bool ret = FALSE;
+ if (monitors)
{
- int event_number, error_number;
- if (XineramaQueryExtension (dpy, &event_number, &error_number) &&
- XineramaIsActive (dpy))
+ int count = 0;
+ int good_count = 0;
+ while (monitors[count])
{
- XineramaScreenInfo *xsi = XineramaQueryScreens (dpy, &nscreens);
- if (xsi) XFree (xsi);
+ if (monitors[count]->sanity == S_SANE)
+ good_count++;
+ count++;
}
+ free_monitors (monitors);
+ ret = (good_count > 1);
}
-# endif /* HAVE_XINERAMA */
-
- return nscreens;
-}
-
-
-/* Setting window manager icon
- */
-
-static void
-init_icon (GdkWindow *window)
-{
- GdkBitmap *mask = 0;
- GdkPixmap *pixmap =
- gdk_pixmap_create_from_xpm_d (window, &mask, 0,
- (gchar **) logo_50_xpm);
- if (pixmap)
- gdk_window_set_icon (window, 0, pixmap, mask);
+ return ret;
}
-
-/* The main demo-mode command loop.
- */
#if 0
static Bool
-mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
- XrmRepresentation *type, XrmValue *value, XPointer closure)
+xrm_mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
+ XrmRepresentation *type, XrmValue *value, XPointer closure)
{
int i;
for (i = 0; quarks[i]; i++)
@@ -4401,98 +3974,146 @@ mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
fprintf (stderr, ": %s\n", (char *) value->addr);
- return False;
+ return FALSE;
+}
+#endif /* 0 */
+
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ return 0;
}
-#endif
static Window
-gnome_screensaver_window (Screen *screen)
+gnome_screensaver_window (Display *dpy, char **name_ret)
{
- Display *dpy = DisplayOfScreen (screen);
- Window root = RootWindowOfScreen (screen);
- Window parent, *kids;
- unsigned int nkids;
+ int nscreens;
+ int i, screen;
Window gnome_window = 0;
- int i;
+ XErrorHandler old_handler;
- if (! XQueryTree (dpy, root, &root, &parent, &kids, &nkids))
- abort ();
- for (i = 0; i < nkids; i++)
+ if (!dpy) return 0;
+ XSync (dpy, FALSE);
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ nscreens = ScreenCount (dpy);
+ for (screen = 0; screen < nscreens; screen++)
{
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- unsigned char *name;
- if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
- False, XA_STRING, &type, &format, &nitems,
- &bytesafter, &name)
- == Success
- && type != None
- && (!strcmp ((char *) name, "gnome-screensaver") ||
- !strcmp ((char *) name, "mate-screensaver") ||
- !strcmp ((char *) name, "cinnamon-screensaver")))
- {
- gnome_window = kids[i];
- break;
- }
+ Window root = RootWindow (dpy, screen);
+ Window parent, *kids;
+ unsigned int nkids;
+
+ if (! XQueryTree (dpy, root, &root, &parent, &kids, &nkids))
+ abort ();
+ if (name_ret)
+ *name_ret = 0;
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *name;
+ if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
+ FALSE, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &name)
+ == Success
+ && type != None
+ && (!strcmp ((char *) name, "gnome-screensaver") ||
+ !strcmp ((char *) name, "mate-screensaver") ||
+ !strcmp ((char *) name, "cinnamon-screensaver") ||
+ !strcmp ((char *) name, "xfce4-screensaver") ||
+ !strcmp ((char *) name, "light-locker")))
+ {
+ gnome_window = kids[i];
+ if (name_ret)
+ *name_ret = strdup ((char *) name);
+ break;
+ }
+ }
+ if (kids) XFree ((char *) kids);
+ if (gnome_window)
+ break;
}
- if (kids) XFree ((char *) kids);
+ XSync (dpy, FALSE);
+ XSetErrorHandler (old_handler);
return gnome_window;
}
+
static Bool
-gnome_screensaver_active_p (void)
+gnome_screensaver_active_p (state *s, char **name_ret)
{
- Display *dpy = GDK_DISPLAY();
- Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
- return (w ? True : False);
+ Window w = gnome_screensaver_window (s->dpy, name_ret);
+ return (w ? TRUE : FALSE);
}
+
static void
-kill_gnome_screensaver (void)
+kill_gnome_screensaver (state *s)
{
- Display *dpy = GDK_DISPLAY();
- Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
- if (w) XKillClient (dpy, (XID) w);
+ Window w = gnome_screensaver_window (s->dpy, NULL);
+ if (w) XKillClient (s->dpy, (XID) w);
}
+
static Bool
kde_screensaver_active_p (void)
{
+ /* Apparently this worked in KDE 3, but not 4 or 5.
+ Maybe parsing the output of this would work in KDE 5:
+ kreadconfig5 --file kscreenlockerrc --group Daemon --key Autolock
+ but there's probably no way to kill the KDE saver.
+ Fuck it. */
FILE *p = popen ("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null",
"r");
char buf[255];
- if (!p) return False;
- if (!fgets (buf, sizeof(buf)-1, p)) return False;
+ int i = 0;
+ if (!p) return FALSE;
+
+ *buf = 0;
+ do {
+ errno = 0;
+ if (! fgets (buf, sizeof(buf)-1, p))
+ *buf = 0;
+ } while (errno == EINTR && /* fgets might fail due to SIGCHLD. */
+ i++ < 1000); /* And just in case. */
+
pclose (p);
if (!strcmp (buf, "true\n"))
- return True;
+ return TRUE;
else
- return False;
+ return FALSE;
}
+
static void
-kill_kde_screensaver (void)
+kill_kde_screensaver (state *s)
{
- /* Use empty body to kill warning from gcc -Wall with
- "warning: ignoring return value of 'system',
- declared with attribute warn_unused_result"
- */
- if (system ("dcop kdesktop KScreensaverIface enable false")) {}
+ int ac = 0;
+ char *av[10];
+ av[ac++] = "dcop";
+ av[ac++] = "kdesktop";
+ av[ac++] = "KScreensaverIface";
+ av[ac++] = "enable";
+ av[ac++] = "false";
+ av[ac] = 0;
+ fork_and_exec (s, ac, av);
}
-static void
-the_network_is_not_the_computer (state *s)
+static int
+the_network_is_not_the_computer (gpointer data)
{
- Display *dpy = GDK_DISPLAY();
+ state *s = (state *) data;
char *rversion = 0, *ruser = 0, *rhost = 0;
char *luser, *lhost;
char *msg = 0;
+ char *oname = 0;
struct passwd *p = getpwuid (getuid ());
- const char *d = DisplayString (dpy);
+ const char *d = s->dpy ? DisplayString (s->dpy) : ":0.0";
# if defined(HAVE_UNAME)
struct utsname uts;
@@ -4509,7 +4130,8 @@ the_network_is_not_the_computer (state *s)
else
luser = "???";
- server_xscreensaver_version (dpy, &rversion, &ruser, &rhost);
+ if (s->dpy)
+ server_xscreensaver_version (s->dpy, &rversion, &ruser, &rhost);
/* Make a buffer that's big enough for a number of copies of all the
strings, plus some. */
@@ -4522,22 +4144,22 @@ the_network_is_not_the_computer (state *s)
1024));
*msg = 0;
- if (!rversion || !*rversion)
+ if ((!rversion || !*rversion) && !s->debug_p)
{
+# ifndef __APPLE__
sprintf (msg,
- _("Warning:\n\n"
- "The XScreenSaver daemon doesn't seem to be running\n"
- "on display \"%s\". Launch it now?"),
+ _("The XScreenSaver daemon doesn't seem to be running\n"
+ "on display \"%.25s\". Launch it now?"),
d);
+# endif
}
else if (p && ruser && *ruser && !!strcmp (ruser, p->pw_name))
{
/* Warn that the two processes are running as different users.
*/
sprintf(msg,
- _("Warning:\n\n"
- "%s is running as user \"%s\" on host \"%s\".\n"
- "But the xscreensaver managing display \"%s\"\n"
+ _("%s is running as user \"%s\" on host \"%s\".\n"
+ "But the xscreensaver managing display \"%.25s\"\n"
"is running as user \"%s\" on host \"%s\".\n"
"\n"
"Since they are different users, they won't be reading/writing\n"
@@ -4560,8 +4182,7 @@ the_network_is_not_the_computer (state *s)
/* Warn that the two processes are running on different hosts.
*/
sprintf (msg,
- _("Warning:\n\n"
- "%s is running as user \"%s\" on host \"%s\".\n"
+ _("%s is running as user \"%s\" on host \"%s\".\n"
"But the xscreensaver managing display \"%s\"\n"
"is running as user \"%s\" on host \"%s\".\n"
"\n"
@@ -4577,13 +4198,12 @@ the_network_is_not_the_computer (state *s)
progname,
lhost, luser);
}
- else if (!!strcmp (rversion, s->short_version))
+ else if (rversion && *rversion && !!strcmp (rversion, s->short_version))
{
/* Warn that the version numbers don't match.
*/
sprintf (msg,
- _("Warning:\n\n"
- "This is %s version %s.\n"
+ _("This is %s version %s.\n"
"But the xscreensaver managing display \"%s\"\n"
"is version %s. This could cause problems.\n"
"\n"
@@ -4593,9 +4213,10 @@ the_network_is_not_the_computer (state *s)
rversion);
}
+ validate_image_directory_quick (s);
if (*msg)
- warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
+ warning_dialog_1 (s->window, _("Warning"), msg, D_LAUNCH);
if (rversion) free (rversion);
if (ruser) free (ruser);
@@ -4608,23 +4229,42 @@ the_network_is_not_the_computer (state *s)
running" dialog so that these are on top. Good enough.
*/
- if (gnome_screensaver_active_p ())
- warning_dialog (s->toplevel_widget,
- _("Warning:\n\n"
- "The GNOME screensaver daemon appears to be running.\n"
- "It must be stopped for XScreenSaver to work properly.\n"
- "\n"
- "Stop the GNOME screen saver daemon now?\n"),
- D_GNOME, 1);
+ if (gnome_screensaver_active_p (s, &oname))
+ {
+ char msg [1024];
+ sprintf (msg,
+ _("The GNOME screen saver daemon (%s) appears to be running.\n"
+ "It must be stopped for XScreenSaver to work properly.\n"
+ "\n"
+ "Stop the \"%s\" daemon now?\n"),
+ oname, oname);
+ warning_dialog_1 (s->window, _("Warning"), msg, D_GNOME);
+ }
- if (kde_screensaver_active_p ())
- warning_dialog (s->toplevel_widget,
- _("Warning:\n\n"
- "The KDE screen saver daemon appears to be running.\n"
+ if (kde_screensaver_active_p())
+ warning_dialog_1 (s->window, _("Warning"),
+ _("The KDE screen saver daemon appears to be running.\n"
"It must be stopped for XScreenSaver to work properly.\n"
"\n"
"Stop the KDE screen saver daemon now?\n"),
- D_KDE, 1);
+ D_KDE);
+
+ if (! s->gl_visual)
+ warning_dialog (s->window, _("Error"),
+ _("No GL visuals: the xscreensaver-gl* packages are required."));
+
+ if (s->wayland_p)
+ warning_dialog (s->window, _("Warning"),
+ _("You are running Wayland rather than the X Window System.\n"
+ "\n"
+ "Under Wayland, idle-detection fails when non-X11 programs\n"
+ "are selected, meaning the screen may blank prematurely.\n"
+ "Also, locking is impossible.\n"
+ "\n"
+ "See the XScreenSaver manual for instructions on\n"
+ "configuring your system to use X11 instead of Wayland.\n"));
+
+ return FALSE; /* Only run timer once */
}
@@ -4632,739 +4272,1155 @@ the_network_is_not_the_computer (state *s)
of the program that generated them.
*/
static int
-demo_ehandler (Display *dpy, XErrorEvent *error)
+x_error (Display *dpy, XErrorEvent *error)
{
- state *s = global_state_kludge; /* I hate C so much... */
- fprintf (stderr, "\nX error in %s:\n", blurb());
+ fprintf (stderr, "\n%s: X error:\n", blurb());
XmuPrintDefaultErrorMessage (dpy, error, stderr);
- kill_preview_subproc (s, False);
- exit (-1);
+ /* No way to get 'state' in here... */
+ /* kill_preview_subproc (s, FALSE); */
+ exit (-1); /* Likewise, no way to call g_application_quit(). */
return 0;
}
-/* We use this error handler so that Gtk/Gdk errors are preceeded by the name
- of the program that generated them; and also that we can ignore one
- particular bogus error message that Gdk madly spews.
- */
static void
-g_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
- const gchar *message, gpointer user_data)
-{
- /* Ignore the message "Got event for unknown window: 0x...".
- Apparently some events are coming in for the xscreensaver window
- (presumably reply events related to the ClientMessage) and Gdk
- feels the need to complain about them. So, just suppress any
- messages that look like that one.
- */
- if (strstr (message, "unknown window"))
- return;
+g_logger (const gchar *domain, GLogLevelFlags log_level,
+ const gchar *message, gpointer data)
+{
+ if (log_level & G_LOG_LEVEL_DEBUG) return;
+ if (log_level & G_LOG_LEVEL_INFO) return;
+ fprintf (stderr, "%s: %s: %s\n", blurb(), domain, message);
+ if (log_level & G_LOG_LEVEL_CRITICAL) exit (-1);
+}
- fprintf (stderr, "%s: %s-%s: %s%s", blurb(),
- (log_domain ? log_domain : progclass),
- (log_level == G_LOG_LEVEL_ERROR ? "error" :
- log_level == G_LOG_LEVEL_CRITICAL ? "critical" :
- log_level == G_LOG_LEVEL_WARNING ? "warning" :
- log_level == G_LOG_LEVEL_MESSAGE ? "message" :
- log_level == G_LOG_LEVEL_INFO ? "info" :
- log_level == G_LOG_LEVEL_DEBUG ? "debug" : "???"),
- message,
- ((!*message || message[strlen(message)-1] != '\n')
- ? "\n" : ""));
+/* Why are there two of these hooks and why does this one suck so hard?? */
+static GLogWriterOutput
+g_other_logger (GLogLevelFlags log_level, const GLogField *fields,
+ gsize n_fields, gpointer data)
+{
+ int i;
+ GLogWriterOutput ret = G_LOG_WRITER_UNHANDLED;
+ if (log_level & G_LOG_LEVEL_DEBUG) return ret;
+ if (log_level & G_LOG_LEVEL_INFO) return ret;
+ for (i = 0; i < n_fields; i++)
+ {
+ const GLogField *field = &fields[i];
+ if (strcmp (field->key, "MESSAGE")) continue;
+ fprintf (stderr, "%s: %s\n", blurb(), (char *) field->value);
+ ret = G_LOG_WRITER_HANDLED;
+ }
+ if (log_level & G_LOG_LEVEL_CRITICAL) exit (-1);
+ return ret;
}
-STFU
-static char *defaults[] = {
-#include "XScreenSaver_ad.h"
- 0
-};
+/****************************************************************************
-#if 0
-#ifdef HAVE_CRAPPLET
-static struct poptOption crapplet_options[] = {
- {NULL, '\0', 0, NULL, 0}
-};
-#endif /* HAVE_CRAPPLET */
-#endif /* 0 */
+ XScreenSaverDialog callbacks, referenced by prefs.ui.
-const char *usage = "[--display dpy] [--prefs | --settings]"
-# ifdef HAVE_CRAPPLET
- " [--crapplet]"
-# endif
- "\n\t\t [--debug] [--sync] [--no-xshm] [--configdir dir]";
+ ****************************************************************************/
-static void
-map_popup_window_cb (GtkWidget *w, gpointer user_data)
+/* The "Documentation" button on the Settings dialog */
+G_MODULE_EXPORT void
+manual_cb (GtkButton *button, gpointer user_data)
{
- state *s = (state *) user_data;
- Boolean oi = s->initializing_p;
-#ifndef HAVE_GTK2
- GtkLabel *label = GTK_LABEL (name_to_widget (s, "doc"));
-#endif
- s->initializing_p = True;
-#ifndef HAVE_GTK2
- eschew_gtk_lossage (label);
-#endif
- s->initializing_p = oi;
-}
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ saver_preferences *p = &s->prefs;
+ GtkWidget *list_widget = win->list;
+ int list_elt = selected_list_element (s);
+ int hack_number;
+ char *name, *name2, *cmd, *str;
+ char *oname = 0;
+ if (s->debug_p) fprintf (stderr, "%s: documentation button\n", blurb());
+ if (list_elt < 0) return;
+ hack_number = s->list_elt_to_hack_number[list_elt];
+ flush_dialog_changes_and_save (s);
+ ensure_selected_item_visible (s, list_widget);
-#if 0
-static void
-print_widget_tree (GtkWidget *w, int depth)
-{
- int i;
- for (i = 0; i < depth; i++)
- fprintf (stderr, " ");
- fprintf (stderr, "%s\n", gtk_widget_get_name (w));
+ name = strdup (p->screenhacks[hack_number]->command);
+ name2 = name;
+ oname = name;
+ while (isspace (*name2)) name2++;
+ str = name2;
+ while (*str && !isspace (*str)) str++;
+ *str = 0;
+ str = strrchr (name2, '/');
+ if (str) name2 = str+1;
- if (GTK_IS_LIST (w))
+ cmd = get_string_resource (s->dpy, "manualCommand", "ManualCommand");
+ if (cmd)
{
- for (i = 0; i < depth+1; i++)
- fprintf (stderr, " ");
- fprintf (stderr, "...list kids...\n");
+ int ac = 0;
+ char *av[10];
+ char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100);
+ sprintf (cmd2, cmd, name2, name2, name2, name2);
+ av[ac++] = "/bin/sh";
+ av[ac++] = "-c";
+ av[ac++] = cmd2;
+ av[ac] = 0;
+ fork_and_exec (s, ac, av);
+ free (cmd2);
}
- else if (GTK_IS_CONTAINER (w))
+ else
{
- GList *kids = gtk_container_children (GTK_CONTAINER (w));
- while (kids)
- {
- print_widget_tree (GTK_WIDGET (kids->data), depth+1);
- kids = kids->next;
- }
+ warning_dialog (s->window, _("Error"),
+ _("no `manualCommand' resource set."));
}
+
+ free (oname);
}
-#endif /* 0 */
-static int
-delayed_scroll_kludge (gpointer data)
+
+static void
+settings_sync_cmd_text (state *s)
{
- state *s = (state *) data;
- GtkWidget *w = GTK_WIDGET (name_to_widget (s, "list"));
- ensure_selected_item_visible (w);
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
+ GtkWidget *cmd = GTK_WIDGET (dialog->cmd_text);
+ char *cmd_line;
+ if (! s->cdata) return;
+ cmd_line = get_configurator_command_line (s->cdata, FALSE);
+ gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
+ free (cmd_line);
+}
- /* Oh, this is just fucking lovely, too. */
- w = GTK_WIDGET (name_to_widget (s, "preview"));
- gtk_widget_hide (w);
- gtk_widget_show (w);
- return FALSE; /* do not re-execute timer */
+/* The "Advanced" button on the settings dialog. */
+G_MODULE_EXPORT void
+settings_adv_cb (GtkButton *button, gpointer user_data)
+{
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ GtkNotebook *notebook = GTK_NOTEBOOK (dialog->opt_notebook);
+ if (s->debug_p) fprintf (stderr, "%s: settings advanced button\n", blurb());
+ settings_sync_cmd_text (s);
+ gtk_notebook_set_current_page (notebook, 1);
}
-#ifdef HAVE_GTK2
-static GtkWidget *
-create_xscreensaver_demo (void)
+/* The "Standard" button on the settings dialog. */
+G_MODULE_EXPORT void
+settings_std_cb (GtkButton *button, gpointer user_data)
{
- GtkWidget *nb;
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ GtkNotebook *notebook = GTK_NOTEBOOK (dialog->opt_notebook);
+ if (s->debug_p) fprintf (stderr, "%s: settings standard button\n", blurb());
+ settings_sync_cmd_text (s);
+ gtk_notebook_set_current_page (notebook, 0);
+}
- nb = name_to_widget (global_state_kludge, "preview_notebook");
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), FALSE);
- return name_to_widget (global_state_kludge, "xscreensaver_demo");
+/* The "Reset to Defaults" button on the settings dialog. */
+G_MODULE_EXPORT void
+settings_reset_cb (GtkButton *button, gpointer user_data)
+{
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ GtkWidget *cmd = GTK_WIDGET (dialog->cmd_text);
+ state *s = &win->state;
+ char *cmd_line;
+ if (s->debug_p) fprintf (stderr, "%s: settings reset button\n", blurb());
+ if (! s->cdata) return;
+ cmd_line = get_configurator_command_line (s->cdata, TRUE);
+ gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
+ free (cmd_line);
+ populate_popup_window (s);
}
-static GtkWidget *
-create_xscreensaver_settings_dialog (void)
+
+/* Called when "Advanced/Standard" buttons change the displayed page. */
+G_MODULE_EXPORT void
+settings_switch_page_cb (GtkNotebook *notebook, GtkWidget *page,
+ gint page_num, gpointer user_data)
{
- GtkWidget *w, *box;
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ GtkWidget *adv = dialog->adv_button;
+ GtkWidget *std = dialog->std_button;
+ if (s->debug_p) fprintf (stderr, "%s: settings page changed\n", blurb());
- box = name_to_widget (global_state_kludge, "dialog_action_area");
+ if (page_num == 0)
+ {
+ gtk_widget_show (adv);
+ gtk_widget_hide (std);
+ }
+ else if (page_num == 1)
+ {
+ gtk_widget_hide (adv);
+ gtk_widget_show (std);
+ }
+ else
+ abort();
- w = name_to_widget (global_state_kludge, "adv_button");
- gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), w, TRUE);
+ /* Nobody uses the "Advanced" tab. Let's just hide it.
+ (The tab still needs to be there, since the 'cmd_text' widget is
+ what gets stored into the .xscreensaver file.) */
+ gtk_widget_hide (adv);
+ gtk_widget_hide (std);
+}
- w = name_to_widget (global_state_kludge, "std_button");
- gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), w, TRUE);
- return name_to_widget (global_state_kludge, "xscreensaver_settings_dialog");
+/* The "Cancel" button on the Settings dialog. */
+G_MODULE_EXPORT void
+settings_cancel_cb (GtkWidget *button, gpointer user_data)
+{
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ if (s->debug_p) fprintf (stderr, "%s: settings cancel button\n", blurb());
+ gtk_widget_hide (GTK_WIDGET (dialog));
+ gtk_widget_unrealize (GTK_WIDGET (dialog));
+
+ /* Restart the hack running in the Preview window with the reset options. */
+ schedule_preview (s, dialog->unedited_cmdline);
}
-#endif /* HAVE_GTK2 */
-int
-main (int argc, char **argv)
+/* The "Ok" button on the Settings dialog. */
+G_MODULE_EXPORT void
+settings_ok_cb (GtkWidget *button, gpointer user_data)
{
- XtAppContext app;
- state S, *s;
- saver_preferences *p;
- Bool prefs_p = False;
- Bool settings_p = False;
- int i;
- Display *dpy;
- Widget toplevel_shell;
- char *real_progname = argv[0];
- char *window_title;
- char *geom = 0;
- Bool crapplet_p = False;
- char *str;
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ GtkNotebook *notebook = GTK_NOTEBOOK (dialog->opt_notebook);
+ int page = gtk_notebook_get_current_page (notebook);
+ if (s->debug_p) fprintf (stderr, "%s: settings ok button\n", blurb());
-#ifdef ENABLE_NLS
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
+ if (page == 0)
+ /* Regenerate the command-line from the widget contents before saving.
+ But don't do this if we're looking at the command-line page already,
+ or we will blow away what they typed... */
+ settings_sync_cmd_text (s);
-# ifdef HAVE_GTK2
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-# else /* !HAVE_GTK2 */
- if (!setlocale (LC_ALL, ""))
- fprintf (stderr, "%s: locale not supported by C library\n", real_progname);
-# endif /* !HAVE_GTK2 */
+ flush_popup_changes_and_save (s);
+ gtk_widget_hide (GTK_WIDGET (dialog));
+ gtk_widget_unrealize (GTK_WIDGET (dialog));
+}
-#endif /* ENABLE_NLS */
- str = strrchr (real_progname, '/');
- if (str) real_progname = str+1;
+/* Called when any widget value is changed in the Settings dialog. */
+static void
+dialog_change_cb (GtkWidget *widget, gpointer user_data)
+{
+ state *s = (state *) user_data;
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
+ char *cur_cmd, *def_cmd;
+ const char *prev_cmd;
+ if (!dialog || !s->cdata) return;
+ settings_sync_cmd_text (s);
+ cur_cmd = get_configurator_command_line (s->cdata, FALSE);
+ def_cmd = get_configurator_command_line (s->cdata, TRUE);
+ prev_cmd = dialog->unedited_cmdline;
- s = &S;
- memset (s, 0, sizeof(*s));
- s->initializing_p = True;
- p = &s->prefs;
+ /* "Reset to Defaults" button enabled only if current cmd is not default. */
+ gtk_widget_set_sensitive (dialog->reset_button,
+ !!strcmp (cur_cmd, def_cmd));
- global_state_kludge = s; /* I hate C so much... */
+ /* "Save" button enabled only if current cmd is edited. */
+ gtk_widget_set_sensitive (dialog->ok_button,
+ !!strcmp (cur_cmd, prev_cmd));
- progname = real_progname;
+ /* Restart the hack running in the Preview window with the prevailing,
+ un-saved set of options, for a realtime preview of what they do. */
+ schedule_preview (s, cur_cmd);
- s->short_version = XSCREENSAVER_VERSION;
+ free (cur_cmd);
+ free (def_cmd);
+}
+
+
+/* Fill in the contents of the "Settings" dialog for the current hack.
+ It may or may not currently be visible.
+ */
+static void
+populate_popup_window (state *s)
+{
+ saver_preferences *p = &s->prefs;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
+
+ GtkLabel *doc = dialog ? GTK_LABEL (dialog->doc) : 0;
+ char *doc_string = 0;
+
+ if (s->cdata)
+ {
+ free_conf_data (s->cdata);
+ s->cdata = 0;
+ }
- /* Register our error message logger for every ``log domain'' known.
- There's no way to do this globally, so I grepped the Gtk/Gdk sources
- for all of the domains that seem to be in use.
- */
{
- const char * const domains[] = { 0,
- "Gtk", "Gdk", "GLib", "GModule",
- "GThread", "Gnome", "GnomeUI" };
- for (i = 0; i < countof(domains); i++)
- g_log_set_handler (domains[i], G_LOG_LEVEL_MASK, g_log_handler, 0);
+ int list_elt = selected_list_element (s);
+ int hack_number = (list_elt >= 0 && list_elt < s->list_count
+ ? s->list_elt_to_hack_number[list_elt]
+ : -1);
+ screenhack *hack = (hack_number >= 0 ? p->screenhacks[hack_number] : 0);
+
+ if (p->mode == BLANK_ONLY || p->mode == DONT_BLANK)
+ hack = 0;
+
+ if (hack && dialog)
+ {
+ GtkWidget *parent = dialog->settings_vbox;
+ GtkWidget *cmd = GTK_WIDGET (dialog->cmd_text);
+ const char *cmd_line = gtk_entry_get_text (GTK_ENTRY (cmd));
+ if (!cmd_line) abort();
+ s->cdata = load_configurator (cmd_line, dialog_change_cb, s,
+ s->debug_p);
+ dialog_change_cb (NULL, s);
+ if (s->cdata && s->cdata->widget)
+ gtk_box_pack_start (GTK_BOX (parent), s->cdata->widget,
+ TRUE, TRUE, 0);
+
+ /* Make the pretty name on the tab boxes include the year and be bold.
+ */
+ if (s->cdata && s->cdata->year)
+ {
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkFrame *frame1 = GTK_FRAME (win->preview_frame);
+ GtkFrame *frame2 = GTK_FRAME (dialog->opt_frame);
+ char *pretty_name = (hack->name
+ ? strdup (hack->name)
+ : make_hack_name (s->dpy, hack->command));
+ char *s2 = (char *) malloc (strlen (pretty_name) + 20);
+ sprintf (s2, "<b>%s (%d)</b>", pretty_name, s->cdata->year);
+ free (pretty_name);
+ pretty_name = s2;
+
+ gtk_frame_set_label (frame1, _(pretty_name));
+ gtk_frame_set_label (frame2, _(pretty_name));
+ gtk_label_set_use_markup ( /* Must be after set_label */
+ GTK_LABEL (gtk_frame_get_label_widget (frame1)), TRUE);
+ gtk_label_set_use_markup (
+ GTK_LABEL (gtk_frame_get_label_widget (frame2)), TRUE);
+ free (pretty_name);
+ }
+ }
}
-#ifdef DEFAULT_ICONDIR /* from -D on compile line */
-# ifndef HAVE_GTK2
+ doc_string = (s->cdata && s->cdata->description && *s->cdata->description
+ ? _(s->cdata->description)
+ : 0);
+ doc_string = hreffify (doc_string);
+ if (doc)
+ {
+ GtkWidget *w = dialog->dialog_vbox;
+ gtk_label_set_text (doc, (doc_string
+ ? doc_string
+ : _("No description available.")));
+ gtk_label_set_use_markup (doc, TRUE);
+
+ /* Shrink the dialog to the minimum viable size. */
+ gtk_window_resize (GTK_WINDOW (dialog), 1, 1);
+
+ gtk_widget_hide (w);
+ gtk_widget_unrealize (w);
+ gtk_widget_realize (w);
+ gtk_widget_show (w);
+ }
+
+ /* Also set the documentation on the main window, below the preview. */
{
- const char *dir = DEFAULT_ICONDIR;
- if (*dir) add_pixmap_directory (dir);
+ GtkLabel *doc2 = GTK_LABEL (win->short_preview_label);
+ GtkLabel *doc3 = GTK_LABEL (win->preview_author_label);
+ char *s2 = 0;
+ char *s3 = 0;
+
+ if (doc_string)
+ {
+ /* Keep only the first paragraph, and the last line.
+ Omit everything in between. */
+ const char *second_para = strstr (doc_string, "\n\n");
+ const char *last_line = strrchr (doc_string, '\n');
+ s2 = strdup (doc_string);
+ if (second_para)
+ s2[second_para - doc_string] = 0;
+ if (last_line)
+ s3 = strdup (last_line + 1);
+ }
+
+ gtk_label_set_text (doc2,
+ (s2
+ ? _(s2)
+ : (p->mode == BLANK_ONLY || p->mode == DONT_BLANK)
+ ? ""
+ : _("No description available.")));
+ gtk_label_set_text (doc3, (s3 ? _(s3) : ""));
+ if (s2) free (s2);
+ if (s3) free (s3);
}
-# endif /* !HAVE_GTK2 */
-#endif /* DEFAULT_ICONDIR */
- /* This is gross, but Gtk understands --display and not -display...
- */
- for (i = 1; i < argc; i++)
- if (argv[i][0] && argv[i][1] &&
- !strncmp(argv[i], "-display", strlen(argv[i])))
- argv[i] = "--display";
+ if (doc_string)
+ free (doc_string);
+}
- /* We need to parse this arg really early... Sigh. */
- for (i = 1; i < argc; i++)
+static void
+sensitize_demo_widgets (state *s, Bool sensitive_p)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
+ gtk_widget_set_sensitive (win->demo, sensitive_p);
+ gtk_widget_set_sensitive (win->settings, sensitive_p);
+ if (dialog)
{
- if (argv[i] &&
- (!strcmp(argv[i], "--crapplet") ||
- !strcmp(argv[i], "--capplet")))
- {
-# if defined(HAVE_CRAPPLET) || defined(HAVE_GTK2)
- int j;
- crapplet_p = True;
- for (j = i; j < argc; j++) /* remove it from the list */
- argv[j] = argv[j+1];
- argc--;
-# else /* !HAVE_CRAPPLET && !HAVE_GTK2 */
- fprintf (stderr, "%s: not compiled with --crapplet support\n",
- real_progname);
- fprintf (stderr, "%s: %s\n", real_progname, usage);
- exit (1);
-# endif /* !HAVE_CRAPPLET && !HAVE_GTK2 */
- }
- else if (argv[i] &&
- (!strcmp(argv[i], "--debug") ||
- !strcmp(argv[i], "-debug") ||
- !strcmp(argv[i], "-d")))
- {
- int j;
- s->debug_p = True;
- for (j = i; j < argc; j++) /* remove it from the list */
- argv[j] = argv[j+1];
- argc--;
- i--;
- }
- else if (argv[i] &&
- argc > i+1 &&
- *argv[i+1] &&
- (!strcmp(argv[i], "-geometry") ||
- !strcmp(argv[i], "-geom") ||
- !strcmp(argv[i], "-geo") ||
- !strcmp(argv[i], "-g")))
- {
- int j;
- geom = argv[i+1];
- for (j = i; j < argc; j++) /* remove them from the list */
- argv[j] = argv[j+2];
- argc -= 2;
- i -= 2;
- }
- else if (argv[i] &&
- argc > i+1 &&
- *argv[i+1] &&
- (!strcmp(argv[i], "--configdir")))
- {
- int j;
- struct stat st;
- hack_configuration_path = argv[i+1];
- for (j = i; j < argc; j++) /* remove them from the list */
- argv[j] = argv[j+2];
- argc -= 2;
- i -= 2;
-
- if (0 != stat (hack_configuration_path, &st))
- {
- char buf[255];
- sprintf (buf, "%s: %.200s", blurb(), hack_configuration_path);
- perror (buf);
- exit (1);
- }
- else if (!S_ISDIR (st.st_mode))
- {
- fprintf (stderr, "%s: not a directory: %s\n",
- blurb(), hack_configuration_path);
- exit (1);
- }
- }
+ gtk_widget_set_sensitive (dialog->cmd_label, sensitive_p);
+ gtk_widget_set_sensitive (dialog->cmd_text, sensitive_p);
+ gtk_widget_set_sensitive (dialog->manual, sensitive_p);
+ gtk_widget_set_sensitive (dialog->visual, sensitive_p);
+ gtk_widget_set_sensitive (dialog->visual_combo, sensitive_p);
}
+}
- if (s->debug_p)
- fprintf (stderr, "%s: using config directory \"%s\"\n",
- progname, hack_configuration_path);
+/* Flush out any changes made in the popup dialog box (where changes
+ take place only when the OK button is clicked.)
+ */
+static Bool
+flush_popup_changes_and_save (state *s)
+{
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog);
+ Bool changed = FALSE;
+ saver_preferences *p = &s->prefs;
+ int list_elt = selected_list_element (s);
+
+ GtkEntry *cmd = GTK_ENTRY (dialog->cmd_text);
+ GtkWidget *vis = GTK_WIDGET (dialog->visual_combo);
+ GtkEntry *visent = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (vis)));
+
+ const char *visual = gtk_entry_get_text (visent);
+ const char *command = gtk_entry_get_text (cmd);
+
+ char c;
+ unsigned long id;
+
+ if (s->saving_p) return FALSE;
+ s->saving_p = TRUE;
+
+ if (list_elt < 0)
+ goto DONE;
+
+ if (maybe_reload_init_file (s) != 0)
+ {
+ changed = TRUE;
+ goto DONE;
+ }
- /* Let Gtk open the X connection, then initialize Xt to use that
- same connection. Doctor Frankenstein would be proud.
+ /* Sanity-check and canonicalize whatever the user typed into the combo box.
*/
-# ifdef HAVE_CRAPPLET
- if (crapplet_p)
+ if (!strcasecmp (visual, "")) visual = "";
+ else if (!strcasecmp (visual, "any")) visual = "";
+ else if (!strcasecmp (visual, "default")) visual = "Default";
+ else if (!strcasecmp (visual, "default-n")) visual = "Default-N";
+ else if (!strcasecmp (visual, "default-i")) visual = "Default-I";
+ else if (!strcasecmp (visual, "best")) visual = "Best";
+ else if (!strcasecmp (visual, "mono")) visual = "Mono";
+ else if (!strcasecmp (visual, "monochrome")) visual = "Mono";
+ else if (!strcasecmp (visual, "gray")) visual = "Gray";
+ else if (!strcasecmp (visual, "grey")) visual = "Gray";
+ else if (!strcasecmp (visual, "color")) visual = "Color";
+ else if (!strcasecmp (visual, "gl")) visual = "GL";
+ else if (!strcasecmp (visual, "staticgray")) visual = "StaticGray";
+ else if (!strcasecmp (visual, "staticcolor")) visual = "StaticColor";
+ else if (!strcasecmp (visual, "truecolor")) visual = "TRUEColor";
+ else if (!strcasecmp (visual, "grayscale")) visual = "GrayScale";
+ else if (!strcasecmp (visual, "greyscale")) visual = "GrayScale";
+ else if (!strcasecmp (visual, "pseudocolor")) visual = "PseudoColor";
+ else if (!strcasecmp (visual, "directcolor")) visual = "DirectColor";
+ else if (1 == sscanf (visual, " %lu %c", &id, &c)) ;
+ else if (1 == sscanf (visual, " 0x%lx %c", &id, &c)) ;
+ else visual = "";
+
+ changed = flush_changes (s, list_elt, -1, command, visual);
+ if (changed)
{
- GnomeClient *client;
- GnomeClientFlags flags = 0;
-
- int init_results = gnome_capplet_init ("screensaver-properties",
- s->short_version,
- argc, argv, NULL, 0, NULL);
- /* init_results is:
- 0 upon successful initialization;
- 1 if --init-session-settings was passed on the cmdline;
- 2 if --ignore was passed on the cmdline;
- -1 on error.
-
- So the 1 signifies just to init the settings, and quit, basically.
- (Meaning launch the xscreensaver daemon.)
- */
+ demo_write_init_file (s, p);
- if (init_results < 0)
- {
-# if 0
- g_error ("An initialization error occurred while "
- "starting xscreensaver-capplet.\n");
-# else /* !0 */
- fprintf (stderr, "%s: gnome_capplet_init failed: %d\n",
- real_progname, init_results);
- exit (1);
-# endif /* !0 */
- }
+ /* Do this to re-launch the hack if (and only if) the command line
+ has changed. */
+ populate_demo_window (s, selected_list_element (s));
+ }
- client = gnome_master_client ();
+ DONE:
+ s->saving_p = FALSE;
+ return changed;
+}
- if (client)
- flags = gnome_client_get_flags (client);
- if (flags & GNOME_CLIENT_IS_CONNECTED)
- {
- int token =
- gnome_startup_acquire_token ("GNOME_SCREENSAVER_PROPERTIES",
- gnome_client_get_id (client));
- if (token)
- {
- char *session_args[20];
- int i = 0;
- session_args[i++] = real_progname;
- session_args[i++] = "--capplet";
- session_args[i++] = "--init-session-settings";
- session_args[i] = 0;
- gnome_client_set_priority (client, 20);
- gnome_client_set_restart_style (client, GNOME_RESTART_ANYWAY);
- gnome_client_set_restart_command (client, i, session_args);
- }
- else
- {
- gnome_client_set_restart_style (client, GNOME_RESTART_NEVER);
- }
+/****************************************************************************
- gnome_client_flush (client);
- }
+ XScreenSaverWindow
- if (init_results == 1)
- {
- system ("xscreensaver -nosplash &");
- return 0;
- }
+ ****************************************************************************/
- }
+
+static void
+xscreensaver_window_destroy (GObject *object)
+{
+ /* Called by WM close box, but not by File / Quit */
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (object);
+ quit_menu_cb (NULL, win); /* Shouldn't return? */
+ G_OBJECT_CLASS (xscreensaver_window_parent_class)->dispose (object);
+}
+
+
+/* gtk_window_move() sets the origin of the window's WM decorations, but
+ GTK's "configure-event" returns the root-relative origin of the window
+ within the decorations, so the "configure-event" numbers are too large by
+ the size of the decorations (title bar and border). Without compensating
+ for this, the window would move down and slightly to the right every time
+ we saved and restored. GDK provides no way to find those numbers, so we
+ have to hack it out X11 style...
+ */
+static void
+wm_decoration_origin (GtkWindow *gtkw, int *x, int *y)
+{
+ Display *dpy = gdk_x11_get_default_xdisplay();
+ GdkWindow *gdkw = gtk_widget_get_window (GTK_WIDGET (gtkw));
+ Window xw = gdk_x11_window_get_xid (gdkw);
+
+ Window root, parent, *kids;
+ unsigned int nkids;
+
+ Atom type = None;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *data;
+
+ static Atom swm_vroot = 0;
+ XWindowAttributes xgwa;
+
+ if (!dpy || !xw) return;
+ if (! XQueryTree (dpy, xw, &root, &parent, &kids, &nkids))
+ abort ();
+ if (kids) XFree ((char *) kids);
+
+ if (parent == root) /* No window above us at all */
+ return;
+
+ if (! swm_vroot)
+ swm_vroot = XInternAtom (dpy, "__SWM_VROOT", FALSE);
+
+ /* If parent is a virtual root, there is no intervening WM decoration. */
+ if (XGetWindowProperty (dpy, parent, swm_vroot,
+ 0, 0, FALSE, AnyPropertyType,
+ &type, &format, &nitems, &bytesafter,
+ (unsigned char **) &data)
+ == Success
+ && type != None)
+ return;
+
+ /* If we have a parent, it is the WM decoration, so use its origin. */
+ if (! XGetWindowAttributes (dpy, parent, &xgwa))
+ abort();
+ *x = xgwa.x;
+ *y = xgwa.y;
+}
+
+
+static void
+save_window_position (state *s, GtkWindow *win, int x, int y, Bool dialog_p)
+{
+ saver_preferences *p = &s->prefs;
+ int win_x, win_y, dialog_x, dialog_y;
+ char dummy;
+ char *old = p->settings_geom;
+ char str[100];
+
+ if (!s->dpy || s->wayland_p) return;
+ wm_decoration_origin (win, &x, &y);
+
+ if (!old || !*old ||
+ 4 != sscanf (old, " %d , %d %d , %d %c",
+ &win_x, &win_y, &dialog_x, &dialog_y, &dummy))
+ win_x = win_y = dialog_x = dialog_y = -1;
+
+ if (dialog_p)
+ dialog_x = x, dialog_y = y;
else
-# endif /* HAVE_CRAPPLET */
+ win_x = x, win_y = y;
+
+ sprintf (str, "%d,%d %d,%d", win_x, win_y, dialog_x, dialog_y);
+
+ if (old && !strcmp (old, str)) return; /* unchanged */
+
+ p->settings_geom = strdup (str);
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: geom: %s => %s\n", blurb(),
+ (old ? old : "null"), str);
+
+ /* This writes the .xscreensaver file repeatedly as the window is dragged,
+ which is too much. We could defer it with a timer. But instead let's
+ just not save it upon resize, and only save the positions once the
+ file is written due to some other change.
+ */
+ /* demo_write_init_file (s, p); */
+ if (old) free (old);
+}
+
+
+static void
+restore_window_position (state *s, GtkWindow *window, Bool dialog_p)
+{
+ saver_preferences *p = &s->prefs;
+ int win_x, win_y, dialog_x, dialog_y, x, y;
+ char dummy;
+ char *old = p->settings_geom;
+
+ if (!old || !*old ||
+ 4 != sscanf (old, " %d , %d %d , %d %c",
+ &win_x, &win_y, &dialog_x, &dialog_y, &dummy))
+ win_x = win_y = dialog_x = dialog_y = -1;
+
+ if (dialog_p)
+ x = dialog_x, y = dialog_y;
+ else
+ x = win_x, y = win_y;
+
+ if (x <= 0 || y <= 0) return;
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: restore origin: %d,%d\n", blurb(), x, y);
+ gtk_window_move (window, x, y);
+}
+
+
+/* When the window is moved, save the new origin in .xscreensaver. */
+static gboolean
+xscreensaver_window_resize_cb (GtkWindow *window, GdkEvent *event,
+ gpointer data)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (window);
+ state *s = &win->state;
+ save_window_position (s, GTK_WINDOW (win),
+ event->configure.x, event->configure.y, FALSE);
+ return FALSE;
+}
+
+
+static int
+delayed_scroll_kludge (gpointer data)
+{
+ state *s = (state *) data;
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window);
+ GtkWidget *list_widget = win->list;
+ ensure_selected_item_visible (s, list_widget);
+ return FALSE; /* do not re-execute timer */
+}
+
+
+static void
+quit_action_cb (GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ quit_menu_cb (NULL, user_data);
+}
+
+
+static GActionEntry app_entries[] = {
+ { "quit", quit_action_cb, NULL, NULL, NULL },
+/*
+ { "undo", undo_action_cb, NULL, NULL, NULL },
+ { "redo", redo_action_cb, NULL, NULL, NULL },
+ { "cut", cut_action_cb, NULL, NULL, NULL },
+ { "copy", copy_action_cb, NULL, NULL, NULL },
+ { "paste", paste_action_cb, NULL, NULL, NULL },
+ { "delete", delete_action_cb, NULL, NULL, NULL },
+*/
+};
+
+/* #### I don't know how to make the accelerators show up on the menu items,
+ and I don't understand the difference between "callbacks" and "actions".
+ I see examples in other .ui files that do things like:
+
+ <ui>
+ <menubar name="menubar">
+ <menu action="file">
+ <menuitem name="activate_menu" action="activate_action"/>
+ or
+ <menu id="menubar">
+ <submenu>
+ <attribute name="label">File</attribute>
+ <section>
+ <item>
+ <attribute name="label">Activate</attribute>
+ <attribute name="action">app.activate</attribute>
+
+ but when I put variants of that in demo.ui, nothing shows up.
+
+ It would be nice to have an "Edit" menu with working text-editing commands
+ on it, for use with our various text fields. One would think that a GUI
+ toolkit would provide boilerplate for such things, but nooooo...
+ */
+const gchar *accels[][2] = {
+ { "app.quit", "<Ctrl>Q" },
+/*
+ { "app.undo", "<Ctrl>Z" },
+ { "app.redo", "<Ctrl>Y" },
+ { "app.cut", "<Ctrl>X" },
+ { "app.copy", "<Ctrl>C" },
+ { "app.paste", "<Ctrl>V" },
+*/
+};
+
+
+static void
+xscreensaver_window_realize (GtkWidget *self, gpointer user_data)
+{
+ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (self);
+ state *s = &win->state;
+ saver_preferences *p = &s->prefs;
+
+ s->initializing_p = TRUE;
+ s->short_version = XSCREENSAVER_VERSION;
+ s->window = GTK_WINDOW (win);
+
+ s->dpy = gdk_x11_get_default_xdisplay();
+
+ /* Debian 11.4, Gtk 3.24.24, 2022: under Wayland, get_default_xdisplay is
+ returning uninitialized data! However, gdk_x11_window_get_xid prints a
+ warning and returns NULL. So let's try that, and as a fallback, also try
+ and sanity check the contents of the Display structure...
+ */
+ if (! gdk_x11_window_get_xid (gtk_widget_get_window (self)))
{
- gtk_init (&argc, &argv);
+ s->dpy = NULL;
+ s->wayland_p = TRUE;
}
+ if (s->dpy)
+ {
+ if (ProtocolVersion (s->dpy) != 11 ||
+ ProtocolRevision (s->dpy) != 0)
+ {
+ fprintf (stderr, "%s: uninitialized data in Display: "
+ "protocol version %d.%d!\n", blurb(),
+ ProtocolVersion(s->dpy), ProtocolRevision(s->dpy));
+ s->dpy = NULL;
+ s->wayland_p = TRUE;
+ }
+ }
- /* We must read exactly the same resources as xscreensaver.
- That means we must have both the same progclass *and* progname,
- at least as far as the resource database is concerned. So,
- put "xscreensaver" in argv[0] while initializing Xt.
+ /* If we don't have a display connection, then we are surely under Wayland
+ even if the environment variable is not set.
*/
- argv[0] = "xscreensaver";
- progname = argv[0];
+ if (!s->dpy &&
+ !getenv ("WAYLAND_DISPLAY") &&
+ !getenv ("WAYLAND_SOCKET"))
+ putenv ("WAYLAND_DISPLAY=probably");
+ if (getenv ("WAYLAND_DISPLAY") ||
+ getenv ("WAYLAND_SOCKET"))
+ s->wayland_p = TRUE;
- /* Teach Xt to use the Display that Gtk/Gdk have already opened.
- */
- XtToolkitInitialize ();
- app = XtCreateApplicationContext ();
- dpy = GDK_DISPLAY();
- XtAppSetFallbackResources (app, defaults);
- XtDisplayInitialize (app, dpy, progname, progclass, 0, 0, &argc, argv);
- toplevel_shell = XtAppCreateShell (progname, progclass,
- applicationShellWidgetClass,
- dpy, 0, 0);
-
- dpy = XtDisplay (toplevel_shell);
- db = XtDatabase (dpy);
- XtGetApplicationNameAndClass (dpy, (char **) &progname, &progclass);
- XSetErrorHandler (demo_ehandler);
-
- /* Let's just ignore these. They seem to confuse Irix Gtk... */
- signal (SIGPIPE, SIG_IGN);
-
- /* After doing Xt-style command-line processing, complain about any
- unrecognized command-line arguments.
+ /* If GTK is running directly under Wayland, try to open an X11 connection
+ to XWayland anyway, so that get_string_resource and load_init_file work.
*/
- for (i = 1; i < argc; i++)
+ if (! s->dpy)
{
- char *str = argv[i];
- if (str[0] == '-' && str[1] == '-')
- str++;
- if (!strcmp (str, "-prefs"))
- prefs_p = True;
- else if (!strcmp (str, "-settings"))
- settings_p = True;
- else if (crapplet_p)
- /* There are lots of random args that we don't care about when we're
- started as a crapplet, so just ignore unknown args in that case. */
- ;
- else
- {
- fprintf (stderr, _("%s: unknown option: %s\n"), real_progname,
- argv[i]);
- fprintf (stderr, "%s: %s\n", real_progname, usage);
- exit (1);
- }
+ s->dpy = XOpenDisplay (NULL);
+ if (s->debug_p)
+ {
+ if (s->dpy)
+ fprintf (stderr, "%s: opened secondary XWayland connection\n",
+ blurb());
+ else
+ fprintf (stderr, "%s: failed to open XWayland connection\n",
+ blurb());
+ }
}
- /* Load the init file, which may end up consulting the X resource database
- and the site-wide app-defaults file. Note that at this point, it's
- important that `progname' be "xscreensaver", rather than whatever
- was in argv[0].
+ /* Teach Xt to use the Display that Gtk/Gdk have already opened.
*/
- p->db = db;
- s->nscreens = screen_count (dpy);
+ if (s->dpy)
+ {
+ XtAppContext app;
+ int argc = 0;
+ char *argv[2];
+ const char *oprogname = progname;
- init_xscreensaver_atoms (dpy);
- hack_environment (s); /* must be before initialize_sort_map() */
+ progname = "xscreensaver"; /* For X resources */
+ argv[argc++] = (char *) progname;
+ argv[argc] = 0;
- load_init_file (dpy, p);
- initialize_sort_map (s);
+ XtToolkitInitialize ();
+ app = XtCreateApplicationContext ();
+ XtAppSetFallbackResources (app, defaults);
+ XtDisplayInitialize (app, s->dpy, progname, progclass, 0, 0, &argc, argv);
- /* Now that Xt has been initialized, and the resources have been read,
- we can set our `progname' variable to something more in line with
- reality.
- */
- progname = real_progname;
+ if (s->debug_p)
+ {
+ XSync (s->dpy, False);
+ XSynchronize (s->dpy, True); /* Must be after XtDisplayInitialize */
+ }
+ /* Result discarded and leaked */
+ XtAppCreateShell (progname, progclass, applicationShellWidgetClass,
+ s->dpy, 0, 0);
+ p->db = XtDatabase (s->dpy);
+ XSetErrorHandler (x_error);
-#if 0
- /* Print out all the resources we read. */
- {
- XrmName name = { 0 };
- XrmClass class = { 0 };
- int count = 0;
- XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
- (POINTER) &count);
- }
-#endif
+ signal (SIGPIPE, SIG_IGN); /* Is this necessary? */
- init_xscreensaver_atoms (dpy);
+ progname = oprogname;
- /* Create the window and all its widgets.
- */
- s->base_widget = create_xscreensaver_demo ();
- s->popup_widget = create_xscreensaver_settings_dialog ();
- s->toplevel_widget = s->base_widget;
+# if 0
+ /* Print out all the Xrm resources we read. */
+ {
+ XrmName name = { 0 };
+ XrmClass class = { 0 };
+ int count = 0;
+ XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, xrm_mapper,
+ (void *) &count);
+ }
+# endif
+ }
+ s->multi_screen_p = multi_screen_p (s->dpy);
- /* Set the main window's title. */
+ /* Let's see if the server supports DPMS.
+ */
+ s->dpms_supported_p = FALSE;
+# ifdef HAVE_DPMS_EXTENSION
{
- char *base_title = _("Screensaver Preferences");
- char *v = (char *) strdup(strchr(screensaver_id, ' '));
- char *s1, *s2, *s3, *s4;
- s1 = (char *) strchr(v, ' '); s1++;
- s2 = (char *) strchr(s1, ' ');
- s3 = (char *) strchr(v, '('); s3++;
- s4 = (char *) strchr(s3, ')');
- *s2 = 0;
- *s4 = 0;
-
- window_title = (char *) malloc (strlen (base_title) +
- strlen (progclass) +
- strlen (s1) + strlen (s3) +
- 100);
- sprintf (window_title, "%s (%s %s, %s)", base_title, progclass, s1, s3);
- gtk_window_set_title (GTK_WINDOW (s->toplevel_widget), window_title);
- gtk_window_set_title (GTK_WINDOW (s->popup_widget), window_title);
- free (v);
+ int op = 0, event = 0, error = 0;
+ if (s->dpy && XQueryExtension (s->dpy, "DPMS", &op, &event, &error))
+ /* Technically this should also check DPMSCapable(), but this is
+ almost certainly close enough. */
+ s->dpms_supported_p = TRUE;
+ else if (s->debug_p)
+ fprintf (stderr, "%s: server does not support power management\n",
+ blurb());
}
+# else /* !HAVE_DPMS_EXTENSION */
+ if (s->debug_p)
+ fprintf (stderr, "%s: DPMS not supported at compile time\n", blurb());
+# endif /* !HAVE_DPMS_EXTENSION */
- /* Adjust the (invisible) notebooks on the popup dialog... */
- {
- GtkNotebook *notebook =
- GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
- GtkWidget *std = GTK_WIDGET (name_to_widget (s, "std_button"));
- int page = 0;
-
-# ifdef HAVE_XML
- gtk_widget_hide (std);
-# else /* !HAVE_XML */
- /* Make the advanced page be the only one available. */
- gtk_widget_set_sensitive (std, False);
- std = GTK_WIDGET (name_to_widget (s, "adv_button"));
- gtk_widget_hide (std);
- std = GTK_WIDGET (name_to_widget (s, "reset_button"));
- gtk_widget_hide (std);
- page = 1;
-# endif /* !HAVE_XML */
-
- gtk_notebook_set_page (notebook, page);
- gtk_notebook_set_show_tabs (notebook, False);
- }
+# if defined(__APPLE__) && !defined(__OPTIMIZE__)
+ s->dpms_supported_p = TRUE; /* macOS X11: debugging kludge */
+# endif
- /* Various other widget initializations...
- */
- gtk_signal_connect (GTK_OBJECT (s->toplevel_widget), "delete_event",
- GTK_SIGNAL_FUNC (wm_toplevel_close_cb),
- (gpointer) s);
- gtk_signal_connect (GTK_OBJECT (s->popup_widget), "delete_event",
- GTK_SIGNAL_FUNC (wm_popup_close_cb),
- (gpointer) s);
+ if (s->dpy)
+ init_xscreensaver_atoms (s->dpy);
+
+ hack_environment (s); /* must be before initialize_sort_map() */
+ load_init_file (s->dpy, p);
+ initialize_sort_map (s);
+
+ s->gl_visual = get_best_gl_visual (s);
+ s->dialog = g_object_new (XSCREENSAVER_DIALOG_TYPE, NULL);
+ XSCREENSAVER_DIALOG (s->dialog)->main = win;
+ gtk_window_set_transient_for (GTK_WINDOW (s->dialog), GTK_WINDOW (win));
+
+ sensitize_menu_items (s, TRUE);
populate_hack_list (s);
populate_prefs_page (s);
- sensitize_demo_widgets (s, False);
- fix_text_entry_sizes (s);
+ sensitize_demo_widgets (s, FALSE);
scroll_to_current_hack (s);
+ if (s->dpy && !s->wayland_p)
+ fix_preview_visual (s);
+ if (! s->multi_screen_p)
+ hide_mode_menu_random_same (s);
+
+ restore_window_position (s, GTK_WINDOW (self), FALSE);
- gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "cancel_button")),
- "map", GTK_SIGNAL_FUNC(map_popup_window_cb),
- (gpointer) s);
-
-#ifndef HAVE_GTK2
- gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "prev")),
- "map", GTK_SIGNAL_FUNC(map_prev_button_cb),
- (gpointer) s);
- gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "next")),
- "map", GTK_SIGNAL_FUNC(map_next_button_cb),
- (gpointer) s);
-#endif /* !HAVE_GTK2 */
-
- /* Hook up callbacks to the items on the mode menu. */
- gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "mode_menu")),
- "changed", GTK_SIGNAL_FUNC (mode_menu_item_cb),
- (gpointer) s);
- if (s->nscreens <= 1)
+ g_timeout_add (60 * 1000, check_blanked_timer, s);
+
+ /* Attach the actions and their keybindings. */
+ {
+ int i;
+ GtkApplication *app = gtk_window_get_application (GTK_WINDOW (win));
+ g_action_map_add_action_entries (G_ACTION_MAP (app),
+ app_entries, countof (app_entries),
+ win);
+ for (i = 0; i < countof (accels); i++)
+ {
+ const gchar *a[2];
+ a[0] = accels[i][1];
+ a[1] = 0;
+ gtk_application_set_accels_for_action (GTK_APPLICATION (app),
+ accels[i][0], a);
+ }
+ }
+
+# if 0
+ /* Load every configurator in turn, to scan them for errors all at once. */
+ if (s->debug_p)
{
- GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu"));
- GtkTreeModel *list = gtk_combo_box_get_model (opt);
- unsigned int i;
- for (i = 0; i < countof(mode_menu_order); i++)
+ int i;
+ for (i = 0; i < p->screenhacks_count; i++)
{
- /* The "random-same" mode menu item does not appear unless
- there are multiple screens.
- */
- if (mode_menu_order[i] == RANDOM_HACKS_SAME)
- {
- GtkTreeIter iter;
- gtk_tree_model_iter_nth_child (list, &iter, NULL, i);
- gtk_list_store_remove (GTK_LIST_STORE (list), &iter);
- break;
- }
+ screenhack *hack = p->screenhacks[i];
+ conf_data *d = load_configurator (hack->command, s->debug_p);
+ if (d) free_conf_data (d);
}
-
- /* recompute option-menu size */
- gtk_widget_unrealize (GTK_WIDGET (opt));
- gtk_widget_realize (GTK_WIDGET (opt));
}
+# endif
-
- /* Handle the -prefs command-line argument. */
- if (prefs_p)
+ /* Grab the screenshot pixmap before mapping the window. */
+ if (s->dpy && !s->wayland_p)
{
- GtkNotebook *notebook =
- GTK_NOTEBOOK (name_to_widget (s, "notebook"));
- gtk_notebook_set_page (notebook, 1);
+ GdkWindow *gw = gtk_widget_get_window (win->preview);
+ Window xw = gdk_x11_window_get_xid (gw);
+ s->screenshot = screenshot_grab (s->dpy, xw, TRUE, s->debug_p);
}
-# ifdef HAVE_CRAPPLET
- if (crapplet_p)
- {
- GtkWidget *capplet;
- GtkWidget *outer_vbox;
+ /* Issue any warnings about the running xscreensaver daemon.
+ Wait a few seconds, in case things are still starting up. */
+ g_timeout_add (5 * 1000, the_network_is_not_the_computer, s);
- gtk_widget_hide (s->toplevel_widget);
+ /* This totally sucks -- set a timer that whacks the scrollbar 0.5 seconds
+ after we start up. Otherwise, it always appears scrolled to the top. */
+ g_timeout_add (500, delayed_scroll_kludge, s);
- capplet = capplet_widget_new ();
+ s->initializing_p = FALSE;
+}
- /* Make there be a "Close" button instead of "OK" and "Cancel" */
-# ifdef HAVE_CRAPPLET_IMMEDIATE
- capplet_widget_changes_are_immediate (CAPPLET_WIDGET (capplet));
-# endif /* HAVE_CRAPPLET_IMMEDIATE */
- /* In crapplet-mode, take off the menubar. */
- gtk_widget_hide (name_to_widget (s, "menubar"));
- /* Reparent our top-level container to be a child of the capplet
- window.
- */
- outer_vbox = GTK_BIN (s->toplevel_widget)->child;
- gtk_widget_ref (outer_vbox);
- gtk_container_remove (GTK_CONTAINER (s->toplevel_widget),
- outer_vbox);
- STFU GTK_OBJECT_SET_FLAGS (outer_vbox, GTK_FLOATING);
- gtk_container_add (GTK_CONTAINER (capplet), outer_vbox);
-
- /* Find the window above us, and set the title and close handler. */
- {
- GtkWidget *window = capplet;
- while (window && !GTK_IS_WINDOW (window))
- window = GET_PARENT (window);
- if (window)
- {
- gtk_window_set_title (GTK_WINDOW (window), window_title);
- gtk_signal_connect (GTK_OBJECT (window), "delete_event",
- GTK_SIGNAL_FUNC (wm_toplevel_close_cb),
- (gpointer) s);
- }
- }
+static void
+xscreensaver_window_init (XScreenSaverWindow *win)
+{
+ gtk_widget_init_template (GTK_WIDGET (win));
+ g_signal_connect (win, "destroy",
+ G_CALLBACK (xscreensaver_window_destroy), win);
+ g_signal_connect (win, "realize",
+ G_CALLBACK (xscreensaver_window_realize), win);
+ g_signal_connect (win, "configure-event",
+ G_CALLBACK (xscreensaver_window_resize_cb),win);
+ g_signal_connect (win->preview, "configure-event",
+ G_CALLBACK (preview_resize_cb),win);
+}
- s->toplevel_widget = capplet;
- }
-# endif /* HAVE_CRAPPLET */
+static void
+xscreensaver_window_class_init (XScreenSaverWindowClass *class)
+{
+ gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
+ "/org/jwz/xscreensaver/demo.ui");
+
+ /* Fill in the widget fields in XScreenSaverWindow with the corresponding
+ objects created from demo.ui. */
+# undef W
+# define W(NAME) \
+ gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), \
+ XScreenSaverWindow, NAME);
+ ALL_WINDOW_WIDGETS
+# undef W
+}
- /* The Gnome folks hate the menubar. I think it's important to have access
- to the commands on the File menu (Restart Daemon, etc.) and to the
- About and Documentation commands on the Help menu.
- */
-#if 0
-#ifdef HAVE_GTK2
- gtk_widget_hide (name_to_widget (s, "menubar"));
-#endif
-#endif
- free (window_title);
- window_title = 0;
+/****************************************************************************
-#ifdef HAVE_GTK2
- /* After picking the default size, allow -geometry to override it. */
- if (geom)
- gtk_window_parse_geometry (GTK_WINDOW (s->toplevel_widget), geom);
-#endif
+ XScreenSaverDialog
- gtk_widget_show (s->toplevel_widget);
- init_icon (GET_WINDOW (GTK_WIDGET (s->toplevel_widget))); /* after `show' */
- fix_preview_visual (s);
+ ****************************************************************************/
- /* Realize page zero, so that we can diddle the scrollbar when the
- user tabs back to it -- otherwise, the current hack isn't scrolled
- to the first time they tab back there, when started with "-prefs".
- (Though it is if they then tab away, and back again.)
+static void
+xscreensaver_dialog_destroy (GObject *object)
+{
+ /* Called by WM close box, but not by File / Quit */
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (object);
+ XScreenSaverWindow *win = dialog->main;
+ flush_dialog_changes_and_save (&win->state);
+ G_OBJECT_CLASS (xscreensaver_dialog_parent_class)->dispose (object);
+}
- #### Bah! This doesn't work. Gtk eats my ass! Someone who
- #### understands this crap, explain to me how to make this work.
- */
- gtk_widget_realize (name_to_widget (s, "demos_table"));
+static void
+xscreensaver_dialog_realize (GtkWidget *self, gpointer user_data)
+{
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (self);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ restore_window_position (s, GTK_WINDOW (self), TRUE);
+}
- gtk_timeout_add (60 * 1000, check_blanked_timer, s);
+/* When the window is moved, save the new origin in .xscreensaver. */
+static gboolean
+xscreensaver_dialog_resize_cb (GtkWindow *window, GdkEvent *event,
+ gpointer data)
+{
+ XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (window);
+ XScreenSaverWindow *win = dialog->main;
+ state *s = &win->state;
+ save_window_position (s, GTK_WINDOW (dialog),
+ event->configure.x, event->configure.y, TRUE);
+ return FALSE;
+}
- /* Handle the --settings command-line argument. */
- if (settings_p)
- gtk_timeout_add (500, settings_timer, 0);
+/* The WM close box. */
+static gboolean
+xscreensaver_dialog_delete_cb (GtkWidget *self, GdkEvent *event,
+ gpointer user_data)
+{
+ settings_cancel_cb (GTK_WIDGET (self), user_data);
+ return TRUE; /* Do not run other handlers */
+}
- /* Issue any warnings about the running xscreensaver daemon. */
- if (! s->debug_p)
- the_network_is_not_the_computer (s);
+static void
+xscreensaver_dialog_init (XScreenSaverDialog *win)
+{
+ gtk_widget_init_template (GTK_WIDGET (win));
+ g_signal_connect (win, "destroy",
+ G_CALLBACK (xscreensaver_dialog_destroy), win);
+ g_signal_connect (win, "realize",
+ G_CALLBACK (xscreensaver_dialog_realize), win);
+ g_signal_connect (win, "configure-event",
+ G_CALLBACK (xscreensaver_dialog_resize_cb), win);
+ g_signal_connect (win, "delete-event",
+ G_CALLBACK (xscreensaver_dialog_delete_cb), win);
+}
- if (time ((time_t *) 0) - XSCREENSAVER_RELEASED > 60*60*24*30*17)
- warning_dialog (s->toplevel_widget,
- _("Warning:\n\n"
- "This version of xscreensaver is VERY OLD!\n"
- "Please upgrade!\n"
- "\n"
- "https://www.jwz.org/xscreensaver/\n"
- "\n"
- "(If this is the latest version that your distro ships, then\n"
- "your distro is doing you a disservice. Build from source.)\n"
- ),
- D_NONE, 7);
- /* Run the Gtk event loop, and not the Xt event loop. This means that
- if there were Xt timers or fds registered, they would never get serviced,
- and if there were any Xt widgets, they would never have events delivered.
- Fortunately, we're using Gtk for all of the UI, and only initialized
- Xt so that we could process the command line and use the X resource
- manager.
- */
- s->initializing_p = False;
+static void
+xscreensaver_dialog_class_init (XScreenSaverDialogClass *class)
+{
+ gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
+ "/org/jwz/xscreensaver/prefs.ui");
+
+ /* Fill in the widget fields in XScreenSaverDialog with the corresponding
+ objects created from prefs.ui. */
+# undef W
+# define W(NAME) \
+ gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), \
+ XScreenSaverDialog, NAME);
+ ALL_DIALOG_WIDGETS
+# undef W
+}
- /* This totally sucks -- set a timer that whacks the scrollbar 0.5 seconds
- after we start up. Otherwise, it always appears scrolled to the top
- when in crapplet-mode. */
- gtk_timeout_add (500, delayed_scroll_kludge, s);
+/****************************************************************************
+
+ XScreenSaverApp
+
+ ****************************************************************************/
-#if 1
- /* Load every configurator in turn, to scan them for errors all at once. */
- if (s->debug_p)
- {
- int i;
- for (i = 0; i < p->screenhacks_count; i++)
- {
- screenhack *hack = p->screenhacks[i];
- conf_data *d = load_configurator (hack->command, s->debug_p);
- if (d) free_conf_data (d);
- }
- }
-#endif
+static void
+xscreensaver_app_init (XScreenSaverApp *app)
+{
+}
-# ifdef HAVE_CRAPPLET
- if (crapplet_p)
- capplet_gtk_main ();
+
+static void
+xscreensaver_app_startup (GApplication *app)
+{
+ G_APPLICATION_CLASS (xscreensaver_app_parent_class)->startup (app);
+
+ /* Without this, the floating point numbers in the XML files are not
+ parsed properly in locales that use commas instead of periods in
+ floats: sscanf %f expects "1.0" to be "1,0" and returns 0.
+
+ This must be called later than main() because something beneath
+ g_application_run() calls setlocale(LC_ALL, "") and would override it.
+ */
+# ifdef ENABLE_NLS
+ if (!setlocale (LC_NUMERIC, "C"))
+ fprintf (stderr, "%s: warning: could not set LC_NUMERIC=C\n", blurb());
+# endif /* ENABLE_NLS */
+}
+
+
+static void
+xscreensaver_app_activate (GApplication *app)
+{
+ XScreenSaverWindow *win =
+ g_object_new (XSCREENSAVER_WINDOW_TYPE, "application", app, NULL);
+ win->state.debug_p = XSCREENSAVER_APP (app)->cmdline_debug_p;
+ gtk_widget_show_all (GTK_WIDGET (win));
+ gtk_window_present (GTK_WINDOW (win));
+}
+
+
+static void
+xscreensaver_app_open (GApplication *app,
+ GFile **files, gint n_files,
+ const gchar *hint)
+{
+ GList *windows = gtk_application_get_windows (GTK_APPLICATION (app));
+ if (windows)
+ gtk_window_present (GTK_WINDOW (windows->data));
else
-# endif /* HAVE_CRAPPLET */
- gtk_main ();
+ xscreensaver_app_activate (app);
+}
+
- kill_preview_subproc (s, False);
- exit (0);
+static int
+opts_cb (GApplication *app, GVariantDict *opts, gpointer data)
+{
+ if (g_variant_dict_contains (opts, "version")) {
+ fprintf (stderr, "%s\n", screensaver_id+4);
+ return 0;
+ } else if (g_variant_dict_contains (opts, "debug")) {
+ XSCREENSAVER_APP (app)->cmdline_debug_p = TRUE;
+ return -1;
+ } else {
+ return -1;
+ }
}
+
+static void
+xscreensaver_app_class_init (XScreenSaverAppClass *class)
+{
+ G_APPLICATION_CLASS (class)->startup = xscreensaver_app_startup;
+ G_APPLICATION_CLASS (class)->activate = xscreensaver_app_activate;
+ G_APPLICATION_CLASS (class)->open = xscreensaver_app_open;
+}
+
+static XScreenSaverApp *
+xscreensaver_app_new (void)
+{
+ XScreenSaverApp *app = g_object_new (XSCREENSAVER_APP_TYPE,
+ "application-id",
+ "org.jwz.xscreensaver.settings",
+ NULL);
+
+ g_application_add_main_option (G_APPLICATION (app), "version", 'v',
+ G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE,
+ "Print the version number",
+ NULL);
+ g_application_add_main_option (G_APPLICATION (app), "debug", 0,
+ G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE,
+ "Print diagnostics to stderr",
+ NULL);
+ g_signal_connect (app, "handle-local-options", G_CALLBACK (opts_cb), app);
+ return app;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ char *s;
+ progname = argv[0];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
+ g_log_set_default_handler (g_logger, NULL);
+ g_log_set_writer_func (g_other_logger, NULL, NULL);
+
+# ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ textdomain (GETTEXT_PACKAGE);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+# endif /* ENABLE_NLS */
+
+ return g_application_run (G_APPLICATION (xscreensaver_app_new()),
+ argc, argv);
+}
+
+
+
#endif /* HAVE_GTK -- whole file */
diff --git a/driver/demo-Xm.c b/driver/demo-Xm.c
index 547bbe9..2a95bff 100644
--- a/driver/demo-Xm.c
+++ b/driver/demo-Xm.c
@@ -451,6 +451,7 @@ await_xscreensaver (Widget widget)
support" in the following expression... */
# endif
strcat (buf,
+/*
"You are running as root. This usually means that xscreensaver\n"
"was unable to contact your X server because access control is\n"
"turned on. Try running this command:\n"
@@ -465,7 +466,11 @@ await_xscreensaver (Widget widget)
"manual and FAQ for more information.\n"
"\n"
"You shouldn't run X as root. Instead, you should log in as a\n"
- "normal user, and `su' as necessary.");
+ "normal user, and `su' as necessary."
+ */
+ "You are running as root. Don't do that. Instead, you should\n"
+ "log in as a normal user and use `sudo' as necessary."
+ );
else
strcat (buf, "Please check your $PATH and permissions.");
@@ -605,13 +610,21 @@ apply_changes_and_save (Widget widget)
/* Something was changed -- store results into the struct,
and write the file.
*/
+ int status;
free (p->screenhacks[which]->visual);
free (p->screenhacks[which]->command);
p->screenhacks[which]->visual = strdup (visual);
p->screenhacks[which]->command = strdup (command);
p->screenhacks[which]->enabled_p = enabled_p;
- return demo_write_init_file (widget, p);
+ status = demo_write_init_file (widget, p);
+
+ /* Tell the xscreensaver daemon to wake up and reload the init file,
+ in case the timeout has changed. Without this, it would wait
+ until the *old* timeout had expired before reloading. */
+ xscreensaver_command (XtDisplay (widget), XA_DEACTIVATE, 0, 0, 0);
+
+ return status;
}
/* No changes made */
@@ -1530,7 +1543,7 @@ the_network_is_not_the_computer (Widget parent)
sprintf (msg,
"Warning:\n\n"
"The XScreenSaver daemon doesn't seem to be running\n"
- "on display \"%s\". You can launch it by selecting\n"
+ "on display \"%.25s\". You can launch it by selecting\n"
"`Restart Daemon' from the File menu, or by typing\n"
"\"xscreensaver &\" in a shell.",
d);
diff --git a/driver/demo.ui b/driver/demo.ui
new file mode 100644
index 0000000..1dd8403
--- /dev/null
+++ b/driver/demo.ui
@@ -0,0 +1,2630 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="XScreenSaverWindow" parent="GtkApplicationWindow">
+ <property name="title" translatable="yes">XScreenSaver Settings</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window-position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy-with-parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip-taskbar-hint">False</property>
+ <property name="skip-pager-hint">False</property>
+ <property name="type-hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus-on-map">True</property>
+ <property name="urgency-hint">False</property>
+ <child>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">720</property>
+ <property name="lower">1</property>
+ <property name="page-increment">15</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">1</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">720</property>
+ <property name="lower">0</property>
+ <property name="page-increment">15</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="upper">720</property>
+ <property name="lower">0</property>
+ <property name="page-increment">15</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="upper">1440</property>
+ <property name="lower">0</property>
+ <property name="page-increment">15</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="upper">1440</property>
+ <property name="lower">0</property>
+ <property name="page-increment">15</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment6">
+ <property name="upper">1440</property>
+ <property name="lower">0</property>
+ <property name="page-increment">15</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment7">
+ <property name="upper">10</property>
+ <property name="lower">0</property>
+ <property name="page-increment">1</property>
+ <property name="step-increment">1</property>
+ <property name="page-size">0</property>
+ <property name="value">0</property>
+ </object>
+ <object class="GtkListStore" id="mode_menu_model">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Disable Screen Saver</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Blank Screen Only</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Only One Screen Saver</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Random Screen Saver</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Same Random Savers</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="theme_menu_model">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Default</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkBox" id="content_box">
+ <property name="name">content_box</property>
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="outer_vbox">
+ <property name="name">outer_vbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkMenuBar" id="menubar">
+ <property name="name">menubar</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label">gtk-file</property>
+ <property name="use-stock">True</property>
+ <property name="use-underline">True</property>
+ <signal handler="file_menu_cb" name="activate"/>
+ <child type="submenu">
+ <object class="GtkMenu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="activate_menuitem">
+ <property name="name">activate_menuitem</property>
+ <property name="label" translatable="yes">_Blank Screen Now</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="activate_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="lock_menuitem">
+ <property name="name">lock_menuitem</property>
+ <property name="label" translatable="yes">_Lock Screen Now</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="lock_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="kill_menuitem">
+ <property name="name">kill_menuitem</property>
+ <property name="label" translatable="yes">_Kill Daemon</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="kill_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="restart_menuitem">
+ <property name="name">restart_menuitem</property>
+ <property name="label" translatable="yes">_Restart Daemon</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="restart_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-quit</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="quit_menu_cb" name="activate"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+<!--
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label">gtk-edit</property>
+ <property name="use-stock">True</property>
+ <property name="use-underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-undo</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="undo_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-redo</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="redo_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-cut</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="cut_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-copy</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="copy_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-paste</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="paste_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-delete</property>
+ <property name="use-stock">True</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="delete_menu_cb" name="activate"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+-->
+
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label">gtk-help</property>
+ <property name="use-stock">True</property>
+ <property name="use-underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label">gtk-about</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <property name="use-stock">True</property>
+ <signal handler="about_menu_cb" name="activate"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem">
+ <property name="label" translatable="yes">Documentation...</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="use-underline">True</property>
+ <signal handler="doc_menu_cb" name="activate"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkNotebook" id="notebook">
+ <property name="name">notebook</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="show-tabs">True</property>
+ <property name="show-border">True</property>
+ <property name="tab-pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable-popup">False</property>
+ <signal handler="switch_page_cb" name="switch_page"/>
+
+ <!-- Display Modes page -->
+ <child>
+ <object class="GtkGrid" id="demos_table">
+ <property name="name">demos_table</property>
+ <property name="visible">True</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="column-homogeneous">False</property>
+ <child>
+ <object class="GtkBox" id="list_vbox">
+ <property name="name">list_vbox</property>
+ <property name="border-width">10</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="mode_hbox">
+ <property name="name">mode_hbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="mode_label">
+ <property name="name">mode_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Mode:</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">mode_menu</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="mode_menu" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="mode_menu">
+ <property name="name">mode_menu</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="has-entry">False</property>
+ <property name="model">mode_menu_model</property>
+ <signal handler="mode_menu_item_cb" name="changed"/>
+ <accessibility>
+ <relation target="mode_label" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkCellRendererText" id="renderer1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scroller">
+ <property name="name">scroller</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hscrollbar-policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar-policy">GTK_POLICY_ALWAYS</property>
+ <property name="shadow-type">GTK_SHADOW_IN</property>
+ <property name="window-placement">GTK_CORNER_TOP_LEFT</property>
+ <child>
+ <object class="GtkTreeView" id="list">
+ <property name="name">list</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="headers-visible">False</property>
+ <property name="rules-hint">True</property>
+ <property name="reorderable">False</property>
+ <property name="enable-search">True</property>
+ <property name="fixed-height-mode">False</property>
+ <property name="hover-selection">False</property>
+ <property name="hover-expand">False</property>
+ <property name="search-column">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="centering_hbox">
+ <property name="name">centering_hbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <property name="margin-top">4</property>
+ <property name="margin-bottom">8</property>
+ <child>
+ <object class="GtkBox" id="next_prev_hbox">
+ <property name="name">next_prev_hbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkButton" id="next">
+ <property name="name">next</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return).</property>
+ <property name="can-focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="run_next_cb" name="clicked"/>
+ <child>
+ <object class="GtkArrow" id="arrow1">
+ <property name="name">arrow1</property>
+ <property name="visible">True</property>
+ <property name="arrow-type">GTK_ARROW_DOWN</property>
+ <property name="shadow-type">GTK_SHADOW_OUT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="prev">
+ <property name="name">prev</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Run the previous screen saver in the list in full-screen mode.</property>
+ <property name="can-focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="run_prev_cb" name="clicked"/>
+ <child>
+ <object class="GtkArrow" id="arrow2">
+ <property name="name">arrow2</property>
+ <property name="visible">True</property>
+ <property name="arrow-type">GTK_ARROW_UP</property>
+ <property name="shadow-type">GTK_SHADOW_OUT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack-type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="blanking_table">
+ <property name="name">blanking_table</property>
+ <property name="visible">True</property>
+ <property name="row-spacing">2</property>
+ <property name="margin-start">8</property>
+ <property name="margin-end">8</property>
+ <child>
+ <object class="GtkLabel" id="timeout_label">
+ <property name="name">timeout_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Blank After</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">timeout_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="timeout_spinbutton" type="label-for"/>
+ <relation target="timeout_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="timeout_spinbutton">
+ <property name="name">timeout_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long before the screen saver activates.</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment1</property>
+ <accessibility>
+ <relation target="timeout_label" type="labelled-by"/>
+ <relation target="timeout_mlabel" type="labelled-by"/>
+ <relation target="timeout_label" type="flows-from"/>
+ <relation target="timeout_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_cb" name="activate"/>
+ <signal handler="dpms_sanity_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="timeout_mlabel">
+ <property name="name">timeout_mlabel</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="timeout_spinbutton" type="label-for"/>
+ <relation target="timeout_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="cycle_label">
+ <property name="name">cycle_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Cycle After</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">cycle_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="cycle_spinbutton" type="label-for"/>
+ <relation target="cycle_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="cycle_spinbutton">
+ <property name="name">cycle_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long each display mode should run before choosing a new one (in Random mode).</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment3</property>
+ <accessibility>
+ <relation target="cycle_label" type="labelled-by"/>
+ <relation target="cycle_mlabel" type="labelled-by"/>
+ <relation target="cycle_label" type="flows-from"/>
+ <relation target="cycle_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="cycle_mlabel">
+ <property name="name">cycle_mlabel</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="cycle_spinbutton" type="label-for"/>
+ <relation target="cycle_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="lock_button_eventbox">
+ <property name="name">lock_button_eventbox</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether a password should be required to un-blank the screen.</property>
+ <property name="visible-window">False</property>
+ <property name="above-child">False</property>
+ <child>
+ <object class="GtkCheckButton" id="lock_button">
+ <property name="name">lock_button</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Lock Screen After </property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation target="lock_spinbutton" type="controller-for"/>
+ <relation target="lock_spinbutton" type="label-for"/>
+ <relation target="lock_spinbutton" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-lock_button1">
+ <property name="AtkObject::accessible-name" translatable="yes">Lock Screen</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="lock_spinbutton">
+ <property name="name">lock_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long after the screen blanks until a password will be required.</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment2</property>
+ <accessibility>
+ <relation target="lock_button" type="controlled-by"/>
+ <relation target="lock_button" type="labelled-by"/>
+ <relation target="lock_mlabel" type="labelled-by"/>
+ <relation target="lock_button" type="flows-from"/>
+ <relation target="lock_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-lock_spinbutton1">
+ <property name="AtkObject::accessible-name" translatable="yes">Lock Screen After</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lock_mlabel">
+ <property name="name">lock_mlabel</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="lock_spinbutton" type="label-for"/>
+ <relation target="lock_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="preview_frame">
+ <property name="name">preview_frame</property>
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0.5</property>
+ <property name="shadow-type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <accessibility>
+ <relation target="label1" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkBox" id="preview_vbox">
+ <property name="name">preview_vbox</property>
+ <property name="border-width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkNotebook" id="preview_notebook">
+ <property name="name">preview_notebook</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="show-tabs">False</property>
+ <property name="show-border">False</property>
+ <property name="tab-pos">GTK_POS_BOTTOM</property>
+ <property name="scrollable">False</property>
+ <property name="enable-popup">False</property>
+
+ <child>
+ <object class="GtkAspectFrame" id="preview_aspectframe">
+ <property name="name">preview_aspectframe</property>
+ <property name="border-width">8</property>
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0.5</property>
+ <property name="shadow-type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="ratio">1.777777</property>
+ <property name="obey-child">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="preview">
+ <property name="name">preview</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="preview_tab">
+ <property name="name">preview_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Preview</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="no_preview_label">
+ <property name="name">no_preview_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Preview
+Available</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="no_preview_tab">
+ <property name="name">no_preview_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Preview</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="not_installed_label">
+ <property name="name">not_installed_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Not
+Installed</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="not_installed_tab">
+ <property name="name">not_installed_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Not Installed</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="nothing_label">
+ <property name="name">nothing_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
+
+This probably means that the "xscreensaver-extras" and
+"xscreensaver-gl-extras" packages are not installed.</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="nothing_tab">
+ <property name="name">nothing_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Nothing Installed</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="wayland_label">
+ <property name="name">wayland_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Previews Available
+Under Wayland.</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="wayland_tab">
+ <property name="name">wayland_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Previews Under Wayland</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="short_preview_label">
+ <property name="name">short_preview_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">True</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">72</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="preview_aspectframe" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="preview_author_label">
+ <property name="name">preview_author_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">True</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">72</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="preview_aspectframe" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="name">label1</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Description</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="preview_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="demo_manual_hbbox">
+ <property name="name">demo_manual_hbbox</property>
+ <property name="visible">True</property>
+ <property name="layout-style">GTK_BUTTONBOX_SPREAD</property>
+ <property name="spacing">30</property>
+ <child>
+ <object class="GtkButton" id="demo">
+ <property name="name">demo</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Demo the selected screen saver in full-screen mode.</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Preview</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="run_this_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="settings">
+ <property name="name">settings</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Customization and explanation of the selected screen saver.</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Settings...</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="settings_cb" name="clicked"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="demo_tab">
+ <property name="name">demo_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Display Modes</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">notebook</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+
+ <!-- Advanced page -->
+ <child>
+ <object class="GtkGrid" id="options_table">
+ <property name="name">options_table</property>
+ <property name="visible">True</property>
+ <property name="margin-start">8</property>
+ <property name="margin-end">8</property>
+ <property name="column-homogeneous">True</property>
+ <child>
+ <object class="GtkFrame" id="grab_frame">
+ <property name="name">grab_frame</property>
+ <property name="border-width">10</property>
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0.5</property>
+ <property name="shadow-type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="hexpand">True</property>
+ <accessibility>
+ <relation target="label2" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkBox" id="grab_vbox">
+ <property name="name">grab_vbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">4</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <child>
+ <object class="GtkCheckButton" id="grab_desk_button">
+ <property name="name">grab_desk_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Grab Desktop _Images</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="grab_video_button">
+ <property name="name">grab_video_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should operate on images captured from the camera (if there is one).</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Grab _Video Frames</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="grab_image_button">
+ <property name="name">grab_image_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should load image files.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Choose _Random Image:</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation target="image_text" type="controller-for"/>
+ <relation target="image_browse_button" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="image_hbox">
+ <property name="name">image_hbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="grab_dummy">
+ <property name="name">grab_dummy</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="image_text">
+ <property name="name">image_text</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">The local directory, RSS feed or Atom feed from which images will be randomly chosen.</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ <accessibility>
+ <relation target="grab_image_button" type="labelled-by"/>
+ <relation target="grab_image_button" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="image_text_pref_changed_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="padding">2</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="image_browse_button">
+ <property name="name">image_browse_button</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="browse_image_dir_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="name">label8</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Local directory, or URL of RSS or Atom feed.</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">20</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="name">label2</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Image Manipulation</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="grab_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="text_frame">
+ <property name="name">text_frame</property>
+ <property name="border-width">10</property>
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0.5</property>
+ <property name="shadow-type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="expand">False</property>
+ <property name="hexpand">True</property>
+ <accessibility>
+ <relation target="label3" type="labelled-by"/>
+ </accessibility>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="name">label3</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Text Manipulation</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="text_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="text_table">
+ <property name="name">text_table</property>
+ <property name="visible">True</property>
+ <property name="row-spacing">4</property>
+ <property name="column-spacing">4</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <child>
+ <object class="GtkRadioButton" id="text_host_radio">
+ <property name="name">text_host_radio</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the local host name, date, and time.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Host Name and Time</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">True</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">text_radio</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_radio">
+ <property name="name">text_radio</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the text typed here.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Text</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation target="text_entry" type="controller-for"/>
+ <relation target="text_entry" type="label-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_entry">
+ <property name="name">text_entry</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the text typed here.</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ <property name="expand">True</property>
+ <accessibility>
+ <relation target="text_program_radio" type="labelled-by"/>
+ <relation target="text_program_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_file_radio">
+ <property name="name">text_file_radio</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Text _file</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <relation target="text_file_entry" type="label-for"/>
+ <relation target="text_file_entry" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_file_entry">
+ <property name="name">text_file_entry</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ <property name="expand">True</property>
+ <accessibility>
+ <relation target="text_file_radio" type="labelled-by"/>
+ <relation target="text_file_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="text_file_browse">
+ <property name="name">text_file_browse</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="expand">False</property>
+ <accessibility>
+ <relation target="text_file_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="browse_text_file_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_program_radio">
+ <property name="name">text_program_radio</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the output of this program.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Program</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <relation target="text_program_entry" type="label-for"/>
+ <relation target="text_program_entry" type="controller-for"/>
+ <relation target="text_program_browse" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_program_entry">
+ <property name="name">text_program_entry</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the output of this program.</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ <property name="expand">True</property>
+ <accessibility>
+ <relation target="text_program_radio" type="labelled-by"/>
+ <relation target="text_program_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="text_program_browse">
+ <property name="name">text_program_browse</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="expand">False</property>
+ <accessibility>
+ <relation target="text_program_radio" type="controller-for"/>
+ </accessibility>
+ <signal handler="browse_text_program_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="text_url_radio">
+ <property name="name">text_url_radio</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_URL</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <relation target="text_url_entry" type="label-for"/>
+ <relation target="text_url_entry" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="text_url_entry">
+ <property name="name">text_url_entry</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ <property name="expand">True</property>
+ <accessibility>
+ <relation target="text_url_radio" type="controlled-by"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">4</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="dpms_frame">
+ <property name="name">dpms_frame</property>
+ <property name="border-width">10</property>
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0.5</property>
+ <property name="shadow-type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="expand">False</property>
+ <child>
+ <object class="GtkBox" id="vbox6">
+ <property name="name">vbox6</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">4</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="dpms_button">
+ <property name="name">dpms_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the monitor should be powered down after a while.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Power Management Enabled</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">True</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation target="dpms_suspend_spinbutton" type="controller-for"/>
+ <relation target="dpms_standby_spinbutton" type="controller-for"/>
+ <relation target="dpms_off_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="dpms_table">
+ <property name="name">dpms_table</property>
+ <property name="visible">True</property>
+ <property name="row-spacing">2</property>
+ <property name="column-spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="dpms_standby_label">
+ <property name="name">dpms_standby_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Stand_by After</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">dpms_standby_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_standby_spinbutton" type="label-for"/>
+ <relation target="dpms_standby_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_suspend_label">
+ <property name="name">dpms_suspend_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Sus_pend After</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">dpms_suspend_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_suspend_spinbutton" type="label-for"/>
+ <relation target="dpms_suspend_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_off_label">
+ <property name="name">dpms_off_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Off After</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">dpms_off_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_off_spinbutton" type="label-for"/>
+ <relation target="dpms_off_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_standby_mlabel">
+ <property name="name">dpms_standby_mlabel</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_standby_spinbutton" type="label-for"/>
+ <relation target="dpms_standby_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_suspend_mlabel">
+ <property name="name">dpms_suspend_mlabel</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_suspend_spinbutton" type="label-for"/>
+ <relation target="dpms_suspend_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dpms_off_mlabel">
+ <property name="name">dpms_off_mlabel</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_off_spinbutton" type="label-for"/>
+ <relation target="dpms_off_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="dpms_off_spinbutton">
+ <property name="name">dpms_off_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long until the monitor powers down.</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment4</property>
+ <accessibility>
+ <relation target="dpms_button" type="controlled-by"/>
+ <relation target="dpms_off_label" type="labelled-by"/>
+ <relation target="dpms_off_mlabel" type="labelled-by"/>
+ <relation target="dpms_off_label" type="flows-from"/>
+ <relation target="dpms_off_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_cb" name="activate"/>
+ <signal handler="dpms_sanity_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="dpms_suspend_spinbutton">
+ <property name="name">dpms_suspend_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long until the monitor goes into power-saving mode.</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment5</property>
+ <accessibility>
+ <relation target="dpms_button" type="controlled-by"/>
+ <relation target="dpms_suspend_label" type="labelled-by"/>
+ <relation target="dpms_suspend_mlabel" type="labelled-by"/>
+ <relation target="dpms_suspend_label" type="flows-from"/>
+ <relation target="dpms_suspend_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_cb" name="activate"/>
+ <signal handler="dpms_sanity_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="dpms_standby_spinbutton">
+ <property name="name">dpms_standby_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long until the monitor goes completely black.</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment6</property>
+ <accessibility>
+ <relation target="dpms_button" type="controlled-by"/>
+ <relation target="dpms_standby_label" type="labelled-by"/>
+ <relation target="dpms_standby_mlabel" type="labelled-by"/>
+ <relation target="dpms_standby_label" type="flows-from"/>
+ <relation target="dpms_standby_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_cb" name="activate"/>
+ <signal handler="dpms_sanity_cb" name="value_changed"/>
+ <signal handler="dpms_sanity_event_cb" name="focus_out_event"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="dpms_quickoff_button">
+ <property name="name">dpms_quickoff_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Quick Power-off in Blank Only Mode</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="name">label4</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Display Power Management</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="dpms_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="blanking_frame">
+ <property name="name">blanking_frame</property>
+ <property name="border-width">10</property>
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0.5</property>
+ <property name="shadow-type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="expand">False</property>
+ <accessibility>
+ <relation target="label5" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkBox" id="vbox7">
+ <property name="name">vbox7</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">4</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <child>
+ <object class="GtkCheckButton" id="fade_button">
+ <property name="name">fade_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the screen should slowly fade to black when the screen saver activates.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Fade to Black when _Blanking</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="unfade_button">
+ <property name="name">unfade_button</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Whether the screen should slowly fade in from black when the screen saver deactivates.</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="fade_hbox">
+ <property name="name">fade_hbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="fade_dummy">
+ <property name="name">fade_dummy</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">3</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="fade_label">
+ <property name="name">fade_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">F_ade Duration</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">fade_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="label-for"/>
+ <relation target="fade_spinbutton" type="flows-to"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">14</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="fade_spinbutton">
+ <property name="name">fade_spinbutton</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">How long it should take for the screen to fade in and out.</property>
+ <property name="can-focus">True</property>
+ <property name="climb-rate">1</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update-policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap-to-ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment7</property>
+ <accessibility>
+ <relation target="unfade_button" type="controlled-by"/>
+ <relation target="fade_button" type="controlled-by"/>
+ <relation target="fade_label" type="labelled-by"/>
+ <relation target="fade_sec_label" type="labelled-by"/>
+ <relation target="fade_label" type="flows-from"/>
+ <relation target="fade_sec_label" type="flows-to"/>
+ </accessibility>
+ <signal handler="pref_changed_cb" name="activate"/>
+ <signal handler="pref_changed_event_cb" name="focus_out_event"/>
+ <signal handler="pref_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="fade_sec_label">
+ <property name="name">fade_sec_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">seconds</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="fade_spinbutton" type="label-for"/>
+ <relation target="fade_spinbutton" type="flows-from"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">2</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="blanking_hr">
+ <property name="name">blanking_hr</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="padding">8</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="theme_hbox">
+ <property name="name">theme_hbox</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="theme_label">
+ <property name="name">theme_label</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Theme:</property>
+ <property name="tooltip-text" translatable="yes">The color scheme to use on the unlock dialog.</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">theme_menu</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="theme_menu" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="theme_menu">
+ <property name="name">theme_menu</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="has-entry">False</property>
+ <property name="model">theme_menu_model</property>
+ <accessibility>
+ <relation target="theme_label" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkCellRendererText" id="renderer2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="theme_preview">
+ <property name="name">theme_preview</property>
+ <property name="visible">True</property>
+ <property name="tooltip-text" translatable="yes">Show the what the unlock dialog will look like.</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Preview</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="preview_theme_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="name">label5</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Blanking</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="blanking_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="options_tab">
+ <property name="name">options_tab</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Advanced</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">notebook</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox2">
+ <property name="name">hbuttonbox2</property>
+ <property name="border-width">5</property>
+ <property name="layout-style">GTK_BUTTONBOX_EDGE</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkButton" id="helpbutton">
+ <property name="name">helpbutton</property>
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label">gtk-help</property>
+ <property name="use-stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="doc_menu_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="closebutton">
+ <property name="name">closebutton</property>
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label">gtk-close</property>
+ <property name="use-stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="quit_menu_cb" name="clicked"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack-type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/driver/dialog.c b/driver/dialog.c
index fce74c4..417f862 100644
--- a/driver/dialog.c
+++ b/driver/dialog.c
@@ -1,5 +1,5 @@
/* dialog.c --- the password dialog and splash screen.
- * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -47,6 +47,10 @@
#include <ctype.h>
#include <pwd.h>
+#ifndef HAVE_XINPUT
+# error The XInput2 extension is required
+#endif
+
#include <X11/Xproto.h> /* for CARD32 */
#include <X11/Xlib.h>
#include <X11/Xatom.h>
@@ -79,6 +83,10 @@
#include "font-retry.h"
#include "prefs.h"
#include "usleep.h"
+#include "utf8wc.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
extern Bool debug_p;
@@ -125,7 +133,7 @@ typedef struct {
typedef struct {
char *text;
XftFont *font;
- XftColor fg;
+ XftColor fg, fg2;
Pixel bg;
enum { LABEL, BUTTON, TEXT, TEXT_RO } type;
line_align align;
@@ -146,7 +154,7 @@ struct window_state {
Window window;
Colormap cmap;
- Bool splash_p;
+ int splash_p;
auth_state auth_state;
int xi_opcode;
int xkb_opcode;
@@ -177,9 +185,11 @@ struct window_state {
XtIntervalId timer;
XtIntervalId cursor_timer; /* Blink the I-beam */
+ XtIntervalId bs_timer; /* Auto-repeat Backspace */
int i_beam;
double start_time, end_time;
+ int passwd_timeout;
Bool show_stars_p; /* "I regret that I have but one asterisk for my country."
-- Nathan Hale, 1776. */
@@ -192,6 +202,7 @@ struct window_state {
char *date_format;
char *kbd_layout_label;
char *newlogin_cmd;
+ const char *asterisk_utf8;
/* Resources for fonts and colors */
XftDraw *xftdraw;
@@ -208,6 +219,7 @@ struct window_state {
XftColor xft_foreground;
XftColor xft_text_foreground;
XftColor xft_button_foreground;
+ XftColor xft_button_disabled;
XftColor xft_error_foreground;
Pixel passwd_background;
Pixel thermo_foreground;
@@ -483,10 +495,13 @@ draw_dialog_line (window_state *ws, Drawable d, dialog_line *line,
if (line->type == BUTTON &&
line->button &&
- (line->button->down_p || line->button->disabled_p))
+ line->button->down_p)
xoff2 = yoff2 = MIN (ws->shadow_width, line->font->ascent/2);
- XftDrawStringUtf8_multi (ws->xftdraw, &line->fg, line->font,
+ XftDrawStringUtf8_multi (ws->xftdraw,
+ (line->button && line->button->disabled_p
+ ? &line->fg2 : &line->fg),
+ line->font,
left + xoff2,
y + ypad + yoff2 + line->font->ascent,
(FcChar8 *) text, strlen (text),
@@ -666,6 +681,31 @@ get_xft_color (window_state *ws, XftColor *ret,
s, ret);
}
+static void
+dim_xft_color (window_state *ws, const XftColor *in, Pixel bg, XftColor *out)
+{
+ double dim = 0.6;
+# if 0 /* Turns out Xft alpha doesn't work. How very. */
+ XRenderColor rc = in->color;
+ rc.alpha *= dim;
+# else
+ XRenderColor rc;
+ XColor xc;
+ xc.pixel = bg;
+ XQueryColor (ws->dpy, DefaultColormapOfScreen (ws->screen), &xc);
+ rc.red = dim * in->color.red + (1-dim) * xc.red;
+ rc.green = dim * in->color.green + (1-dim) * xc.green;
+ rc.blue = dim * in->color.blue + (1-dim) * xc.blue;
+ rc.alpha = in->color.alpha;
+# endif
+ if (! XftColorAllocValue (ws->dpy,
+ DefaultVisualOfScreen(ws->screen),
+ DefaultColormapOfScreen (ws->screen),
+ &rc, out))
+ abort();
+}
+
+
static int
get_int (window_state *ws, const char *name, const char *rclass)
{
@@ -674,32 +714,74 @@ get_int (window_state *ws, const char *name, const char *rclass)
}
+static const char *
+choose_asterisk (window_state *ws)
+{
+ static char picked[8];
+ const unsigned long candidates[] = { 0x25CF, /* Black Circle */
+ 0x2022, /* Bullet */
+ 0x2731, /* Heavy Asterisk */
+ '*' }; /* Ἀστερίσκος */
+ const unsigned long *uc = candidates;
+ int i, L;
+ for (i = 0; i < countof (candidates) - 1; i++)
+ {
+# ifdef HAVE_XFT
+ if (XftCharExists (ws->dpy, ws->label_font, (FcChar32) *uc))
+ break;
+ if (debug_p)
+ fprintf (stderr, "%s: char U+%0lX does not exist\n", blurb(), *uc);
+# endif
+ uc++;
+ }
+
+ L = utf8_encode (*uc, picked, sizeof (picked) - 1);
+ picked[L] = 0;
+
+ return picked;
+}
+
+
/* Decide where on the X11 screen to place the dialog.
This is complicated because, in the face of RANDR and Xinerama, we want
to center it on a *monitor*, not on what X calls a 'Screen'. So get the
monitor state, then figure out which one of those the mouse is in.
*/
static void
-splash_pick_window_position (Display *dpy, Position *xP, Position *yP)
+splash_pick_window_position (Display *dpy, Position *xP, Position *yP,
+ Screen **screenP)
{
- Window pointer_root, pointer_child;
- int root_x = 0, root_y = 0, win_x, win_y;
- unsigned int mask;
+ Screen *mouse_screen = DefaultScreenOfDisplay (dpy);
+ int root_x = 0, root_y = 0;
+ int nscreens = ScreenCount (dpy);
+ int i, screen;
monitor **monitors;
monitor *m = 0;
- int i;
- XQueryPointer (dpy, RootWindow (dpy, 0),
- &pointer_root, &pointer_child,
- &root_x, &root_y, &win_x, &win_y, &mask);
+ /* Find the mouse screen, and position on it. */
+ for (screen = 0; screen < nscreens; screen++)
+ {
+ Window pointer_root, pointer_child;
+ int win_x, win_y;
+ unsigned int mask;
+ int status = XQueryPointer (dpy, RootWindow (dpy, screen),
+ &pointer_root, &pointer_child,
+ &root_x, &root_y, &win_x, &win_y, &mask);
+ if (status != None)
+ {
+ mouse_screen = ScreenOfDisplay (dpy, screen);
+ break;
+ }
+ }
- monitors = scan_monitors (dpy);
+ monitors = scan_monitors (dpy); /* This scans all Screens */
if (!monitors || !*monitors) abort();
for (i = 0; monitors[i]; i++)
{
monitor *m0 = monitors[i];
if (m0->sanity == S_SANE &&
+ mouse_screen == m0->screen &&
root_x >= m0->x &&
root_y >= m0->y &&
root_x < m0->x + m0->width &&
@@ -725,6 +807,7 @@ splash_pick_window_position (Display *dpy, Position *xP, Position *yP)
*xP = m->x + m->width/2;
*yP = m->y + m->height/2;
+ *screenP = mouse_screen;
free_monitors (monitors);
}
@@ -733,43 +816,44 @@ splash_pick_window_position (Display *dpy, Position *xP, Position *yP)
static void unlock_cb (window_state *ws);
-/* This program only needs one option from the init file, so it
- just reads the .ad file and the .xscreensaver file directly rather
- than going through Xt and Xrm.
+/* This program only needs a few options from .xscreensaver.
+ Read that file directly and store those into the Xrm database.
*/
-static void init_line_handler (int lineno,
+static void init_line_handler (int lineno,
const char *key, const char *val,
void *closure)
{
window_state *ws = (window_state *) closure;
- if (val && *val && !strcmp (key, "dialogTheme"))
+ if (!val || !*val)
+ ;
+ else if (!strcmp (key, "dialogTheme") ||
+ !strcmp (key, "passwdTimeout"))
{
- if (ws->dialog_theme) free (ws->dialog_theme);
- ws->dialog_theme = strdup (val);
+ XrmDatabase db = XtDatabase (ws->dpy);
+ char *key2 = (char *) malloc (strlen (progname) + strlen (val) + 10);
+ sprintf (key2, "%s.%s", progname, key);
+ XrmPutStringResource (&db, key2, val);
+ free (key2);
}
+ /* We read additional resources, such as "PROGCLASS.THEME.Dialog.foreground",
+ but those are from the .ad file only, not from .xscreensaver, so they
+ don't need a clause here in the file parser. They have already been
+ read into the DB by Xt's Xrm initialization. */
}
+
static void
read_init_file_simple (window_state *ws)
{
const char *home = getenv("HOME");
- const char *fn1 = AD_DIR "/XScreenSaver";
- char *fn2;
+ char *fn;
if (!home || !*home) return;
- fn2 = (char *) malloc (strlen(home) + 40);
- sprintf (fn2, "%s/.xscreensaver", home);
-
+ fn = (char *) malloc (strlen(home) + 40);
+ sprintf (fn, "%s/.xscreensaver", home);
if (debug_p)
- fprintf (stderr, "%s: reading %s\n", blurb(), fn1);
- parse_init_file (fn1, init_line_handler, ws);
-
- if (debug_p)
- fprintf (stderr, "%s: reading %s\n", blurb(), fn2);
- parse_init_file (fn2, init_line_handler, ws);
-
- if (verbose_p)
- fprintf (stderr, "%s: theme: %s\n", blurb(),
- (ws->dialog_theme ? ws->dialog_theme : "none"));
+ fprintf (stderr, "%s: reading %s\n", blurb(), fn);
+ parse_init_file (fn, init_line_handler, ws);
+ free (fn);
}
@@ -907,10 +991,9 @@ create_window (window_state *ws, int w, int h)
/* Loads resources and creates and returns the global window state.
*/
static window_state *
-window_init (Widget root_widget, Bool splash_p)
+window_init (Widget root_widget, int splash_p)
{
Display *dpy = XtDisplay (root_widget);
- Screen *screen = XtScreen (root_widget);
window_state *ws;
Bool resource_error_p = False;
@@ -919,17 +1002,14 @@ window_init (Widget root_widget, Bool splash_p)
ws->splash_p = splash_p;
ws->dpy = dpy;
- ws->screen = screen;
ws->app = XtWidgetToApplicationContext (root_widget);
- /* Read default theme from resources before the init file. */
- ws->dialog_theme =
- get_string_resource (ws->dpy, "dialogTheme", "DialogTheme");
- if (!ws->dialog_theme || !*ws->dialog_theme)
- ws->dialog_theme = strdup ("default");
+ splash_pick_window_position (ws->dpy, &ws->cx, &ws->cy, &ws->screen);
- /* Read theme from init file before any other resources. */
- read_init_file_simple (ws);
+ ws->cmap = XCreateColormap (dpy,
+ RootWindowOfScreen (ws->screen), /* Old skool */
+ DefaultVisualOfScreen (ws->screen),
+ AllocNone);
{
struct passwd *p = getpwuid (getuid());
@@ -937,15 +1017,25 @@ window_init (Widget root_widget, Bool splash_p)
ws->user = p->pw_name;
}
- ws->cmap = XCreateColormap (dpy, RootWindowOfScreen (screen), /* Old skool */
- DefaultVisualOfScreen (screen),
- AllocNone);
+ /* Read resources and .xscreensaver file settings.
+ */
+ read_init_file_simple (ws);
+
+ ws->dialog_theme = /* must be first */
+ get_string_resource (ws->dpy, "dialogTheme", "DialogTheme");
+ if (!ws->dialog_theme || !*ws->dialog_theme)
+ ws->dialog_theme = strdup ("default");
+ if (verbose_p)
+ fprintf (stderr, "%s: theme: %s\n", blurb(), ws->dialog_theme);
ws->newlogin_cmd = get_str (ws, "newLoginCommand", "NewLoginCommand");
ws->date_format = get_str (ws, "dateFormat", "DateFormat");
ws->show_stars_p =
get_boolean_resource (ws->dpy, "passwd.asterisks", "Passwd.Boolean");
+ ws->passwd_timeout = get_seconds_resource (ws->dpy, "passwdTimeout", "Time");
+ if (ws->passwd_timeout <= 5) ws->passwd_timeout = 5;
+
/* Put the version number in the label. */
{
char *version = strdup (screensaver_id + 17);
@@ -975,6 +1065,8 @@ window_init (Widget root_widget, Bool splash_p)
ws->label_font = get_font (ws, "labelFont");
ws->date_font = get_font (ws, "dateFont");
ws->hostname_font = get_font (ws, "unameFont");
+
+ ws->asterisk_utf8 = choose_asterisk (ws);
ws->foreground = get_color (ws, "foreground", "Foreground");
ws->background = get_color (ws, "background", "Background");
@@ -986,6 +1078,8 @@ window_init (Widget root_widget, Bool splash_p)
"error.foreground", "Error.Foreground");
get_xft_color (ws, &ws->xft_button_foreground,
"button.foreground", "Button.Foreground");
+ dim_xft_color (ws, &ws->xft_button_foreground, ws->background,
+ &ws->xft_button_disabled);
ws->shadow_top = get_color (ws, "topShadowColor", "Foreground");
ws->shadow_bottom = get_color (ws, "bottomShadowColor", "Background");
@@ -1002,8 +1096,8 @@ window_init (Widget root_widget, Bool splash_p)
if (resource_error_p)
{
/* Make sure the error messages show up. */
- ws->foreground = BlackPixelOfScreen (screen);
- ws->background = WhitePixelOfScreen (screen);
+ ws->foreground = BlackPixelOfScreen (ws->screen);
+ ws->background = WhitePixelOfScreen (ws->screen);
}
ws->preferred_logo_width = get_int (ws, "logo.width", "Logo.Width");
@@ -1040,7 +1134,7 @@ window_init (Widget root_widget, Bool splash_p)
Window root = RootWindowOfScreen(ws->screen);
Visual *visual = DefaultVisualOfScreen (ws->screen);
int logo_size = (ws->heading_font->ascent > 24 ? 2 : 1);
- ws->logo_pixmap = xscreensaver_logo (screen, visual, root, ws->cmap,
+ ws->logo_pixmap = xscreensaver_logo (ws->screen, visual, root, ws->cmap,
ws->background,
&ws->logo_pixels, &ws->logo_npixels,
&ws->logo_clipmask, logo_size);
@@ -1049,8 +1143,6 @@ window_init (Widget root_widget, Bool splash_p)
&ws->logo_width, &ws->logo_height, &bw, &d);
}
- splash_pick_window_position (ws->dpy, &ws->cx, &ws->cy);
-
ws->x = ws->y = 0;
create_window (ws, 1, 1);
@@ -1212,7 +1304,7 @@ static void
window_draw (window_state *ws)
{
Display *dpy = ws->dpy;
- Screen *screen = DefaultScreenOfDisplay (dpy);
+ Screen *screen = ws->screen;
Window root = RootWindowOfScreen (screen);
Visual *visual = DefaultVisualOfScreen(screen);
int depth = DefaultDepthOfScreen (screen);
@@ -1234,8 +1326,6 @@ window_draw (window_state *ws)
char date_text[100];
time_t now = time ((time_t *) 0);
struct tm *tm = localtime (&now);
- double ratio = 1 - ((double_time() - ws->start_time) /
- (ws->end_time - ws->start_time));
dialog_line *lines =
(dialog_line *) calloc (ws->nmsgs + 40, sizeof(*lines));
Bool emitted_user_p = False;
@@ -1276,27 +1366,111 @@ window_draw (window_state *ws)
lines[i].text = ws->heading_label; /* XScreenSaver */
lines[i].font = ws->heading_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
i++;
+ /* If you are in here because you're planning on disabling this notice
+ before redistributing my software, please don't.
+
+ I sincerely request that you do one of the following:
+
+ 1: leave this code intact and this warning in place, -OR-
+
+ 2: Remove xscreensaver from your distribution.
+
+ I would seriously prefer that you not distribute my software at all
+ than that you distribute one version and then never update it for
+ years.
+
+ I am *constantly* getting email from users reporting bugs that have
+ been fixed for literally years who have no idea that the software
+ they are running is years out of date. Yes, it would be great if we
+ lived in the ideal world where people checked that they were running
+ the latest release before they report a bug, but we don't. To most
+ people, "running the latest release" is synonymous with "running the
+ latest release that my distro packages for me."
+
+ When they even bother to tell me what version they're running, I
+ say, "That version is three years old!", and they say "But this is
+ the latest version my distro ships". Then I say, "your distro
+ sucks", and they say "but I don't know how to compile from source,
+ herp derp I eat paste", and *everybody* goes away unhappy.
+
+ It wastes an enormous amount of my time, but worse than that, it
+ does a grave disservice to the users, who are stuck experiencing
+ bugs that are already fixed! These users think they are running the
+ latest release, and they are not. They would like to be running the
+ actual latest release, but they don't know how, because their distro
+ makes that very difficult for them. It's terrible for everyone, and
+ kind of makes me regret ever having released this software in the
+ first place.
+
+ So seriously. I ask that if you're planning on disabling this
+ obsolescence warning, that you instead just remove xscreensaver from
+ your distro entirely. Everybody will be happier that way. Check
+ out gnome-screensaver instead, I understand it's really nice.
+
+ Of course, my license allows you to ignore me and do whatever the
+ fuck you want, but as the author, I hope you will have the common
+ courtesy of complying with my request.
+
+ Thank you!
+
+ jwz, 2014, 2016, 2018, 2021.
+
+ PS: In particular, since Debian refuses to upgrade software on any
+ kind of rational timeline, I have asked that they stop shipping
+ xscreensaver at all. They have refused. Instead of upgrading the
+ software, they simply patched out this warning.
+
+ If you want to witness the sad state of the open source peanut
+ gallery, look no farther than the comments on my blog:
+ http://jwz.org/b/yiYo
+
+ Many of these people fall back on their go-to argument of, "If it is
+ legal, it must be right." If you believe in that rhetorical device
+ then you are a terrible person, and possibly a sociopath.
+
+ There are also the armchair lawyers who say "Well, instead of
+ *asking* people to do the right thing out of common courtesy, you
+ should just change your license to prohibit them from acting
+ amorally." Again, this is the answer of a sociopath, but that aside,
+ if you devote even a second's thought to this you will realize that
+ the end result of this would be for distros like Debian to just keep
+ shipping the last version with the old license and then never
+ upgrading it again -- which would be the worst possible outcome for
+ everyone involved, most especially the users.
+
+ Also, some have incorrectly characterized this as a "time bomb".
+ It is a software update notification, nothing more. A "time bomb"
+ makes software stop working. This merely alerts the user that the
+ security-critical software that they are running is dangerously out
+ of date.
+
+ If you have read all of the above, and still decide to intentionally
+ disrespect the wishes of the person who wrote all of this software for
+ you -- you are a terrible person. Kindly go fuck yourself.
+ */
if (time ((time_t *) 0) - XSCREENSAVER_RELEASED > 60*60*24*30*17)
{
lines[i].text = _("Update available!\nThis version is very old.\n");
lines[i].font = ws->error_font;
lines[i].fg = ws->xft_error_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
i++;
}
- else if (strstr (ws->version, "a") ||
- strstr (ws->version, "b"))
+ else if (strstr (ws->version, "a") || strstr (ws->version, "b"))
{
lines[i].text = _("PRE-RELEASE VERSION");
lines[i].font = ws->error_font;
lines[i].fg = ws->xft_error_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
@@ -1308,6 +1482,7 @@ window_draw (window_state *ws)
lines[i].text = ws->hostname_label;
lines[i].font = ws->hostname_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
@@ -1318,6 +1493,7 @@ window_draw (window_state *ws)
lines[i].text = ""; \
lines[i].font = ws->body_font; \
lines[i].fg = ws->xft_foreground; \
+ lines[i].fg2 = lines[i].fg; \
lines[i].bg = ws->background; \
lines[i].type = LABEL; \
lines[i].align = CENTER; \
@@ -1331,6 +1507,7 @@ window_draw (window_state *ws)
_("DEBUG MODE:\nAll keystrokes are being logged to stderr.\n");
lines[i].font = ws->error_font;
lines[i].fg = ws->xft_error_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
@@ -1342,6 +1519,7 @@ window_draw (window_state *ws)
lines[i].text = ws->body_label; /* Copyright or error message */
lines[i].font = ws->body_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
@@ -1362,6 +1540,7 @@ window_draw (window_state *ws)
lines[i].fg = (ws->msgs[j].type == AUTH_MSGTYPE_ERROR
? ws->xft_error_foreground
: ws->xft_foreground);
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = CENTER;
@@ -1377,6 +1556,7 @@ window_draw (window_state *ws)
lines[i].text = _("Username:");
lines[i].font = ws->label_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = LEFT;
@@ -1386,6 +1566,7 @@ window_draw (window_state *ws)
lines[i].text = ws->user; /* $USER */
lines[i].font = ws->label_font;
lines[i].fg = ws->xft_text_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->passwd_background;
lines[i].type = TEXT_RO;
lines[i].align = RIGHT;
@@ -1395,6 +1576,7 @@ window_draw (window_state *ws)
lines[i].text = trim (ws->msgs[j].msg); /* PAM prompt text */
lines[i].font = ws->label_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = LEFT;
@@ -1410,6 +1592,7 @@ window_draw (window_state *ws)
: "");
lines[i].font = ws->label_font;
lines[i].fg = ws->xft_text_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->passwd_background;
lines[i].type = TEXT;
lines[i].align = RIGHT;
@@ -1422,6 +1605,7 @@ window_draw (window_state *ws)
lines[i].text = date_text;
lines[i].font = ws->date_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = RIGHT;
@@ -1434,6 +1618,7 @@ window_draw (window_state *ws)
lines[i].text = ws->kbd_layout_label;
lines[i].font = ws->date_font;
lines[i].fg = ws->xft_foreground;
+ lines[i].fg2 = lines[i].fg;
lines[i].bg = ws->background;
lines[i].type = LABEL;
lines[i].align = RIGHT;
@@ -1482,6 +1667,7 @@ window_draw (window_state *ws)
lines[i].text = _("Settings");
lines[i].font = ws->button_font;
lines[i].fg = ws->xft_button_foreground;
+ lines[i].fg2 = ws->xft_button_disabled;
lines[i].bg = ws->button_background;
lines[i].type = BUTTON;
lines[i].align = LEFT;
@@ -1489,9 +1675,14 @@ window_draw (window_state *ws)
lines[i].button = &ws->demo_button_state;
i++;
+ if (ws->splash_p > 1)
+ /* Settings button is disabled with --splash --splash */
+ ws->demo_button_state.disabled_p = True;
+
lines[i].text = _("Help");
lines[i].font = ws->button_font;
lines[i].fg = ws->xft_button_foreground;
+ lines[i].fg2 = ws->xft_button_disabled;
lines[i].bg = ws->button_background;
lines[i].type = BUTTON;
lines[i].align = RIGHT;
@@ -1505,6 +1696,7 @@ window_draw (window_state *ws)
lines[i].text = _("New Login");
lines[i].font = ws->button_font;
lines[i].fg = ws->xft_button_foreground;
+ lines[i].fg2 = ws->xft_button_disabled;
lines[i].bg = ws->button_background;
lines[i].type = BUTTON;
lines[i].align = LEFT;
@@ -1516,6 +1708,7 @@ window_draw (window_state *ws)
lines[i].text = _("OK");
lines[i].font = ws->button_font;
lines[i].fg = ws->xft_button_foreground;
+ lines[i].fg2 = ws->xft_button_disabled;
lines[i].bg = ws->button_background;
lines[i].type = BUTTON;
lines[i].align = RIGHT;
@@ -1536,10 +1729,12 @@ window_draw (window_state *ws)
{
if (ws->auth_state != AUTH_NOTIFY)
{
+ double remain = ws->end_time - double_time();
+ double ratio = remain / ws->passwd_timeout;
int thermo_w = ws->thermo_width;
int thermo_h = window_height - ext_border * 2;
int thermo_h2 = thermo_h - ws->shadow_width * 2;
- int thermo_h3 = thermo_h2 * (1.0 - ratio);
+ int thermo_h3 = thermo_h2 * (1.0 - (ratio > 1 ? 1 : ratio));
XSetForeground (dpy, gc, ws->thermo_foreground);
XFillRectangle (dpy, dbuf, gc,
@@ -1718,6 +1913,11 @@ destroy_window (window_state *ws)
XtRemoveTimeOut (ws->cursor_timer);
ws->cursor_timer = 0;
}
+ if (ws->bs_timer)
+ {
+ XtRemoveTimeOut (ws->bs_timer);
+ ws->bs_timer = 0;
+ }
while (XCheckMaskEvent (ws->dpy, PointerMotionMask, &event))
if (verbose_p)
@@ -1753,7 +1953,7 @@ destroy_window (window_state *ws)
XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen),
DefaultColormapOfScreen (ws->screen),
&ws->xft_error_foreground);
- XftDrawDestroy (ws->xftdraw);
+ if (ws->xftdraw) XftDrawDestroy (ws->xftdraw);
# if 0 /* screw this, we're exiting anyway */
if (ws->foreground != black && ws->foreground != white)
@@ -1878,6 +2078,7 @@ persistent_auth_status_failure (window_state *ws,
}
+static void bs_timer (XtPointer, XtIntervalId *);
static void
handle_keypress (window_state *ws, XKeyEvent *event)
@@ -1914,15 +2115,13 @@ handle_keypress (window_state *ws, XKeyEvent *event)
/* Add 10% to the time remaining every time a key is pressed, but don't
go past the max duration. */
{
- time_t now = time ((time_t *) 0);
- int max = get_seconds_resource (ws->dpy, "passwdTimeout", "Time");
- int remain = ws->end_time - now;
+ double now = double_time();
+ double remain = ws->end_time - now;
remain *= 1.1;
- if (remain > max) remain = max;
+ if (remain > ws->passwd_timeout) remain = ws->passwd_timeout;
if (remain < 3) remain = 3;
ws->end_time = now + remain;
}
-
if (decoded_size == 1) /* Handle single-char commands */
{
@@ -1945,6 +2144,15 @@ handle_keypress (window_state *ws, XKeyEvent *event)
}
ws->plaintext_passwd_char_size[nchars-1] = 0;
}
+
+ /* The XInput2 extension does not send auto-repeat KeyPress
+ events, and it annoys people that you can't hold down the
+ Backspace key to clear the line. So clear the whole line
+ if the key is held down for a little while. */
+ if (ws->bs_timer)
+ XtRemoveTimeOut (ws->bs_timer);
+ ws->bs_timer =
+ XtAppAddTimeOut (ws->app, 1000 * 0.6, bs_timer, (XtPointer) ws);
}
break;
@@ -1956,7 +2164,7 @@ handle_keypress (window_state *ws, XKeyEvent *event)
ws->auth_state = AUTH_CANCEL;
break;
- case '\025': case '\030': /* Erase line */
+ case '\025': case '\030': /* Erase line ^U ^X */
memset (ws->plaintext_passwd, 0, sizeof (ws->plaintext_passwd));
memset (ws->plaintext_passwd_char_size, 0,
sizeof (ws->plaintext_passwd_char_size));
@@ -1997,9 +2205,7 @@ handle_keypress (window_state *ws, XKeyEvent *event)
*out = 0;
for (i = 0; i < MAX_PASSWD_CHARS && ws->plaintext_passwd_char_size[i]; i++)
{
- const char *b = /* "\xE2\x80\xA2"; */ /* U+2022 Bullet */
- "\xe2\x97\x8f"; /* U+25CF Black Circle */
- strcat (out, b);
+ strcat (out, ws->asterisk_utf8);
out += strlen(out);
}
}
@@ -2059,6 +2265,14 @@ handle_event (window_state *ws, XEvent *xev)
refresh_p = True;
break;
+ case KeyRelease:
+ if (ws->bs_timer)
+ {
+ XtRemoveTimeOut (ws->bs_timer);
+ ws->bs_timer = 0;
+ }
+ break;
+
case ButtonPress:
case ButtonRelease:
{
@@ -2091,6 +2305,23 @@ cursor_timer (XtPointer closure, XtIntervalId *id)
}
+/* Auto-repeat Backspace, since XInput2 doesn't do autorepeat. */
+static void
+bs_timer (XtPointer closure, XtIntervalId *id)
+{
+ window_state *ws = (window_state *) closure;
+ if (ws->bs_timer)
+ XtRemoveTimeOut (ws->bs_timer);
+ ws->bs_timer = 0;
+ /* Erase line */
+ memset (ws->plaintext_passwd, 0, sizeof (ws->plaintext_passwd));
+ memset (ws->plaintext_passwd_char_size, 0,
+ sizeof (ws->plaintext_passwd_char_size));
+ memset (ws->censored_passwd, 0, sizeof(ws->censored_passwd));
+ window_draw (ws);
+}
+
+
/* Redraw the window for the thermometer, and exit if the time has expired.
*/
static void
@@ -2121,8 +2352,7 @@ gui_main_loop (window_state *ws, Bool splash_p, Bool notification_p)
timeout = 5;
else
{
- timeout = get_seconds_resource (ws->dpy, "passwdTimeout", "Time");
- if (timeout <= 5) timeout = 5;
+ timeout = ws->passwd_timeout;
cursor_timer (ws, 0);
}
@@ -2236,7 +2466,12 @@ gui_main_loop (window_state *ws, Bool splash_p, Bool notification_p)
break;
}
- /* Since MappingNotify doesn't work, we have to do this crap instead. */
+ /* Since MappingNotify doesn't work, we have to do this crap instead.
+ Probably some of these events could be ignored, as it seems that
+ any.xkb_type == XkbStateNotify comes in every time a modifier key is
+ touched. What event comes in when there is a keyboard layout change,
+ the only thing we actually care about?
+ */
if (xev.xany.type == ws->xkb_opcode)
{
XkbEvent *xkb = (XkbEvent *) &xev;
@@ -2496,10 +2731,10 @@ xscreensaver_auth_finished (void *closure, Bool authenticated_p)
void
-xscreensaver_splash (void *closure)
+xscreensaver_splash (void *closure, Bool disable_settings_p)
{
Widget root_widget = (Widget) closure;
- window_state *ws = window_init (root_widget, True);
+ window_state *ws = window_init (root_widget, disable_settings_p ? 2 : 1);
ws->auth_state = AUTH_READ;
gui_main_loop (ws, True, False);
destroy_window (ws);
diff --git a/driver/dpms.c b/driver/dpms.c
index 15721ea..fe5e245 100644
--- a/driver/dpms.c
+++ b/driver/dpms.c
@@ -1,5 +1,5 @@
/* dpms.c --- syncing the X Display Power Management System values
- * xscreensaver, Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2001-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -20,17 +20,59 @@
#include "xscreensaver.h"
+/* Disable the X11 built-in screen saver. This is not directly related
+ to DPMS, but it does need to be prevented from fighting with us.
+ */
+static void
+disable_builtin_saver (Display *dpy)
+{
+ int otimeout = -1;
+ int ointerval = -1;
+ int oblanking = -1;
+ int oexposures = -1;
+ XGetScreenSaver (dpy, &otimeout, &ointerval, &oblanking, &oexposures);
+ if (otimeout == 0 && ointerval == 0 && oblanking == 0 && oexposures == 0)
+ {
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: builtin saver already disabled\n", blurb());
+ }
+ else
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: disabling server's builtin saver\n", blurb());
+ XSetScreenSaver (dpy, 0, 0, 0, 0);
+ XForceScreenSaver (dpy, ScreenSaverReset);
+ }
+}
+
+
#ifndef HAVE_DPMS_EXTENSION /* almost the whole file */
void
sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
{
+ disable_builtin_saver (dpy);
if (p->verbose_p)
fprintf (stderr, "%s: DPMS not supported at compile time\n", blurb());
}
-Bool monitor_powered_on_p (Display *dpy) { return True; }
-void monitor_power_on (saver_info *si, Bool on_p) { return; }
+Bool monitor_powered_on_p (Display *dpy)
+{
+ if (verbose_p > 1)
+ fprintf (stderr,
+ "%s: DPMS disabled at compile time, assuming monitor on\n",
+ blurb());
+ return True;
+}
+
+void monitor_power_on (saver_info *si, Bool on_p)
+{
+ if (verbose_p > 1)
+ fprintf (stderr,
+ "%s: DPMS disabled at compile time, not turning monitor %s\n",
+ blurb(), (on ? "on" : "off"));
+ return;
+}
#else /* HAVE_DPMS_EXTENSION -- whole file */
@@ -65,15 +107,18 @@ sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
Bool verbose_p = p->verbose_p;
static Bool warned_p = False;
- /* If the monitor is currently powered off, defer any changes until
- we are next called while it is powered on. */
+ /* If the monitor is currently powered off, defer any changes until we are
+ next called while it is powered on. Making changes to the DPMS settings
+ can have the side-effect of powering the monitor back on.
+ */
if (! monitor_powered_on_p (dpy))
- return;
+ {
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: DPMS: monitor off, skipping sync\n", blurb());
+ return;
+ }
- /* Why did I do this? It makes DPMS never happen.
- XSetScreenSaver (dpy, 0, 0, 0, 0);
- XForceScreenSaver (dpy, ScreenSaverReset);
- */
+ disable_builtin_saver (dpy);
if (dpms_quickoff_p && !off_secs)
{
@@ -102,7 +147,7 @@ sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
if (! DPMSQueryExtension (dpy, &event, &error))
{
- if (verbose_p && !warned_p)
+ if (verbose_p > 1 || (verbose_p && !warned_p))
fprintf (stderr, "%s: XDPMS extension not supported\n", blurb());
warned_p = True;
return;
@@ -110,7 +155,7 @@ sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
if (! DPMSCapable (dpy))
{
- if (verbose_p && !warned_p)
+ if (verbose_p > 1 || (verbose_p && !warned_p))
fprintf (stderr, "%s: DPMS not supported\n", blurb());
warned_p = True;
return;
@@ -118,7 +163,7 @@ sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
if (! DPMSInfo (dpy, &o_power, &o_enabled))
{
- if (verbose_p && !warned_p)
+ if (verbose_p > 1 || (verbose_p && !warned_p))
fprintf (stderr, "%s: unable to get DPMS state\n", blurb());
warned_p = True;
return;
@@ -167,6 +212,9 @@ sync_server_dpms_settings (Display *dpy, struct saver_preferences *p)
fprintf (stderr, "%s: set DPMS timeouts: %d %d %d\n", blurb(),
standby_secs, suspend_secs, off_secs);
}
+ else if (verbose_p > 1)
+ fprintf (stderr, "%s: DPMS timeouts already %d %d %d\n", blurb(),
+ o_standby, o_suspend, o_off);
}
Bool
@@ -178,19 +226,34 @@ monitor_powered_on_p (Display *dpy)
CARD16 state;
if (!DPMSQueryExtension(dpy, &event_number, &error_number))
- /* Server doesn't know -- assume the monitor is on. */
- result = True;
+ {
+ /* Server doesn't know -- assume the monitor is on. */
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: DPMSQueryExtension failed, assuming monitor on\n",
+ blurb());
+ result = True;
+ }
else if (!DPMSCapable(dpy))
- /* Server says the monitor doesn't do power management -- so it's on. */
- result = True;
+ {
+ /* Server says the monitor doesn't do power management -- so it's on. */
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: DPMSCapable false; assuming monitor on\n",
+ blurb());
+ result = True;
+ }
else
{
DPMSInfo(dpy, &state, &onoff);
if (!onoff)
- /* Server says DPMS is disabled -- so the monitor is on. */
- result = True;
+ {
+ /* Server says DPMS is disabled -- so the monitor is on. */
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: DPMSInfo disabled; assuming monitor on\n",
+ blurb());
+ result = True;
+ }
else
switch (state) {
case DPMSModeOn: result = True; break; /* really on */
@@ -199,6 +262,13 @@ monitor_powered_on_p (Display *dpy)
case DPMSModeOff: result = False; break; /* really off */
default: result = True; break; /* protocol error? */
}
+ if (verbose_p > 1)
+ fprintf (stderr, "%s: DPMSInfo = %s %s\n", blurb(),
+ (state == DPMSModeOn ? "DPMSModeOn" :
+ state == DPMSModeStandby ? "DPMSModeStandby" :
+ state == DPMSModeSuspend ? "DPMSModeSuspend" :
+ state == DPMSModeOff ? "DPMSModeOff" : "???"),
+ (result ? "True" : "False"));
}
return result;
@@ -207,6 +277,7 @@ monitor_powered_on_p (Display *dpy)
void
monitor_power_on (saver_info *si, Bool on_p)
{
+ Bool verbose_p = si->prefs.verbose_p;
if ((!!on_p) != monitor_powered_on_p (si->dpy))
{
XErrorHandler old_handler;
@@ -215,7 +286,7 @@ monitor_power_on (saver_info *si, Bool on_p)
if (!DPMSQueryExtension(si->dpy, &event_number, &error_number) ||
!DPMSCapable(si->dpy))
{
- if (si->prefs.verbose_p && !warned_p)
+ if (verbose_p > 1 || (verbose_p && !warned_p))
fprintf (stderr,
"%s: unable to power %s monitor: no DPMS extension\n",
blurb(), (on_p ? "on" : "off"));
@@ -243,12 +314,18 @@ monitor_power_on (saver_info *si, Bool on_p)
XSetErrorHandler (old_handler);
/* Ignore error_handler_hit_p, just probe monitor instead */
+ if (verbose_p > 1 && error_handler_hit_p)
+ fprintf (stderr, "%s: DPMSForceLevel got an X11 error\n", blurb());
+
if ((!!on_p) != monitor_powered_on_p (si->dpy)) /* double-check */
fprintf (stderr,
"%s: DPMSForceLevel(dpy, %s) did not change monitor power state\n",
blurb(),
(on_p ? "DPMSModeOn" : "DPMSModeOff"));
}
+ else if (verbose_p > 1)
+ fprintf (stderr, "%s: monitor is already %s\n", blurb(),
+ on_p ? "on" : "off");
}
#endif /* HAVE_DPMS_EXTENSION -- whole file */
diff --git a/driver/exts.c b/driver/exts.c
index 641325d..af5c536 100644
--- a/driver/exts.c
+++ b/driver/exts.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -17,6 +17,10 @@
# include "config.h"
#endif
+#ifndef HAVE_XINPUT
+# error The XInput2 extension is required
+#endif
+
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
@@ -190,8 +194,13 @@ print_available_extensions (saver_info *si)
# ifdef HAVE_LIBSYSTEMD
fprintf (stderr, "%s: libsystemd\n", blurb());
-# else
- fprintf (stderr, "%s: libsystemd (disabled at compile time)\n", blurb());
+# endif
+# ifdef HAVE_LIBELOGIND
+ fprintf (stderr, "%s: libelogind\n", blurb());
+# endif
+# if !defined(HAVE_LIBSYSTEMD) && !defined(HAVE_LIBELOGIND)
+ fprintf (stderr, "%s: libsystemd/libelogind (disabled at compile time)\n",
+ blurb());
# endif
for (i = 0; i < si->nscreens; i++)
diff --git a/driver/fade.c b/driver/fade.c
index 9451582..46a56ef 100644
--- a/driver/fade.c
+++ b/driver/fade.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1992-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1992-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -19,7 +19,7 @@
- XF86 Gamma or RANDR Gamma: These do the fade by altering the brightness
settings of the screen. This works on any system that has the "XF86
Video-Mode" extension (which is every modern system) AND ALSO has gamma
- support in the video driver. But it turns out that as of 2021, the
+ support in the video driver. But it turns out that as of 2022, the
Raspberry Pi HDMI video driver still does not support gamma. And there's
no way to determine that the video driver lacks gamma support even though
the extension exists. Since the Pi is probably the single most popular
@@ -105,14 +105,13 @@
*/
#undef HAVE_RANDR_12
-#define HAVE_XINPUT2 1 /* Mandatory */
-
-
-#ifdef HAVE_XINPUT2
-# include <X11/extensions/XInput2.h>
-# include "xinput.h"
+#ifndef HAVE_XINPUT
+# error The XInput2 extension is required
#endif
+#include <X11/extensions/XInput2.h>
+#include "xinput.h"
+
typedef struct {
int nscreens;
@@ -157,7 +156,7 @@ double_time (void)
}
-#ifdef HAVE_XINPUT2
+#ifdef HAVE_XINPUT
static int xi_opcode = -1;
#endif
@@ -176,7 +175,7 @@ user_event_p (Display *dpy, XEvent *event, XPointer arg)
case MotionNotify:
if (motion_p) return True;
break;
-# ifdef HAVE_XINPUT2
+# ifdef HAVE_XINPUT
case GenericEvent:
{
XIRawEvent *re;
@@ -186,18 +185,31 @@ user_event_p (Display *dpy, XEvent *event, XPointer arg)
XGetEventData (dpy, &event->xcookie);
if (! event->xcookie.data)
return False;
- re = event->xcookie.data;
- if (re->evtype == XI_RawKeyPress ||
- re->evtype == XI_RawButtonPress)
- return True;
- else if (motion_p && re->evtype == XI_RawMotion)
+ re = event->xcookie.data;
+ switch (re->evtype) {
+ case XI_RawKeyPress:
+ case XI_RawButtonPress:
+ case XI_RawTouchBegin:
+ case XI_KeyPress:
+ case XI_ButtonPress:
+ case XI_TouchBegin:
return True;
+ break;
+ case XI_RawMotion:
+ case XI_RawTouchUpdate:
+ case XI_Motion:
+ case XI_TouchUpdate:
+ if (motion_p) return True;
+ break;
+ default:
+ break;
+ }
/* Calling XFreeEventData here is bad news */
}
break;
-# endif /* HAVE_XINPUT2 */
+# endif /* HAVE_XINPUT */
default: break;
}
@@ -213,7 +225,7 @@ user_active_p (XtAppContext app, Display *dpy, Bool fade_out_p)
Bool motion_p = fade_out_p; /* Motion aborts fade-out, not fade-in. */
motion_p = False; /* Naah, never abort on motion only */
-# ifdef HAVE_XINPUT2
+# ifdef HAVE_XINPUT
if (xi_opcode == -1)
{
Bool ov = verbose_p;
@@ -294,6 +306,46 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
}
+/* Like XDestroyWindow, but destroys the window later, on a timer. This is
+ necessary to work around a KDE 5 compositor bug. Without this, destroying
+ an old window causes the desktop to briefly become visible, even though a
+ new window has already been mapped that is obscuring both of them!
+ */
+typedef struct {
+ XtAppContext app;
+ Display *dpy;
+ Window window;
+} defer_destroy_closure;
+
+static void
+defer_destroy_handler (XtPointer closure, XtIntervalId *id)
+{
+ defer_destroy_closure *c = (defer_destroy_closure *) closure;
+ XErrorHandler old_handler;
+ XSync (c->dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XDestroyWindow (c->dpy, c->window);
+ XSync (c->dpy, False);
+ XSetErrorHandler (old_handler);
+ if (verbose_p > 1 && !error_handler_hit_p)
+ fprintf (stderr, "%s: destroyed old window 0x%lx\n",
+ blurb(), (unsigned long) c->window);
+ free (c);
+}
+
+/* Used here and in windows.c */
+void
+defer_XDestroyWindow (XtAppContext app, Display *dpy, Window w)
+{
+ defer_destroy_closure *c = (defer_destroy_closure *) malloc (sizeof (*c));
+ c->app = app;
+ c->dpy = dpy;
+ c->window = w;
+ XtAppAddTimeOut (app, 5 * 1000, defer_destroy_handler, (XtPointer) c);
+}
+
+
/* Returns true if canceled by user activity. */
Bool
fade_screens (XtAppContext app, Display *dpy,
@@ -304,8 +356,8 @@ fade_screens (XtAppContext app, Display *dpy,
int status = False;
fade_state *state = 0;
- if (nwindows <= 0) abort();
- if (!saver_windows) abort();
+ if (nwindows <= 0) return False;
+ if (!saver_windows) return False;
if (!closureP) abort();
state = (fade_state *) *closureP;
@@ -398,14 +450,14 @@ colormap_fade (XtAppContext app, Display *dpy,
int status = -1;
Colormap *window_cmaps = 0;
int i, j, k;
- int cmaps_per_screen = 5;
- int nscreens = ScreenCount(dpy);
- int ncmaps = nscreens * cmaps_per_screen;
+ unsigned int cmaps_per_screen = 5;
+ unsigned int nscreens = ScreenCount(dpy);
+ unsigned int ncmaps = nscreens * cmaps_per_screen;
Colormap *fade_cmaps = 0;
Bool installed = False;
- int total_ncolors;
+ unsigned int total_ncolors;
XColor *orig_colors, *current_colors, *screen_colors, *orig_screen_colors;
- int screen;
+ unsigned int screen;
window_cmaps = (Colormap *) calloc(sizeof(Colormap), nwindows);
if (!window_cmaps) abort();
@@ -1659,8 +1711,10 @@ xshm_fade (XtAppContext app, Display *dpy,
{
XClearWindow (dpy, saver_windows[screen]);
XMapRaised (dpy, saver_windows[screen]);
- if (info[screen].window)
- XUnmapWindow (dpy, info[screen].window);
+ /* Doing this here triggers the same KDE 5 compositor bug that
+ defer_XDestroyWindow is to work around. */
+ /* if (info[screen].window)
+ XUnmapWindow (dpy, info[screen].window); */
}
}
@@ -1688,7 +1742,7 @@ xshm_fade (XtAppContext app, Display *dpy,
if (info[screen].intermediate)
destroy_xshm_image (dpy, info[screen].intermediate, &shm_info);
if (info[screen].window)
- XDestroyWindow (dpy, info[screen].window);
+ defer_XDestroyWindow (app, dpy, info[screen].window);
if (info[screen].gc)
XFreeGC (dpy, info[screen].gc);
}
diff --git a/driver/fade.h b/driver/fade.h
index 56725b5..6c62d33 100644
--- a/driver/fade.h
+++ b/driver/fade.h
@@ -17,4 +17,12 @@ extern Bool fade_screens (XtAppContext app, Display *dpy,
Window *black_windows, int nwindows,
double seconds, Bool out_p, Bool from_desktop_p,
void **closureP);
+
+/* Like XDestroyWindow, but destroys the window later, on a timer. This is
+ necessary to work around a KDE 5 compositor bug. Without this, destroying
+ an old window causes the desktop to briefly become visible, even though a
+ new window has already been mapped that is obscuring both of them!
+ */
+extern void defer_XDestroyWindow (XtAppContext, Display *, Window);
+
#endif /* __FADE_H__ */
diff --git a/driver/gresource.xml b/driver/gresource.xml
new file mode 100644
index 0000000..345fadd
--- /dev/null
+++ b/driver/gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/jwz/xscreensaver">
+ <file preprocess="xml-stripblanks">demo.ui</file>
+ <file preprocess="xml-stripblanks">prefs.ui</file>
+ </gresource>
+</gresources>
diff --git a/driver/link_axp.com b/driver/link_axp.com
deleted file mode 100644
index a141892..0000000
--- a/driver/link_axp.com
+++ /dev/null
@@ -1,15 +0,0 @@
-$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
-$! X11R5 libraries
-$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
-$ if f$extract(4,3,decw$version).eqs."1.2"
-$ then
-$! DECW/Motif 1.2 : link with X11R5 libraries
-$ link xscreensaver-command,vms_axp_12.opt/opt
-$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
- windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp_12.opt/opt
-$ else
-$! Else, link with X11R4 libraries
-$ link xscreensaver-command,vms_axp.opt/opt
-$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
- windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp.opt/opt
-$ endif
diff --git a/driver/link_decc.com b/driver/link_decc.com
deleted file mode 100644
index d1de0d0..0000000
--- a/driver/link_decc.com
+++ /dev/null
@@ -1,15 +0,0 @@
-$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
-$! X11R5 libraries
-$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
-$ if f$extract(4,3,decw$version).eqs."1.2"
-$ then
-$! DECW/Motif 1.2 : link with X11R5 libraries
-$ link xscreensaver-command,vms_decc_12.opt/opt
-$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
- windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc_12.opt/opt
-$ else
-$! Else, link with X11R4 libraries
-$ link xscreensaver-command,vms_decc.opt/opt
-$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
- windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc.opt/opt
-$ endif
diff --git a/driver/lock.c b/driver/lock.c
deleted file mode 100644
index d36481e..0000000
--- a/driver/lock.c
+++ /dev/null
@@ -1,2276 +0,0 @@
-/* lock.c --- handling the password dialog for locking-mode.
- * xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* Athena locking code contributed by Jon A. Christopher <jac8782@tamu.edu> */
-/* Copyright 1997, with the same permissions as above. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <ctype.h>
-#include <X11/Intrinsic.h>
-#include <X11/cursorfont.h>
-#include <X11/Xos.h> /* for time() */
-#include <time.h>
-#include <sys/time.h>
-#include "xscreensaver.h"
-#include "resources.h"
-#include "mlstring.h"
-#include "auth.h"
-
-#ifndef NO_LOCKING /* (mostly) whole file */
-
-#ifdef HAVE_XHPDISABLERESET
-# include <X11/XHPlib.h>
- static void hp_lock_reset (saver_info *si, Bool lock_p);
-#endif /* HAVE_XHPDISABLERESET */
-
-#ifdef HAVE_XF86VMODE
-# include <X11/extensions/xf86vmode.h>
- static void xfree_lock_mode_switch (saver_info *si, Bool lock_p);
-#endif /* HAVE_XF86VMODE */
-
-#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
-# include <X11/extensions/xf86misc.h>
- static void xfree_lock_grab_smasher (saver_info *si, Bool lock_p);
-#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
-
-#ifdef HAVE_RANDR
-# include <X11/extensions/Xrandr.h>
-#endif /* HAVE_RANDR */
-
-#ifdef _VROOT_H_
-ERROR! You must not include vroot.h in this file.
-#endif
-
-#ifdef HAVE_UNAME
-# include <sys/utsname.h> /* for hostname info */
-#endif /* HAVE_UNAME */
-#include <ctype.h>
-
-#ifndef VMS
-# include <pwd.h>
-#else /* VMS */
-
-extern char *getenv(const char *name);
-extern int validate_user(char *name, char *password);
-
-static Bool
-vms_passwd_valid_p(char *pw, Bool verbose_p)
-{
- return (validate_user (getenv("USER"), typed_passwd) == 1);
-}
-# undef passwd_valid_p
-# define passwd_valid_p vms_passwd_valid_p
-
-#endif /* VMS */
-
-#define SAMPLE_INPUT "MMMMMMMMMMMM"
-
-
-#undef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
-
-typedef struct info_dialog_data info_dialog_data;
-
-
-#define MAX_BYTES_PER_CHAR 8 /* UTF-8 uses no more than 3, I think */
-#define MAX_PASSWD_CHARS 128 /* Longest possible passphrase */
-
-struct passwd_dialog_data {
-
- saver_screen_info *prompt_screen;
- int previous_mouse_x, previous_mouse_y;
-
- /* "Characters" in the password may be a variable number of bytes long.
- typed_passwd contains the raw bytes.
- typed_passwd_char_size indicates the size in bytes of each character,
- so that we can make backspace work.
- */
- char typed_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR];
- char typed_passwd_char_size [MAX_PASSWD_CHARS];
-
- XtIntervalId timer;
- int i_beam;
-
- float ratio;
- Position x, y;
- Dimension width;
- Dimension height;
- Dimension border_width;
-
- Bool echo_input;
- Bool show_stars_p; /* "I regret that I have but one asterisk for my country."
- -- Nathan Hale, 1776. */
-
- char *heading_label;
- char *body_label;
- char *user_label;
- mlstring *info_label;
- /* The entry field shall only be displayed if prompt_label is not NULL */
- mlstring *prompt_label;
- char *date_label;
- char *passwd_string;
- Bool passwd_changed_p; /* Whether the user entry field needs redrawing */
- Bool caps_p; /* Whether we saw a keypress with caps-lock on */
- char *unlock_label;
- char *login_label;
- char *uname_label;
-
- Bool show_uname_p;
-
- XFontStruct *heading_font;
- XFontStruct *body_font;
- XFontStruct *label_font;
- XFontStruct *passwd_font;
- XFontStruct *date_font;
- XFontStruct *button_font;
- XFontStruct *uname_font;
-
- Pixel foreground;
- Pixel background;
- Pixel border;
- Pixel passwd_foreground;
- Pixel passwd_background;
- Pixel thermo_foreground;
- Pixel thermo_background;
- Pixel shadow_top;
- Pixel shadow_bottom;
- Pixel button_foreground;
- Pixel button_background;
-
- Dimension preferred_logo_width, logo_width;
- Dimension preferred_logo_height, logo_height;
- Dimension thermo_width;
- Dimension internal_border;
- Dimension shadow_width;
-
- Dimension passwd_field_x, passwd_field_y;
- Dimension passwd_field_width, passwd_field_height;
-
- Dimension unlock_button_x, unlock_button_y;
- Dimension unlock_button_width, unlock_button_height;
-
- Dimension login_button_x, login_button_y;
- Dimension login_button_width, login_button_height;
-
- Dimension thermo_field_x, thermo_field_y;
- Dimension thermo_field_height;
-
- Pixmap logo_pixmap;
- Pixmap logo_clipmask;
- int logo_npixels;
- unsigned long *logo_pixels;
-
- Cursor passwd_cursor;
- Bool unlock_button_down_p;
- Bool login_button_down_p;
- Bool login_button_p;
- Bool login_button_enabled_p;
- Bool button_state_changed_p; /* Refers to both buttons */
-
- Pixmap save_under;
- Pixmap user_entry_pixmap;
-};
-
-static void draw_passwd_window (saver_info *si);
-static void update_passwd_window (saver_info *si, const char *printed_passwd,
- float ratio);
-static void destroy_passwd_window (saver_info *si);
-static void undo_vp_motion (saver_info *si);
-static void finished_typing_passwd (saver_info *si, passwd_dialog_data *pw);
-static void cleanup_passwd_window (saver_info *si);
-static void restore_background (saver_info *si);
-
-extern void xss_authenticate(saver_info *si, Bool verbose_p);
-
-static int
-new_passwd_window (saver_info *si)
-{
- passwd_dialog_data *pw;
- Screen *screen;
- Colormap cmap;
- saver_screen_info *ssi = &si->screens [mouse_screen (si)];
-
- pw = (passwd_dialog_data *) calloc (1, sizeof(*pw));
- if (!pw)
- return -1;
-
- /* Display the button only if the "newLoginCommand" pref is non-null.
- */
- pw->login_button_p = (si->prefs.new_login_command &&
- *si->prefs.new_login_command);
-
- pw->passwd_cursor = XCreateFontCursor (si->dpy, XC_top_left_arrow);
-
- pw->prompt_screen = ssi;
-
- screen = pw->prompt_screen->screen;
- cmap = DefaultColormapOfScreen (screen);
-
- pw->show_stars_p = get_boolean_resource(si->dpy, "passwd.asterisks",
- "Boolean");
-
- pw->heading_label = get_string_resource (si->dpy, "passwd.heading.label",
- "Dialog.Label.Label");
- pw->body_label = get_string_resource (si->dpy, "passwd.body.label",
- "Dialog.Label.Label");
- pw->user_label = get_string_resource (si->dpy, "passwd.user.label",
- "Dialog.Label.Label");
- pw->unlock_label = get_string_resource (si->dpy, "passwd.unlock.label",
- "Dialog.Button.Label");
- pw->login_label = get_string_resource (si->dpy, "passwd.login.label",
- "Dialog.Button.Label");
-
- pw->date_label = get_string_resource (si->dpy, "dateFormat", "DateFormat");
-
- if (!pw->heading_label)
- pw->heading_label = strdup("ERROR: RESOURCES NOT INSTALLED CORRECTLY");
- if (!pw->body_label)
- pw->body_label = strdup("ERROR: RESOURCES NOT INSTALLED CORRECTLY");
- if (!pw->user_label) pw->user_label = strdup("ERROR");
- if (!pw->date_label) pw->date_label = strdup("ERROR");
- if (!pw->unlock_label) pw->unlock_label = strdup("ERROR (UNLOCK)");
- if (!pw->login_label) pw->login_label = strdup ("ERROR (LOGIN)") ;
-
- /* Put the version number in the label. */
- {
- char *s = (char *) malloc (strlen(pw->heading_label) + 20);
- sprintf(s, pw->heading_label, si->version);
- free (pw->heading_label);
- pw->heading_label = s;
- }
-
- /* Get hostname info */
- pw->uname_label = strdup(""); /* Initialy, write nothing */
-
-# ifdef HAVE_UNAME
- {
- struct utsname uts;
-
- if (uname (&uts) == 0)
- {
-#if 0 /* Get the full hostname */
- {
- char *s;
- if ((s = strchr(uts.nodename, '.')))
- *s = 0;
- }
-#endif
- char *s = strdup (uts.nodename);
- free (pw->uname_label);
- pw->uname_label = s;
- }
- }
-# endif
-
- pw->passwd_string = strdup("");
-
- pw->heading_font =
- splash_load_font (si->dpy, "passwd.headingFont", "Dialog.Font");
- pw->button_font =
- splash_load_font (si->dpy, "passwd.buttonFont", "Dialog.Font");
- pw->body_font =
- splash_load_font (si->dpy, "passwd.bodyFont", "Dialog.Font");
- pw->label_font =
- splash_load_font (si->dpy, "passwd.labelFont", "Dialog.Font");
- pw->passwd_font =
- splash_load_font (si->dpy, "passwd.passwdFont", "Dialog.Font");
- pw->date_font =
- splash_load_font (si->dpy, "passwd.dateFont", "Dialog.Font");
- pw->uname_font =
- splash_load_font (si->dpy, "passwd.unameFont", "Dialog.Font");
-
- pw->show_uname_p = get_boolean_resource(si->dpy, "passwd.uname", "Boolean");
-
- pw->foreground = get_pixel_resource (si->dpy, cmap,
- "passwd.foreground",
- "Dialog.Foreground" );
- pw->background = get_pixel_resource (si->dpy, cmap,
- "passwd.background",
- "Dialog.Background" );
- pw->border = get_pixel_resource (si->dpy, cmap,
- "passwd.borderColor",
- "Dialog.borderColor");
-
- if (pw->foreground == pw->background)
- {
- /* Make sure the error messages show up. */
- pw->foreground = BlackPixelOfScreen (screen);
- pw->background = WhitePixelOfScreen (screen);
- }
-
- pw->passwd_foreground = get_pixel_resource (si->dpy, cmap,
- "passwd.text.foreground",
- "Dialog.Text.Foreground" );
- pw->passwd_background = get_pixel_resource (si->dpy, cmap,
- "passwd.text.background",
- "Dialog.Text.Background" );
- pw->button_foreground = get_pixel_resource (si->dpy, cmap,
- "splash.Button.foreground",
- "Dialog.Button.Foreground" );
- pw->button_background = get_pixel_resource (si->dpy, cmap,
- "splash.Button.background",
- "Dialog.Button.Background" );
- pw->thermo_foreground = get_pixel_resource (si->dpy, cmap,
- "passwd.thermometer.foreground",
- "Dialog.Thermometer.Foreground");
- pw->thermo_background = get_pixel_resource ( si->dpy, cmap,
- "passwd.thermometer.background",
- "Dialog.Thermometer.Background");
- pw->shadow_top = get_pixel_resource ( si->dpy, cmap,
- "passwd.topShadowColor",
- "Dialog.Foreground" );
- pw->shadow_bottom = get_pixel_resource (si->dpy, cmap,
- "passwd.bottomShadowColor",
- "Dialog.Background" );
-
- pw->preferred_logo_width = get_integer_resource (si->dpy,
- "passwd.logo.width",
- "Dialog.Logo.Width");
- pw->preferred_logo_height = get_integer_resource (si->dpy,
- "passwd.logo.height",
- "Dialog.Logo.Height");
- pw->thermo_width = get_integer_resource (si->dpy, "passwd.thermometer.width",
- "Dialog.Thermometer.Width");
- pw->internal_border = get_integer_resource (si->dpy,
- "passwd.internalBorderWidth",
- "Dialog.InternalBorderWidth");
- pw->shadow_width = get_integer_resource (si->dpy, "passwd.shadowThickness",
- "Dialog.ShadowThickness");
-
- if (pw->preferred_logo_width == 0) pw->preferred_logo_width = 150;
- if (pw->preferred_logo_height == 0) pw->preferred_logo_height = 150;
- if (pw->internal_border == 0) pw->internal_border = 15;
- if (pw->shadow_width == 0) pw->shadow_width = 4;
- if (pw->thermo_width == 0) pw->thermo_width = pw->shadow_width;
-
-
- /* We need to remember the mouse position and restore it afterward, or
- sometimes (perhaps only with Xinerama?) the mouse gets warped to
- inside the bounds of the lock dialog window.
- */
- {
- Window pointer_root, pointer_child;
- int root_x, root_y, win_x, win_y;
- unsigned int mask;
- pw->previous_mouse_x = 0;
- pw->previous_mouse_y = 0;
- if (XQueryPointer (si->dpy, RootWindowOfScreen (pw->prompt_screen->screen),
- &pointer_root, &pointer_child,
- &root_x, &root_y, &win_x, &win_y, &mask))
- {
- pw->previous_mouse_x = root_x;
- pw->previous_mouse_y = root_y;
- if (si->prefs.verbose_p)
- fprintf (stderr, "%s: %d: mouse is at %d,%d.\n",
- blurb(), pw->prompt_screen->number,
- pw->previous_mouse_x, pw->previous_mouse_y);
- }
- else if (si->prefs.verbose_p)
- fprintf (stderr, "%s: %d: unable to determine mouse position?\n",
- blurb(), pw->prompt_screen->number);
- }
-
- /* Before mapping the window, save a pixmap of the current screen.
- When we lower the window, we restore these bits. This works,
- because the running screenhack has already been sent SIGSTOP, so
- we know nothing else is drawing right now! */
- {
- XGCValues gcv;
- GC gc;
- pw->save_under = XCreatePixmap (si->dpy,
- pw->prompt_screen->screensaver_window,
- pw->prompt_screen->width,
- pw->prompt_screen->height,
- pw->prompt_screen->current_depth);
- gcv.function = GXcopy;
- gc = XCreateGC (si->dpy, pw->save_under, GCFunction, &gcv);
- XCopyArea (si->dpy, pw->prompt_screen->screensaver_window,
- pw->save_under, gc,
- 0, 0,
- pw->prompt_screen->width, pw->prompt_screen->height,
- 0, 0);
- XFreeGC (si->dpy, gc);
- }
-
- si->pw_data = pw;
- return 0;
-}
-
-
-Bool debug_passwd_window_p = False; /* used only by test-passwd.c */
-
-
-/**
- * info_msg and prompt may be NULL.
- */
-static int
-make_passwd_window (saver_info *si,
- const char *info_msg,
- const char *prompt,
- Bool echo)
-{
- XSetWindowAttributes attrs;
- unsigned long attrmask = 0;
- passwd_dialog_data *pw;
- Screen *screen;
- Colormap cmap;
- Dimension max_string_width_px;
- saver_screen_info *ssi = &si->screens [mouse_screen (si)];
-
- cleanup_passwd_window (si);
-
- if (! ssi) /* WTF? Trying to prompt while no screens connected? */
- return -1;
-
- if (!si->pw_data)
- if (new_passwd_window (si) < 0)
- return -1;
-
- if (!(pw = si->pw_data))
- return -1;
-
- pw->ratio = 1.0;
-
- pw->prompt_screen = ssi;
- if (si->prefs.verbose_p)
- fprintf (stderr, "%s: %d: creating password dialog (\"%s\")\n",
- blurb(), pw->prompt_screen->number,
- info_msg ? info_msg : "");
-
- screen = pw->prompt_screen->screen;
- cmap = DefaultColormapOfScreen (screen);
-
- pw->echo_input = echo;
-
- max_string_width_px = ssi->width
- - pw->shadow_width * 4
- - pw->border_width * 2
- - pw->thermo_width
- - pw->preferred_logo_width
- - pw->internal_border * 2;
- /* As the string wraps it makes the window taller which makes the logo wider
- * which leaves less room for the text which makes the string wrap. Uh-oh, a
- * loop. By wrapping at a bit less than the available width, there's some
- * room for the dialog to grow without going off the edge of the screen. */
- max_string_width_px *= 0.75;
-
- if (!info_msg && senesculent_p())
- info_msg = ("\n"
- "This version of XScreenSaver\n"
- "is very old! Please upgrade!\n");
-
- pw->info_label = mlstring_new(info_msg ? info_msg : pw->body_label,
- pw->label_font, max_string_width_px);
-
- {
- int direction, ascent, descent;
- XCharStruct overall;
-
- pw->width = 0;
- pw->height = 0;
-
- /* Measure the heading_label. */
- XTextExtents (pw->heading_font,
- pw->heading_label, strlen(pw->heading_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > pw->width) pw->width = overall.width;
- pw->height += ascent + descent;
-
- /* Measure the uname_label. */
- if ((strlen(pw->uname_label)) && pw->show_uname_p)
- {
- XTextExtents (pw->uname_font,
- pw->uname_label, strlen(pw->uname_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > pw->width) pw->width = overall.width;
- pw->height += ascent + descent;
- }
-
- {
- Dimension w2 = 0, w3 = 0, button_w = 0;
- Dimension h2 = 0, h3 = 0, button_h = 0;
- const char *passwd_string = SAMPLE_INPUT;
-
- /* Measure the user_label. */
- XTextExtents (pw->label_font,
- pw->user_label, strlen(pw->user_label),
- &direction, &ascent, &descent, &overall);
- if (overall.width > w2) w2 = overall.width;
- h2 += ascent + descent;
-
- /* Measure the info_label. */
- if (pw->info_label->overall_width > pw->width)
- pw->width = pw->info_label->overall_width;
- h2 += pw->info_label->overall_height;
-
- /* Measure the user string. */
- XTextExtents (pw->passwd_font,
- si->user, strlen(si->user),
- &direction, &ascent, &descent, &overall);
- overall.width += (pw->shadow_width * 4);
- ascent += (pw->shadow_width * 4);
- if (overall.width > w3) w3 = overall.width;
- h3 += ascent + descent;
-
- /* Measure the (dummy) passwd_string. */
- if (prompt)
- {
- XTextExtents (pw->passwd_font,
- passwd_string, strlen(passwd_string),
- &direction, &ascent, &descent, &overall);
- overall.width += (pw->shadow_width * 4);
- ascent += (pw->shadow_width * 4);
- if (overall.width > w3) w3 = overall.width;
- h3 += ascent + descent;
-
- /* Measure the prompt_label. */
- max_string_width_px -= w3;
- pw->prompt_label = mlstring_new (prompt, pw->label_font,
- max_string_width_px);
-
- if (pw->prompt_label->overall_width > w2)
- w2 = pw->prompt_label->overall_width;
-
- h2 += pw->prompt_label->overall_height;
-
- w2 = w2 + w3 + (pw->shadow_width * 2);
- h2 = MAX (h2, h3);
- }
-
- /* The "Unlock" button. */
- XTextExtents (pw->label_font,
- pw->unlock_label, strlen(pw->unlock_label),
- &direction, &ascent, &descent, &overall);
- button_w = overall.width;
- button_h = ascent + descent;
-
- /* Add some horizontal padding inside the button. */
- button_w += ascent;
-
- button_w += ((ascent + descent) / 2) + (pw->shadow_width * 2);
- button_h += ((ascent + descent) / 2) + (pw->shadow_width * 2);
-
- pw->unlock_button_width = button_w;
- pw->unlock_button_height = button_h;
-
- w2 = MAX (w2, button_w);
- h2 += button_h * 1.5;
-
- /* The "New Login" button */
- pw->login_button_width = 0;
- pw->login_button_height = 0;
-
- if (pw->login_button_p)
- {
- pw->login_button_enabled_p = True;
-
- /* Measure the "New Login" button */
- XTextExtents (pw->button_font, pw->login_label,
- strlen (pw->login_label),
- &direction, &ascent, &descent, &overall);
- button_w = overall.width;
- button_h = ascent + descent;
-
- /* Add some horizontal padding inside the buttons. */
- button_w += ascent;
-
- button_w += ((ascent + descent) / 2) + (pw->shadow_width * 2);
- button_h += ((ascent + descent) / 2) + (pw->shadow_width * 2);
-
- pw->login_button_width = button_w;
- pw->login_button_height = button_h;
-
- if (button_h > pw->unlock_button_height)
- h2 += (button_h * 1.5 - pw->unlock_button_height * 1.5);
-
- /* Use (2 * shadow_width) spacing between the buttons. Another
- (2 * shadow_width) is required to account for button shadows. */
- w2 = MAX (w2,
- button_w + pw->unlock_button_width +
- (pw->shadow_width * 4));
- }
-
- if (w2 > pw->width) pw->width = w2;
- pw->height += h2;
- }
-
- pw->width += (pw->internal_border * 2);
- pw->height += (pw->internal_border * 4);
-
- pw->width += pw->thermo_width + (pw->shadow_width * 3);
-
- if (pw->preferred_logo_height > pw->height)
- pw->height = pw->logo_height = pw->preferred_logo_height;
- else if (pw->height > pw->preferred_logo_height)
- pw->logo_height = pw->height;
-
- pw->logo_width = pw->logo_height;
-
- pw->width += pw->logo_width;
- }
-
- attrmask |= CWOverrideRedirect; attrs.override_redirect = True;
-
- if (debug_passwd_window_p)
- attrs.override_redirect = False; /* kludge for test-passwd.c */
-
- attrmask |= CWEventMask;
- attrs.event_mask = (ExposureMask | KeyPressMask |
- ButtonPressMask | ButtonReleaseMask);
-
- /* Figure out where on the desktop to place the window so that it will
- actually be visible; this takes into account virtual viewports as
- well as Xinerama. */
- {
- saver_screen_info *ssi = &si->screens [mouse_screen (si)];
- int x = ssi->x;
- int y = ssi->y;
- int w = ssi->width;
- int h = ssi->height;
- if (si->prefs.debug_p) w /= 2;
- pw->x = x + ((w + pw->width) / 2) - pw->width;
- pw->y = y + ((h + pw->height) / 2) - pw->height;
- if (pw->x < x) pw->x = x;
- if (pw->y < y) pw->y = y;
- }
-
- pw->border_width = get_integer_resource (si->dpy, "passwd.borderWidth",
- "Dialog.BorderWidth");
-
- /* Only create the window the first time around */
- if (!si->passwd_dialog)
- {
- si->passwd_dialog =
- XCreateWindow (si->dpy,
- RootWindowOfScreen(screen),
- pw->x, pw->y, pw->width, pw->height, pw->border_width,
- DefaultDepthOfScreen (screen), InputOutput,
- DefaultVisualOfScreen(screen),
- attrmask, &attrs);
- XSetWindowBackground (si->dpy, si->passwd_dialog, pw->background);
- XSetWindowBorder (si->dpy, si->passwd_dialog, pw->border);
-
- /* We use the default visual, not ssi->visual, so that the logo pixmap's
- visual matches that of the si->passwd_dialog window. */
- pw->logo_pixmap = xscreensaver_logo (ssi->screen,
- /* ssi->current_visual, */
- DefaultVisualOfScreen(screen),
- si->passwd_dialog, cmap,
- pw->background,
- &pw->logo_pixels, &pw->logo_npixels,
- &pw->logo_clipmask, True);
- }
- else /* On successive prompts, just resize the window */
- {
- XWindowChanges wc;
- unsigned int mask = CWX | CWY | CWWidth | CWHeight;
-
- wc.x = pw->x;
- wc.y = pw->y;
- wc.width = pw->width;
- wc.height = pw->height;
-
- XConfigureWindow (si->dpy, si->passwd_dialog, mask, &wc);
- }
-
- restore_background(si);
-
- XMapRaised (si->dpy, si->passwd_dialog);
- XSync (si->dpy, False);
-
- move_mouse_grab (si, si->passwd_dialog,
- pw->passwd_cursor,
- pw->prompt_screen->number);
- undo_vp_motion (si);
-
- si->pw_data = pw;
-
- if (cmap)
- XInstallColormap (si->dpy, cmap);
- draw_passwd_window (si);
-
- return 0;
-}
-
-
-static void
-draw_passwd_window (saver_info *si)
-{
- passwd_dialog_data *pw = si->pw_data;
- XGCValues gcv;
- GC gc1, gc2;
- int spacing, height;
- int x1, x2, x3, y1, y2;
- int sw;
- int tb_height;
-
- /* Force redraw */
- pw->passwd_changed_p = True;
- pw->button_state_changed_p = True;
-
- /* This height is the height of all the elements, not to be confused with
- * the overall window height which is pw->height. It is used to compute
- * the amount of spacing (padding) between elements. */
- height = (pw->heading_font->ascent + pw->heading_font->descent +
- pw->info_label->overall_height +
- MAX (((pw->label_font->ascent + pw->label_font->descent) +
- (pw->prompt_label ? pw->prompt_label->overall_height : 0)),
- ((pw->passwd_font->ascent + pw->passwd_font->descent) +
- (pw->shadow_width * 2)) * (pw->prompt_label ? 2 : 1)) +
- pw->date_font->ascent + pw->date_font->descent);
-
- if ((strlen(pw->uname_label)) && pw->show_uname_p)
- height += (pw->uname_font->ascent + pw->uname_font->descent);
-
- height += ((pw->button_font->ascent + pw->button_font->descent) * 2 +
- 2 * pw->shadow_width);
-
- spacing = ((pw->height - 2 * pw->shadow_width
- - pw->internal_border - height)
- / 10);
-
- if (spacing < 0) spacing = 0;
-
- gcv.foreground = pw->foreground;
- gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
- gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
- x1 = pw->logo_width + pw->thermo_width + (pw->shadow_width * 3);
- x3 = pw->width - (pw->shadow_width * 2);
- y1 = (pw->shadow_width * 2) + spacing + spacing;
-
- /* top heading
- */
- XSetFont (si->dpy, gc1, pw->heading_font->fid);
- sw = string_width (pw->heading_font, pw->heading_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- y1 += spacing + pw->heading_font->ascent + pw->heading_font->descent;
- XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
- pw->heading_label, strlen(pw->heading_label));
-
- /* uname below top heading
- */
- if ((strlen(pw->uname_label)) && pw->show_uname_p)
- {
- XSetFont (si->dpy, gc1, pw->uname_font->fid);
- y1 += spacing + pw->uname_font->ascent + pw->uname_font->descent;
- sw = string_width (pw->uname_font, pw->uname_label);
- x2 = (x1 + ((x3 - x1 - sw) / 2));
- XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
- pw->uname_label, strlen(pw->uname_label));
- }
-
- /* the info_label (below uname)
- */
- x2 = (x1 + ((x3 - x1 - pw->info_label->overall_width) / 2));
- y1 += spacing + pw->info_label->font_height / 2;
- mlstring_draw(si->dpy, si->passwd_dialog, gc1, pw->info_label,
- x2, y1);
- y1 += pw->info_label->overall_height;
-
-
- tb_height = (pw->passwd_font->ascent + pw->passwd_font->descent +
- (pw->shadow_width * 4));
-
- /* the "User:" prompt
- */
- y2 = y1;
- XSetForeground (si->dpy, gc1, pw->foreground);
- XSetFont (si->dpy, gc1, pw->label_font->fid);
- y1 += (spacing + tb_height + pw->shadow_width);
- x2 = (x1 + pw->internal_border +
- MAX(string_width (pw->label_font, pw->user_label),
- pw->prompt_label ? pw->prompt_label->overall_width : 0));
- XDrawString (si->dpy, si->passwd_dialog, gc1,
- x2 - string_width (pw->label_font, pw->user_label),
- y1 - pw->passwd_font->descent,
- pw->user_label, strlen(pw->user_label));
-
- /* the prompt_label prompt
- */
- if (pw->prompt_label)
- {
- y1 += tb_height - pw->label_font->ascent + pw->shadow_width;
- mlstring_draw(si->dpy, si->passwd_dialog, gc1, pw->prompt_label,
- x2 - pw->prompt_label->overall_width, y1);
- }
-
- /* the "user name" text field
- */
- y1 = y2;
- XSetForeground (si->dpy, gc1, pw->passwd_foreground);
- XSetForeground (si->dpy, gc2, pw->passwd_background);
- XSetFont (si->dpy, gc1, pw->passwd_font->fid);
- y1 += (spacing + tb_height);
- x2 += (pw->shadow_width * 4);
-
- pw->passwd_field_width = x3 - x2 - pw->internal_border;
- pw->passwd_field_height = (pw->passwd_font->ascent +
- pw->passwd_font->descent +
- pw->shadow_width);
-
- XFillRectangle (si->dpy, si->passwd_dialog, gc2,
- x2 - pw->shadow_width,
- y1 - (pw->passwd_font->ascent + pw->passwd_font->descent),
- pw->passwd_field_width, pw->passwd_field_height);
- XDrawString (si->dpy, si->passwd_dialog, gc1,
- x2,
- y1 - pw->passwd_font->descent,
- si->user, strlen(si->user));
-
- /* the password/prompt text field
- */
- if (pw->prompt_label)
- {
- y1 += (spacing + pw->prompt_label->overall_height + pw->shadow_width*2);
-
- pw->passwd_field_x = x2 - pw->shadow_width;
- pw->passwd_field_y = y1 - (pw->passwd_font->ascent +
- pw->passwd_font->descent);
- }
-
- /* The shadow around the text fields
- */
- y1 = y2;
- y1 += (spacing + (pw->shadow_width * 3));
- x1 = x2 - (pw->shadow_width * 2);
- x2 = pw->passwd_field_width + (pw->shadow_width * 2);
- y2 = pw->passwd_field_height + (pw->shadow_width * 2);
-
- draw_shaded_rectangle (si->dpy, si->passwd_dialog,
- x1, y1, x2, y2,
- pw->shadow_width,
- pw->shadow_bottom, pw->shadow_top);
-
- if (pw->prompt_label)
- {
- y1 += (spacing + pw->prompt_label->overall_height + pw->shadow_width*2);
- draw_shaded_rectangle (si->dpy, si->passwd_dialog,
- x1, y1, x2, y2,
- pw->shadow_width,
- pw->shadow_bottom, pw->shadow_top);
- }
-
-
- /* The date, below the text fields
- */
- {
- char buf[100];
- time_t now = time ((time_t *) 0);
- struct tm *tm = localtime (&now);
- memset (buf, 0, sizeof(buf));
- strftime (buf, sizeof(buf)-1, pw->date_label, tm);
-
- XSetForeground (si->dpy, gc1, pw->foreground);
- XSetFont (si->dpy, gc1, pw->date_font->fid);
- y1 += pw->shadow_width;
- y1 += (spacing + tb_height);
- y1 += spacing/2;
- sw = string_width (pw->date_font, buf);
- x2 = x1 + x2 - sw;
- XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1, buf, strlen(buf));
- }
-
- /* Set up the GCs for the "New Login" and "Unlock" buttons.
- */
- XSetForeground(si->dpy, gc1, pw->button_foreground);
- XSetForeground(si->dpy, gc2, pw->button_background);
- XSetFont(si->dpy, gc1, pw->button_font->fid);
-
- /* The "Unlock" button */
- x2 = pw->width - pw->internal_border - (pw->shadow_width * 2);
-
- /* right aligned button */
- x1 = x2 - pw->unlock_button_width;
-
- /* Add half the difference between y1 and the internal edge.
- * It actually looks better if the internal border is ignored. */
- y1 += ((pw->height - MAX (pw->unlock_button_height, pw->login_button_height)
- - spacing - y1)
- / 2);
-
- pw->unlock_button_x = x1;
- pw->unlock_button_y = y1;
-
- /* The "New Login" button
- */
- if (pw->login_button_p)
- {
- /* Using the same GC as for the Unlock button */
-
- sw = string_width (pw->button_font, pw->login_label);
-
- /* left aligned button */
- x1 = (pw->logo_width + pw->thermo_width + (pw->shadow_width * 3) +
- pw->internal_border);
-
- pw->login_button_x = x1;
- pw->login_button_y = y1;
- }
-
- /* The logo
- */
- x1 = pw->shadow_width * 6;
- y1 = pw->shadow_width * 6;
- x2 = pw->logo_width - (pw->shadow_width * 12);
- y2 = pw->logo_height - (pw->shadow_width * 12);
-
- if (pw->logo_pixmap)
- {
- Window root;
- int x, y;
- unsigned int w, h, bw, d;
- XGetGeometry (si->dpy, pw->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d);
- XSetForeground (si->dpy, gc1, pw->foreground);
- XSetBackground (si->dpy, gc1, pw->background);
- XSetClipMask (si->dpy, gc1, pw->logo_clipmask);
- XSetClipOrigin (si->dpy, gc1,
- x1 + ((x2 - (int)w) / 2),
- y1 + ((y2 - (int)h) / 2));
- if (d == 1)
- XCopyPlane (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1,
- 0, 0, w, h,
- x1 + ((x2 - (int)w) / 2),
- y1 + ((y2 - (int)h) / 2),
- 1);
- else
- XCopyArea (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1,
- 0, 0, w, h,
- x1 + ((x2 - (int)w) / 2),
- y1 + ((y2 - (int)h) / 2));
- }
-
- /* The thermometer
- */
- XSetForeground (si->dpy, gc1, pw->thermo_foreground);
- XSetForeground (si->dpy, gc2, pw->thermo_background);
-
- pw->thermo_field_x = pw->logo_width + pw->shadow_width;
- pw->thermo_field_y = pw->shadow_width * 5;
- pw->thermo_field_height = pw->height - (pw->shadow_width * 10);
-
-#if 0
- /* Solid border inside the logo box. */
- XSetForeground (si->dpy, gc1, pw->foreground);
- XDrawRectangle (si->dpy, si->passwd_dialog, gc1, x1, y1, x2-1, y2-1);
-#endif
-
- /* The shadow around the logo
- */
- draw_shaded_rectangle (si->dpy, si->passwd_dialog,
- pw->shadow_width * 4,
- pw->shadow_width * 4,
- pw->logo_width - (pw->shadow_width * 8),
- pw->logo_height - (pw->shadow_width * 8),
- pw->shadow_width,
- pw->shadow_bottom, pw->shadow_top);
-
- /* The shadow around the thermometer
- */
- draw_shaded_rectangle (si->dpy, si->passwd_dialog,
- pw->logo_width,
- pw->shadow_width * 4,
- pw->thermo_width + (pw->shadow_width * 2),
- pw->height - (pw->shadow_width * 8),
- pw->shadow_width,
- pw->shadow_bottom, pw->shadow_top);
-
-#if 1
- /* Solid border inside the thermometer. */
- XSetForeground (si->dpy, gc1, pw->foreground);
- XDrawRectangle (si->dpy, si->passwd_dialog, gc1,
- pw->thermo_field_x, pw->thermo_field_y,
- pw->thermo_width - 1, pw->thermo_field_height - 1);
-#endif
-
- /* The shadow around the whole window
- */
- draw_shaded_rectangle (si->dpy, si->passwd_dialog,
- 0, 0, pw->width, pw->height, pw->shadow_width,
- pw->shadow_top, pw->shadow_bottom);
-
- XFreeGC (si->dpy, gc1);
- XFreeGC (si->dpy, gc2);
-
- update_passwd_window (si, pw->passwd_string, pw->ratio);
-}
-
-static void
-draw_button(Display *dpy,
- Drawable dialog,
- XFontStruct *font,
- unsigned long foreground, unsigned long background,
- char *label,
- int x, int y,
- int width, int height,
- int shadow_width,
- Pixel shadow_light, Pixel shadow_dark,
- Bool button_down)
-{
- XGCValues gcv;
- GC gc1, gc2;
- int sw;
- int label_x, label_y;
-
- gcv.foreground = foreground;
- gcv.font = font->fid;
- gc1 = XCreateGC(dpy, dialog, GCForeground|GCFont, &gcv);
- gcv.foreground = background;
- gc2 = XCreateGC(dpy, dialog, GCForeground, &gcv);
-
- XFillRectangle(dpy, dialog, gc2,
- x, y, width, height);
-
- sw = string_width(font, label);
-
- label_x = x + ((width - sw) / 2);
- label_y = (y + (height - (font->ascent + font->descent)) / 2 + font->ascent);
-
- if (button_down)
- {
- label_x += 2;
- label_y += 2;
- }
-
- XDrawString(dpy, dialog, gc1, label_x, label_y, label, strlen(label));
-
- XFreeGC(dpy, gc1);
- XFreeGC(dpy, gc2);
-
- draw_shaded_rectangle(dpy, dialog, x, y, width, height,
- shadow_width, shadow_light, shadow_dark);
-}
-
-static void
-update_passwd_window (saver_info *si, const char *printed_passwd, float ratio)
-{
- passwd_dialog_data *pw = si->pw_data;
- XGCValues gcv;
- GC gc1, gc2;
- int x, y;
- XRectangle rects[1];
-
- pw->ratio = ratio;
- gcv.foreground = pw->passwd_foreground;
- gcv.font = pw->passwd_font->fid;
- gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground|GCFont, &gcv);
- gcv.foreground = pw->passwd_background;
- gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
-
- if (printed_passwd)
- {
- char *s = strdup (printed_passwd);
- if (pw->passwd_string) free (pw->passwd_string);
- pw->passwd_string = s;
- }
-
- if (pw->prompt_label)
- {
-
- /* the "password" text field
- */
- rects[0].x = pw->passwd_field_x;
- rects[0].y = pw->passwd_field_y;
- rects[0].width = pw->passwd_field_width;
- rects[0].height = pw->passwd_field_height;
-
- /* The user entry (password) field is double buffered.
- * This avoids flickering, particularly in synchronous mode. */
-
- if (pw->passwd_changed_p)
- {
- pw->passwd_changed_p = False;
-
- if (pw->user_entry_pixmap)
- {
- XFreePixmap(si->dpy, pw->user_entry_pixmap);
- pw->user_entry_pixmap = 0;
- }
-
- pw->user_entry_pixmap =
- XCreatePixmap (si->dpy, si->passwd_dialog,
- rects[0].width, rects[0].height,
- DefaultDepthOfScreen (pw->prompt_screen->screen));
-
- XFillRectangle (si->dpy, pw->user_entry_pixmap, gc2,
- 0, 0, rects[0].width, rects[0].height);
-
- XDrawString (si->dpy, pw->user_entry_pixmap, gc1,
- pw->shadow_width,
- pw->passwd_font->ascent,
- pw->passwd_string, strlen(pw->passwd_string));
-
- /* Ensure the new pixmap gets copied to the window */
- pw->i_beam = 0;
-
- }
-
- /* The I-beam
- */
- if (pw->i_beam == 0)
- {
- /* Make the I-beam disappear */
- XCopyArea(si->dpy, pw->user_entry_pixmap, si->passwd_dialog, gc2,
- 0, 0, rects[0].width, rects[0].height,
- rects[0].x, rects[0].y);
- }
- else if (pw->i_beam == 1)
- {
- /* Make the I-beam appear */
- x = (rects[0].x + pw->shadow_width +
- string_width (pw->passwd_font, pw->passwd_string));
- y = rects[0].y + pw->shadow_width;
-
- if (x > rects[0].x + rects[0].width - 1)
- x = rects[0].x + rects[0].width - 1;
- XDrawLine (si->dpy, si->passwd_dialog, gc1,
- x, y,
- x, y + pw->passwd_font->ascent +
- pw->passwd_font->descent-1);
- }
-
- pw->i_beam = (pw->i_beam + 1) % 4;
-
- }
-
- /* the thermometer
- */
- y = (pw->thermo_field_height - 2) * (1.0 - pw->ratio);
- if (y > 0)
- {
- XSetForeground (si->dpy, gc1, pw->thermo_background);
- XFillRectangle (si->dpy, si->passwd_dialog, gc1,
- pw->thermo_field_x + 1,
- pw->thermo_field_y + 1,
- pw->thermo_width-2,
- y);
- XSetForeground (si->dpy, gc1, pw->thermo_foreground);
- XFillRectangle (si->dpy, si->passwd_dialog, gc1,
- pw->thermo_field_x + 1,
- pw->thermo_field_y + 1 + y,
- pw->thermo_width-2,
- MAX (0, pw->thermo_field_height - y - 2));
- }
-
- if (pw->button_state_changed_p)
- {
- pw->button_state_changed_p = False;
-
- /* The "Unlock" button
- */
- draw_button(si->dpy, si->passwd_dialog, pw->button_font,
- pw->button_foreground, pw->button_background,
- pw->unlock_label,
- pw->unlock_button_x, pw->unlock_button_y,
- pw->unlock_button_width, pw->unlock_button_height,
- pw->shadow_width,
- (pw->unlock_button_down_p ? pw->shadow_bottom :
- pw->shadow_top),
- (pw->unlock_button_down_p ? pw->shadow_top :
- pw->shadow_bottom),
- pw->unlock_button_down_p);
-
- /* The "New Login" button
- */
- if (pw->login_button_p)
- {
- draw_button(si->dpy, si->passwd_dialog, pw->button_font,
- (pw->login_button_enabled_p
- ? pw->passwd_foreground
- : pw->shadow_bottom),
- pw->button_background,
- pw->login_label,
- pw->login_button_x, pw->login_button_y,
- pw->login_button_width, pw->login_button_height,
- pw->shadow_width,
- (pw->login_button_down_p
- ? pw->shadow_bottom
- : pw->shadow_top),
- (pw->login_button_down_p
- ? pw->shadow_top
- : pw->shadow_bottom),
- pw->login_button_down_p);
- }
- }
-
- XFreeGC (si->dpy, gc1);
- XFreeGC (si->dpy, gc2);
- XSync (si->dpy, False);
-}
-
-
-void
-restore_background (saver_info *si)
-{
- passwd_dialog_data *pw = si->pw_data;
- saver_screen_info *ssi = pw->prompt_screen;
- XGCValues gcv;
- GC gc;
-
- gcv.function = GXcopy;
-
- gc = XCreateGC (si->dpy, ssi->screensaver_window, GCFunction, &gcv);
-
- XCopyArea (si->dpy, pw->save_under,
- ssi->screensaver_window, gc,
- 0, 0,
- ssi->width, ssi->height,
- 0, 0);
-
- XFreeGC (si->dpy, gc);
-}
-
-
-/* Frees anything created by make_passwd_window */
-static void
-cleanup_passwd_window (saver_info *si)
-{
- passwd_dialog_data *pw;
-
- if (!(pw = si->pw_data))
- return;
-
- if (pw->info_label)
- {
- mlstring_free(pw->info_label);
- pw->info_label = 0;
- }
-
- if (pw->prompt_label)
- {
- mlstring_free(pw->prompt_label);
- pw->prompt_label = 0;
- }
-
- memset (pw->typed_passwd, 0, sizeof(pw->typed_passwd));
- memset (pw->typed_passwd_char_size, 0, sizeof(pw->typed_passwd_char_size));
- memset (pw->passwd_string, 0, strlen(pw->passwd_string));
-
- if (pw->timer)
- {
- XtRemoveTimeOut (pw->timer);
- pw->timer = 0;
- }
-
- if (pw->user_entry_pixmap)
- {
- XFreePixmap(si->dpy, pw->user_entry_pixmap);
- pw->user_entry_pixmap = 0;
- }
-}
-
-
-static void
-destroy_passwd_window (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- passwd_dialog_data *pw = si->pw_data;
- saver_screen_info *ssi = pw->prompt_screen;
- Colormap cmap = DefaultColormapOfScreen (ssi->screen);
- Pixel black = BlackPixelOfScreen (ssi->screen);
- Pixel white = WhitePixelOfScreen (ssi->screen);
- XEvent event;
-
- cleanup_passwd_window (si);
-
- if (si->cached_passwd)
- {
- char *wipe = si->cached_passwd;
-
- while (*wipe)
- *wipe++ = '\0';
-
- free(si->cached_passwd);
- si->cached_passwd = NULL;
- }
-
- move_mouse_grab (si, RootWindowOfScreen (ssi->screen),
- ssi->cursor, ssi->number);
-
- if (pw->passwd_cursor)
- XFreeCursor (si->dpy, pw->passwd_cursor);
-
- if (p->verbose_p)
- fprintf (stderr, "%s: %d: moving mouse back to %d,%d.\n",
- blurb(), ssi->number,
- pw->previous_mouse_x, pw->previous_mouse_y);
-
- XWarpPointer (si->dpy, None, RootWindowOfScreen (ssi->screen),
- 0, 0, 0, 0,
- pw->previous_mouse_x, pw->previous_mouse_y);
- XSync (si->dpy, False);
-
- while (XCheckMaskEvent (si->dpy, PointerMotionMask, &event))
- if (p->verbose_p)
- fprintf (stderr, "%s: discarding MotionNotify event.\n", blurb());
-
-#ifdef HAVE_XINPUT
- if (si->using_xinput_extension && si->xinput_DeviceMotionNotify)
- while (XCheckTypedEvent (si->dpy, si->xinput_DeviceMotionNotify, &event))
- if (p->verbose_p)
- fprintf (stderr, "%s: discarding DeviceMotionNotify event.\n",
- blurb());
-#endif
-
- if (si->passwd_dialog)
- {
- if (si->prefs.verbose_p)
- fprintf (stderr, "%s: %d: destroying password dialog.\n",
- blurb(), pw->prompt_screen->number);
-
- XDestroyWindow (si->dpy, si->passwd_dialog);
- si->passwd_dialog = 0;
- }
-
- if (pw->save_under)
- {
- restore_background(si);
- XFreePixmap (si->dpy, pw->save_under);
- pw->save_under = 0;
- }
-
- if (pw->heading_label) free (pw->heading_label);
- if (pw->body_label) free (pw->body_label);
- if (pw->user_label) free (pw->user_label);
- if (pw->date_label) free (pw->date_label);
- if (pw->login_label) free (pw->login_label);
- if (pw->unlock_label) free (pw->unlock_label);
- if (pw->passwd_string) free (pw->passwd_string);
- if (pw->uname_label) free (pw->uname_label);
-
- if (pw->heading_font) XFreeFont (si->dpy, pw->heading_font);
- if (pw->body_font) XFreeFont (si->dpy, pw->body_font);
- if (pw->label_font) XFreeFont (si->dpy, pw->label_font);
- if (pw->passwd_font) XFreeFont (si->dpy, pw->passwd_font);
- if (pw->date_font) XFreeFont (si->dpy, pw->date_font);
- if (pw->button_font) XFreeFont (si->dpy, pw->button_font);
- if (pw->uname_font) XFreeFont (si->dpy, pw->uname_font);
-
- if (pw->foreground != black && pw->foreground != white)
- XFreeColors (si->dpy, cmap, &pw->foreground, 1, 0L);
- if (pw->background != black && pw->background != white)
- XFreeColors (si->dpy, cmap, &pw->background, 1, 0L);
- if (!(pw->button_foreground == black || pw->button_foreground == white))
- XFreeColors (si->dpy, cmap, &pw->button_foreground, 1, 0L);
- if (!(pw->button_background == black || pw->button_background == white))
- XFreeColors (si->dpy, cmap, &pw->button_background, 1, 0L);
- if (pw->passwd_foreground != black && pw->passwd_foreground != white)
- XFreeColors (si->dpy, cmap, &pw->passwd_foreground, 1, 0L);
- if (pw->passwd_background != black && pw->passwd_background != white)
- XFreeColors (si->dpy, cmap, &pw->passwd_background, 1, 0L);
- if (pw->thermo_foreground != black && pw->thermo_foreground != white)
- XFreeColors (si->dpy, cmap, &pw->thermo_foreground, 1, 0L);
- if (pw->thermo_background != black && pw->thermo_background != white)
- XFreeColors (si->dpy, cmap, &pw->thermo_background, 1, 0L);
- if (pw->shadow_top != black && pw->shadow_top != white)
- XFreeColors (si->dpy, cmap, &pw->shadow_top, 1, 0L);
- if (pw->shadow_bottom != black && pw->shadow_bottom != white)
- XFreeColors (si->dpy, cmap, &pw->shadow_bottom, 1, 0L);
-
- if (pw->logo_pixmap)
- XFreePixmap (si->dpy, pw->logo_pixmap);
- if (pw-> logo_clipmask)
- XFreePixmap (si->dpy, pw->logo_clipmask);
- if (pw->logo_pixels)
- {
- if (pw->logo_npixels)
- XFreeColors (si->dpy, cmap, pw->logo_pixels, pw->logo_npixels, 0L);
- free (pw->logo_pixels);
- pw->logo_pixels = 0;
- pw->logo_npixels = 0;
- }
-
- if (pw->save_under)
- XFreePixmap (si->dpy, pw->save_under);
-
- if (cmap)
- XInstallColormap (si->dpy, cmap);
-
- memset (pw, 0, sizeof(*pw));
- free (pw);
- si->pw_data = 0;
-
- si->unlock_dismiss_time = time((time_t *) 0);
-}
-
-
-#if defined(HAVE_XF86MISCSETGRABKEYSSTATE) || defined(HAVE_XF86VMODE)
-
-static Bool error_handler_hit_p = False;
-
-static int
-ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
-{
- error_handler_hit_p = True;
- return 0;
-}
-
-#endif /* HAVE_XF86MISCSETGRABKEYSSTATE || HAVE_XF86VMODE */
-
-
-#ifdef HAVE_XHPDISABLERESET
-/* This function enables and disables the C-Sh-Reset hot-key, which
- normally resets the X server (logging out the logged-in user.)
- We don't want random people to be able to do that while the
- screen is locked.
- */
-static void
-hp_lock_reset (saver_info *si, Bool lock_p)
-{
- static Bool hp_locked_p = False;
-
- /* Calls to XHPDisableReset and XHPEnableReset must be balanced,
- or BadAccess errors occur. (It's ok for this to be global,
- since it affects the whole machine, not just the current screen.)
- */
- if (hp_locked_p == lock_p)
- return;
-
- if (lock_p)
- XHPDisableReset (si->dpy);
- else
- XHPEnableReset (si->dpy);
- hp_locked_p = lock_p;
-}
-#endif /* HAVE_XHPDISABLERESET */
-
-
-#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
-
-/* This function enables and disables the Ctrl-Alt-KP_star and
- Ctrl-Alt-KP_slash hot-keys, which (in XFree86 4.2) break any
- grabs and/or kill the grabbing client. That would effectively
- unlock the screen, so we don't like that.
-
- The Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash hot-keys only exist
- if AllowDeactivateGrabs and/or AllowClosedownGrabs are turned on
- in XF86Config. I believe they are disabled by default.
-
- This does not affect any other keys (specifically Ctrl-Alt-BS or
- Ctrl-Alt-F1) but I wish it did. Maybe it will someday.
- */
-static void
-xfree_lock_grab_smasher (saver_info *si, Bool lock_p)
-{
- saver_preferences *p = &si->prefs;
- int status;
- int event, error;
- XErrorHandler old_handler;
-
- if (!XF86MiscQueryExtension(si->dpy, &event, &error))
- return;
-
- XSync (si->dpy, False);
- error_handler_hit_p = False;
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
- XSync (si->dpy, False);
- status = XF86MiscSetGrabKeysState (si->dpy, !lock_p);
- XSync (si->dpy, False);
- if (error_handler_hit_p) status = 666;
-
- if (!lock_p && status == MiscExtGrabStateAlready)
- status = MiscExtGrabStateSuccess; /* shut up, consider this success */
-
- if (p->verbose_p && status != MiscExtGrabStateSuccess)
- fprintf (stderr, "%s: error: XF86MiscSetGrabKeysState(%d) returned %s\n",
- blurb(), !lock_p,
- (status == MiscExtGrabStateSuccess ? "MiscExtGrabStateSuccess" :
- status == MiscExtGrabStateLocked ? "MiscExtGrabStateLocked" :
- status == MiscExtGrabStateAlready ? "MiscExtGrabStateAlready" :
- status == 666 ? "an X error" :
- "unknown value"));
-
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
- XSync (si->dpy, False);
-}
-#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
-
-
-
-/* This function enables and disables the C-Alt-Plus and C-Alt-Minus
- hot-keys, which normally change the resolution of the X server.
- We don't want people to be able to switch the server resolution
- while the screen is locked, because if they switch to a higher
- resolution, it could cause part of the underlying desktop to become
- exposed.
- */
-#ifdef HAVE_XF86VMODE
-
-static void
-xfree_lock_mode_switch (saver_info *si, Bool lock_p)
-{
- static Bool any_mode_locked_p = False;
- saver_preferences *p = &si->prefs;
- int screen;
- int real_nscreens = ScreenCount (si->dpy);
- int event, error;
- Bool status;
- XErrorHandler old_handler;
-
- if (any_mode_locked_p == lock_p)
- return;
- if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
- return;
-
- for (screen = 0; screen < real_nscreens; screen++)
- {
- XSync (si->dpy, False);
- old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
- error_handler_hit_p = False;
- status = XF86VidModeLockModeSwitch (si->dpy, screen, lock_p);
- XSync (si->dpy, False);
- XSetErrorHandler (old_handler);
- if (error_handler_hit_p) status = False;
-
- if (status)
- any_mode_locked_p = lock_p;
-
- if (!status && (p->verbose_p || !lock_p))
- /* Only print this when verbose, or when we locked but can't unlock.
- I tried printing this message whenever it comes up, but
- mode-locking always fails if DontZoom is set in XF86Config. */
- fprintf (stderr, "%s: %d: unable to %s mode switching!\n",
- blurb(), screen, (lock_p ? "lock" : "unlock"));
- else if (p->verbose_p)
- fprintf (stderr, "%s: %d: %s mode switching.\n",
- blurb(), screen, (lock_p ? "locked" : "unlocked"));
- }
-}
-#endif /* HAVE_XF86VMODE */
-
-
-/* If the viewport has been scrolled since the screen was blanked,
- then scroll it back to where it belongs. This function only exists
- to patch over a very brief race condition.
- */
-static void
-undo_vp_motion (saver_info *si)
-{
-#ifdef HAVE_XF86VMODE
- saver_preferences *p = &si->prefs;
- int screen;
- int real_nscreens = ScreenCount (si->dpy);
- int event, error;
-
- if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
- return;
-
- for (screen = 0; screen < real_nscreens; screen++)
- {
- saver_screen_info *ssi = &si->screens[screen];
- int x, y;
- Bool status;
-
- if (ssi->blank_vp_x == -1 && ssi->blank_vp_y == -1)
- break;
- if (!XF86VidModeGetViewPort (si->dpy, screen, &x, &y))
- return;
- if (ssi->blank_vp_x == x && ssi->blank_vp_y == y)
- return;
-
- /* We're going to move the viewport. The mouse has just been grabbed on
- (and constrained to, thus warped to) the password window, so it is no
- longer near the edge of the screen. However, wait a bit anyway, just
- to make sure the server drains its last motion event, so that the
- screen doesn't continue to scroll after we've reset the viewport.
- */
- XSync (si->dpy, False);
- usleep (250000); /* 1/4 second */
- XSync (si->dpy, False);
-
- status = XF86VidModeSetViewPort (si->dpy, screen,
- ssi->blank_vp_x, ssi->blank_vp_y);
-
- if (!status)
- fprintf (stderr,
- "%s: %d: unable to move vp from (%d,%d) back to (%d,%d)!\n",
- blurb(), screen, x, y, ssi->blank_vp_x, ssi->blank_vp_y);
- else if (p->verbose_p)
- fprintf (stderr,
- "%s: %d: vp moved to (%d,%d); moved it back to (%d,%d).\n",
- blurb(), screen, x, y, ssi->blank_vp_x, ssi->blank_vp_y);
- }
-#endif /* HAVE_XF86VMODE */
-}
-
-
-
-/* Interactions
- */
-
-static void
-passwd_animate_timer (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- int tick = 166;
- passwd_dialog_data *pw = si->pw_data;
-
- if (!pw) return;
-
- pw->ratio -= (1.0 / ((double) si->prefs.passwd_timeout / (double) tick));
- if (pw->ratio < 0)
- {
- pw->ratio = 0;
- if (si->unlock_state == ul_read)
- si->unlock_state = ul_time;
- }
-
- update_passwd_window (si, 0, pw->ratio);
-
- if (si->unlock_state == ul_read)
- pw->timer = XtAppAddTimeOut (si->app, tick, passwd_animate_timer,
- (XtPointer) si);
- else
- pw->timer = 0;
-
- idle_timer ((XtPointer) si, 0);
-}
-
-
-static XComposeStatus *compose_status;
-
-static void
-handle_login_button (saver_info *si, XEvent *event)
-{
- saver_preferences *p = &si->prefs;
- Bool mouse_in_box = False;
- Bool hit_p = False;
- passwd_dialog_data *pw = si->pw_data;
- saver_screen_info *ssi = pw->prompt_screen;
-
- if (! pw->login_button_enabled_p)
- return;
-
- mouse_in_box =
- (event->xbutton.x >= pw->login_button_x &&
- event->xbutton.x <= pw->login_button_x + pw->login_button_width &&
- event->xbutton.y >= pw->login_button_y &&
- event->xbutton.y <= pw->login_button_y + pw->login_button_height);
-
- if (ButtonRelease == event->xany.type &&
- pw->login_button_down_p &&
- mouse_in_box)
- {
- /* Only allow them to press the button once: don't want to
- accidentally launch a dozen gdm choosers if the machine
- is being slow.
- */
- hit_p = True;
- pw->login_button_enabled_p = False;
- }
-
- pw->login_button_down_p = (mouse_in_box &&
- ButtonRelease != event->xany.type);
-
- update_passwd_window (si, 0, pw->ratio);
-
- if (hit_p)
- fork_and_exec (ssi, p->new_login_command);
-}
-
-
-static void
-handle_unlock_button (saver_info *si, XEvent *event)
-{
- Bool mouse_in_box = False;
- passwd_dialog_data *pw = si->pw_data;
-
- mouse_in_box =
- (event->xbutton.x >= pw->unlock_button_x &&
- event->xbutton.x <= pw->unlock_button_x + pw->unlock_button_width &&
- event->xbutton.y >= pw->unlock_button_y &&
- event->xbutton.y <= pw->unlock_button_y + pw->unlock_button_height);
-
- if (ButtonRelease == event->xany.type &&
- pw->unlock_button_down_p &&
- mouse_in_box)
- finished_typing_passwd (si, pw);
-
- pw->unlock_button_down_p = (mouse_in_box &&
- ButtonRelease != event->xany.type);
-}
-
-
-static void
-finished_typing_passwd (saver_info *si, passwd_dialog_data *pw)
-{
- if (si->unlock_state == ul_read)
- {
- update_passwd_window (si, "Checking...", pw->ratio);
- XSync (si->dpy, False);
-
- si->unlock_state = ul_finished;
- update_passwd_window (si, "", pw->ratio);
- }
-}
-
-static void
-handle_passwd_key (saver_info *si, XKeyEvent *event)
-{
- passwd_dialog_data *pw = si->pw_data;
- unsigned char decoded [MAX_BYTES_PER_CHAR * 10]; /* leave some slack */
- KeySym keysym = 0;
-
- /* XLookupString may return more than one character via XRebindKeysym;
- and on some systems it returns multi-byte UTF-8 characters (contrary
- to its documentation, which says it returns only Latin1.)
-
- It seems to only do so, however, if setlocale() has been called.
- See the code inside ENABLE_NLS in xscreensaver.c.
- */
- int decoded_size = XLookupString (event, (char *)decoded, sizeof(decoded),
- &keysym, compose_status);
-
-#if 0
- {
- const char *ks = XKeysymToString (keysym);
- int i;
- fprintf(stderr, "## %-12s\t=> %d\t", (ks ? ks : "(null)"), decoded_size);
- for (i = 0; i < decoded_size; i++)
- fprintf(stderr, "%c", decoded[i]);
- fprintf(stderr, "\t");
- for (i = 0; i < decoded_size; i++)
- fprintf(stderr, "\\%03o", ((unsigned char *)decoded)[i]);
- fprintf(stderr, "\n");
- }
-#endif
-
- if (decoded_size > MAX_BYTES_PER_CHAR)
- {
- /* The multi-byte character returned is too large. */
- XBell (si->dpy, 0);
- return;
- }
-
- decoded[decoded_size] = 0;
- pw->passwd_changed_p = True;
-
- /* Add 10% to the time remaining every time a key is pressed. */
- pw->ratio += 0.1;
- if (pw->ratio > 1) pw->ratio = 1;
-
- if (decoded_size == 1) /* Handle single-char commands */
- {
- switch (*decoded)
- {
- case '\010': case '\177': /* Backspace */
- {
- /* kludgey way to get the number of "logical" characters. */
- int nchars = strlen (pw->typed_passwd_char_size);
- int nbytes = strlen (pw->typed_passwd);
- if (nbytes <= 0)
- XBell (si->dpy, 0);
- else
- {
- int i;
- for (i = pw->typed_passwd_char_size[nchars-1]; i >= 0; i--)
- {
- if (nbytes < 0) abort();
- pw->typed_passwd[nbytes--] = 0;
- }
- pw->typed_passwd_char_size[nchars-1] = 0;
- }
- }
- break;
-
- case '\012': case '\015': /* Enter */
- finished_typing_passwd (si, pw);
- break;
-
- case '\033': /* Escape */
- si->unlock_state = ul_cancel;
- break;
-
- case '\025': case '\030': /* Erase line */
- memset (pw->typed_passwd, 0, sizeof (pw->typed_passwd));
- memset (pw->typed_passwd_char_size, 0,
- sizeof (pw->typed_passwd_char_size));
- break;
-
- default:
- if (*decoded < ' ' && *decoded != '\t') /* Other ctrl char */
- XBell (si->dpy, 0);
- else
- goto SELF_INSERT;
- break;
- }
- }
- else
- {
- int nbytes, nchars;
- SELF_INSERT:
- nbytes = strlen (pw->typed_passwd);
- nchars = strlen (pw->typed_passwd_char_size);
- if (nchars + 1 >= sizeof (pw->typed_passwd_char_size)-1 ||
- nbytes + decoded_size >= sizeof (pw->typed_passwd)-1) /* overflow */
- XBell (si->dpy, 0);
- else
- {
- pw->typed_passwd_char_size[nchars] = decoded_size;
- pw->typed_passwd_char_size[nchars+1] = 0;
- memcpy (pw->typed_passwd + nbytes, decoded, decoded_size);
- pw->typed_passwd[nbytes + decoded_size] = 0;
- }
- }
-
- if (pw->echo_input)
- {
- /* If the input is wider than the text box, only show the last portion,
- to simulate a horizontally-scrolling text field. */
- int chars_in_pwfield = (pw->passwd_field_width /
- pw->passwd_font->max_bounds.width);
- const char *output = pw->typed_passwd;
- if (strlen(output) > chars_in_pwfield)
- output += (strlen(output) - chars_in_pwfield);
- update_passwd_window (si, output, pw->ratio);
- }
- else if (pw->show_stars_p)
- {
- int nchars = strlen (pw->typed_passwd_char_size);
- char *stars = 0;
- stars = (char *) malloc(nchars + 1);
- memset (stars, '*', nchars);
- stars[nchars] = 0;
- update_passwd_window (si, stars, pw->ratio);
- free (stars);
- }
- else
- {
- update_passwd_window (si, "", pw->ratio);
- }
-}
-
-
-static void
-passwd_event_loop (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- char *msg = 0;
-
- /* We have to go through this union bullshit because gcc-4.4.0 has
- stricter struct-aliasing rules. Without this, the optimizer
- can fuck things up.
- */
- union {
- XEvent x_event;
-# ifdef HAVE_RANDR
- XRRScreenChangeNotifyEvent xrr_event;
-# endif /* HAVE_RANDR */
- } event;
-
- passwd_animate_timer ((XtPointer) si, 0);
- reset_watchdog_timer (si, False); /* Disable watchdog while dialog up */
-
- while (si->unlock_state == ul_read)
- {
- XtAppNextEvent (si->app, &event.x_event);
-
-#ifdef HAVE_RANDR
- if (si->using_randr_extension &&
- (event.x_event.type ==
- (si->randr_event_number + RRScreenChangeNotify)))
- {
- /* The Resize and Rotate extension sends an event when the
- size, rotation, or refresh rate of any screen has changed. */
-
- if (p->verbose_p)
- {
- /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */
- int screen = XRRRootToScreen(si->dpy, event.xrr_event.window);
- fprintf (stderr, "%s: %d: screen change event received\n",
- blurb(), screen);
- }
-
-#ifdef RRScreenChangeNotifyMask
- /* Inform Xlib that it's ok to update its data structures. */
- XRRUpdateConfiguration(&event.x_event); /* Xrandr.h 1.9, 2002/09/29*/
-#endif /* RRScreenChangeNotifyMask */
-
- /* Resize the existing xscreensaver windows and cached ssi data. */
- if (update_screen_layout (si))
- {
- if (p->verbose_p)
- {
- fprintf (stderr, "%s: new layout:\n", blurb());
- describe_monitor_layout (si);
- }
- resize_screensaver_window (si);
- }
- }
- else
-#endif /* HAVE_RANDR */
-
- if (event.x_event.xany.window == si->passwd_dialog &&
- event.x_event.xany.type == Expose)
- draw_passwd_window (si);
- else if (event.x_event.xany.type == KeyPress)
- {
- handle_passwd_key (si, &event.x_event.xkey);
- si->pw_data->caps_p = (event.x_event.xkey.state & LockMask);
- }
- else if (event.x_event.xany.type == ButtonPress ||
- event.x_event.xany.type == ButtonRelease)
- {
- si->pw_data->button_state_changed_p = True;
- handle_unlock_button (si, &event.x_event);
- if (si->pw_data->login_button_p)
- handle_login_button (si, &event.x_event);
- }
- else
- XtDispatchEvent (&event.x_event);
- }
-
- switch (si->unlock_state)
- {
- case ul_cancel: msg = ""; break;
- case ul_time: msg = "Timed out!"; break;
- case ul_finished: msg = "Checking..."; break;
- default: msg = 0; break;
- }
-
- if (p->verbose_p)
- switch (si->unlock_state) {
- case ul_cancel:
- fprintf (stderr, "%s: input cancelled.\n", blurb()); break;
- case ul_time:
- fprintf (stderr, "%s: input timed out.\n", blurb()); break;
- case ul_finished:
- fprintf (stderr, "%s: input finished.\n", blurb()); break;
- default: break;
- }
-
- if (msg)
- {
- si->pw_data->i_beam = 0;
- update_passwd_window (si, msg, 0.0);
- XSync (si->dpy, False);
-
- /* Swallow all pending KeyPress/KeyRelease events. */
- {
- XEvent e;
- while (XCheckMaskEvent (si->dpy, KeyPressMask|KeyReleaseMask, &e))
- ;
- }
- }
-
- reset_watchdog_timer (si, True); /* Re-enable watchdog */
-}
-
-
-static void
-handle_typeahead (saver_info *si)
-{
- passwd_dialog_data *pw = si->pw_data;
- int i;
- if (!si->unlock_typeahead)
- return;
-
- pw->passwd_changed_p = True;
-
- i = strlen (si->unlock_typeahead);
- if (i >= sizeof(pw->typed_passwd) - 1)
- i = sizeof(pw->typed_passwd) - 1;
-
- memcpy (pw->typed_passwd, si->unlock_typeahead, i);
- pw->typed_passwd [i] = 0;
- {
- int j;
- char *c = pw->typed_passwd_char_size;
- for (j = 0; j < i; j++)
- *c++ = 1;
- *c = 0;
- }
-
- memset (si->unlock_typeahead, '*', strlen(si->unlock_typeahead));
- si->unlock_typeahead[i] = 0;
- update_passwd_window (si, si->unlock_typeahead, pw->ratio);
-
- free (si->unlock_typeahead);
- si->unlock_typeahead = 0;
-}
-
-
-/**
- * Returns a copy of the input string with trailing whitespace removed.
- * Whitespace is anything considered so by isspace().
- * It is safe to call this with NULL, in which case NULL will be returned.
- * The returned string (if not NULL) should be freed by the caller with free().
- */
-static char *
-remove_trailing_whitespace(const char *str)
-{
- size_t len;
- char *newstr, *chr;
-
- if (!str)
- return NULL;
-
- len = strlen(str);
-
- newstr = malloc(len + 1);
- if (!newstr)
- return NULL;
-
- (void) strcpy(newstr, str);
- chr = newstr + len;
- while (isspace(*--chr) && chr >= newstr)
- *chr = '\0';
-
- return newstr;
-}
-
-
-/*
- * The authentication conversation function.
- * Like a PAM conversation function, this accepts multiple messages in a single
- * round. It then splits them into individual messages for display on the
- * passwd dialog. A message sequence of info or error followed by a prompt will
- * be reduced into a single dialog window.
- *
- * Returns 0 on success or -1 if some problem occurred (cancelled, OOM, etc.)
- */
-int
-gui_auth_conv(int num_msg,
- const struct auth_message auth_msgs[],
- struct auth_response **resp,
- saver_info *si)
-{
- int i;
- const char *info_msg, *prompt;
- struct auth_response *responses;
-
- if (si->unlock_state == ul_cancel ||
- si->unlock_state == ul_time)
- /* If we've already cancelled or timed out in this PAM conversation,
- don't prompt again even if PAM asks us to! */
- return -1;
-
- if (!(responses = calloc(num_msg, sizeof(struct auth_response))))
- goto fail;
-
- for (i = 0; i < num_msg; ++i)
- {
- info_msg = prompt = NULL;
-
- /* See if there is a following message that can be shown at the same
- * time */
- if (auth_msgs[i].type == AUTH_MSGTYPE_INFO
- && i+1 < num_msg
- && ( auth_msgs[i+1].type == AUTH_MSGTYPE_PROMPT_NOECHO
- || auth_msgs[i+1].type == AUTH_MSGTYPE_PROMPT_ECHO)
- )
- {
- info_msg = auth_msgs[i].msg;
- prompt = auth_msgs[++i].msg;
- }
- else
- {
- if ( auth_msgs[i].type == AUTH_MSGTYPE_INFO
- || auth_msgs[i].type == AUTH_MSGTYPE_ERROR)
- info_msg = auth_msgs[i].msg;
- else
- prompt = auth_msgs[i].msg;
- }
-
- {
- char *info_msg_trimmed, *prompt_trimmed;
-
- /* Trailing whitespace looks bad in a GUI */
- info_msg_trimmed = remove_trailing_whitespace(info_msg);
- prompt_trimmed = remove_trailing_whitespace(prompt);
-
- if (make_passwd_window(si, info_msg_trimmed, prompt_trimmed,
- auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO
- ? True : False)
- < 0)
- goto fail;
-
- if (info_msg_trimmed)
- free(info_msg_trimmed);
-
- if (prompt_trimmed)
- free(prompt_trimmed);
- }
-
- compose_status = calloc (1, sizeof (*compose_status));
- if (!compose_status)
- goto fail;
-
- si->unlock_state = ul_read;
-
- handle_typeahead (si);
- passwd_event_loop (si);
-
- if (si->unlock_state == ul_cancel)
- goto fail;
-
- responses[i].response = strdup(si->pw_data->typed_passwd);
-
- /* Cache the first response to a PROMPT_NOECHO to save prompting for
- * each auth mechanism. */
- if (si->cached_passwd == NULL &&
- auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO)
- si->cached_passwd = strdup(responses[i].response);
-
- free (compose_status);
- compose_status = 0;
- }
-
- *resp = responses;
-
- return (si->unlock_state == ul_finished) ? 0 : -1;
-
-fail:
- if (compose_status)
- free (compose_status);
- compose_status = 0;
-
- if (responses)
- {
- for (i = 0; i < num_msg; ++i)
- if (responses[i].response)
- free (responses[i].response);
- free (responses);
- }
-
- return -1;
-}
-
-
-void
-auth_finished_cb (saver_info *si)
-{
- char buf[1024];
- const char *s;
-
- /* If we have something to say, put the dialog back up for a few seconds
- to display it. Otherwise, don't bother.
- */
-
- if (si->unlock_state == ul_fail && /* failed with caps lock on */
- si->pw_data && si->pw_data->caps_p)
- s = "Authentication failed (Caps Lock?)";
- else if (si->unlock_state == ul_fail) /* failed without caps lock */
- s = "Authentication failed!";
- else if (si->unlock_state == ul_success && /* good, but report failures */
- si->unlock_failures > 0)
- {
- if (si->unlock_failures == 1)
- s = "There has been\n1 failed login attempt.";
- else
- {
- sprintf (buf, "There have been\n%d failed login attempts.",
- si->unlock_failures);
- s = buf;
- }
- si->unlock_failures = 0;
-
- /* ignore failures if they all were too recent */
- if (time((time_t *) 0) - si->unlock_failure_time
- < si->prefs.auth_warning_slack)
- goto END;
- }
- else /* good, with no failures, */
- goto END; /* or timeout, or cancel. */
-
- make_passwd_window (si, s, NULL, True);
- XSync (si->dpy, False);
-
- {
- int secs = 4;
- time_t start = time ((time_t *) 0);
- XEvent event;
- while (time ((time_t *) 0) < start + secs)
- if (XPending (si->dpy))
- {
- XNextEvent (si->dpy, &event);
- if (event.xany.window == si->passwd_dialog &&
- event.xany.type == Expose)
- draw_passwd_window (si);
- else if (event.xany.type == ButtonPress ||
- event.xany.type == KeyPress)
- break;
- XSync (si->dpy, False);
- }
- else
- usleep (250000); /* 1/4 second */
- }
-
- END:
- if (si->pw_data)
- destroy_passwd_window (si);
-}
-
-
-Bool
-unlock_p (saver_info *si)
-{
- saver_preferences *p = &si->prefs;
- time_t now = time ((time_t *) 0);
-
- if (!si->unlock_cb)
- {
- fprintf(stderr, "%s: Error: no unlock function specified!\n", blurb());
- return False;
- }
-
- raise_window (si, True, True, True);
-
- /* If your cat is sitting on the return key, don't thrash the window.
- Only one failed/cancelled unlock per 2 seconds.
- */
- if (si->unlock_dismiss_time >= now - 1)
- {
- if (p->verbose_p)
- fprintf (stderr, "%s: unlock: thrashing: RET held down?\n", blurb());
- XSync (si->dpy, False);
-# undef sleep
- sleep (2); /* This is less than ideal, but fine */
- }
-
- xss_authenticate(si, p->verbose_p);
-
- return (si->unlock_state == ul_success);
-}
-
-
-void
-set_locked_p (saver_info *si, Bool locked_p)
-{
- si->locked_p = locked_p;
-
-#ifdef HAVE_XHPDISABLERESET
- hp_lock_reset (si, locked_p); /* turn off/on C-Sh-Reset */
-#endif
-#ifdef HAVE_XF86VMODE
- xfree_lock_mode_switch (si, locked_p); /* turn off/on C-Alt-Plus */
-#endif
-#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
- xfree_lock_grab_smasher (si, locked_p); /* turn off/on C-Alt-KP-*,/ */
-#endif
-
- store_saver_status (si); /* store locked-p */
-}
-
-
-#else /* NO_LOCKING -- whole file */
-
-void
-set_locked_p (saver_info *si, Bool locked_p)
-{
- if (locked_p) abort();
-}
-
-#endif /* !NO_LOCKING */
diff --git a/driver/mlstring.c b/driver/mlstring.c
deleted file mode 100644
index fdba1ee..0000000
--- a/driver/mlstring.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * (c) 2007, Quest Software, Inc. All rights reserved.
- *
- * This file is part of XScreenSaver,
- * Copyright (c) 1993-2009 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <stdlib.h>
-#include <ctype.h>
-
-#include <X11/Xlib.h>
-
-#include "mlstring.h"
-
-#define LINE_SPACING 1.2
-
-static mlstring *
-mlstring_allocate(const char *msg);
-
-static void
-mlstring_calculate(mlstring *str, XFontStruct *font);
-
-mlstring*
-mlstring_new(const char *msg, XFontStruct *font, Dimension wrap_width)
-{
- mlstring *newstr;
-
- if (!(newstr = mlstring_allocate(msg)))
- return NULL;
-
- newstr->font_id = font->fid;
-
- mlstring_wrap(newstr, font, wrap_width);
-
- return newstr;
-}
-
-mlstring *
-mlstring_allocate(const char *msg)
-{
- const char *s;
- mlstring *ml;
- struct mlstr_line *cur, *prev = NULL;
- size_t linelength;
- int the_end = 0;
-
- if (!msg)
- return NULL;
-
- ml = calloc(1, sizeof(mlstring));
-
- if (!ml)
- return NULL;
-
- for (s = msg; !the_end; msg = ++s)
- {
- /* New string struct */
- cur = calloc(1, sizeof(struct mlstr_line));
- if (!cur)
- goto fail;
-
- if (!ml->lines)
- ml->lines = cur;
-
- /* Find the \n or end of string */
- while (*s != '\n')
- {
- if (*s == '\0')
- {
- the_end = 1;
- break;
- }
-
- ++s;
- }
-
- linelength = s - msg;
-
- /* Duplicate the string */
- cur->line = malloc(linelength + 1);
- if (!cur->line)
- goto fail;
-
- strncpy(cur->line, msg, linelength);
- cur->line[linelength] = '\0';
-
- if (prev)
- prev->next_line = cur;
- prev = cur;
- }
-
- return ml;
-
-fail:
-
- if (ml)
- mlstring_free(ml);
-
- return NULL;
-}
-
-
-/*
- * Frees an mlstring.
- * This function does not have any unit tests.
- */
-void
-mlstring_free(mlstring *str) {
- struct mlstr_line *cur, *next;
-
- for (cur = str->lines; cur; cur = next) {
- next = cur->next_line;
- free(cur->line);
- free(cur);
- }
-
- free(str);
-}
-
-
-void
-mlstring_wrap(mlstring *mstring, XFontStruct *font, Dimension width)
-{
- short char_width = font->max_bounds.width;
- int line_length, wrap_at;
- struct mlstr_line *mstr, *newml;
-
- /* An alternative implementation of this function would be to keep trying
- * XTextWidth() on space-delimited substrings until the longest one less
- * than 'width' is found, however there shouldn't be much difference
- * between that, and this implementation.
- */
-
- for (mstr = mstring->lines; mstr; mstr = mstr->next_line)
- {
- if (XTextWidth(font, mstr->line, strlen(mstr->line)) > width)
- {
- /* Wrap it */
- line_length = width / char_width;
- if (line_length == 0)
- line_length = 1;
-
- /* First try to soft wrap by finding a space */
- for (wrap_at = line_length; wrap_at >= 0 && !isspace(mstr->line[wrap_at]); --wrap_at);
-
- if (wrap_at == -1) /* No space found, hard wrap */
- wrap_at = line_length;
- else
- wrap_at++; /* Leave the space at the end of the line. */
-
- newml = calloc(1, sizeof(*newml));
- if (!newml) /* OOM, don't bother trying to wrap */
- break;
-
- if (NULL == (newml->line = strdup(mstr->line + wrap_at)))
- {
- /* OOM, jump ship */
- free(newml);
- break;
- }
-
- /* Terminate the existing string at its end */
- mstr->line[wrap_at] = '\0';
-
- newml->next_line = mstr->next_line;
- mstr->next_line = newml;
- }
- }
-
- mlstring_calculate(mstring, font);
-}
-
-#undef MAX
-#define MAX(x, y) ((x) > (y) ? (x) : (y))
-
-/*
- * Calculates the overall extents (width + height of the multi-line string).
- * This function is called as part of mlstring_new().
- * It does not have any unit testing.
- */
-void
-mlstring_calculate(mlstring *str, XFontStruct *font) {
- struct mlstr_line *line;
-
- str->font_height = font->ascent + font->descent;
- str->overall_height = 0;
- str->overall_width = 0;
-
- /* XXX: Should there be some baseline calculations to help XDrawString later on? */
- str->font_ascent = font->ascent;
-
- for (line = str->lines; line; line = line->next_line)
- {
- line->line_width = XTextWidth(font, line->line, strlen(line->line));
- str->overall_width = MAX(str->overall_width, line->line_width);
- /* Don't add line spacing for the first line */
- str->overall_height += (font->ascent + font->descent) *
- (line == str->lines ? 1 : LINE_SPACING);
- }
-}
-
-void
-mlstring_draw(Display *dpy, Drawable dialog, GC gc, mlstring *string, int x, int y) {
- struct mlstr_line *line;
-
- if (!string)
- return;
-
- y += string->font_ascent;
-
- XSetFont(dpy, gc, string->font_id);
-
- for (line = string->lines; line; line = line->next_line)
- {
- XDrawString(dpy, dialog, gc, x, y, line->line, strlen(line->line));
- y += string->font_height * LINE_SPACING;
- }
-}
-
-/* vim:ts=8:sw=2:noet
- */
diff --git a/driver/mlstring.h b/driver/mlstring.h
deleted file mode 100644
index ce36205..0000000
--- a/driver/mlstring.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* mlstring.h --- Multi-line strings for use with Xlib
- *
- * (c) 2007, Quest Software, Inc. All rights reserved.
- *
- * This file is part of XScreenSaver,
- * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#ifndef MLSTRING_H
-#define MLSTRING_H
-
-#include <X11/Intrinsic.h>
-
-/* mlstring means multi-line string */
-
-struct mlstr_line;
-
-typedef struct mlstring mlstring;
-struct mlstring {
- struct mlstr_line *lines; /* linked list */
- Dimension overall_height;
- Dimension overall_width;
- /* XXX: Perhaps it is simpler to keep a reference to the XFontStruct */
- int font_ascent;
- int font_height;
- Font font_id;
-};
-
-struct mlstr_line {
- char *line;
- Dimension line_width;
- struct mlstr_line *next_line;
-};
-
-mlstring *
-mlstring_new(const char *str, XFontStruct *font, Dimension wrap_width);
-
-/* Does not have to be called manually */
-void
-mlstring_wrap(mlstring *mstr, XFontStruct *font, Dimension width);
-
-void
-mlstring_free(mlstring *str);
-
-void
-mlstring_draw(Display *dpy, Drawable dialog, GC gc, mlstring *string, int x, int y);
-
-#endif
-/* vim:ts=8:sw=2:noet
- */
diff --git a/driver/passwd-helper.c b/driver/passwd-helper.c
deleted file mode 100644
index 4b17c63..0000000
--- a/driver/passwd-helper.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/* passwd-helper.c --- verifying typed passwords with external helper program
- * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
- * written by Olaf Kirch <okir@suse.de>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-
-/*****************************************************************************
-
- I strongly suspect that this code has not been used in decades, and I
- am considering removing it. These details should be hidden behind PAM.
- If you are using this code, email me and tell me why. -- jwz, Feb 2021
-
- *****************************************************************************/
-
-#error "email jwz@jwz.org about passwd-helper.c"
-
-
-/* The idea here is to be able to run xscreensaver without any setuid bits.
- * Password verification happens through an external program that you feed
- * your password to on stdin. The external command is invoked with a user
- * name argument.
- *
- * The external helper does whatever authentication is necessary. Currently,
- * SuSE uses "unix2_chkpwd", which is a variation of "unix_chkpwd" from the
- * PAM distribution.
- *
- * Normally, the password helper should just authenticate the calling user
- * (i.e. based on the caller's real uid). This is in order to prevent
- * brute-forcing passwords in a shadow environment. A less restrictive
- * approach would be to allow verifying other passwords as well, but always
- * with a 2 second delay or so. (Not sure what SuSE's "unix2_chkpwd"
- * currently does.)
- * -- Olaf Kirch <okir@suse.de>, 16-Dec-2003
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#ifndef NO_LOCKING /* whole file */
-
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <pwd.h>
-#include <errno.h>
-#include <sys/wait.h>
-
-#include "blurb.h"
-#include "auth.h"
-
-
-static int
-ext_run (const char *user, const char *typed_passwd)
-{
- int pfd[2], status;
- pid_t pid;
-
- if (pipe(pfd) < 0)
- return 0;
-
- if (verbose_p)
- fprintf (stderr, "%s: EXT: %s\n", blurb(), PASSWD_HELPER_PROGRAM);
-
- if ((pid = fork()) < 0) {
- close(pfd[0]);
- close(pfd[1]);
- return 0;
- }
-
- if (pid == 0) {
- close(pfd[1]);
- if (pfd[0] != 0)
- dup2(pfd[0], 0);
-
- /* Helper is invoked as helper service-name [user] */
- execlp(PASSWD_HELPER_PROGRAM, PASSWD_HELPER_PROGRAM, "xscreensaver", user, NULL);
- if (verbose_p)
- fprintf(stderr, "%s: EXT: %s\n", PASSWD_HELPER_PROGRAM,
- strerror(errno));
- exit(1);
- }
-
- close(pfd[0]);
-
- /* Write out password to helper process */
- if (!typed_passwd)
- typed_passwd = "";
- write(pfd[1], typed_passwd, strlen(typed_passwd));
- close(pfd[1]);
-
- while (waitpid(pid, &status, 0) < 0) {
- if (errno == EINTR)
- continue;
- if (verbose_p)
- fprintf(stderr, "%s: EXT: waitpid failed: %s\n",
- blurb(), strerror(errno));
- return 0;
- }
-
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- return 0;
- return 1;
-}
-
-
-
-/* This can be called at any time, and says whether the typed password
- belongs to either the logged in user (real uid, not effective); or
- to root.
- */
-int
-ext_passwd_valid_p (void *closure, const char *typed_passwd)
-{
- struct passwd *pw;
- int res = 0;
-
- if ((pw = getpwuid(getuid())) != NULL)
- res = ext_run (pw->pw_name, typed_passwd);
- endpwent();
-
-#ifdef ALLOW_ROOT_PASSWD
- if (!res)
- res = ext_run ("root", typed_passwd);
-#endif /* ALLOW_ROOT_PASSWD */
-
- return res;
-}
-
-
-Bool
-ext_priv_init (void)
-{
- /* Make sure the passwd helper exists */
- if (access(PASSWD_HELPER_PROGRAM, X_OK) < 0) {
- fprintf(stderr,
- "%s: EXT: warning: %s does not exist.\n"
- "%s: EXT password authentication will not work.\n",
- blurb(), PASSWD_HELPER_PROGRAM, blurb());
- return False;
- }
- return True;
-}
-
-#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-pam.c b/driver/passwd-pam.c
index 87942ab..4d434db 100644
--- a/driver/passwd-pam.c
+++ b/driver/passwd-pam.c
@@ -1,5 +1,5 @@
/* passwd-pam.c --- verifying typed passwords with PAM
- * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2022 Jamie Zawinski <jwz@jwz.org>
* By Bill Nottingham <notting@redhat.com> and jwz.
*
* Permission to use, copy, modify, distribute, and sell this software and its
@@ -34,12 +34,16 @@
those files are not a part of PAM's C API, but it's how real-world systems
actually work.
- Also note that FreeBSD's implementation of PAM requires the calling process
- to be running as root during the entire interactive PAM conversation: it
- can't ever disavow privileges. Linux's PAM implementation uses a setuid
- helper so that a non-root process can still authenticate, as is right and
- proper. Consequently, XScreenSaver does not support PAM on FreeBSD.
- Dear FreeBSD, get your shit together.
+ Also note that FreeBSD's PAM configuration requires the calling process to
+ be running as root during the *entire* interactive PAM conversation: it
+ can't ever disavow privileges. Whereas Linux's PAM configurations use a
+ setuid helper within the PAM stack so that a non-root process can still
+ authenticate, as is right and proper. Consequently, PAM does not work with
+ XScreenSaver on FreeBSD by default. Dear FreeBSD, get your shit together.
+
+ I am told that only *some* of the FreeBSD PAM modules have this bug, e.g.,
+ "pam_unix" fails, but "pam_winbind" works. So this problem is demonstrably
+ fixable entirely within the PAM stack, and that's where it should be fixed.
*/
#ifdef HAVE_CONFIG_H
diff --git a/driver/passwd-pwent.c b/driver/passwd-pwent.c
index b6c74de..c568063 100644
--- a/driver/passwd-pwent.c
+++ b/driver/passwd-pwent.c
@@ -1,5 +1,5 @@
/* passwd-pwent.c --- verifying typed passwords with the OS.
- * xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1993-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -163,6 +163,7 @@ get_encrypted_passwd (const char *user)
result = strdup(p->pw_passwd);
}
+# ifdef HAVE_HPUX_PASSWD
/* The manual for passwd(4) on HPUX 10.10 says:
Password aging is put in effect for a particular user if his
@@ -173,6 +174,9 @@ get_encrypted_passwd (const char *user)
So this means that passwd->pw_passwd isn't simply a string of cyphertext,
it might have trailing junk. So, if there is a comma in the string, and
that comma is beyond position 13, terminate the string before the comma.
+
+ This behavior can break other systems where comma separated data is
+ significant, such as argon2 passwords on NetBSD.
*/
if (result && strlen(result) > 13)
{
@@ -180,6 +184,7 @@ get_encrypted_passwd (const char *user)
if (s)
*s = 0;
}
+# endif /* HAVE_HPUX_PASSWD */
/* We only issue this warning in non-verbose mode if not compiled with
support for PAM. If we're using PAM, it's common for pwent passwords
diff --git a/driver/pdf2jpeg.m b/driver/pdf2jpeg.m
deleted file mode 100644
index d681b4a..0000000
--- a/driver/pdf2jpeg.m
+++ /dev/null
@@ -1,152 +0,0 @@
-/* pdf2jpeg -- converts a PDF file to a JPEG file, using Cocoa
- *
- * Copyright (c) 2003, 2008 by Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Inspired by clues provided by Jan Kujawa and Jonathan Hendry.
- */
-
-#import <Cocoa/Cocoa.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (int argc, char** argv)
-{
- const char *progname = argv[0];
- const char *infile = 0, *outfile = 0;
- double compression = 0.85;
- double scale = 1.0;
- int verbose = 0;
- int i;
-
- for (i = 1; i < argc; i++)
- {
- char c;
- if (argv[i][0] == '-' && argv[i][1] == '-')
- argv[i]++;
- if (!strcmp (argv[i], "-q") ||
- !strcmp (argv[i], "-qual") ||
- !strcmp (argv[i], "-quality"))
- {
- int q;
- if (1 != sscanf (argv[++i], " %d %c", &q, &c) ||
- q < 5 || q > 100)
- {
- fprintf (stderr, "%s: quality must be 5 - 100 (%d)\n",
- progname, q);
- goto USAGE;
- }
- compression = q / 100.0;
- }
- else if (!strcmp (argv[i], "-scale"))
- {
- float s;
- if (1 != sscanf (argv[++i], " %f %c", &s, &c) ||
- s <= 0 || s > 50)
- {
- fprintf (stderr, "%s: scale must be 0.0 - 50.0 (%f)\n",
- progname, s);
- goto USAGE;
- }
- scale = s;
- }
- else if (!strcmp (argv[i], "-verbose"))
- verbose++;
- else if (!strcmp (argv[i], "-v") ||
- !strcmp (argv[i], "-vv") ||
- !strcmp (argv[i], "-vvv"))
- verbose += strlen(argv[i])-1;
- else if (argv[i][0] == '-')
- {
- fprintf (stderr, "%s: unknown option %s\n", progname, argv[i]);
- goto USAGE;
- }
- else if (!infile)
- infile = argv[i];
- else if (!outfile)
- outfile = argv[i];
- else
- {
- USAGE:
- fprintf (stderr,
- "usage: %s [-verbose] [-scale N] [-quality NN] "
- "infile.pdf outfile.jpg\n",
- progname);
- exit (1);
- }
- }
-
- if (!infile || !outfile)
- goto USAGE;
-
-
- // Much of Cocoa needs one of these to be available.
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- //Need an NSApp instance to make [NSImage TIFFRepresentation] work
- NSApp = [NSApplication sharedApplication];
- [NSApp autorelease];
-
- if (verbose)
- fprintf (stderr, "%s: reading %s...\n", progname, infile);
-
- // Load the PDF file into an NSData object:
- NSData *pdf_data = [NSData dataWithContentsOfFile:
- [NSString stringWithCString:infile
- encoding:NSUTF8StringEncoding]];
-
- // Create an NSPDFImageRep from the data:
- NSPDFImageRep *pdf_rep = [NSPDFImageRep imageRepWithData:pdf_data];
-
- // Create an NSImage instance
- NSRect rect;
- rect.size = [pdf_rep size];
- rect.size.width *= scale;
- rect.size.height *= scale;
- rect.origin.x = rect.origin.y = 0;
- NSImage *image = [[NSImage alloc] initWithSize:rect.size];
-
- // Draw the PDFImageRep in the NSImage
- [image lockFocus];
- [pdf_rep drawInRect:rect];
- [image unlockFocus];
-
- // Load the NSImage's contents into an NSBitmapImageRep:
- NSBitmapImageRep *bit_rep = [NSBitmapImageRep
- imageRepWithData:[image TIFFRepresentation]];
-
- // Write the bitmapImageRep to a JPEG file:
- if (bit_rep == nil)
- {
- fprintf (stderr, "%s: error converting image?\n", argv[0]);
- exit (1);
- }
-
- if (verbose)
- fprintf (stderr, "%s: writing %s (%d%% quality)...\n",
- progname, outfile, (int) (compression * 100));
-
- NSDictionary *props = [NSDictionary
- dictionaryWithObject:
- [NSNumber numberWithFloat:compression]
- forKey:NSImageCompressionFactor];
- NSData *jpeg_data = [bit_rep representationUsingType:NSJPEGFileType
- properties:props];
-
- [jpeg_data writeToFile:
- [NSString stringWithCString:outfile
- encoding:NSUTF8StringEncoding]
- atomically:YES];
- [image release];
-
- [pool release];
- exit (0);
-}
diff --git a/driver/pdf2jpeg.man b/driver/pdf2jpeg.man
deleted file mode 100644
index 9d80dd7..0000000
--- a/driver/pdf2jpeg.man
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH XScreenSaver 1 "07-Sep-2003 (4.13)" "X Version 11"
-.SH NAME
-pdf2jpeg - converts a PDF file to a JPEG file using Cocoa
-.SH SYNOPSIS
-.B pdf2jpeg
-[\--verbose] [\--quality \fINN\fP] infile.pdf outfile.jpg
-.SH DESCRIPTION
-This reads a PDF file (for example, as written by the
-.BR screencapture (1)
-program) and writes a JPEG file.
-.SH OPTIONS
-.I pdf2jpeg
-accepts the following options:
-.TP 4
-.B --verbose
-Print diagnostics.
-.TP 4
-.B --quality \fINN\fP
-JPEG compression factor. Default 85%.
-.SH BUGS
-The input and output files must be files: pipes don't work.
-
-This program is Cocoa-specific, so it won't work on non-MacOS systems.
-
-This shouldn't need to be a part of the XScreenSaver distribution at
-all, but Apple is COMPLETELY INSANE and made
-.BR screencapture (1)
-only write PDFs, with no simple way to convert that to something
-less crazy.
-.SH SEE ALSO
-.BR screencapture (1),
-.BR xscreensaver\-getimage\-desktop (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 20-Oct-03.
diff --git a/driver/prefs.ui b/driver/prefs.ui
new file mode 100644
index 0000000..a6e4e2e
--- /dev/null
+++ b/driver/prefs.ui
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="XScreenSaverDialog" parent="GtkDialog">
+ <property name="title" translatable="yes">XScreenSaver Settings</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window-position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy-with-parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip-taskbar-hint">False</property>
+ <property name="skip-pager-hint">False</property>
+ <property name="type-hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus-on-map">True</property>
+ <property name="urgency-hint">False</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">0</property>
+ <property name="margin-bottom">0</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog_action_area">
+ <property name="visible">True</property>
+ <property name="layout-style">GTK_BUTTONBOX_END</property>
+ <child>
+ <object class="GtkButton" id="adv_button">
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="settings_adv_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="std_button">
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Standard &lt;&lt;</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="settings_std_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="reset_button">
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Reset to Defaults</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="settings_reset_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use-stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="settings_cancel_cb" name="clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="visible">True</property>
+ <property name="can-default">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">Save</property>
+ <property name="use-stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="settings_ok_cb" name="clicked"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack-type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="opt_frame">
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0</property>
+ <property name="shadow-type">GTK_SHADOW_NONE</property>
+ <accessibility>
+ <relation target="label6" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkNotebook" id="opt_notebook">
+ <property name="border-width">12</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="show-tabs">False</property>
+ <property name="show-border">False</property>
+ <property name="tab-pos">GTK_POS_BOTTOM</property>
+ <property name="scrollable">False</property>
+ <property name="enable-popup">False</property>
+ <signal handler="settings_switch_page_cb" name="switch_page"/>
+ <child>
+ <object class="GtkBox" id="settings_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="std_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Standard</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="adv_table">
+ <property name="visible">True</property>
+ <property name="n-rows">4</property>
+ <property name="n-columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row-spacing">20</property>
+ <property name="column-spacing">0</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkLabel" id="cmd_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Command Line:</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">cmd_text</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="cmd_text" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="right-attach">2</property>
+ <property name="top-attach">1</property>
+ <property name="bottom-attach">2</property>
+ <property name="x-options">fill</property>
+ <property name="y-options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="cmd_text">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ <accessibility>
+ <relation target="cmd_label" type="labelled-by"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="right-attach">2</property>
+ <property name="top-attach">2</property>
+ <property name="bottom-attach">3</property>
+ <property name="y-options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="visual_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="visual">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Visual:</property>
+ <property name="use-underline">True</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">3</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic-widget">visual_combo</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="visual_combo" type="label-for"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkListStore" id="visual_combo_model">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Any</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Best</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Default</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Default-N</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">GL</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">TrueColor</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">PseudoColor</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">StaticGray</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">GrayScale</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">DirectColor</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Color</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Gray</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Mono</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkComboBox" id="visual_combo">
+ <property name="has-entry">False</property>
+ <property name="visible">True</property>
+ <property name="model">visual_combo_model</property>
+ <accessibility>
+ <relation target="visual" type="labelled-by"/>
+ </accessibility>
+ <child>
+ <object class="GtkEntry" id="visual_entry">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max-length">0</property>
+ <property name="text" translatable="yes"/>
+ <property name="has-frame">True</property>
+ <property name="invisible-char">*</property>
+ <property name="activates-default">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="right-attach">2</property>
+ <property name="top-attach">3</property>
+ <property name="bottom-attach">4</property>
+ <property name="x-options">fill</property>
+ <property name="y-options">fill</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="adv_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Advanced</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="tab-expand">False</property>
+ <property name="tab-fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Settings</property>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <relation target="opt_frame" type="label-for"/>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="doc_frame">
+ <property name="visible">True</property>
+ <property name="label-xalign">0</property>
+ <property name="label-yalign">0</property>
+ <property name="shadow-type">GTK_SHADOW_NONE</property>
+ <child>
+ <object class="GtkBox" id="doc_vbox">
+ <property name="border-width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="doc">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">True</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+ <property name="orientation">horizontal</property>
+ <property name="margin-top">12</property>
+ <child>
+ <object class="GtkButton" id="manual">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="label" translatable="yes">_Documentation...</property>
+ <property name="use-underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus-on-click">True</property>
+ <signal handler="manual_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack-type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"/>
+ <property name="use-underline">False</property>
+ <property name="use-markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width-chars">-1</property>
+ <property name="single-line-mode">False</property>
+ <property name="angle">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">adv_button</action-widget>
+ <action-widget response="0">std_button</action-widget>
+ <action-widget response="0">reset_button</action-widget>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ </template>
+</interface>
diff --git a/driver/prefsw.c b/driver/prefsw.c
index 2bbf94f..c5b4b2d 100644
--- a/driver/prefsw.c
+++ b/driver/prefsw.c
@@ -1,5 +1,5 @@
/* prefs.c --- reading and writing the ~/.xscreensaver file.
- * xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1998-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -80,22 +80,6 @@ chase_symlinks (const char *file)
}
-static Bool
-i_am_a_nobody (uid_t uid)
-{
- struct passwd *p;
-
- p = getpwnam ("nobody");
- if (! p) p = getpwnam ("noaccess");
- if (! p) p = getpwnam ("daemon");
-
- if (! p) /* There is no nobody? */
- return False;
-
- return (uid == p->pw_uid);
-}
-
-
const char *
init_file_name (void)
{
@@ -103,32 +87,7 @@ init_file_name (void)
if (!file)
{
- uid_t uid = getuid ();
const char *home = getenv("HOME");
-
- if (i_am_a_nobody (uid) || !home || !*home)
- {
- /* If we're running as nobody, then use root's .xscreensaver file
- (since ~root/.xscreensaver and ~nobody/.xscreensaver are likely
- to be different -- without this, xscreensaver-settings would
- appear to have no effect when the luser is running as root.)
- */
- struct passwd *p = getpwuid (uid);
- if (!p || !p->pw_name || !*p->pw_name)
- {
- fprintf (stderr, "%s: couldn't get user info of uid %d\n",
- blurb(), getuid ());
- }
- else if (!p->pw_dir || !*p->pw_dir)
- {
- fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n",
- blurb(), (p->pw_name ? p->pw_name : "???"));
- }
- else
- {
- home = p->pw_dir;
- }
- }
if (home && *home)
{
const char *name = ".xscreensaver";
@@ -155,32 +114,29 @@ static const char *
init_file_tmp_name (void)
{
static char *file = 0;
- if (!file)
- {
- const char *name = init_file_name();
- const char *suffix = ".tmp";
-
- char *n2 = chase_symlinks (name);
- if (n2) name = n2;
+ const char *name = init_file_name();
+ char *n2 = chase_symlinks (name);
+ if (n2) name = n2;
- if (!name || !*name)
- file = "";
- else
- {
- file = (char *) malloc(strlen(name) + strlen(suffix) + 2);
- strcpy(file, name);
- strcat(file, suffix);
- }
+ if (file) free (file);
- if (n2) free (n2);
+ if (!name || !*name)
+ file = 0;
+ else
+ {
+ file = (char *) malloc(strlen(name) + 20);
+ sprintf (file, "%s.%08lX", name, (random() % 0xFFFFFFFF));
}
+ if (n2) free (n2);
+
if (file && *file)
return file;
else
return 0;
}
+
static const char * const prefs[] = {
"timeout",
"cycle",
@@ -226,6 +182,7 @@ static const char * const prefs[] = {
"textProgram",
"textURL",
"dialogTheme",
+ "settingsGeom",
"",
"programs",
"",
@@ -293,7 +250,7 @@ static void line_handler (int lineno,
{
struct parser_closure *c = (struct parser_closure *) closure;
saver_preferences *p = c->prefs;
- if (!p->db) abort();
+ if (!p->db) return; /* Not X11, Wayland */
handle_entry (&p->db, key, val, c->file, lineno);
}
@@ -506,8 +463,6 @@ write_init_file (Display *dpy,
*/
char *visual_name;
char *programs;
- Bool overlay_stderr_p;
- char *stderr_font;
FILE *out;
if (!name) goto END;
@@ -535,9 +490,7 @@ write_init_file (Display *dpy,
/* Give the new .xscreensaver file the same permissions as the old one;
except ensure that it is readable and writable by owner, and not
- executable. Extra hack: if we're running as root, make the file
- be world-readable (so that the daemon, running as "nobody", will
- still be able to read it.)
+ executable.
*/
if (stat(name, &st) == 0)
{
@@ -545,9 +498,6 @@ write_init_file (Display *dpy,
mode |= S_IRUSR | S_IWUSR; /* read/write by user */
mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* executable by none */
- if (getuid() == (uid_t) 0) /* read by group/other */
- mode |= S_IRGRP | S_IROTH;
-
if (fchmod (fileno(out), mode) != 0)
{
char *buf = (char *) malloc(1024 + strlen(name));
@@ -559,11 +509,9 @@ write_init_file (Display *dpy,
}
}
- /* Kludge, since these aren't in the saver_preferences struct... */
+ /* Kludge, since this isn't in the saver_preferences struct... */
visual_name = get_string_resource (dpy, "visualID", "VisualID");
programs = 0;
- overlay_stderr_p = get_boolean_resource (dpy, "overlayStderr", "Boolean");
- stderr_font = get_string_resource (dpy, "font", "Font");
i = 0;
{
@@ -646,6 +594,7 @@ write_init_file (Display *dpy,
CHECK("loadURL") continue; /* don't save */
CHECK("newLoginCommand") continue; /* don't save */
CHECK("dialogTheme") type = pref_str, s = p->dialog_theme;
+ CHECK("settingsGeom") type = pref_str, s = p->settings_geom;
CHECK("nice") type = pref_int, i = p->nice_inferior;
CHECK("memoryLimit") continue; /* don't save */
CHECK("fade") type = pref_bool, b = p->fade_p;
@@ -657,8 +606,6 @@ write_init_file (Display *dpy,
CHECK("ignoreUninstalledPrograms")
type = pref_bool, b = p->ignore_uninstalled_p;
- CHECK("font") type = pref_str, s = stderr_font;
-
CHECK("dpmsEnabled") type = pref_bool, b = p->dpms_enabled_p;
CHECK("dpmsQuickOff") type = pref_bool, b = p->dpms_quickoff_p;
CHECK("dpmsStandby") type = pref_time, t = p->dpms_standby;
@@ -692,7 +639,8 @@ write_init_file (Display *dpy,
CHECK("programs") type = pref_str, s = programs;
CHECK("pointerHysteresis")type = pref_int, i = p->pointer_hysteresis;
- CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p;
+ CHECK("font") continue; /* don't save */
+ CHECK("overlayStderr") continue; /* don't save */
CHECK("overlayTextBackground") continue; /* don't save */
CHECK("overlayTextForeground") continue; /* don't save */
CHECK("bourneShell") continue; /* don't save */
@@ -759,7 +707,6 @@ write_init_file (Display *dpy,
fprintf(out, "\n");
if (visual_name) free(visual_name);
- if (stderr_font) free(stderr_font);
if (programs) free(programs);
if (fclose(out) == 0)
@@ -889,9 +836,6 @@ load_init_file (Display *dpy, saver_preferences *p)
p->install_cmap_p = get_boolean_resource (dpy, "installColormap", "Boolean");
p->nice_inferior = get_integer_resource (dpy, "nice", "Nice");
p->splash_p = get_boolean_resource (dpy, "splash", "Boolean");
-# ifdef QUAD_MODE
- p->quad_p = get_boolean_resource (dpy, "quad", "Boolean");
-# endif
p->ignore_uninstalled_p = get_boolean_resource (dpy,
"ignoreUninstalledPrograms",
"Boolean");
@@ -929,6 +873,7 @@ load_init_file (Display *dpy, saver_preferences *p)
p->new_login_command = get_string_resource(dpy, "newLoginCommand",
"Command");
p->dialog_theme = get_string_resource(dpy, "dialogTheme", "String");
+ p->settings_geom = get_string_resource(dpy, "settingsGeom", "String");
p->auth_warning_slack = get_integer_resource(dpy, "authWarningSlack",
"Integer");
@@ -1138,7 +1083,7 @@ format_command (const char *cmd, Bool wrap_p)
{
int tab = 30;
int col = tab;
- char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 1));
+ char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 10));
const char *in = cmd;
char *out = cmd2;
while (*in)
@@ -1175,6 +1120,14 @@ format_command (const char *cmd, Bool wrap_p)
while (out > cmd2 && isspace (out[-1]))
*(--out) = 0;
+ /* In version 6.05, the defaults were changed from "-root" to "--root".
+ If anything in .xscreensaver still ends with "-root", silently change
+ it, so that the "Reset to Defaults" button is enabled/disabled as
+ appropriate, and doesn't think the command differs from the default.
+ */
+ if (out > cmd2+7 && !strcmp (out-6, " -root"))
+ strcpy (out-6, " --root"); /* malloc had enough slack */
+
return cmd2;
}
@@ -1387,36 +1340,29 @@ stop_the_insanity (saver_preferences *p)
p->fade_p = False;
if (! p->fade_p) p->unfade_p = False;
- /* The DPMS settings may have the value 0.
- But if they are negative, or are a range less than 10 seconds,
- reset them to sensible defaults. (Since that must be a mistake.)
- */
- if (p->dpms_standby != 0 &&
- p->dpms_standby < 10 * 1000)
- p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */
- if (p->dpms_suspend != 0 &&
- p->dpms_suspend < 10 * 1000)
- p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */
- if (p->dpms_off != 0 &&
- p->dpms_off < 10 * 1000)
- p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */
-
- /* suspend may not be greater than off, unless off is 0.
- standby may not be greater than suspend, unless suspend is 0.
- */
- if (p->dpms_off != 0 &&
- p->dpms_suspend > p->dpms_off)
- p->dpms_suspend = p->dpms_off;
- if (p->dpms_suspend != 0 &&
- p->dpms_standby > p->dpms_suspend)
- p->dpms_standby = p->dpms_suspend;
-
- /* These fixes above ignores the case
- suspend = 0 and standby > off ...
+ /* DPMS settings may be zero, but otherwise, if they < 10 sec or negative,
+ set them to 2 minutes. */
+# define THROTTLE(FIELD) \
+ if (p->FIELD != 0 && ((long) p->FIELD) < 10 * 1000) \
+ p->FIELD = 2 * 60 * 60 * 1000
+ THROTTLE (dpms_standby);
+ THROTTLE (dpms_suspend);
+ THROTTLE (dpms_off);
+# undef THROTTLE
+
+ /* If the DPMS settings are non-zero, they must not go backwards:
+ standby >= timeout (screen saver activation)
+ suspend >= standby
+ off >= suspend
*/
- if (p->dpms_off != 0 &&
- p->dpms_standby > p->dpms_off)
- p->dpms_standby = p->dpms_off;
+# define THROTTLE(FIELD,LOWER) \
+ if (p->FIELD != 0 && ((long) p->FIELD) < ((long) p->LOWER)) \
+ p->FIELD = p->LOWER
+ THROTTLE (dpms_standby, timeout);
+ THROTTLE (dpms_suspend, dpms_standby);
+ THROTTLE (dpms_off, dpms_standby);
+ THROTTLE (dpms_off, dpms_suspend);
+#undef THROTTLE
if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */
p->dpms_suspend == 0 &&
@@ -1437,119 +1383,3 @@ stop_the_insanity (saver_preferences *p)
if (p->auth_warning_slack < 0) p->auth_warning_slack = 0;
if (p->auth_warning_slack > 300) p->auth_warning_slack = 300;
}
-
-
-Bool
-senescent_p (void)
-{
- /* If you are in here because you're planning on disabling this warning
- before redistributing my software, please don't.
-
- I sincerely request that you do one of the following:
-
- 1: leave this code intact and this warning in place, -OR-
-
- 2: Remove xscreensaver from your distribution.
-
- I would seriously prefer that you not distribute my software at all
- than that you distribute one version and then never update it for
- years.
-
- I am *constantly* getting email from users reporting bugs that have
- been fixed for literally years who have no idea that the software
- they are running is years out of date. Yes, it would be great if we
- lived in the ideal world where people checked that they were running
- the latest release before they report a bug, but we don't. To most
- people, "running the latest release" is synonymous with "running the
- latest release that my distro packages for me."
-
- When they even bother to tell me what version they're running, I
- say, "That version is three years old!", and they say "But this is
- the latest version my distro ships". Then I say, "your distro
- sucks", and they say "but I don't know how to compile from source,
- herp derp I eat paste", and *everybody* goes away unhappy.
-
- It wastes an enormous amount of my time, but worse than that, it
- does a grave disservice to the users, who are stuck experiencing
- bugs that are already fixed! These users think they are running the
- latest release, and they are not. They would like to be running the
- actual latest release, but they don't know how, because their distro
- makes that very difficult for them. It's terrible for everyone, and
- kind of makes me regret ever having released this software in the
- first place.
-
- So seriously. I ask that if you're planning on disabling this
- obsolescence warning, that you instead just remove xscreensaver from
- your distro entirely. Everybody will be happier that way. Check
- out gnome-screensaver instead, I understand it's really nice.
-
- Of course, my license allows you to ignore me and do whatever the
- fuck you want, but as the author, I hope you will have the common
- courtesy of complying with my request.
-
- Thank you!
-
- jwz, 2014, 2016, 2018, 2021.
-
- PS: In particular, since Debian refuses to upgrade software on any
- kind of rational timeline, I have asked that they stop shipping
- xscreensaver at all. They have refused. Instead of upgrading the
- software, they simply patched out this warning.
-
- If you want to witness the sad state of the open source peanut
- gallery, look no farther than the comments on my blog:
- http://jwz.org/b/yiYo
-
- Many of these people fall back on their go-to argument of, "If it is
- legal, it must be right." If you believe in that rhetorical device
- then you are a terrible person, and possibly a sociopath.
-
- There are also the armchair lawyers who say "Well, instead of
- *asking* people to do the right thing out of common courtesy, you
- should just change your license to prohibit them from acting
- amorally." Again, this is the answer of a sociopath, but that aside,
- if you devote even a second's thought to this you will realize that
- the end result of this would be for distros like Debian to just keep
- shipping the last version with the old license and then never
- upgrading it again -- which would be the worst possible outcome for
- everyone involved, most especially the users.
-
- Also, some have incorrectly characterized this as a "time bomb".
- It is a software update notification, nothing more. A "time bomb"
- makes software stop working. This merely alerts the user that the
- security-critical software that they are running is dangerously out
- of date.
- */
-
- time_t now = time ((time_t *) 0); /* d */
- struct tm *tm = localtime (&now); /* o */
- const char *s = screensaver_id; /* n */
- char mon[4], year[5]; /* ' */
- int m, y, mrnths; /* t */
- s = strchr (s, ' '); if (!s) abort(); s++; /* */
- s = strchr (s, '('); if (!s) abort(); s++; /* d */
- s = strchr (s, '-'); if (!s) abort(); s++; /* o */
- strncpy (mon, s, 3); /* o */
- mon[3] = 0; /* */
- s = strchr (s, '-'); if (!s) abort(); s++; /* e */
- strncpy (year, s, 4); /* e */
- year[4] = 0; /* t */
- y = atoi (year); /* , */
- if (!strcmp(mon, "Jan")) m = 0; /* */
- else if (!strcmp(mon, "Feb")) m = 1; /* s */
- else if (!strcmp(mon, "Mar")) m = 2; /* t */
- else if (!strcmp(mon, "Apr")) m = 3; /* o */
- else if (!strcmp(mon, "May")) m = 4; /* p */
- else if (!strcmp(mon, "Jun")) m = 5; /* , */
- else if (!strcmp(mon, "Jul")) m = 6; /* */
- else if (!strcmp(mon, "Aug")) m = 7; /* s */
- else if (!strcmp(mon, "Sep")) m = 8; /* t */
- else if (!strcmp(mon, "Oct")) m = 9; /* a */
- else if (!strcmp(mon, "Nov")) m = 10; /* a */
- else if (!strcmp(mon, "Dec")) m = 11; /* a */
- else abort(); /* h */
- mrnths = ((((tm->tm_year + 1900) * 12) + tm->tm_mon) - /* h */
- (y * 12 + m)); /* h */
- /* p */
- return (mrnths >= 17); /* . */
-}
diff --git a/driver/remote.c b/driver/remote.c
index 123bc28..ee1e6f2 100644
--- a/driver/remote.c
+++ b/driver/remote.c
@@ -1,4 +1,4 @@
-/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2024 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -80,9 +80,14 @@ reset_dpms_timer (Display *dpy)
if (!enabled)
goto DONE;
- /* Do this even if power == DPMSModeOn to reset the timer */
DPMSForceLevel (dpy, DPMSModeOn);
+ /* We want to reset the timer inside the X server. DPMSForceLevel doesn't
+ do that if the monitor was already powered on: it keeps counting down.
+ But disabling and re-enabling seems to do the trick. */
+ DPMSDisable (dpy);
+ DPMSEnable (dpy);
+
DONE:
XSync (dpy, False);
XSetErrorHandler (old_handler);
diff --git a/driver/screens.c b/driver/screens.c
index dc87e51..7252e5e 100644
--- a/driver/screens.c
+++ b/driver/screens.c
@@ -1,5 +1,5 @@
/* screens.c --- dealing with RANDR, Xinerama, and VidMode Viewports.
- * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -27,7 +27,7 @@
* another. The mouse can be moved from one screen to another, though.
* Screens may be different depths (e.g., one can be TrueColor and one
* can be PseudoColor.) Screens cannot be resized or moved without
- * restarting X.
+ * restarting X. Sometimes this mode is referred to as "ZaphodHeads".
*
* Everyone hates this way of doing things because of the inability to
* move a window from one screen to another without restarting the
@@ -43,7 +43,7 @@
* middle of the screen actually spanning the gap between two
* monitors.)
*
- * Xinerama didn't? work with DRI, which means that Xinerama precluded
+ * Xinerama didn't work with DRI, which means that Xinerama precluded
* hardware acceleration in OpenGL programs. Also, screens couldn't
* be resized or moved without restarting X.
*
@@ -51,14 +51,14 @@
*
* No longer supported as of XScreenSaver 6.
*
- * With this extension, the root window can be bigger than the
- * monitor. Moving the mouse near the edges of the screen scrolls
- * around, like a pan-and-scan movie. There was also a hot-key for
- * changing the monitor's resolution (zooming in/out).
+ * With this extension, the root window could be bigger than the
+ * monitor. Moving the mouse near the edges of the screen would
+ * scroll around, like a pan-and-scan movie. There was also a
+ * hot-key for changing the monitor's resolution (zooming in/out).
*
- * Trying to combine this with Xinerama crashes the server, so you
- * could only use this if you had only a single screen, or were in old
- * multi-screen mode.
+ * Trying to combine this with Xinerama crashed the server, so you
+ * could ONLY use this if you had only a single screen, or were in
+ * old multi-screen mode.
*
* Also, half the time it didn't work at all: it tended to lie about
* the size of the rectangle in use.
@@ -154,6 +154,27 @@ free_monitors (monitor **monitors)
}
+static monitor **
+append_monitors (monitor **a, monitor **b)
+{
+ int na = 0, nb = 0, i;
+ if (!b) return a;
+ if (!a) return b;
+
+ while (a[na]) na++;
+ while (b[nb]) nb++;
+
+ a = (monitor **) realloc (a, sizeof(*a) * (na + nb + 1));
+ if (!a) return b; /* If this happens, the end is nigh */
+
+ for (i = 0; i < nb; i++)
+ a[na++] = b[i];
+ a[na] = 0;
+ free (b);
+ return a;
+}
+
+
static char *
append (char *s1, const char *s2)
{
@@ -187,12 +208,34 @@ xinerama_scan_monitors (Display *dpy, char **errP)
xsi = XineramaQueryScreens (dpy, &nscreens);
if (!xsi) return 0;
+ if (nscreens <= 0)
+ {
+ *errP = append (*errP,
+ "WARNING: Xinerama reported no screens! Ignoring it.");
+ /* Fall back to basic X11. */
+ return 0;
+ }
+
monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
- if (!monitors) return 0;
+ if (!monitors)
+ {
+ XFree (xsi);
+ return 0;
+ }
for (i = 0; i < nscreens; i++)
{
monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ char buf[255];
+ if (!m)
+ {
+ free_monitors (monitors);
+ XFree (xsi);
+ return 0;
+ }
+
+ sprintf (buf, "Xinerama-%d", i);
+
monitors[i] = m;
m->id = i;
m->screen = screen;
@@ -200,7 +243,10 @@ xinerama_scan_monitors (Display *dpy, char **errP)
m->y = xsi[i].y_org;
m->width = xsi[i].width;
m->height = xsi[i].height;
+ m->desc = strdup (buf);
}
+
+ XFree (xsi);
return monitors;
}
@@ -222,12 +268,16 @@ randr_scan_monitors (Display *dpy, char **errP)
return 0;
if (! (major > 1 || (major == 1 && minor >= 2)))
- return 0; /* 1.2 ir newer is required */
+ return 0; /* 1.2 or newer is required */
/* Add up the virtual screens on each X screen. */
nscreens = 0;
for (i = 0; i < ScreenCount (dpy); i++)
{
+ /* This first time around, use XRRGetScreenResources and not
+ XRRGetScreenResourcesCurrent to make sure we are polling the
+ actual hardware and populating the server's cache.
+ */
XRRScreenResources *res =
XRRGetScreenResources (dpy, RootWindow (dpy, i));
nscreens += res->noutput;
@@ -238,6 +288,7 @@ randr_scan_monitors (Display *dpy, char **errP)
{
*errP = append (*errP,
"WARNING: RANDR reported no screens! Ignoring it.");
+ /* Fall back to Xinerama or basic X11. */
return 0;
}
@@ -246,23 +297,50 @@ randr_scan_monitors (Display *dpy, char **errP)
for (i = 0, j = 0; i < ScreenCount (dpy); i++)
{
+ /* This second time around, we can use use XRRGetScreenResourcesCurrent
+ instead of XRRGetScreenResources, since we just polled the hardware
+ and populated the cache, above. Sometimes XRRGetScreenResources is
+ slow, and can delay the mapping of the unlock dialog by a full second
+ or longer. Cutting the number of calls to it in half helps.
+ */
Screen *screen = ScreenOfDisplay (dpy, i);
int k;
XRRScreenResources *res =
- XRRGetScreenResources (dpy, RootWindowOfScreen (screen));
+ XRRGetScreenResourcesCurrent (dpy, RootWindowOfScreen (screen));
+ if (!res)
+ {
+ free_monitors (monitors);
+ return 0;
+ }
+
for (k = 0; k < res->noutput; k++, j++)
{
monitor *m = (monitor *) calloc (1, sizeof (monitor));
- XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res,
- res->outputs[k]);
- RRCrtc crtc = (rroi->crtc ? rroi->crtc :
- rroi->ncrtc ? rroi->crtcs[0] : 0);
+ XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, res->outputs[k]);
+ RRCrtc crtc = (rroi && rroi->crtc ? rroi->crtc :
+ rroi && rroi->ncrtc ? rroi->crtcs[0] : 0);
XRRCrtcInfo *crtci = (crtc ? XRRGetCrtcInfo(dpy, res, crtc) : 0);
+ char buf[255];
+
+ if (!m)
+ {
+ free_monitors (monitors);
+ if (crtci)
+ XRRFreeCrtcInfo (crtci);
+ if (rroi)
+ XRRFreeOutputInfo (rroi);
+ XRRFreeScreenResources (res);
+ return 0;
+ }
+
+ sprintf (buf, "RANDR-%d.%d", i, k);
monitors[j] = m;
m->screen = screen;
m->id = (i * 1000) + j;
- m->desc = (rroi->name ? strdup (rroi->name) : 0);
+ m->desc = (rroi && rroi->name
+ ? strdup (rroi->name)
+ : strdup (buf));
if (crtci)
{
@@ -275,13 +353,14 @@ randr_scan_monitors (Display *dpy, char **errP)
m->height = crtci->height;
}
- if (rroi->connection == RR_Disconnected)
+ if (!rroi || rroi->connection == RR_Disconnected)
m->sanity = S_DISABLED;
/* #### do the same for RR_UnknownConnection? */
if (crtci)
XRRFreeCrtcInfo (crtci);
- XRRFreeOutputInfo (rroi);
+ if (rroi)
+ XRRFreeOutputInfo (rroi);
}
XRRFreeScreenResources (res);
}
@@ -299,7 +378,9 @@ randr_scan_monitors (Display *dpy, char **errP)
if (! ok)
{
*errP = append (*errP,
- "WARNING: RANDR says all screens are 0x0! Ignoring it.");
+ (i == 0
+ ? "WARNING: RANDR reports no screens"
+ : "WARNING: RANDR says all screens are 0x0"));
free_monitors (monitors);
monitors = 0;
}
@@ -323,6 +404,15 @@ basic_scan_monitors (Display *dpy, char **errP)
{
Screen *screen = ScreenOfDisplay (dpy, i);
monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ char buf[255];
+ if (!m)
+ {
+ free_monitors (monitors);
+ return 0;
+ }
+
+ sprintf (buf, "Xlib-%d", i);
+
monitors[i] = m;
m->id = i;
m->screen = screen;
@@ -330,6 +420,7 @@ basic_scan_monitors (Display *dpy, char **errP)
m->y = 0;
m->width = WidthOfScreen (screen);
m->height = HeightOfScreen (screen);
+ m->desc = strdup (buf);
}
return monitors;
}
@@ -359,6 +450,9 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors,
char **errP)
{
monitor **xinerama_monitors;
+ int randr_count = 0;
+ int xinerama_count = 0;
+ char buf[1024];
if (!randr_monitors)
return 0;
@@ -369,22 +463,33 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors,
if (! monitor_layouts_differ_p (randr_monitors, xinerama_monitors))
{
+ *errP = append (*errP, "RANDR and Xinerama agree");
free_monitors (xinerama_monitors);
return randr_monitors;
}
- else if ( randr_monitors[0] && !randr_monitors[1] && /* 1 monitor */
- xinerama_monitors[0] && xinerama_monitors[1]) /* >1 monitor */
+
+ while (randr_monitors[randr_count])
+ randr_count++;
+ while (xinerama_monitors[xinerama_count])
+ xinerama_count++;
+
+ if (randr_count == xinerama_count)
+ strcpy (buf, "RANDR and Xinerama differ");
+ else
+ sprintf (buf, "RANDR screens: %d, Xinerama: %d",
+ randr_count, xinerama_count);
+
+ if (xinerama_count > randr_count)
{
- *errP = append (*errP,
- "WARNING: RANDR reports 1 screen but Xinerama\n"
- " reports multiple. Believing Xinerama.");
+ strcat (buf, "; believing Xinerama");
+ *errP = append (*errP, buf);
free_monitors (randr_monitors);
return xinerama_monitors;
}
else
{
- *errP = append (*errP, /* This is "normal" now, I guess. */
- "RANDR and Xinerama report different screen layouts");
+ strcat (buf, "; believing RANDR");
+ *errP = append (*errP, buf);
free_monitors (xinerama_monitors);
return randr_monitors;
}
@@ -445,43 +550,6 @@ debug_scan_monitors (Display *dpy, char **errP)
#endif /* DEBUG_MULTISCREEN */
-#ifdef QUAD_MODE
-static monitor **
-quadruple (monitor **monitors, Bool debug_p, char **errP)
-{
- int i, j, count = 0;
- monitor **monitors2;
- while (monitors[count])
- count++;
- monitors2 = (monitor **) calloc (count * 4 + 1, sizeof(*monitors));
- if (!monitors2) abort();
-
- for (i = 0, j = 0; i < count; i++)
- {
- int k;
- for (k = 0; k < 4; k++)
- {
- monitors2[j+k] = (monitor *) calloc (1, sizeof (monitor));
- *monitors2[j+k] = *monitors[i];
- monitors2[j+k]->width /= (debug_p ? 4 : 2);
- monitors2[j+k]->height /= 2;
- monitors2[j+k]->id = (monitors[i]->id * 4) + k;
- monitors2[j+k]->name = (monitors[i]->name
- ? strdup (monitors[i]->name) : 0);
- }
- monitors2[j+1]->x += monitors2[j]->width;
- monitors2[j+2]->y += monitors2[j]->height;
- monitors2[j+3]->x += monitors2[j]->width;
- monitors2[j+3]->y += monitors2[j]->height;
- j += 4;
- }
-
- free_monitors (monitors);
- return monitors2;
-}
-#endif /* QUAD_MODE */
-
-
monitor **
scan_monitors (Display *dpy)
{
@@ -506,10 +574,31 @@ scan_monitors (Display *dpy)
if (! monitors) monitors = basic_scan_monitors (dpy, &err);
-# ifdef QUAD_MODE
- if (p->quad_p)
- monitors = quadruple (monitors, p->debug_p, &err);
-# endif
+ if (monitors)
+ {
+ int count = 0;
+ int good_count = 0;
+
+ check_monitor_sanity (monitors);
+ while (monitors[count])
+ {
+ if (monitors[count]->sanity == S_SANE)
+ good_count++;
+ count++;
+ }
+
+ if (good_count == 0)
+ {
+ monitor **m2 = basic_scan_monitors (dpy, &err);
+ err = append(err, "No usable screens! Falling back to root window");
+ /* Append the fallback monitors to the old, bad ones so that
+ describe_monitor_layout() still describes the monitors that
+ were rejected. Don't call check_monitor_sanity(m2) to leave
+ the new ones marked as sane.
+ */
+ monitors = append_monitors (monitors, m2);
+ }
+ }
if (monitors && *monitors && err) monitors[0]->err = err;
@@ -667,7 +756,8 @@ monitor_layouts_differ_p (monitor **a, monitor **b)
(*a)->x != (*b)->x ||
(*a)->y != (*b)->y ||
(*a)->width != (*b)->width ||
- (*a)->height != (*b)->height)
+ (*a)->height != (*b)->height ||
+ (*a)->sanity != (*b)->sanity)
return True;
a++;
b++;
@@ -711,9 +801,10 @@ describe_monitor_layout (monitor **monitors)
if (monitors && *monitors && monitors[0]->err) /* deferred error msg */
{
char *token = strtok (monitors[0]->err, "\n");
+ const char *b = blurb();
while (token)
{
- fprintf (stderr, "%s: %s\n", blurb(), token);
+ fprintf (stderr, "%s: %s\n", b, token);
token = strtok (0, "\n");
}
free (monitors[0]->err);
@@ -725,12 +816,12 @@ describe_monitor_layout (monitor **monitors)
else
{
int i;
- fprintf (stderr, "%s: screens in use: %d\n", blurb(), good_count);
+ fprintf (stderr, "%s: screens in use: %d\n", blurb(), good_count);
for (i = 0; i < count; i++)
{
monitor *m = monitors[i];
if (m->sanity != S_SANE) continue;
- fprintf (stderr, "%s: %3d/%d: %dx%d+%d+%d",
+ fprintf (stderr, "%s: %3d/%d: %dx%d+%d+%d",
blurb(), m->id, screen_number (m->screen),
m->width, m->height, m->x, m->y);
if (m->desc && *m->desc) fprintf (stderr, " (%s)", m->desc);
@@ -738,13 +829,13 @@ describe_monitor_layout (monitor **monitors)
}
if (bad_count > 0)
{
- fprintf (stderr, "%s: rejected screens: %d\n", blurb(), bad_count);
+ fprintf (stderr, "%s: rejected screens: %d\n", blurb(), bad_count);
for (i = 0; i < count; i++)
{
monitor *m = monitors[i];
monitor *e = monitors[m->enemy];
if (m->sanity == S_SANE) continue;
- fprintf (stderr, "%s: %3d/%d: %dx%d+%d+%d",
+ fprintf (stderr, "%s: %3d/%d: %dx%d+%d+%d",
blurb(), m->id, screen_number (m->screen),
m->width, m->height, m->x, m->y);
if (m->desc && *m->desc) fprintf (stderr, " (%s)", m->desc);
@@ -777,10 +868,8 @@ describe_monitor_layout (monitor **monitors)
if (implausible_p)
fprintf (stderr,
- "%s: WARNING: single screen aspect ratio is %dx%d = %.2f\n"
- "%s: probable X server bug in Xinerama/RANDR!\n",
- blurb(), monitors[0]->width, monitors[0]->height,
- monitors[0]->width / (double) monitors[0]->height,
- blurb());
+ "%s: implausible single screen aspect ratio %.2f\n",
+ blurb(),
+ monitors[0]->width / (double) monitors[0]->height);
}
}
diff --git a/driver/screensaver-properties.desktop.in b/driver/screensaver-properties.desktop.in
deleted file mode 100644
index 9cc17e6..0000000
--- a/driver/screensaver-properties.desktop.in
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Exec=xscreensaver-settings
-Icon=xscreensaver
-Terminal=false
-_Name=Screensaver
-_Comment=Change screensaver properties
-Type=Application
-Categories=Settings;DesktopSettings;Security;X-XFCE;
diff --git a/driver/stderr.c b/driver/stderr.c
deleted file mode 100644
index 84fa697..0000000
--- a/driver/stderr.c
+++ /dev/null
@@ -1,560 +0,0 @@
-/* stderr.c --- capturing stdout/stderr output onto the screensaver window.
- * xscreensaver, Copyright (c) 1991-2016 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* stderr hackery - Why Unix Sucks, reason number 32767.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-
-#include <stdio.h>
-#include <time.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL
-# include <fcntl.h>
-#endif
-
-#include <X11/Intrinsic.h>
-
-#include "xscreensaver.h"
-#include "resources.h"
-#include "visual.h"
-
-FILE *real_stderr = 0;
-FILE *real_stdout = 0;
-
-
-/* It's ok for these to be global, since they refer to the one and only
- stderr stream, not to a particular screen or window or visual.
- */
-static char stderr_buffer [4096];
-static char *stderr_tail = 0;
-static time_t stderr_last_read = 0;
-
-static int stderr_stdout_read_fd = -1;
-
-static void make_stderr_overlay_window (saver_screen_info *);
-
-
-/* Recreates the stderr window or GCs: do this when the xscreensaver window
- on a screen has been re-created.
- */
-void
-reset_stderr (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
-
- if (si->prefs.debug_p)
- fprintf ((real_stderr ? real_stderr : stderr),
- "%s: resetting stderr\n", blurb());
-
- ssi->stderr_text_x = 0;
- ssi->stderr_text_y = 0;
-
- if (ssi->stderr_gc)
- XFreeGC (si->dpy, ssi->stderr_gc);
- ssi->stderr_gc = 0;
-
- if (ssi->stderr_overlay_window)
- XDestroyWindow(si->dpy, ssi->stderr_overlay_window);
- ssi->stderr_overlay_window = 0;
-
- if (ssi->stderr_cmap)
- XFreeColormap(si->dpy, ssi->stderr_cmap);
- ssi->stderr_cmap = 0;
-}
-
-/* Erases any stderr text overlaying the screen (if possible) and resets
- the stderr output cursor to the upper left. Do this when the xscreensaver
- window is cleared.
- */
-void
-clear_stderr (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- ssi->stderr_text_x = 0;
- ssi->stderr_text_y = 0;
- if (ssi->stderr_overlay_window)
- XClearWindow (si->dpy, ssi->stderr_overlay_window);
-}
-
-
-/* Draws the string on the screen's window.
- */
-static void
-print_stderr_1 (saver_screen_info *ssi, char *string)
-{
- saver_info *si = ssi->global;
- Display *dpy = si->dpy;
- Screen *screen = ssi->screen;
- Window window = (ssi->stderr_overlay_window ?
- ssi->stderr_overlay_window :
- ssi->screensaver_window);
- int h_border = 20;
- int v_border = 20;
- char *head = string;
- char *tail;
-
- if (! ssi->stderr_font)
- {
- char *font_name = get_string_resource (dpy, "font", "Font");
- if (!font_name) font_name = strdup ("fixed");
- ssi->stderr_font = XLoadQueryFont (dpy, font_name);
- if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed");
- ssi->stderr_line_height = (ssi->stderr_font->ascent +
- ssi->stderr_font->descent);
- free (font_name);
- }
-
- if (! ssi->stderr_gc)
- {
- XGCValues gcv;
- Pixel fg, bg;
- Colormap cmap = ssi->cmap;
-
- if (!ssi->stderr_overlay_window &&
- get_boolean_resource(dpy, "overlayStderr", "Boolean"))
- {
- make_stderr_overlay_window (ssi);
- if (ssi->stderr_overlay_window)
- window = ssi->stderr_overlay_window;
- if (ssi->stderr_cmap)
- cmap = ssi->stderr_cmap;
- }
-
- fg = get_pixel_resource (dpy,cmap,"overlayTextForeground","Foreground");
- bg = get_pixel_resource (dpy,cmap,"overlayTextBackground","Background");
- gcv.font = ssi->stderr_font->fid;
- gcv.foreground = fg;
- gcv.background = bg;
- ssi->stderr_gc = XCreateGC (dpy, window,
- (GCFont | GCForeground | GCBackground),
- &gcv);
- }
-
-
- if (ssi->stderr_cmap)
- XInstallColormap(si->dpy, ssi->stderr_cmap);
-
- for (tail = string; *tail; tail++)
- {
- if (*tail == '\n' || *tail == '\r')
- {
- int maxy = HeightOfScreen (screen) - v_border - v_border;
- if (tail != head)
- XDrawImageString (dpy, window, ssi->stderr_gc,
- ssi->stderr_text_x + h_border,
- ssi->stderr_text_y + v_border +
- ssi->stderr_font->ascent,
- head, tail - head);
- ssi->stderr_text_x = 0;
- ssi->stderr_text_y += ssi->stderr_line_height;
- head = tail + 1;
- if (*tail == '\r' && *head == '\n')
- head++, tail++;
-
- if (ssi->stderr_text_y > maxy - ssi->stderr_line_height)
- {
-#if 0
- ssi->stderr_text_y = 0;
-#else
- int offset = ssi->stderr_line_height * 5;
- XWindowAttributes xgwa;
- XGetWindowAttributes (dpy, window, &xgwa);
-
- XCopyArea (dpy, window, window, ssi->stderr_gc,
- 0, v_border + offset,
- xgwa.width,
- (xgwa.height - v_border - v_border - offset),
- 0, v_border);
- XClearArea (dpy, window,
- 0, xgwa.height - v_border - offset,
- xgwa.width, offset, False);
- ssi->stderr_text_y -= offset;
-#endif
- }
- }
- }
- if (tail != head)
- {
- int direction, ascent, descent;
- XCharStruct overall;
- XDrawImageString (dpy, window, ssi->stderr_gc,
- ssi->stderr_text_x + h_border,
- ssi->stderr_text_y + v_border
- + ssi->stderr_font->ascent,
- head, tail - head);
- XTextExtents (ssi->stderr_font, tail, tail - head,
- &direction, &ascent, &descent, &overall);
- ssi->stderr_text_x += overall.width;
- }
-}
-
-static void
-make_stderr_overlay_window (saver_screen_info *ssi)
-{
- saver_info *si = ssi->global;
- unsigned long transparent_pixel = 0;
- Visual *visual = get_overlay_visual (ssi->screen, &transparent_pixel);
- if (visual)
- {
- int depth = visual_depth (ssi->screen, visual);
- XSetWindowAttributes attrs;
- XWindowAttributes xgwa;
- unsigned long attrmask;
- XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
-
- if (si->prefs.debug_p)
- fprintf(real_stderr,
- "%s: using overlay visual 0x%0x for stderr text layer.\n",
- blurb(), (int) XVisualIDFromVisual (visual));
-
- ssi->stderr_cmap = XCreateColormap(si->dpy,
- RootWindowOfScreen(ssi->screen),
- visual, AllocNone);
-
- attrmask = (CWColormap | CWBackPixel | CWBackingPixel | CWBorderPixel |
- CWBackingStore | CWSaveUnder);
- attrs.colormap = ssi->stderr_cmap;
- attrs.background_pixel = transparent_pixel;
- attrs.backing_pixel = transparent_pixel;
- attrs.border_pixel = transparent_pixel;
- attrs.backing_store = NotUseful;
- attrs.save_under = False;
-
- ssi->stderr_overlay_window =
- XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0,
- xgwa.width, xgwa.height,
- 0, depth, InputOutput, visual, attrmask, &attrs);
- XMapRaised(si->dpy, ssi->stderr_overlay_window);
- }
-}
-
-
-/* Draws the string on each screen's window as error text.
- */
-static void
-print_stderr (saver_info *si, char *string)
-{
- saver_preferences *p = &si->prefs;
- int i;
-
- /* In verbose mode, copy it to stderr as well. */
- if (p->verbose_p)
- fprintf (real_stderr, "%s", string);
-
- for (i = 0; i < si->nscreens; i++)
- print_stderr_1 (&si->screens[i], string);
-}
-
-
-/* Polls the stderr buffer every few seconds and if it finds any text,
- writes it on all screens.
- */
-static void
-stderr_popup_timer_fn (XtPointer closure, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- char *s = stderr_buffer;
- if (*s)
- {
- /* If too much data was printed, then something has gone haywire,
- so truncate it. */
- char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n";
- int max = sizeof (stderr_buffer) - strlen (trailer) - 5;
- if (strlen (s) > max)
- strcpy (s + max, trailer);
- /* Now show the user. */
- print_stderr (si, s);
- }
-
- stderr_tail = stderr_buffer;
- si->stderr_popup_timer = 0;
-}
-
-
-/* Called when data becomes available on the stderr pipe. Copies it into
- stderr_buffer where stderr_popup_timer_fn() can find it later.
- */
-static void
-stderr_callback (XtPointer closure, int *fd, XtIntervalId *id)
-{
- saver_info *si = (saver_info *) closure;
- char *s;
- int left;
- int size;
- int read_this_time = 0;
-
- if (!fd || *fd < 0 || *fd != stderr_stdout_read_fd)
- abort();
-
- if (stderr_tail == 0)
- stderr_tail = stderr_buffer;
-
- left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer));
-
- s = stderr_tail;
- *s = 0;
-
- /* Read as much data from the fd as we can, up to our buffer size. */
- if (left > 0)
- {
- while ((size = read (*fd, (void *) s, left)) > 0)
- {
- left -= size;
- s += size;
- read_this_time += size;
- }
- *s = 0;
- }
- else
- {
- char buf2 [1024];
- /* The buffer is full; flush the rest of it. */
- while (read (*fd, (void *) buf2, sizeof (buf2)) > 0)
- ;
- }
-
- stderr_tail = s;
- stderr_last_read = time ((time_t *) 0);
-
- /* Now we have read some data that we would like to put up in a dialog
- box. But more data may still be coming in - so don't pop up the
- dialog right now, but instead, start a timer that will pop it up
- a second from now. Should more data come in in the meantime, we
- will be called again, and will reset that timer again. So the
- dialog will only pop up when a second has elapsed with no new data
- being written to stderr.
-
- However, if the buffer is full (meaning lots of data has been written)
- then we don't reset the timer.
- */
- if (read_this_time > 0)
- {
- if (si->stderr_popup_timer)
- XtRemoveTimeOut (si->stderr_popup_timer);
-
- si->stderr_popup_timer =
- XtAppAddTimeOut (si->app, 1 * 1000, stderr_popup_timer_fn,
- (XtPointer) si);
- }
-}
-
-/* If stderr capturing is desired, this replaces `stdout' and `stderr'
- with a pipe, so that any output written to them will show up on the
- screen as well as on the original value of those streams.
- */
-void
-initialize_stderr (saver_info *si)
-{
- static Boolean done = False;
- int fds [2];
- int in, out;
- int new_stdout, new_stderr;
- int stdout_fd = 1;
- int stderr_fd = 2;
- int flags = 0;
- Boolean stderr_dialog_p;
-
- if (done) return;
- done = True;
-
- real_stderr = stderr;
- real_stdout = stdout;
-
- stderr_dialog_p = get_boolean_resource (si->dpy, "captureStderr", "Boolean");
-
- if (!stderr_dialog_p)
- return;
-
- if (pipe (fds))
- {
- perror ("error creating pipe:");
- return;
- }
-
- in = fds [0];
- out = fds [1];
-
-# ifdef HAVE_FCNTL
-
-# if defined(O_NONBLOCK)
- flags = O_NONBLOCK;
-# elif defined(O_NDELAY)
- flags = O_NDELAY;
-# else
- ERROR!! neither O_NONBLOCK nor O_NDELAY are defined.
-# endif
-
- /* Set both sides of the pipe to nonblocking - this is so that
- our reads (in stderr_callback) will terminate, and so that
- out writes (in the client programs) will silently fail when
- the pipe is full, instead of hosing the program. */
- if (fcntl (in, F_SETFL, flags) != 0)
- {
- perror ("fcntl:");
- return;
- }
- if (fcntl (out, F_SETFL, flags) != 0)
- {
- perror ("fcntl:");
- return;
- }
-
-# endif /* !HAVE_FCNTL */
-
- if (stderr_dialog_p)
- {
- FILE *new_stderr_file;
- FILE *new_stdout_file;
-
- new_stderr = dup (stderr_fd);
- if (new_stderr < 0)
- {
- perror ("could not dup() a stderr:");
- return;
- }
- if (! (new_stderr_file = fdopen (new_stderr, "w")))
- {
- perror ("could not fdopen() the new stderr:");
- return;
- }
- real_stderr = new_stderr_file;
-
- close (stderr_fd);
- if (dup2 (out, stderr_fd) < 0)
- {
- perror ("could not dup() a new stderr:");
- return;
- }
-
-
- new_stdout = dup (stdout_fd);
- if (new_stdout < 0)
- {
- perror ("could not dup() a stdout:");
- return;
- }
- if (! (new_stdout_file = fdopen (new_stdout, "w")))
- {
- perror ("could not fdopen() the new stdout:");
- return;
- }
- real_stdout = new_stdout_file;
-
- close (stdout_fd);
- if (dup2 (out, stdout_fd) < 0)
- {
- perror ("could not dup() a new stdout:");
- return;
- }
- close (out);
- }
-
- stderr_stdout_read_fd = in;
- XtAppAddInput (si->app, in, (XtPointer) XtInputReadMask, stderr_callback,
- (XtPointer) si);
-}
-
-
-/* If the "-log file" command-line option has been specified,
- open the file for append, and redirect stdout/stderr there.
- This is called very early, before initialize_stderr().
- */
-void
-stderr_log_file (saver_info *si)
-{
- int stdout_fd = 1;
- int stderr_fd = 2;
- const char *filename = get_string_resource (si->dpy, "logFile", "LogFile");
- int fd;
-
- if (!filename || !*filename) return;
-
- fd = open (filename, O_WRONLY | O_APPEND | O_CREAT, 0666);
-
- if (fd < 0)
- {
- char buf[255];
- FAIL:
- sprintf (buf, "%.100s: %.100s", blurb(), filename);
- perror (buf);
- fflush (stderr);
- fflush (stdout);
- exit (1);
- }
-
- fprintf (stderr, "%s: logging to file %s\n", blurb(), filename);
-
- if (dup2 (fd, stdout_fd) < 0) goto FAIL;
- if (dup2 (fd, stderr_fd) < 0) goto FAIL;
-
- fprintf (stderr, "\n\n"
- "##########################################################################\n"
- "%s: logging to \"%s\" at %s\n"
- "##########################################################################\n"
- "\n",
- blurb(), filename, timestring(0));
-}
-
-
-/* If there is anything in the stderr buffer, flush it to the real stderr.
- This does no X operations. Call this when exiting to make sure any
- last words actually show up.
- */
-void
-shutdown_stderr (saver_info *si)
-{
- fflush (stdout);
- fflush (stderr);
-
- if (!real_stderr || stderr_stdout_read_fd < 0)
- return;
-
- stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0);
-
- if (stderr_tail &&
- stderr_buffer < stderr_tail)
- {
- *stderr_tail = 0;
- fprintf (real_stderr, "%s", stderr_buffer);
- stderr_tail = stderr_buffer;
- }
-
- if (real_stdout) fflush (real_stdout);
- if (real_stderr) fflush (real_stderr);
-
- if (stdout != real_stdout)
- {
- dup2 (fileno(real_stdout), fileno(stdout));
- fclose (real_stdout);
- real_stdout = stdout;
- }
- if (stderr != real_stderr)
- {
- dup2 (fileno(real_stderr), fileno(stderr));
- fclose (real_stderr);
- real_stderr = stderr;
- }
- if (stderr_stdout_read_fd != -1)
- {
- close (stderr_stdout_read_fd);
- stderr_stdout_read_fd = -1;
- }
-}
diff --git a/driver/subprocs.c b/driver/subprocs.c
index 2b3453d..39b1ddd 100644
--- a/driver/subprocs.c
+++ b/driver/subprocs.c
@@ -1,5 +1,5 @@
/* subprocs.c --- choosing, spawning, and killing screenhacks.
- * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2024 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -53,6 +53,7 @@
#include "yarandom.h"
#include "visual.h" /* for id_to_visual() */
#include "atoms.h"
+#include "screenshot.h"
enum job_status {
@@ -65,6 +66,8 @@ enum job_status {
element will be removed. */
};
+#define EXEC_FAILED_EXIT_STATUS -33
+
struct screenhack_job {
char *name;
pid_t pid;
@@ -461,6 +464,16 @@ xt_sigterm_handler (XtPointer data, XtSignalId *id)
fprintf (stderr, "%s: %s: unblanking\n", blurb(),
signal_name (sigterm_received));
+ /* We are in the process of shutting down and are about to exit,
+ so don't accidentally re-launch hacks. */
+ si->terminating_p = True;
+
+ if (si->watchdog_id)
+ {
+ XtRemoveTimeOut (si->watchdog_id);
+ si->watchdog_id = 0;
+ }
+
/* Kill before unblanking, to stop drawing as soon as possible. */
for (i = 0; i < si->nscreens; i++)
{
@@ -570,7 +583,11 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status,
/* Treat exit code as a signed 8-bit quantity. */
if (exit_status & 0x80) exit_status |= ~0xFF;
- sprintf (msg, _("crashed with status %d"), exit_status);
+ if (exit_status == EXEC_FAILED_EXIT_STATUS)
+ strcpy (msg, _("is not installed"));
+ else
+ sprintf (msg, _("crashed with status %d"), exit_status);
+
if (p->verbose_p)
fprintf (stderr,
"%s: %d: child pid %lu (%s) exited abnormally"
@@ -767,7 +784,7 @@ fork_and_exec (saver_screen_info *ssi, const char *command)
exec_command (p->shell, command, p->nice_inferior);
/* If that returned, we were unable to exec the subprocess. */
- exit (1); /* exits child fork */
+ exit (EXEC_FAILED_EXIT_STATUS); /* exits child fork */
break;
default: /* parent */
@@ -831,7 +848,11 @@ spawn_screenhack (saver_screen_info *ssi)
"not launching a hack\n", blurb(), ssi->number);
ssi->current_hack = -1;
- /* Hooray, this doesn't actually clear the window if it was OpenGL. */
+ /* Hooray, this doesn't actually clear the window if it was OpenGL.
+ And some X servers apparently ignore XClearWindow if the monitor is
+ powered off, meaning when the monitor powers back on, the stale bits
+ that we just tried to erase are still in the frame buffer.
+ */
XClearWindow (si->dpy, ssi->screensaver_window);
/* Even though we aren't launching a hack, do launch the cycle timer,
@@ -947,6 +968,44 @@ spawn_screenhack (saver_screen_info *ssi)
goto AGAIN;
}
+ /* Install screenshot property on window. Must be after
+ select_visual_of_hack() which might replace the window. */
+ if (ssi->screenshot)
+ screenshot_save (si->dpy, ssi->screensaver_window, ssi->screenshot);
+
+ if (getuid() == (uid_t) 0 || geteuid() == (uid_t) 0)
+ /* Prior to XScreenSaver 6, if running as root, we would change the
+ effective uid to the user "nobody" or "daemon" or "noaccess",
+ but even that was just encouraging bad behavior. Don't log in
+ as root. */
+ {
+ fprintf (stderr, "%s: %d: running as root: not launching hacks.\n",
+ blurb(), ssi->number);
+ screenhack_obituary (ssi, "", "XScreenSaver: Don't log in as root.");
+ goto DONE;
+ }
+
+ if (! si->best_gl_visuals ||
+ ! si->best_gl_visuals[ssi->real_screen_number])
+ {
+ /* Lots of things malfunction in mysterious ways if only *part* of
+ the XScreenSaver application is installed. That some distros
+ still insist on dividing XScreenSaver into multiple
+ bafflingly-named sub-packages that can be omitted willy nilly
+ causes repeated, predicted, time-wasting and extremely irritating
+ problems for everybody, while solving no problems whatsoever.
+
+ Here's your car, but let's make it trivially easy for everyone to
+ accidentally omit the seat belts and distributor cap, because
+ some weirdo once wanted that in 2002.
+
+ Install all of XScreenSaver or none.
+ */
+ screenhack_obituary (ssi, "",
+ "No GL visuals: the xscreensaver-gl* packages are required.");
+ goto DONE;
+ }
+
forked = fork_and_exec (ssi, hack->command);
switch ((int) forked)
{
@@ -978,6 +1037,13 @@ spawn_screenhack (saver_screen_info *ssi)
store_saver_status (si); /* store current hack numbers */
+ /* If there is no hack running, clear the window, in case there are
+ stale bits left over because the server chose to ignore our earlier
+ call to XClearWindow while the monitor was powered down.
+ */
+ if (!ssi->pid && !ssi->error_dialog)
+ XClearWindow (si->dpy, ssi->screensaver_window);
+
/* Now that the hack has launched, queue a timer to cycle it. */
if (!si->demoing_p && p->cycle)
{
@@ -1054,7 +1120,13 @@ kill_screenhack (saver_screen_info *ssi)
kill_job (si, ssi->pid, SIGTERM);
ssi->pid = 0;
- /* Hooray, this doesn't actually clear the window if it was OpenGL. */
+ /* Do not clear ssi->current_hack here, see watchdog_timer(). */
+
+ /* Hooray, this doesn't actually clear the window if it was OpenGL.
+ And some X servers apparently ignore XClearWindow if the monitor is
+ powered off, meaning when the monitor powers back on, the stale bits
+ that we just tried to erase are still in the frame buffer.
+ */
XClearWindow (si->dpy, ssi->screensaver_window);
}
@@ -1157,17 +1229,19 @@ get_best_gl_visual (saver_info *si, Screen *screen)
sprintf (buf, "%s: running %s", blurb(), av[0]);
perror (buf);
}
- exit (1); /* exits fork */
+ exit (EXEC_FAILED_EXIT_STATUS); /* exits fork */
break;
}
default:
{
int result = 0;
int wait_status = 0;
+ int exit_status = EXEC_FAILED_EXIT_STATUS;
pid_t pid = -1;
FILE *f;
unsigned long v = 0;
char c;
+ int i = 0;
make_job (forked, 0, av[0]); /* Bookkeeping for SIGCHLD */
@@ -1179,8 +1253,13 @@ get_best_gl_visual (saver_info *si, Screen *screen)
close (out); /* don't need this one */
*buf = 0;
- if (! fgets (buf, sizeof(buf)-1, f))
- *buf = 0;
+ do {
+ errno = 0;
+ if (! fgets (buf, sizeof(buf)-1, f))
+ *buf = 0;
+ } while (errno == EINTR && /* fgets might fail due to SIGCHLD. */
+ i++ < 1000); /* And just in case. */
+
fclose (f);
if (! si->prefs.verbose_p)
@@ -1195,6 +1274,16 @@ get_best_gl_visual (saver_info *si, Screen *screen)
fprintf (stderr, "%s: waitpid(%ld) => %ld\n", blurb(),
(long) forked, (long) pid);
+ exit_status = WEXITSTATUS (wait_status);
+ /* Treat exit code as a signed 8-bit quantity. */
+ if (exit_status & 0x80) exit_status |= ~0xFF;
+
+ if (exit_status == EXEC_FAILED_EXIT_STATUS)
+ {
+ fprintf (stderr, "%s: %s is not installed\n", blurb(), av[0]);
+ return 0;
+ }
+
if (1 == sscanf (buf, "0x%lx %c", &v, &c))
result = (int) v;
diff --git a/driver/test-grab.c b/driver/test-grab.c
index 65313a1..fe7b0e2 100644
--- a/driver/test-grab.c
+++ b/driver/test-grab.c
@@ -1,5 +1,5 @@
/* test-uid.c --- playing with grabs.
- * xscreensaver, Copyright © 1999-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1999-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -80,9 +80,18 @@ main (int argc, char **argv)
else if (!strcmp (argv[i], "-mouse-async") ||
!strcmp (argv[i], "-pointer-async"))
mouse_sync_p = False;
+ else if (!strcmp (argv[i], "-sync"))
+ kbd_sync_p = mouse_sync_p = True;
+ else if (!strcmp (argv[i], "-async"))
+ kbd_sync_p = mouse_sync_p = False;
else
{
fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa);
+ fprintf (stderr, "usage: %s "
+ "[--sync | --async]"
+ "\n\t\t [--kbd] [--kbd-sync | --kbd-async]"
+ "\n\t\t [--mouse] [--mouse-sync | --mouse-async]\n",
+ progname);
exit (1);
}
}
diff --git a/driver/test-randr.c b/driver/test-randr.c
index 1f88d99..8acfb98 100644
--- a/driver/test-randr.c
+++ b/driver/test-randr.c
@@ -1,5 +1,5 @@
/* test-randr.c --- playing with the Resize And Rotate extension.
- * xscreensaver, Copyright © 2004-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2004-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -43,6 +43,51 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
}
+static void
+query_outputs (Display *dpy, int screen)
+{
+# ifdef HAVE_RANDR_12
+ int major = -1, minor = -1;
+
+ if (!XRRQueryVersion(dpy, &major, &minor))
+ abort();
+
+ if (major > 1 || (major == 1 && minor >= 2))
+ {
+ int j;
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindow (dpy, screen));
+ fprintf (stderr, "\n");
+ for (j = 0; j < res->noutput; j++)
+ {
+ int k;
+ XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, res->outputs[j]);
+ fprintf (stderr, "%s: Output %d: %s: %s (%d)\n", blurb(), j,
+ rroi->name,
+ (rroi->connection == RR_Connected ? "connected" :
+ rroi->connection == RR_Disconnected ? "disconnected" :
+ rroi->connection == RR_UnknownConnection ? "unknown" :
+ "ERROR"),
+ (int) rroi->crtc);
+ for (k = 0; k < rroi->ncrtc; k++)
+ {
+ XRRCrtcInfo *crtci = XRRGetCrtcInfo (dpy, res, rroi->crtcs[k]);
+ fprintf(stderr, "%s: %c CRTC %d (%d): %dx%d+%d+%d\n",
+ blurb(),
+ (rroi->crtc == rroi->crtcs[k] ? '+' : ' '),
+ k, (int) rroi->crtcs[k],
+ crtci->width, crtci->height, crtci->x, crtci->y);
+ XRRFreeCrtcInfo (crtci);
+ }
+ XRRFreeOutputInfo (rroi);
+ fprintf (stderr, "\n");
+ }
+ XRRFreeScreenResources (res);
+ }
+# endif /* HAVE_RANDR_12 */
+}
+
+
int
main (int argc, char **argv)
{
@@ -217,42 +262,7 @@ main (int argc, char **argv)
blurb(), i);
}
-
-# ifdef HAVE_RANDR_12
- if (major > 1 || (major == 1 && minor >= 2))
- {
- int j;
- XRRScreenResources *res =
- XRRGetScreenResources (dpy, RootWindow (dpy, i));
- fprintf (stderr, "\n");
- for (j = 0; j < res->noutput; j++)
- {
- int k;
- XRROutputInfo *rroi =
- XRRGetOutputInfo (dpy, res, res->outputs[j]);
- fprintf (stderr, "%s: Output %d: %s: %s (%d)\n", blurb(), j,
- rroi->name,
- (rroi->connection == RR_Disconnected ? "disconnected" :
- rroi->connection == RR_UnknownConnection ? "unknown" :
- "connected"),
- (int) rroi->crtc);
- for (k = 0; k < rroi->ncrtc; k++)
- {
- XRRCrtcInfo *crtci = XRRGetCrtcInfo (dpy, res,
- rroi->crtcs[k]);
- fprintf(stderr, "%s: %c CRTC %d (%d): %dx%d+%d+%d\n",
- blurb(),
- (rroi->crtc == rroi->crtcs[k] ? '+' : ' '),
- k, (int) rroi->crtcs[k],
- crtci->width, crtci->height, crtci->x, crtci->y);
- XRRFreeCrtcInfo (crtci);
- }
- XRRFreeOutputInfo (rroi);
- fprintf (stderr, "\n");
- }
- XRRFreeScreenResources (res);
- }
-# endif /* HAVE_RANDR_12 */
+ query_outputs (dpy, i);
}
if (major > 0)
@@ -272,7 +282,7 @@ main (int argc, char **argv)
fprintf (stderr, "\n%s: awaiting events...\n\n"
"\t(If you resize the screen or add/remove monitors, this should\n"
"\tnotice that and print stuff. Otherwise, hit ^C.)\n\n",
- progname);
+ blurb());
while (1)
{
XEvent event;
@@ -285,34 +295,38 @@ main (int argc, char **argv)
int screen = XRRRootToScreen (dpy, xrr_event->window);
fprintf (stderr, "%s: screen %d: RRScreenChangeNotify event\n",
- progname, screen);
+ blurb(), screen);
fprintf (stderr, "%s: screen %d: old size: \t%d x %d\n",
- progname, screen,
+ blurb(), screen,
DisplayWidth (dpy, screen),
DisplayHeight (dpy, screen));
- fprintf (stderr, "%s: screen %d: old root 0x%lx:\t%d x %d\n",
- progname, screen, (unsigned long) w[screen],
- xgwa[screen].width, xgwa[screen].height);
+ fprintf (stderr, "%s: screen %d: old root: \t%d x %d\t0x%lx\n",
+ blurb(), screen,
+ xgwa[screen].width, xgwa[screen].height,
+ (unsigned long) w[screen]);
XRRUpdateConfiguration (&event);
XSync (dpy, False);
fprintf (stderr, "%s: screen %d: new size: \t%d x %d\n",
- progname, screen,
+ blurb(), screen,
DisplayWidth (dpy, screen),
DisplayHeight (dpy, screen));
w[screen] = RootWindow (dpy, screen);
XGetWindowAttributes (dpy, w[screen], &xgwa[screen]);
- fprintf (stderr, "%s: screen %d: new root 0x%lx:\t%d x %d\n",
- progname, screen, (unsigned long) w[screen],
- xgwa[screen].width, xgwa[screen].height);
- fprintf (stderr, "\n");
+ fprintf (stderr, "%s: screen %d: new root:\t%d x %d\t0x%lx\n",
+ blurb(), screen,
+ xgwa[screen].width, xgwa[screen].height,
+ (unsigned long) w[screen]);
+
+ for (i = 0; i < nscreens; i++)
+ query_outputs (dpy, i);
}
else
{
- fprintf (stderr, "%s: event %d\n", progname, event.type);
+ fprintf (stderr, "%s: event %d\n", blurb(), event.type);
}
}
}
diff --git a/driver/test-screens.c b/driver/test-screens.c
index 141b7ad..1e0189a 100644
--- a/driver/test-screens.c
+++ b/driver/test-screens.c
@@ -83,7 +83,7 @@ test (int testnum, const char *screens, const char *desired)
{
sprintf (out, "%dx%d+%d+%d", m->width, m->height, m->x, m->y);
if (m->screen)
- sprintf (out + strlen(out), "@%d", (int) m->screen);
+ sprintf (out + strlen(out), "@%ld", (long) m->screen);
}
else
strcpy (out, failstr (m->sanity));
diff --git a/driver/test-xinput.c b/driver/test-xinput.c
index e3a6487..93336ec 100644
--- a/driver/test-xinput.c
+++ b/driver/test-xinput.c
@@ -1,5 +1,5 @@
/* test-xinput.c --- playing with the XInput2 extension.
- * xscreensaver, Copyright © 2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 2021-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -8,6 +8,26 @@
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
+ *
+ * This verbosely prints out all events received from Xlib and the XInput2
+ * extension.
+ *
+ * --grab, --grab-kbd, --grab-mouse
+ * Read events while grabbed. The grab is released after 15 seconds.
+ *
+ * --sync, --async
+ * Async grabs queue up events and deliver them all at release.
+ *
+ * Real X11 multi-head ("Zaphod Heads") has different behaviors than
+ * single-screen displays with multiple monitors (Xinerama, XRANDR).
+ * To test X11 multi-head or different visual depths on Raspberry Pi
+ * you have to do it inside a nested server:
+ *
+ * apt install xserver-xephyr
+ * sudo rm /tmp/.X1-lock /tmp/.X11-unix/X1
+ * export DISPLAY=:0
+ * Xephyr :1 -ac -screen 1280x720 -screen 640x480x8 &
+ * export DISPLAY=:1
*/
#ifdef HAVE_CONFIG_H
@@ -29,17 +49,54 @@
#include <X11/Xproto.h>
#include <X11/extensions/XInput2.h>
-#include "blurb.h"
+/* #include "blurb.h" */
+extern const char *progname;
+extern int verbose_p;
+
#include "xinput.h"
char *progclass = "XScreenSaver";
Bool debug_p = True;
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define RST "\x1B[0m"
+#define RED "\x1B[31m"
+#define GRN "\x1B[32m"
+#define YEL "\x1B[33m"
+#define BLU "\x1B[34m"
+#define MAG "\x1B[35m"
+#define CYN "\x1B[36m"
+#define WHT "\x1B[37m"
+#define BLD "\x1B[1m"
+#define UL "\x1B[4m"
+
+static const char *
+blurb(void)
+{
+ static char buf[255] = { 0 };
+ struct tm *tm;
+ struct timeval tv;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday (&tv, &tzp);
+# else
+ gettimeofday (&tv);
+# endif
+ tm = localtime (&tv.tv_sec);
+ sprintf (buf, "%s: %02d:%02d:%02d.%03lu", progname,
+ tm->tm_hour, tm->tm_min, tm->tm_sec,
+ (unsigned long) (tv.tv_usec / 1000));
+ return buf;
+}
+
+
static void
ungrab_timer (XtPointer closure, XtIntervalId *id)
{
Display *dpy = (Display *) closure;
- fprintf (stderr, "\n%s: ungrabbing\n\n", blurb());
+ fprintf (stdout, "\n%s: ungrabbing\n\n", blurb());
XUngrabKeyboard (dpy, CurrentTime);
XUngrabPointer (dpy, CurrentTime);
}
@@ -64,6 +121,503 @@ grab_string (int status)
}
+typedef enum {
+ ETYPE, ETIME, ESERIAL, EROOT, EWIN, ESUB, EX, EY, EXR, EYR,
+ EFLAGS, ESTATE, EKEYCODE, EKEY, EHINT, ESSCR,
+ EEND
+} coltype;
+
+typedef struct {
+ const char *name;
+ int width;
+ enum { TSTR, TSTRL, TINT, TUINT, THEX, TTIME } type;
+} columns;
+
+
+static const columns cols[] = {
+ /* ETYPE */ { "Type", 17, TSTRL },
+ /* ETIME */ { "Timestamp", 11, TTIME },
+ /* ESERIAL */ { "Serial", 9, TUINT },
+ /* EROOT */ { "Root", 8, THEX },
+ /* EWIN */ { "Window", 8, THEX },
+ /* ESUB */ { "Subwin", 8, THEX },
+ /* EX */ { "X", 11, TINT },
+ /* EY */ { "Y", 11, TINT },
+ /* EXR */ { "X Root", 11, TINT },
+ /* EYR */ { "Y Root", 11, TINT },
+ /* EFLAGS */ { "Flags", 8, THEX },
+ /* ESTATE */ { "State", 8, THEX },
+ /* EKEYCODE */ { "Code", 5, THEX },
+ /* EKEY */ { "Key", 3, TSTR },
+ /* EHINT */ { "Hint", 9, TINT },
+ /* ESSCR */ { "Same", 4, TINT },
+};
+
+static struct { Time t; XEvent e; } history[100] = { 0, };
+
+static void
+print_header (void)
+{
+ char buf[1024] = { 0 };
+ char *s = buf;
+ coltype t;
+
+ if (countof(cols) != EEND) abort();
+ for (t = 0; t < EEND; t++)
+ {
+ if (t > 0) *s++ = ' ';
+ if (cols[t].type == TSTRL)
+ sprintf (s, "%-*s", cols[t].width, cols[t].name);
+ else
+ sprintf (s, "%*s", cols[t].width, cols[t].name);
+ s += strlen(s);
+ }
+ *s++ = '\n';
+ for (t = 0; t < EEND; t++)
+ {
+ int i;
+ if (t > 0) *s++ = ' ';
+ for (i = 0; i < cols[t].width; i++)
+ *s++ = '=';
+ }
+ fprintf (stdout, "\n%s\n", buf);
+}
+
+
+static void
+print_field (char *out, coltype t, void *val)
+{
+ const columns *col = &cols[t];
+ if (! val)
+ {
+ sprintf (out, "%*s", col->width, "-");
+ return;
+ }
+
+ switch (col->type) {
+ case TSTRL: sprintf (out, "%-*s", col->width, (char *) val); break;
+ case TSTR: sprintf (out, "%*s", col->width, (char *) val); break;
+ case TINT: sprintf (out, "%*d", col->width, *((int *) val)); break;
+ case TUINT: sprintf (out, "%*u", col->width, *((unsigned int *) val)); break;
+ case THEX: sprintf (out, "%*X", col->width, *((unsigned int *) val)); break;
+ case TTIME: sprintf (out, "%*.3f", col->width,
+ (double) (*((unsigned int *) val)) / 1000.0); break;
+ default: abort(); break;
+ }
+}
+
+
+static void
+push_history (Time t, XEvent *xev)
+{
+ memmove (history + 1, history, sizeof(history) - sizeof(*history));
+ history[0].t = t;
+ history[0].e = *xev;
+}
+
+
+static void
+asciify (char *c, int L)
+{
+ if (!strcmp(c,"\n")) strcpy(c, "\\n");
+ else if (!strcmp(c,"\r")) strcpy(c, "\\r");
+ else if (!strcmp(c,"\t")) strcpy(c, "\\t");
+ else if (!strcmp(c," ")) strcpy(c, "SPC");
+ else if (L == 1 && c[0] < ' ')
+ sprintf (c, "^%c", c[0] + '@');
+}
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+/* Whether the field's value is sane. */
+static Bool
+validate_field (Display *dpy, coltype t, void *val)
+{
+ const char *err = 0;
+ if (!val) return True;
+
+ switch (t) {
+ case ETIME:
+ {
+ Time t = *(Time *) val;
+ int i;
+ for (i = 0; i < countof(history); i++)
+ {
+ if (t && t == history[i].t)
+ {
+ err = "DUP TIME";
+ break;
+ }
+ else if (t && t < history[i].t)
+ {
+ err = "TIME TRAVEL";
+ break;
+ }
+ }
+ }
+ break;
+
+ case ESERIAL:
+ {
+ unsigned long s = *(unsigned long *) val;
+ int i;
+ for (i = 0; i < countof(history); i++)
+ {
+ if (s && s == history[i].e.xany.serial)
+ {
+ err = "DUP SERIAL";
+ break;
+ }
+ else if (s && s < history[i].e.xany.serial)
+ {
+ err = "TIME TRAVEL";
+ break;
+ }
+ }
+ }
+ break;
+
+ case EROOT: case EWIN: case ESUB:
+ {
+ Window w = *(Window *) val;
+ if (w)
+ {
+ XWindowAttributes xgwa;
+ error_handler_hit_p = False;
+ XSync (dpy, False);
+ XSetErrorHandler (ignore_all_errors_ehandler);
+ XSync (dpy, False);
+ XGetWindowAttributes (dpy, w, &xgwa);
+ XSync (dpy, False);
+ if (error_handler_hit_p)
+ {
+ err = "BAD WINDOW";
+ break;
+ }
+ }
+ }
+
+ case EX: case EY: case EXR: case EYR:
+ {
+ int i = *(int *) val;
+ if (i < 0 || i > 0xFFFF)
+ {
+ err = "BAD COORD";
+ break;
+ }
+ }
+ break;
+
+ case EFLAGS:
+ {
+ /* "The only defined flag is XIKeyRepeat for XI_KeyPress events." */
+ int i = *(int *) val;
+ if (i != 0 && 1 != XIKeyRepeat)
+ {
+ err = "BAD BOOL";
+ break;
+ }
+ }
+ break;
+
+ case ESTATE:
+ {
+ unsigned int i = *(int *) val;
+
+ if (i & ~(ShiftMask | LockMask | ControlMask | Mod1Mask |
+ Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask |
+ Button1Mask | Button2Mask | Button3Mask |
+ Button4Mask | Button5Mask))
+ {
+ err = "BAD MODS";
+ break;
+ }
+ }
+ break;
+
+ case EKEYCODE:
+ {
+ int i = *(int *) val;
+ if (i < 0 || i > 0xFFFF)
+ {
+ err = "BAD KEYCODE";
+ break;
+ }
+ }
+ break;
+
+ case EHINT: case ESSCR:
+ {
+ int i = *(int *) val;
+ if (i != 0 && 1 != 1)
+ {
+ err = "BAD BOOL";
+ break;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (err) return False;
+ return True;
+}
+
+
+static void
+print_event (Display *dpy, XEvent *xev, int xi_opcode)
+{
+ XIRawEvent *re = 0;
+ XIDeviceEvent *de = 0;
+ void *fields[EEND] = { 0, };
+
+ switch (xev->xany.type) {
+ case KeyPress:
+ case KeyRelease:
+ {
+ static XComposeStatus compose = { 0, };
+ KeySym keysym = 0;
+ static char c[100];
+ int n;
+
+ fields[ETYPE] = (void *)
+ (xev->xany.type == KeyPress ? "KeyPress" : "KeyRelease");
+ fields[ETIME] = &xev->xkey.time;
+ fields[ESERIAL] = &xev->xkey.serial;
+ fields[EWIN] = &xev->xkey.window;
+ fields[EROOT] = &xev->xkey.root;
+ fields[ESUB] = &xev->xkey.subwindow;
+ fields[EX] = &xev->xkey.x;
+ fields[EY] = &xev->xkey.y;
+ fields[EXR] = &xev->xkey.x_root;
+ fields[EYR] = &xev->xkey.y_root;
+ fields[ESTATE] = &xev->xkey.state;
+ fields[EKEYCODE] = &xev->xkey.keycode;
+
+ n = XLookupString (&xev->xkey, c, sizeof(c)-1, &keysym, &compose);
+ c[n] = 0;
+ asciify (c, n);
+ fields[EKEY] = c;
+ }
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ {
+ fields[ETYPE] = (void *)
+ (xev->xany.type == ButtonPress ? "ButtonPress" : "ButtonRelease");
+ fields[ETIME] = &xev->xbutton.time;
+ fields[ESERIAL] = &xev->xbutton.serial;
+ fields[EWIN] = &xev->xbutton.window;
+ fields[EROOT] = &xev->xbutton.root;
+ fields[ESUB] = &xev->xbutton.subwindow;
+ fields[EX] = &xev->xbutton.x;
+ fields[EY] = &xev->xbutton.y;
+ fields[EXR] = &xev->xbutton.x_root;
+ fields[EYR] = &xev->xbutton.y_root;
+ fields[ESTATE] = &xev->xbutton.state;
+ fields[EKEYCODE] = &xev->xbutton.button;
+ }
+ break;
+ case MotionNotify:
+ {
+ fields[ETYPE] = (void *) "MotionNotify";
+ fields[ETIME] = &xev->xmotion.time;
+ fields[ESERIAL] = &xev->xmotion.serial;
+ fields[EWIN] = &xev->xmotion.window;
+ fields[EROOT] = &xev->xmotion.root;
+ fields[ESUB] = &xev->xmotion.subwindow;
+ fields[EX] = &xev->xmotion.x;
+ fields[EY] = &xev->xmotion.y;
+ fields[EXR] = &xev->xmotion.x_root;
+ fields[EYR] = &xev->xmotion.y_root;
+ fields[ESTATE] = &xev->xmotion.state;
+ fields[EHINT] = &xev->xmotion.is_hint;
+ }
+ break;
+ case GenericEvent:
+ break;
+ case EnterNotify:
+ case LeaveNotify:
+ break;
+ default:
+ {
+ static char ee[100];
+ sprintf (ee, "EVENT %2d", xev->xany.type);
+ fields[ETYPE] = &ee;
+ fields[ESERIAL] = &xev->xany.serial;
+ fields[EWIN] = &xev->xany.window;
+ }
+ break;
+ }
+
+ if (xev->xcookie.type != GenericEvent ||
+ xev->xcookie.extension != xi_opcode)
+ goto DONE; /* not an XInput event */
+ if (!xev->xcookie.data)
+ XGetEventData (dpy, &xev->xcookie);
+ if (!xev->xcookie.data)
+ {
+ fields[ETYPE] = "BAD XIINPUT";
+ goto DONE;
+ }
+
+ re = xev->xcookie.data;
+
+ if (xev->xany.serial != re->serial) abort();
+
+ switch (xev->xcookie.evtype) {
+ case XI_RawKeyPress: fields[ETYPE] = "XI_RawKeyPress"; break;
+ case XI_RawKeyRelease: fields[ETYPE] = "XI_RawKeyRelease"; break;
+ case XI_RawButtonPress: fields[ETYPE] = "XI_RawBtnPress"; break;
+ case XI_RawButtonRelease: fields[ETYPE] = "XI_RawBtnRelease"; break;
+ case XI_RawMotion: fields[ETYPE] = "XI_RawMotion"; break;
+ case XI_RawTouchBegin: fields[ETYPE] = "XI_RawTouchBegin"; break;
+ case XI_RawTouchEnd: fields[ETYPE] = "XI_RawTouchEnd"; break;
+ case XI_RawTouchUpdate: fields[ETYPE] = "XI_RawTouchUpd"; break;
+ case XI_KeyPress: fields[ETYPE] = "XI_KeyPress"; break;
+ case XI_KeyRelease: fields[ETYPE] = "XI_KeyRelease"; break;
+ case XI_ButtonPress: fields[ETYPE] = "XI_BtnPress"; break;
+ case XI_ButtonRelease: fields[ETYPE] = "XI_BtnRelease"; break;
+ case XI_Motion: fields[ETYPE] = "XI_Motion"; break;
+ case XI_TouchBegin: fields[ETYPE] = "XI_TouchBegin"; break;
+ case XI_TouchEnd: fields[ETYPE] = "XI_TouchEnd"; break;
+ case XI_TouchUpdate: fields[ETYPE] = "XI_TouchUpd"; break;
+ default:
+ {
+ static char ee[100];
+ sprintf (ee, "XI EVENT %2d", xev->xany.type);
+ fields[ETYPE] = &ee;
+ }
+ break;
+ }
+
+ fields[ESERIAL] = &xev->xany.serial;
+ fields[ETIME] = &re->time;
+ fields[EFLAGS] = &re->flags;
+ fields[EKEYCODE] = &re->detail;
+
+ /* Only these events are XIDeviceEvents. The "XI_Raw" variants are not.
+ */
+ switch (xev->xcookie.evtype) {
+ case XI_KeyPress:
+ case XI_KeyRelease:
+ case XI_ButtonPress:
+ case XI_ButtonRelease:
+ case XI_Motion:
+ case XI_TouchBegin:
+ case XI_TouchEnd:
+ case XI_TouchUpdate:
+ de = (XIDeviceEvent *) re;
+ fields[EROOT] = &de->root;
+ fields[EWIN] = &de->event;
+ fields[ESUB] = &de->child;
+ fields[EX] = &de->event_x;
+ fields[EY] = &de->event_y;
+ fields[EXR] = &de->root_x;
+ fields[EYR] = &de->root_y;
+ fields[ESTATE] = &de->mods.effective;
+ break;
+ default: break;
+ }
+
+ switch (xev->xcookie.evtype) {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_KeyPress:
+ case XI_KeyRelease:
+ {
+ XKeyEvent xkey = { 0, };
+ static XComposeStatus compose = { 0, };
+ KeySym keysym = 0;
+ static char c[100];
+ int n;
+ xkey.type = ((xev->xcookie.evtype == XI_RawKeyPress ||
+ xev->xcookie.evtype == XI_KeyPress)
+ ? KeyPress : KeyRelease);
+ xkey.serial = xev->xany.serial;
+ xkey.display = xev->xany.display;
+ xkey.window = 0; /* xev->xany.window; */
+ xkey.keycode = re->detail;
+
+ if (de) /* Available for non-raw events only */
+ {
+ xkey.root = de->root;
+ xkey.subwindow = 0; /* de->child; */
+ xkey.time = de->time;
+ xkey.state = de->mods.effective;
+ }
+
+ n = XLookupString (&xkey, c, sizeof(c)-1, &keysym, &compose);
+ c[n] = 0;
+ asciify (c, n);
+ fields[EKEY] = c;
+ }
+ break;
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ case XI_ButtonPress:
+ case XI_ButtonRelease:
+ {
+ static char c[10];
+ sprintf (c, "b%d", re->detail);
+ fields[EKEY] = &c;
+ }
+ break;
+ default:
+ break;
+ }
+
+ DONE:
+
+ if (fields[ETYPE])
+ {
+ char buf[10240];
+ char *s = buf;
+ coltype t;
+ *s = 0;
+ for (t = 0; t < EEND; t++)
+ {
+ Bool ok = validate_field (dpy, t, fields[t]);
+
+ if (t > 0) { *s++ = ' '; *s = 0; }
+
+ if (!ok)
+ {
+ strcat (s, BLD);
+ strcat (s, RED);
+ s += strlen(s);
+ }
+
+ print_field (s, t, fields[t]);
+ s += strlen(s);
+
+ if (!ok)
+ {
+ strcat (s, RST);
+ s += strlen(s);
+ }
+ }
+ fprintf (stdout, "%s\n", buf);
+ }
+
+ {
+ Time t = (fields[ETIME] ? * (Time *) fields[ETIME] : 0);
+ push_history (t, xev);
+ }
+}
+
+
int
main (int argc, char **argv)
{
@@ -73,11 +627,14 @@ main (int argc, char **argv)
int xi_opcode;
Bool grab_kbd_p = False;
Bool grab_mouse_p = False;
- Bool mouse_sync_p = True;
- Bool kbd_sync_p = True;
+ Bool mouse_sync_p = False;
+ Bool kbd_sync_p = False;
int i;
+ char *s;
progname = argv[0];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
for (i = 1; i < argc; i++)
{
@@ -104,9 +661,18 @@ main (int argc, char **argv)
else if (!strcmp (argv[i], "-mouse-async") ||
!strcmp (argv[i], "-pointer-async"))
mouse_sync_p = False;
+ else if (!strcmp (argv[i], "-sync"))
+ kbd_sync_p = mouse_sync_p = True;
+ else if (!strcmp (argv[i], "-async"))
+ kbd_sync_p = mouse_sync_p = False;
else
{
fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa);
+ fprintf (stderr, "usage: %s "
+ "[--grab] [--sync | --async]"
+ "\n\t\t [--grab-kbd] [--kbd-sync | --kbd-async]"
+ "\n\t\t [--grab-mouse] [--mouse-sync | --mouse-async]\n",
+ progname);
exit (1);
}
}
@@ -119,6 +685,10 @@ main (int argc, char **argv)
if (! init_xinput (dpy, &xi_opcode))
exit (1);
+ fprintf (stdout, "\n%s: Make your window wide. "
+ "Bogus values are " BLD RED "RED" RST ".\n",
+ blurb());
+
if (grab_kbd_p || grab_mouse_p)
{
int timeout = 15;
@@ -135,12 +705,12 @@ main (int argc, char **argv)
(kbd_sync_p ? GrabModeSync : GrabModeAsync),
CurrentTime);
if (status == GrabSuccess)
- fprintf (stderr, "%s: grabbed keyboard (%s, %s)\n", blurb(),
+ fprintf (stdout, "%s: grabbed keyboard (%s, %s)\n", blurb(),
(mouse_sync_p ? "sync" : "async"),
(kbd_sync_p ? "sync" : "async"));
else
{
- fprintf (stderr, "%s: failed to grab keyboard (%s, %s): %s\n",
+ fprintf (stdout, "%s: failed to grab keyboard (%s, %s): %s\n",
blurb(),
(mouse_sync_p ? "sync" : "async"),
(kbd_sync_p ? "sync" : "async"),
@@ -162,12 +732,12 @@ main (int argc, char **argv)
(kbd_sync_p ? GrabModeSync : GrabModeAsync),
w, cursor, CurrentTime);
if (status == GrabSuccess)
- fprintf (stderr, "%s: grabbed mouse (%s, %s)\n", blurb(),
+ fprintf (stdout, "%s: grabbed mouse (%s, %s)\n", blurb(),
(mouse_sync_p ? "sync" : "async"),
(kbd_sync_p ? "sync" : "async"));
else
{
- fprintf (stderr, "%s: failed to grab mouse (%s, %s): %s\n",
+ fprintf (stdout, "%s: failed to grab mouse (%s, %s): %s\n",
blurb(),
(mouse_sync_p ? "sync" : "async"),
(kbd_sync_p ? "sync" : "async"),
@@ -176,129 +746,17 @@ main (int argc, char **argv)
}
}
- fprintf (stderr, "%s: ungrabbing in %d seconds\n", blurb(), timeout);
+ fprintf (stdout, "%s: ungrabbing in %d seconds\n", blurb(), timeout);
XtAppAddTimeOut (app, 1000 * timeout, ungrab_timer, (XtPointer) dpy);
}
+ print_header();
while (1)
{
- XEvent xev;
- XIRawEvent *re;
-
+ XEvent xev = { 0, };
XtAppNextEvent (app, &xev);
XtDispatchEvent (&xev);
-
- switch (xev.xany.type) {
- case KeyPress:
- case KeyRelease:
- {
- static XComposeStatus compose = { 0, };
- KeySym keysym = 0;
- char c[100];
- int n;
- n = XLookupString (&xev.xkey, c, sizeof(c)-1, &keysym, &compose);
- c[n] = 0;
- fprintf (stderr, "%s: X11 Key%s %02x %02x %s \"%s\"\n", blurb(),
- (xev.xkey.type == KeyPress ? "Press " : "Release"),
- xev.xkey.keycode, xev.xkey.state,
- XKeysymToString (keysym), c);
- }
- break;
- case ButtonPress:
- case ButtonRelease:
- fprintf (stderr, "%s: X11 Button%s %d %d\n", blurb(),
- (xev.xany.type == ButtonPress ? "Press " : "Release"),
- xev.xbutton.button, xev.xbutton.state);
- break;
- case MotionNotify:
- fprintf (stderr, "%s: X11 MotionNotify %4d, %-4d\n",
- blurb(), xev.xmotion.x_root, xev.xmotion.y_root);
- break;
- case GenericEvent:
- break;
- case EnterNotify:
- case LeaveNotify:
- break;
- default:
- fprintf (stderr, "%s: X11 event %d on 0x%lx\n",
- blurb(), xev.xany.type, xev.xany.window);
- break;
- }
-
- if (xev.xcookie.type != GenericEvent ||
- xev.xcookie.extension != xi_opcode)
- continue; /* not an XInput event */
- if (!xev.xcookie.data)
- XGetEventData (dpy, &xev.xcookie);
- if (!xev.xcookie.data)
- continue; /* Bogus XInput event */
-
- re = xev.xcookie.data;
- switch (xev.xcookie.evtype) {
- case XI_RawKeyPress:
- case XI_RawKeyRelease:
- {
- /* Fake up an XKeyEvent in order to call XKeysymToString(). */
- XEvent ev2;
- Bool ok = xinput_event_to_xlib (xev.xcookie.evtype,
- (XIDeviceEvent *) re,
- &ev2);
- if (!ok)
- fprintf (stderr, "%s: unable to translate XInput2 event\n",
- blurb());
- else
- {
- static XComposeStatus compose = { 0, };
- KeySym keysym = 0;
- char c[100];
- int n;
- n = XLookupString (&ev2.xkey, c, sizeof(c)-1, &keysym, &compose);
- c[n] = 0;
- fprintf (stderr, "%s: XI_RawKey%s %02x %02x %s \"%s\"\n",
- blurb(),
- (ev2.xkey.type == KeyPress ? "Press " : "Release"),
- ev2.xkey.keycode, ev2.xkey.state,
- XKeysymToString (keysym), c);
- }
- }
- break;
- case XI_RawButtonPress:
- case XI_RawButtonRelease:
- fprintf (stderr, "%s: XI_RawButton%s %d\n", blurb(),
- (re->evtype == XI_RawButtonPress ? "Press " : "Release"),
- re->detail);
- break;
- case XI_RawMotion:
- {
- Window root_ret, child_ret;
- int root_x, root_y;
- int win_x, win_y;
- unsigned int mask;
- XQueryPointer (dpy, DefaultRootWindow (dpy),
- &root_ret, &child_ret, &root_x, &root_y,
- &win_x, &win_y, &mask);
- fprintf (stderr, "%s: XI_RawMotion %4d, %-4d %7.02f, %-7.02f\n",
- blurb(),
- root_x, root_y,
- re->raw_values[0], re->raw_values[1]);
- }
- break;
- case XI_RawTouchBegin:
- fprintf (stderr, "%s: XI_RawTouchBegin\n", blurb());
- break;
- case XI_RawTouchEnd:
- fprintf (stderr, "%s: XI_RawTouchEnd", blurb());
- break;
- case XI_RawTouchUpdate:
- fprintf (stderr, "%s: XI_RawTouchUpdate", blurb());
- break;
-
- default:
- fprintf (stderr, "%s: XInput unknown event %d\n", blurb(),
- xev.xcookie.evtype);
- break;
- }
-
+ print_event (dpy, &xev, xi_opcode);
XFreeEventData (dpy, &xev.xcookie);
}
diff --git a/driver/types.h b/driver/types.h
index d8e4880..f11ad3b 100644
--- a/driver/types.h
+++ b/driver/types.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1993-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -64,10 +64,6 @@ struct saver_preferences {
Bool install_cmap_p; /* whether we should use our own colormap
when using the screen's default visual */
-# ifdef QUAD_MODE
- Bool quad_p; /* whether to run four savers per monitor */
-# endif
-
screenhack **screenhacks; /* the programs to run */
int screenhacks_count;
@@ -109,6 +105,7 @@ struct saver_preferences {
char *load_url_command; /* How one loads URLs. */
char *new_login_command; /* Command for the "New Login" button. */
char *dialog_theme; /* Color scheme on the unlock dialog */
+ char *settings_geom; /* Saved positions of the settings windows */
int auth_warning_slack; /* Don't warn about login failures if they
all happen within this many seconds of
@@ -143,6 +140,8 @@ struct saver_info {
Bool demoing_p; /* Whether we are demoing a single hack
(without UI.) */
Bool emergency_p; /* Restarted because of a crash */
+ Bool terminating_p; /* In the process of shutting down */
+
XtIntervalId watchdog_id; /* Timer to implement `prefs.watchdog */
int selection_mode; /* Set to -1 if the NEXT ClientMessage has just
@@ -192,7 +191,7 @@ struct saver_screen_info {
real root window. */
unsigned long black_pixel; /* Black, allocated from `cmap'. */
Window error_dialog; /* Error message about crashed savers */
-
+ Pixmap screenshot; /* Saved screen image before activation */
XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */
time_t cycle_at; /* When cycle_id will fire */
@@ -211,7 +210,6 @@ extern void load_init_file (Display *, saver_preferences *);
extern int write_init_file (Display *,
saver_preferences *, const char *version_string,
Bool verbose_p);
-extern Bool senescent_p (void);
char *make_hack_name (Display *, const char *shell_command);
diff --git a/driver/vms_axp.opt b/driver/vms_axp.opt
deleted file mode 100644
index 04d465d..0000000
--- a/driver/vms_axp.opt
+++ /dev/null
@@ -1,5 +0,0 @@
-[-.UTILS]UTILS.OLB_AXP/LIB
-SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE
-SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
-SYS$SHARE:DECW$XTSHR.EXE/SHARE
-SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_axp_12.opt b/driver/vms_axp_12.opt
deleted file mode 100644
index 25dd1f1..0000000
--- a/driver/vms_axp_12.opt
+++ /dev/null
@@ -1,5 +0,0 @@
-[-.UTILS]UTILS.OLB_AXP/LIB
-SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE
-SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
-SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
-SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_decc.opt b/driver/vms_decc.opt
deleted file mode 100644
index 65bec03..0000000
--- a/driver/vms_decc.opt
+++ /dev/null
@@ -1,5 +0,0 @@
-[-.UTILS]UTILS.OLB_DECC/LIB
-SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE
-SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
-SYS$SHARE:DECW$XTSHR.EXE/SHARE
-SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_decc_12.opt b/driver/vms_decc_12.opt
deleted file mode 100644
index fdd9a80..0000000
--- a/driver/vms_decc_12.opt
+++ /dev/null
@@ -1,5 +0,0 @@
-[-.UTILS]UTILS.OLB_DECC/LIB
-SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE
-SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
-SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
-SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/windows.c b/driver/windows.c
index c9cdf9d..6f67e13 100644
--- a/driver/windows.c
+++ b/driver/windows.c
@@ -1,5 +1,5 @@
/* windows.c --- turning the screen black; dealing with visuals, virtual roots.
- * xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -38,6 +38,7 @@
#include "atoms.h"
#include "visual.h"
#include "screens.h"
+#include "screenshot.h"
#include "fade.h"
#include "resources.h"
#include "xft.h"
@@ -218,7 +219,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
if (ssi->error_dialog)
{
- XDestroyWindow (si->dpy, ssi->error_dialog);
+ defer_XDestroyWindow (si->app, si->dpy, ssi->error_dialog);
ssi->error_dialog = 0;
}
@@ -260,7 +261,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi)
fprintf (stderr,
"%s: someone horked our saver window (0x%lx)! Recreating it...\n",
blurb(), (unsigned long) horked_window);
- XDestroyWindow (si->dpy, horked_window);
+ defer_XDestroyWindow (si->app, si->dpy, horked_window);
}
if (p->verbose_p > 1)
@@ -435,6 +436,16 @@ blank_screen (saver_info *si)
initialize_screensaver_window (si);
sync_server_dpms_settings (si->dpy, p);
+ /* Save a screenshot. Must be before fade-out. */
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->screenshot)
+ XFreePixmap (si->dpy, ssi->screenshot);
+ ssi->screenshot =
+ screenshot_grab (si->dpy, ssi->screensaver_window, False, p->verbose_p);
+ }
+
if (p->fade_p &&
!si->demoing_p &&
!si->emergency_p)
@@ -687,7 +698,7 @@ select_visual (saver_screen_info *ssi, const char *visual_name)
raise_window (ssi);
/* Now we can destroy the old window without horking our grabs. */
- XDestroyWindow (si->dpy, old_w);
+ defer_XDestroyWindow (si->app, si->dpy, old_w);
if (p->verbose_p > 1)
fprintf (stderr, "%s: %d: destroyed old saver window 0x%lx\n",
@@ -724,7 +735,6 @@ update_screen_layout (saver_info *si)
free_monitors (si->monitor_layout);
si->monitor_layout = monitors;
- check_monitor_sanity (si->monitor_layout);
while (monitors[count])
{
@@ -740,13 +750,13 @@ update_screen_layout (saver_info *si)
calloc (sizeof(*si->screens), si->ssi_count);
}
- if (si->ssi_count <= good_count)
+ if (si->ssi_count < count)
{
- si->ssi_count = good_count + 10;
si->screens = (saver_screen_info *)
- realloc (si->screens, sizeof(*si->screens) * si->ssi_count);
- memset (si->screens + si->nscreens, 0,
- sizeof(*si->screens) * (si->ssi_count - si->nscreens));
+ realloc (si->screens, sizeof(*si->screens) * count);
+ memset (si->screens + si->ssi_count, 0,
+ sizeof(*si->screens) * (count - si->ssi_count));
+ si->ssi_count = count;
}
if (! si->screens) abort();
@@ -787,11 +797,7 @@ update_screen_layout (saver_info *si)
# ifndef DEBUG_MULTISCREEN
{
saver_preferences *p = &si->prefs;
- if (p->debug_p
-# ifdef QUAD_MODE
- && !p->quad_p
-# endif
- )
+ if (p->debug_p)
ssi->width /= 2;
}
# endif
@@ -814,7 +820,7 @@ cycle_timer (XtPointer closure, XtIntervalId *id)
if (ssi->error_dialog)
{
- XDestroyWindow (si->dpy, ssi->error_dialog);
+ defer_XDestroyWindow (si->app, si->dpy, ssi->error_dialog);
ssi->error_dialog = 0;
}
@@ -884,7 +890,7 @@ screenhack_obituary (saver_screen_info *ssi,
*/
cmap = ssi->cmap ? ssi->cmap : DefaultColormapOfScreen (ssi->screen);
window = ssi->error_dialog;
- if (window) XDestroyWindow (si->dpy, window);
+ if (window) defer_XDestroyWindow (si->app, si->dpy, window);
attrs.override_redirect = True;
attrs.background_pixel = ssi->black_pixel;
attrs.border_pixel = ssi->black_pixel;
@@ -912,7 +918,10 @@ screenhack_obituary (saver_screen_info *ssi,
gcv.line_width = bw;
gc = XCreateGC (si->dpy, window, GCForeground | GCLineWidth, &gcv);
- sprintf (buf, "\"%.100s\" %.100s", name, error);
+ if (name && *name)
+ sprintf (buf, "\"%.100s\" %.100s", name, error);
+ else
+ sprintf (buf, "%.100s", error);
XftTextExtentsUtf8 (si->dpy, font, (FcChar8 *) buf, strlen(buf), &overall);
x = (ssi->width - overall.width) / 2;
@@ -961,6 +970,7 @@ watchdog_timer (XtPointer closure, XtIntervalId *id)
{
saver_info *si = (saver_info *) closure;
saver_preferences *p = &si->prefs;
+ Bool running_p, on_p, terminating_p;
/* If the DPMS settings on the server have changed, change them back to
what ~/.xscreensaver says they should be. */
@@ -971,8 +981,10 @@ watchdog_timer (XtPointer closure, XtIntervalId *id)
raise_windows (si);
- if (any_screenhacks_running_p (si) &&
- !monitor_powered_on_p (si->dpy))
+ running_p = any_screenhacks_running_p (si);
+ on_p = monitor_powered_on_p (si->dpy);
+ terminating_p = si->terminating_p;
+ if (running_p && !on_p)
{
int i;
if (si->prefs.verbose_p)
@@ -981,6 +993,31 @@ watchdog_timer (XtPointer closure, XtIntervalId *id)
blurb());
for (i = 0; i < si->nscreens; i++)
kill_screenhack (&si->screens[i]);
+ /* Do not clear current_hack here. */
+ }
+ else if (terminating_p)
+ {
+ /* If we are in the process of shutting down and are about to exit,
+ don't re-launch anything just because the monitor came back on. */
+ }
+ else if (!running_p && on_p)
+ {
+ /* If the hack number is set but no hack is running, it is because the
+ hack was killed when the monitor powered off, above. This assumes
+ that kill_screenhack() clears pid but not current_hack. Start the
+ hack going again. The cycle_timer will also do this (unless "cycle"
+ is 0) but watchdog_timer runs more frequently.
+ */
+ if (si->nscreens > 0 && si->screens[0].current_hack >= 0)
+ {
+ int i;
+ if (si->prefs.verbose_p)
+ fprintf (stderr,
+ "%s: monitor has powered back on; re-launching hacks\n",
+ blurb());
+ for (i = 0; i < si->nscreens; i++)
+ spawn_screenhack (&si->screens[i]);
+ }
}
/* Re-schedule this timer. The watchdog timer defaults to a bit less
diff --git a/driver/xinput.c b/driver/xinput.c
index 3b21db0..f865f42 100644
--- a/driver/xinput.c
+++ b/driver/xinput.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -9,6 +9,49 @@
* implied warranty.
*/
+/* For our purposes, here are the salient facts about the XInput2 extension:
+
+ - Available by default as of X11R7 in 2009.
+
+ - We receive events from the XIRawEvent family while other processes
+ have the keyboard and mouse grabbed (XI_RawKeyPress, etc.)
+ The entire xscreensaver-auth security model hinges on this fact.
+
+ - We cannot receive events from the XIDeviceEvent family (XI_KeyPress,
+ etc.) so while XIDeviceEvents contain many fields that we would like
+ to have, don't be fooled, those are not available. XIRawEvents such
+ as XI_RawKeyPress cannot be cast to XIDeviceEvent.
+
+ - XI_RawButtonPress, XI_RawButtonRelease and XI_RawMotion contain no
+ usable position information. The non-raw versions do, but we don't
+ receive those, so we have to read that info via XQueryPointer.
+
+ - XI_RawKeyPress and XI_RawKeyRelease contain the keycode (in 'detail')
+ but no modifier info, so, again, to be able to tell "a" from "A" we
+ need to call XQueryPointer.
+
+ - XI_RawKeyPress does not auto-repeat the way Xlib KeyPress does.
+
+ - Raw events have no window, subwindow, etc.
+
+ - Event serial numbers are not unique.
+
+ - If *this* process has the keyboard and mouse grabbed, it receives:
+
+ - KeyPress, KeyRelease
+ - ButtonPress, ButtonRelease, MotionNotify
+ - XI_RawButtonPress, XI_RawButtonRelease, XI_RawMotion (doubly reported)
+
+ - If this process *does not* have keyboard and mouse grabbed, it receives:
+
+ - XI_RawKeyPress, XI_RawKeyRelease
+ - XI_RawButtonPress, XI_RawButtonRelease, XI_RawMotion
+
+ The closest thing to actual documentation on XInput2 seems to be a series
+ of blog posts by Peter Hutterer. There's basically nothing about it on
+ www.x.org. https://who-t.blogspot.com/2009/07/xi2-recipes-part-4.html
+ */
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -35,7 +78,6 @@ extern Bool debug_p;
Bool
init_xinput (Display *dpy, int *opcode_ret)
{
- int nscreens = ScreenCount (dpy);
XIEventMask evmasks[1];
unsigned char mask1[(XI_LASTEVENT + 7)/8];
int major, minor;
@@ -64,6 +106,10 @@ init_xinput (Display *dpy, int *opcode_ret)
memset (mask1, 0, sizeof(mask1));
+ /* The XIRawEvent family of events are delivered to us while someone else
+ holds a grab, but the non-raw versions are not. In fact, attempting to
+ select XI_KeyPress, etc. results in a BadAccess X error.
+ */
XISetMask (mask1, XI_RawMotion);
XISetMask (mask1, XI_RawKeyPress);
XISetMask (mask1, XI_RawKeyRelease);
@@ -73,19 +119,18 @@ init_xinput (Display *dpy, int *opcode_ret)
XISetMask (mask1, XI_RawTouchUpdate);
XISetMask (mask1, XI_RawTouchEnd);
- /* If we use XIAllDevices instead, we get double events. */
+ /* If we use XIAllDevices instead, we get duplicate events. */
evmasks[0].deviceid = XIAllMasterDevices;
evmasks[0].mask_len = sizeof(mask1);
evmasks[0].mask = mask1;
- for (i = 0; i < nscreens; i++)
+ /* Only select events on screen 0 -- if we select on each screen,
+ we get duplicate events. */
+ if (XISelectEvents (dpy, RootWindow (dpy, 0), evmasks, countof(evmasks))
+ != Success)
{
- Window root = RootWindow (dpy, i);
- if (XISelectEvents (dpy, root, evmasks, countof(evmasks)) != Success)
- {
- fprintf (stderr, "%s: XISelectEvents failed\n", blurb());
- return False;
- }
+ fprintf (stderr, "%s: XISelectEvents failed\n", blurb());
+ return False;
}
XFlush (dpy);
@@ -127,33 +172,10 @@ xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
Bool ok = False;
int root_x = 0, root_y = 0;
+ int win_x = 0, win_y = 0;
unsigned int mods = 0;
+ Window subw = 0;
- /* The closest thing to actual documentation on XInput2 seems to be a series
- of blog posts by Peter Hutterer. There's basically nothing about it on
- www.x.org. In http://who-t.blogspot.com/2009/07/xi2-recipes-part-4.html
- he says:
-
- "XIDeviceEvent [...] contains the state of the modifier keys [...]
- The base modifiers are the ones currently pressed, latched the ones
- pressed until a key is pressed that's configured to unlatch it (e.g.
- some shift-capslock interactions have this behaviour) and finally
- locked modifiers are the ones permanently active until unlocked
- (default capslock behaviour in the US layout). The effective modifiers
- are a bitwise OR of the three above - which is essentially equivalent
- to the modifiers state supplied in the core protocol events."
-
- However, I'm seeing random noise in the various XIDeviceEvent.mods fields.
- Nonsensical values like base = 0x6045FB3D. So, let's poll the actual
- modifiers from XQueryPointer. This can race: maybe the modifier state
- changed between when the server generated the keyboard event, and when
- we receive it and poll. However, if an actual human is typing and
- releasing their modifier keys on such a tight timeframe... that's
- probably already not going well.
-
- I'm also seeing random noise in the event_xy and root_xy fields in
- motion events. So just always use XQueryPointer.
- */
switch (evtype) {
case XI_RawKeyPress:
case XI_RawKeyRelease:
@@ -161,12 +183,12 @@ xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
case XI_RawButtonRelease:
case XI_RawMotion:
{
- Window root_ret, child_ret;
+ Window root_ret;
int win_x, win_y;
int i;
for (i = 0; i < ScreenCount (dpy); i++) /* query on correct screen */
if (XQueryPointer (dpy, RootWindow (dpy, i),
- &root_ret, &child_ret, &root_x, &root_y,
+ &root_ret, &subw, &root_x, &root_y,
&win_x, &win_y, &mods))
break;
}
@@ -178,12 +200,12 @@ xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
case XI_RawKeyRelease:
out->xkey.type = (evtype == XI_RawKeyPress ? KeyPress : KeyRelease);
out->xkey.display = in->display;
- out->xkey.window = in->event;
out->xkey.root = in->root;
- out->xkey.subwindow = in->child;
+ out->xkey.window = subw;
+ out->xkey.subwindow = subw;
out->xkey.time = in->time;
- out->xkey.x = root_x;
- out->xkey.y = root_y;
+ out->xkey.x = win_x;
+ out->xkey.y = win_y;
out->xkey.x_root = root_x;
out->xkey.y_root = root_y;
out->xkey.state = mods;
@@ -195,12 +217,12 @@ xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
out->xbutton.type = (evtype == XI_RawButtonPress
? ButtonPress : ButtonRelease);
out->xbutton.display = in->display;
- out->xbutton.window = in->event;
out->xbutton.root = in->root;
- out->xbutton.subwindow = in->child;
+ out->xbutton.window = subw;
+ out->xbutton.subwindow = subw;
out->xbutton.time = in->time;
- out->xbutton.x = root_x;
- out->xbutton.y = root_y;
+ out->xbutton.x = win_x;
+ out->xbutton.y = win_y;
out->xbutton.x_root = root_x;
out->xbutton.y_root = root_y;
out->xbutton.state = mods;
@@ -210,17 +232,34 @@ xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
case XI_RawMotion:
out->xmotion.type = MotionNotify;
out->xmotion.display = in->display;
- out->xmotion.window = in->event;
out->xmotion.root = in->root;
- out->xmotion.subwindow = in->child;
+ out->xmotion.window = subw;
+ out->xmotion.subwindow = subw;
out->xmotion.time = in->time;
- out->xmotion.x = root_x;
- out->xmotion.y = root_y;
+ out->xmotion.x = win_x;
+ out->xmotion.y = win_y;
out->xmotion.x_root = root_x;
out->xmotion.y_root = root_y;
out->xmotion.state = mods;
ok = True;
break;
+ case XI_RawTouchBegin:
+ case XI_RawTouchEnd:
+ out->xbutton.type = (evtype == XI_RawTouchBegin
+ ? ButtonPress : ButtonRelease);
+ out->xbutton.display = in->display;
+ out->xbutton.root = in->root;
+ out->xbutton.window = subw;
+ out->xbutton.subwindow = subw;
+ out->xbutton.time = in->time;
+ out->xbutton.x = win_x;
+ out->xbutton.y = win_y;
+ out->xbutton.x_root = root_x;
+ out->xbutton.y_root = root_y;
+ out->xbutton.state = mods;
+ out->xbutton.button = in->detail;
+ ok = True;
+ break;
default:
break;
}
@@ -230,14 +269,14 @@ xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out)
static void
-print_kbd_event (XEvent *xev, XComposeStatus *compose, Bool x11_p)
+print_kbd_event (XKeyEvent *xkey, XComposeStatus *compose, Bool x11_p)
{
if (debug_p) /* Passwords show up in plaintext! */
{
KeySym keysym = 0;
char c[100];
char M[100], *mods = M;
- int n = XLookupString (&xev->xkey, c, sizeof(c)-1, &keysym, compose);
+ int n = XLookupString (xkey, c, sizeof(c)-1, &keysym, compose);
const char *ks = keysym ? XKeysymToString (keysym) : "NULL";
c[n] = 0;
if (*c == '\n') strcpy (c, "\\n");
@@ -245,31 +284,31 @@ print_kbd_event (XEvent *xev, XComposeStatus *compose, Bool x11_p)
else if (*c == '\t') strcpy (c, "\\t");
*mods = 0;
- if (xev->xkey.state & ShiftMask) strcat (mods, "-Sh");
- if (xev->xkey.state & LockMask) strcat (mods, "-Lk");
- if (xev->xkey.state & ControlMask) strcat (mods, "-C");
- if (xev->xkey.state & Mod1Mask) strcat (mods, "-M1");
- if (xev->xkey.state & Mod2Mask) strcat (mods, "-M2");
- if (xev->xkey.state & Mod3Mask) strcat (mods, "-M3");
- if (xev->xkey.state & Mod4Mask) strcat (mods, "-M4");
- if (xev->xkey.state & Mod5Mask) strcat (mods, "-M5");
+ if (xkey->state & ShiftMask) strcat (mods, "-Sh");
+ if (xkey->state & LockMask) strcat (mods, "-Lk");
+ if (xkey->state & ControlMask) strcat (mods, "-C");
+ if (xkey->state & Mod1Mask) strcat (mods, "-M1");
+ if (xkey->state & Mod2Mask) strcat (mods, "-M2");
+ if (xkey->state & Mod3Mask) strcat (mods, "-M3");
+ if (xkey->state & Mod4Mask) strcat (mods, "-M4");
+ if (xkey->state & Mod5Mask) strcat (mods, "-M5");
if (*mods) mods++;
if (!*mods) strcat (mods, "0");
fprintf (stderr, "%s: %s 0x%02X %s %s \"%s\"\n", blurb(),
(x11_p
- ? (xev->xkey.type == KeyPress
+ ? (xkey->type == KeyPress
? "X11 KeyPress "
: "X11 KeyRelease ")
- : (xev->xkey.type == KeyPress
+ : (xkey->type == KeyPress
? "XI_RawKeyPress "
: "XI_RawKeyRelease")),
- xev->xkey.keycode, mods, ks, c);
+ xkey->keycode, mods, ks, c);
}
else /* Log only that the KeyPress happened. */
{
fprintf (stderr, "%s: X11 Key%s\n", blurb(),
- (xev->xkey.type == KeyPress ? "Press " : "Release"));
+ (xkey->type == KeyPress ? "Press " : "Release"));
}
}
@@ -284,7 +323,7 @@ print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
case KeyRelease:
{
static XComposeStatus compose = { 0, };
- print_kbd_event (xev, &compose, True);
+ print_kbd_event (&xev->xkey, &compose, True);
}
break;
@@ -321,7 +360,7 @@ print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
{
/* Fake up an XKeyEvent in order to call XKeysymToString(). */
XEvent ev2;
- Bool ok = xinput_event_to_xlib (xev->xcookie.evtype,
+ Bool ok = xinput_event_to_xlib (re->evtype,
(XIDeviceEvent *) re,
&ev2);
if (!ok)
@@ -329,7 +368,7 @@ print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
else
{
static XComposeStatus compose = { 0, };
- print_kbd_event (&ev2, &compose, False);
+ print_kbd_event (&ev2.xkey, &compose, False);
}
break;
}
@@ -340,9 +379,18 @@ print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
case XI_RawButtonPress:
case XI_RawButtonRelease:
- fprintf (stderr, "%s: XI RawButton%s %d\n", blurb(),
- (re->evtype == XI_RawButtonPress ? "Press " : "Release"),
- re->detail);
+ {
+ Window root_ret, child_ret;
+ int root_x, root_y;
+ int win_x, win_y;
+ unsigned int mask;
+ XQueryPointer (dpy, DefaultRootWindow (dpy),
+ &root_ret, &child_ret, &root_x, &root_y,
+ &win_x, &win_y, &mask);
+ fprintf (stderr, "%s: XI _RawButton%s %4d, %-4d\n", blurb(),
+ (re->evtype == XI_RawButtonPress ? "Press " : "Release"),
+ root_x, root_y);
+ }
break;
case XI_RawMotion:
diff --git a/driver/xinput.h b/driver/xinput.h
index 2ee20ee..75ef275 100644
--- a/driver/xinput.h
+++ b/driver/xinput.h
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
diff --git a/driver/xscreensaver-auth.c b/driver/xscreensaver-auth.c
index 4344d20..a65cc0d 100644
--- a/driver/xscreensaver-auth.c
+++ b/driver/xscreensaver-auth.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -167,6 +167,66 @@ oom_assassin_immunity (void)
#endif /* HAVE_PROC_OOM */
+#ifndef HAVE_DPMS_EXTENSION
+# define dpms_init (dpy) /** */
+
+#else /* HAVE_DPMS_EXTENSION */
+
+# include <X11/Xproto.h>
+# include <X11/extensions/dpms.h>
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ return 0;
+}
+
+/* When XScreenSaver first launches, power on the monitor and disable DPMS.
+ The DPMS settings will be re-written when 'xscreensaver-gfx' launches for
+ the first time to blank the screen, and will be re-enabled if that is what
+ is configured in ~/.xscreensaver.
+
+ Without this, if the server's default DPMS timeouts are different than, and
+ less than, the .xscreensaver file's 'timeout' and 'dpmsStandby' the monitor
+ will already be powered down when 'xscreensaver-gfx' launches for the first
+ time, and it will never change them, as it can't touch those settings if
+ the monitor is already powered off.
+
+ It would be better for us to call sync_server_dpms_settings() here, but
+ that requires a full 'saver_preferences' struct. Once 'xscreensaver-gfx'
+ is launched, it will correct things.
+
+ The only way this behaves oddly is if the user has set their 'dpmsStandby'
+ to less than their 'timeout', but that would be weird, right? That
+ probably shouldn't even be permitted (though currently it is).
+
+ This is in 'xscreensaver-auth' because that's run at startup with either
+ --splash or --init, long before 'xscreensaver-gfx' is run for the first
+ time; and putting this code into 'xscreensaver' would violate the principle
+ of linking only the bare minimum into the daemon itself.
+ */
+static void
+dpms_init (Display *dpy)
+{
+ int ev, err;
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XSync (dpy, False);
+
+ if (DPMSQueryExtension (dpy, &ev, &err))
+ {
+ DPMSForceLevel (dpy, DPMSModeOn);
+ DPMSDisable (dpy);
+ }
+ XSetScreenSaver (dpy, 0, 0, 0, 0);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+}
+#endif /* HAVE_DPMS_EXTENSION */
+
+
int
main (int argc, char **argv)
{
@@ -175,7 +235,7 @@ main (int argc, char **argv)
Widget root_widget;
char *dpy_str = getenv ("DISPLAY");
Bool xsync_p = False;
- Bool splash_p = False;
+ int splash_p = 0;
Bool init_p = False;
int i;
@@ -225,13 +285,20 @@ main (int argc, char **argv)
dpy_str = argv[++i];
if (!dpy_str) goto HELP;
}
+ else if (!strcmp (argv[i], "-ver") ||
+ !strcmp (argv[i], "-vers") ||
+ !strcmp (argv[i], "-version"))
+ {
+ fprintf (stderr, "%s\n", screensaver_id+4);
+ exit (1);
+ }
else if (!strcmp (argv[i], "-sync") ||
!strcmp (argv[i], "-synch") ||
!strcmp (argv[i], "-synchronize") ||
!strcmp (argv[i], "-synchronise"))
xsync_p = True;
else if (!strcmp (argv[i], "-splash"))
- splash_p = True;
+ splash_p++; /* 0, 1 or 2 */
else if (!strcmp (argv[i], "-init"))
init_p = True;
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "-help"))
@@ -266,19 +333,16 @@ main (int argc, char **argv)
}
# ifdef HAVE_PROC_OOM
- if (splash_p || init_p)
+ if (splash_p == 1 || init_p)
oom_assassin_immunity ();
# endif
if (!splash_p && !init_p)
lock_priv_init ();
- if (!splash_p && init_p)
- exit (0);
-
disavow_privileges ();
- if (!splash_p)
+ if (!splash_p && !init_p)
lock_init ();
/* Setting the locale is necessary for XLookupString to return multi-byte
@@ -316,9 +380,17 @@ main (int argc, char **argv)
if (xsync_p) XSynchronize (dpy, True);
init_xscreensaver_atoms (dpy);
- if (splash_p)
+ if (splash_p == 1 || init_p)
+ dpms_init (dpy);
+
+ if (!splash_p && init_p)
+ {
+ exit (0);
+ }
+ else if (splash_p)
{
- xscreensaver_splash (root_widget);
+ /* Settings button is disabled with --splash --splash */
+ xscreensaver_splash (root_widget, splash_p > 1);
exit (0);
}
else if (xscreensaver_auth ((void *) root_widget,
diff --git a/driver/xscreensaver-auth.man b/driver/xscreensaver-auth.man
index 1655602..6da3740 100644
--- a/driver/xscreensaver-auth.man
+++ b/driver/xscreensaver-auth.man
@@ -3,7 +3,7 @@
xscreensaver - extensible screen saver and screen locking framework
.SH SYNOPSIS
.B xscreensaver-auth
-[\-display \fIhost:display.screen\fP]
+[\-\-display \fIhost:display.screen\fP] [\-\-version]
.SH DESCRIPTION
The
.BR xscreensaver (1)
@@ -15,7 +15,7 @@ Do not run this program directly.
.BR xscreensaver\-gfx (MANSUFFIX),
.BR xscreensaver\-systemd (MANSUFFIX).
.SH COPYRIGHT
-Copyright \(co 2021 by Jamie Zawinski.
+Copyright \(co 2021-2022 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c
index 0dab564..1e09ba8 100644
--- a/driver/xscreensaver-command.c
+++ b/driver/xscreensaver-command.c
@@ -1,4 +1,4 @@
-/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright © 1991-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -186,8 +186,6 @@ main (int argc, char **argv)
else if (!strncmp (s, "-exit", L)) cmd = &XA_EXIT;
else if (!strncmp (s, "-restart", L)) cmd = &XA_RESTART;
else if (!strncmp (s, "-demo", L)) cmd = &XA_DEMO;
- else if (!strncmp (s, "-preferences",L)) cmd = &XA_PREFS;
- else if (!strncmp (s, "-prefs",L)) cmd = &XA_PREFS;
else if (!strncmp (s, "-lock", L)) cmd = &XA_LOCK;
else if (!strncmp (s, "-version", L)) cmd = &XA_SCREENSAVER_VERSION;
else if (!strncmp (s, "-time", L)) cmd = &XA_SCREENSAVER_STATUS;
@@ -221,9 +219,9 @@ main (int argc, char **argv)
USAGE("bad option", cmdstr);
else if (arg == 0)
{
- /* SELECT must have a non-zero argument. */
- if (cmd == &XA_SELECT)
- USAGE("bad option", cmdstr);
+ /* SELECT and DEMO must have a non-zero argument. */
+ if (cmd == &XA_SELECT || cmd == &XA_DEMO)
+ USAGE("missing hack number", cmdstr);
}
else /* arg > 0 */
{
@@ -232,39 +230,10 @@ main (int argc, char **argv)
USAGE("bad option", cmdstr);
}
-
-
- /* -demo with no arguments launches xscreensaver-settings.
- -demo N sends a message to the daemon demo that hack number.
- */
- if (cmd == &XA_PREFS ||
- (cmd == &XA_DEMO && arg == 0))
- {
- char buf [512];
- char *new_argv[] = { "xscreensaver-settings", 0, 0, 0, 0, 0 };
- int ac = 1;
-
- if (dpyname)
- {
- new_argv[ac++] = "-display";
- new_argv[ac++] = dpyname;
- }
-
- if (cmd == &XA_PREFS)
- new_argv[ac++] = "-prefs";
-
- fflush(stdout);
- fflush(stderr);
- execvp (new_argv[0], new_argv); /* shouldn't return */
-
- sprintf (buf, "%s: could not exec %s", progname, new_argv[0]);
- perror(buf);
- fflush(stdout);
- fflush(stderr);
- exit (-1);
- }
-
-
+ /* Include the parent's pid with --deactivate so that the logs can give a
+ hint as to what other process is preventing the screen from blanking. */
+ if (cmd == &XA_DEACTIVATE)
+ arg = (long) getppid();
if (!dpyname) dpyname = (char *) getenv ("DISPLAY");
diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man
index 6d52d2a..c0301d4 100644
--- a/driver/xscreensaver-command.man
+++ b/driver/xscreensaver-command.man
@@ -24,39 +24,23 @@ xscreensaver-command - control a running xscreensaver process
The \fIxscreensaver\-command\fP program controls a running
.BR xscreensaver (1)
daemon.
-
.SH OPTIONS
.I xscreensaver-command
accepts the following command-line options:
-
.TP 8
.B \-\-help
Prints a brief summary of command-line options.
-
.TP 8
.B \-\-quiet
Only print output if an error occurs.
-
.TP 8
.B \-\-verbose
Opposite of \-\-quiet. Default.
-
.TP 8
.B \-\-activate
Tell xscreensaver to turn on immediately (that is, blank the screen, as if
the user had been idle for long enough.) The screensaver will deactivate as
soon as there is any user activity, as usual.
-
-It is useful to run this from a menu; you may wish to run it as
-.nf
-.sp
- sleep 5 ; xscreensaver-command -activate
-.sp
-.fi
-to be sure that you have time to take your hand off the mouse before
-the screensaver comes on. (Because if you jiggle the mouse, xscreensaver
-will notice, and deactivate.)
-
.TP 8
.B \-\-deactivate
This tells xscreensaver to pretend that there has just been user activity.
@@ -67,32 +51,27 @@ dialog will pop up first, as usual. If the screen is not blanked, then
this simulated user activity will re-start the countdown (so, issuing
the \fI\-\-deactivate\fP command periodically is \fIone\fP way to prevent
the screen from blanking.)
-
.TP 8
.B \-\-cycle
If the screensaver is active (the screen is blanked), then stop the current
graphics demo and run a new one (chosen randomly.)
-
.TP 8
.B \-\-next
This is like either \fI\-\-activate\fP or \fI\-\-cycle\fP, depending on which
is more appropriate, except that the graphics hack that will be run is the
next one in the list, instead of a randomly-chosen one. In other words,
-repeatedly executing -next will cause the xscreensaver process to invoke each
-graphics demo sequentially. (Though using the \fI\-\-settings\fP option is
-probably an easier way to accomplish that.)
-
+repeatedly executing \-\-next will cause the xscreensaver process to invoke
+each graphics demo sequentially. (Though using the \fI\-\-settings\fP option
+is probably an easier way to accomplish that.)
.TP 8
.B \-\-prev
This is like \fI\-\-next\fP, but cycles in the other direction.
-
.TP 8
-.B \-\-select \fInumber\fP
+.B \-\-select\fP \fInumber\fP
Like \fI\-\-activate\fP, but runs the \fIN\fPth element in the list of hacks.
By knowing what is in the \fIprograms\fP list, and in what order, you can use
this to activate the screensaver with a particular graphics demo. (The first
element in the list is numbered 1, not 0.)
-
.TP 8
.B \-\-lock
Tells the running xscreensaver process to lock the screen immediately.
@@ -104,39 +83,31 @@ Note that locking doesn't work unless the \fIxscreensaver\fP process is
running as you. See
.BR xscreensaver (1)
for details.
-
.TP 8
.B \-\-suspend
Like \fI\-\-activate\fP, but ignores \fIlockTimeout\fP and immediately
powers off the screen without fading out. This is intended to be run
just after your laptop's lid is closed, and just before the CPU halts,
to lock things down quickly.
-
.TP 8
.B \-\-exit
Causes the xscreensaver process to exit gracefully.
This does nothing if the display is currently locked.
-
.B Warning:
-never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is
-active. If you are using a virtual root window manager, that can leave
-things in an inconsistent state, and you may need to restart your window
-manager to repair the damage.
-
+never use \fIkill -9\fP with \fIxscreensaver\fP. That can leave things in an
+inconsistent state, and you may need to log out to repair the damage.
.TP 8
.B \-\-restart
Causes the screensaver process to exit and then restart with the same command
line arguments as last time. You shouldn't really need to do this,
since xscreensaver notices when the \fI.xscreensaver\fP file has
changed and re-reads it as needed.
-
.TP 8
.B \-\-time
Prints the time at which the screensaver last activated or
deactivated (roughly, how long the user has been idle or non-idle: but
not quite, since it only tells you when the screen became blanked or
un-blanked.)
-
.TP 8
.B \-\-watch
Prints a line each time the screensaver changes state: when the screen
@@ -188,7 +159,6 @@ the \fI\-\-watch\fP command and reacts accordingly:
Note that LOCK might come either with or without a preceding BLANK
(depending on whether the lock-timeout is non-zero), so the above program
keeps track of both of them.
-
.TP 8
.B \-\-version
Prints the version of xscreensaver that is currently running on the display:
@@ -196,7 +166,6 @@ that is, the actual version number of the running xscreensaver background
process, rather than the version number of xscreensaver-command. (To see
the version number of \fIxscreensaver-command\fP itself, use
the \fI\-\-help\fP option.)
-
.SH STOPPING GRAPHICS
If xscreensaver is running, but you want it to stop running screen hacks
(e.g., if you are logged in remotely, and you want the console to remain
@@ -246,7 +215,7 @@ and related tools can always be found at https://www.jwz.org/xscreensaver/
.BR xscreensaver\-settings (1),
.BR xset (1)
.SH COPYRIGHT
-Copyright \(co 1992-2021 by Jamie Zawinski.
+Copyright \(co 1992-2022 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
@@ -255,6 +224,6 @@ supporting documentation. No representations are made about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-1992.
+Jamie Zawinski <jwz@jwz.org>.
Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-demo.glade2.in b/driver/xscreensaver-demo.glade2.in
deleted file mode 100644
index ad0095d..0000000
--- a/driver/xscreensaver-demo.glade2.in
+++ /dev/null
@@ -1,3136 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkWindow" id="xscreensaver_demo">
- <property name="title" translatable="yes">XScreenSaver</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
-
- <child>
- <widget class="GtkVBox" id="outer_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">5</property>
-
- <child>
- <widget class="GtkMenuBar" id="menubar">
- <property name="visible">True</property>
- <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
- <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
-
- <child>
- <widget class="GtkMenuItem" id="file">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_File</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="file_menu_cb" last_modification_time="Sun, 06 Mar 2005 21:41:13 GMT"/>
-
- <child>
- <widget class="GtkMenu" id="file_menu">
-
- <child>
- <widget class="GtkMenuItem" id="activate_menu">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Blank Screen Now</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="activate_menu_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="lock_menu">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Lock Screen Now</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="lock_menu_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="kill_menu">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Kill Daemon</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="kill_menu_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="restart">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Restart Daemon</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="restart_menu_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="separator1">
- <property name="visible">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="exit_menu">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Quit</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="exit_menu_cb"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="help">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Help</property>
- <property name="use_underline">True</property>
-
- <child>
- <widget class="GtkMenu" id="help_menu">
-
- <child>
- <widget class="GtkMenuItem" id="about_menu">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_About...</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="about_menu_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="doc_menu">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Documentation...</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="doc_menu_cb"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="spacer_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkNotebook" id="notebook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
- <signal name="switch_page" handler="switch_page_cb"/>
-
- <child>
- <widget class="GtkTable" id="demos_table">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkTable" id="blanking_table">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">2</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="cycle_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Cycle After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">cycle_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="cycle_spinbutton" type="label-for"/>
- <atkrelation target="cycle_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEventBox" id="lock_button_eventbox">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether a password should be required to un-blank the screen.</property>
- <property name="visible_window">True</property>
- <property name="above_child">False</property>
-
- <child>
- <widget class="GtkCheckButton" id="lock_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Lock Screen After </property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Lock Screen</atkproperty>
- <atkrelation target="lock_spinbutton" type="controller-for"/>
- <atkrelation target="lock_spinbutton" type="label-for"/>
- <atkrelation target="lock_spinbutton" type="flows-to"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="timeout_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long before the screen saver activates.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 1 720 1 15 0</property>
- <accessibility>
- <atkrelation target="timeout_label" type="labelled-by"/>
- <atkrelation target="timeout_mlabel" type="labelled-by"/>
- <atkrelation target="timeout_label" type="flows-from"/>
- <atkrelation target="timeout_mlabel" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="lock_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long after the screen blanks until a password will be required.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 720 1 15 0</property>
- <accessibility>
- <atkproperty name="AtkObject::accessible_name" translatable="yes">Lock Screen After</atkproperty>
- <atkrelation target="lock_button" type="controlled-by"/>
- <atkrelation target="lock_button" type="labelled-by"/>
- <atkrelation target="lock_mlabel" type="labelled-by"/>
- <atkrelation target="lock_button" type="flows-from"/>
- <atkrelation target="lock_mlabel" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_padding">10</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="cycle_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long each display mode should run before choosing a new one (in Random mode.)</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 720 1 15 0</property>
- <accessibility>
- <atkrelation target="cycle_label" type="labelled-by"/>
- <atkrelation target="cycle_mlabel" type="labelled-by"/>
- <atkrelation target="cycle_label" type="flows-from"/>
- <atkrelation target="cycle_mlabel" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="lock_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="lock_spinbutton" type="label-for"/>
- <atkrelation target="lock_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="cycle_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="cycle_spinbutton" type="label-for"/>
- <atkrelation target="cycle_spinbutton" type="flows-from"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="timeout_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Blank After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">timeout_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="timeout_spinbutton" type="label-for"/>
- <atkrelation target="timeout_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="timeout_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="timeout_spinbutton" type="label-for"/>
- <atkrelation target="timeout_spinbutton" type="flows-from"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="demo_manual_hbbox">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
- <property name="spacing">30</property>
-
- <child>
- <widget class="GtkButton" id="demo">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Demo the selected screen saver in full-screen mode (click the mouse to return.)</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Preview</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="run_this_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="settings">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Customization and explanation of the selected screen saver.</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Settings...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="settings_cb"/>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="list_vbox">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkHBox" id="mode_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="mode_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Mode:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">mode_menu</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="mode_menu_popup" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkOptionMenu" id="mode_menu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="history">0</property>
- <accessibility>
- <atkrelation target="mode_label" type="labelled-by"/>
- </accessibility>
-
- <child internal-child="menu">
- <widget class="GtkMenu" id="mode_menu_popup">
- <property name="visible">True</property>
-
- <child>
- <widget class="GtkMenuItem" id="disable_menuitem">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Never blank the screen or power down the monitor.</property>
- <property name="label" translatable="yes">_Disable Screen Saver</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="blank_menuitem">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">When idle or locked, blacken the screen only.</property>
- <property name="label" translatable="yes">_Blank Screen Only</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="one_menuitem">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">When idle or locked, run the display mode selected below.</property>
- <property name="label" translatable="yes">_Only One Screen Saver</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="random_menuitem">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">When idle or locked, choose a random display mode from among the checked items in the list below.</property>
- <property name="label" translatable="yes">_Random Screen Saver</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkMenuItem" id="random_same_menuitem">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">When idle or locked, choose a random display mode from among the checked items in the list below. Run that same mode on each monitor.</property>
- <property name="label" translatable="yes">_Same Random Savers</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">4</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">10</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkScrolledWindow" id="scroller">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTreeView" id="list">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- <property name="rules_hint">True</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- <property name="fixed_height_mode">False</property>
- <property name="hover_selection">False</property>
- <property name="hover_expand">False</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="centering_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkHBox" id="next_prev_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkButton" id="next">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="run_next_cb"/>
-
- <child>
- <widget class="GtkArrow" id="arrow1">
- <property name="visible">True</property>
- <property name="arrow_type">GTK_ARROW_DOWN</property>
- <property name="shadow_type">GTK_SHADOW_OUT</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="prev">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="run_prev_cb"/>
-
- <child>
- <widget class="GtkArrow" id="arrow2">
- <property name="visible">True</property>
- <property name="arrow_type">GTK_ARROW_UP</property>
- <property name="shadow_type">GTK_SHADOW_OUT</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="preview_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <atkrelation target="label1" type="labelled-by"/>
- </accessibility>
-
- <child>
- <widget class="GtkNotebook" id="preview_notebook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">False</property>
- <property name="tab_pos">GTK_POS_BOTTOM</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkAspectFrame" id="preview_aspectframe">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="ratio">1.33000004292</property>
- <property name="obey_child">False</property>
-
- <child>
- <widget class="GtkDrawingArea" id="preview">
- <property name="visible">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="preview_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">preview</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="no_preview_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">No Preview
-Available</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="no_preview_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">no preview</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="not_installed_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Not
-Installed</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="not_installed_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">not installed</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="nothing_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
-
-This probably means that the &quot;xscreensaver-extras&quot; and
-&quot;xscreensaver-gl-extras&quot; packages are not installed.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="nothing_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">nothing</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Description</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="preview_frame" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_padding">6</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">expand|shrink|fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="demo_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Display Modes</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">notebook</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="options_table">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">True</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkFrame" id="grab_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <atkrelation target="label2" type="labelled-by"/>
- </accessibility>
-
- <child>
- <widget class="GtkHBox" id="grab_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child>
- <widget class="GtkImage" id="image2">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-snap.png</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">4</property>
- <property name="ypad">8</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="grab_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="grab_desk_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Grab Desktop _Images</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="grab_video_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one.)</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Grab _Video Frames</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="grab_image_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the image-manipulating modes should load image files.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Choose _Random Image:</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkrelation target="image_text" type="controller-for"/>
- <atkrelation target="image_browse_button" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="image_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="grab_dummy">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="image_text">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">The local directory, RSS feed or Atom feed from which images will be randomly chosen.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="grab_image_button" type="labelled-by"/>
- <atkrelation target="grab_image_button" type="controlled-by"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- </widget>
- <packing>
- <property name="padding">2</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="image_browse_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Browse</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="browse_image_dir_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Local directory, or RSS feed URL.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">20</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Image Manipulation</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="grab_frame" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="diag_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <atkrelation target="label3" type="labelled-by"/>
- </accessibility>
-
- <child>
- <widget class="GtkHBox" id="diag_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child>
- <widget class="GtkImage" id="diag_logo">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-diagnostic.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="text_table">
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">2</property>
- <property name="column_spacing">2</property>
-
- <child>
- <widget class="GtkRadioButton" id="text_radio">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the text typed here.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Text</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkrelation target="text_entry" type="controller-for"/>
- <atkrelation target="text_entry" type="label-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:44 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="text_file_radio">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this file.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Text _file</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <accessibility>
- <atkrelation target="text_file_entry" type="label-for"/>
- <atkrelation target="text_file_entry" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:55 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="text_program_radio">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the output of this program.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Program</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <accessibility>
- <atkrelation target="text_program_entry" type="label-for"/>
- <atkrelation target="text_program_entry" type="controller-for"/>
- <atkrelation target="text_program_browse" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:07 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="text_url_radio">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_URL</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <accessibility>
- <atkrelation target="text_url_entry" type="label-for"/>
- <atkrelation target="text_url_entry" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:17 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="text_host_radio">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the local host name, date, and time.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Host Name and Time</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">True</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:32 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="text_url_entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="text_url_radio" type="controlled-by"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:10 GMT"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:26 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="text_file_browse">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Browse</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <accessibility>
- <atkrelation target="text_file_radio" type="controlled-by"/>
- </accessibility>
- <signal name="clicked" handler="browse_text_file_cb" last_modification_time="Sun, 20 Mar 2005 01:24:38 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="text_entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the text typed here.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="text_program_radio" type="labelled-by"/>
- <atkrelation target="text_program_radio" type="controlled-by"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:42 GMT"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:43 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="text_program_entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the output of this program.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="text_program_radio" type="labelled-by"/>
- <atkrelation target="text_program_radio" type="controlled-by"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:02 GMT"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:15 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkButton" id="text_program_browse">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Browse</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <accessibility>
- <atkrelation target="text_program_radio" type="controller-for"/>
- </accessibility>
- <signal name="clicked" handler="browse_text_program_cb" last_modification_time="Sun, 20 Mar 2005 01:24:51 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="text_file_entry">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this file.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="text_file_radio" type="labelled-by"/>
- <atkrelation target="text_file_radio" type="controlled-by"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:53 GMT"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:55 GMT"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Text Manipulation</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="diag_frame" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="dpms_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
- <child>
- <widget class="GtkHBox" id="dpms_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child>
- <widget class="GtkImage" id="dpms_logo">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-power.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox6">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="dpms_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the monitor should be powered down after a while.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Power Management Enabled</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">True</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkrelation target="dpms_suspend_spinbutton" type="controller-for"/>
- <atkrelation target="dpms_standby_spinbutton" type="controller-for"/>
- <atkrelation target="dpms_off_spinbutton" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="dpms_table">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">2</property>
- <property name="column_spacing">4</property>
-
- <child>
- <widget class="GtkLabel" id="dpms_standby_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Stand_by After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">10</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dpms_standby_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_standby_spinbutton" type="label-for"/>
- <atkrelation target="dpms_standby_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="dpms_suspend_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sus_pend After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">10</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dpms_suspend_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_suspend_spinbutton" type="label-for"/>
- <atkrelation target="dpms_suspend_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="dpms_off_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Off After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">10</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dpms_off_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_off_spinbutton" type="label-for"/>
- <atkrelation target="dpms_off_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="dpms_standby_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_standby_spinbutton" type="label-for"/>
- <atkrelation target="dpms_standby_spinbutton" type="flows-from"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="dpms_suspend_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_suspend_spinbutton" type="label-for"/>
- <atkrelation target="dpms_suspend_spinbutton" type="flows-from"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="dpms_off_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_off_spinbutton" type="label-for"/>
- <atkrelation target="dpms_off_spinbutton" type="flows-from"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="dpms_off_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long until the monitor powers down.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 1440 1 15 0</property>
- <accessibility>
- <atkrelation target="dpms_button" type="controlled-by"/>
- <atkrelation target="dpms_off_label" type="labelled-by"/>
- <atkrelation target="dpms_off_mlabel" type="labelled-by"/>
- <atkrelation target="dpms_off_label" type="flows-from"/>
- <atkrelation target="dpms_off_mlabel" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="dpms_suspend_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long until the monitor goes into power-saving mode.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 1440 1 15 0</property>
- <accessibility>
- <atkrelation target="dpms_button" type="controlled-by"/>
- <atkrelation target="dpms_suspend_label" type="labelled-by"/>
- <atkrelation target="dpms_suspend_mlabel" type="labelled-by"/>
- <atkrelation target="dpms_suspend_label" type="flows-from"/>
- <atkrelation target="dpms_suspend_mlabel" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="dpms_standby_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long until the monitor goes completely black.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 1440 1 15 0</property>
- <accessibility>
- <atkrelation target="dpms_button" type="controlled-by"/>
- <atkrelation target="dpms_standby_label" type="labelled-by"/>
- <atkrelation target="dpms_standby_mlabel" type="labelled-by"/>
- <atkrelation target="dpms_standby_label" type="flows-from"/>
- <atkrelation target="dpms_standby_mlabel" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="dpms_quickoff_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Quick Power-off in Blank Only Mode</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Display Power Management</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="dpms_frame" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="cmap_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <atkrelation target="label5" type="labelled-by"/>
- </accessibility>
-
- <child>
- <widget class="GtkHBox" id="cmap_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child>
- <widget class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-colorselector.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkCheckButton" id="fade_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the screen should slowly fade to black when the screen saver activates.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Fade to Black when _Blanking</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkrelation target="fade_spinbutton" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="unfade_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether the screen should slowly fade in from black when the screen saver deactivates.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <atkrelation target="fade_spinbutton" type="controller-for"/>
- </accessibility>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="fade_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="fade_dummy">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">3</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="fade_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">F_ade Duration</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">fade_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="fade_spinbutton" type="label-for"/>
- <atkrelation target="fade_spinbutton" type="flows-to"/>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">14</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkSpinButton" id="fade_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">How long it should take for the screen to fade in and out.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 0 10 1 1 0</property>
- <accessibility>
- <atkrelation target="unfade_button" type="controlled-by"/>
- <atkrelation target="fade_button" type="controlled-by"/>
- <atkrelation target="fade_label" type="labelled-by"/>
- <atkrelation target="fade_sec_label" type="labelled-by"/>
- <atkrelation target="fade_label" type="flows-from"/>
- <atkrelation target="fade_sec_label" type="flows-to"/>
- </accessibility>
- <signal name="activate" handler="pref_changed_cb"/>
- <signal name="focus_out_event" handler="pref_changed_event_cb"/>
- <signal name="value_changed" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">4</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="fade_sec_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">seconds</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="fade_spinbutton" type="label-for"/>
- <atkrelation target="fade_spinbutton" type="flows-from"/>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">2</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHSeparator" id="cmap_hr">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="padding">8</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="install_button">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Whether to install a private colormap when running in 8-bit mode on the default Visual.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Install _Colormap</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="pref_changed_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Fading and Colormaps</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="cmap_frame" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="options_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Advanced</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">notebook</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox2">
- <property name="border_width">5</property>
- <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
- <property name="spacing">10</property>
-
- <child>
- <widget class="GtkButton" id="helpbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-help</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="doc_menu_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="closebutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-close</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="exit_menu_cb"/>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-<widget class="GtkDialog" id="xscreensaver_settings_dialog">
- <property name="title" translatable="yes">dialog1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- @COMMENT_DEMO_GLADE2_GTK_2_22_HEAD@<property name="has_separator">False</property>@COMMENT_DEMO_GLADE2_GTK_2_22_TAIL@
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog_action_area">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="adv_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="settings_adv_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="std_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Standard &lt;&lt;</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="settings_std_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="reset_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Reset to Defaults</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="settings_reset_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="cancel_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-6</property>
- <signal name="clicked" handler="settings_cancel_cb"/>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="ok_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="response_id">-5</property>
- <signal name="clicked" handler="settings_ok_cb"/>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkFrame" id="opt_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <atkrelation target="label6" type="labelled-by"/>
- </accessibility>
-
- <child>
- <widget class="GtkNotebook" id="opt_notebook">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">False</property>
- <property name="tab_pos">GTK_POS_BOTTOM</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
- <signal name="switch_page" handler="settings_switch_page_cb"/>
-
- <child>
- <widget class="GtkVBox" id="settings_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">True</property>
- <property name="tab_fill">True</property>
- <property name="tab_pack">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="std_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Standard</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="adv_table">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkImage" id="cmd_logo">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-cmndln.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">4</property>
- <property name="ypad">8</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="cmd_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Command Line:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">cmd_text</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="cmd_text" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="cmd_text">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <atkrelation target="cmd_label" type="labelled-by"/>
- </accessibility>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="visual_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="visual">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Visual:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">3</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">visual_entry</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="visual_combo" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCombo" id="visual_combo">
- <property name="visible">True</property>
- <property name="value_in_list">False</property>
- <property name="allow_empty">True</property>
- <property name="case_sensitive">False</property>
- <property name="enable_arrow_keys">True</property>
- <property name="enable_arrows_always">False</property>
- <accessibility>
- <atkrelation target="visual" type="labelled-by"/>
- </accessibility>
-
- <child internal-child="entry">
- <widget class="GtkEntry" id="visual_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
-
- <child internal-child="list">
- <widget class="GtkList" id="combo-list1">
- <property name="visible">True</property>
- <property name="selection_mode">GTK_SELECTION_BROWSE</property>
-
- <child>
- <widget class="GtkListItem" id="listitem25">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Any</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem26">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Best</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem27">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Default</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem28">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Default-N</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem29">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">GL</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem30">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">TrueColor</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem31">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">PseudoColor</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem32">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">StaticGray</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem33">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">GrayScale</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem34">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">DirectColor</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem35">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Color</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem36">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Gray</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkListItem" id="listitem37">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Mono</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="adv_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Advanced</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Settings</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <atkrelation target="opt_frame" type="label-for"/>
- </accessibility>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkFrame" id="doc_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkVBox" id="doc_vbox">
- <property name="border_width">5</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">5</property>
-
- <child>
- <widget class="GtkLabel" id="doc">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">True</property>
- <property name="selectable">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkButton" id="manual">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Documentation...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="manual_cb"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
-</glade-interface>
diff --git a/driver/xscreensaver-demo.glade2p b/driver/xscreensaver-demo.glade2p
deleted file mode 100644
index 3dfe894..0000000
--- a/driver/xscreensaver-demo.glade2p
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
-
-<glade-project>
- <name>XScreenSaver Demo</name>
- <program_name>xscreensaver-demo</program_name>
- <source_directory></source_directory>
- <pixmaps_directory>../utils/images</pixmaps_directory>
- <use_widget_names>TRUE</use_widget_names>
- <output_main_file>FALSE</output_main_file>
- <output_build_files>FALSE</output_build_files>
- <backup_source_files>FALSE</backup_source_files>
- <main_source_file>demo-Gtk2-widgets.c</main_source_file>
- <main_header_file>demo-Gtk2-widgets.h</main_header_file>
- <handler_source_file>demo-Gtk2-stubs.c</handler_source_file>
- <handler_header_file>demo-Gtk2-stubs.h</handler_header_file>
- <support_source_file>demo-Gtk2-support.c</support_source_file>
- <support_header_file>demo-Gtk2-support.h</support_header_file>
-</glade-project>
diff --git a/driver/xscreensaver-demo.man b/driver/xscreensaver-demo.man
deleted file mode 100644
index 7da5fea..0000000
--- a/driver/xscreensaver-demo.man
+++ /dev/null
@@ -1,402 +0,0 @@
-.de EX \"Begin example
-.ne 5
-.if n .sp 1
-.if t .sp .5
-.nf
-.in +.5i
-..
-.de EE
-.fi
-.in -.5i
-.if n .sp 1
-.if t .sp .5
-..
-.TH XScreenSaver 1 "09-Nov-2013 (5.23)" "X Version 11"
-.SH NAME
-xscreensaver-demo - interactively control the background xscreensaver daemon
-.SH SYNOPSIS
-.B xscreensaver\-demo
-[\-display \fIhost:display.screen\fP]
-[\-prefs]
-[--debug]
-.SH DESCRIPTION
-The \fIxscreensaver\-demo\fP program is a graphical front-end for
-setting the parameters used by the background
-.BR xscreensaver (1)
-daemon.
-It is essentially two things: a tool for editing the \fI~/.xscreensaver\fP
-file; and a tool for demoing the various graphics hacks that
-the \fIxscreensaver\fP daemon will launch.
-
-The main window consists of a menu bar and two tabbed pages. The first page
-is for editing the list of demos, and the second is for editing various other
-parameters of the screensaver.
-.SH MENU COMMANDS
-All of these commands are on either the \fBFile\fP or \fBHelp\fP menus:
-.TP 4
-.B Blank Screen Now
-Activates the background \fIxscreensaver\fP daemon, which will then run
-a demo at random. This is the same as running
-.BR xscreensaver-command (1)
-with the \fI\-activate\fP option.
-.TP 4
-.B Lock Screen Now
-Just like \fBBlank Screen Now\fP, except the screen will be locked as
-well (even if it is not configured to lock all the time.) This is the
-same as running
-.BR xscreensaver-command (1)
-with the \fI\-lock\fP option.
-.TP 4
-.B Kill Daemon
-If the xscreensaver daemon is running on this screen, kill it.
-This is the same as running
-.BR xscreensaver-command (1)
-with the \fI\-exit\fP option.
-.TP 4
-.B Restart Daemon
-If the xscreensaver daemon is running on this screen, kill it.
-Then launch it again. This is the same as doing
-``\fIxscreensaver-command -exit\fP'' followed by ``\fIxscreensaver\fP''.
-
-Note that it is \fInot\fP the same as doing
-``\fIxscreensaver-command -restart\fP''.
-.TP 4
-.B Exit
-Exits the \fIxscreensaver-demo\fP program (this program) without
-affecting the background \fIxscreensaver\fP daemon, if any.
-.TP 4
-.B About...
-Displays the version number of this program, \fIxscreensaver-demo\fP.
-.TP 4
-.B Documentation...
-Opens up a web browser looking at the XScreenSaver web page, where you
-can find online copies of the
-.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-and
-.BR xscreensaver\-command (1)
-manuals.
-.SH DISPLAY MODES TAB
-This page contains a list of the names of the various display modes, a
-preview area, and some fields that let you configure screen saver behavior.
-.TP 4
-.B Mode
-This option menu controls the activation behavior of the screen saver.
-The options are:
-.RS 4
-.TP 4
-.B Disable Screen Saver
-Don't ever blank the screen, and don't ever allow the monitor to power down.
-.TP 4
-.B Blank Screen Only
-When blanking the screen, just go black: don't run any graphics.
-.TP 4
-.B Only One Screen Saver
-When blanking the screen, only ever use one particular display mode (the
-one selected in the list.)
-.TP 4
-.B Random Screen Saver
-When blanking the screen, select a random display mode from among those
-that are enabled and applicable. If there are multiple monitors
-connected, run a different display mode on each one. This is the default.
-.TP 4
-.B Random Same Saver
-This is just like \fBRandom Screen Saver\fP, except that the \fIsame\fP
-randomly-chosen display mode will be run on all monitors, instead of
-different ones on each.
-.RE
-.TP 4
-.B Demo List
-Double-clicking in the list on the left will let you try out the indicated
-demo. The screen will go black, and the program will run in full-screen
-mode, just as it would if the \fIxscreensaver\fP daemon had launched it.
-Clicking the mouse again will stop the demo and un-blank the screen.
-
-Single-clicking in the list will run it in the small preview pane on the
-right. (But beware: many of the display modes behave somewhat differently
-when running in full-screen mode, so the scaled-down view might not give
-an accurate impression.)
-
-When \fBMode\fP is set to \fBRandom Screen Saver\fP, each name in the list
-has a checkbox next to it: this controls whether this display mode is
-enabled. If it is unchecked, then that mode will not be chosen. (Though
-you can still run it explicitly by double-clicking on its name.)
-.TP 4
-.B Arrow Buttons
-Beneath the list are a pair of up and down arrows. Clicking on the down
-arrow will select the next item in the list, and then run it in full-screen
-mode, just as if you had double-clicked on it. The up arrow goes the other
-way. This is just a shortcut for trying out all of the display modes in turn.
-.TP 4
-.B Blank After
-After the user has been idle this long, the \fIxscreensaver\fP daemon
-will blank the screen.
-.TP 4
-.B Cycle After
-After the screensaver has been running for this long, the currently
-running graphics demo will be killed, and a new one started.
-If this is 0, then the graphics demo will never be changed:
-only one demo will run until the screensaver is deactivated by user
-activity.
-
-The running saver will be restarted every this-many minutes even in
-\fIOnly One Screen Saver\fP mode, since some savers tend to converge
-on a steady state.
-.TP 4
-.B Lock Screen
-When this is checked, the screen will be locked when it activates.
-.TP 4
-.B Lock Screen After
-This controls the length of the ``grace period'' between when the
-screensaver activates, and when the screen becomes locked. For
-example, if this is 5 minutes, and \fIBlank After\fP is 10 minutes,
-then after 10 minutes, the screen would blank. If there was user
-activity at 12 minutes, no password would be required to un-blank the
-screen. But, if there was user activity at 15 minutes or later (that
-is, \fILock Screen After\fP minutes after activation) then a password
-would be required. The default is 0, meaning that if locking is
-enabled, then a password will be required as soon as the screen blanks.
-.TP 4
-.B Preview
-This button, below the small preview window, runs the demo in full-screen
-mode so that you can try it out. This is the same thing that happens when
-you double-click an element in the list. Click the mouse to dismiss the
-full-screen preview.
-.TP 4
-.B Settings
-This button will pop up a dialog where you can configure settings specific
-to the display mode selected in the list.
-.SH SETTINGS DIALOG
-When you click on the \fISettings\fP button on the \fIDisplay Modes\fP
-tab, a configuration dialog will pop up that lets you customize settings
-of the selected display mode. Each display mode has its own custom
-configuration controls on the left side.
-
-On the right side is a paragraph or two describing the display mode.
-Below that is a \fBDocumentation\fP button that will display the display
-mode's manual page, if it has one, in a new window (since each of the
-display modes is actually a separate program, they each have their
-own manual.)
-
-The \fBAdvanced\fP button reconfigures the dialog box so that you can
-edit the display mode's command line directly, instead of using the
-graphical controls.
-.SH ADVANCED TAB
-This tab lets you change various settings used by the xscreensaver daemon
-itself, as well as some global options shared by all of the display modes.
-
-.B Image Manipulation
-
-Some of the graphics hacks manipulate images. These settings control
-where those source images come from.
-(All of these options work by invoking the
-.BR xscreensaver\-getimage (1)
-program, which is what actually does the work.)
-.RS 4
-.TP 4
-.B Grab Desktop Images
-If this option is selected, then they are allowed to manipulate the
-desktop image, that is, a display mode might draw a picture of your
-desktop melting, or being distorted in some way. The
-security-paranoid might want to disable this option, because if it is
-set, it means that the windows on your desktop will occasionally be
-visible while your screen is locked. Others will not be able to
-\fIdo\fP anything, but they may be able to \fIsee\fP whatever you left
-on your screen.
-.TP 4
-.B Grab Video Frames
-If your system has a video capture card, selecting this option will allow
-the image-manipulating modes to capture a frame of video to operate on.
-.TP 4
-.B Choose Random Image
-If this option is set, then the image-manipulating modes will select a
-random image file to operate on, from the specified source. That
-source may be a local directory, which will be recursively searched
-for images. Or, it may be the URL of an RSS or Atom feed (e.g., a
-Flickr gallery), in which case a random image from that feed will be
-selected instead. The contents of the feed will be cached locally and
-refreshed periodically as needed.
-.PP
-If more than one of the above image-related options are selected, then
-one will be chosen at random. If none of them are selected, then an
-image of video colorbars will be used instead.
-.RE
-.PP
-.B Text Manipulation
-
-Some of the display modes display and manipulate text. The following
-options control how that text is generated. (These parameters control
-the behavior of the
-.BR xscreensaver\-text (1)
-program, which is what actually does the work.)
-.RS 4
-.TP 4
-.B Host Name and Time
-If this checkbox is selected, then the text used by the screen savers
-will be the local host name, OS version, date, time, and system load.
-.TP 4
-.B Text
-If this checkbox is selected, then the literal text typed in the
-field to its right will be used. If it contains % escape sequences,
-they will be expanded as per
-.BR strftime (2).
-.TP 4
-.B Text File
-If this checkbox is selected, then the contents of the corresponding
-file will be displayed.
-.TP 4
-.B Program
-If this checkbox is selected, then the given program will be run,
-repeatedly, and its output will be displayed.
-.TP 4
-.B URL
-If this checkbox is selected, then the given HTTP URL will be downloaded
-and displayed repeatedly. If the document contains HTML, RSS, or Atom,
-it will be converted to plain-text first.
-
-Note: this re-downloads the document every time the screen saver
-runs out of text, so it will probably be hitting that web server multiple
-times a minute. Be careful that the owner of that server doesn't
-consider that to be abusive.
-.RE
-.PP
-.B Power Management Settings
-
-These settings control whether, and when, your monitor powers down.
-.RS 4
-.TP 4
-.B Power Management Enabled
-Whether the monitor should be powered down after a period of inactivity.
-
-If this option is grayed out, it means your X server does not support
-the XDPMS extension, and so control over the monitor's power state is
-not available.
-
-If you're using a laptop, don't be surprised if this has no effect:
-many laptops have monitor power-saving behavior built in at a very low
-level that is invisible to Unix and X. On such systems, you can
-typically only adjust the power-saving delays by changing settings
-in the BIOS in some hardware-specific way.
-.TP 4
-.B Standby After
-If \fIPower Management Enabled\fP is selected, the monitor will go black
-after this much idle time. (Graphics demos will stop running, also.)
-.TP 4
-.B Suspend After
-If \fIPower Management Enabled\fP is selected, the monitor will go
-into power-saving mode after this much idle time. This duration should
-be greater than or equal to \fIStandby\fP.
-.TP 4
-.B Off After
-If \fIPower Management Enabled\fP is selected, the monitor will fully
-power down after this much idle time. This duration should be greater
-than or equal to \fISuspend\fP.
-.TP 4
-.B Quick Power-off in "Blank Only" Mode
-If the display mode is set to \fIBlank Screen Only\fP and this is
-checked, then the monitor will be powered off immediately upon
-blanking, regardless of the other power-management settings. In this
-way, the power management idle-timers can be completely disabled, but
-the screen will be powered off when black. (This might be preferable
-on laptops.)
-.RE
-.PP
-.B Fading and Colormaps
-
-These options control how the screen fades to or from black when
-a screen saver begins or ends.
-.RS 4
-.TP 4
-.B Fade To Black When Blanking
-If selected, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out. (Note:
-this doesn't work with all X servers.) A fade will also be done when
-switching graphics hacks (when the \fICycle After\fP expires.)
-.TP 4
-.B Unfade From Black When Unblanking
-The complement to \fIFade Colormap\fP: if selected, then when the screensaver
-deactivates, the original contents of the screen will fade in from black
-instead of appearing immediately. This is only done if \fIFade Colormap\fP
-is also selected.
-.TP 4
-.B Fade Duration
-When fading or unfading are selected, this controls how long the fade will
-take.
-.TP 4
-.B Install Colormap
-On 8-bit screens, whether to install a private colormap while the
-screensaver is active, so that the graphics hacks can get as many
-colors as possible. This does nothing if you are running in 16-bit
-or better.
-.PP
-.RE
-There are more settings than these available, but these are the most
-commonly used ones; see the manual for
-.BR xscreensaver (1)
-for other parameters that can be set by editing the \fI~/.xscreensaver\fP
-file, or the X resource database.
-.SH COMMAND-LINE OPTIONS
-.I xscreensaver\-demo
-accepts the following command line options.
-.TP 8
-.B \-display \fIhost:display.screen\fP
-The X display to use. The \fIxscreensaver\-demo\fP program will open its
-window on that display, and also control the \fIxscreensaver\fP daemon that
-is managing that same display.
-.TP 8
-.B \-prefs
-Start up with the \fBAdvanced\fP tab selected by default
-instead of the \fBDisplay Modes\fP tab.
-.TP 8
-.B \-debug
-Causes lots of diagnostics to be printed on stderr.
-.P
-It is important that the \fIxscreensaver\fP and \fIxscreensaver\-demo\fP
-processes be running on the same machine, or at least, on two machines
-that share a file system. When \fIxscreensaver\-demo\fP writes a new version
-of the \fI~/.xscreensaver\fP file, it's important that the \fIxscreensaver\fP
-see that same file. If the two processes are seeing
-different \fI~/.xscreensaver\fP files, things will malfunction.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B PATH
-to find the sub-programs to run. However, note that the sub-programs
-are actually launched by the \fIxscreensaver\fP daemon, not
-by \fIxscreensaver-demo\fP itself. So, what matters is what \fB$PATH\fP
-that the \fIxscreensaver\fP program sees.
-.TP 8
-.B HOME
-for the directory in which to read and write the \fI.xscreensaver\fP file.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.TP 8
-.B HTTP_PROXY\fR or \fPhttp_proxy
-to get the default HTTP proxy host and port.
-.SH UPGRADES
-The latest version of xscreensaver, an online version of this manual,
-and a FAQ can always be found at https://www.jwz.org/xscreensaver/
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-command (1),
-.BR xscreensaver\-getimage (1),
-.BR xscreensaver\-text (1)
-.SH COPYRIGHT
-Copyright \(co 1992-2015 by Jamie Zawinski.
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-getimage-desktop b/driver/xscreensaver-getimage-desktop
deleted file mode 100755
index 2a6d345..0000000
--- a/driver/xscreensaver-getimage-desktop
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/usr/bin/perl -w
-# Copyright © 2003-2013 Jamie Zawinski <jwz@jwz.org>.
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation. No representations are made about the suitability of this
-# software for any purpose. It is provided "as is" without express or
-# implied warranty.
-#
-#
-# This script is invoked by "xscreensaver-getimage" on X11 MacOS systems
-# to grab an image of the desktop, and then load it on to the given X11
-# Drawable using the "xscreensaver-getimage-file" program.
-#
-# This script is only used in an *X11* build on MacOS systems.
-#
-# When running on non-Mac X11 systems, utils/grabscreen.c is used.
-#
-# However, when running under X11 on MacOS, that usual X11-based
-# screen-grabbing mechanism doesn't work, so we need to invoke the
-# "/usr/bin/screencapture" program to do it instead. (This script).
-#
-# However again, for the MacOS-native (Cocoa) build of the screen savers,
-# "utils/grabclient.c" instead links against "OSX/osxgrabscreen.m", which
-# grabs screen images directly without invoking a sub-process to do it.
-#
-# Created: 20-Oct-2003.
-
-
-require 5;
-#use diagnostics; # Fails on some MacOS 10.5 systems
-use strict;
-
-my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
-
-my @grabber = ("screencapture", "-x");
-my @converter = ("pdf2jpeg");
-
-my $verbose = 0;
-
-
-sub error($) {
- ($_) = @_;
- print STDERR "$progname: $_\n";
- exit 1;
-}
-
-# returns the full path of the named program, or undef.
-#
-sub which($) {
- my ($prog) = @_;
- foreach (split (/:/, $ENV{PATH})) {
- if (-x "$_/$prog") {
- return $prog;
- }
- }
- return undef;
-}
-
-sub check_path() {
- my $ok = 1;
- foreach ($grabber[0], $converter[0]) {
- if (! which ($_)) {
- print STDERR "$progname: \"$_\" not found on \$PATH.\n";
- $ok = 0;
- }
- }
- exit (1) unless $ok;
-}
-
-
-sub grab_image() {
-
- check_path();
-
- my $tmpdir = $ENV{TMPDIR};
- $tmpdir = "/tmp" unless $tmpdir;
-
- my $tmpfile = sprintf ("%s/xssgrab.%08x.pdf", $tmpdir, rand(0xffffffff));
- my @cmd = (@grabber, $tmpfile);
-
- unlink $tmpfile;
-
- print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
- if ($verbose);
- system (join(' ', @cmd) . ' 2>/dev/null');
-
- my @st = stat($tmpfile);
- my $size = (@st ? $st[7] : 0);
- if ($size <= 2048) {
- unlink $tmpfile;
- if ($size == 0) {
- error "\"" . join(' ', @cmd) . "\" produced no data.";
- } else {
- error "\"" . join(' ', @cmd) . "\" produced only $size bytes.";
- }
- }
-
- # On MacOS 10.3, "screencapture -x" always wrote a PDF.
- # On 10.4.2, it writes a PNG by default, and the output format can be
- # changed with the new "-t" argument.
- #
- # So, for maximal compatibility, we run it without "-t", but look at
- # the first few bytes to see if it's a PDF, and if it is, convert it
- # to a JPEG first. Otherwise, we assume that whatever screencapture
- # wrote is a file format that xscreensaver-getimage-file can already
- # cope with (though it will have the extension ".pdf", regardless of
- # what is actually in the file).
- #
- my $pdf_p = 0;
- {
- open (my $in, '<:raw', $tmpfile) || error ("$tmpfile: $!");
- my $buf = '';
- read ($in, $buf, 10);
- close $in;
- $pdf_p = ($buf =~ m/^%PDF-/s);
- }
-
- # If it's a PDF, convert it to a JPEG.
- #
- if ($pdf_p)
- {
- my $jpgfile = $tmpfile;
- $jpgfile =~ s/\.[^.]+$//;
- $jpgfile .= ".jpg";
-
- @cmd = (@converter, $tmpfile, $jpgfile);
- push @cmd, "--verbose" if ($verbose);
-
- print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
- if ($verbose);
- system (@cmd);
- unlink $tmpfile;
- $tmpfile = $jpgfile;
- }
-
- @st = stat($tmpfile);
- $size = (@st ? $st[7] : 0);
- if ($size <= 2048) {
- unlink $tmpfile;
- if ($size == 0) {
- error "\"" . join(' ', @cmd) . "\" produced no data.";
- } else {
- error "\"" . join(' ', @cmd) . "\" produced only $size bytes.";
- }
- }
-
- print STDERR "$progname: wrote \"$tmpfile\"\n" if ($verbose);
- print STDOUT "$tmpfile\n";
-}
-
-
-sub usage() {
- print STDERR "usage: $progname [--verbose]\n";
- exit 1;
-}
-
-sub main() {
- while ($_ = $ARGV[0]) {
- shift @ARGV;
- if (m/^--?verbose$/s) { $verbose++; }
- elsif (m/^-v+$/s) { $verbose += length($_)-1; }
- elsif (m/^--?name$/s) { } # ignored, for compatibility
- elsif (m/^-./) { usage; }
- else { usage; }
- }
- grab_image();
-}
-
-main;
-exit 0;
diff --git a/driver/xscreensaver-getimage-desktop.man b/driver/xscreensaver-getimage-desktop.man
deleted file mode 100644
index 1974525..0000000
--- a/driver/xscreensaver-getimage-desktop.man
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH XScreenSaver 1 "07-Sep-2003 (4.13)" "X Version 11"
-.SH NAME
-xscreensaver-getimage-desktop - put a desktop image on the root window
-.SH SYNOPSIS
-.B xscreensaver-getimage-desktop
-[\-display \fIhost:display.screen\fP] [\--verbose] [\--stdout]
-.SH DESCRIPTION
-The \fIxscreensaver\-getimage\-desktop\fP program is a helper program
-for the xscreensaver hacks that manipulate images. Specifically, it
-is invoked by
-.BR xscreensaver\-getimage (1)
-as needed. This is not a user-level command.
-
-This program is only used on MacOS X / XDarwin systems, because
-on those systems, it's necessary to use the
-.BR screencapture (1)
-program to get an image of the desktop -- the usual X11
-mechanism for grabbing the screen doesn't work on OSX.
-
-This script works by running
-.BR screencapture (1)
-to get a PDF, then converting it to a JPEG with
-.BR pdf2jpeg (1),
-then loading it onto the window with
-.BR xscreensaver\-getimage\-file (1).
-.SH OPTIONS
-.I xscreensaver-getimage-desktop
-accepts the following options:
-.TP 4
-.B --verbose
-Print diagnostics.
-.TP 4
-.B --stdout
-Instead of loading the image onto the root window, write it to stdout
-as a PBM file.
-.SH SEE ALSO
-.BR screencapture (1),
-.BR pdf2jpeg (1),
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1),
-.BR xscreensaver\-getimage\-file (1),
-.BR xscreensaver\-getimage\-video (1),
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 20-Oct-03.
diff --git a/driver/xscreensaver-getimage-file b/driver/xscreensaver-getimage-file
deleted file mode 100755
index 3a5c7f4..0000000
--- a/driver/xscreensaver-getimage-file
+++ /dev/null
@@ -1,1317 +0,0 @@
-#!/usr/bin/perl -w
-# Copyright © 2001-2020 Jamie Zawinski <jwz@jwz.org>.
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation. No representations are made about the suitability of this
-# software for any purpose. It is provided "as is" without express or
-# implied warranty.
-#
-# This program chooses a random file from under the given directory, and
-# prints its name. The file will be an image file whose dimensions are
-# larger than a certain minimum size.
-#
-# If the directory is a URL, it is assumed to be an RSS or Atom feed.
-# The images from that feed will be downloaded, cached, and selected from
-# at random. The feed will be re-polled periodically, as needed.
-#
-# The various xscreensaver hacks that manipulate images ("jigsaw", etc.) get
-# the image to manipulate by running the "xscreensaver-getimage" program.
-#
-# Under X11, the "xscreensaver-getimage" program invokes this script,
-# depending on the value of the "chooseRandomImages" and "imageDirectory"
-# settings in the ~/.xscreensaver file (or .../app-defaults/XScreenSaver).
-# The screen savers invoke "xscreensaver-getimage" via utils/grabclient.c,
-# which then invokes this script.
-#
-# Under Cocoa, this script lives inside the .saver bundle, and is invoked
-# directly from utils/grabclient.c.
-#
-# Created: 12-Apr-01.
-
-require 5;
-#use diagnostics; # Fails on some MacOS 10.5 systems
-use strict;
-
-use POSIX;
-use Fcntl;
-
-use Fcntl ':flock'; # import LOCK_* constants
-
-use POSIX ':fcntl_h'; # S_ISDIR was here in Perl 5.6
-import Fcntl ':mode' unless defined &S_ISUID; # but it is here in Perl 5.8
- # but in Perl 5.10, both of these load, and cause errors!
- # So we have to check for S_ISUID instead of S_ISDIR? WTF?
-
-use Digest::MD5 qw(md5_base64);
-
-# Some Linux systems don't install LWP by default!
-# Only error out if we're actually loading a URL instead of local data.
-BEGIN { eval 'use LWP::Simple;' }
-
-
-my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.53 $' =~ m/\s(\d[.\d]+)\s/s);
-
-my $verbose = 0;
-
-# Whether to use MacOS X's Spotlight to generate the list of files.
-# When set to -1, uses Spotlight if "mdfind" exists.
-#
-# (In my experience, this isn't actually any faster, and might not find
-# everything if your Spotlight index is out of date, which happens often.)
-#
-my $use_spotlight_p = 0;
-
-# Whether to cache the results of the last run.
-#
-my $cache_p = 1;
-
-# Regenerate the cache if it is older than this many seconds.
-#
-my $cache_max_age = 60 * 60 * 3; # 3 hours
-
-# Re-poll RSS/Atom feeds when local copy is older than this many seconds.
-#
-my $feed_max_age = $cache_max_age;
-
-
-# This matches files that we are allowed to use as images (case-insensitive.)
-# Anything not matching this is ignored. This is so you can point your
-# imageDirectory at directory trees that have things other than images in
-# them, but it assumes that you gave your images sensible file extensions.
-#
-my @good_extensions = ('jpg', 'jpeg', 'pjpeg', 'pjpg', 'png', 'gif',
- 'tif', 'tiff', 'xbm', 'xpm');
-my $good_file_re = '\.(' . join("|", @good_extensions) . ')$';
-
-# This matches file extensions that might occur in an image directory,
-# and that are never used in the name of a subdirectory. This is an
-# optimization that prevents us from having to stat() those files to
-# tell whether they are directories or not. (It speeds things up a
-# lot. Don't give your directories stupid names.)
-#
-my @nondir_extensions = ('ai', 'bmp', 'bz2', 'cr2', 'crw', 'db',
- 'dmg', 'eps', 'gz', 'hqx', 'htm', 'html', 'icns', 'ilbm', 'mov',
- 'nef', 'pbm', 'pdf', 'php', 'pl', 'ppm', 'ps', 'psd', 'sea', 'sh',
- 'shtml', 'tar', 'tgz', 'thb', 'txt', 'xcf', 'xmp', 'Z', 'zip' );
-my $nondir_re = '\.(' . join("|", @nondir_extensions) . ')$';
-
-
-# JPEG, GIF, and PNG files that are are smaller than this are rejected:
-# this is so that you can use an image directory that contains both big
-# images and thumbnails, and have it only select the big versions.
-# But, if all of your images are smaller than this, all will be rejected.
-#
-my $min_image_width = 500;
-my $min_image_height = 500;
-
-my @all_files = (); # list of "good" files we've collected
-my %seen_inodes; # for breaking recursive symlink loops
-
-# For diagnostic messages:
-#
-my $dir_count = 1; # number of directories seen
-my $stat_count = 0; # number of files/dirs stat'ed
-my $skip_count_unstat = 0; # number of files skipped without stat'ing
-my $skip_count_stat = 0; # number of files skipped after stat
-
-my $config_file = $ENV{HOME} . "/.xscreensaver";
-my $image_directory = undef;
-
-
-sub find_all_files($);
-sub find_all_files($) {
- my ($dir) = @_;
-
- print STDERR "$progname: + reading dir $dir/...\n" if ($verbose > 1);
-
- my $dd;
- if (! opendir ($dd, $dir)) {
- print STDERR "$progname: couldn't open $dir: $!\n" if ($verbose);
- return;
- }
- my @files = readdir ($dd);
- closedir ($dd);
-
- my @dirs = ();
-
- foreach my $file (@files) {
- next if ($file =~ m/^\./); # silently ignore dot files/dirs
-
- if ($file =~ m/[~%\#]$/) { # ignore backup files (and dirs...)
- $skip_count_unstat++;
- print STDERR "$progname: - skip file $file\n" if ($verbose > 1);
- }
-
- $file = "$dir/$file";
-
- if ($file =~ m/$good_file_re/io) {
- #
- # Assume that files ending in .jpg exist and are not directories.
- #
- push @all_files, $file;
- print STDERR "$progname: - found file $file\n" if ($verbose > 1);
-
- } elsif ($file =~ m/$nondir_re/io) {
- #
- # Assume that files ending in .html are not directories.
- #
- $skip_count_unstat++;
- print STDERR "$progname: -- skip file $file\n" if ($verbose > 1);
-
- } else {
- #
- # Now we need to stat the file to see if it's a subdirectory.
- #
- # Note: we could use the trick of checking "nlinks" on the parent
- # directory to see if this directory contains any subdirectories,
- # but that would exclude any symlinks to directories.
- #
- my @st = stat($file);
- my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
- $atime,$mtime,$ctime,$blksize,$blocks) = @st;
-
- $stat_count++;
-
- if ($#st == -1) {
- if ($verbose) {
- my $ll = readlink $file;
- if (defined ($ll)) {
- print STDERR "$progname: + dangling symlink: $file -> $ll\n";
- } else {
- print STDERR "$progname: + unreadable: $file\n";
- }
- }
- next;
- }
-
- next if ($seen_inodes{"$dev:$ino"}); # break symlink loops
- $seen_inodes{"$dev:$ino"} = 1;
-
- if (S_ISDIR($mode)) {
- push @dirs, $file;
- $dir_count++;
- print STDERR "$progname: + found dir $file\n" if ($verbose > 1);
-
- } else {
- $skip_count_stat++;
- print STDERR "$progname: + skip file $file\n" if ($verbose > 1);
- }
- }
- }
-
- foreach (@dirs) {
- find_all_files ($_);
- }
-}
-
-
-sub spotlight_all_files($) {
- my ($dir) = @_;
-
- my @terms = ();
- # "public.image" matches all (indexed) images, including Photoshop, etc.
-# push @terms, "kMDItemContentTypeTree == 'public.image'";
- foreach (@good_extensions) {
-
- # kMDItemFSName hits the file system every time: much worse than "find".
-# push @terms, "kMDItemFSName == '*.$_'";
-
- # kMDItemDisplayName matches against the name in the Spotlight index,
- # but won't find files that (for whatever reason) didn't get indexed.
- push @terms, "kMDItemDisplayName == '*.$_'";
- }
-
- $dir =~ s@([^-_/a-z\d.,])@\\$1@gsi; # quote for sh
- my $cmd = "mdfind -onlyin $dir \"" . join (' || ', @terms) . "\"";
-
- print STDERR "$progname: executing: $cmd\n" if ($verbose > 1);
- @all_files = split (/[\r\n]+/, `$cmd`);
-}
-
-
-# If we're using cacheing, read the cache file and return its contents,
-# if any. This also holds an exclusive lock on the cache file, which
-# has the additional benefit that if two copies of this program are
-# running at once, one will wait for the other, instead of both of
-# them spanking the same file system at the same time.
-#
-my $cache_fd = undef;
-my $cache_file_name = undef;
-my $read_cache_p = 0;
-
-sub read_cache($) {
- my ($dir) = @_;
-
- return () unless ($cache_p);
-
- my $dd = "$ENV{HOME}/Library/Caches"; # MacOS location
- if (-d $dd) {
- $cache_file_name = "$dd/org.jwz.xscreensaver.getimage.cache";
- } elsif (-d "$ENV{HOME}/.cache") { # Gnome "FreeDesktop XDG" location
- $dd = "$ENV{HOME}/.cache/xscreensaver";
- if (! -d $dd) { mkdir ($dd) || error ("mkdir $dd: $!"); }
- $cache_file_name = "$dd/xscreensaver-getimage.cache"
- } elsif (-d "$ENV{HOME}/tmp") { # If ~/tmp/ exists, use it.
- $cache_file_name = "$ENV{HOME}/tmp/.xscreensaver-getimage.cache";
- } else {
- $cache_file_name = "$ENV{HOME}/.xscreensaver-getimage.cache";
- }
-
- print STDERR "$progname: awaiting lock: $cache_file_name\n"
- if ($verbose > 1);
-
- my $file = $cache_file_name;
- open ($cache_fd, '+>>', $file) || error ("unable to write $file: $!");
- flock ($cache_fd, LOCK_EX) || error ("unable to lock $file: $!");
- seek ($cache_fd, 0, 0) || error ("unable to rewind $file: $!");
-
- my $mtime = (stat($cache_fd))[9];
-
- if ($mtime + $cache_max_age < time) {
- print STDERR "$progname: cache is too old\n" if ($verbose);
- return ();
- }
-
- my $odir = <$cache_fd>;
- $odir =~ s/[\r\n]+$//s if defined ($odir);
- if (!defined ($odir) || ($dir ne $odir)) {
- print STDERR "$progname: cache is for $odir, not $dir\n"
- if ($verbose && $odir);
- return ();
- }
-
- my @files = ();
- while (<$cache_fd>) {
- s/[\r\n]+$//s;
- push @files, "$odir/$_";
- }
-
- print STDERR "$progname: " . ($#files+1) . " files in cache\n"
- if ($verbose);
-
- $read_cache_p = 1;
- return @files;
-}
-
-
-sub write_cache($) {
- my ($dir) = @_;
-
- return unless ($cache_p);
-
- # If we read the cache, just close it without rewriting it.
- # If we didn't read it, then write it now.
-
- if (! $read_cache_p) {
-
- truncate ($cache_fd, 0) ||
- error ("unable to truncate $cache_file_name: $!");
- seek ($cache_fd, 0, 0) ||
- error ("unable to rewind $cache_file_name: $!");
-
- if ($#all_files >= 0) {
- print $cache_fd "$dir\n";
- foreach (@all_files) {
- my $f = $_; # stupid Perl. do this to avoid modifying @all_files!
- $f =~ s@^\Q$dir/@@so || die; # remove $dir from front
- print $cache_fd "$f\n";
- }
- }
-
- print STDERR "$progname: cached " . ($#all_files+1) . " files\n"
- if ($verbose);
- }
-
- flock ($cache_fd, LOCK_UN) ||
- error ("unable to unlock $cache_file_name: $!");
- close ($cache_fd);
- $cache_fd = undef;
-}
-
-
-sub html_unquote($) {
- my ($h) = @_;
-
- # This only needs to handle entities that occur in RSS, not full HTML.
- my %ent = ( 'amp' => '&', 'lt' => '<', 'gt' => '>',
- 'quot' => '"', 'apos' => "'" );
- $h =~ s/(&(\#)?([[:alpha:]\d]+);?)/
- {
- my ($o, $c) = ($1, $3);
- if (! defined($2)) {
- $c = $ent{$c}; # for &lt;
- } else {
- if ($c =~ m@^x([\dA-F]+)$@si) { # for &#x41;
- $c = chr(hex($1));
- } elsif ($c =~ m@^\d+$@si) { # for &#65;
- $c = chr($c);
- } else {
- $c = undef;
- }
- }
- ($c || $o);
- }
- /gexi;
- return $h;
-}
-
-
-
-# Figure out what the proxy server should be, either from environment
-# variables or by parsing the output of the (MacOS) program "scutil",
-# which tells us what the system-wide proxy settings are.
-#
-sub set_proxy($) {
- my ($ua) = @_;
-
- my $proxy_data = `scutil --proxy 2>/dev/null`;
- foreach my $proto ('http', 'https') {
- my ($server) = ($proxy_data =~ m/\b${proto}Proxy\s*:\s*([^\s]+)/si);
- my ($port) = ($proxy_data =~ m/\b${proto}Port\s*:\s*([^\s]+)/si);
- my ($enable) = ($proxy_data =~ m/\b${proto}Enable\s*:\s*([^\s]+)/si);
-
- if ($server && $enable) {
- # Note: this ignores the "ExceptionsList".
- my $proto2 = 'http';
- $ENV{"${proto}_proxy"} = ("${proto2}://" . $server .
- ($port ? ":$port" : "") . "/");
- print STDERR "$progname: MacOS $proto proxy: " .
- $ENV{"${proto}_proxy"} . "\n"
- if ($verbose > 2);
- }
- }
-
- $ua->env_proxy();
-}
-
-
-sub init_lwp() {
- if (! defined ($LWP::Simple::ua)) {
- error ("\n\n\tPerl is broken. Do this to repair it:\n" .
- "\n\tsudo cpan LWP::Simple LWP::Protocol::https Mozilla::CA\n");
- }
- set_proxy ($LWP::Simple::ua);
-}
-
-
-sub sanity_check_lwp() {
- my $url1 = 'https://www.mozilla.org/';
- my $url2 = 'http://www.mozilla.org/';
- my $body = (LWP::Simple::get($url1) || '');
- if (length($body) < 10240) {
- my $err = "";
- $body = (LWP::Simple::get($url2) || '');
- if (length($body) < 10240) {
- $err = "Perl is broken: neither HTTP nor HTTPS URLs work.";
- } else {
- $err = "Perl is broken: HTTP URLs work but HTTPS URLs don't.";
- }
- $err .= "\nMaybe try: sudo cpan -f Mozilla::CA LWP::Protocol::https";
- $err =~ s/^/\t/gm;
- error ("\n\n$err\n");
- }
-}
-
-
-# If the URL does not already end with an extension appropriate for the
-# content-type, add it after a "#" search.
-#
-# This is for when we know the content type of the URL, but the URL is
-# some crazy thing without an extension. The files on disk need to have
-# proper extensions.
-#
-sub force_extension($$) {
- my ($url, $ct) = @_;
- return $url unless (defined($url) && defined($ct));
- my ($ext) = ($ct =~ m@^image/([-a-z\d]+)@si);
- return $url unless $ext;
- $ext = lc($ext);
- $ext = 'jpg' if ($ext eq 'jpeg');
- return $url if ($url =~ m/\.$ext$/si);
- return "$url#.$ext";
-}
-
-
-# Returns a list of the image enclosures in the RSS or Atom feed.
-# Elements of the list are references, [ "url", "guid" ].
-#
-sub parse_feed($);
-sub parse_feed($) {
- my ($url) = @_;
-
- init_lwp();
- $LWP::Simple::ua->agent ("$progname/$version");
- $LWP::Simple::ua->timeout (10); # bail sooner than the default of 3 minutes
-
-
- # Half the time, random Linux systems don't have Mozilla::CA installed,
- # which results in "Can't verify SSL peers without knowning which
- # Certificate Authorities to trust".
- #
- # In xscreensaver-text we just disabled certificate checks. However,
- # malicious images really do exist, so for xscreensaver-getimage-file,
- # let's actually require that SSL be installed properly.
-
- print STDERR "$progname: loading $url\n" if ($verbose);
- my $body = (LWP::Simple::get($url) || '');
-
- if ($body !~ m@^\s*<(\?xml|rss)\b@si) {
- # Not an RSS/Atom feed. Try RSS autodiscovery.
-
- # (Great news, everybody: Flickr no longer provides RSS for "Sets",
- # only for "Photostreams", and only the first 20 images of those.
- # Thanks, assholes.)
-
- if ($body =~ m/^\s*$/s) {
- sanity_check_lwp();
- error ("null response: $url");
- }
-
- error ("not an RSS or Atom feed, or HTML: $url")
- unless ($body =~ m@<(HEAD|BODY|A|IMG)\b@si);
-
- # Find the first <link> with RSS or Atom in it, and use that instead.
-
- $body =~ s@<LINK\s+([^<>]*)>@{
- my $p = $1;
- if ($p =~ m! \b REL \s* = \s* ['"]? alternate \b!six &&
- $p =~ m! \b TYPE \s* = \s* ['"]? application/(atom|rss) !six &&
- $p =~ m! \b HREF \s* = \s* ['"] ( [^<>'"]+ ) !six
- ) {
- my $u2 = html_unquote ($1);
- if ($u2 =~ m!^/!s) {
- my ($h) = ($url =~ m!^([a-z]+://[^/]+)!si);
- $u2 = "$h$u2";
- }
- print STDERR "$progname: found feed: $u2\n"
- if ($verbose);
- return parse_feed ($u2);
- }
- '';
- }@gsexi;
-
- error ("no RSS or Atom feed for HTML page: $url");
- }
-
-
- $body =~ s@(<ENTRY|<ITEM)@\001$1@gsi;
- my @items = split(/\001/, $body);
- shift @items;
-
- my @imgs = ();
- my %ids;
-
- foreach my $item (@items) {
- my $iurl = undef;
- my $id = undef;
-
- # First look for <link rel="enclosure" href="...">
- #
- if (! $iurl) {
- foreach my $link ($item =~ m@<LINK[^<>]*>@gsi) {
- last if $iurl;
- my ($href) = ($link =~ m/\bHREF\s*=\s*[\"\']([^<>\'\"]+)/si);
- my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
- my ($rel) = ($link =~ m/\bREL\s*=\s*[\"\']?([^<>\'\"]+)/si);
- $href = undef unless (lc($rel || '') eq 'enclosure');
- $href = undef if ($type && $type !~ m@^image/@si); # omit videos
- $iurl = html_unquote($href) if $href;
- $iurl = force_extension ($iurl, $type);
- }
- }
-
- # Then look for <media:content url="...">
- #
- if (! $iurl) {
- foreach my $link ($item =~ m@<MEDIA:CONTENT[^<>]*>@gsi) {
- last if $iurl;
- my ($href) = ($link =~ m/\bURL\s*=\s*[\"\']([^<>\'\"]+)/si);
- my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
- my ($med) = ($link =~ m/\bMEDIUM\s*=\s*[\"\']?([^<>\'\"]+)/si);
- $type = 'image/jpeg' if (!$type && lc($med || '') eq 'image');
- $href = undef if ($type && $type !~ m@^image/@si); # omit videos
- $iurl = html_unquote($href) if $href;
- $iurl = force_extension ($iurl, $type);
- }
- }
-
- # Then look for <enclosure url="..."/>
- #
- if (! $iurl) {
- foreach my $link ($item =~ m@<ENCLOSURE[^<>]*>@gsi) {
- last if $iurl;
- my ($href) = ($link =~ m/\bURL\s*=\s*[\"\']([^<>\'\"]+)/si);
- my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
- $href = undef if ($type && $type !~ m@^image/@si); # omit videos
- $iurl = html_unquote($href) if ($href);
- $iurl = force_extension ($iurl, $type);
- }
- }
-
- # Ok, maybe there's an image in the <url> field?
- #
- if (! $iurl) {
- foreach my $link ($item =~ m@<URL\b[^<>]*>([^<>]*)@gsi) {
- last if $iurl;
- my $u2 = $1;
- $iurl = html_unquote($u2) if ($u2 =~ m/$good_file_re/io);
- if (! $iurl) {
- my $u3 = $u2;
- $u3 =~ s/#.*$//gs;
- $u3 =~ s/[?&].*$//gs;
- $iurl = html_unquote($u2) if ($u3 =~ m/$good_file_re/io);
- }
- }
- }
-
- # Then look for <content:encoded> or <description>... with an
- # <img src="..."> inside. If more than one image, take the first.
- #
- foreach my $t ('content:encoded', 'description') {
- last if $iurl;
- foreach my $link ($item =~ m@<$t[^<>]*>(.*?)</$t>@gsi) {
- last if $iurl;
- my $desc = $1;
- if ($desc =~ m@<!\[CDATA\[\s*(.*?)\s*\]\]>@gs) {
- $desc = $1;
- } else {
- $desc = html_unquote($desc);
- }
- my ($href) = ($desc =~ m@<IMG[^<>]*\bSRC=[\"\']?([^\"\'<>]+)@si);
- $iurl = html_unquote($href) if ($href);
- # If IMG SRC has a bogus extension, pretend it's a JPEG.
- $iurl = force_extension ($iurl, 'image/jpeg')
- if ($iurl && $iurl !~ m/$good_file_re/io);
- }
- }
-
- # Find a unique ID for this image, to defeat image farms.
- # First look for <id>...</id>
- ($id) = ($item =~ m!<ID\b[^<>]*>\s*([^<>]+?)\s*</ID>!si) unless $id;
-
- # Then look for <guid isPermaLink=...> ... </guid>
- ($id) = ($item =~ m!<GUID\b[^<>]*>\s*([^<>]+?)\s*</GUID>!si) unless $id;
-
- # Then look for <link> ... </link>
- ($id) = ($item =~ m!<LINK\b[^<>]*>\s*([^<>]+?)\s*</LINK>!si) unless $id;
-
- # If we only have a GUID or LINK, but it's an image, use that.
- $iurl = $id if (!$iurl && $id && $id =~ m/$good_file_re/io);
-
- if ($iurl) {
- $id = $iurl unless $id;
- my $o = $ids{$id};
- if (! $o) {
- $ids{$id} = $iurl;
- my @P = ($iurl, $id);
- push @imgs, \@P;
- } elsif ($iurl ne $o) {
- print STDERR "$progname: WARNING: dup ID \"$id\"" .
- " for \"$o\" and \"$iurl\"\n";
- }
- }
- }
-
- return @imgs;
-}
-
-
-# Like md5_base64 but uses filename-safe characters.
-#
-sub md5_file($) {
- my ($s) = @_;
- $s = md5_base64($s);
- $s =~ s@[/]@_@gs;
- $s =~ s@[+]@-@gs;
- return $s;
-}
-
-
-# expands the first URL relative to the second.
-#
-sub expand_url($$) {
- my ($url, $base) = @_;
-
- $url =~ s/^\s+//gs; # lose whitespace at front and back
- $url =~ s/\s+$//gs;
-
- if (! ($url =~ m/^[a-z]+:/)) {
-
- $base =~ s@(\#.*)$@@; # strip anchors
- $base =~ s@(\?.*)$@@; # strip arguments
- $base =~ s@/[^/]*$@/@; # take off trailing file component
-
- my $tail = '';
- if ($url =~ s@(\#.*)$@@) { $tail = $1; } # save anchors
- if ($url =~ s@(\?.*)$@@) { $tail = "$1$tail"; } # save arguments
-
- my $base2 = $base;
-
- $base2 =~ s@^([a-z]+:/+[^/]+)/.*@$1@ # if url is an absolute path
- if ($url =~ m@^/@);
-
- my $ourl = $url;
-
- $url = $base2 . $url;
- $url =~ s@/\./@/@g; # expand "."
- 1 while ($url =~ s@/[^/]+/\.\./@/@s); # expand ".."
-
- $url .= $tail; # put anchors/args back
-
- print STDERR "$progname: relative URL: $ourl --> $url\n"
- if ($verbose > 1);
-
- } else {
- print STDERR "$progname: absolute URL: $url\n"
- if ($verbose > 2);
- }
-
- return $url;
-}
-
-
-# Given the URL of an image, download it into the given directory
-# and return the file name.
-#
-sub download_image($$$) {
- my ($url, $uid, $dir) = @_;
-
- my $url2 = $url;
- $url2 =~ s/\#.*$//s; # Omit search terms after file extension
- $url2 =~ s/\?.*$//s;
- my ($ext) = ($url =~ m@\.([a-z\d]+)$@si);
- ($ext) = ($url2 =~ m@\.([a-z\d]+)$@si) unless $ext;
-
- # If the feed hasn't put a sane extension on their URLs, nothing's going
- # to work. This code assumes that file names have extensions, even the
- # ones in the cache directory.
- #
- if (! $ext) {
- print STDERR "$progname: skipping extensionless URL: $url\n"
- if ($verbose > 1);
- return undef;
- }
-
- # Don't bother downloading files that we will reject anyway.
- #
- if (! ($url =~ m/$good_file_re/io ||
- $url2 =~ m/$good_file_re/io)) {
- print STDERR "$progname: skipping non-image URL: $url\n"
- if ($verbose > 1);
- return undef;
- }
-
- my $file = md5_file ($uid);
- $file .= '.' . lc($ext) if $ext;
-
- # Don't bother doing If-Modified-Since to see if the URL has changed.
- # If we have already downloaded it, assume it's good.
- if (-f "$dir/$file") {
- print STDERR "$progname: exists: $dir/$file for $uid / $url\n"
- if ($verbose > 1);
- return $file;
- }
-
- # Special-case kludge for Flickr:
- # Their RSS feeds sometimes include only the small versions of the images.
- # So if the URL ends in one of the "small-size" letters, change it to "b".
- #
- # _o orig, 1600 +
- # _k large, 2048 max
- # _h large, 1600 max
- # _b large, 1024 max
- # _c medium, 800 max
- # _z medium, 640 max
- # "" medium, 500 max
- # _n small, 320 max
- # _m small, 240 max
- # _t thumb, 100 max
- # _q square, 150x150
- # _s square, 75x75
- #
- # Note: if we wanted to get the _k or _o version instead of the _b or _h
- # version, we'd need to crack the DRM -- which is easy: see crack_secret
- # in "https://www.jwz.org/hacks/galdown".
- #
- $url =~ s@_[sqtmnzc](\.[a-z]+)$@_b$1@si
- if ($url =~ m@^https?://[^/?#&]*?flickr\.com/@si);
-
- print STDERR "$progname: downloading: $dir/$file for $uid / $url\n"
- if ($verbose > 1);
- init_lwp();
- $LWP::Simple::ua->agent ("$progname/$version");
-
- $url =~ s/\#.*$//s; # Omit search terms
- my $status = LWP::Simple::mirror ($url, "$dir/$file");
- if (!LWP::Simple::is_success ($status)) {
- print STDERR "$progname: error $status: $url\n"; # keep going
- }
-
- return $file;
-}
-
-
-sub mirror_feed($) {
- my ($url) = @_;
-
- if ($url !~ m/^https?:/si) { # not a URL: local directory.
- return (undef, $url);
- }
-
- my $dir = "$ENV{HOME}/Library/Caches"; # MacOS location
- if (-d $dir) {
- $dir = "$dir/org.jwz.xscreensaver.feeds";
- } elsif (-d "$ENV{HOME}/.cache") { # Gnome "FreeDesktop XDG" location
- $dir = "$ENV{HOME}/.cache/xscreensaver";
- if (! -d $dir) { mkdir ($dir) || error ("mkdir $dir: $!"); }
- $dir .= "/feeds";
- if (! -d $dir) { mkdir ($dir) || error ("mkdir $dir: $!"); }
- } elsif (-d "$ENV{HOME}/tmp") { # If ~/tmp/ exists, use it.
- $dir = "$ENV{HOME}/tmp/.xscreensaver-feeds";
- } else {
- $dir = "$ENV{HOME}/.xscreensaver-feeds";
- }
-
- if (! -d $dir) {
- mkdir ($dir) || error ("mkdir $dir: $!");
- print STDERR "$progname: mkdir $dir/\n" if ($verbose);
- }
-
- # MD5 for directory name to use for cache of a feed URL.
- $dir .= '/' . md5_file ($url);
-
- if (! -d $dir) {
- mkdir ($dir) || error ("mkdir $dir: $!");
- print STDERR "$progname: mkdir $dir/ for $url\n" if ($verbose);
- }
-
- # At this point, we have the directory corresponding to this URL.
- # Now check to see if the files in it are up to date, and download
- # them if not.
-
- my $stamp = '.timestamp';
- my $lock = "$dir/$stamp";
-
- print STDERR "$progname: awaiting lock: $lock\n"
- if ($verbose > 1);
-
- my $mtime = ((stat($lock))[9]) || 0;
-
- my $lock_fd;
- open ($lock_fd, '+>>', $lock) || error ("unable to write $lock: $!");
- flock ($lock_fd, LOCK_EX) || error ("unable to lock $lock: $!");
- seek ($lock_fd, 0, 0) || error ("unable to rewind $lock: $!");
-
- my $poll_p = ($mtime + $feed_max_age < time);
-
- # --no-cache cmd line arg means poll again right now.
- $poll_p = 1 unless ($cache_p);
-
- # Even if the cache is young, make sure there is at least one file,
- # and re-check if not.
- #
- if (! $poll_p) {
- my $count = 0;
- opendir (my $dirh, $dir) || error ("$dir: $!");
- foreach my $f (readdir ($dirh)) {
- next if ($f =~ m/^\./s);
- $count++;
- last;
- }
- closedir $dirh;
-
- if ($count <= 0) {
- print STDERR "$progname: no image files in cache of $url\n"
- if ($verbose);
- $poll_p = 1;
- }
- }
-
- if ($poll_p) {
-
- print STDERR "$progname: loading $url\n" if ($verbose);
-
- my %files;
- opendir (my $dirh, $dir) || error ("$dir: $!");
- foreach my $f (readdir ($dirh)) {
- next if ($f eq '.' || $f eq '..');
- $files{$f} = 0; # 0 means "file exists, should be deleted"
- }
- closedir $dirh;
-
- $files{$stamp} = 1;
-
- # Download each image currently in the feed.
- #
- my $count = 0;
- my @urls = parse_feed ($url);
- print STDERR "$progname: " . ($#urls + 1) . " images\n"
- if ($verbose > 1);
- my %seen_src_urls;
- foreach my $p (@urls) {
- my ($furl, $id) = @$p;
- $furl = expand_url ($furl, $url);
-
- # No need to download the same image twice, even if it was in the feed
- # multiple times under different GUIDs.
- next if ($seen_src_urls{$furl});
- $seen_src_urls{$furl} = 1;
-
- my $f = download_image ($furl, $id, $dir);
- next unless $f;
- $files{$f} = 1; # Got it, don't delete
- $count++;
- }
-
- my $empty_p = ($count <= 0);
-
- # Now delete any files that are no longer in the feed.
- # But if there was nothing in the feed (network failure?)
- # then don't blow away the old files.
- #
- my $kept = 0;
- foreach my $f (keys(%files)) {
- if ($count <= 0) {
- $kept++;
- } elsif ($files{$f}) {
- $kept++;
- } else {
- if (unlink ("$dir/$f")) {
- print STDERR "$progname: rm $dir/$f\n" if ($verbose > 1);
- } else {
- print STDERR "$progname: rm $dir/$f: $!\n"; # don't bail
- }
- }
- }
-
- # Both feed and cache are empty. No files at all. Bail.
- error ("empty feed: $url") if ($kept <= 1);
-
- # Feed is empty, but we have some files from last time. Warn.
- print STDERR "$progname: empty feed: using cache: $url\n"
- if ($empty_p);
-
- $mtime = time(); # update the timestamp
-
- } else {
-
- # Not yet time to re-check the URL.
- print STDERR "$progname: using cache: $url\n" if ($verbose);
-
- }
-
- # Unlock and update the write date on the .timestamp file.
- #
- truncate ($lock_fd, 0) || error ("unable to truncate $lock: $!");
- seek ($lock_fd, 0, 0) || error ("unable to rewind $lock: $!");
- utime ($mtime, $mtime, $lock_fd) || error ("unable to touch $lock: $!");
- flock ($lock_fd, LOCK_UN) || error ("unable to unlock $lock: $!");
- close ($lock_fd);
- $lock_fd = undef;
- print STDERR "$progname: unlocked $lock\n" if ($verbose > 1);
-
- # Don't bother using the imageDirectory cache. We know that this directory
- # is flat, and we can assume that an RSS feed doesn't contain 100,000 images
- # like ~/Pictures/ might.
- #
- $cache_p = 0;
-
- # Return the URL and directory name of the files of that URL's local cache.
- #
- return ($url, $dir);
-}
-
-
-sub find_random_file($) {
- my ($dir) = @_;
-
- if ($use_spotlight_p == -1) {
- $use_spotlight_p = 0;
- if (-x '/usr/bin/mdfind') {
- $use_spotlight_p = 1;
- }
- }
-
- my $url;
- ($url, $dir) = mirror_feed ($dir);
-
- if ($url) {
- $use_spotlight_p = 0;
- print STDERR "$progname: $dir is cache for $url\n" if ($verbose > 1);
- }
-
- @all_files = read_cache ($dir);
-
- if ($#all_files >= 0) {
- # got it from the cache...
-
- } elsif ($use_spotlight_p) {
- print STDERR "$progname: spotlighting $dir...\n" if ($verbose);
- spotlight_all_files ($dir);
- print STDERR "$progname: found " . ($#all_files+1) .
- " file" . ($#all_files == 0 ? "" : "s") .
- " via Spotlight\n"
- if ($verbose);
- } else {
- print STDERR "$progname: recursively reading $dir...\n" if ($verbose);
- find_all_files ($dir);
- print STDERR "$progname: " .
- "f=" . ($#all_files+1) . "; " .
- "d=$dir_count; " .
- "s=$stat_count; " .
- "skip=${skip_count_unstat}+$skip_count_stat=" .
- ($skip_count_unstat + $skip_count_stat) .
- ".\n"
- if ($verbose);
- }
-
- write_cache ($dir);
-
- if ($#all_files < 0) {
- print STDERR "$progname: no image files in $dir\n";
- exit 1;
- }
-
- my $max_tries = 50;
- my $total_files = @all_files;
- my $sparse_p = ($total_files < 20);
-
- # If the directory has a lot of files in it:
- # Make a pass through looking for hirez files (assume some are thumbs);
- # If we found none, then, select any other file at random.
- # Otherwise if there are a small number of files:
- # Just select one at random (in case there's like, just one hirez).
-
- for (my $check_size_p = $sparse_p ? 0 : 1;
- $check_size_p >= 0; $check_size_p--) {
-
- for (my $i = 0; $i < $max_tries; $i++) {
- my $n = int (rand ($total_files));
- my $file = $all_files[$n];
- if (!$check_size_p || large_enough_p ($file)) {
- if (! $url) {
- $file =~ s@^\Q$dir/@@so || die; # remove $dir from front
- }
- return $file;
- }
- }
- }
-
- print STDERR "$progname: no suitable images in " . ($url || $dir) . " -- " .
- ($total_files <= $max_tries
- ? "all $total_files images"
- : "$max_tries of $total_files images") .
- " are smaller than ${min_image_width}x${min_image_height}.\n";
-
- # If we got here, blow away the cache. Maybe it's stale.
- unlink $cache_file_name if $cache_file_name;
-
- exit 1;
-}
-
-
-sub large_enough_p($) {
- my ($file) = @_;
-
- my ($w, $h) = image_file_size ($file);
-
- if (!defined ($h)) {
-
- # Nonexistent files are obviously too small!
- # Already printed $verbose message about the file not existing.
- return 0 unless -f $file;
-
- print STDERR "$progname: $file: unable to determine image size\n"
- if ($verbose);
- # Assume that unknown files are of good sizes: this will happen if
- # they matched $good_file_re, but we don't have code to parse them.
- # (This will also happen if the file is junk...)
- return 1;
- }
-
- if ($w < $min_image_width || $h < $min_image_height) {
- print STDERR "$progname: $file: too small ($w x $h)\n" if ($verbose);
- return 0;
- }
-
- print STDERR "$progname: $file: $w x $h\n" if ($verbose);
- return 1;
-}
-
-
-
-# Given the raw body of a GIF document, returns the dimensions of the image.
-#
-sub gif_size($) {
- my ($body) = @_;
- my $type = substr($body, 0, 6);
- my $s;
- return () unless ($type =~ /GIF8[7,9]a/);
- $s = substr ($body, 6, 10);
- my ($a,$b,$c,$d) = unpack ("C"x4, $s);
- return (($b<<8|$a), ($d<<8|$c));
-}
-
-# Given the raw body of a JPEG document, returns the dimensions of the image.
-#
-sub jpeg_size($) {
- my ($body) = @_;
- my $i = 0;
- my $L = length($body);
-
- my $c1 = substr($body, $i, 1); $i++;
- my $c2 = substr($body, $i, 1); $i++;
- return () unless (ord($c1) == 0xFF && ord($c2) == 0xD8);
-
- my $ch = "0";
- while (ord($ch) != 0xDA && $i < $L) {
- # Find next marker, beginning with 0xFF.
- while (ord($ch) != 0xFF) {
- return () if (length($body) <= $i);
- $ch = substr($body, $i, 1); $i++;
- }
- # markers can be padded with any number of 0xFF.
- while (ord($ch) == 0xFF) {
- return () if (length($body) <= $i);
- $ch = substr($body, $i, 1); $i++;
- }
-
- # $ch contains the value of the marker.
- my $marker = ord($ch);
-
- if (($marker >= 0xC0) &&
- ($marker <= 0xCF) &&
- ($marker != 0xC4) &&
- ($marker != 0xCC)) { # it's a SOFn marker
- $i += 3;
- return () if (length($body) <= $i);
- my $s = substr($body, $i, 4); $i += 4;
- my ($a,$b,$c,$d) = unpack("C"x4, $s);
- return (($c<<8|$d), ($a<<8|$b));
-
- } else {
- # We must skip variables, since FFs in variable names aren't
- # valid JPEG markers.
- return () if (length($body) <= $i);
- my $s = substr($body, $i, 2); $i += 2;
- my ($c1, $c2) = unpack ("C"x2, $s);
- my $length = ($c1 << 8) | $c2;
- return () if ($length < 2);
- $i += $length-2;
- }
- }
- return ();
-}
-
-# Given the raw body of a PNG document, returns the dimensions of the image.
-#
-sub png_size($) {
- my ($body) = @_;
- return () unless ($body =~ m/^\211PNG\r/s);
- my ($bits) = ($body =~ m/^.{12}(.{12})/s);
- return () unless defined ($bits);
- return () unless ($bits =~ /^IHDR/);
- my ($ign, $w, $h) = unpack("a4N2", $bits);
- return ($w, $h);
-}
-
-
-# Given the raw body of a GIF, JPEG, or PNG document, returns the dimensions
-# of the image.
-#
-sub image_size($) {
- my ($body) = @_;
- return () if (length($body) < 10);
- my ($w, $h) = gif_size ($body);
- if ($w && $h) { return ($w, $h); }
- ($w, $h) = jpeg_size ($body);
- if ($w && $h) { return ($w, $h); }
- # #### TODO: need image parsers for TIFF, XPM, XBM.
- return png_size ($body);
-}
-
-# Returns the dimensions of the image file.
-#
-sub image_file_size($) {
- my ($file) = @_;
- my $in;
- if (! open ($in, '<:raw', $file)) {
- print STDERR "$progname: $file: $!\n" if ($verbose);
- return ();
- }
- my $body = '';
- sysread ($in, $body, 1024 * 50); # The first 50k should be enough.
- close $in; # (It's not for certain huge jpegs...
- return image_size ($body); # but we know they're huge!)
-}
-
-
-# Reads the prefs we use from ~/.xscreensaver
-#
-sub get_x11_prefs() {
- my $got_any_p = 0;
-
- if (open (my $in, '<', $config_file)) {
- print STDERR "$progname: reading $config_file\n" if ($verbose > 1);
- local $/ = undef; # read entire file
- my $body = <$in>;
- close $in;
- $got_any_p = get_x11_prefs_1 ($body);
-
- } elsif ($verbose > 1) {
- print STDERR "$progname: $config_file: $!\n";
- }
-
- if (! $got_any_p && defined ($ENV{DISPLAY})) {
- # We weren't able to read settings from the .xscreensaver file.
- # Fall back to any settings in the X resource database
- # (/usr/X11R6/lib/X11/app-defaults/XScreenSaver)
- #
- print STDERR "$progname: reading X resources\n" if ($verbose > 1);
- my $body = `appres XScreenSaver xscreensaver -1`;
- $got_any_p = get_x11_prefs_1 ($body);
- }
-}
-
-
-sub get_x11_prefs_1($) {
- my ($body) = @_;
-
- my $got_any_p = 0;
- $body =~ s@\\\n@@gs;
- $body =~ s@^[ \t]*#[^\n]*$@@gm;
-
- if ($body =~ m/^[.*]*imageDirectory:[ \t]*([^\s]+)\s*$/im) {
- $image_directory = $1;
- $got_any_p = 1;
- }
- return $got_any_p;
-}
-
-
-sub get_cocoa_prefs($) {
- my ($id) = @_;
- print STDERR "$progname: reading Cocoa prefs: \"$id\"\n" if ($verbose > 1);
- my $v = get_cocoa_pref_1 ($id, "imageDirectory");
- $v = '~/Pictures' unless defined ($v); # Match default in XScreenSaverView
- $image_directory = $v if defined ($v);
-}
-
-
-sub get_cocoa_pref_1($$) {
- my ($id, $key) = @_;
- # make sure there's nothing stupid/malicious in either string.
- $id =~ s/[^-a-z\d. ]/_/gsi;
- $key =~ s/[^-a-z\d. ]/_/gsi;
- my $cmd = "defaults -currentHost read \"$id\" \"$key\"";
-
- print STDERR "$progname: executing $cmd\n"
- if ($verbose > 3);
-
- my $val = `$cmd 2>/dev/null`;
- $val =~ s/^\s+//s;
- $val =~ s/\s+$//s;
-
- print STDERR "$progname: Cocoa: $id $key = \"$val\"\n"
- if ($verbose > 2);
-
- $val = undef if ($val =~ m/^$/s);
-
- return $val;
-}
-
-
-sub error($) {
- my ($err) = @_;
- print STDERR "$progname: $err\n";
- exit 1;
-}
-
-sub usage() {
- print STDERR "usage: $progname [--verbose] [ directory-or-feed-url ]\n\n" .
- " Prints the name of a randomly-selected image file. The directory\n" .
- " is searched recursively. Images smaller than " .
- "${min_image_width}x${min_image_height} are excluded.\n" .
- "\n" .
- " The directory may also be the URL of an RSS/Atom feed. Enclosed\n" .
- " images will be downloaded and cached locally.\n" .
- "\n";
- exit 1;
-}
-
-sub main() {
- my $cocoa_id = undef;
- my $abs_p = 0;
-
- while ($_ = $ARGV[0]) {
- shift @ARGV;
- if (m/^--?verbose$/s) { $verbose++; }
- elsif (m/^-v+$/s) { $verbose += length($_)-1; }
- elsif (m/^--?name$/s) { } # ignored, for compatibility
- elsif (m/^--?spotlight$/s) { $use_spotlight_p = 1; }
- elsif (m/^--?no-spotlight$/s) { $use_spotlight_p = 0; }
- elsif (m/^--?cache$/s) { $cache_p = 1; }
- elsif (m/^--?no-?cache$/s) { $cache_p = 0; }
- elsif (m/^--?flush-?cache$/s) { $feed_max_age = $cache_max_age = 0; }
- elsif (m/^--?cocoa$/) { $cocoa_id = shift @ARGV; }
- elsif (m/^--?abs(olute)?$/) { $abs_p = 1; }
- elsif (m/^-./) { usage; }
- elsif (!defined($image_directory)) { $image_directory = $_; }
- else { usage; }
- }
-
- # Most hacks (X11 and Cocoa) pass a --directory value on the command line,
- # but if they don't, look it up from the resources. Currently this only
- # happens with "glitchpeg" which invokes xscreensaver-getimage-file
- # directly instead of going through the traditional path.
- #
- if (! $image_directory) {
- if (!defined ($cocoa_id)) {
- # see OSX/XScreenSaverView.m
- $cocoa_id = $ENV{XSCREENSAVER_CLASSPATH};
- }
-
- if (defined ($cocoa_id)) {
- get_cocoa_prefs($cocoa_id);
- error ("no imageDirectory in $cocoa_id") unless $image_directory;
- } else {
- get_x11_prefs();
- error ("no imageDirectory in X11 resources") unless $image_directory;
- }
- }
-
- usage unless (defined($image_directory));
-
- $image_directory =~ s@^feed:@http:@si;
-
- if ($image_directory =~ m/^https?:/si) {
- # ok
- } else {
- $image_directory =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
- $image_directory =~ s@/+$@@s; # omit trailing /
-
- if (! -d $image_directory) {
- print STDERR "$progname: $image_directory not a directory or URL\n";
- usage;
- }
- }
-
- my $file = find_random_file ($image_directory);
-
- # With --absolute return fully qualified paths instead of relative to --dir.
- if ($abs_p &&
- $file !~ m@^/@ &&
- $image_directory =~ m@^/@s) {
- $file = "$image_directory/$file";
- $file =~ s@//+@/@gs;
- }
-
- print STDOUT "$file\n";
-}
-
-main;
-exit 0;
diff --git a/driver/xscreensaver-getimage-file.man b/driver/xscreensaver-getimage-file.man
deleted file mode 100644
index 778ad85..0000000
--- a/driver/xscreensaver-getimage-file.man
+++ /dev/null
@@ -1,66 +0,0 @@
-.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
-.SH NAME
-xscreensaver-getimage-file - put a randomly-selected image on the root window
-.SH SYNOPSIS
-.B xscreensaver-getimage-file
-[\-display \fIhost:display.screen\fP]
-[\--verbose]
-[\--name]
-[\--no-cache]
-directory-or-URL
-.SH DESCRIPTION
-The \fIxscreensaver\-getimage\-file\fP program is a helper program
-for the xscreensaver hacks that manipulate images. Specifically, it
-is invoked by
-.BR xscreensaver\-getimage (1)
-as needed. This is not a user-level command.
-
-This program selects a random image from disk, and loads it on the root
-window. It does this by figuring out which image-loading programs are
-installed on the system, and invoking the first one it finds.
-.SH OPTIONS
-.I xscreensaver-getimage-file
-accepts the following options:
-.TP 4
-.B --verbose
-Print diagnostics.
-.TP 4
-.B --name
-Don't load an image: instead just print the file name to stdout.
-.TP 4
-.I directory-or-URL
-If a directory is specified, it will be searched recursively for
-images. Any images found will eligible for display. For efficiency,
-the contents of the directory are cached for a few hours before it
-is re-scanned.
-
-If a URL is specified, it should be the URL of an RSS or Atom feed
-containing images. The first time it is accessed, all of the images
-in the feed will be downloaded to a local cache directory. If a few
-hours have elapsed since last time, the URL will be polled again, and
-any new images will be cached, any images no longer in the feed
-will be expired.
-.TP 4
-.B --no-cache
-Update the cache immediately, even if it is not time yet. This
-will re-scan the directory, or re-poll the RSS feed.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1),
-.BR xv (1),
-.BR xli (1),
-.BR xloadimage (1),
-.BR chbg (1)
-.SH COPYRIGHT
-Copyright \(co 2001-2012 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-getimage-video b/driver/xscreensaver-getimage-video
deleted file mode 100755
index dbc8986..0000000
--- a/driver/xscreensaver-getimage-video
+++ /dev/null
@@ -1,144 +0,0 @@
-#!/usr/bin/perl -w
-# Copyright © 2001-2015 Jamie Zawinski <jwz@jwz.org>.
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation. No representations are made about the suitability of this
-# software for any purpose. It is provided "as is" without express or
-# implied warranty.
-#
-# This program attempts to grab a single frame of video from the system's
-# video capture card, and then load it on to the root window using the
-# "xscreensaver-getimage-file" program. Various frame-grabbing programs
-# are known, and the first one found is used.
-#
-# The various xscreensaver hacks that manipulate images ("slidescreen",
-# "jigsaw", etc.) get the image to manipulate by running the
-# "xscreensaver-getimage" program.
-#
-# The various screen savers invoke "xscreensaver-getimage", which will in
-# turn invoke this program, depending on the value of the "grabVideoFrames"
-# setting in the ~/.xscreensaver file (or in the app-defaults file, usually
-# /usr/lib/X11/app-defaults/XScreenSaver).
-#
-# Created: 13-Apr-2001.
-
-require 5;
-#use diagnostics; # Fails on some MacOS 10.5 systems
-use strict;
-
-my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.23 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
-
-my $tmpdir = $ENV{TMPDIR} || "/tmp";
-my $tmpfile = sprintf("%s/xssv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
-
-my $verbose = 0;
-
-
-# These are programs that can be used to grab a video frame. The first one
-# of these programs that exists on $PATH will be used, and the image file
-# is assumed to be written to $tmpfile (in some image format acceptable to
-# "xscreensaver-getimage-file", e.g., PPM or JPEG.)
-#
-# If you add other programs to this list, please let me know!
-#
-my @programs = (
-
- "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile", # BTTV
- "qcam > $tmpfile", # Connectix Qcam
- "gqcam -t PPM -d $tmpfile", # GTK+ Qcam clone
-
- "v4lctl snap ppm full $tmpfile", # XawTV 3.94.
-
- "streamer -a -s 768x576 -o $tmpfile", # XawTV
- # the "-a" option ("mute audio") arrived with XawTV 3.76.
-
- "atitv snap $tmpfile", # ATI video capture card
-
- "grab -type ppm -format ntsc -source 1 " . # *BSD BT848 module
- "-settle 0.75 -output $tmpfile",
-
- "motioneye -j $tmpfile", # Sony Vaio MotionEye
- # (hardware jpeg encoder)
-
- "vidcat -b -f ppm -s 640x480 > $tmpfile 2>&-", # w3cam/ovcam
-
- "vidtomem -f $tmpfile 2>&- " . # Silicon Graphics
- "&& mv $tmpfile-00000.rgb $tmpfile",
-
- # Maybe this works?
- # "ffmpeg -i /dev/video0 -ss 00:00:01 -vframes 1 $tmpfile 2>&-",
-
- # "mplayer -really-quiet tv://0 " . # Maybe works with some cams?
- # "-ao null -vo pnm -frames 1 2>&- " .
- # "&& mv 00000001.ppm $tmpfile",
-
-);
-
-
-sub error($) {
- my ($e) = @_;
- print STDERR "$progname: $e\n";
- exit 1;
-}
-
-sub pick_grabber() {
- my @names = ();
-
- foreach my $cmd (@programs) {
- $_ = $cmd;
- my ($name) = m/^([^ ]+)/;
- push @names, "\"$name\"";
- print STDERR "$progname: looking for $name...\n" if ($verbose > 2);
- foreach my $dir (split (/:/, $ENV{PATH})) {
- print STDERR "$progname: checking $dir/$name\n" if ($verbose > 3);
- if (-x "$dir/$name") {
- return $cmd;
- }
- }
- }
-
- $names[$#names] = "or " . $names[$#names];
- error ("none of: " . join (", ", @names) . " were found on \$PATH.");
-}
-
-
-sub grab_image() {
- my $cmd = pick_grabber();
- unlink $tmpfile;
-
- print STDERR "$progname: executing \"$cmd\"\n" if ($verbose);
- system ($cmd);
-
- if (! -s $tmpfile) {
- unlink $tmpfile;
- error ("\"$cmd\" produced no data.");
- }
-
- print STDERR "$progname: wrote \"$tmpfile\"\n" if ($verbose);
- print STDOUT "$tmpfile\n";
-}
-
-
-sub usage() {
- print STDERR "usage: $progname [--verbose] [--name | --stdout]\n";
- exit 1;
-}
-
-sub main() {
- while ($_ = $ARGV[0]) {
- shift @ARGV;
- if (m/^--?verbose$/s) { $verbose++; }
- elsif (m/^-v+$/s) { $verbose += length($_)-1; }
- elsif (m/^--?name$/s) { } # ignored, for compatibility
- elsif (m/^-./) { usage; }
- else { usage; }
- }
- grab_image();
-}
-
-main;
-exit 0;
diff --git a/driver/xscreensaver-getimage-video.man b/driver/xscreensaver-getimage-video.man
deleted file mode 100644
index d19f34e..0000000
--- a/driver/xscreensaver-getimage-video.man
+++ /dev/null
@@ -1,51 +0,0 @@
-.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
-.SH NAME
-xscreensaver-getimage-video - put a video frame on the root window
-.SH SYNOPSIS
-.B xscreensaver-getimage-video
-[\-display \fIhost:display.screen\fP] [\--verbose] [\--stdout]
-.SH DESCRIPTION
-The \fIxscreensaver\-getimage\-video\fP program is a helper program
-for the xscreensaver hacks that manipulate images. Specifically, it
-is invoked by
-.BR xscreensaver\-getimage (1)
-as needed. This is not a user-level command.
-
-This program grabs a random frame of video from the system's video input,
-and then loads it on the root window. It does this by figuring out which
-frame-grabbing programs are installed on the system, and invoking the
-first one it finds. Then it runs
-.BR xscreensaver\-getimage\-file (1)
-to load that image onto the root window.
-.SH OPTIONS
-.I xscreensaver-getimage-video
-accepts the following options:
-.TP 4
-.B --verbose
-Print diagnostics.
-.TP 4
-.B --stdout
-Instead of loading the image onto the root window, write it to stdout
-as a PBM file.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-getimage (1),
-.BR xscreensaver\-getimage\-file (1),
-.BR bttvgrab (1),
-.BR qcam (1),
-.BR streamer (1),
-.BR atitv (1),
-.BR vidtomem (1)
-.SH COPYRIGHT
-Copyright \(co 2001 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-getimage.man b/driver/xscreensaver-getimage.man
deleted file mode 100644
index ae68014..0000000
--- a/driver/xscreensaver-getimage.man
+++ /dev/null
@@ -1,73 +0,0 @@
-.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
-.SH NAME
-xscreensaver-getimage - put some randomly-selected image on the root window
-.SH SYNOPSIS
-.B xscreensaver-getimage
-[\-display \fIhost:display.screen\fP] [\--verbose] window-id [pixmap-id]
-.SH DESCRIPTION
-The \fIxscreensaver\-getimage\fP program is a helper program for the
-xscreensaver hacks that manipulate images. This is not a user-level
-command.
-
-This program selects a random image, and puts it on the specified
-window or pixmap. This image might be a snapshot of the desktop; or
-a frame captured from the system's video input; or a randomly-selected
-image from disk.
-
-If only a window ID is specified, the image will be painted there.
-If both a window ID and a pixmap ID are specified, then the image will
-be painted on the pixmap; and the window \fImay\fP be modified as a
-side-effect.
-.SH OPTIONS
-.I xscreensaver-getimage
-reads the \fI~/.xscreensaver\fP file for configuration information.
-It uses these settings:
-.TP 4
-.B grabDesktopImages
-Whether it is acceptable to grab snapshots of the desktop.
-The security paranoid might want to turn this off, to avoid letting
-people see (but not touch!) your desktop while the screen is locked.
-.TP 4
-.B grabVideoFrames
-Whether it is acceptable to grab frames of video from the system's video
-input. Grabbing of video is done by invoking the
-.BR xscreensaver-getimage-video (1)
-program.
-.TP 4
-.B chooseRandomImages
-Whether it is acceptable to display random images found on disk.
-Selection and loading of images is done by invoking the
-.BR xscreensaver-getimage-file (1)
-program.
-.TP 4
-.B imageDirectory
-When loading images from disk, this is the directory to find them in.
-The directory will be searched recursively for images.
-
-It may also be the URL of an RSS or Atom feed, in which case a
-random image from that feed will be selected instead. The contents
-of the feed will be cached locally and refreshed periodically as needed.
-.PP
-If none of the three options are set to True, then video
-colorbars will be displayed instead.
-.SH BUGS
-When grabbing desktop images, the \fIwindow\fP argument will be unmapped
-and have its contents modified, causing flicker. (This does not happen
-when loading image files or video frames.)
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-demo (1)
-.BR xscreensaver\-getimage\-file (1)
-.BR xscreensaver\-getimage\-video (1)
-.SH COPYRIGHT
-Copyright \(co 2001-2011 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-gfx.c b/driver/xscreensaver-gfx.c
index 5a543a4..870423c 100644
--- a/driver/xscreensaver-gfx.c
+++ b/driver/xscreensaver-gfx.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2022 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -36,6 +36,10 @@
#include <sys/types.h>
#include <pwd.h>
+#ifndef HAVE_XINPUT
+# error The XInput2 extension is required
+#endif
+
#include <X11/extensions/XInput2.h>
#ifdef HAVE_RANDR
@@ -86,12 +90,16 @@ maybe_reload_init_file (saver_info *si)
saver_preferences *p = &si->prefs;
if (init_file_changed_p (p))
{
+ Bool ov = p->verbose_p;
if (p->verbose_p)
fprintf (stderr, "%s: file \"%s\" has changed, reloading\n",
blurb(), init_file_name());
load_init_file (si->dpy, p);
+ if (ov)
+ p->verbose_p = True;
+
/* If the DPMS settings in the init file have changed, change the
settings on the server to match. This also would have happened at
the watchdog timer. */
@@ -344,7 +352,9 @@ main_loop (saver_info *si, Bool init_p)
initialize_randr (si);
update_screen_layout (si);
- describe_monitor_layout (si->monitor_layout);
+
+ if (p->verbose_p)
+ describe_monitor_layout (si->monitor_layout);
initialize_screensaver_window (si);
init_sigchld (si);
@@ -389,26 +399,26 @@ main_loop (saver_info *si, Bool init_p)
/* The Resize and Rotate extension sends an event when the
size, rotation, or refresh rate of any screen has changed.
*/
- if (p->verbose_p)
- {
- int screen = XRRRootToScreen (si->dpy, event.xrr_event.window);
- fprintf (stderr, "%s: %d: screen change event received\n",
- blurb(), screen);
- }
+ Bool changed_p;
/* Inform Xlib that it's ok to update its data structures. */
XRRUpdateConfiguration (&event.x_event);
/* Resize the existing xscreensaver windows and cached ssi data. */
- if (update_screen_layout (si))
+ changed_p = update_screen_layout (si);
+
+ if (p->verbose_p)
{
- if (p->verbose_p)
- {
- fprintf (stderr, "%s: new layout:\n", blurb());
- describe_monitor_layout (si->monitor_layout);
- }
- resize_screensaver_window (si);
+ int screen = XRRRootToScreen (si->dpy, event.xrr_event.window);
+ fprintf (stderr, "%s: %d: screen change event: %s\n",
+ blurb(), screen,
+ (changed_p ? "new layout:" : "layout unchanged"));
+ if (changed_p)
+ describe_monitor_layout (si->monitor_layout);
}
+
+ if (changed_p)
+ resize_screensaver_window (si);
}
# endif /* HAVE_RANDR */
@@ -495,6 +505,13 @@ main (int argc, char **argv)
dpy_str = argv[++i];
if (!dpy_str) goto HELP;
}
+ else if (!strcmp (argv[i], "-ver") ||
+ !strcmp (argv[i], "-vers") ||
+ !strcmp (argv[i], "-version"))
+ {
+ fprintf (stderr, "%s\n", screensaver_id+4);
+ exit (1);
+ }
else if (!strcmp (argv[i], "-sync") ||
!strcmp (argv[i], "-synch") ||
!strcmp (argv[i], "-synchronize") ||
diff --git a/driver/xscreensaver-gfx.man b/driver/xscreensaver-gfx.man
index 7b209ac..f14fccd 100644
--- a/driver/xscreensaver-gfx.man
+++ b/driver/xscreensaver-gfx.man
@@ -3,7 +3,8 @@
xscreensaver - extensible screen saver and screen locking framework
.SH SYNOPSIS
.B xscreensaver-gfx
-[\-display \fIhost:display.screen\fP]
+[\-\-display \fIhost:display.screen\fP]
+[\-\-version]
.SH DESCRIPTION
The
.BR xscreensaver (1)
@@ -16,7 +17,7 @@ Do not run this program directly.
.BR xscreensaver\-auth (MANSUFFIX),
.BR xscreensaver\-systemd (MANSUFFIX).
.SH COPYRIGHT
-Copyright \(co 2021 by Jamie Zawinski.
+Copyright \(co 2021-2022 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
diff --git a/driver/xscreensaver-settings.desktop.in b/driver/xscreensaver-settings.desktop.in
new file mode 100755
index 0000000..e50f569
--- /dev/null
+++ b/driver/xscreensaver-settings.desktop.in
@@ -0,0 +1,9 @@
+#!/usr/bin/env xdg-open
+[Desktop Entry]
+Exec=xscreensaver-settings
+Icon=xscreensaver
+_Name=XScreenSaver Settings
+_Comment=Change screensaver properties
+Type=Application
+Categories=Settings;DesktopSettings;Screensaver;Security;GNOME;GTK;KDE;Motif;Qt;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-Unity-Settings-Panel;X-XFCE-SettingsDialog;X-XFCE-SystemSettings
+Terminal=false
diff --git a/driver/xscreensaver-settings.man b/driver/xscreensaver-settings.man
index 6b9657d..6ecaa90 100644
--- a/driver/xscreensaver-settings.man
+++ b/driver/xscreensaver-settings.man
@@ -3,9 +3,8 @@
xscreensaver-settings - configure and control the xscreensaver daemon
.SH SYNOPSIS
.B xscreensaver\-settings
-[\-display \fIhost:display.screen\fP]
-[\-prefs]
-[\-debug]
+[\-\-display \fIhost:display.screen\fP]
+[\-\-debug]
.SH DESCRIPTION
The \fIxscreensaver\-settings\fP program is a graphical front-end for
setting the parameters used by the
@@ -18,29 +17,25 @@ is for editing the list of demos, and the second is for editing various other
parameters of the screensaver.
.SH MENU COMMANDS
All of these commands are on either the \fBFile\fP or \fBHelp\fP menus:
-
.TP 4
.B Blank Screen Now
Activates the background \fIxscreensaver\fP daemon, which will then run
a demo at random. This is the same as running
.BR xscreensaver\-command (1)
-with the \fI\-activate\fP option.
-
+with the \fI\-\-activate\fP option.
.TP 4
.B Lock Screen Now
Just like \fBBlank Screen Now\fP, except the screen will be locked as
well (even if it is not configured to lock all the time.) This is the
same as running
.BR xscreensaver\-command (1)
-with the \fI\-lock\fP option.
-
+with the \fI\-\-lock\fP option.
.TP 4
.B Kill Daemon
If the xscreensaver daemon is running on this screen, kill it.
This is the same as running
.BR xscreensaver\-command (1)
-with the \fI\-exit\fP option.
-
+with the \fI\-\-exit\fP option.
.TP 4
.B Restart Daemon
If the xscreensaver daemon is running on this screen, kill it.
@@ -49,16 +44,13 @@ Then launch it again. This is the same as doing
Note that it is \fInot\fP the same as doing
"\fIxscreensaver-command --restart\fP".
-
.TP 4
.B Exit
Exits the \fIxscreensaver-settings\fP program (this program) without
affecting the background \fIxscreensaver\fP daemon, if any.
-
.TP 4
.B About...
Displays the version number of this program, \fIxscreensaver-settings\fP.
-
.TP 4
.B Documentation...
Opens up a web browser looking at the XScreenSaver web page, where you
@@ -71,41 +63,32 @@ manuals.
.SH DISPLAY MODES TAB
This page contains a list of the names of the various display modes, a
preview area, and some fields that let you configure screen saver behavior.
-
-.TP 4
-.B Mode
+.SS Mode
This option menu controls the activation behavior of the screen saver.
The options are:
.RS 4
-
.TP 4
.B Disable Screen Saver
Don't ever blank the screen, and don't ever allow the monitor to power down.
-
.TP 4
.B Blank Screen Only
When blanking the screen, just go black: don't run any graphics.
-
.TP 4
.B Only One Screen Saver
When blanking the screen, only ever use one particular display mode (the
one selected in the list.)
-
.TP 4
.B Random Screen Saver
When blanking the screen, select a random display mode from among those
that are enabled and applicable. If there are multiple monitors
connected, run a different display mode on each one. This is the default.
-
.TP 4
.B Random Same Saver
This is just like \fBRandom Screen Saver\fP, except that the \fIsame\fP
randomly-chosen display mode will be run on all monitors, instead of
different ones on each.
.RE
-
-.TP 4
-.B Demo List
+.SS Demo List
Double-clicking in the list on the left will let you try out the indicated
demo. The screen will go black, and the program will run in full-screen
mode, just as it would if the \fIxscreensaver\fP daemon had launched it.
@@ -121,20 +104,16 @@ has a checkbox next to it: this controls whether this display mode is
enabled. If it is unchecked, then that mode will not be chosen. (Though
you can still run it explicitly by double-clicking on its name.)
-.TP 4
-.B Arrow Buttons
+If the list has focus, you can type any character to search within it.
+.SS Arrow Buttons
Beneath the list are a pair of up and down arrows. Clicking on the down
arrow will select the next item in the list, and then run it in full-screen
mode, just as if you had double-clicked on it. The up arrow goes the other
way. This is just a shortcut for trying out all of the display modes in turn.
-
-.TP 4
-.B Blank After
+.SS Blank After
After the user has been idle this long, the \fIxscreensaver\fP daemon
will blank the screen.
-
-.TP 4
-.B Cycle After
+.SS Cycle After
After the screensaver has been running for this long, the currently
running graphics demo will be killed, and a new one started.
If this is 0, then the graphics demo will never be changed:
@@ -144,13 +123,9 @@ activity.
If there are multiple screens, the savers are staggered slightly so
that while they all change every \fIcycle\fP minutes, they don't all
change at the same time.
-
-.TP 4
-.B Lock Screen
+.SS Lock Screen
When this is checked, the screen will be locked when it activates.
-
-.TP 4
-.B Lock Screen After
+.SS Lock Screen After
This controls the length of the "grace period" between when the
screensaver activates, and when the screen becomes locked. For
example, if this is 5 minutes, and \fIBlank After\fP is 10 minutes,
@@ -160,38 +135,23 @@ screen. But, if there was user activity at 15 minutes or later (that
is, \fILock Screen After\fP minutes after activation) then a password
would be required. The default is 0, meaning that if locking is
enabled, then a password will be required as soon as the screen blanks.
-
-.TP 4
-.B Preview
+.SS Preview
This button, below the small preview window, runs the demo in full-screen
mode so that you can try it out. This is the same thing that happens when
you double-click an element in the list. Click the mouse to dismiss the
full-screen preview.
-
-.TP 4
-.B Settings
+.SS Settings
This button will pop up a dialog where you can configure settings specific
to the display mode selected in the list.
-
.SH SETTINGS DIALOG
When you click on the \fISettings\fP button on the \fIDisplay Modes\fP
tab, a configuration dialog will pop up that lets you customize settings
-of the selected display mode. Each display mode has its own custom
-configuration controls on the left side.
-
-On the right side is a paragraph or two describing the display mode.
-Below that is a \fBDocumentation\fP button that will display the display
-mode's manual page in a new window.
-
-The \fBAdvanced\fP button reconfigures the dialog box so that you can
-edit the display mode's command line directly, instead of using the
-graphical controls.
+of the selected display mode. Each display mode has its own custom set
+of configuration controls.
.SH ADVANCED TAB
This tab lets you change various settings used by the xscreensaver daemon
itself, as well as some global options shared by all of the display modes.
-
-.B Image Manipulation
-
+.SS Image Manipulation
Some of the graphics hacks manipulate images. These settings control
where those source images come from. The savers load images by running the
.BR xscreensaver\-getimage (MANSUFFIX)
@@ -199,7 +159,6 @@ and
.BR xscreensaver\-getimage\-file (MANSUFFIX)
programs.
.RS 4
-
.TP 4
.B Grab Desktop Images
If this option is selected, then savers are allowed to manipulate the
@@ -210,12 +169,11 @@ set, it means that the windows on your desktop will occasionally be
visible while your screen is locked. Others will not be able to
\fIdo\fP anything, but they may be able to \fIsee\fP whatever you left
on your screen.
-
.TP 4
.B Grab Video Frames
-If your system has a video capture device, selecting this option may allow
-the image-manipulating modes to grab a still-frame of video to operate on.
-
+If your system has a camera or other video input, selecting this option may
+allow the image-manipulating modes to grab a still-frame of video to operate
+on.
.TP 4
.B Choose Random Image
If this option is set, then the image-manipulating modes will select a
@@ -230,38 +188,31 @@ If more than one of the above image-related options are selected, then
one will be chosen at random. If none of them are selected, then an
image of video colorbars will be used instead.
.RE
-.PP
-.B Text Manipulation
-
+.SS Text Manipulation
Some of the display modes display and manipulate text. The following
options control how that text is generated. The savers load text by
running the
.BR xscreensaver\-text (MANSUFFIX)
program.
.RS 4
-
.TP 4
.B Host Name and Time
If this checkbox is selected, then the text used by the screen savers
will be the local host name, OS version, date, time, and system load.
-
.TP 4
.B Text
If this checkbox is selected, then the literal text typed in the
field to its right will be used. If it contains % escape sequences,
they will be expanded as per
.BR strftime (2).
-
.TP 4
.B Text File
If this checkbox is selected, then the contents of the corresponding
file will be displayed.
-
.TP 4
.B Program
If this checkbox is selected, then the given program will be run,
repeatedly, and its output will be displayed.
-
.TP 4
.B URL
If this checkbox is selected, then the given web page will be downloaded
@@ -273,11 +224,9 @@ runs out of text, so it will probably be hitting that web server multiple
times a minute.
.RE
.PP
-.B Power Management Settings
-
+.SS Power Management Settings
These settings control whether, and when, your monitor powers down.
.RS 4
-
.TP 4
.B Power Management Enabled
Whether the monitor should be powered down after a period of inactivity.
@@ -285,24 +234,20 @@ Whether the monitor should be powered down after a period of inactivity.
If this option is grayed out, it means your X server does not support
the XDPMS extension, and so control over the monitor's power state is
not available.
-
.TP 4
.B Standby After
If \fIPower Management Enabled\fP is selected, the monitor will go black
after this much idle time. (Graphics demos will stop running, also.)
-
.TP 4
.B Suspend After
If \fIPower Management Enabled\fP is selected, the monitor will go
into power-saving mode after this much idle time. This duration should
be greater than or equal to \fIStandby\fP.
-
.TP 4
.B Off After
If \fIPower Management Enabled\fP is selected, the monitor will fully
power down after this much idle time. This duration should be greater
than or equal to \fISuspend\fP.
-
.TP 4
.B Quick Power-off in "Blank Only" Mode
If the display mode is set to \fIBlank Screen Only\fP and this is
@@ -311,35 +256,24 @@ blanking, regardless of the other power-management settings. In this
way, the power management idle-timers can be completely disabled, but
the screen will be powered off when black.
.RE
-.PP
-.B Blanking
-
+.SS Blanking
These options control how the screen fades to or from black when
-a screen saver begins or ends. Note: fading doesn't work with all
-video drivers.
-In particular, it does not work on the 2020-vintage Raspberry Pi.
+a screen saver begins or ends.
.RS 4
-
.TP 4
.B Fade To Black When Blanking
If selected, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out. A fade
-will also be done when switching from one display mode to another.
-
+of the screen will fade to black instead of simply winking out.
.TP 4
.B Unfade From Black When Unblanking
The opposite: if selected, then when the screensaver deactivates, the original
contents of the screen will fade in from black instead of appearing
immediately. This is only done if \fIFade To Black\fP is also selected.
-
.TP 4
.B Fade Duration
When fading or unfading are selected, this controls how long the fade will
take.
-
-.RE
-.B Theme
-.RS 4
+.SS Theme
This option menu lists the color schemes available for use on the
unlock dialog.
.RE
@@ -353,21 +287,14 @@ file, or the X resource database.
.I xscreensaver\-settings
accepts the following command line options.
.TP 8
-.B \-display \fIhost:display.screen\fP
+.B \-\-display \fIhost:display.screen\fP
The X display to use. The \fIxscreensaver\-settings\fP program will open its
window on that display, and also control the \fIxscreensaver\fP daemon that
is managing that same display.
-
.TP 8
-.B \-prefs
-Start up with the \fBAdvanced\fP tab selected by default
-instead of the \fBDisplay Modes\fP tab.
-
-.TP 8
-.B \-debug
+.B \-\-debug
Causes lots of diagnostics to be printed on stderr.
-
-.P
+.PP
The \fIxscreensaver\fP and \fIxscreensaver\-settings\fP processes must run
on the same machine, or at least, on two machines that share a file system.
When \fIxscreensaver\-settings\fP writes a new version of
@@ -380,10 +307,10 @@ file, or it won't work.
to get the default host and display number.
.TP 8
.B PATH
-to find the sub-programs to run. However, note that the sub-programs
-are actually launched by the \fIxscreensaver\fP daemon, not
-by \fIxscreensaver-settings\fP itself. So, what matters is what \fB$PATH\fP
-that the \fIxscreensaver\fP program sees.
+to find the sub-programs to run. However, note that the sub-programs
+actually launched by \fIxscreensaver-settings\fP for display in the
+inline preview pane, but are launched by the \fIxscreensaver\fP daemon
+when run full screen, so the \fB$PATH\fP setting in both processes matters.
.TP 8
.B HOME
for the directory in which to read and write the \fI.xscreensaver\fP file.
@@ -406,7 +333,7 @@ and a FAQ can always be found at https://www.jwz.org/xscreensaver/
.BR xscreensaver\-getimage\-video (MANSUFFIX),
.BR xscreensaver\-text (MANSUFFIX)
.SH COPYRIGHT
-Copyright \(co 1992-2021 by Jamie Zawinski.
+Copyright \(co 1992-2022 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
@@ -415,6 +342,6 @@ supporting documentation. No representations are made about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-1992.
+Jamie Zawinski <jwz@jwz.org>.
Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-systemd.c b/driver/xscreensaver-systemd.c
index d06174a..2e174b2 100644
--- a/driver/xscreensaver-systemd.c
+++ b/driver/xscreensaver-systemd.c
@@ -1,4 +1,4 @@
-/* xscreensaver-systemd, Copyright (c) 2019-2021
+/* xscreensaver-systemd, Copyright (c) 2019-2023
* Martin Lucina <martin@lucina.net> and Jamie Zawinski <jwz@jwz.org>
*
* ISC License
@@ -17,6 +17,7 @@
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
+ *****************************************************************************
*
* This utility provides systemd integration for XScreenSaver.
* It does two things:
@@ -27,16 +28,20 @@
* up again, it runs "xscreensaver-command -deactivate" to force the
* unlock dialog to appear immediately.
*
- * - When another process on the system makes asks for the screen saver
- * to be inhibited (e.g. because a video is playing) this program
- * periodically runs "xscreensaver-command -deactivate" to keep the
- * display un-blanked. It does this until the other program asks for
- * it to stop.
+ * - When another process on the system asks for the screen saver to be
+ * inhibited (e.g. because a video is playing) this program periodically
+ * runs "xscreensaver-command -deactivate" to keep the display un-blanked.
+ * It does this until the other program asks for it to stop.
+ *
+ * For this to work at all, you must either:
*
- * For this to work at all, you must prevent Gnome and KDE from usurping
- * the "org.freedesktop.ScreenSaver" messages, or else this program can't
- * receive them. The "xscreensaver" man page contains the (complicated)
- * installation instructions.
+ * A: Be running GNOME's "org.gnome.SessionManager" D-Bus service; or
+ * B: Be running KDE's "org.kde.Solid.PowerManagement.PolicyAgent" svc; or
+ * C: Prevent your desktop environment from running the
+ * "org.freedesktop.ScreenSaver "service.
+ *
+ *
+ *****************************************************************************
*
* Background:
*
@@ -60,21 +65,29 @@
* "Did IQs just drop sharply while I was away?" -- Ellen Ripley
*
* We can sometimes detect that the inhibiting app has exited abnormally
- * by using "tracking peers" but I'm not sure how reliable that is.
+ * by using "tracking peers" but that seems to not work on all systems.
*
* Furthermore, we can't listen for these "inhibit blanking" requests
- * if some other program is already listening for them -- which Gnome and
+ * if some other program is already listening for them -- which GNOME and
* KDE do by default, even if their screen savers are otherwise disabled.
- * That makes it far more complicated for the user to install XScreenSaver
- * in such a way that "xscreensaver-systemd" can even launch at all.
+ *
+ * Both GNOME and KDE bind to "org.freedesktop.ScreenSaver" by default,
+ * meaning that we can't listen for events sent there. However, after
+ * receiving events at "org.freedesktop.ScreenSaver" they both *also*
+ * sends out a secondary set of notifications that we *are* able to
+ * receive. Naturally GNOME and KDE do this in differently idiosyncratic
+ * ways.
+ *
+ * If you use some third desktop system that registers itself as
+ * "org.freedesktop.ScreenSaver", you will need to convince it to stop
+ * doing that.
*
* To recap: because the existing video players decided to delete the
* single line of code that they already had -- the heartbeat call to
- * "xscreensaver-command -deactivate" -- we had to respond by adding a
- * THOUSAND LINES of complicated code that talks to a server that may
- * not be running, and that may not allow us to connect, and that may
- * not work properly anyway, and that makes installation hellaciously
- * difficult and confusing for the end user.
+ * "xscreensaver-command -deactivate" -- we had to respond by adding
+ * TWELVE HUNDRED LINES of complicated code that talks to a server that
+ * may not be running, and that may not allow us to connect, and that may
+ * not work properly anyway.
*
* This is what is laughingly referred to as "progress".
*
@@ -84,86 +97,90 @@
*
*****************************************************************************
*
- * Firefox (version 78.5)
+ * Firefox 91.9.0esr, Raspbian 11.1:
*
- * When playing media, Firefox will send "inhibit" to one of these
- * targets: "org.freedesktop.ScreenSaver" or "org.gnome.SessionManager".
+ * Sends "Inhibit" to the first of these targets that exists at launch:
+ * "org.freedesktop.ScreenSaver /ScreenSaver" or
+ * "org.gnome.SessionManager /org/gnome/SessionManager".
+ * In the source, "WakeLockListener.cpp".
*
- * However, Firefox decides which, if any, of those to use at launch time,
- * and does not revisit that decision. So if xscreensaver-systemd has not
- * been launched before Firefox, it won't work. Fortunately, in most use
- * cases, xscreensaver will have been launched earlier in the startup
- * sequence than the web browser.
+ * Inhibit: Kind: Reason:
*
- * If you close the tab or exit while playing, Firefox sends "uninhibit".
- *
- * Critical Firefox Bug:
- *
- * If Firefox crashes or is killed while playing, it never sends
- * "uninhibit", leaving the screen saver permanently inhibited. Once
- * that happens, the only way to un-fuck things is to kill and restart
- * the "xscreensaver-systemd" program.
- *
- * Annoying Firefox Bug:
- *
- * Firefox sends an "inhibit" message when it is merely playing audio.
- * That's horrible. Playing audio should prevent your machine from going
- * to sleep, but it should NOT prevent your screen from blanking or
- * locking.
- *
- * However at least it sends it with the reason "audio-playing" instead
- * of "video-playing", meaning we can (and do) special-case Firefox and
- * ignore that one.
+ * Yes MP4 URL "video-playing"
+ * Yes MP3 URL "audio-playing"
+ * Yes <VIDEO> "video-playing"
+ * No <VIDEO AUTOPLAY> -
+ * No <VIDEO AUTOPLAY LOOP> -
+ * Yes <AUDIO> "audio-playing"
+ * No <AUDIO AUTOPLAY> -
+ * Yes YouTube IFRAME "video-playing"
+ * Yes YouTube IFRAME, autoplay "video-playing"
+ * Yes Uninhibit on quit
+ * No Uninhibit on kill
*
*
*****************************************************************************
*
- * Chrome (version 87)
+ * Chromium 98.0.4758.106-rpt1, Raspbian 11.1:
*
- * Sends "inhibit" to "org.freedesktop.ScreenSaver" (though it uses a
- * a different object path than Firefox does). Unlike Firefox, Chrome
- * does not send an "inhibit" message when only audio is playing.
+ * Sends "Inhibit" to the first of these targets that exists at launch:
+ * "org.gnome.SessionManager /org/gnome/SessionManager" or
+ * "org.freedesktop.ScreenSaver /org/freedesktop/ScreenSaver".
+ * In the source, "power_save_blocker_linux.cc".
*
- * Critical Chrome Bug:
+ * Inhibit: Kind: Reason:
*
- * If Chrome crashes or is killed while playing, it never sends
- * "uninhibit", leaving the screen saver permanently inhibited.
+ * Yes MP4 URL "chromium-browser-v7"
+ * Yes MP3 URL "chromium-browser-v7" <-- BAD
+ * Yes <VIDEO> "chromium-browser-v7"
+ * Yes <VIDEO AUTOPLAY> "chromium-browser-v7"
+ * Yes <VIDEO AUTOPLAY LOOP> "chromium-browser-v7" <-- BAD
+ * No <AUDIO> -
+ * No <AUDIO AUTOPLAY> -
+ * Yes YouTube IFRAME "chromium-browser-v7"
+ * Yes YouTube IFRAME, autoplay "chromium-browser-v7"
+ * Yes Uninhibit on quit
+ * No Uninhibit on kill
*
+ * Bad Chromium bug #1:
*
- *****************************************************************************
+ * It inhibits when only audio is playing, and does so with the same
+ * message as for audio, so we can't tell them apart. This means that,
+ * unlike Firefox, playing audio-only in Chromium will prevent your
+ * screen from blanking.
*
- * Chromium (version 78, Raspbian 10.4)
+ * Bad Chromium bug #2:
*
- * Does not use "org.freedesktop.ScreenSaver" or "xdg-screensaver".
- * It appears to make no attempt to inhibit the screen saver while
- * video is playing.
+ * It inhibits when short looping videos are playing. Many sites
+ * (including Twitter) auto-convert GIFs to looping MP4s to save
+ * bandwidth, so Chromium will inhibit any time such a GIF is visible.
*
+ * The proper way for Chrome to fix this would be to stop inhibiting once
+ * the video loops. That way your multi-hour movie inhibits properly, but
+ * your looping GIF only inhibits for the first few seconds.
+ *
*
*****************************************************************************
*
- * Chromium (version 84.0.4147.141, Raspbian 10.6)
+ * Chromium 101.0.4951.64, Debian 11.3:
*
- * Sends "inhibit" to "org.freedesktop.ScreenSaver" (though it uses a
- * a different object path than Firefox does). Unlike Firefox, Chrome
- * does not send an "inhibit" message when only audio is playing.
+ * Same as the above, except that "chromium-browser-v7" has changed to
+ * "Video Wake Lock".
*
- * If you close the tab or exit while playing, Chromium sends "uninhibit".
+ * When playing videos, it sends two "Inhibit" requests: "Video Wake Lock"
+ * and "Playing audio". When playing audio, it also sends those same two
+ * requests. Closer! Still wrong.
*
- * Critical Chromium Bug:
*
- * If Chromium crashes or is killed while playing, it never sends
- * "uninhibit", leaving the screen saver permanently inhibited.
- *
- * Annoying Chromium Bug:
+ *****************************************************************************
*
- * Like Firefox, Chromium sends an "inhibit" message when it is merely
- * playing audio. Unlike Firefox, it sends exactly the same "reason"
- * string as it does when playing video, so we can't tell them apart.
+ * Chrome 101.0.4951.64 (Official Google Build), Debian 11.3:
*
+ * Same.
*
*****************************************************************************
*
- * MPV (version 0.29.1)
+ * MPV 0.32.0-3, Raspbian 11.1:
*
* While playing, it runs "xdg-screensaver reset" every 10 seconds as a
* heartbeat. That program is a super-complicated shell script that will
@@ -171,7 +188,7 @@
* xscreensaver daemon directly rather than going through systemd.
* That's fine.
*
- * On Debian 10.4 and 10.6, MPV does not have a dependency on the
+ * On Debian 10.4 through 11.1, MPV does not have a dependency on the
* "xdg-utils" package, so "xdg-screensaver" might not be installed.
* Oddly, Chromium *does* have a dependency on "xdg-utils", even though
* Chromium doesn't run "xdg-screensaver".
@@ -185,64 +202,96 @@
* extension because it is worse than useless. See the commentary at
* the top of xscreensaver.c for details.
*
- * Annoying MPV Bug:
*
- * Like Firefox and Chromium, MPV inhibits screen blanking when only
- * audio is playing.
+ *****************************************************************************
+ *
+ * MPV 0.33+, I think:
+ *
+ * The developer had a hissy fit and removed "xdg-screensaver" support:
+ *
+ * https://github.com/mpv-player/mpv/commit/c498b2846af0ee8835b9144c9f6893568a4e49c6
+ *
+ * So now I guess you're back to figuring out how to add a "heartbeat"
+ * command to have MPV periodically call "xscreensaver-command -reset".
+ * Good luck with that. Maybe you should just use VLC instead.
*
*
*****************************************************************************
*
- * MPlayer (version mplayer-gui 2:1.3.0)
+ * VLC 3.0.16-1, Raspbian 11.1 & Debian 11.3:
+ *
+ * Sends "Inhibit" to the first of these targets that exists at launch:
+ * "org.freedesktop.ScreenSaver /ScreenSaver" or
+ * "org.mate.SessionManager /org/mate/SessionManager" or
+ * "org.gnome.SessionManager /org/gnome/SessionManager".
+ *
+ * For video, it sends the reason "Playing some media." It does not send
+ * "Inhibit" when playing audio only. Also it is the only program to
+ * properly send "Uninhibit" when killed.
*
- * I can't get this thing to play video at all. It only plays the audio
- * of MP4 files, so I can't guess what it might or might not do with video.
- * It appears to make no attempt to inhibit the screen saver.
+ * It also contains code to run "xdg-screensaver reset" as a heartbeat,
+ * but I have never seen that happen.
+ * In the source, "vlc/modules/misc/inhibit/dbus.c" and "xdg.c".
*
*
*****************************************************************************
*
- * VLC (version 3.0.11-0+deb10u1+rpt3)
+ * MPlayer 2:1.4, Raspbian 11.1:
*
- * VLC sends "inhibit" to "org.freedesktop.ScreenSaver" when playing
- * video. It does not send "inhibit" when playing audio only, and it
- * sends "uninhibit" under all the right circumstances.
+ * Apparently makes no attempt to inhibit the screen saver.
*
- * NOTE: that's what I saw when I tested it on Raspbian 10.6. However,
- * the version that came with Raspbian 10.4 -- which also called itself
- * "VLC 3.0.11" -- did not send "uninhibit" when using the window
- * manager's "close" button! Or when killed with "kill".
+ * Update, Sep 2023: rumor has it that this works with some versions.
+ * I have not verified this:
*
- * NOTE ALSO: The VLC source code suggests that under some circumstances
- * it might be talking to these instead: "org.freedesktop.ScreenSaver",
- * "org.freedesktop.PowerManagement.Inhibit", "org.mate.SessionManager",
- * and/or "org.gnome.SessionManager". It also contains code to run
- * "xdg-screensaver reset" as a heartbeat. I can't tell how it decides
- * which system to use. I have never seen it run "xdg-screensaver".
+ * ~/.mplayer/config:
+ * heartbeat-cmd="xscreensaver-command -deactivate >&- 2>&- &"
*
*
*****************************************************************************
*
- * Zoom
+ * Zoom 5.10.4.2845, Debian 11.3:
+ *
+ * Sends "Inhibit" to "org.freedesktop.ScreenSaver" with "in a meeting".
+ * I think it does this for both video and audio-only meetings, but that
+ * seems reasonable.
*
- * I'm told that the proprietary Zoom executable for Linux sends "inhibit"
- * to "org.freedesktop.ScreenSaver", but I don't have any further details.
*
*****************************************************************************
*
- * TO DO:
+ * Steam 1:1.0.0.74, Debian 11.3:
+ *
+ * Inhibits, then uninhibits and immediately reinhibits every 30 seconds
+ * forever. Sometimes it identifies as "Steam", sometimes as "My SDL
+ * application", AKA "Baby's First Hello World". Perfect, no notes.
*
- * - What precisely does the standalone Zoom executable do on Linux?
- * There doesn't seem to be a Raspbian build, so I can't test it.
*
- * - xscreensaver_method_uninhibit() does not actually send a reply, are
- * we doing the right thing when registering it?
+ *****************************************************************************
+ *
+ * XFCE Power Manager Presentation Mode:
+ *
+ * This setting prevents the screen from blanking, and has a long history
+ * of becoming turned on accidentally. Tries org.freedesktop.ScreenSaver
+ * and others before falling back to "xscreensaver-command -deactivate"
+ * as a heartbeat.
+ *
+ *
+ *****************************************************************************
+ *
+ * Kodi / XMBC:
*
- * - Currently this code is only listening to "org.freedesktop.ScreenSaver".
- * Perhaps it should listen to "org.mate.SessionManager" and
- * "org.gnome.SessionManager"? Where are those documented?
+ * Apparently makes no attempt to inhibit the screen saver.
+ * There are some third party extensions that fix that, e.g.
+ * "kodi-prevent-xscreensaver".
+ *
+ *
+ *****************************************************************************
+ *
+ *
+ * TO DO:
*
- * - Do we need to call sd_bus_release_name() explicitly on exit?
+ * - What is "org.mate.SessionManager"? If it is just a re-branded
+ * "org.gnome.SessionManager" with the same behavior, we should probably
+ * listen to "InhibitorAdded" on that as well.
*
* - Run under valgrind to check for any memory leaks.
*
@@ -250,29 +299,38 @@
* *three* different ways for dbus clients to ask the question, "is the
* screen currently blanked?" We should probably also respond to these:
*
- * qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
- * qdbus org.kde.screensaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
- * qdbus org.gnome.ScreenSaver /ScreenSaver org.gnome.ScreenSaver.GetActive
+ * qdbus org.freedesktop.ScreenSaver /ScreenSaver
+ * org.freedesktop.ScreenSaver.GetActive
+ * qdbus org.kde.screensaver /ScreenSaver
+ * org.freedesktop.ScreenSaver.GetActive
+ * qdbus org.gnome.ScreenSaver /ScreenSaver
+ * org.gnome.ScreenSaver.GetActive
*
*
+ *****************************************************************************
*
* TESTING:
*
+ * To snoop the bus, "dbus-monitor" or "dbus-monitor --system".
+ *
* To call the D-BUS methods manually, you can use "busctl":
*
- * busctl --user call org.freedesktop.ScreenSaver \
- * /ScreenSaver org.freedesktop.ScreenSaver \
- * Inhibit ss test-application test-reason
+ * busctl --user call org.freedesktop.ScreenSaver \
+ * /ScreenSaver org.freedesktop.ScreenSaver \
+ * Inhibit ss test-application test-reason
*
* This will hand out a cookie, which you can pass back to UnInhibit:
*
- * u 1792821391
+ * u 1792821391
*
- * busctl --user call org.freedesktop.ScreenSaver \
- * /ScreenSaver org.freedesktop.ScreenSaver \
- * UnInhibit u 1792821391
+ * busctl --user call org.freedesktop.ScreenSaver \
+ * /ScreenSaver org.freedesktop.ScreenSaver \
+ * UnInhibit u 1792821391
*
* https://github.com/mato/xscreensaver-systemd
+ *
+ *
+ *****************************************************************************
*/
#ifdef HAVE_CONFIG_H
@@ -294,7 +352,13 @@
#include <signal.h>
#include <X11/Xlib.h>
-#include <systemd/sd-bus.h>
+#if defined (HAVE_LIBSYSTEMD)
+# include <systemd/sd-bus.h>
+#elif defined (HAVE_LIBELOGIND)
+# include <elogind/sd-bus.h>
+#else
+# error Neither HAVE_LIBSYSTEMD nor HAVE_LIBELOGIND is defined.
+#endif
#include "version.h"
#include "blurb.h"
@@ -303,6 +367,8 @@
static char *screensaver_version;
+/* This is for power management, on the system bus.
+ */
#define DBUS_CLIENT_NAME "org.jwz.XScreenSaver"
#define DBUS_SD_SERVICE_NAME "org.freedesktop.login1"
#define DBUS_SD_OBJECT_PATH "/org/freedesktop/login1"
@@ -313,15 +379,54 @@ static char *screensaver_version;
#define DBUS_SD_METHOD_WHO "xscreensaver"
#define DBUS_SD_METHOD_WHY "lock screen on suspend"
#define DBUS_SD_METHOD_MODE "delay"
-
-#define DBUS_SD_MATCH "type='signal'," \
- "interface='" DBUS_SD_INTERFACE "'," \
- "member='PrepareForSleep'"
-
+#define DBUS_SD_MATCH "type='signal'," \
+ "interface='" DBUS_SD_INTERFACE "'," \
+ "member='PrepareForSleep'"
+
+/* This is for handling requests to lock or unlock, on the system bus.
+ This is sent by "loginctl lock-session", which in turn is run if someone
+ has added "HandleLidSwitch=lock" to /etc/systemd/logind.conf in order to
+ make closing the lid lock the screen *without* suspending. Note that it
+ is sent on login1 *Session*, not *Manager*.
+ */
+#define DBUS_SD_LOCK_INTERFACE "org.freedesktop.login1.Session"
+#define DBUS_SD_LOCK_MATCH "type='signal'," \
+ "interface='" DBUS_SD_LOCK_INTERFACE "'," \
+ "member='Lock'"
+#define DBUS_SD_UNLOCK_MATCH "type='signal'," \
+ "interface='" DBUS_SD_LOCK_INTERFACE "'," \
+ "member='Unlock'"
+
+/* This is for blanking inhibition, on the user bus.
+ See the large comment above for the absolute mess that apps make of this.
+ */
#define DBUS_FDO_NAME "org.freedesktop.ScreenSaver"
-#define DBUS_FDO_OBJECT_PATH "/ScreenSaver" /* Firefox */
+#define DBUS_FDO_INTERFACE DBUS_FDO_NAME
+#define DBUS_FDO_OBJECT_PATH_1 "/ScreenSaver" /* Firefox, VLC */
#define DBUS_FDO_OBJECT_PATH_2 "/org/freedesktop/ScreenSaver" /* Chrome */
-#define DBUS_FDO_INTERFACE "org.freedesktop.ScreenSaver"
+
+#define DBUS_GSN_INTERFACE "org.gnome.SessionManager"
+#define DBUS_GSN_PATH "/org/gnome/SessionManager"
+#define DBUS_GSN_MATCH_1 "type='signal'," \
+ "interface='" DBUS_GSN_INTERFACE "'," \
+ "member='InhibitorAdded'"
+#define DBUS_GSN_MATCH_2 "type='signal'," \
+ "interface='" DBUS_GSN_INTERFACE "'," \
+ "member='InhibitorRemoved'"
+
+#define DBUS_KDE_INTERFACE "org.kde.Solid.PowerManagement.PolicyAgent"
+#define DBUS_KDE_PATH "/org/kde/Solid/PowerManagement/PolicyAgent"
+#define DBUS_KDE_MATCH "type='signal'," \
+ "interface='" DBUS_KDE_INTERFACE "'," \
+ "member='InhibitionsChanged'"
+#define INTERNAL_KDE_COOKIE "_KDE_"
+
+/* This is for metadata about D-Bus itself.
+ */
+#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
+#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
+#define DBUS_INTERFACE_DBUS DBUS_SERVICE_DBUS
+
#define HEARTBEAT_INTERVAL 50 /* seconds */
@@ -333,7 +438,7 @@ struct handler_ctx {
sd_bus *system_bus;
sd_bus_message *lock_message;
int lock_fd;
- int is_inhibited;
+ int inhibit_count;
sd_bus_track *track;
};
@@ -343,10 +448,13 @@ SLIST_HEAD(inhibit_head, inhibit_entry) inhibit_head =
SLIST_HEAD_INITIALIZER(inhibit_head);
struct inhibit_entry {
- uint32_t cookie;
+ char *cookie;
time_t start_time;
char *appname;
char *peer;
+ char *reason;
+ Bool ignored_p;
+ Bool seen_p;
SLIST_ENTRY(inhibit_entry) entries;
};
@@ -357,7 +465,7 @@ xscreensaver_command (const char *cmd)
char buf[1024];
int rc;
sprintf (buf, "xscreensaver-command %.100s -%.100s",
- (verbose_p ? "-verbose" : "-quiet"),
+ (verbose_p ? "--verbose" : "--quiet"),
cmd);
if (verbose_p)
fprintf (stderr, "%s: exec: %s\n", blurb(), buf);
@@ -370,6 +478,47 @@ xscreensaver_command (const char *cmd)
}
+/* Make a method call and read a single string reply.
+ Like "dbus-send --print-reply --dest=$dest $path $interface.$msg"
+ */
+static const char *
+dbus_send (sd_bus *bus, const char *dest, const char *path,
+ const char *interface, const char *msg)
+{
+ int rc;
+ sd_bus_message *m = 0;
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = 0;
+ const char *ret = 0;
+
+ rc = sd_bus_message_new_method_call (bus, &m, dest, path, interface, msg);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: failed to create message: %s%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ sd_bus_message_set_auto_start (m, 1);
+ sd_bus_message_set_expect_reply (m, 1);
+
+ rc = sd_bus_call (bus, m, -1, &error, &reply);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: call failed: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ rc = sd_bus_message_read (reply, "s", &ret);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: failed to read reply: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ return ret;
+}
+
+
static int
xscreensaver_register_sleep_lock (struct handler_ctx *ctx)
{
@@ -407,12 +556,12 @@ xscreensaver_register_sleep_lock (struct handler_ctx *ctx)
}
-/* Called when DBUS_SD_INTERFACE sends a "PrepareForSleep" signal.
- The event is sent twice: before sleep, and after.
+/* Called when "org.freedesktop.login1.Manager" sends a "PrepareForSleep"
+ signal. The event is sent twice: before sleep, and after.
*/
static int
-xscreensaver_systemd_handler (sd_bus_message *m, void *arg,
- sd_bus_error *ret_error)
+xscreensaver_prepare_for_sleep_cb (sd_bus_message *m, void *arg,
+ sd_bus_error *ret_error)
{
struct handler_ctx *ctx = arg;
int before_sleep;
@@ -460,19 +609,194 @@ xscreensaver_systemd_handler (sd_bus_message *m, void *arg,
}
-/* Called from the vtable when another process sends a request to systemd
- to inhibit the screen saver. We return to them a cookie which they must
+/* Called when "org.freedesktop.login1.Session" sends a "Lock" signal.
+ The event is sent several times in quick succession.
+ https://www.freedesktop.org/software/systemd/man/org.freedesktop.login1.html
+ */
+static int
+xscreensaver_lock_cb (sd_bus_message *m, void *arg, sd_bus_error *ret_error)
+{
+ /* Tell xscreensaver that we are suspending, and to lock if desired.
+ Maybe sending "lock" here would be more appropriate, but that might
+ do a screen-fade first. */
+ xscreensaver_command ("suspend");
+ return 1; /* >= 0 means success */
+}
+
+/* Called when "org.freedesktop.login1.Session" sends an "Unlock" signal.
+ I'm not sure if anything ever sends this.
+ */
+static int
+xscreensaver_unlock_cb (sd_bus_message *m, void *arg, sd_bus_error *ret_error)
+{
+ /* Tell xscreensaver to present the unlock dialog right now. */
+ xscreensaver_command ("deactivate");
+ return 1; /* >= 0 means success */
+}
+
+
+/* Is this "reason" string one that means we should inhibit blanking?
+ If the string is e.g. "audio-playing", (Firefox) the answer is no.
+ If the string is "Download in progress", (Chromium) the answer is no.
+ Likewise, GEdit sends "There are unsaved documents", which is apparently
+ an attempt for it to inhibit *logout*, which is reasonable, rather than
+ an attempt to inhibit *blanking*, which is not. I don't know how to tell
+ them apart.
+ */
+static Bool
+good_reason_p (const char *s)
+{
+ if (!s || !*s) return True;
+ if (strcasestr (s, "video")) return True;
+ if (strcasestr (s, "audio")) return False;
+ if (strcasestr (s, "download")) return False;
+ if (strcasestr (s, "unsaved")) return False;
+ return True;
+}
+
+
+static const char *
+remove_dir (const char *s)
+{
+ if (s) {
+ const char *s2 = strrchr (s, '/');
+ if (s2 && s2[1]) return s2+1;
+ }
+ return s;
+}
+
+
+static struct inhibit_entry *
+add_new_entry (struct handler_ctx *ctx,
+ const char *cookie,
+ const char *application_name,
+ const char *sender,
+ const char *via,
+ const char *inhibit_reason)
+{
+ struct inhibit_entry *entry = calloc (1, sizeof (*entry));
+ entry->cookie = strdup(cookie);
+ entry->appname = strdup(application_name);
+ entry->peer = sender ? strdup(sender) : NULL;
+ entry->reason = strdup(inhibit_reason ? inhibit_reason : "");
+ entry->start_time = time ((time_t *)0);
+ entry->ignored_p = ! good_reason_p (inhibit_reason);
+ SLIST_INSERT_HEAD (&inhibit_head, entry, entries);
+
+ if (! entry->ignored_p)
+ ctx->inhibit_count++;
+
+ if (verbose_p) {
+ char *c2 = (char *)
+ malloc ((entry->cookie ? strlen(entry->cookie) : 0) + 20);
+ if (cookie && !!strcmp (cookie, INTERNAL_KDE_COOKIE))
+ sprintf (c2, " cookie \"%s\"", remove_dir (entry->cookie));
+ else
+ *c2 = 0;
+ fprintf (stderr,
+ "%s: inhibited by \"%s\" (%s%s%s) with \"%s\"%s%s\n",
+ blurb(), remove_dir (application_name),
+ (via ? "via " : ""),
+ (via ? via : ""),
+ (sender ? sender : ""),
+ inhibit_reason,
+ c2,
+ (entry->ignored_p ? " (ignored)" : ""));
+ }
+
+ return entry;
+}
+
+
+static void
+free_entry (struct handler_ctx *ctx, struct inhibit_entry *entry)
+{
+ if (entry->peer) {
+ int rc = sd_bus_track_remove_name (ctx->track, entry->peer);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to stop tracking peer \"%s\": %s\n",
+ blurb(), entry->peer, strerror(-rc));
+ }
+ free (entry->peer);
+ }
+
+ if (entry->appname) free (entry->appname);
+ if (entry->cookie) free (entry->cookie);
+ if (entry->reason) free (entry->reason);
+
+ if (! entry->ignored_p)
+ ctx->inhibit_count--;
+ if (ctx->inhibit_count < 0)
+ ctx->inhibit_count = 0;
+
+ free (entry);
+}
+
+
+/* Remove any entries with the given cookie.
+ If cookie is NULL, instead remove any entries whose peer is dead.
+ */
+static Bool
+remove_matching_entry (struct handler_ctx *ctx,
+ const char *matching_cookie,
+ const char *sender,
+ const char *via)
+{
+ struct inhibit_entry *entry, *entry_next;
+ Bool found = False;
+
+ SLIST_FOREACH_SAFE (entry, &inhibit_head, entries, entry_next) {
+ if (matching_cookie
+ ? !strcmp (entry->cookie, matching_cookie)
+ : !sd_bus_track_count_name (ctx->track, entry->peer)) {
+ if (verbose_p) {
+ if (matching_cookie)
+ fprintf (stderr,
+ "%s: uninhibited by \"%s\" (%s%s%s) with \"%s\""
+ " cookie \"%s\"%s\n",
+ blurb(), remove_dir (entry->appname),
+ (via ? "via " : ""),
+ (via ? via : ""),
+ (sender ? sender : ""),
+ entry->reason,
+ remove_dir (entry->cookie),
+ (entry->ignored_p ? " (ignored)" : ""));
+ else
+ fprintf (stderr, "%s: peer %s for inhibiting app \"%s\" has died:"
+ " uninhibiting %s%s\n",
+ blurb(), entry->peer, entry->appname,
+ remove_dir (entry->cookie),
+ (entry->ignored_p ? " (ignored)" : ""));
+ }
+ SLIST_REMOVE (&inhibit_head, entry, inhibit_entry, entries);
+ free_entry (ctx, entry);
+ found = True;
+ break;
+ }
+ }
+
+ if (!found && matching_cookie && verbose_p)
+ fprintf (stderr, "%s: uninhibit: no match for cookie \"%s\"\n",
+ blurb(), remove_dir (matching_cookie));
+
+ return found;
+}
+
+
+/* Called from the vtable when another process sends a request to
+ "org.freedesktop.ScreenSaver" (on which we are authoritative) to
+ inhibit the screen saver. We return to them a cookie which they must
present with their "uninhibit" request.
*/
static int
-xscreensaver_method_inhibit (sd_bus_message *m, void *arg,
- sd_bus_error *ret_error)
+xscreensaver_inhibit_cb (sd_bus_message *m, void *arg,
+ sd_bus_error *ret_error)
{
struct handler_ctx *ctx = arg;
const char *application_name = 0, *inhibit_reason = 0;
- struct inhibit_entry *entry = 0;
- const char *s;
const char *sender;
+ uint32_t cookie;
+ char cookie_str[20];
int rc = sd_bus_message_read(m, "ss", &application_name, &inhibit_reason);
if (rc < 0) {
@@ -494,22 +818,8 @@ xscreensaver_method_inhibit (sd_bus_message *m, void *arg,
sender = sd_bus_message_get_sender (m);
- /* Omit directory (Chrome does this shit) */
- s = strrchr (application_name, '/');
- if (s && s[1]) application_name = s+1;
-
- if (strcasestr (inhibit_reason, "audio") &&
- !strcasestr (inhibit_reason, "video")) {
- /* Firefox 78 sends an inhibit when playing audio only, with reason
- "audio-playing". This is horrible. Ignore it. (But perhaps it
- would be better to accept it, issue them a cookie, and then just
- ignore that entry?) */
- if (verbose_p)
- fprintf (stderr, "%s: inhibited by \"%s\" (%s) with \"%s\", ignored\n",
- blurb(), application_name, sender, inhibit_reason);
- return -1;
- }
-
+ application_name = remove_dir (application_name);
+
/* Tell the global tracker object to monitor when this peer exits. */
rc = sd_bus_track_add_name(ctx->track, sender);
if (rc < 0) {
@@ -518,34 +828,26 @@ xscreensaver_method_inhibit (sd_bus_message *m, void *arg,
sender = NULL;
}
- entry = malloc(sizeof (struct inhibit_entry));
- entry->cookie = ya_random();
- entry->appname = strdup(application_name);
- entry->peer = sender ? strdup(sender) : NULL;
- entry->start_time = time ((time_t *)0);
- SLIST_INSERT_HEAD(&inhibit_head, entry, entries);
- ctx->is_inhibited++;
- if (verbose_p)
- fprintf (stderr, "%s: inhibited by \"%s\" (%s) with \"%s\""
- " -> cookie %08X\n",
- blurb(), application_name, sender, inhibit_reason, entry->cookie);
+ cookie = ya_random();
+ sprintf (cookie_str, "%08X", cookie);
- return sd_bus_reply_method_return (m, "u", entry->cookie);
+ add_new_entry (ctx, cookie_str, application_name, sender, 0, inhibit_reason);
+ return sd_bus_reply_method_return (m, "u", cookie);
}
-/* Called from the vtable when another process sends a request to systemd
- to uninhibit the screen saver. The cookie must match an earlier "inhibit"
+/* Called from the vtable when another process sends a request to
+ "org.freedesktop.ScreenSaver" (on which we are authoritative) to
+ uninhibit the screen saver. The cookie must match an earlier "inhibit"
request.
*/
static int
-xscreensaver_method_uninhibit (sd_bus_message *m, void *arg,
- sd_bus_error *ret_error)
+xscreensaver_uninhibit_cb (sd_bus_message *m, void *arg,
+ sd_bus_error *ret_error)
{
struct handler_ctx *ctx = arg;
uint32_t cookie;
- struct inhibit_entry *entry;
- int found = 0;
+ char cookie_str[20];
const char *sender;
int rc = sd_bus_message_read (m, "u", &cookie);
@@ -555,50 +857,228 @@ xscreensaver_method_uninhibit (sd_bus_message *m, void *arg,
return rc;
}
+ sprintf (cookie_str, "%08X", cookie);
sender = sd_bus_message_get_sender (m);
+ remove_matching_entry (ctx, cookie_str, sender, 0);
- SLIST_FOREACH(entry, &inhibit_head, entries) {
- if (entry->cookie == cookie) {
- if (verbose_p)
- fprintf (stderr, "%s: uninhibited by \"%s\" (%s) with cookie %08X\n",
- blurb(), entry->appname, sender, cookie);
- SLIST_REMOVE (&inhibit_head, entry, inhibit_entry, entries);
- if (entry->appname) free (entry->appname);
- if (entry->peer) {
- rc = sd_bus_track_remove_name(ctx->track, entry->peer);
- if (rc < 0) {
- fprintf (stderr, "%s: failed to stop tracking peer \"%s\": %s\n",
- blurb(), entry->peer, strerror(-rc));
- }
- free(entry->peer);
+ return sd_bus_reply_method_return (m, "");
+}
+
+
+/* Called when "org.gnome.SessionManager" (gnome-shell) sends out a broadcast
+ announcement that some other process has received an inhibitor lock.
+ Anyone can receive this signal: it is non-exclusive.
+ */
+static int
+xscreensaver_gnome_inhibitor_added_cb (sd_bus_message *m, void *arg,
+ sd_bus_error *err)
+{
+ struct handler_ctx *ctx = arg;
+ sd_bus *bus = sd_bus_message_get_bus (m);
+ const char *path = 0;
+ const char *iface = 0;
+ const char *sender = 0;
+ const char *appid = 0;
+ const char *reason = 0;
+ char *via;
+ int rc;
+
+ rc = sd_bus_message_read (m, "o", &path);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to parse method call: %s\n",
+ blurb(), strerror(-rc));
+ return rc;
+ }
+
+ sender = sd_bus_message_get_sender (m);
+ iface = sd_bus_message_get_interface (m);
+
+ appid = dbus_send (bus, DBUS_GSN_INTERFACE, path,
+ DBUS_GSN_INTERFACE ".Inhibitor", "GetAppId");
+ if (!appid) return 0;
+
+ appid = remove_dir (appid);
+ reason = dbus_send (bus, DBUS_GSN_INTERFACE, path,
+ DBUS_GSN_INTERFACE ".Inhibitor", "GetReason");
+ if (!reason) return 0;
+
+ /* We can't get the original peer sender of this message: this is
+ a rebroadcast from gnome-shell. */
+
+ via = (char *) malloc (strlen(iface) + strlen(sender) + 10);
+ sprintf (via, "%s%s", iface, sender);
+ add_new_entry (ctx, path, appid, 0, via, reason);
+ free (via);
+
+ return 0;
+}
+
+
+/* Called when "org.gnome.SessionManager" (gnome-shell) sends out a broadcast
+ announcement that some other process has relinquished an inhibitor lock.
+ Anyone can receive this signal: it is non-exclusive.
+ */
+static int
+xscreensaver_gnome_inhibitor_removed_cb (sd_bus_message *m, void *arg,
+ sd_bus_error *err)
+{
+ struct handler_ctx *ctx = arg;
+ const char *path = 0;
+ const char *sender = 0;
+ const char *iface = 0;
+ int rc;
+
+ rc = sd_bus_message_read (m, "o", &path);
+ if (rc < 0) {
+ fprintf (stderr, "%s: failed to parse method call: %s\n",
+ blurb(), strerror(-rc));
+ return rc;
+ }
+
+ iface = sd_bus_message_get_interface (m);
+ sender = sd_bus_message_get_sender (m);
+ remove_matching_entry (ctx, path, sender, iface);
+ return 0;
+}
+
+
+/* Called when "org.kde.Solid.PowerManagement.PolicyAgent" (powerdevil)
+ sends out a broadcast announcement that some other process has received
+ or relinquished an inhibitor lock. Anyone can receive this signal: it
+ is non-exclusive.
+ */
+static int
+xscreensaver_kde_inhibitor_changed_cb (sd_bus_message *m, void *arg,
+ sd_bus_error *err)
+{
+ /* When an inhibitor is being added, this message contains the appname
+ and reason as an array of two strings. When one is being removed, the
+ message contains an empty array, followed by an array of one element,
+ the appname. So one can tell "inhibit" and "uninhibit" apart, but
+ can't tell *which* inhibition was being removed, since the uninhibit
+ message doesn't contain the reason or a cookie. So that's pretty
+ worthless.
+
+ Instead of parsing the contents of this message, any time we get
+ "InhibitionsChanged", we send a "ListInhibitions" message and parse
+ the result of that instead: the current list of inhibitions.
+ */
+ struct handler_ctx *ctx = arg;
+ sd_bus *bus = sd_bus_message_get_bus (m);
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = 0;
+ const char *dest = DBUS_KDE_INTERFACE;
+ const char *path = DBUS_KDE_PATH;
+ const char *interface = dest;
+ const char *msg = "ListInhibitions";
+ struct inhibit_entry *entry, *entry_next;
+ int rc;
+
+ rc = sd_bus_message_new_method_call (bus, &m, dest, path, interface, msg);
+ if (rc < 0) {
+ fprintf (stderr, "%s: KDE: failed to create message: %s%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return rc;
+ }
+
+ sd_bus_message_set_auto_start (m, 1);
+ sd_bus_message_set_expect_reply (m, 1);
+
+ rc = sd_bus_call (bus, m, -1, &error, &reply);
+ if (rc < 0) {
+ fprintf (stderr, "%s: KDE: call failed: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return rc;
+ }
+
+ m = reply;
+
+ /* It's an array of an arbitrary number of structs of 2 strings each. */
+ rc = sd_bus_message_enter_container (m, 'a', "(ss)");
+ if (rc < 0) {
+ fprintf (stderr, "%s: KDE: enter container failed: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return rc;
+ }
+
+ /* Since they don't give us the original inhibiting cookie, we have to
+ assume that the appname/reason pair is unique: that means that if
+ someone sends two identical inhibits, that counts as one. No nesting.
+ */
+ interface = "KDE"; /* That string is so long */
+
+ /* Clear the "seen" flags for our internal tracking. */
+ SLIST_FOREACH_SAFE (entry, &inhibit_head, entries, entry_next) {
+ if (!strcmp (entry->cookie, INTERNAL_KDE_COOKIE))
+ entry->seen_p = False;
+ }
+
+ /* Iterate over each entry in this message reply.
+ */
+ while (1) {
+ const char *appname = 0, *reason = 0;
+ Bool seen_p = False;
+
+ rc = sd_bus_message_read (m, "(ss)", &appname, &reason);
+ if (rc < 0) {
+ fprintf (stderr, "%s: KDE: message read failed: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return rc;
+ }
+
+ if (rc == 0) break;
+
+ /* Tag any existing entries that match an entry in the new list.
+ */
+ SLIST_FOREACH_SAFE (entry, &inhibit_head, entries, entry_next) {
+ if (!strcmp (entry->cookie, INTERNAL_KDE_COOKIE) &&
+ !strcmp (entry->appname, appname) &&
+ !strcmp (entry->reason, reason)) {
+ entry->seen_p = True;
+ seen_p = True;
}
- free(entry);
- ctx->is_inhibited--;
- if (ctx->is_inhibited < 0)
- ctx->is_inhibited = 0;
- found = 1;
- break;
+ }
+
+ /* Add a new entry if this one is not already in the list.
+ */
+ if (! seen_p) {
+ entry = add_new_entry (ctx, INTERNAL_KDE_COOKIE, appname, 0,
+ interface, reason);
+ entry->seen_p = True;
}
}
- if (! found)
- fprintf (stderr, "%s: uninhibit: no match for cookie %08X\n",
- blurb(), cookie);
+ /* Remove any existing entries that were not mentioned.
+ */
+ SLIST_FOREACH_SAFE (entry, &inhibit_head, entries, entry_next) {
+ if (!strcmp (entry->cookie, INTERNAL_KDE_COOKIE) &&
+ !entry->seen_p) {
+ if (verbose_p)
+ fprintf (stderr,
+ "%s: uninhibited by \"%s\" (via %s) with \"%s\"%s\n",
+ blurb(), remove_dir (entry->appname),
+ interface,
+ entry->reason,
+ (entry->ignored_p ? " (ignored)" : ""));
+ SLIST_REMOVE (&inhibit_head, entry, inhibit_entry, entries);
+ free_entry (ctx, entry);
+ }
+ }
- return sd_bus_reply_method_return (m, "");
+ return 0;
}
-/*
- * This vtable defines the service interface we implement.
+
+/* This vtable defines the services we implement on the
+ "org.freedesktop.ScreenSaver" endpoint.
*/
-static const sd_bus_vtable
-xscreensaver_dbus_vtable[] = {
- SD_BUS_VTABLE_START(0),
- SD_BUS_METHOD("Inhibit", "ss", "u", xscreensaver_method_inhibit,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD("UnInhibit", "u", "", xscreensaver_method_uninhibit,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_VTABLE_END
+static const sd_bus_vtable xscreensaver_dbus_vtable[] = {
+ SD_BUS_VTABLE_START(0),
+ SD_BUS_METHOD ("Inhibit", "ss", "u", xscreensaver_inhibit_cb,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD ("UnInhibit", "u", "", xscreensaver_uninhibit_cb,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_VTABLE_END
};
@@ -668,6 +1148,55 @@ process_name (pid_t pid)
}
+/* Whether the given service name is currently registered on the bus.
+ */
+static Bool
+service_exists_p (sd_bus *bus, const char *name)
+{
+ int rc;
+ sd_bus_message *m = 0;
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ sd_bus_message *reply = 0;
+ int ret = 0;
+ const char *dest = DBUS_SERVICE_DBUS;
+ const char *path = DBUS_PATH_DBUS;
+ const char *interface = DBUS_INTERFACE_DBUS;
+ const char *msg = "NameHasOwner";
+
+ rc = sd_bus_message_new_method_call (bus, &m, dest, path, interface, msg);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: failed to create message: %s%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ rc = sd_bus_message_append (m, "s", name);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: failed append arg: %s%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ sd_bus_message_set_auto_start (m, 1);
+
+ rc = sd_bus_call (bus, m, -1, &error, &reply);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: call failed: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ rc = sd_bus_message_read (reply, "b", &ret);
+ if (rc < 0) {
+ fprintf (stderr, "%s: dbus_send: failed to read reply: %s.%s: %s\n",
+ blurb(), interface, msg, strerror(-rc));
+ return 0;
+ }
+
+ return ret;
+}
+
+
static int
xscreensaver_systemd_loop (void)
{
@@ -678,10 +1207,23 @@ xscreensaver_systemd_loop (void)
time_t last_deactivate_time = 0;
Display *dpy = open_dpy();
- /* 'user_bus' is where we receive messages from other programs sending
- inhibit/uninhibit to org.freedesktop.ScreenSaver, etc.
+ /* 'system_bus' is where we hold a lock on "org.freedesktop.login1", meaning
+ that we will receive a "PrepareForSleep" message when the system is about
+ to suspend.
+
+ 'user_bus' is where we receive messages from other programs sending
+ "Inhibit" and "Uninhibit" requests to "org.freedesktop.ScreenSaver", and
+ notifications of same from "org.gnome.SessionManager" and
+ "org.kde.Solid.PowerManagement.PolicyAgent".
*/
+ rc = sd_bus_open_system (&system_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: system bus connection failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
rc = sd_bus_open_user (&user_bus);
if (rc < 0) {
fprintf (stderr, "%s: user bus connection failed: %s\n",
@@ -703,106 +1245,239 @@ xscreensaver_systemd_loop (void)
goto FAIL;
}
- rc = sd_bus_add_object_vtable (user_bus,
- NULL,
- DBUS_FDO_OBJECT_PATH,
- DBUS_FDO_INTERFACE,
- xscreensaver_dbus_vtable,
- &global_ctx);
- if (rc < 0) {
- fprintf (stderr, "%s: vtable registration failed: %s\n",
- blurb(), strerror(-rc));
- goto FAIL;
- }
-
- rc = sd_bus_add_object_vtable (user_bus,
- NULL,
- DBUS_FDO_OBJECT_PATH_2,
- DBUS_FDO_INTERFACE,
- xscreensaver_dbus_vtable,
- &global_ctx);
- if (rc < 0) {
- fprintf (stderr, "%s: vtable registration failed: %s\n",
- blurb(), strerror(-rc));
- goto FAIL;
+ /* Exit if "org.jwz.XScreenSaver" is already registered on the user bus.
+ We don't receive any events on that endpoint, but this is a good mutex
+ to prevent more than one copy of "xscreensaver-systemd" from running.
+ */
+ {
+ const char *name = DBUS_CLIENT_NAME;
+ rc = sd_bus_request_name (user_bus, name, 0);
+ if (rc < 0) {
+ pid_t pid = get_bus_name_pid (user_bus, name);
+ if (pid != -1) {
+ char *pname = process_name (pid);
+ if (pname) {
+ fprintf (stderr, "%s: \"%s\" in use by pid %lu (%s)\n",
+ blurb(), name, (unsigned long) pid, remove_dir (pname));
+ free (pname);
+ } else {
+ fprintf (stderr, "%s: \"%s\" in use by pid %lu\n",
+ blurb(), name, (unsigned long) pid);
+ }
+ } else if (-rc == EEXIST || -rc == EALREADY) {
+ fprintf (stderr, "%s: \"%s\" already in use\n", blurb(), name);
+ } else {
+ fprintf (stderr, "%s: unknown error: \"%s\": %s\n",
+ blurb(), name, strerror(-rc));
+ }
+ goto FAIL;
+ } else if (verbose_p) {
+ fprintf (stderr, "%s: registered as \"%s\"\n", blurb(), name);
+ }
}
+
+ /* Register ourselves as "org.freedesktop.ScreenSaver" if possible.
+ If "org.gnome.SessionManager" or "org.kde.Solid.PowerManagement.
+ PolicyAgent" are registered, this is optional; otherwise it is
+ mandatory.
+ */
{
- const char * const names[] = { DBUS_FDO_NAME, DBUS_CLIENT_NAME };
- int i = 0;
- for (i = 0; i < countof(names); i++) {
- rc = sd_bus_request_name (user_bus, names[i], 0);
- if (rc < 0) {
- pid_t pid = get_bus_name_pid (user_bus, names[i]);
- if (pid != -1) {
- char *pname = process_name (pid);
- if (pname) {
- fprintf (stderr,
- "%s: connection failed: \"%s\" in use by pid %lu (%s)\n",
- blurb(), names[i], (unsigned long) pid, pname);
+ const char *gname = DBUS_GSN_INTERFACE;
+ const char *kname = DBUS_KDE_INTERFACE;
+ const char *name = DBUS_FDO_NAME;
+ Bool fd_p = False;
+ Bool gnome_p = False;
+ Bool kde_p = False;
+ time_t start = time ((time_t *) 0);
+ time_t now = start;
+ int timeout = 30;
+ int retries = 0;
+
+ rc = sd_bus_request_name (user_bus, name, 0);
+ if (rc >= 0) {
+ fd_p = True;
+ if (verbose_p)
+ fprintf (stderr, "%s: registered as \"%s\"\n", blurb(), name);
+ } else {
+ pid_t pid = get_bus_name_pid (user_bus, name);
+ if (pid != -1) {
+ char *pname = process_name (pid);
+ if (verbose_p) {
+ fprintf (stderr, "%s: \"%s\" in use by pid %lu (%s)\n",
+ blurb(), name, (unsigned long) pid, remove_dir (pname));
+ free (pname);
+ } else {
+ if (verbose_p)
+ fprintf (stderr, "%s: \"%s\" in use by pid %lu\n",
+ blurb(), name, (unsigned long) pid);
+ }
+ } else if (-rc == EEXIST || -rc == EALREADY) {
+ if (verbose_p)
+ fprintf (stderr, "%s: \"%s\" already in use\n", blurb(), name);
+ } else {
+ fprintf (stderr, "%s: unknown error for \"%s\": %s\n",
+ blurb(), name, strerror(-rc));
+ }
+ }
+
+ /* If XScreenSaver was launched at login, it's possible that
+ "org.freedesktop.ScreenSaver" has been registered by "ksmserver" but
+ "org.kde.Solid.PowerManagement.PolicyAgent" hasn't yet been registered
+ by "org_kde_powerdevil". So give it 30 seconds to see if things
+ settle down.
+ */
+ while (1) {
+ gnome_p = service_exists_p (user_bus, gname);
+ kde_p = service_exists_p (user_bus, kname);
+ if (fd_p || gnome_p || kde_p)
+ break;
+ now = time ((time_t *) 0);
+ if (now >= start + timeout)
+ break;
+
+ retries++;
+ sleep (3);
+ }
+
+ if (verbose_p) {
+ int i = 0;
+ for (i = 0; i < 2; i++) {
+ Bool exists_p = (i == 0 ? gnome_p : kde_p);
+ const char *name = (i == 0 ? gname : kname);
+ char rr[20];
+ if (now == start)
+ *rr = 0;
+ else
+ sprintf (rr, " after %lu seconds", now - start);
+
+ if (exists_p) {
+ pid_t pid = get_bus_name_pid (user_bus, name);
+ if (pid != -1) {
+ char *pname = process_name (pid);
+ fprintf (stderr, "%s: \"%s\" in use by pid %lu (%s)%s\n",
+ blurb(), name, (unsigned long) pid, remove_dir (pname),
+ rr);
free (pname);
} else {
- fprintf (stderr,
- "%s: connection failed: \"%s\" in use by pid %lu\n",
- blurb(), names[i], (unsigned long) pid);
+ fprintf (stderr, "%s: \"%s\" in use%s\n", blurb(), name, rr);
}
- } else if (-rc == EEXIST || -rc == EALREADY) {
- fprintf (stderr, "%s: connection failed: \"%s\" already in use\n",
- blurb(), names[i]);
} else {
- fprintf (stderr, "%s: connection failed for \"%s\": %s\n",
+ fprintf (stderr, "%s: \"%s\" not in use%s\n", blurb(), name, rr);
+ }
+ }
+ }
+
+ if (! (fd_p || gnome_p || kde_p)) /* Must have at least one */
+ goto FAIL;
+
+ /* Register our callbacks for things sent to
+ "org.freedesktop.ScreenSaver /ScreenSaver" and
+ "org.freedesktop.ScreenSaver /org/freedesktop/ScreenSaver"
+ */
+ if (fd_p) {
+ const char * const names[] = { DBUS_FDO_OBJECT_PATH_1,
+ DBUS_FDO_OBJECT_PATH_2 };
+ int i = 0;
+ for (i = 0; i < countof(names); i++) {
+ rc = sd_bus_add_object_vtable (user_bus, NULL, names[i],
+ DBUS_FDO_INTERFACE,
+ xscreensaver_dbus_vtable,
+ &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: vtable registration failed for %s: %s\n",
blurb(), names[i], strerror(-rc));
+ goto FAIL;
}
- goto FAIL;
}
}
}
- /* 'system_bus' is where we hold a lock on org.freedesktop.login1, meaning
- that the system will send us a PrepareForSleep message when the system is
- about to suspend.
- */
- rc = sd_bus_open_system (&system_bus);
+ /* Obtain a lock fd from the "Inhibit" method, so that we can delay
+ sleep when a "PrepareForSleep" signal is posted.
+ */
+ ctx->system_bus = system_bus;
+ rc = xscreensaver_register_sleep_lock (ctx);
+ if (rc < 0)
+ goto FAIL;
+
+ /* Register a callback for "org.freedesktop.login1.Manager.PrepareForSleep".
+ System bus.
+ */
+ rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_MATCH,
+ xscreensaver_prepare_for_sleep_cb, &global_ctx);
if (rc < 0) {
- fprintf (stderr, "%s: system bus connection failed: %s\n",
+ fprintf (stderr, "%s: registering sleep callback failed: %s\n",
blurb(), strerror(-rc));
goto FAIL;
}
- /* Obtain a lock fd from the "Inhibit" method, so that we can delay
- sleep when a "PrepareForSleep" signal is posted. */
+ /* Register a callback for "org.freedesktop.login1.Session.Lock".
+ System bus.
+ */
+ rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_LOCK_MATCH,
+ xscreensaver_lock_cb, &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: registering lock-session callback failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
- ctx->system_bus = system_bus;
- rc = xscreensaver_register_sleep_lock (ctx);
- if (rc < 0)
+ /* And for Unlock. */
+ rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_UNLOCK_MATCH,
+ xscreensaver_unlock_cb, &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: registering lock-session callback failed: %s\n",
+ blurb(), strerror(-rc));
goto FAIL;
+ }
- /* This is basically an event mask, saying that we are interested in
- "PrepareForSleep", and to run our callback when that signal is thrown.
- */
- rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_MATCH,
- xscreensaver_systemd_handler,
- &global_ctx);
+
+ /* Register a callback for "org.gnome.SessionManager.InhibitorAdded".
+ User bus.
+ */
+ rc = sd_bus_add_match (user_bus, NULL, DBUS_GSN_MATCH_1,
+ xscreensaver_gnome_inhibitor_added_cb, &global_ctx);
if (rc < 0) {
- fprintf (stderr, "%s: add match failed: %s\n", blurb(), strerror(-rc));
+ fprintf (stderr, "%s: registering GNOME inhibitor callback failed: %s\n",
+ blurb(), strerror(-rc));
goto FAIL;
}
- if (verbose_p)
- fprintf (stderr, "%s: connected\n", blurb());
+ /* Register a callback for "org.gnome.SessionManager.InhibitorRemoved".
+ User bus.
+ */
+ rc = sd_bus_add_match (user_bus, NULL, DBUS_GSN_MATCH_2,
+ xscreensaver_gnome_inhibitor_removed_cb, &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: registering GNOME de-inhibitor callback failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+
+ /* Register a callback for "org.kde.Solid.PowerManagement.PolicyAgent.
+ InhibitionsChanged". User bus.
+ */
+ rc = sd_bus_add_match (user_bus, NULL, DBUS_KDE_MATCH,
+ xscreensaver_kde_inhibitor_changed_cb, &global_ctx);
+ if (rc < 0) {
+ fprintf (stderr, "%s: registering KDE inhibitor callback failed: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
- /* Run an event loop forever, and wait for our callback to run.
+ /* Run an event loop forever, and wait for our callbacks to run.
*/
while (1) {
struct pollfd fds[3];
- uint64_t poll_timeout, system_timeout, user_timeout;
- struct inhibit_entry *entry;
+ uint64_t poll_timeout_msec, system_timeout_usec, user_timeout_usec;
/* We MUST call sd_bus_process() on each bus at least once before calling
sd_bus_get_events(), so just always start the event loop by processing
- all outstanding requests on both busses. */
+ all outstanding requests on both busses.
+ */
do {
rc = sd_bus_process (system_bus, NULL);
if (rc < 0) {
@@ -821,97 +1496,128 @@ xscreensaver_systemd_loop (void)
}
} while (rc > 0);
- fds[0].fd = sd_bus_get_fd (system_bus);
- fds[0].events = sd_bus_get_events (system_bus);
+ /* Prune any entries whose original sender has gone away: this happens
+ if a program inhibits, then exits without having called uninhibit.
+ That would have left us inhibited forever, even if the inhibiting
+ program was re-launched, since the new instance won't have the
+ same cookie.
+ */
+ remove_matching_entry (ctx, NULL, 0, 0);
+
+ /* If we are inhibited and HEARTBEAT_INTERVAL has passed, de-activate the
+ screensaver.
+ */
+ if (ctx->inhibit_count > 0) {
+ time_t now = time ((time_t *) 0);
+ if (now - last_deactivate_time >= HEARTBEAT_INTERVAL) {
+ if (verbose_p) {
+ struct inhibit_entry *entry;
+ SLIST_FOREACH (entry, &inhibit_head, entries) {
+ char ct[100];
+ ctime_r (&entry->start_time, ct);
+ fprintf (stderr, "%s: inhibited by \"%s\" since %s",
+ blurb(), remove_dir (entry->appname), ct);
+ }
+ }
+ xscreensaver_command ("deactivate");
+ last_deactivate_time = now;
+ }
+ }
+
+ /* The remainder of the code that follows is concerned solely with
+ determining how long we should wait until the next iteration of the
+ event loop.
+ */
+ rc = sd_bus_get_fd (system_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: sd_bus_get_fd failed for system bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+ fds[0].fd = rc;
+ rc = sd_bus_get_events (system_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: sd_bus_get_events failed for system bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+ fds[0].events = rc;
fds[0].revents = 0;
- fds[1].fd = sd_bus_get_fd (user_bus);
- fds[1].events = sd_bus_get_events (user_bus);
+ rc = sd_bus_get_fd (user_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: sd_bus_get_fd failed for user bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+ fds[1].fd = rc;
+ rc = sd_bus_get_events (user_bus);
+ if (rc < 0) {
+ fprintf (stderr, "%s: sd_bus_get_events failed for user bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
+ }
+ fds[1].events = rc;
fds[1].revents = 0;
+ /* Activity on the X server connection will wake us from the poll(). */
fds[2].fd = XConnectionNumber (dpy);
fds[2].events = POLLIN;
fds[2].revents = 0;
-
- sd_bus_get_timeout (system_bus, &system_timeout);
- sd_bus_get_timeout (user_bus, &user_timeout);
-
- if (system_timeout == 0 && user_timeout == 0)
- poll_timeout = 0;
- else if (system_timeout == UINT64_MAX && user_timeout == UINT64_MAX)
- poll_timeout = -1;
- else {
- poll_timeout = (system_timeout < user_timeout
- ? system_timeout : user_timeout);
- poll_timeout /= 1000000;
+ rc = sd_bus_get_timeout (system_bus, &system_timeout_usec);
+ if (rc < 0) {
+ fprintf (stderr, "%s: sd_bus_get_timeout failed for system bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
}
-
- /* Prune any entries whose original sender has gone away: this happens
- if a program inhibits, then exits without having called uninhibit.
- That would have left us inhibited forever, even if the inhibiting
- program was re-launched, since the new instance won't have the
- same cookie. */
- SLIST_FOREACH (entry, &inhibit_head, entries) {
- if (entry->peer &&
- !sd_bus_track_count_name (ctx->track, entry->peer)) {
- if (verbose_p)
- fprintf (stderr,
- "%s: peer %s for inhibiting app \"%s\" has died:"
- " uninhibiting %08X\n",
- blurb(),
- entry->peer,
- entry->appname,
- entry->cookie);
- SLIST_REMOVE (&inhibit_head, entry, inhibit_entry, entries);
- if (entry->appname) free (entry->appname);
- free(entry->peer);
- free (entry);
- ctx->is_inhibited--;
- if (ctx->is_inhibited < 0)
- ctx->is_inhibited = 0;
- }
+ sd_bus_get_timeout (user_bus, &user_timeout_usec);
+ if (rc < 0) {
+ fprintf (stderr, "%s: sd_bus_get_timeout failed for user bus: %s\n",
+ blurb(), strerror(-rc));
+ goto FAIL;
}
+ /* Pick the smaller of the two bus timeouts and convert from microseconds
+ to milliseconds expected by poll().
+ */
+ poll_timeout_msec = ((system_timeout_usec < user_timeout_usec
+ ? system_timeout_usec : user_timeout_usec)
+ / 1000);
- /* We want to wake up at least once every N seconds to de-activate
- the screensaver if we have been inhibited.
+ /* If we have been inhibited, we want to wake up at least once every N
+ seconds to de-activate the screensaver.
*/
- if (poll_timeout > HEARTBEAT_INTERVAL * 1000)
- poll_timeout = HEARTBEAT_INTERVAL * 1000;
+ if (ctx->inhibit_count > 0 &&
+ poll_timeout_msec > HEARTBEAT_INTERVAL * 1000)
+ poll_timeout_msec = HEARTBEAT_INTERVAL * 1000;
+
+ if (poll_timeout_msec < 1000)
+ poll_timeout_msec = 1000;
- rc = poll (fds, 3, poll_timeout);
+ rc = poll (fds, 3, poll_timeout_msec);
if (rc < 0) {
- fprintf (stderr, "%s: poll failed: %s\n", blurb(), strerror(-rc));
- exit (EXIT_FAILURE);
+ fprintf (stderr, "%s: poll failed: %s\n", blurb(), strerror(errno));
+ goto FAIL;
}
if (fds[2].revents & (POLLERR | POLLHUP | POLLNVAL)) {
fprintf (stderr, "%s: X connection closed\n", blurb());
+ dpy = 0;
goto FAIL;
+ } else if (fds[2].revents & POLLIN) {
+ /* Even though we have requested no events, there are some events that
+ the X server sends anyway, e.g. MappingNotify, and if we don't flush
+ the fd, it will constantly be ready for reading, and we busy-loop. */
+ char buf[1024];
+ while (read (fds[2].fd, buf, sizeof(buf)) > 0)
+ ;
}
- if (ctx->is_inhibited) {
- time_t now = time ((time_t *) 0);
- if (now - last_deactivate_time >= HEARTBEAT_INTERVAL) {
- if (verbose_p) {
- SLIST_FOREACH (entry, &inhibit_head, entries) {
- char ct[100];
- ctime_r (&entry->start_time, ct);
- fprintf (stderr, "%s: inhibited by \"%s\" since %s",
- blurb(), entry->appname, ct);
- }
- }
- xscreensaver_command ("deactivate");
- last_deactivate_time = now;
- }
- }
- }
+ } /* Event loop end */
FAIL:
- XCloseDisplay(dpy);
-
if (system_bus)
sd_bus_flush_close_unref (system_bus);
@@ -923,6 +1629,9 @@ xscreensaver_systemd_loop (void)
sd_bus_error_free (&error);
+ if (dpy)
+ XCloseDisplay (dpy);
+
return EXIT_FAILURE;
}
@@ -959,9 +1668,7 @@ main (int argc, char **argv)
screensaver_version = version;
- progname = argv[0];
- s = strrchr (progname, '/');
- if (s) progname = s+1;
+ progname = remove_dir (argv[0]);
for (i = 1; i < argc; i++)
{
@@ -970,8 +1677,21 @@ main (int argc, char **argv)
if (s[0] == '-' && s[1] == '-') s++;
L = strlen (s);
if (L < 2) USAGE ();
- else if (!strncmp (s, "-verbose", L)) verbose_p = 1;
+ else if (!strncmp (s, "-q", L)) verbose_p = 0;
else if (!strncmp (s, "-quiet", L)) verbose_p = 0;
+ else if (!strncmp (s, "-verbose", L)) verbose_p++;
+ else if (!strncmp (s, "-v", L)) verbose_p++;
+ else if (!strncmp (s, "-vv", L)) verbose_p += 2;
+ else if (!strncmp (s, "-vvv", L)) verbose_p += 3;
+ else if (!strncmp (s, "-vvvv", L)) verbose_p += 4;
+ else if (!strcmp (s, "-ver") ||
+ !strcmp (s, "-vers") ||
+ !strcmp (s, "-version"))
+ {
+ fprintf (stderr, "%s\n", screensaver_id+4);
+ exit (1);
+ }
+
else USAGE ();
}
diff --git a/driver/xscreensaver-systemd.man b/driver/xscreensaver-systemd.man
index beb23e7..def72a5 100644
--- a/driver/xscreensaver-systemd.man
+++ b/driver/xscreensaver-systemd.man
@@ -1,11 +1,11 @@
-.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
+.TH XScreenSaver 1 "6-Jan-2022 (6.00)" "X Version 11"
.SH NAME
xscreensaver-systemd - lock the screen upon suspend, and inhibit
screen-blanking during video playback.
.SH SYNOPSIS
-.B xscreensaver-systemd [-verbose]
+.B xscreensaver-systemd [\-\-verbose] [\-\-version]
.SH DESCRIPTION
-The \fIxscreensaver\-systemd\fP program is a helper program launched by
+The \fIxscreensaver\-systemd\fP program is a helper daemon launched by
.BR xscreensaver (1)
for
.BR systemd (1)
@@ -16,30 +16,63 @@ integration. It does two things:
\fB*
When the system is about to go to sleep (e.g., the laptop lid has just been
closed) it locks the screen just \fIbefore\fP the system sleeps, by running
-\fIxscreensaver-command -suspend\fP. When the system wakes up again, it
-runs \fIxscreensaver-command -deactivate\fP to make the unlock dialog appear
+\fIxscreensaver-command \-\-suspend\fP. When the system wakes up again, it
+runs \fIxscreensaver\-command \-\-deactivate\fP to make the unlock dialog appear
immediately. It does this through the
.BR org.freedesktop.login1 (5)
D-Bus interface.
.TP 2
\fB*
-When another process on the system asks for the screen saver to be
-inhibited (e.g. because a video is playing) this program periodically runs
-\fIxscreensaver-command -deactivate\fP to keep the display un-blanked.
-It does this until the other program asks for it to stop, or exits.
-It does this through the
-.BR org.freedesktop.ScreenSaver (5)
-D-Bus interface.
+When another process asks for the screen saver to be inhibited (e.g. because
+a video is playing) this program periodically runs \fIxscreensaver\-command
+\-\-deactivate\fP to keep the display un-blanked. It does this until that
+other program asks for it to stop, or exits. It does this through the
+.BR org.freedesktop.ScreenSaver (5),
+.BR org.gnome.SessionManager (5)
+and
+.BR org.kde.Solid.PowerManagement.PolicyAgent (5)
+D-Bus interfaces.
.RS 0
.SH BUGS
+Blanking-related problems take two forms: failing to connect to D-Bus; and
+other programs requesting stupid things.
+.SS D-BUS
Only one program at a time can register with
.BR systemd (1)
+or
+.BR elogind (8)
for screen-saver-related events, so if another screen saver is running as a
-part of the desktop environment, \fIxscreensaver-systemd\fP will be unable to
-launch. Likely adversaries include
-.BR ksmserver (1)
-and
-.BR gsd\-screensaver\-proxy (1).
+part of the desktop environment, \fIxscreensaver\-systemd\fP will be unable
+to launch. This program has workarounds for Gnome and KDE, but if you are
+using something else, that might be a problem.
+.SS CHROME & CHROMIUM (101.0)
+.TP 2
+\fB*
+Playing only audio in Chrome will prevent your screen from blanking. Chrome
+sends the exact same "inhibit" reason for audio as for video, so we can't tell
+them apart.
+.TP 2
+\fB*
+Chrome prevents your screen from blanking when playing short, looping videos.
+This means that your screen won't blank when Chrome is showing a Twitter page
+(because those animated GIFs aren't really GIFs, they are MP4s). This affects
+Tweetdeck as well.
+
+The proper way to fix this would be for Chrome to stop inhibiting once a video
+loops. That way your multi-hour movie inhibits properly, but your looping GIF
+only inhibits for the first few seconds.
+.PP
+Firefox does not have either of these problems.
+.SS MPLAYER (2:1.4)
+Makes no attempt to inhibit the screen saver. Use VLC instead.
+.SS MPV (0.33)
+Makes no attempt to inhibit the screen saver. Use VLC instead.
+.SS VARIOUS
+Most programs fail to re-enable screen blanking if they crash or are killed
+while playing. We try to detect when this has happened, but that might not
+work with all versions of systemd, resulting in screen blanking remaining
+permanently disabled. If that happens, killing and restarting
+\fIxscreensaver\-systemd\fP is a workaround.
.SH SEE ALSO
.BR X (1),
.BR xscreensaver (1),
@@ -49,7 +82,7 @@ and
.BR sd-bus (3),
.BR elogind (8)
.SH COPYRIGHT
-Copyright \(co 2019-2021 by Martin Lucina and Jamie Zawinski.
+Copyright \(co 2019-2022 by Martin Lucina and Jamie Zawinski.
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
diff --git a/driver/xscreensaver-text b/driver/xscreensaver-text
deleted file mode 100755
index eca1fbf..0000000
--- a/driver/xscreensaver-text
+++ /dev/null
@@ -1,899 +0,0 @@
-#!/usr/bin/perl -w
-# Copyright © 2005-2019 Jamie Zawinski <jwz@jwz.org>
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation. No representations are made about the suitability of this
-# software for any purpose. It is provided "as is" without express or
-# implied warranty.
-#
-# This program writes some text to stdout, based on preferences in the
-# .xscreensaver file. It may load a file, a URL, run a program, or just
-# print the date.
-#
-# In a native MacOS build of xscreensaver, this script is included in
-# the Contents/Resources/ directory of each screen saver .bundle that
-# uses it; and in that case, it looks up its resources using
-# /usr/bin/defaults instead.
-#
-# Created: 19-Mar-2005.
-
-require 5;
-#use diagnostics; # Fails on some MacOS 10.5 systems
-use strict;
-
-# Some Linux systems don't install LWP by default!
-# Only error out if we're actually loading a URL instead of local data.
-BEGIN { eval 'use LWP::UserAgent;' }
-
-# Not sure how prevalent this is. Hope it's part of the default install.
-BEGIN { eval 'use HTML::Entities;' }
-
-use Socket;
-use POSIX qw(strftime);
-use Text::Wrap qw(wrap);
-#use bytes; # This breaks shit.
-
-my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.48 $' =~ m/\s(\d[.\d]+)\s/s);
-
-my $verbose = 0;
-my $http_proxy = undef;
-
-my $config_file = $ENV{HOME} . "/.xscreensaver";
-my $text_mode = 'date';
-my $text_literal = '';
-my $text_file = '';
-my $text_program = '';
-my $text_url = 'https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss';
-# Default URL needs to be set and match what's in OSX/XScreenSaverView.m
-
-my $wrap_columns = undef;
-my $truncate_lines = undef;
-my $latin1_p = 0;
-my $nyarlathotep_p = 0;
-
-
-# Convert any HTML entities to Latin1 characters.
-#
-sub de_entify($) {
- my ($text) = @_;
-
- return '' unless defined($text);
- return $text unless ($text =~ m/&/s);
-
- # Convert any HTML entities to Unicode characters,
- # if the HTML::Entities module is installed.
- eval {
- my $t2 = $text;
- $text = undef;
- $text = HTML::Entities::decode_entities ($t2);
- };
- return $text if defined($text);
-
- # If it's not installed, just complain instead of trying to halfass it.
- print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
- "\n\tsudo cpan HTML::Entities\n\n");
- exit (1);
-}
-
-
-# Convert any Unicode characters to Latin1 if possible.
-# Unconvertable bytes are left alone.
-#
-sub utf8_to_latin1($) {
- my ($text) = @_;
-
- utf8::encode ($text); # Unpack Unicode back to multi-byte UTF-8.
-
- # Maybe it would be better to handle this in the Unicode domain
- # by doing things like s/\x{2018}/\"/g, but without decoding the
- # string back to UTF-8 first, I'm at a loss as to how to have
- # "&aacute;" print as "\340" instead of as "\303\240".
-
- $text =~ s/ \xC2 ( [\xA0-\xFF] ) / $1 /gsex;
- $text =~ s/ \xC3 ( [\x80-\xFF] ) / chr (ord($1) | 0x40) /gsex;
-
- # Handles a few 3-byte sequences too.
- $text =~ s/\xE2\x80\x93/--/gs;
- $text =~ s/\xE2\x80\x94/--/gs;
- $text =~ s/\xE2\x80\x98/`/gs;
- $text =~ s/\xE2\x80\x99/'/gs;
- $text =~ s/\xE2\x80\x9C/``/gs;
- $text =~ s/\xE2\x80\x9D/'/gs;
- $text =~ s/\xE2\x80\xA2/&bull;/gs;
- $text =~ s/\xE2\x80\xA6/.../gs;
- $text =~ s/\xE2\x80\xB2/'/gs;
- $text =~ s/\xE2\x84\xA2/&trade;/gs;
- $text =~ s/\xE2\x86\x90/ &larr; /gs;
-
- return $text;
-}
-
-
-# Reads the prefs we use from ~/.xscreensaver
-#
-sub get_x11_prefs() {
- my $got_any_p = 0;
-
- if (open (my $in, '<', $config_file)) {
- print STDERR "$progname: reading $config_file\n" if ($verbose > 1);
- local $/ = undef; # read entire file
- my $body = <$in>;
- close $in;
- $got_any_p = get_x11_prefs_1 ($body);
-
- } elsif ($verbose > 1) {
- print STDERR "$progname: $config_file: $!\n";
- }
-
- if (! $got_any_p && defined ($ENV{DISPLAY})) {
- # We weren't able to read settings from the .xscreensaver file.
- # Fall back to any settings in the X resource database
- # (/usr/X11R6/lib/X11/app-defaults/XScreenSaver)
- #
- print STDERR "$progname: reading X resources\n" if ($verbose > 1);
- my $body = `appres XScreenSaver xscreensaver -1`;
- $got_any_p = get_x11_prefs_1 ($body);
- }
-
- if ($verbose > 1) {
- print STDERR "$progname: mode: $text_mode\n";
- print STDERR "$progname: literal: $text_literal\n";
- print STDERR "$progname: file: $text_file\n";
- print STDERR "$progname: program: $text_program\n";
- print STDERR "$progname: url: $text_url\n";
- }
-
- $text_mode =~ tr/A-Z/a-z/;
- $text_literal =~ s@\\n@\n@gs;
- $text_literal =~ s@\\\n@\n@gs;
-}
-
-
-sub get_x11_prefs_1($) {
- my ($body) = @_;
-
- my $got_any_p = 0;
- $body =~ s@\\\n@@gs;
- $body =~ s@^[ \t]*#[^\n]*$@@gm;
-
- if ($body =~ m/^[.*]*textMode:[ \t]*([^\s]+)\s*$/im) {
- $text_mode = $1;
- $got_any_p = 1;
- }
- if ($body =~ m/^[.*]*textLiteral:[ \t]*(.*?)[ \t]*$/im) {
- $text_literal = $1;
- }
- if ($body =~ m/^[.*]*textFile:[ \t]*(.*?)[ \t]*$/im) {
- $text_file = $1;
- }
- if ($body =~ m/^[.*]*textProgram:[ \t]*(.*?)[ \t]*$/im) {
- $text_program = $1;
- }
- if ($body =~ m/^[.*]*textURL:[ \t]*(.*?)[ \t]*$/im) {
- $text_url = $1;
- }
-
- return $got_any_p;
-}
-
-
-sub get_cocoa_prefs($) {
- my ($id) = @_;
- my $v;
-
- print STDERR "$progname: reading Cocoa prefs: \"$id\"\n" if ($verbose > 1);
-
- $v = get_cocoa_pref_1 ($id, "textMode");
- $text_mode = $v if defined ($v);
-
- # The "textMode" pref is set to a number instead of a string because I
- # couldn't figure out the black magic to make Cocoa bindings work right.
- #
- # Update: as of 5.33, Cocoa writes strings instead of numbers, but
- # pre-existing saved preferences might still have numbers in them.
- #
- if ($text_mode eq '0') { $text_mode = 'date'; }
- elsif ($text_mode eq '1') { $text_mode = 'literal'; }
- elsif ($text_mode eq '2') { $text_mode = 'file'; }
- elsif ($text_mode eq '3') { $text_mode = 'url'; }
- elsif ($text_mode eq '4') { $text_mode = 'program'; }
-
- $v = get_cocoa_pref_1 ($id, "textLiteral");
- $text_literal = $v if defined ($v);
- $text_literal =~ s@\\n@\n@gs;
- $text_literal =~ s@\\\n@\n@gs;
-
- $v = get_cocoa_pref_1 ($id, "textFile");
- $text_file = $v if defined ($v);
-
- $v = get_cocoa_pref_1 ($id, "textProgram");
- $text_program = $v if defined ($v);
-
- $v = get_cocoa_pref_1 ($id, "textURL");
- $text_url = $v if defined ($v);
-}
-
-
-sub get_cocoa_pref_1($$) {
- my ($id, $key) = @_;
- # make sure there's nothing stupid/malicious in either string.
- $id =~ s/[^-a-z\d. ]/_/gsi;
- $key =~ s/[^-a-z\d. ]/_/gsi;
- my $cmd = "defaults -currentHost read \"$id\" \"$key\"";
-
- print STDERR "$progname: executing $cmd\n"
- if ($verbose > 3);
-
- my $val = `$cmd 2>/dev/null`;
- $val =~ s/^\s+//s;
- $val =~ s/\s+$//s;
-
- print STDERR "$progname: Cocoa: $id $key = \"$val\"\n"
- if ($verbose > 2);
-
- $val = undef if ($val =~ m/^$/s);
-
- return $val;
-}
-
-
-# like system() but checks errors.
-#
-sub safe_system(@) {
- my (@cmd) = @_;
-
- print STDERR "$progname: executing " . join(' ', @cmd) . "\n"
- if ($verbose > 3);
-
- system @cmd;
- my $exit_value = $? >> 8;
- my $signal_num = $? & 127;
- my $dumped_core = $? & 128;
- error ("$cmd[0]: core dumped!") if ($dumped_core);
- error ("$cmd[0]: signal $signal_num!") if ($signal_num);
- error ("$cmd[0]: exited with $exit_value!") if ($exit_value);
-}
-
-
-sub which($) {
- my ($cmd) = @_;
-
- if ($cmd =~ m@^\./|^/@) {
- error ("cannot execute $cmd") unless (-x $cmd);
- return $cmd;
- }
-
- foreach my $dir (split (/:/, $ENV{PATH})) {
- my $cmd2 = "$dir/$cmd";
- print STDERR "$progname: checking $cmd2\n" if ($verbose > 3);
- return $cmd2 if (-x "$cmd2");
- }
- error ("$cmd not found on \$PATH");
-}
-
-
-sub output() {
-
- binmode (STDOUT, ($latin1_p ? ':raw' : ':utf8'));
- binmode (STDERR, ':utf8');
-
- # Do some basic sanity checking (null text, null file names, etc.)
- #
- if (($text_mode eq 'literal' && $text_literal =~ m/^\s*$/i) ||
- ($text_mode eq 'file' && $text_file =~ m/^\s*$/i) ||
- ($text_mode eq 'program' && $text_program =~ m/^\s*$/i) ||
- ($text_mode eq 'url' && $text_url =~ m/^\s*$/i)) {
- print STDERR "$progname: falling back to 'date'\n" if ($verbose);
- $text_mode = 'date';
- }
-
- if ($text_mode eq 'literal') {
- $text_literal = strftime ($text_literal, localtime);
- $text_literal = utf8_to_latin1($text_literal) if ($latin1_p);
- $text_literal =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
- print STDOUT $text_literal;
- print STDOUT "\n" unless ($text_literal =~ m/\n$/s);
-
- } elsif ($text_mode eq 'file') {
-
- $text_file =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
-
- if (open (my $in, '<:raw', $text_file)) {
- print STDERR "$progname: reading $text_file\n" if ($verbose);
- binmode (STDOUT, ':raw');
-
- if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) {
- # read it, then reformat it.
- local $/ = undef; # read entire file
- my $body = <$in>;
- $body = reformat_text ($body);
- print STDOUT $body;
- } else {
- # stream it by lines
- while (<$in>) {
- $_ = utf8_to_latin1($_) if ($latin1_p);
- y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
- print STDOUT $_;
- }
- }
- close $in;
- } else {
- error ("$text_file: $!");
- }
-
- } elsif ($text_mode eq 'program') {
-
- my ($prog, $args) = ($text_program =~ m/^([^\s]+)(.*)$/);
- $text_program = which ($prog) . $args;
- print STDERR "$progname: running $text_program\n" if ($verbose);
-
- if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) {
- # read it, then reformat it.
- my $lines = 0;
- my $body = "";
- my $cmd = "( $text_program ) 2>&1";
- # $cmd .= " | sed -l"; # line buffer instead of 4k pipe buffer
- open (my $pipe, '-|:unix', $cmd);
- while (my $line = <$pipe>) {
- $body .= $line;
- $lines++;
- last if ($truncate_lines && $lines > $truncate_lines);
- }
- close $pipe;
-
- # I don't understand why we must do this here, but must not do this
- # in the 'file' branch above, which reads the file with :raw...
- utf8::decode ($body); # Pack multi-byte UTF-8 back into wide chars.
-
- $body = reformat_text ($body);
- print STDOUT $body;
- } else {
- # stream it
- safe_system ("$text_program");
- }
-
- } elsif ($text_mode eq 'url') {
-
- get_url_text ($text_url);
-
- } else { # $text_mode eq 'date'
-
- my $n = `uname -n`;
- $n =~ s/\.local\n/\n/s;
- print $n;
-
- my $unamep = 1;
-
- if (-f "/etc/redhat-release") { # "Fedora Core release 4 (Stentz)"
- safe_system ("cat", "/etc/redhat-release");
- }
-
- if (-f "/etc/release") { # "Solaris 10 3/05 s10_74L2a X86"
- safe_system ("head", "-1", "/etc/release");
- }
-
- if (-f "/usr/sbin/system_profiler") { # "Mac OS X 10.4.5 (8H14)"
- my $sp = # "iMac G5"
- `/usr/sbin/system_profiler SPSoftwareDataType SPHardwareDataType 2>/dev/null`;
- # system_profiler on OS X 10.10 generates spurious error messages.
- my ($v) = ($sp =~ m/^\s*System Version:\s*(.*)$/mi);
- my ($s) = ($sp =~ m/^\s*(?:CPU|Processor) Speed:\s*(.*)$/mi);
- my ($t) = ($sp =~ m/^\s*(?:Machine|Model) Name:\s*(.*)$/mi);
- print "$v\n" if ($v);
- print "$s $t\n" if ($s && $t);
- $unamep = !defined ($v);
- }
-
- if ($unamep) {
- safe_system ("uname", "-sr"); # "Linux 2.6.15-1.1831_FC4"
- }
-
- print "\n";
- safe_system ("date", "+%c");
- print "\n";
- my $ut = `uptime`;
- $ut =~ s/^[ \d:]*(am|pm)?//i;
- $ut =~ s/,\s*(load)/\n$1/;
- print "$ut\n";
- }
-
-}
-
-
-# Make an educated guess as to what's in this document.
-# We don't necessarily take the Content-Type header at face value.
-# Returns 'html', 'rss', or 'text';
-#
-sub guess_content_type($$) {
- my ($ct, $body) = @_;
-
- $body =~ s/^(.{512}).*/$1/s; # only look in first half K of file
-
- if ($ct =~ m@^text/.*html@i) { return 'html'; }
- if ($ct =~ m@\b(atom|rss|xml)\b@i) { return 'rss'; }
-
- if ($body =~ m@^\s*<\?xml@is) { return 'rss'; }
- if ($body =~ m@^\s*<!DOCTYPE RSS@is) { return 'rss'; }
- if ($body =~ m@^\s*<!DOCTYPE HTML@is) { return 'html'; }
-
- if ($body =~ m@<(BASE|HTML|HEAD|BODY|SCRIPT|STYLE|TABLE|A\s+HREF)\b@i) {
- return 'html';
- }
-
- if ($body =~ m@<(RSS|CHANNEL|GENERATOR|DESCRIPTION|CONTENT|FEED|ENTRY)\b@i) {
- return 'rss';
- }
-
- return 'text';
-}
-
-
-sub reformat_html($$) {
- my ($body, $rss_p) = @_;
- $_ = $body;
-
- # In HTML, try to preserve newlines inside of PRE.
- #
- if (! $rss_p) {
- s@(<PRE\b[^<>]*>\s*)(.*?)(</PRE)@{
- my ($a, $b, $c) = ($1, $2, $3);
- $b =~ s/[\r\n]/<BR>/gs;
- $a . $b . $c;
- }@gsexi;
- }
-
- if (! $rss_p) {
- # In HTML, unfold lines.
- # In RSS, assume \n means literal line break.
- s@[\r\n]@ @gsi;
- }
-
- # This right here is the part where I doom us all to inhuman
- # toil for the One whose Name cannot be expressed in the
- # Basic Multilingual Plane. http://jwz.org/b/yhAT He comes.
-
- s@<!--.*?-->@@gsi; # lose comments
- s@<(STYLE|SCRIPT)\b[^<>]*>.*?</\1\s*>@@gsi; # lose css and js
-
- s@</?(BR|TR|TD|LI|DIV)\b[^<>]*>@\n@gsi; # line break at BR, TD, DIV, etc
- s@</?(P|UL|OL|BLOCKQUOTE)\b[^<>]*>@\n\n@gsi; # two line breaks
-
- s@<lj\s+user=\"?([^<>\"]+)\"?[^<>]*>?@$1@gsi; # handle <LJ USER=>
- s@</?[BI]>@*@gsi; # bold, italic => asterisks
-
-
- s@<[^<>]*>?@@gs; # lose all other HTML tags
- $_ = de_entify ($_); # convert HTML entities
-
- # For Wikipedia: delete anything inside {{ }} and unwrap [[tags]],
- # among other things.
- #
- if ($rss_p eq 'wiki') {
-
- s@<!--.*?-->@@gsi; # lose HTML comments again
-
- # Creation line is often truncated: screws up parsing with unbalanced {{.
- s@(: +[^a-zA-Z ]* *Created page) with [^\n]+@$1@s;
-
- s@/\*.*?\*/@@si; # /* ... */
-
- # Try to omit all tables, since they're impossible to read as text.
- #
- 1 while (s/\{\{[^{}]*}}/ /gs); # {{ ... }}
- 1 while (s/\{\|.*?\|\}/\n\n/gs); # {| ... |}
- 1 while (s/\|-.*?\|/ /gs); # |- ... | (table cell)
-
- # Convert anchors to something more readable.
- #
- s/\[\[([^\[\]\|]+)\|([^\[\]]+)\]\]/$2/gs; # [[link|anchor]]
- s/\[\[([^:\[\]\|]+)\]\]/$1/gs; # [[anchor]]
- s/\[https?:[^\[\]\s]+\s+([^\[\]]+)\]/$1/gs; # [url anchor]
-
- # Convert all references to asterisks.
- s@\s*<ref>\s*.*?</ref>@*@gs; # <ref> ... <ref> -> "*"
- s@\n[ \t]*\d+\s*\^\s*http[^\s]+[ \t]*\n@\n@gs; # 1 ^ URL (a Reflist)
-
- s@\[\[File:([^\|\]]+).*?\]\]@\n$1\n@gs; # [[File: X | ... ]]
- s@\[\[Category:.*?\]\]@@gs; # omit categories
-
- s/<[^<>]*>//gs; # Omit all remaining tags
- s/\'{3,}//gs; # Omit ''' and ''''
- s/\'\'/\"/gs; # '' -> "
- s/\`\`/\"/gs; # `` -> "
- s/\"\"+/\"/gs; # "" -> "
-
- s/^[ \t]*[*#]+[ \t]*$//gm; # Omit lines with just * or # on them
-
- # Omit trailing headlines with no text after them (e.g. == Notes ==)
- 1 while (s/\n==+[ \t]*[^\n=]+[ \t]*==+\s*$/\n/s);
-
- $_ = de_entify ($_); # convert HTML entities, again
- }
-
-
- # elide any remaining non-Latin1 binary data.
- if ($latin1_p) {
- utf8::encode ($_); # Unpack Unicode back to multi-byte UTF-8.
- s/([^\000-\176]+(\s*[^\000-\176]+)[^a-z\d]*)/\xAB...\xBB /g;
- }
-
- $_ .= "\n";
-
- s/[ \t]+$//gm; # lose whitespace at end of line
- s@\n\n\n+@\n\n@gs; # compress blank lines
-
- if (!defined($wrap_columns) || $wrap_columns > 0) {
- $Text::Wrap::columns = ($wrap_columns || 72);
- $Text::Wrap::break = '[\s/|]'; # wrap on slashes for URLs
- $_ = wrap ("", " ", $_); # wrap the lines as a paragraph
- s/[ \t]+$//gm; # lose whitespace at end of line again
- }
-
- s/^\n+//gs;
-
- if ($truncate_lines) {
- s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
- }
-
- $_ = utf8_to_latin1($_) if ($latin1_p);
- y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
-
- return $_;
-}
-
-
-sub reformat_rss($) {
- my ($body) = @_;
-
- my $wiki_p = ($body =~ m@<generator>[^<>]*Wiki@si);
-
- $body =~ s/(<(ITEM|ENTRY)\b)/\001\001$1/gsi;
- my @items = split (/\001\001/, $body);
-
- print STDERR "$progname: converting RSS ($#items items)...\n"
- if ($verbose > 2);
-
- shift @items;
-
- # Let's skip forward in the stream by a random amount, so that if
- # two copies of ljlatest are running at the same time (e.g., on a
- # multi-headed machine), they get different text. (Put the items
- # that we take off the front back on the back.)
- #
- if ($#items > 7) {
- my $n = int (rand ($#items - 5));
- print STDERR "$progname: rotating by $n items...\n" if ($verbose > 2);
- while ($n-- > 0) {
- push @items, (shift @items);
- }
- }
-
- my $out = '';
-
- my $i = -1;
- foreach (@items) {
- $i++;
-
- my ($title, $author, $body1, $body2, $body3);
-
- $title = $3 if (m@<((TITLE) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
- $author= $3 if (m@<((DC:CREATOR) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
- $body1 = $3 if (m@<((DESCRIPTION) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
- $body2 = $3 if (m@<((CONTENT) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
- $body3 = $3 if (m@<((SUMMARY) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
-
- # If there are both <description> and <content> or <content:encoded>,
- # use whichever one contains more text.
- #
- if ($body3 && length($body3) >= length($body2 || '')) {
- $body2 = $body3;
- }
- if ($body2 && length($body2) >= length($body1 || '')) {
- $body1 = $body2;
- }
-
- if (! $body1) {
- if ($title) {
- print STDERR "$progname: no body in item $i (\"$title\")\n"
- if ($verbose > 2);
- } else {
- print STDERR "$progname: no body or title in item $i\n"
- if ($verbose > 2);
- next;
- }
- }
-
- $title = rss_field_to_html ($title || '');
- $author= rss_field_to_html ($author || '');
- $body1 = rss_field_to_html ($body1 || '');
-
- $title = '' if ($body1 eq $title); # Identical in Twitter's atom feed.
-
- # Omit author if it's in the title or body
- $author = '' if ($author &&
- ($title =~ m/\Q$author\E/si ||
- $body1 =~ m/\Q$author\E/si));
-
- $title = $author if ($author && !$title);
- $title = "$author: $title" if ($author && $title);
-
- $out .= reformat_html ("$title<P>$body1", $wiki_p ? 'wiki' : 'rss');
- $out .= "\n";
- }
-
- if ($truncate_lines) {
- $out =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
- }
-
- return $out;
-}
-
-
-sub rss_field_to_html($) {
- my ($body) = @_;
-
- # If <![CDATA[...]]> is present, everything inside that is HTML,
- # and not double-encoded.
- #
- if ($body =~ m/^\s*<!\[CDATA\[(.*?)\]\s*\]/is) {
- $body = $1;
- } else {
- $body = de_entify ($body); # convert entities to get HTML from XML
- }
-
- return $body;
-}
-
-
-sub reformat_text($) {
- my ($body) = @_;
-
- # only re-wrap if --cols was specified. Otherwise, dump it as is.
- #
- if ($wrap_columns && $wrap_columns > 0) {
- print STDERR "$progname: wrapping at $wrap_columns...\n" if ($verbose > 2);
- $Text::Wrap::columns = $wrap_columns;
- $Text::Wrap::break = '[\s/]'; # wrap on slashes for URLs
- $body = wrap ("", "", $body);
- $body =~ s/[ \t]+$//gm;
- }
-
- if ($truncate_lines) {
- $body =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
- }
-
- $body = utf8_to_latin1($body) if ($latin1_p);
- $body =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
- return $body;
-}
-
-
-# Figure out what the proxy server should be, either from environment
-# variables or by parsing the output of the (MacOS) program "scutil",
-# which tells us what the system-wide proxy settings are.
-#
-sub set_proxy($) {
- my ($ua) = @_;
-
- my $proxy_data = `scutil --proxy 2>/dev/null`;
- foreach my $proto ('http', 'https') {
- my ($server) = ($proxy_data =~ m/\b${proto}Proxy\s*:\s*([^\s]+)/si);
- my ($port) = ($proxy_data =~ m/\b${proto}Port\s*:\s*([^\s]+)/si);
- my ($enable) = ($proxy_data =~ m/\b${proto}Enable\s*:\s*([^\s]+)/si);
-
- if ($server && $enable) {
- # Note: this ignores the "ExceptionsList".
- my $proto2 = 'http';
- $ENV{"${proto}_proxy"} = ("${proto2}://" . $server .
- ($port ? ":$port" : "") . "/");
- print STDERR "$progname: MacOS $proto proxy: " .
- $ENV{"${proto}_proxy"} . "\n"
- if ($verbose > 2);
- }
- }
-
- $ua->env_proxy();
-}
-
-
-sub get_url_text($) {
- my ($url) = @_;
-
- my $ua = eval 'LWP::UserAgent->new';
-
- if (! $ua) {
- print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
- "\n\tsudo cpan LWP::UserAgent" .
- " LWP::Protocol::https Mozilla::CA\n\n");
- return;
- }
-
- # Half the time, random Linux systems don't have Mozilla::CA installed,
- # which results in "Can't verify SSL peers without knowning which
- # Certificate Authorities to trust".
- #
- # I'm going to take a controversial stand here and say that, for the
- # purposes of plain-text being displayed in a screen saver via RSS,
- # the chances of a certificate-based man-in-the-middle attack having
- # a malicious effect on anyone anywhere at any time is so close to
- # zero that it can be discounted. So, just don't bother validating
- # SSL connections.
- #
- $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
- eval {
- $ua->ssl_opts (verify_hostname => 0, SSL_verify_mode => 0);
- };
-
-
- set_proxy ($ua);
- $ua->agent ("$progname/$version");
- my $res = $ua->get ($url);
- my $body;
- my $ct;
-
- if ($res && $res->is_success) {
- $body = $res->decoded_content || '';
- $ct = $res->header ('Content-Type') || 'text/plain';
-
- } else {
- my $err = ($res ? $res->status_line : '') || '';
- $err = 'unknown error' unless $err;
- $err = "$url: $err";
- # error ($err);
- $body = "Error loading URL $err\n\n";
- $ct = 'text/plain';
- }
-
- # This is not necessary, since HTTP::Message::decoded_content() has
- # already done 'decode (<charset-header>, $body)'.
- # utf8::decode ($body); # Pack multi-byte UTF-8 back into wide chars.
-
- $ct = guess_content_type ($ct, $body);
- if ($ct eq 'html') {
- print STDERR "$progname: converting HTML...\n" if ($verbose > 2);
- $body = reformat_html ($body, 0);
- } elsif ($ct eq 'rss') {
- $body = reformat_rss ($body);
- } else {
- print STDERR "$progname: plain text...\n" if ($verbose > 2);
- $body = reformat_text ($body);
- }
- print STDOUT $body;
-}
-
-
-
-sub error($) {
- my ($err) = @_;
- print STDERR "$progname: $err\n";
- exit 1;
-}
-
-sub usage() {
- print STDERR "usage: $progname [ --options ... ]\n" .
- ("\n" .
- " Prints out some text for use by various screensavers,\n" .
- " according to the options in the ~/.xscreensaver file.\n" .
- " This may dump the contents of a file, run a program,\n" .
- " or load a URL.\n".
- "\n" .
- " Options:\n" .
- "\n" .
- " --date Print the host name and current time.\n" .
- "\n" .
- " --text STRING Print out the given text. It may contain %\n" .
- " escape sequences as per strftime(2).\n" .
- "\n" .
- " --file PATH Print the contents of the given file.\n" .
- " If --cols is specified, re-wrap the lines;\n" .
- " otherwise, print them as-is.\n" .
- "\n" .
- " --program CMD Run the given program and print its output.\n" .
- " If --cols is specified, re-wrap the output.\n" .
- "\n" .
- " --url HTTP-URL Download and print the contents of the HTTP\n" .
- " document. If it contains HTML, RSS, or Atom,\n" .
- " it will be converted to plain-text.\n" .
- "\n" .
- " --cols N Wrap lines at this column. Default 72.\n" .
- "\n" .
- " --lines N No more than N lines of output.\n" .
- "\n" .
- " --latin1 Emit Latin1 instead of UTF-8.\n" .
- "\n");
- exit 1;
-}
-
-sub main() {
-
- my $load_p = 1;
- my $cocoa_id = undef;
-
- while ($#ARGV >= 0) {
- $_ = shift @ARGV;
- if ($_ eq "--verbose") { $verbose++; }
- elsif (m/^-v+$/) { $verbose += length($_)-1; }
- elsif (m/^--?date$/) { $text_mode = 'date';
- $load_p = 0; }
- elsif (m/^--?text$/) { $text_mode = 'literal';
- $text_literal = shift @ARGV || '';
- $text_literal =~ s@\\n@\n@gs;
- $text_literal =~ s@\\\n@\n@gs;
- $load_p = 0; }
- elsif (m/^--?file$/) { $text_mode = 'file';
- $text_file = shift @ARGV || '';
- $load_p = 0; }
- elsif (m/^--?program$/) { $text_mode = 'program';
- $text_program = shift @ARGV || '';
- $load_p = 0; }
- elsif (m/^--?url$/) { $text_mode = 'url';
- $text_url = shift @ARGV || '';
- $load_p = 0; }
- elsif (m/^--?col(umn)?s?$/) { $wrap_columns = 0 + shift @ARGV; }
- elsif (m/^--?lines?$/) { $truncate_lines = 0 + shift @ARGV; }
- elsif (m/^--?cocoa$/) { $cocoa_id = shift @ARGV; }
- elsif (m/^--?latin1$/) { $latin1_p++; }
- elsif (m/^--?nyarlathotep$/) { $nyarlathotep_p++; }
- elsif (m/^-./) { usage; }
- else { usage; }
- }
-
- if ($load_p) {
-
- if (!defined ($cocoa_id)) {
- # see OSX/XScreenSaverView.m
- $cocoa_id = $ENV{XSCREENSAVER_CLASSPATH};
- }
-
- if (defined ($cocoa_id)) {
- get_cocoa_prefs($cocoa_id);
- } else {
- get_x11_prefs();
- }
- }
-
- output();
-
-
- if (defined ($cocoa_id)) {
- #
- # On MacOS, sleep for 10 seconds between when the last output is
- # printed, and when this process exits. This is because MacOS
- # 10.5.0 and later broke ptys in a new and exciting way: basically,
- # once the process at the end of the pty exits, you have exactly
- # 1 second to read all the queued data off the pipe before it is
- # summarily flushed.
- #
- # Many of the screen savers were written to depend on being able
- # to read a small number of bytes, and continue reading until they
- # reached EOF. This is no longer possible.
- #
- # Note that the current MacOS behavior has all four of these
- # awesome properties: 1) Inconvenient; 2) Has no sane workaround;
- # 3) Different behavior than MacOS 10.1 through 10.4; and 4)
- # Different behavior than every other Unix in the world.
- #
- # See http://jwz.org/b/DHke, and for those of you inside Apple,
- # "Problem ID 5606018".
- #
- # One workaround would be to rewrite the savers to have an
- # internal buffer, and always read as much data as possible as
- # soon as a pipe has input available. However, that's a lot more
- # work, so instead, let's just not exit right away, and hope that
- # 10 seconds is enough.
- #
- # This will solve the problem for invocations of xscreensaver-text
- # that produce little output (e.g., date-mode); and won't solve it
- # in cases where a large amount of text is generated in a short
- # amount of time (e.g., url-mode.)
- #
- sleep (10);
- }
-}
-
-main();
-exit 0;
diff --git a/driver/xscreensaver-text.man b/driver/xscreensaver-text.man
deleted file mode 100644
index dcedc3b..0000000
--- a/driver/xscreensaver-text.man
+++ /dev/null
@@ -1,85 +0,0 @@
-.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
-.SH NAME
-xscreensaver\-text - prints some text to stdout, for use by screen savers.
-.SH SYNOPSIS
-.B xscreensaver\-text
-[\--verbose]
-[\--columns \fIN\fP]
-[\--text \fISTRING\fP]
-[\--file \fIPATH\fP]
-[\--program \fICMD\fP]
-[\--url \fIURL\fP]
-.SH DESCRIPTION
-The \fIxscreensaver\-text\fP script prints out some text for use by
-various screensavers, according to the options set in the ~/.xscreensaver
-file. This may dump the contents of a file, run a program, or load a URL.
-.SH OPTIONS
-.I xscreensaver\-text
-accepts the following options:
-.TP 8
-.B \-\-columns \fIN\fP or \-\-cols \fIN\fP
-Where to wrap lines; default 72 columns.
-.TP 8
-.B \-\-verbose \fRor\fP \-v
-Print diagnostics to stderr. Multiple \fI-v\fP switches increase the
-amount of output.
-.PP
-Command line options may be used to override the settings in the
-~/.xscreensaver file:
-.TP 8
-.B \-\-string \fISTRING\fP
-Print the given string. It may contain % escape sequences as per
-.BR strftime (2).
-.TP 8
-.B \-\-file \fIPATH\fP
-Print the contents of the given file. If --cols is specified, re-wrap
-the lines; otherwise, print them as-is.
-.TP 8
-.B \-\-program \fICMD\fP
-Run the given program and print its output. If --cols is specified,
-re-wrap the output.
-.TP 8
-.B \-\-url \fIHTTP-URL\fP
-Download and print the contents of the HTTP document. If it contains
-HTML, RSS, or Atom, it will be converted to plain-text.
-
-Note: this re-downloads the document every time it is run! It might
-be considered abusive for you to point this at a web server that you
-do not control!
-.SH ENVIRONMENT
-.PP
-.TP 4
-.B HTTP_PROXY\fR or \fPhttp_proxy
-to get the default HTTP proxy host and port.
-.SH BUGS
-The RSS and Atom output is always ISO-8859-1, regardless of locale.
-
-URLs should be cached, use "If-Modified-Since", and obey "Expires".
-.SH SEE ALSO
-.BR xscreensaver-demo (1),
-.BR xscreensaver (1),
-.BR fortune (1),
-.BR phosphor (MANSUFFIX),
-.BR apple2 (MANSUFFIX),
-.BR starwars (MANSUFFIX),
-.BR fontglide (MANSUFFIX),
-.BR dadadodo (1),
-.BR webcollage (MANSUFFIX),
-.RS 0
-.I http://www.livejournal.com/stats/latest-rss.bml,
-.RS 0
-.I https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss,
-.RS 0
-.BR driftnet (1),
-.BR EtherPEG ,
-.BR EtherPeek
-.SH COPYRIGHT
-Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 20-Mar-2005.
diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c
index 5eb7167..b5e85a6 100644
--- a/driver/xscreensaver.c
+++ b/driver/xscreensaver.c
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright © 1991-2023 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -8,7 +8,9 @@
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
+ * ==========================================================================
* XScreenSaver Daemon, version 6.
+ * ==========================================================================
*
* Having started its life in 1991, XScreenSaver acquired a lot of optional
* features to allow it to detect user activity, lock the screen and
@@ -101,6 +103,95 @@
* causes the screen to lock, and how video players request that blanking
* be inhibited. This program invokes "xscreensaver-command" as needed
* to pass those requests along to "xscreensaver" via ClientMessages.
+ *
+ *
+ * ==========================================================================
+ * Ancient History
+ * ==========================================================================
+ *
+ * As mentioned above, XScreenSaver version 6 (released in 2021) requires
+ * the XInput 2 server extension for idle detection and password input.
+ * In XScreenSaver 5 and earlier (1991 through 2020), idle-detection was
+ * far more convoluted. Basically, we selected input events on every window,
+ * and noticed when new windows were created so that we could track them too.
+ * Over the decades, there have also been three optional X11 server extensions
+ * that were applicable to screen saving:
+ *
+ * - XIdle
+ *
+ * This extension provided a function to poll the user's idle time.
+ * It was simple and direct and worked great. Therefore, it was
+ * removed from the X11 distribution in 1994, with the release of
+ * X11R6. https://bugs.freedesktop.org/show_bug.cgi?id=1419
+ *
+ * - SGI SCREEN_SAVER
+ *
+ * This extension sent two new events: "user is idle", and "user is no
+ * longer idle". It was simple and direct and worked great. But as
+ * the name implies, it only ever worked on Silicon Graphics machines.
+ * SGI became irrelevant around 1998 and went out of business in 2009.
+ *
+ * - MIT-SCREEN-SAVER
+ *
+ * This extension still exists, but it is useless to us. Since it still
+ * exists, people sometimes ask why XScreenSaver no longer makes use of it.
+ * The MIT-SCREEN-SAVER extension took the following approach:
+ *
+ * - When the user is idle, immediately map full screen black windows
+ * on each screen.
+ *
+ * - Inform the screen saver client that the screen is now black.
+ *
+ * - When user activity occurs, unmap the windows and then inform the
+ * screen saver client.
+ *
+ * The screen saver client was able to specify a few parameters of that
+ * window, like visual and depth, but that was all.
+ *
+ * The extension was designed with the assumption that a screen saver would
+ * render onto the provided window. However:
+ *
+ * - OpenGL programs may require different visuals than 2D X11 programs,
+ * and you can't change the visual of a window after it has been
+ * created.
+ *
+ * - The extension mapped one window per X11 "Screen", which, in this
+ * modern world, tend to span the entire virtual desktop; whereas
+ * XScreenSaver runs savers full screen on each *monitor* instead.
+ * In other words, it was incompatible with Xinerama / RANDR.
+ *
+ * - Since this extension mapped its own full-screen black windows and
+ * informed us of that after the fact, it precluded "fade" and "unfade"
+ * animations from being implemented.
+ *
+ * - Since it only told us when the user was idle or non-idle, it
+ * precluded the "hysteresis" option from being implemented (ignoring
+ * tiny mouse motions).
+ *
+ * In summary, it created its windows too early, removed them too late,
+ * created windows of the wrong quantity and wrong shape, could not create
+ * them with the proper visuals, and delivered too little information about
+ * what caused the user activity.
+ *
+ * Also, the MIT-SCREEN-SAVER extension was flaky, and using it at all led
+ * to frequent server crashes. Worse, those server crashes were highly
+ * dependent on your particular video driver.
+ *
+ * So that's why, even if the server supports the MIT-SCREEN-SAVER
+ * extension, we don't use it.
+ *
+ * Some video players attempt to inhibit blanking during playback by
+ * calling XResetScreenSaver and/or XScreenSaverSuspend, which affect
+ * only the X server's *built-in* screen saver, and the window created
+ * by the MIT-SCREEN-SAVER extension. To rely upon those calls alone
+ * and then call it a day would betray a willful ignorance of why the
+ * MIT-SCREEN-SAVER extension is a useless foundation upon which to
+ * build a screen saver or screen locker.
+ *
+ * Fortunately, every modern video player and web browser also makes
+ * use of systemd / logind / dbus to request blanking inhibition, and
+ * we receive those requests via our systemd integration in
+ * xscreensaver-systemd (which see).
*/
#ifdef HAVE_CONFIG_H
@@ -134,6 +225,10 @@
# include <sys/wait.h> /* for waitpid() and associated macros */
#endif
+#ifndef HAVE_XINPUT
+# error The XInput2 extension is required
+#endif
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
@@ -168,6 +263,7 @@ static const char *version_number = 0;
/* Preferences. */
static Bool lock_p = False;
static Bool locking_disabled_p = False;
+static Bool blanking_disabled_p = False;
static unsigned int blank_timeout = 0;
static unsigned int lock_timeout = 0;
static unsigned int pointer_hysteresis = 0;
@@ -456,8 +552,10 @@ handle_sigchld (Display *dpy, Bool blanked_p)
int ac = 0;
av[ac++] = SAVER_GFX_PROGRAM;
av[ac++] = "--emergency";
- if (verbose_p) av[ac++] = "--verbose";
- if (debug_p) av[ac++] = "--debug";
+ if (verbose_p) av[ac++] = "--verbose";
+ if (verbose_p > 1) av[ac++] = "--verbose";
+ if (verbose_p > 2) av[ac++] = "--verbose";
+ if (debug_p) av[ac++] = "--debug";
av[ac] = 0;
fprintf (stderr, "%s: pid %lu: " SAVER_GFX_PROGRAM
" exited unexpectedly %s: re-launching\n",
@@ -582,7 +680,9 @@ print_banner(void)
/* Hey jerks, the only time someone will see this particular
message is if they are running xscreensaver with '-log' in
order to send me a bug report, and they had damned well
- better try the latest release before they do that. */
+ better try the latest release before they do that --
+ even if your perma-out-of-date distro does not make that
+ easily available to them. */
"\t ###################################################\n"
"\t ### ###\n"
"\t ### THIS VERSION IS VERY OLD! PLEASE UPGRADE! ###\n"
@@ -684,20 +784,24 @@ static void init_line_handler (int lineno,
const char *key, const char *val,
void *closure)
{
+ if (*key == '*' || *key == '.') key++; /* Xrm wildcards */
+
if (!strcmp (key, "verbose")) verbose_p = !strcasecmp (val, "true");
else if (!strcmp (key, "splash")) splash_p = !strcasecmp (val, "true");
else if (!strcmp (key, "lock")) lock_p = !strcasecmp (val, "true");
+ else if (!strcmp (key, "mode")) blanking_disabled_p =
+ !strcasecmp (val, "off");
else if (!strcmp (key, "timeout"))
{
int t = parse_time (val);
if (t > 0) blank_timeout = t;
}
- if (!strcmp (key, "lockTimeout"))
+ else if (!strcmp (key, "lockTimeout"))
{
int t = parse_time (val);
if (t >= 0) lock_timeout = t;
}
- if (!strcmp (key, "pointerHysteresis"))
+ else if (!strcmp (key, "pointerHysteresis"))
{
int i = atoi (val);
if (i >= 0)
@@ -882,7 +986,9 @@ ensure_no_screensaver_running (Display *dpy)
&& type != None
&& (!strcmp ((char *) version, "gnome-screensaver") ||
!strcmp ((char *) version, "mate-screensaver") ||
- !strcmp ((char *) version, "cinnamon-screensaver")))
+ !strcmp ((char *) version, "cinnamon-screensaver") ||
+ !strcmp ((char *) version, "xfce4-screensaver") ||
+ !strcmp ((char *) version, "light-locker")))
{
fprintf (stderr,
"%s: \"%s\" is already running on display %s"
@@ -1130,7 +1236,7 @@ ungrab_mouse (Display *dpy)
/* Some remote desktop clients (e.g., "rdesktop") hold the keyboard GRABBED the
whole time they have focus! This is idiotic because the whole point of
grabbing is to get events when you do *not* have focus, so grabbing only
- when* you have focus is redundant. Anyway, that prevents us from getting a
+ *when* you have focus is redundant. Anyway, that prevents us from getting a
keyboard grab. It turns out that for some of these apps, de-focusing them
forces them to release their grab.
@@ -1261,14 +1367,14 @@ grab_keyboard_and_mouse (Screen *screen)
because I'm not completely convinced it is a safe thing to do.
*/
- if (kstatus != GrabSuccess) /* Do not blank without a kbd grab. */
+ if (kstatus != GrabSuccess) /* Do not blank without a kbd grab. */
{
/* If we didn't get both grabs, release the one we did get. */
ungrab_keyboard_and_mouse (dpy);
return False;
}
- return True; /* Grab is good, go ahead and blank. */
+ return True; /* Grab is good, go ahead and blank. */
}
@@ -1304,6 +1410,8 @@ static void
maybe_disable_locking (Display *dpy)
{
const char *why = 0;
+ Bool wayland_p = (getenv ("WAYLAND_DISPLAY") ||
+ getenv ("WAYLAND_SOCKET"));
# ifdef NO_LOCKING
why = "locking disabled at compile time";
@@ -1322,7 +1430,7 @@ maybe_disable_locking (Display *dpy)
/* X11 grabs don't work under Wayland's embedded X11 server. The Wayland
window manager lives at a higher level than the X11 emulation layer. */
- if (!why && getenv ("WAYLAND_DISPLAY"))
+ if (!why && wayland_p)
why = "cannot lock securely under Wayland";
if (!why)
@@ -1344,6 +1452,25 @@ maybe_disable_locking (Display *dpy)
fprintf (stderr, "%s: DEBUG MODE: allowing locking anyway!\n",
blurb());
}
+ else if (wayland_p)
+ {
+ const char *s = blurb();
+ locking_disabled_p = True;
+
+ /* Maybe we should just refuse to launch instead? We can operate
+ properly only if the user uses only X11 programs, and doesn't
+ want to lock the screen.
+ */
+ fprintf (stderr, "\n"
+ "%s: WARNING: Wayland is not supported.\n"
+ "\n"
+ "%s: Under Wayland, idle-detection fails when non-X11\n"
+ "%s: programs are selected, meaning the screen may\n"
+ "%s: blank prematurely. Also, locking is impossible.\n"
+ "%s: See the manual for instructions on configuring\n"
+ "%s: your system to use X11 instead of Wayland.\n\n",
+ s, s, s, s, s, s);
+ }
else
{
locking_disabled_p = True;
@@ -1377,6 +1504,14 @@ main_loop (Display *dpy)
if (! init_xinput (dpy, &xi_opcode))
saver_exit (1);
+ /* Disable server built-in screen saver. */
+ XSetScreenSaver (dpy, 0, 0, 0, 0);
+ XForceScreenSaver (dpy, ScreenSaverReset);
+
+ /* It would be nice to sync the server's DPMS settings here to what is
+ specified in the .xscreensaver file, but xscreensaver-gfx handles that,
+ so that won't happen until the first time the screen blanks. */
+
create_daemon_window (dpy);
handle_signals();
@@ -1402,7 +1537,7 @@ main_loop (Display *dpy)
saver_auth_pid = fork_and_exec (dpy, ac, av);
}
-# ifdef HAVE_LIBSYSTEMD
+# if defined(HAVE_LIBSYSTEMD) || defined(HAVE_LIBELOGIND)
/* Launch xscreensaver-systemd at startup. */
{
char *av[10];
@@ -1413,7 +1548,7 @@ main_loop (Display *dpy)
av[ac] = 0;
saver_systemd_pid = fork_and_exec (dpy, ac, av);
}
-# endif /* HAVE_LIBSYSTEMD */
+# endif /* HAVE_LIBSYSTEMD || HAVE_LIBELOGIND */
/* X11 errors during startup initialization were fatal.
@@ -1629,9 +1764,9 @@ main_loop (Display *dpy)
linking with additional libraries, doing additional X
protocol, and also some finicky error handling, since
the DPMS extension is a pain in the ass. So instead,
- I made xscreensaver-command do that instead. This
- somewhat breaks the abstraction of ClientMessage
- handling, but it's more robust. */
+ I made xscreensaver-command:reset_dpms_timer() do that
+ instead. This somewhat breaks the abstraction of
+ ClientMessage handling, but it's more robust. */
}
else if (msg == XA_LOCK)
{
@@ -1800,6 +1935,9 @@ main_loop (Display *dpy)
case XI_RawKeyRelease:
case XI_RawButtonPress:
case XI_RawButtonRelease:
+ case XI_RawTouchBegin:
+ case XI_RawTouchEnd:
+ case XI_RawTouchUpdate:
if (current_state != AUTH && /* logged by xscreensaver-auth */
(verbose_p > 1 ||
(verbose_p && now - active_at > 1)))
@@ -1892,7 +2030,8 @@ main_loop (Display *dpy)
(lock_p &&
now >= active_at + blank_timeout + lock_timeout)))
{
- fprintf (stderr, "%s: locking\n", blurb());
+ if (verbose_p)
+ fprintf (stderr, "%s: locking\n", blurb());
if (grab_keyboard_and_mouse (mouse_screen (dpy)))
{
current_state = LOCKED;
@@ -1909,16 +2048,25 @@ main_loop (Display *dpy)
else if (force_blank_p ||
now >= active_at + blank_timeout)
{
- fprintf (stderr, "%s: blanking\n", blurb());
- if (grab_keyboard_and_mouse (mouse_screen (dpy)))
+ if (blanking_disabled_p && !force_blank_p)
{
- current_state = BLANKED;
- blanked_at = now;
- store_saver_status (dpy, True, False, now);
+ if (verbose_p)
+ fprintf (stderr, "%s: not blanking: disabled\n", blurb());
}
else
- fprintf (stderr, "%s: unable to grab -- blanking aborted!\n",
- blurb());
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: blanking\n", blurb());
+ if (grab_keyboard_and_mouse (mouse_screen (dpy)))
+ {
+ current_state = BLANKED;
+ blanked_at = now;
+ store_saver_status (dpy, True, False, now);
+ }
+ else
+ fprintf (stderr, "%s: unable to grab -- blanking aborted!\n",
+ blurb());
+ }
}
if (current_state == BLANKED || current_state == LOCKED)
@@ -1930,9 +2078,11 @@ main_loop (Display *dpy)
char *av[20];
int ac = 0;
av[ac++] = SAVER_GFX_PROGRAM;
- if (first_time_p) av[ac++] = "--init";
- if (verbose_p) av[ac++] = "--verbose";
- if (debug_p) av[ac++] = "--debug";
+ if (first_time_p) av[ac++] = "--init";
+ if (verbose_p) av[ac++] = "--verbose";
+ if (verbose_p > 1) av[ac++] = "--verbose";
+ if (verbose_p > 2) av[ac++] = "--verbose";
+ if (debug_p) av[ac++] = "--debug";
if (blank_mode == XA_NEXT)
av[ac++] = "--next";
@@ -2218,6 +2368,15 @@ main (int argc, char **argv)
{
logfile = argv[++i];
if (!logfile) goto HELP;
+ if (! verbose_p) /* might already be -vv */
+ verbose_p = cmdline_verbose_p = cmdline_verbose_val = True;
+ }
+ else if (!strcmp (argv[i], "-ver") ||
+ !strcmp (argv[i], "-vers") ||
+ !strcmp (argv[i], "-version"))
+ {
+ fprintf (stderr, "%s\n", screensaver_id+4);
+ exit (1);
}
else if (!strcmp (argv[i], "-d") ||
!strcmp (argv[i], "-dpy") ||
@@ -2244,6 +2403,7 @@ main (int argc, char **argv)
"\t\t--verbose\n"
"\t\t--no-splash\n"
"\t\t--log logfile\n"
+ "\t\t--version\n"
"\n"
"\tRun 'xscreensaver-settings' to configure.\n"
"\n");
diff --git a/driver/xscreensaver.desktop.in b/driver/xscreensaver.desktop.in
new file mode 100755
index 0000000..6fcb30a
--- /dev/null
+++ b/driver/xscreensaver.desktop.in
@@ -0,0 +1,9 @@
+#!/usr/bin/env xdg-open
+[Desktop Entry]
+Exec=xscreensaver
+Icon=xscreensaver
+_Name=XScreenSaver
+_Comment=XScreenSaver daemon: screen saver and locker
+Type=Application
+Categories=Screensaver;Security;GNOME;GTK;KDE;Motif;Qt
+Terminal=false
diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man
index 9c3bdd0..572c727 100644
--- a/driver/xscreensaver.man
+++ b/driver/xscreensaver.man
@@ -1,10 +1,11 @@
-.TH XScreenSaver 1 "6-Jan-2021 (6.00)" "X Version 11"
+.TH XScreenSaver 1 "6-Jan-2022 (6.00)" "X Version 11"
.SH NAME
xscreensaver - extensible screen saver and screen locking framework
.SH SYNOPSIS
.B xscreensaver
[\-\-display \fIhost:display.screen\fP] \
[\-\-verbose] \
+[\-\-version] \
[\-\-no\-splash] \
[\-\-log \fIfilename\fP]
.SH DESCRIPTION
@@ -24,7 +25,6 @@ program.
xscreensaver-settings
.sp
.fi
-
.SH HOW IT WORKS
When it is time to activate the screensaver, a full-screen black window is
created that covers each monitor. A sub-process is launched for each one
@@ -39,291 +39,223 @@ the running subprocesses are killed.
The display modes are run at a low process priority, and spend most of their
time sleeping/idle by default, so they should not consume significant system
resources.
-
.SH COMMAND-LINE OPTIONS
.TP 8
-.B \-\-display \fIhost:display.screen\fP
+.B \-\-display\fP \fIhost:display.screen\fP
The X display to use. For displays with multiple screens, XScreenSaver
will manage all screens on the display simultaneously.
.TP 8
.B \-\-verbose
Print diagnostics to stderr.
.TP 8
-.B \-\-log \fIfilename\fP
+.B \-\-version\fP
+Print the version number and exit.
+.TP 8
+.B \-\-log\fP \fIfilename\fP
Append all diagnostic output to the given file. This also
implies \fI\-\-verbose\fP. Use this when reporting bugs.
.TP 8
.B \-\-no\-splash
Don't display the splash screen at startup.
-
.SH POWER MANAGEMENT
The
.BR xscreensaver\-settings (1)
program is where you configure if and when your monitor should power off.
It saves the settings in your \fI~/.xscreensaver\fP file.
-
-If the power management section is grayed out in the
-.BR xscreensaver\-settings (1)
-window, then that means that your X server does not support
-the XDPMS extension, and so control over the monitor's power state
-is not available.
-
-When the monitor is powered down, the display hacks are stopped
-(though it may take a minute or two for XScreenSaver to notice).
-
-Note: if you use
+Do not use
.BR xset (1)
-to change the power management settings, XScreenSaver will override those
-changes. Whatever is in the \fI~/.xscreensaver\fP file takes precedence.
+to manually change the power management settings, that won't work.
+When the monitor is powered down, the display hacks will stop running
+(though it may take a minute or two for XScreenSaver to notice).
.SH LAPTOP LIDS
-If your system has
+If your system uses
.BR systemd (1)
-221 or newer, or
+or
.BR elogind (8),
then closing the lid of your laptop will cause the screen to lock immediately.
If not, then the screen might not lock until a few seconds \fIafter\fP you
-re-open the lid. Which is less than ideal. So if you don't
-use \fIsystemd\fP, you might want to get in the habit of
-doing \fIxscreensaver-command --lock\fP before closing the lid.
-
+re-open the lid. Which is less than ideal. So if you do not have
+.BR systemd (1),
+you might want to get in the habit of manually locking your screen
+\fIbefore\fP closing the lid (\fIxscreensaver\-command\ \-\-lock\fP).
.SH PLAYING VIDEOS
Likewise, if you have
.BR systemd (1)
-221 or newer, or
+or
.BR elogind (8),
then all of the popular video players and web browsers will
prevent XScreenSaver from blanking the screen while video is playing.
Both of these features require that
.BR xscreensaver\-systemd (MANSUFFIX)
-be able connect to the systemd bus. Parts of KDE and GNOME may need to be
-disabled first for that to work; see below.
-
+be able connect to D-Bus.
.SH INSTALLATION
Each desktop environment has its own system for launching long-running
daemons like XScreenSaver, and since many of them come bundled with
their own (buggy, insecure, inferior) screen-locking frameworks, it is
also necessary to disable those other frameworks before XScreenSaver
can work.
-
.SS INSTALLING XSCREENSAVER ON GNOME OR UNITY
-For many years, GNOME shipped XScreenSaver as-is, and everything just worked.
-In 2005, however, they decided to needlessly re-invent the wheel and ship
-their own replacement for the \fIxscreensaver\fP daemon called
-.BR gnome-screensaver (1)
-rather than improving XScreenSaver and contributing their changes back. As a
-result, the \fIgnome-screensaver\fP program is insecure, bug-ridden, and
-missing many features of XScreenSaver. In fact, in 2011 it lost the ability
-to run display modes at all.
-
-In 2012 some distros forked and renamed it as both
-.BR mate-screensaver (1)
-and
-.BR cinnamon-screensaver (1),
-which seem to be basically the same.
-
-To replace gnome-screensaver with XScreenSaver:
+For many years, GNOME included XScreenSaver as-is, and everything just worked.
+Not any more!
.RS 4
.TP 3
\fB1: Fully uninstall the other screen saver packages:\fP
.nf
.sp
- sudo apt-get remove gnome-screensaver
- sudo apt-get remove mate-screensaver
- sudo apt-get remove cinnamon-screensaver
+ sudo apt remove gnome-screensaver
+ sudo apt remove mate-screensaver
+ sudo apt remove cinnamon-screensaver
+ sudo apt remove light-locker
or
sudo rpm -e gnome-screensaver
sudo rpm -e mate-screensaver
sudo rpm -e cinnamon-screensaver
+ sudo rpm -e light-locker
.sp
.fi
Be careful that it doesn't try to uninstall all of GNOME.
-
-.TP 3
-\fB2: Launch XScreenSaver at login.\fP
-
-Select "\fIStartup Applications\fP" from the menu (or manually
-launch "\fIgnome-session-properties\fP") and add "\fIxscreensaver\fP".
-
-Do this as your normal user account, not as root.
-(This should go without saying, because you should never, ever, ever
-be logged in to the graphical desktop as user "root".)
.TP 3
-\fB3: Make GNOME's "Lock Screen" use XScreenSaver.\fP
-.nf
-.sp
- sudo ln -sf /usr/bin/xscreensaver-command \\
- /usr/bin/gnome-screensaver-command
-.sp
-.fi
-That doesn't work under Unity, though. Apparently it has its own
-built-in screen locker which is not gnome-screensaver, and cannot be
-removed, and yet still manages to be bug-addled and insecure.
-Keep reinventing that wheel, guys! (If you have figured out how to
-replace Unity's locking "feature" with XScreenSaver, let me know.)
-
-.TP 3
-\fB4: Turn off Unity's built-in blanking.\fP
+\fB2: Turn off GNOME's built-in blanking.\fP
+Set all of the following settings to "\fINever\fP" or "\fIOff\fP", as
+these are all controlled by
+.BR xscreensaver\-settings (1)
+now:
-Open "\fISystem Settings / Brightness & Lock\fP";
-.br
-Un-check "\fIStart Automatically\fP";
+"\fISettings / Privacy / Screen Lock / Blank Screen Delay\fP"
.br
-Set \fI"Turn screen off when inactive for"\fP to \fI"Never".\fP
+"\fISettings / Privacy / Screen Lock / Automatic Screen Lock\fP"
.br
-Or possibly that has been randomly renamed again:
+"\fISettings / Power / Blank Screen\fP"
.br
-Set "\fISettings / Power / Power Settings\fP" to \fI"Never".\fP
+"\fISettings / Power / Automatic Suspend\fP"
+.TP 3
+\fB3: Launch XScreenSaver at login.\fP
+Launch "\fITweaks\fP", select "\fIStartup Applications\fP", click the plus
+sign, and select "\fIXScreenSaver\fP" (not "\fIXScreenSaver Settings\fP")
+from the (very long) menu.
+
+Or, see the "\fILAUNCHING XSCREENSAVER FROM SYSTEMD\fP" section below.
+That works too.
.TP 3
-\fB5: Stop GNOME from blocking XScreenSaver's "systemd" integration:\fP
+\fB4: Make GNOME's "Lock" icon use XScreenSaver.\fP
+This used to work, but no longer does with GNOME 3.38. If you figure it out,
+let me know! This still works for Cinnamon 4.8 and MATE 1.24:
.nf
.sp
- sudo systemctl \-\-user mask gsd\-screensaver\-proxy.service
+ sudo ln -sf /usr/bin/xscreensaver-command \\
+ /usr/bin/gnome-screensaver-command
+ sudo ln -sf /usr/bin/xscreensaver-command \\
+ /usr/bin/cinnamon-screensaver-command
+ sudo ln -sf /usr/bin/xscreensaver-command \\
+ /usr/bin/mate-screensaver-command
+ sudo ln -sf /usr/bin/xscreensaver-command \\
+ /usr/bin/xfce4-screensaver-command
+ sudo ln -sf /usr/bin/xscreensaver-command \\
+ /usr/bin/light-locker-command
.sp
.fi
-Without the above, video players will not be able to tell XScreenSaver
-not to blank the screen while videos are playing, and the screen will not
-auto-lock when you close your laptop's lid.
-
-After running that command, reboot. Yes, you have to reboot; it won't let
-you simply stop the service. Logging out won't do it either.
-
+This change will get blown away when you upgrade.
.SS INSTALLING XSCREENSAVER ON KDE
-Like GNOME, KDE also decided to invent their own screen saver framework
-from scratch instead of simply using XScreenSaver. To replace the KDE
+Like GNOME, KDE also decided to re-invent the wheel. To replace the KDE
screen saver with XScreenSaver, do the following:
.RS 4
.TP 3
-\fB1: Turn off KDE's screen saver.\fP
-Open the "\fIControl Center\fP" and
-select the "\fIAppearance & Themes / Screensaver\fP" page.
-Un-check "\fIStart Automatically\fP".
-
-Or possibly:
-Open "\fISystem Settings\fP" and
-select "\fIScreen Locking\fP".
-Un-check "\fILock Screen Automatically\fP".
-.TP 3
-\fB2: Find your Autostart directory.\fP
-Open the "\fISystem Administration / Paths\fP" page,
-and see what your "Autostart path" is set to: it will
-probably be something like \fI~/.kde/Autostart/\fP
-or \fI~/.config/autostart/\fP
-
-If that doesn't work, then try this:
+\fB1: Turn off KDE's built-in blanking.\fP
+In \fISystem Settings\fP, un-check the following items, as these are
+controlled by
+.BR xscreensaver\-settings (1)
+now:
-Open "\fISystem Settings / Startup/Shutdown / Autostart\fP", and then
-add "\fI/usr/bin/xscreensaver\fP".
+"\fIWorkspace Behavior / Screen Locking / Lock automatically\fP"
+.br
+"\fIWorkspace Behavior / Screen Locking / After waking from sleep\fP"
+.br
+"\fIWorkspace Behavior / Screen Locking / Keyboard shortcut\fP"
+.br
+"\fIHardware / Power Management / Screen Energy Saving\fP"
+.br
+"\fIHardware / Power Management / Suspend session\fP"
+.br
+"\fIHardware / Power Management / Laptop lid closed" = Do Nothing\fP
-If you are lucky, that will create a \fI"xscreensaver.desktop"\fP file
-for you in \fI~/.config/autostart/\fP or \fI~/.kde/Autostart/\fP.
+If there are multiple tabs, you may need to change these settings on all
+three of them: "On AC power", "Battery" and "Low Battery".
.TP 3
-\fB3: Make XScreenSaver be an Autostart program.\fP
-If it does not already exist, create a file in your autostart directory
-called \fIxscreensaver.desktop\fP that contains the following six lines:
-.nf
-.sp
- [Desktop Entry]
- Exec=xscreensaver
- Name=XScreenSaver
- Type=Application
- StartupNotify=false
- X-KDE-StartupNotify=false
-.sp
-.fi
+\fB2: Launch XScreenSaver at login.\fP
+Copy the file \fI/usr/share/applications/xscreensaver.desktop\fP into
+the directory \fI~/.config/autostart/\fP
.TP 3
-\fB4: Make the various "lock session" buttons call XScreenSaver.\fP
-The file you want to replace next has moved around over the years. It
-might be called \fI/usr/libexec/kde4/kscreenlocker\fP,
-or it might be called "\fIkdesktop_lock\fP" or "\fIkrunner_lock\fP"
-or "\fIkscreenlocker_greet\fP", and
-it might be in \fI/usr/lib/kde4/libexec/\fP
-or in \fI/usr/kde/3.5/bin/\fP or even in \fI/usr/bin/\fP,
-depending on the distro and phase of the moon. Replace the contents
-of that file with these two lines:
+\fB3: Make KDE's "Lock" icon use XScreenSaver.\fP
+Find the "\fIkscreenlocker_greet\fP" program. It might be in
+"\fI/usr/lib/*/libexec/\fP", or it might be somewhere else.
+Delete that file and replace it with a file containing these two lines.
+Make it executable (chmod a+x).
.nf
.sp
#!/bin/sh
- xscreensaver-command \-\-lock
+ xscreensaver-command \-\-lock &
.sp
.fi
-Make sure the file is executable (chmod a+x).
+This change will get blown away when you upgrade.
.TP 3
-\fB5: Stop KDE from blocking XScreenSaver's "systemd" integration:\fP
-You must arrange for KDE's
-.BR ksmserver (1)
-daemon to be launched with the command line switch \fI\-\-no\-lockscreen\fP.
-
-One way to accomplish that is to edit the
-.BR startkde (1)
-script in \fI/usr/bin/\fP by hand, then log out and log back in. Another
-way would be to wrap the \fIksmserver\fP program:
+\fB4: Turn off KDE's built-in locking on suspend, even harder.\fP
+Even after disabling KDE's screen locking, above, it is \fIpossible\fP that
+KDE will still use its built-in locker when you close your laptop's lid. If
+that is happening, double-check the settings above, but if those are correct,
+try the following. First, ensure you are running KDE 5.21 or newer. Next,
+enable \fI"systemd user sessions"\fP for KDE so that you can edit the
+parameters for \fIksmserver:\fP
.nf
.sp
- mv /usr/bin/ksmserver /usr/bin/ksmserver-orig
+ kwriteconfig5 \-\-file startkderc \-\-group General \\
+ \-\-key systemdBoot true
.sp
.fi
-and replace \fI/usr/bin/ksmserver\fP with:
+Log out and back in.
+
+Next, edit the \fIplasma-ksmserver\fP service to change how \fIksmserver\fP
+is launched:
.nf
.sp
- #!/bin/sh
- ksmserver-orig \-\-no\-lockscreen
+ systemctl edit --user plasma-ksmserver.service
.sp
.fi
-Either change will, of course, get blown away the next time your system
-upgrades KDE.
-
-Instead of being in \fI/usr/bin/\fP, the \fIksmserver\fP program might be
-in \fI/usr/lib/\fP or \fIusr/lib*/libexec/\fP or \fIusr/lib/*/libexec/\fP
-or somewhere else, depending on your distro.
-
-But without this, video players will not be able to tell XScreenSaver not to
-blank the screen while videos are playing, and the screen will not auto-lock
-when you close your laptop's lid.
-
-It seems that KDE 5.17 replaced \fIstartkde\fP with \fIstartplasma-x11\fP,
-and I don't know how to change how \fIthat\fP launches \fIksmserver\fP.
-Let me know if you figure it out.
-
-.SS LAUNCHING XSCREENSAVER FROM SYSTEMD
-If the above didn't do it, and your system has
-.BR systemd (1),
-maybe this is how it works:
-.RS 4
-.TP 3
-\fB1: Create a service.\fP
-Create the file \fI~/.config/systemd/user/xscreensaver.service\fP
-containing:
+Replace the contents of the file that lets you edit with this:
.nf
.sp
- [Unit]
- Description=XScreenSaver
[Service]
- ExecStart=/usr/bin/xscreensaver
- Restart=on-failure
- [Install]
- WantedBy=default.target
+ ExecStart=
+ ExecStart=/usr/bin/ksmserver \-\-no\-lockscreen
.sp
.fi
-.TP 3
-\fB2. Enable it.\fP
+Then log out and back in \fIagain\fP.
+.SS LAUNCHING XSCREENSAVER FROM LXDE
+Add the line \fI@xscreensaver\fP to
+\fI/etc/xdg/lxsession/LXDE/autostart\fP or
+\fI/etc/xdg/lxsession/LXDE-pi/autostart\fP.
+.SS LAUNCHING XSCREENSAVER FROM SYSTEMD
+If you are not using GNOME, KDE or LXDE, the way to launch XScreenSaver
+at login is probably
+.BR systemd (1).
+
+Copy the file \fI/usr/share/xscreensaver/xscreensaver.service\fP into
+the directory \fI~/.config/systemd/user/\fP. Create that directory first
+if it doesn't exist. Then enable it with:
.nf
.sp
systemctl \-\-user enable xscreensaver
.sp
.fi
-.RE
-Then restart X11.
-
.SS LAUNCHING XSCREENAVER FROM UPSTART
-If your system has
+If you are not using GNOME, KDE or LXDE, and your system uses
.BR upstart (7)
instead of
.BR systemd (1),
-maybe this will work: launch the \fI"Startup Applications"\fP applet,
-click \fI"Add"\fP, enter these lines, then restart X11:
+launch the \fI"Startup Applications"\fP applet, click \fI"Add"\fP, and enter
+these lines:
.nf
.sp
Name: XScreenSaver
@@ -331,7 +263,14 @@ click \fI"Add"\fP, enter these lines, then restart X11:
Comment: XScreenSaver
.sp
.fi
-
+.SS LAPTOP LIDS WITHOUT SYSTEMD
+BSD systems or other systems without
+.BR systemd (1)
+or
+.BR elogind (8)
+might have luck by adding "\fIxscreensaver\-command \-\-suspend\fP" to
+some appropriate spot in \fI/etc/acpi/events/anything\fP or in
+\fI/etc/acpi/handler.sh\fP, if those files exist.
.SS LAUNCHING XSCREENSAVER FROM GDM
You can run \fIxscreensaver\fP from your
.BR gdm (1)
@@ -343,7 +282,7 @@ On the \fIGeneral\fP page set the \fILocal Greeter\fP to
\fIStandard Greeter\fP.
On the \fIBackground\fP page, type the
-command \fB"xscreensaver \-\-nosplash"\fP into the \fIBackground Program\fP
+command \fI"xscreensaver \-\-no\-splash"\fP into the \fIBackground Program\fP
field. That will cause gdm to run XScreenSaver while nobody is logged
in, and kill it as soon as someone does log in. (The user will then
be responsible for starting XScreenSaver on their own, if they want.)
@@ -353,83 +292,111 @@ If that doesn't work, you can edit the config file directly. Edit
.nf
.sp
Greeter=/usr/bin/gdmlogin
- BackgroundProgram=xscreensaver \-\-nosplash
+ BackgroundProgram=xscreensaver \-\-no\-splash
RunBackgroundProgramAlways=true
.sp
.fi
-In this situation, the \fIxscreensaver\fP process will probably be running
-as user \fIgdm\fP instead of as \fIroot\fP. You can configure the settings
-for this nobody-logged-in state (timeouts, DPMS, etc.) by editing
-the \fI~gdm/.xscreensaver\fP file.
-
-It is safe to run \fIxscreensaver\fP as root (as \fIxdm\fP or \fIgdm\fP may do).
-If run as root, \fIxscreensaver\fP changes its effective user and group ids
-to something safe (like \fI"nobody"\fP) before connecting to the X server
-or launching user-specified programs.
-
-An unfortunate side effect of this (important) security precaution is that
-it may conflict with cookie-based authentication.
+In this situation, the \fIxscreensaver\fP process will be running as user
+\fIgdm\fP. You can configure the settings for this nobody-logged-in
+state (timeouts, DPMS, etc.) by editing the \fI~gdm/.xscreensaver\fP file.
If you get "connection refused" errors when running \fIxscreensaver\fP
-from \fIgdm\fP, then this probably means that you have
+from \fIgdm\fP, then this probably means that you are having
.BR xauth (1)
-or some other security mechanism turned on. For information on the
-X server's access control mechanisms, see the man pages for
+problems. For information on the X server's access control mechanisms,
+see the man pages for
.BR X (1),
.BR Xsecurity (1),
.BR xauth (1),
and
.BR xhost (1).
-.SS LAPTOP LIDS WITHOUT SYSTEMD
-BSD systems or other systems without
-.BR systemd (1)
-or
-.BR elogind (8)
-might have luck by adding \fIxscreensaver\-command \-\-suspend\fP to
-some appropriate spot in \fI/etc/acpi/events/anything\fP or in
-\fI/etc/acpi/handler.sh\fP, if those files exist.
+There might be a way to accomplish this with other display managers.
+It's a mystery!
+.SH THE WAYLAND PROBLEM
+Wayland is a completely different window system that is intended to replace
+X11. After 14+ years of trying, some Linux distros have finally begun
+enabling it by default. Most deployments of it also include XWayland, which
+is a compatibility layer that allows \fIsome\fP X11 programs to continue to
+work within a Wayland environment.
+
+Unfortunately, XScreenSaver is not one of those programs.
+
+If your system is running XWayland, XScreenSaver will malfunction in two
+ways:
+.RS 0
+.TP 3
+\fB1:\fP It will be unable to detect user activity in non-X11 programs.
+This means that while a native Wayland program is selected, XScreenSaver will
+think that you are idle, and may blank the screen prematurely.
+.TP 3
+\fB2:\fP It will be unable to lock the screen.
+
+This is because X11 grabs don't work properly under XWayland, so there is no
+way for XScreenSaver to prevent the user from switching away from the screen
+locker to another application.
+.RE
+
+In short, for XScreenSaver to work properly, you will need to switch off
+Wayland and use the X Window System like in the "good old days".
+.SS TO DISABLE WAYLAND UNDER GNOME
+The login screen should have a gear-icon menu that lets you change the session
+type from "GNOME" (the Wayland session) to "GNOME on Xorg" (the X11 session).
+
+Alternately, edit \fI/etc/gdm/custom.conf\fP and make sure it includes this
+line:
+.nf
+.sp
+ WaylandEnable=false
+.fi
+.SS TO DISABLE WAYLAND UNDER KDE
+The login screen should have a menu that lets you change the session type to
+"Plasma (X11)".
+
+Alternately, edit \fI/etc/sddm.conf\fP and change the \fISessionDir\fP line
+under the \fI[Wayland]\fP section to say:
+.nf
+.sp
+ SessionDir=/dev/null
+.fi
.SH SECURITY CONCERNS
XScreenSaver has a decades-long track record of securely locking your screen.
However, there are many things that can go wrong. X11 is a very old system,
and has a number of design flaws that make it susceptible to foot-shooting.
-
.SS MAGIC BACKDOOR KEYSTROKES
-The XFree86 and Xorg X servers, as well as the Linux kernel, both trap
+The Xorg and XFree86 X servers, as well as the Linux kernel, both trap
certain magic keystrokes before X11 client programs ever see them.
If you care about keeping your screen locked, this is a big problem.
-
.TP 3
.B Ctrl+Alt+Backspace
This keystroke kills the X server, and on some systems, leaves you at
a text console. If the user launched X11 manually, that text console
will still be logged in. To disable this keystroke globally and
permanently, you need to set the \fBDontZap\fP flag in your
-\fIxorg.conf\fP or \fIXF86Config\fP or \fIXF86Config-4\fP file,
-depending which is in use on your system. See
+.BR xorg.conf (5)
+or
.BR XF86Config (5)
-for details.
-
+file.
.TP 3
.B Ctrl-Alt-F1, Ctrl-Alt-F2, etc.
-These keystrokes will switch to a different virtual console, while
-leaving the console that X11 is running on locked. If you left a
-shell logged in on another virtual console, it is unprotected. So
-don't leave yourself logged in on other consoles. You can disable VT
-switching globally and permanently by setting \fBDontVTSwitch\fP in
-your \fIxorg.conf\fP, but that might make your system harder to use,
-since VT switching is an actual useful feature.
+These keystrokes will switch to a different virtual console, while leaving the
+console that X11 is running on locked. If you left a shell logged in on
+another virtual console, it is unprotected. So don't leave yourself logged in
+on other consoles. You can disable VT switching globally and permanently by
+setting \fBDontVTSwitch\fP in your
+.BR xorg.conf (5),
+but that might make your system harder to use, since VT switching is an actual
+useful feature.
There is no way to disable VT switching only when the screen is
locked. It's all or nothing.
-
.TP 3
.B Ctrl-Alt-KP_Multiply
-This keystroke kills any X11 app that holds a lock, so typing this
-will kill XScreenSaver and unlock the screen. You can disable it by
-turning off \fBAllowClosedownGrabs\fP in \fIxorg.conf\fP.
-
+This keystroke kills any X11 app that holds a lock, so typing this will kill
+XScreenSaver and unlock the screen. You can disable it by turning off
+\fBAllowClosedownGrabs\fP in
+.BR xorg.conf (5).
.TP 3
.B Alt-SysRq-F
This is the Linux kernel "OOM-killer" keystroke. It shoots down random
@@ -464,7 +431,16 @@ You can disable the OOM-killer entirely with:
echo vm.overcommit_memory = 2 >> /etc/sysctl.conf
.sp
.fi
-
+In addition to the kernel's OOM-killer,
+.BR systemd (1)
+has its own. The included \fIxscreensaver.service\fP file attempts to
+evade it, but you may want to just turn it off anyway:
+.nf
+.sp
+ sudo systemctl disable --now systemd-oomd
+ sudo systemctl mask systemd-oomd
+.sp
+.fi
.SS X SERVER ACCESS IS GAME OVER
X11's security model is all-or-nothing. If a program can connect to your X
server at all, either locally or over the network, it can log all of your
@@ -474,96 +450,53 @@ server can execute arbitrary code as the logged-in user. See
.BR Xsecurity (1)
and
.BR xauth (1).
-
.SS PAM PASSWORDS
If your system uses PAM (Pluggable Authentication Modules), then PAM must be
configured for XScreenSaver. If it is not, then you \fImight\fP be in a
situation where you can't unlock. Probably the file you need
is \fI/etc/pam.d/xscreensaver\fP.
-
.SS DON'T LOG IN AS ROOT
-In order for it to be safe for XScreenSaver to be launched by \fIxdm\fP,
-certain precautions had to be taken, among them that XScreenSaver never
-runs as \fIroot\fP. In particular, if it is launched as root (as \fIxdm\fP
-is likely to do), XScreenSaver will disavow its privileges, and switch
-itself to a safe user id (such as \fInobody\fP).
-
-An implication of this is that if you log in as \fIroot\fP on the console,
-XScreenSaver will refuse to lock the screen (because it can't tell
-the difference between \fIroot\fP being logged in on the console, and a
-normal user being logged in on the console but XScreenSaver having been
-launched by the
-.BR xdm (1)
-.I Xsetup
-file).
-
-Proper Unix hygiene dictates that you should log in as yourself, and
+Never log in as root. Log in as a normal user and use
.BR sudo (1)
-to \fIroot\fP as necessary. People who spend their day logged in
-as \fIroot\fP are just begging for disaster.
-
+as necessary. If you are logged in as root, XScreenSaver will not lock your
+screen or run display modes, for numerous good and proper reasons.
.SH MULTI-USER OR SITE-WIDE CONFIGURATION
For a single user, the proper way to configure XScreenSaver is to simply
run the
.BR xscreensaver\-settings (1)
-program, and change the settings through the GUI. The rest of this manual
-describes lower-level ways of changing settings. You shouldn't need to
-know any of the stuff described below unless you are trying to do something
-complicated.
-
-Options to XScreenSaver are stored in one of two places: in a file
-called \fI.xscreensaver\fP in your home directory; or in the X resource
-database. If the \fI.xscreensaver\fP file exists, it overrides any settings
-in the resource database.
-
-The syntax of the \fI.xscreensaver\fP file is similar to that of
-the \fI.Xdefaults\fP file; for example, to set the \fItimeout\fP parameter
-n the \fI.xscreensaver\fP file, you would write the following:
-.nf
-.sp
- timeout: 5
-.sp
-.fi
-whereas, in the \fI.Xdefaults\fP file, you would write
-.nf
-.sp
- xscreensaver.timeout: 5
-.sp
-.fi
+program, and change the settings through the GUI. Changes are written
+to the \fI~/.xscreensaver\fP file.
+
+If you want to set the system-wide defaults, then make your edits to
+\fI/etc/X11/app-defaults/XScreenSaver\fP instead. The two files have
+similar (but not identical) syntax.
+
+You can also make changes via the X Resource Database and
+.BR xrdb (1),
+but that can be very confusing and is not really recommended.
+
+Options in \fI~/.xscreensaver\fP override any settings in the resource
+database or app-defaults file.
+
If you change a setting in the \fI.xscreensaver\fP file while XScreenSaver
is already running, it will notice this, and reload the file as needed.
-
-If you change a setting in your X resource database, or if you want
-XScreenSaver to notice your changes immediately instead of the next time it
-wakes up, then you will need to reload your \fI.Xdefaults\fP file, and then
-tell the running \fIxscreensaver\fP process to restart itself, like so:
+But if you change a setting in the X Resource Database, you will need to
+restart XScreenSaver for those changes to take effect:
.nf
.sp
xrdb < ~/.Xdefaults
xscreensaver-command \-\-restart
.sp
.fi
-If you want to set the system-wide defaults, then make your edits to
-the XScreenSaver app-defaults file, which should have been installed
-when XScreenSaver itself was installed. The app-defaults file will
-usually be named /etc/X11/app-defaults/XScreenSaver, but different
-systems might keep it in a different place.
-
-When settings are changed in the Preferences dialog box, those settings are
-written to the \fI.xscreensaver\fP file. The \fI.Xdefaults\fP file and the
-app-defaults file will never be written by XScreenSaver itself.
-
.SH X RESOURCES
These are the X resources use by XScreenSaver program. You probably won't
need to change these manually: that's what the
.BR xscreensaver\-settings (1)
program is for.
-
.TP 8
.B timeout\fP (class \fBTime\fP)
The screensaver will activate (blank the screen) after the keyboard and
mouse have been idle for this many minutes. Default 10 minutes.
-
.TP 8
.B cycle\fP (class \fBTime\fP)
After the screensaver has been running for this many minutes, the currently
@@ -575,12 +508,10 @@ Default 10 minutes.
If there are multiple screens, the savers are staggered slightly so
that while they all change every \fIcycle\fP minutes, they don't all
change at the same time.
-
.TP 8
.B lock\fP (class \fBBoolean\fP)
Enable locking: before the screensaver will turn off, it will require you
to type the password of the logged-in user.
-
.TP 8
.B lockTimeout\fP (class \fBTime\fP)
If locking is enabled, this controls the length of the "grace period"
@@ -592,26 +523,21 @@ at 15 minutes or later (that is, \fIlockTimeout\fP minutes after
activation) then a password would be required. The default is 0, meaning
that if locking is enabled, then a password will be required as soon as the
screen blanks.
-
.TP 8
.B passwdTimeout\fP (class \fBTime\fP)
If the screen is locked, then this is how many seconds the password dialog box
should be left on the screen before giving up (default 30 seconds). A few
seconds are added each time you type a character.
-
.TP 8
.B dpmsEnabled\fP (class \fBBoolean\fP)
Whether power management is enabled.
-
.TP 8
.B dpmsStandby\fP (class \fBTime\fP)
If power management is enabled, how long until the monitor goes solid black.
-
.TP 8
.B dpmsSuspend\fP (class \fBTime\fP)
If power management is enabled, how long until the monitor goes into
power-saving mode.
-
.TP 8
.B dpmsOff\fP (class \fBTime\fP)
If power management is enabled, how long until the monitor powers down
@@ -619,42 +545,32 @@ completely. Note that these settings will have no effect unless both
the X server and the display hardware support power management; not
all do. See the \fIPower Management\fP section, below, for more
information.
-
.TP 8
.B dpmsQuickOff\fP (class \fBBoolean\fP)
If \fImode\fP is \fIblank\fP and this is true, then the screen will be
powered down immediately upon blanking, regardless of other
power-management settings.
-
.TP 8
.B verbose\fP (class \fBBoolean\fP)
Whether to print diagnostics. Default false.
-
.TP 8
.B splash\fP (class \fBBoolean\fP)
Whether to display a splash screen at startup. Default true.
-
.TP 8
.B splashDuration\fP (class \fBTime\fP)
How long the splash screen should remain visible; default 5 seconds.
-
.TP 8
.B helpURL\fP (class \fBURL\fP)
The splash screen has a \fIHelp\fP button on it. When you press it, it will
display the web page indicated here in your web browser.
-
.TP 8
.B loadURL\fP (class \fBLoadURL\fP)
This is the shell command used to load a URL into your web browser.
-The default setting will load it into Mozilla/Netscape if it is already
-running, otherwise, will launch a new browser looking at the \fIhelpURL\fP.
-
.TP 8
.B demoCommand\fP (class \fBDemoCommand\fP)
This is the shell command run when the \fIDemo\fP button on the splash window
is pressed. It defaults to
.BR xscreensaver\-settings (1).
-
.TP 8
.B newLoginCommand\fP (class \fBNewLoginCommand\fP)
If set, this is the shell command that is run when the "New Login" button
@@ -666,7 +582,6 @@ Typically this will be some variant of
.BR lxdm (1)
or
.BR dm-tool (1).
-
.TP 8
.B nice\fP (class \fBNice\fP)
The sub-processes launched by XScreenSaver will be "niced" to this level, so
@@ -675,24 +590,19 @@ don't increase the load unnecessarily. The default is 10. (Higher numbers
mean lower priority; see
.BR nice (1)
for details.)
-
.TP 8
.B fade\fP (class \fBBoolean\fP)
-If this is true, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out.
-Default: true.
-
+If this is true, then when the screensaver activates, the desktop will fade to
+black instead of simply winking out. Default: true.
.TP 8
.B unfade\fP (class \fBBoolean\fP)
-If this is true, then when the screensaver deactivates, the original contents
-of the screen will fade in from black instead of appearing immediately. This
-is only done if \fIfade\fP is true as well. Default: true.
-
+If this is true, then when the screensaver deactivates, desktop will fade back
+ininstead of appearing immediately. This is only done if \fIfade\fP is true
+as well. Default: true.
.TP 8
.B fadeSeconds\fP (class \fBTime\fP)
If \fIfade\fP is true, this is how long the fade will be in
seconds. Default 3 seconds.
-
.TP 8
.B ignoreUninstalledPrograms\fP (class \fBBoolean\fP)
There may be programs in the list that are not installed on the system,
@@ -702,7 +612,6 @@ if an attempt is made to run the nonexistent program. Also, the
.BR xscreensaver\-settings (1)
program will suppress the non-existent programs from the list if this
is true. Default: false.
-
.TP 8
.B authWarningSlack\fP (class \fBInteger\fP)
After you successfully unlock the screen, a dialog may pop up informing
@@ -710,37 +619,30 @@ you of previous failed login attempts. If all of those login attemps
were within this amount of time, they are ignored. The assumption
is that incorrect passwords entered within a few seconds of a correct
one are user error, rather than hostile action. Default 20 seconds.
-
.TP 8
.B mode\fP (class \fBMode\fP)
Controls the screen-saving behavior. Valid values are:
.RS 8
-
.TP 8
.B random
When blanking the screen, select a random display mode from among those
that are enabled and applicable. This is the default.
-
.TP 8
.B random-same
Like \fIrandom\fP, but if there are multiple screens, each screen
will run the \fIsame\fP random display mode, instead of each screen
running a different one.
-
.TP 8
.B one
When blanking the screen, only ever use one particular display mode (the
one indicated by the \fIselected\fP setting).
-
.TP 8
.B blank
When blanking the screen, just go black: don't run any graphics hacks.
-
.TP 8
.B off
Don't ever blank the screen, and don't ever allow the monitor to power down.
.RE
-
.TP 8
.B selected\fP (class \fBInteger\fP)
When \fImode\fP is set to \fIone\fP, this is the one, indicated by its
@@ -748,7 +650,6 @@ index in the \fIprograms\fP list. You're crazy if you count them and
set this number by hand: let
.BR xscreensaver\-settings (1)
do it for you!
-
.TP 8
.B programs\fP (class \fBPrograms\fP)
The graphics hacks which XScreenSaver runs when the user is idle.
@@ -776,24 +677,9 @@ just \fIdeletes\fP an entry from their programs list, but that entry still
exists in the system-wide list, then it will come back. However, if the
user \fIdisables\fP it, then their setting takes precedence.
-If the display has multiple screens, then a different program will be run
-for each screen. (All screens are blanked and unblanked simultaneously.)
-
-Note that you must escape the newlines; here is an example of how you
-might set this in your \fI~/.xscreensaver\fP file:
-.nf
-.sp
- programs: \\
- qix -root \\n\\
- ico -r -faces -sleep 1 -obj ico \\n\\
- xdaliclock -builtin2 -root \\n\\
- xv -root -rmode 5 image.gif -quit \\n
-.sp
-.fi
-.RS 8
-Make sure your \fB$PATH\fP environment variable is set up correctly
-\fIbefore\fP XScreenSaver is launched, or it won't be able to find the
-programs listed in the \fIprograms\fP resource.
+The default XScreenSaver hacks directory (typically
+\fI/usr/libexec/xscreensaver/\fP) is prepended to \fB$PATH\fP
+before searching for these programs.
To use a program as a screensaver, it must be able to render onto
the window provided to it in the \fB$XSCREENSAVER_WINDOW\fP environment
@@ -834,8 +720,8 @@ the \fIprograms\fP list:
.B default-n
This is like \fBdefault\fP, but also requests the use of the default colormap,
instead of a private colormap.
-
.RE
+.PP
If you specify a particular visual for a program, and that visual does not
exist on the screen, then that program will not be chosen to run. This
means that on displays with multiple screens of different depths, you can
@@ -843,7 +729,6 @@ arrange for appropriate hacks to be run on each. For example, if one screen
is color and the other is monochrome, hacks that look good in mono can be
run on one, and hacks that only look good in color will show up on the other.
.RE
-
.TP 8
.B visualID\fP (class \fBVisualID\fP)
This is an historical artifact left over from when 8-bit
@@ -892,14 +777,13 @@ as reported by the
program; in this way you can have finer control over exactly which visual
gets used, for example, to select a shallower one than would otherwise
have been chosen.
-
.RE
.RS 8
+.PP
Note that this option specifies only the \fIdefault\fP visual that will
be used: the visual used may be overridden on a program-by-program basis.
See the description of the \fBprograms\fP resource, above.
.RE
-
.TP 8
.B installColormap\fP (class \fBBoolean\fP)
This is an historical artifact left over from when 8-bit displays were still
@@ -913,7 +797,6 @@ discussion of the \fBdefault\-n\fP name in the section about the
This does nothing if you have a TrueColor (16-bit or deeper) display.
(Which, in this century, you do.)
-
.TP 8
.B pointerHysteresis\fP (class \fBInteger\fP)
If the mouse moves less than this-many pixels in a second, ignore it
@@ -921,10 +804,12 @@ If the mouse moves less than this-many pixels in a second, ignore it
doesn't un-blank (or fail to blank) just because you bumped the desk.
Default: 10 pixels.
+A single pixel of motion will still cause the monitor to power back on,
+but not un-blank. This is because the X11 server itself unfortunately handles
+power-management-related activity detection rather than XScreenSaver.
.SH BUGS
https://www.jwz.org/xscreensaver/bugs.html explains how to write the most
useful bug reports. If you find a bug, please let me know!
-
.SH ENVIRONMENT
.PP
.TP 8
@@ -934,8 +819,7 @@ of the screen on which to draw.
.TP 8
.B XSCREENSAVER_WINDOW
Passed to sub-programs to indicate the ID of the window on which they
-should draw. This is necessary on Xinerama/RANDR systems where
-multiple physical monitors share a single X11 "Screen".
+should draw.
.TP 8
.B PATH
to find the sub-programs to run, including the display modes.
@@ -965,7 +849,7 @@ and a FAQ can always be found at https://www.jwz.org/xscreensaver/
.BR xscreensaver\-getimage (MANSUFFIX),
.BR xscreensaver\-text (MANSUFFIX).
.SH COPYRIGHT
-Copyright \(co 1991-2021 by Jamie Zawinski.
+Copyright \(co 1991-2022 by Jamie Zawinski.
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
@@ -974,8 +858,7 @@ supporting documentation. No representations are made about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>. Written in late 1991; version 1.0 posted
-to comp.sources.x on 17-Aug-1992.
+Jamie Zawinski <jwz@jwz.org>
Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver.service.in b/driver/xscreensaver.service.in
new file mode 100644
index 0000000..efad06c
--- /dev/null
+++ b/driver/xscreensaver.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=XScreenSaver
+Documentation=man:xscreensaver
+Documentation=man:xscreensaver-settings
+Documentation=https://www.jwz.org/xscreensaver/
+After=graphical-session-pre.target
+PartOf=graphical-session.target
+ConditionUser=!@system
+Conflicts=org.gnome.ScreenSaver org.cinnamon.ScreenSaver org.mate.ScreenSaver org.xfce.ScreenSaver light-locker
+
+[Service]
+ExecStart=/usr/bin/xscreensaver
+Restart=on-failure
+OOMScoreAdjust=-1000
+
+[Install]
+Alias=org.jwz.xscreensaver.service
+WantedBy=graphical-session.target
diff --git a/driver/xscreensaver.ui b/driver/xscreensaver.ui
deleted file mode 100644
index e9e4522..0000000
--- a/driver/xscreensaver.ui
+++ /dev/null
@@ -1,2994 +0,0 @@
-<?xml version="1.0"?>
-<!--*- mode: xml -*-->
-<interface>
- <object class="GtkAdjustment" id="adjustment1">
- <property name="upper">720</property>
- <property name="lower">1</property>
- <property name="page_increment">15</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">1</property>
- </object>
- <object class="GtkAdjustment" id="adjustment2">
- <property name="upper">720</property>
- <property name="lower">0</property>
- <property name="page_increment">15</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">0</property>
- </object>
- <object class="GtkAdjustment" id="adjustment3">
- <property name="upper">720</property>
- <property name="lower">0</property>
- <property name="page_increment">15</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">0</property>
- </object>
- <object class="GtkAdjustment" id="adjustment4">
- <property name="upper">1440</property>
- <property name="lower">0</property>
- <property name="page_increment">15</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">0</property>
- </object>
- <object class="GtkAdjustment" id="adjustment5">
- <property name="upper">1440</property>
- <property name="lower">0</property>
- <property name="page_increment">15</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">0</property>
- </object>
- <object class="GtkAdjustment" id="adjustment6">
- <property name="upper">1440</property>
- <property name="lower">0</property>
- <property name="page_increment">15</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">0</property>
- </object>
- <object class="GtkAdjustment" id="adjustment7">
- <property name="upper">10</property>
- <property name="lower">0</property>
- <property name="page_increment">1</property>
- <property name="step_increment">1</property>
- <property name="page_size">0</property>
- <property name="value">0</property>
- </object>
- <object class="GtkListStore" id="mode_menu_model">
- <columns>
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">Disable Screen Saver</col>
- </row>
- <row>
- <col id="0" translatable="yes">Blank Screen Only</col>
- </row>
- <row>
- <col id="0" translatable="yes">Only One Screen Saver</col>
- </row>
- <row>
- <col id="0" translatable="yes">Random Screen Saver</col>
- </row>
- <row>
- <col id="0" translatable="yes">Same Random Savers</col>
- </row>
- </data>
- </object>
-
- <object class="GtkListStore" id="theme_menu_model">
- <columns>
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">Default</col>
- </row>
- </data>
- </object>
-
-
-
-
-
- <object class="GtkListStore" id="visual_combo_model">
- <columns>
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">Any</col>
- </row>
- <row>
- <col id="0" translatable="yes">Best</col>
- </row>
- <row>
- <col id="0" translatable="yes">Default</col>
- </row>
- <row>
- <col id="0" translatable="yes">Default-N</col>
- </row>
- <row>
- <col id="0" translatable="yes">GL</col>
- </row>
- <row>
- <col id="0" translatable="yes">TrueColor</col>
- </row>
- <row>
- <col id="0" translatable="yes">PseudoColor</col>
- </row>
- <row>
- <col id="0" translatable="yes">StaticGray</col>
- </row>
- <row>
- <col id="0" translatable="yes">GrayScale</col>
- </row>
- <row>
- <col id="0" translatable="yes">DirectColor</col>
- </row>
- <row>
- <col id="0" translatable="yes">Color</col>
- </row>
- <row>
- <col id="0" translatable="yes">Gray</col>
- </row>
- <row>
- <col id="0" translatable="yes">Mono</col>
- </row>
- </data>
- </object>
- <object class="GtkUIManager" id="uimanager1">
- <child>
- <object class="GtkActionGroup" id="actiongroup1">
- <child>
- <object class="GtkAction" id="file">
- <property name="name">file</property>
- <property name="label" translatable="yes">_File</property>
- <signal handler="file_menu_cb" last_modification_time="Sun, 06 Mar 2005 21:41:13 GMT" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="activate_action">
- <property name="name">activate_action</property>
- <property name="label" translatable="yes">_Blank Screen Now</property>
- <signal handler="activate_menu_cb" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="lock_action">
- <property name="name">lock_action</property>
- <property name="label" translatable="yes">_Lock Screen Now</property>
- <signal handler="lock_menu_cb" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="kill_action">
- <property name="name">kill_action</property>
- <property name="label" translatable="yes">_Kill Daemon</property>
- <signal handler="kill_menu_cb" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="restart_action">
- <property name="name">restart_action</property>
- <property name="label" translatable="yes">_Restart Daemon</property>
- <signal handler="restart_menu_cb" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="exit_action">
- <property name="name">exit_action</property>
- <property name="label" translatable="yes">_Quit</property>
- <signal handler="exit_menu_cb" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="help">
- <property name="name">help</property>
- <property name="label" translatable="yes">_Help</property>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="about_action">
- <property name="name">about_action</property>
- <property name="label" translatable="yes">_About...</property>
- <signal handler="about_menu_cb" name="activate"/>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="doc_action">
- <property name="name">doc_action</property>
- <property name="label" translatable="yes">_Documentation...</property>
- <signal handler="doc_menu_cb" name="activate"/>
- </object>
- </child>
- </object>
- </child>
- <ui>
- <menubar name="menubar">
- <menu action="file">
- <menuitem name="activate_menu" action="activate_action"/>
- <menuitem name="lock_menu" action="lock_action"/>
- <menuitem name="kill_menu" action="kill_action"/>
- <menuitem name="restart_menu" action="restart_action"/>
- <separator/>
- <menuitem name="exit_menu" action="exit_action"/>
- </menu>
- <menu action="help">
- <menuitem name="about_menu" action="about_action"/>
- <menuitem name="doc_menu" action="doc_action"/>
- </menu>
- </menubar>
- </ui>
- </object>
- <object class="GtkWindow" id="xscreensaver_demo">
- <property name="title" translatable="yes">XScreenSaver</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- <child>
- <object class="GtkVBox" id="outer_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkMenuBar" constructor="uimanager1" id="menubar">
- <property name="visible">True</property>
- <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
- <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="spacer_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkNotebook" id="notebook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
- <signal handler="switch_page_cb" name="switch_page"/>
- <child>
- <object class="GtkTable" id="demos_table">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
- <child>
- <object class="GtkTable" id="blanking_table">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">4</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">2</property>
- <property name="column_spacing">0</property>
- <child>
- <object class="GtkLabel" id="cycle_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Cycle After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">cycle_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="cycle_spinbutton" type="label-for"/>
- <relation target="cycle_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEventBox" id="lock_button_eventbox">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether a password should be required to un-blank the screen.</property>
- <property name="visible_window">False</property>
- <property name="above_child">False</property>
- <child>
- <object class="GtkCheckButton" id="lock_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Lock Screen After </property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <relation target="lock_spinbutton" type="controller-for"/>
- <relation target="lock_spinbutton" type="label-for"/>
- <relation target="lock_spinbutton" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="toggled"/>
- <child internal-child="accessible">
- <object class="AtkObject" id="a11y-lock_button1">
- <property name="AtkObject::accessible_name" translatable="yes">Lock Screen</property>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="timeout_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long before the screen saver activates.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment1</property>
- <accessibility>
- <relation target="timeout_label" type="labelled-by"/>
- <relation target="timeout_mlabel" type="labelled-by"/>
- <relation target="timeout_label" type="flows-from"/>
- <relation target="timeout_mlabel" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="lock_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long after the screen blanks until a password will be required.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment2</property>
- <accessibility>
- <relation target="lock_button" type="controlled-by"/>
- <relation target="lock_button" type="labelled-by"/>
- <relation target="lock_mlabel" type="labelled-by"/>
- <relation target="lock_button" type="flows-from"/>
- <relation target="lock_mlabel" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- <child internal-child="accessible">
- <object class="AtkObject" id="a11y-lock_spinbutton1">
- <property name="AtkObject::accessible_name" translatable="yes">Lock Screen After</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_padding">10</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="cycle_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long each display mode should run before choosing a new one (in Random mode.)</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment3</property>
- <accessibility>
- <relation target="cycle_label" type="labelled-by"/>
- <relation target="cycle_mlabel" type="labelled-by"/>
- <relation target="cycle_label" type="flows-from"/>
- <relation target="cycle_mlabel" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="lock_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="lock_spinbutton" type="label-for"/>
- <relation target="lock_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="cycle_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="cycle_spinbutton" type="label-for"/>
- <relation target="cycle_spinbutton" type="flows-from"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="timeout_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Blank After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">timeout_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="timeout_spinbutton" type="label-for"/>
- <relation target="timeout_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="timeout_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="timeout_spinbutton" type="label-for"/>
- <relation target="timeout_spinbutton" type="flows-from"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"/>
- </packing>
- </child>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- <child>
- <object class="GtkHButtonBox" id="demo_manual_hbbox">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
- <property name="spacing">30</property>
- <child>
- <object class="GtkButton" id="demo">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Demo the selected screen saver in full-screen mode (click the mouse to return.)</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Preview</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="run_this_cb" name="clicked"/>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="settings">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Customization and explanation of the selected screen saver.</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Settings...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="settings_cb" name="clicked"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="list_vbox">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkHBox" id="mode_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkLabel" id="mode_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Mode:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">mode_menu</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="mode_menu" type="label-for"/>
- </accessibility>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="mode_menu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_entry">False</property>
- <property name="model">mode_menu_model</property>
- <accessibility>
- <relation target="mode_label" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkCellRendererText" id="renderer1"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="padding">4</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">10</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="scroller">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
- <child>
- <object class="GtkTreeView" id="list">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- <property name="rules_hint">True</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- <property name="fixed_height_mode">False</property>
- <property name="hover_selection">False</property>
- <property name="hover_expand">False</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="centering_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkHBox" id="next_prev_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkButton" id="next">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="run_next_cb" name="clicked"/>
- <child>
- <object class="GtkArrow" id="arrow1">
- <property name="visible">True</property>
- <property name="arrow_type">GTK_ARROW_DOWN</property>
- <property name="shadow_type">GTK_SHADOW_OUT</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="prev">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="run_prev_cb" name="clicked"/>
- <child>
- <object class="GtkArrow" id="arrow2">
- <property name="visible">True</property>
- <property name="arrow_type">GTK_ARROW_UP</property>
- <property name="shadow_type">GTK_SHADOW_OUT</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="preview_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <relation target="label1" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkNotebook" id="preview_notebook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">False</property>
- <property name="tab_pos">GTK_POS_BOTTOM</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
- <child>
- <object class="GtkAspectFrame" id="preview_aspectframe">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="ratio">1.33000004292</property>
- <property name="obey_child">False</property>
- <child>
- <object class="GtkDrawingArea" id="preview">
- <property name="visible">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="preview_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">preview</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- <child>
- <object class="GtkLabel" id="no_preview_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">No Preview
-Available</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="no_preview_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">no preview</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- <child>
- <object class="GtkLabel" id="not_installed_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Not
-Installed</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="not_installed_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">not installed</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- <child>
- <object class="GtkLabel" id="nothing_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
-
-This probably means that the "xscreensaver-extras" and
-"xscreensaver-gl-extras" packages are not installed.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="nothing_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">nothing</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Description</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="preview_frame" type="label-for"/>
- </accessibility>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_padding">6</property>
- <property name="x_options">expand|shrink|fill</property>
- <property name="y_options">expand|shrink|fill</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="demo_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Display Modes</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">notebook</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- <child>
- <object class="GtkTable" id="options_table">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">True</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
- <child>
- <object class="GtkFrame" id="grab_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <relation target="label2" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkHBox" id="grab_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
- <child>
- <object class="GtkImage" id="image2">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-snap.png</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">4</property>
- <property name="ypad">8</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="grab_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkCheckButton" id="grab_desk_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Grab Desktop _Images</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="grab_video_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one.)</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Grab _Video Frames</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="grab_image_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the image-manipulating modes should load image files.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Choose _Random Image:</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <relation target="image_text" type="controller-for"/>
- <relation target="image_browse_button" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="image_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkLabel" id="grab_dummy">
- <property name="visible">True</property>
- <property name="label" translatable="yes"/>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">8</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="image_text">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">The local directory, RSS feed or Atom feed from which images will be randomly chosen.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <relation target="grab_image_button" type="labelled-by"/>
- <relation target="grab_image_button" type="controlled-by"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- </object>
- <packing>
- <property name="padding">2</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="image_browse_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Browse</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="browse_image_dir_cb" name="clicked"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label8">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Local directory, or RSS feed URL.</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">20</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Image Manipulation</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="grab_frame" type="label-for"/>
- </accessibility>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="diag_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <relation target="label3" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkHBox" id="diag_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
- <child>
- <object class="GtkImage" id="diag_logo">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-diagnostic.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkTable" id="text_table">
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">2</property>
- <property name="column_spacing">2</property>
- <child>
- <object class="GtkRadioButton" id="text_radio">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the text typed here.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Text</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <relation target="text_entry" type="controller-for"/>
- <relation target="text_entry" type="label-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:44 GMT" name="toggled"/>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="text_file_radio">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this file.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Text _file</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <accessibility>
- <relation target="text_file_entry" type="label-for"/>
- <relation target="text_file_entry" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:55 GMT" name="toggled"/>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="text_program_radio">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the output of this program.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Program</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <accessibility>
- <relation target="text_program_entry" type="label-for"/>
- <relation target="text_program_entry" type="controller-for"/>
- <relation target="text_program_browse" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:07 GMT" name="toggled"/>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="text_url_radio">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_URL</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <accessibility>
- <relation target="text_url_entry" type="label-for"/>
- <relation target="text_url_entry" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:17 GMT" name="toggled"/>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="text_host_radio">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the local host name, date, and time.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Host Name and Time</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">True</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">text_radio</property>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:32 GMT" name="toggled"/>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="text_url_entry">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <relation target="text_url_radio" type="controlled-by"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:10 GMT" name="activate"/>
- <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:26 GMT" name="focus_out_event"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="text_file_browse">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Browse</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <accessibility>
- <relation target="text_file_radio" type="controlled-by"/>
- </accessibility>
- <signal handler="browse_text_file_cb" last_modification_time="Sun, 20 Mar 2005 01:24:38 GMT" name="clicked"/>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="text_entry">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the text typed here.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <relation target="text_program_radio" type="labelled-by"/>
- <relation target="text_program_radio" type="controlled-by"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:42 GMT" name="activate"/>
- <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:43 GMT" name="focus_out_event"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="text_program_entry">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the output of this program.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <relation target="text_program_radio" type="labelled-by"/>
- <relation target="text_program_radio" type="controlled-by"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:02 GMT" name="activate"/>
- <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:15 GMT" name="focus_out_event"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="text_program_browse">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Browse</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <accessibility>
- <relation target="text_program_radio" type="controller-for"/>
- </accessibility>
- <signal handler="browse_text_program_cb" last_modification_time="Sun, 20 Mar 2005 01:24:51 GMT" name="clicked"/>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="text_file_entry">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Text-displaying modes will display the contents of this file.</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <relation target="text_file_radio" type="labelled-by"/>
- <relation target="text_file_radio" type="controlled-by"/>
- </accessibility>
- <signal handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:53 GMT" name="activate"/>
- <signal handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:55 GMT" name="focus_out_event"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"/>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Text Manipulation</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="diag_frame" type="label-for"/>
- </accessibility>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="dpms_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <child>
- <object class="GtkHBox" id="dpms_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
- <child>
- <object class="GtkImage" id="dpms_logo">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-power.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox6">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkCheckButton" id="dpms_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the monitor should be powered down after a while.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Power Management Enabled</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">True</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <relation target="dpms_suspend_spinbutton" type="controller-for"/>
- <relation target="dpms_standby_spinbutton" type="controller-for"/>
- <relation target="dpms_off_spinbutton" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkTable" id="dpms_table">
- <property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">3</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">2</property>
- <property name="column_spacing">4</property>
- <child>
- <object class="GtkLabel" id="dpms_standby_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Stand_by After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">10</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dpms_standby_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_standby_spinbutton" type="label-for"/>
- <relation target="dpms_standby_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="dpms_suspend_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Sus_pend After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">10</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dpms_suspend_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_suspend_spinbutton" type="label-for"/>
- <relation target="dpms_suspend_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="dpms_off_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Off After</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">10</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">dpms_off_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_off_spinbutton" type="label-for"/>
- <relation target="dpms_off_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="dpms_standby_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_standby_spinbutton" type="label-for"/>
- <relation target="dpms_standby_spinbutton" type="flows-from"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="dpms_suspend_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_suspend_spinbutton" type="label-for"/>
- <relation target="dpms_suspend_spinbutton" type="flows-from"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="dpms_off_mlabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">minutes</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_off_spinbutton" type="label-for"/>
- <relation target="dpms_off_spinbutton" type="flows-from"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="dpms_off_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long until the monitor powers down.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment4</property>
- <accessibility>
- <relation target="dpms_button" type="controlled-by"/>
- <relation target="dpms_off_label" type="labelled-by"/>
- <relation target="dpms_off_mlabel" type="labelled-by"/>
- <relation target="dpms_off_label" type="flows-from"/>
- <relation target="dpms_off_mlabel" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options"/>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="dpms_suspend_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long until the monitor goes into power-saving mode.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment5</property>
- <accessibility>
- <relation target="dpms_button" type="controlled-by"/>
- <relation target="dpms_suspend_label" type="labelled-by"/>
- <relation target="dpms_suspend_mlabel" type="labelled-by"/>
- <relation target="dpms_suspend_label" type="flows-from"/>
- <relation target="dpms_suspend_mlabel" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"/>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="dpms_standby_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long until the monitor goes completely black.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">15</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment6</property>
- <accessibility>
- <relation target="dpms_button" type="controlled-by"/>
- <relation target="dpms_standby_label" type="labelled-by"/>
- <relation target="dpms_standby_mlabel" type="labelled-by"/>
- <relation target="dpms_standby_label" type="flows-from"/>
- <relation target="dpms_standby_mlabel" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options"/>
- <property name="y_options"/>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="dpms_quickoff_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Quick Power-off in Blank Only Mode</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Display Power Management</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="dpms_frame" type="label-for"/>
- </accessibility>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="blanking_frame">
- <property name="border_width">10</property>
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <relation target="label5" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkHBox" id="fading_hbox">
- <property name="border_width">8</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
- <child>
- <object class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-colorselector.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox7">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkCheckButton" id="fade_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the screen should slowly fade to black when the screen saver activates.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Fade to Black when _Blanking</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <relation target="fade_spinbutton" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="unfade_button">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Whether the screen should slowly fade in from black when the screen saver deactivates.</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <accessibility>
- <relation target="fade_spinbutton" type="controller-for"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="fade_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkLabel" id="fade_dummy">
- <property name="visible">True</property>
- <property name="label" translatable="yes"/>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">3</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="fade_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">F_ade Duration</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">fade_spinbutton</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="fade_spinbutton" type="label-for"/>
- <relation target="fade_spinbutton" type="flows-to"/>
- </accessibility>
- </object>
- <packing>
- <property name="padding">14</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="fade_spinbutton">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">How long it should take for the screen to fade in and out.</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">0</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">True</property>
- <property name="wrap">False</property>
- <property name="adjustment">adjustment7</property>
- <accessibility>
- <relation target="unfade_button" type="controlled-by"/>
- <relation target="fade_button" type="controlled-by"/>
- <relation target="fade_label" type="labelled-by"/>
- <relation target="fade_sec_label" type="labelled-by"/>
- <relation target="fade_label" type="flows-from"/>
- <relation target="fade_sec_label" type="flows-to"/>
- </accessibility>
- <signal handler="pref_changed_cb" name="activate"/>
- <signal handler="pref_changed_event_cb" name="focus_out_event"/>
- <signal handler="pref_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="padding">4</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="fade_sec_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">seconds</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="fade_spinbutton" type="label-for"/>
- <relation target="fade_spinbutton" type="flows-from"/>
- </accessibility>
- </object>
- <packing>
- <property name="padding">2</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkHSeparator" id="blanking_hr">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="padding">8</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
-
- <child>
- <object class="GtkHBox" id="theme_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkLabel" id="theme_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Theme:</property>
- <property name="tooltip-text" translatable="yes">The color scheme to use on the unlock dialog.</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">theme_menu</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="theme_menu" type="label-for"/>
- </accessibility>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="theme_menu">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="has_entry">False</property>
- <property name="model">theme_menu_model</property>
- <accessibility>
- <relation target="theme_label" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkCellRendererText" id="renderer2"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="padding">4</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="theme_preview">
- <property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Show the what the unlock dialog will look like.</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Preview</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="preview_theme_cb" name="clicked"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">10</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
-
-
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Blanking</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="blanking_frame" type="label-for"/>
- </accessibility>
- </object>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="options_tab">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Advanced</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">notebook</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkHButtonBox" id="hbuttonbox2">
- <property name="border_width">5</property>
- <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkButton" id="helpbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-help</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="doc_menu_cb" name="clicked"/>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="closebutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-close</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="exit_menu_cb" name="clicked"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <object class="GtkDialog" id="xscreensaver_settings_dialog">
- <property name="title" translatable="yes">dialog1</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- <property name="has_separator">False</property>
- <child internal-child="vbox">
- <object class="GtkVBox" id="dialog_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child internal-child="action_area">
- <object class="GtkHButtonBox" id="dialog_action_area">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <child>
- <object class="GtkButton" id="adv_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="settings_adv_cb" name="clicked"/>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="std_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Standard &lt;&lt;</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="settings_std_cb" name="clicked"/>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="reset_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Reset to Defaults</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="settings_reset_cb" name="clicked"/>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="cancel_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="settings_cancel_cb" name="clicked"/>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="ok_button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="settings_ok_cb" name="clicked"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkFrame" id="opt_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
- <accessibility>
- <relation target="label6" type="labelled-by"/>
- </accessibility>
- <child>
- <object class="GtkNotebook" id="opt_notebook">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">False</property>
- <property name="tab_pos">GTK_POS_BOTTOM</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
- <signal handler="settings_switch_page_cb" name="switch_page"/>
- <child>
- <object class="GtkVBox" id="settings_vbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="tab_expand">True</property>
- <property name="tab_fill">True</property>
- <property name="tab_pack">GTK_PACK_END</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="std_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Standard</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- <child>
- <object class="GtkTable" id="adv_table">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
- <child>
- <object class="GtkImage" id="cmd_logo">
- <property name="visible">True</property>
- <property name="pixbuf">screensaver-cmndln.png</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">4</property>
- <property name="ypad">8</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="cmd_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Command Line:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">cmd_text</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="cmd_text" type="label-for"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="cmd_text">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <accessibility>
- <relation target="cmd_label" type="labelled-by"/>
- </accessibility>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="visual_hbox">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkLabel" id="visual">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Visual:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">1</property>
- <property name="yalign">0.5</property>
- <property name="xpad">3</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">visual_combo</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="visual_combo" type="label-for"/>
- </accessibility>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBoxEntry" id="visual_combo">
- <property name="has_entry">False</property>
- <property name="visible">True</property>
- <property name="model">visual_combo_model</property>
- <property name="text-column">0</property>
- <accessibility>
- <relation target="visual" type="labelled-by"/>
- </accessibility>
- <child internal-child="entry">
- <object class="GtkEntry" id="visual_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="adv_label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Advanced</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Settings</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- <accessibility>
- <relation target="opt_frame" type="label-for"/>
- </accessibility>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="doc_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <child>
- <object class="GtkVBox" id="doc_vbox">
- <property name="border_width">5</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLabel" id="doc">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes"/>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">True</property>
- <property name="selectable">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkButton" id="manual">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Documentation...</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="manual_cb" name="clicked"/>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes"/>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="0">adv_button</action-widget>
- <action-widget response="0">std_button</action-widget>
- <action-widget response="0">reset_button</action-widget>
- <action-widget response="-6">cancel_button</action-widget>
- <action-widget response="-5">ok_button</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/hacks/.gdbinit b/hacks/.gdbinit
deleted file mode 100644
index 5649178..0000000
--- a/hacks/.gdbinit
+++ /dev/null
@@ -1,12 +0,0 @@
-set args -geom =800x600+0+0 -sync
-set env MallocScribble 1
-set env MallocPreScribble 1
-set env MallocErrorAbort 1
-set env MallocCheckHeapAbort 1
-set env MallocGuardEdges 1
-#set env MallocCheckHeapStart 130000
-#set env MallocCheckHeapEach 1
-b screenhack_ehandler
-b malloc_error_break
-b exit
-b abort
diff --git a/hacks/Makefile.in b/hacks/Makefile.in
deleted file mode 100644
index ef6ee5c..0000000
--- a/hacks/Makefile.in
+++ /dev/null
@@ -1,3465 +0,0 @@
-# hacks/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski.
-# the `../configure' script generates `hacks/Makefile' from this file.
-
-@SET_MAKE@
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = ..
-
-install_prefix =
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-datarootdir = @datarootdir@
-datadir = @datadir@
-mandir = @mandir@
-libexecdir = @libexecdir@
-mansuffix = 6
-manNdir = $(mandir)/man$(mansuffix)
-
-HACKDIR = @HACKDIR@
-HACK_CONF_DIR = @HACK_CONF_DIR@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-LDFLAGS = @LDFLAGS@
-DEFS = -DSTANDALONE @DEFS@
-LIBS = @LIBS@
-PERL = @PERL@
-
-THREAD_LIBS = @PTHREAD_LIBS@
-THREAD_CFLAGS = @PTHREAD_CFLAGS@
-
-DEPEND = @DEPEND@
-DEPEND_FLAGS = @DEPEND_FLAGS@
-DEPEND_DEFINES = @DEPEND_DEFINES@
-
-SHELL = /bin/sh
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_DIRS = @INSTALL_DIRS@
-
-X_CFLAGS = @X_CFLAGS@
-X_LIBS = @X_LIBS@
-X_PRE_LIBS = @X_PRE_LIBS@
-X_EXTRA_LIBS = @X_EXTRA_LIBS@
-XFT_LIBS = @XFT_LIBS@
-
-# Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
-#
-HACK_PRE = $(LIBS) $(X_LIBS)
-HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
-HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ @HACK_LIBS@ $(HACK_POST)
-PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ @HACK_LIBS@ $(HACK_POST)
-JPEG_LIBS = @JPEG_LIBS@
-XLOCK_LIBS = $(HACK_LIBS)
-TEXT_LIBS = @PTY_LIBS@
-
-UTILS_SRC = $(srcdir)/../utils
-UTILS_BIN = ../utils
-HACK_BIN = .
-
-INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I..
-INCLUDES = $(INCLUDES_1) @INCLUDES@
-
-UTIL_SRCS = $(UTILS_SRC)/alpha.c $(UTILS_SRC)/colors.c \
- $(UTILS_SRC)/grabclient.c \
- $(UTILS_SRC)/hsv.c $(UTILS_SRC)/resources.c \
- $(UTILS_SRC)/spline.c $(UTILS_SRC)/usleep.c \
- $(UTILS_SRC)/visual.c \
- $(UTILS_SRC)/yarandom.c $(UTILS_SRC)/erase.c \
- $(UTILS_SRC)/xshm.c $(UTILS_SRC)/xdbe.c \
- $(UTILS_SRC)/textclient.c $(UTILS_SRC)/aligned_malloc.c \
- $(UTILS_SRC)/thread_util.c $(UTILS_SRC)/pow2.c \
- $(UTILS_SRC)/font-retry.c
-UTIL_OBJS = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
- $(UTILS_BIN)/grabclient.o \
- $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
- $(UTILS_BIN)/spline.o $(UTILS_BIN)/usleep.o \
- $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/erase.o \
- $(UTILS_BIN)/xshm.o $(UTILS_BIN)/xdbe.o \
- $(UTILS_BIN)/colorbars.o \
- $(UTILS_BIN)/textclient.o $(UTILS_BIN)/aligned_malloc.o \
- $(UTILS_BIN)/thread_util.o $(UTILS_BIN)/pow2.o \
- $(UTILS_BIN)/xft.o $(UTILS_BIN)/utf8wc.o \
- $(UTILS_BIN)/font-retry.o
-
-SRCS = xscreensaver-getimage.c \
- attraction.c blitspin.c bouboule.c braid.c bubbles.c \
- bubbles-default.c decayscreen.c deco.c drift.c flag.c \
- flame.c forest.c vines.c galaxy.c grav.c greynetic.c \
- halo.c helix.c hopalong.c hypercube.c ifs.c imsmap.c \
- julia.c kaleidescope.c laser.c lightning.c lisa.c lmorph.c \
- maze.c moire.c noseguy.c pedal.c penrose.c pyro.c qix.c \
- rocks.c rorschach.c screenhack.c sierpinski.c slidescreen.c \
- slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \
- fps.c goop.c starfish.c munch.c fadeplot.c \
- rd-bomb.c coral.c mountain.c triangle.c lissie.c worm.c \
- rotor.c ant.c xjack.c xlyap.c \
- cynosure.c moire2.c flow.c epicycle.c interference.c \
- truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \
- demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \
- squiral.c xflame.c wander.c spotlight.c critical.c \
- phosphor.c xmatrix.c petri.c shadebobs.c xsublim.c ccurve.c \
- blaster.c bumps.c ripples.c xspirograph.c \
- nerverot.c xrayswarm.c hyperball.c zoom.c whirlwindwarp.c \
- rotzoomer.c whirlygig.c speedmine.c vermiculate.c \
- ximage-loader.c webcollage-helper.c twang.c apollonian.c \
- euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
- anemone.c halftone.c metaballs.c eruption.c popsquares.c \
- barcode.c piecewise.c cloudlife.c fontglide.c apple2.c \
- apple2-main.c analogtv.c analogtv-cli.c xanalogtv.c pong.c \
- filmleader.c wormhole.c pacman.c pacman_ai.c pacman_level.c \
- fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
- intermomentary.c fireworkx.c fiberlamp.c \
- boxfit.c interaggregate.c celtic.c cwaves.c m6502.c \
- asm6502.c abstractile.c lcdscrub.c hexadrop.c \
- tessellimage.c delaunay.c recanim.c binaryring.c \
- glitchpeg.c vfeedback.c scooter.c webcollage-cocoa.m \
- webcollage-helper-cocoa.m testx11.c
-SCRIPTS = xscreensaver-getimage-file xscreensaver-getimage-video \
- xscreensaver-text vidwhacker webcollage
-
-# Programs that are mentioned in XScreenSaver.ad, and that have XML files,
-# but that are not shipped with xscreensaver itself.
-#
-OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
- bubbles-default.o decayscreen.o deco.o drift.o flag.o \
- flame.o forest.o vines.o galaxy.o grav.o greynetic.o \
- halo.o helix.o hopalong.o hypercube.o ifs.o imsmap.o \
- julia.o kaleidescope.o laser.o lightning.o lisa.o lmorph.o \
- maze.o moire.o noseguy.o pedal.o penrose.o pyro.o qix.o \
- rocks.o rorschach.o screenhack.o sierpinski.o slidescreen.o \
- slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \
- fps.o goop.o starfish.o munch.o fadeplot.o \
- rd-bomb.o coral.o mountain.o triangle.o lissie.o worm.o \
- rotor.o ant.o xjack.o xlyap.o xscreensaver-getimage.o \
- cynosure.o moire2.o flow.o epicycle.o interference.o \
- truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \
- demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \
- squiral.o xflame.o wander.o spotlight.o critical.o \
- phosphor.o xmatrix.o petri.o shadebobs.o xsublim.o ccurve.o \
- blaster.o bumps.o ripples.o xspirograph.o \
- nerverot.o xrayswarm.o hyperball.o zoom.o whirlwindwarp.o \
- rotzoomer.o whirlygig.o speedmine.o vermiculate.o \
- ximage-loader.o webcollage-helper.o twang.o apollonian.o \
- euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
- anemone.o halftone.o metaballs.o eruption.o popsquares.o \
- barcode.o piecewise.o cloudlife.o fontglide.o apple2.o \
- apple2-main.o analogtv.o analogtv2.o analogtv-cli.o \
- xanalogtv.o pong.o filmleader.o wormhole.o pacman.o \
- pacman_ai.o pacman_level.o fuzzyflakes.o anemotaxis.o \
- memscroller.o substrate.o intermomentary.o fireworkx.o \
- fiberlamp.o boxfit.o interaggregate.o celtic.o cwaves.o \
- webcollage-cocoa.o webcollage-helper-cocoa.o m6502.o \
- asm6502.o abstractile.o lcdscrub.o hexadrop.o \
- tessellimage.o delaunay.o recanim.o binaryring.o \
- glitchpeg.o vfeedback.o scooter.o testx11.o
-
-EXES = attraction blitspin bouboule braid decayscreen deco \
- drift flame galaxy grav greynetic halo \
- helix hopalong ifs imsmap julia kaleidescope \
- maze moire noseguy pedal \
- penrose pyro qix rocks rorschach sierpinski slidescreen \
- slip strange swirl goop starfish munch \
- fadeplot rd-bomb coral mountain triangle \
- xjack xlyap cynosure moire2 flow epicycle \
- interference truchet bsod crystal discrete distort kumppa \
- demon loop penetrate deluxe compass squiral xflame \
- wander spotlight phosphor xmatrix petri shadebobs \
- ccurve blaster bumps ripples xspirograph \
- nerverot xrayswarm zoom whirlwindwarp rotzoomer \
- speedmine vermiculate twang apollonian euler2d \
- polyominoes thornbird fluidballs anemone halftone \
- metaballs eruption popsquares barcode piecewise cloudlife \
- fontglide apple2 xanalogtv pong filmleader wormhole \
- pacman fuzzyflakes anemotaxis memscroller substrate \
- intermomentary fireworkx fiberlamp boxfit interaggregate \
- celtic cwaves m6502 abstractile lcdscrub hexadrop \
- tessellimage binaryring glitchpeg vfeedback scooter \
- xscreensaver-getimage @JPEG_EXES@
-JPEG_EXES = webcollage-helper
-
-RETIRED_EXES = ant bubbles critical flag forest hyperball hypercube laser \
- lightning lisa lissie lmorph rotor sphere spiral t3d vines \
- whirlygig worm xsublim juggle
-
-HACK_OBJS_1 = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
- $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/font-retry.o \
- $(UTILS_BIN)/xmu.o @XFT_OBJS@ @ANIM_OBJS@
-HACK_OBJS = screenhack.o $(HACK_OBJS_1)
-XLOCK_OBJS = screenhack.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1) \
- $(ERASE)
-COLOR_OBJS = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
-GRAB_OBJS = $(UTILS_BIN)/grabclient.o
-XSHM_OBJS = $(UTILS_BIN)/xshm.o $(UTILS_BIN)/aligned_malloc.o
-XDBE_OBJS = $(UTILS_BIN)/xdbe.o
-ANIM_OBJS = recanim.o
-ANIM_LIBS = @PNG_LIBS@
-
-HDRS = screenhack.h screenhackI.h fps.h fpsI.h xlockmore.h \
- xlockmoreI.h automata.h bubbles.h ximage-loader.h \
- apple2.h analogtv.h pacman.h pacman_ai.h pacman_level.h \
- asm6502.h delaunay.h recanim.h
-MEN = anemone.man apollonian.man attraction.man \
- blaster.man blitspin.man bouboule.man braid.man bsod.man \
- bumps.man ccurve.man compass.man coral.man \
- crystal.man cynosure.man decayscreen.man \
- deco.man deluxe.man demon.man discrete.man distort.man \
- drift.man epicycle.man euler2d.man fadeplot.man \
- flame.man flow.man fluidballs.man galaxy.man \
- goop.man grav.man greynetic.man halo.man helix.man \
- hopalong.man ifs.man imsmap.man \
- interference.man julia.man \
- kaleidescope.man kumppa.man \
- loop.man maze.man moire.man \
- moire2.man mountain.man munch.man nerverot.man noseguy.man \
- pedal.man penetrate.man penrose.man petri.man phosphor.man \
- polyominoes.man pyro.man qix.man rd-bomb.man ripples.man \
- rocks.man rorschach.man rotzoomer.man \
- shadebobs.man sierpinski.man slidescreen.man slip.man \
- speedmine.man \
- spotlight.man squiral.man starfish.man strange.man \
- swirl.man thornbird.man triangle.man truchet.man \
- twang.man vermiculate.man vidwhacker.man \
- wander.man webcollage.man whirlwindwarp.man \
- xflame.man xjack.man xlyap.man xmatrix.man \
- xrayswarm.man xspirograph.man \
- zoom.man halftone.man eruption.man metaballs.man \
- barcode.man piecewise.man cloudlife.man \
- fontglide.man apple2.man xanalogtv.man filmleader.man \
- pong.man wormhole.man pacman.man fuzzyflakes.man \
- anemotaxis.man memscroller.man substrate.man \
- intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
- interaggregate.man celtic.man cwaves.man abstractile.man \
- lcdscrub.man hexadrop.man tessellimage.man binaryring.man \
- glitchpeg.man vfeedback.man scooter.man \
- xscreensaver-text.man \
- xscreensaver-getimage.man \
- xscreensaver-getimage-file.man \
- xscreensaver-getimage-video.man
-
-RETIRED_MEN = ant.man bubbles.man critical.man flag.man forest.man \
- laser.man lightning.man lisa.man lissie.man lmorph.man \
- rotor.man sphere.man spiral.man t3d.man vines.man \
- whirlygig.man worm.man xsublim.man juggle.man \
- hypercube.man hyperball.man
-
-STAR = *
-EXTRAS = README Makefile.in xml2man.pl m6502.sh .gdbinit \
- euler2d.tex check-configs.pl munge-ad.pl \
- config/README \
- config/$(STAR).xml \
- config/$(STAR).dtd \
- config/$(STAR).xsd \
-
-TARFILES = $(SRCS) $(HDRS) $(SCRIPTS) $(MEN) $(RETIRED_MEN) $(EXTRAS)
-
-
-default: all
-all: $(EXES) $(RETIRED_EXES)
-
-install: install-program install-scripts install-xml install-man
-uninstall: uninstall-program uninstall-xml uninstall-man
-
-install-strip:
- $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
- install
-
-# the hacks, in $HACKDIR
-install-program:: $(EXES)
- @if [ ! -d $(install_prefix)$(HACKDIR) ]; then \
- $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ; \
- fi ; \
- for program in $(EXES); do \
- echo $(INSTALL_PROGRAM) $$program \
- $(install_prefix)$(HACKDIR)/$$program ; \
- $(INSTALL_PROGRAM) $$program \
- $(install_prefix)$(HACKDIR)/$$program ; \
- done
-
-install-scripts: $(SCRIPTS) munge-scripts
- @if [ ! -d $(install_prefix)$(HACKDIR) ]; then \
- $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ; \
- fi ; \
- for program in $(SCRIPTS); do \
- if [ -r $$program ] ; then \
- p=$$program ; \
- else \
- p=$(srcdir)/$$program ; \
- fi ; \
- echo $(INSTALL_SCRIPT) $$p \
- $(install_prefix)$(HACKDIR)/$$program ; \
- $(INSTALL_SCRIPT) $$p \
- $(install_prefix)$(HACKDIR)/$$program ; \
- done
-
-munge-scripts: $(SCRIPTS)
- @tmp=/tmp/mf.$$$$ ; \
- perl="${PERL}" ; \
- rm -f $$tmp ; \
- for program in $(SCRIPTS); do \
- sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@" \
- < $(srcdir)/$$program > $$tmp ; \
- if ! cmp -s $(srcdir)/$$program $$tmp ; then \
- echo "$$program: setting interpreter to $$perl" >&2 ; \
- cat $$tmp > ./$$program ; \
- fi ; \
- done ; \
- rm -f $$tmp
-
-# When installing man pages, we install "foo.man" as "foo.N" and update
-# the .TH line in the installed file with one like
-#
-# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
-#
-# where N is the manual section suffix.
-#
-install-man: $(MEN)
- @men="$(MEN)" ; \
- U=$(UTILS_SRC)/version.h ; \
- V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U | \
- head -1`; \
- T=/tmp/xs$$$$.$(mansuffix) ; \
- TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
- echo "installing man pages: $$TH" ; \
- \
- if [ ! -d $(install_prefix)$(manNdir) ]; then \
- $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
- fi ; \
- \
- for man in $$men; do \
- instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
- manbase=`echo $$man | sed 's/\.man$$//'` ; \
- TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
- sed -e "s/^\.TH.*/$$TH/" \
- -e 's@(MANSUFFIX)@($(mansuffix))@g' \
- < $(srcdir)/$$man > $$T ; \
- echo $(INSTALL_DATA) $(srcdir)/$$man \
- $(install_prefix)$(manNdir)/$$instname ; \
- $(INSTALL_DATA) $$T \
- $(install_prefix)$(manNdir)/$$instname ; \
- done ; \
- rm -f $$T
-
-install-xml:
- @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
- if [ ! -d $$dest ]; then \
- $(INSTALL_DIRS) $$dest ; \
- fi ; \
- src=$(srcdir)/config ; \
- for file in $(EXES) $(SCRIPTS) ; do \
- if [ -f $$src/$$file.xml ]; then \
- echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
- $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
- fi ; \
- done
-
-uninstall-program:
- @for program in $(EXES) $(RETIRED_EXES) $(SCRIPTS); do \
- echo rm -f $(install_prefix)$(HACKDIR)/$$program ; \
- rm -f $(install_prefix)$(HACKDIR)/$$program ; \
- done
-
-uninstall-man:
- @men="$(MEN) $(RETIRED_MEN)" ; \
- for man in $$men; do \
- instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
- echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
- rm -f $(install_prefix)$(manNdir)/$$instname* ; \
- done
-
-uninstall-xml:
- @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
- for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) ; do \
- echo rm -f $$dest/$$file.xml ; \
- rm -f $$dest/$$file.xml ; \
- done
-
-clean::
- -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) m6502.h testx11
-
-distclean: clean
- -rm -f Makefile TAGS *~ "#"*
-
-# Adds all current dependencies to Makefile
-depend:
- $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
- $(DEPEND_FLAGS) -- \
- $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
- $(SRCS)
-
-# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
-# close. This excludes dependencies on files in /usr/include, etc. It tries
-# to include only dependencies on files which are themselves a part of this
-# package.
-distdepend:: m6502.h
- @echo updating dependencies in `pwd`/Makefile.in... ; \
- $(DEPEND) -w 0 -f - \
- -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
- $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
- $(SRCS) 2>/dev/null | \
- sort -d | \
- ( \
- awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
- sed -e '/^#.*/d' \
- -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
- -e 's@\.\./utils@$$(UTILS_SRC)@g' \
- -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
- -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' \
- -e 's@ $$(srcdir)/\(m6502.h\)@ \1@g' \
- -e 's@ $$(srcdir)/\(images/gen/\)@ \1@g' \
- -e 's@ $$(HACK_SRC)/\(images/gen/\)@ \1@g' ; \
- echo '' \
- ) > /tmp/distdepend.$$$$ && \
- mv /tmp/distdepend.$$$$ Makefile.in
-
-TAGS: tags
-tags:
- find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-
-list_tarfiles:
- @find $(TARFILES) -type f -print | sort
-
-
-check_men:
- @badmen="" ; \
- for exe in $(EXES) $(SCRIPTS); do \
- if ! [ -f $(srcdir)/$$exe.man \
- -o "$$exe" = webcollage-helper ]; then \
- badmen="$$badmen $$exe" ; \
- fi ; \
- done ; \
- if [ -n "$$badmen" ]; then \
- echo "" ; \
- echo "Warning: The following programs have no manuals:" ; \
- echo "" ; \
- for m in $$badmen ; do \
- echo " $$m" ; \
- done ; \
- fi
-
-validate_xml:
- @echo "Validating XML..." ; \
- cd $(srcdir) ; ./check-configs.pl $(EXES)
-
-munge_ad_file:
- @echo "Updating hack list in XScreenSaver.ad.in..." ; \
- cd $(srcdir) ; ./munge-ad.pl ../driver/XScreenSaver.ad.in
-
-distdepend:: check_men validate_xml munge_ad_file
-
-
-# Rules for noticing when the objects from the utils directory are out of
-# date with respect to their sources, and going and building them according
-# to the rules in their own Makefile...
-#
-$(UTILS_BIN)/alpha.o: $(UTILS_SRC)/alpha.c
-$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
-$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
-$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
-$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
-$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
-$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
-$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
-$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
-$(UTILS_BIN)/xft.o: $(UTILS_SRC)/xft.c
-$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
-$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
-$(UTILS_BIN)/erase.o: $(UTILS_SRC)/erase.c
-$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
-$(UTILS_BIN)/xdbe.o: $(UTILS_SRC)/xdbe.c
-$(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
-$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
-$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
-$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
-$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
-
-$(UTIL_OBJS):
- cd $(UTILS_BIN) ; \
- $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
-
-# For xscreensaver-getimage
-$(srcdir)/../driver/prefs.o: $(srcdir)/../driver/prefs.c
-$(srcdir)/../driver/prefs.o:
- cd $(srcdir)/../driver ; \
- $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
-
-
-# How we build object files in this directory.
-HACK_CFLAGS_BASE=$(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
-.c.o:
- $(CC) -c $(HACK_CFLAGS_BASE) $<
-
-
-# Make sure these are regenerated when the version number ticks.
-screenhack.o: $(UTILS_SRC)/version.h
-
-# Some abbreviations to keep the lines short...
-PNG = ximage-loader.o
-ALP = $(UTILS_BIN)/alpha.o
-HSV = $(UTILS_BIN)/hsv.o
-SPL = $(UTILS_BIN)/spline.o
-GRAB = $(GRAB_OBJS)
-ERASE = $(UTILS_BIN)/erase.o
-COL = $(COLOR_OBJS)
-SHM = $(XSHM_OBJS)
-DBE = $(XDBE_OBJS)
-BARS = $(UTILS_BIN)/colorbars.o
-THRO = $(UTILS_BIN)/thread_util.o
-THRL = $(THREAD_CFLAGS) $(THREAD_LIBS)
-ATV = analogtv.o $(SHM) $(THRO)
-APPLE2 = apple2.o $(ATV)
-TEXT = $(UTILS_BIN)/textclient.o
-
-CC_HACK = $(CC) $(LDFLAGS)
-
-test-utf8wc: $(UTILS_SRC)/utf8wc.c
- $(CC) $(HACK_CFLAGS_BASE) $(LDFLAGS) -o $@ -DSELFTEST $<
-
-# Make sure the images have been packaged. These are the first ones hit.
-#
-images/gen/som_png.h images/gen/6x10font_png.h:
- cd $(srcdir)/images && $(MAKE)
- @if ! [ -f "$@" ]; then \
- echo; echo $@ "wasn't built -- try 'gmake' instead?"; echo; exit 1; \
- fi
-
-GETIMG_OBJS = xscreensaver-getimage.o \
- $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
- $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
- $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
- $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o \
- $(UTILS_BIN)/xmu.o \
- $(srcdir)/../driver/prefs.o
-GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \
- $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
-
-# xscreensaver-getimage.o: XScreenSaver_ad.h
-xscreensaver-getimage: $(GETIMG_OBJS)
- $(CC) $(LDFLAGS) -o $@ $(GETIMG_OBJS) $(GETIMG_LIBS) -lm
-
-
-
-# The rules for those hacks which follow the `screenhack.c' API.
-# If make wasn't such an utter abomination, these could all be combined
-# into one rule, but we don't live in such a perfect world. The $< rule
-# is pretty much useless in the face of more than one dependency, as far
-# as I can tell.
-#
-attraction: attraction.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
-
-binaryring: binaryring.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-blitspin: blitspin.o $(HACK_OBJS) $(GRAB) $(PNG) $(UTILS_BIN)/pow2.o
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(PNG) $(UTILS_BIN)/pow2.o $(PNG_LIBS)
-
-bubbles: bubbles.o $(HACK_OBJS) bubbles-default.o $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) bubbles-default.o $(PNG) $(PNG_LIBS)
-
-decayscreen: decayscreen.o $(HACK_OBJS) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
-
-deco: deco.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-flame: flame.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-greynetic: greynetic.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-halo: halo.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-helix: helix.o $(HACK_OBJS) $(HSV) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
-
-hypercube: hypercube.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-imsmap: imsmap.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-kaleidescope: kaleidescope.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-lmorph: lmorph.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-maze: maze.o $(HACK_OBJS) $(ERASE) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ERASE) $(PNG) $(PNG_LIBS)
-
-moire: moire.o $(HACK_OBJS) $(COL) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
-
-moire2: moire2.o $(HACK_OBJS) $(COL) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
-
-noseguy: noseguy.o $(HACK_OBJS) $(PNG) $(TEXT)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(TEXT) $(PNG_LIBS) $(TEXT_LIBS)
-
-pedal: pedal.o $(HACK_OBJS) $(HSV) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
-
-pyro: pyro.o $(HACK_OBJS) $(HSV)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS)
-
-qix: qix.o $(HACK_OBJS) $(HSV) $(ALP)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ALP) $(HACK_LIBS)
-
-rocks: rocks.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-rorschach: rorschach.o $(HACK_OBJS) $(HSV) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
-
-slidescreen: slidescreen.o $(HACK_OBJS) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
-
-goop: goop.o $(HACK_OBJS) $(HSV) $(ALP) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ALP) $(SPL) $(HACK_LIBS)
-
-starfish: starfish.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
-
-munch: munch.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(UTILS_BIN)/pow2.o $(HACK_LIBS)
-
-rd-bomb: rd-bomb.o $(HACK_OBJS) $(COL) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
-
-coral: coral.o $(HACK_OBJS) $(COL) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-xjack: xjack.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-xlyap: xlyap.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-cynosure: cynosure.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-epicycle: epicycle.o $(HACK_OBJS) $(COL) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-interference: interference.o $(HACK_OBJS) $(COL) $(SHM) $(THRO) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(THRO) $(DBE) $(HACK_LIBS) $(THRL)
-
-truchet: truchet.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-bsod: bsod.o $(HACK_OBJS) $(GRAB) $(APPLE2) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(APPLE2) $(PNG) $(PNG_LIBS) $(THRL)
-
-apple2: apple2.o apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(PNG)
- $(CC_HACK) -o $@ $@.o apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(PNG) $(PNG_LIBS) $(TEXT_LIBS) $(THRL)
-
-xanalogtv: xanalogtv.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
-
-ATVCLI_CFLAGS=-DANALOGTV_SCALE=1 -DNO_CONSTRAIN_RATIO $(HACK_CFLAGS_BASE)
-analogtv2.o: Makefile
-analogtv2.o: images/gen/6x10font_png.h
-analogtv2.o: $(srcdir)/analogtv.h
-analogtv2.o: $(srcdir)/analogtv.c
- $(CC) -o $@ -c $(ATVCLI_CFLAGS) $<
-analogtv-cli.o: $(srcdir)/analogtv-cli.c
- $(CC) -o $@ -c $(ATVCLI_CFLAGS) $<
-
-ATVCLI = analogtv2.o $(UTILS_BIN)/yarandom.o \
- $(UTILS_BIN)/aligned_malloc.o $(THRO) $(PNG) @ANIM_OBJS@
-analogtv-cli: analogtv-cli.o $(ATVCLI)
- $(CC_HACK) -o $@ $@.o $(ATVCLI) $(THRL) $(PNG_LIBS) -lpng
-clean::
- -rm -f analogtv-cli
-
-distort: distort.o $(HACK_OBJS) $(GRAB) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
-
-kumppa: kumppa.o $(HACK_OBJS) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
-
-t3d: t3d.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-penetrate: penetrate.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-deluxe: deluxe.o $(HACK_OBJS) $(ALP) $(COL) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS)
-
-compass: compass.o $(HACK_OBJS) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
-
-squiral: squiral.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-xflame: xflame.o $(HACK_OBJS) $(SHM) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(PNG) $(PNG_LIBS) $(THRL)
-
-wander: wander.o $(HACK_OBJS) $(COL) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-spotlight: spotlight.o $(HACK_OBJS) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
-
-critical: critical.o $(HACK_OBJS) $(COL) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-phosphor: phosphor.o $(HACK_OBJS) $(TEXT) $(COL) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(TEXT) $(COL) $(PNG) $(PNG_LIBS) $(TEXT_LIBS)
-
-xmatrix: xmatrix.o $(HACK_OBJS) $(TEXT) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(TEXT) $(PNG) $(PNG_LIBS) $(TEXT_LIBS)
-
-petri: petri.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
-
-shadebobs: shadebobs.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
-
-ccurve: ccurve.o $(HACK_OBJS) $(COL) $(SPL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-blaster: blaster.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-bumps: bumps.o $(HACK_OBJS) $(GRAB) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
-
-ripples: ripples.o $(HACK_OBJS) $(SHM) $(COL) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(COL) $(GRAB) $(HACK_LIBS) $(THRL)
-
-xspirograph: xspirograph.o $(HACK_OBJS) $(COL) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-nerverot: nerverot.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-xrayswarm: xrayswarm.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-hyperball: hyperball.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-zoom: zoom.o $(HACK_OBJS) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
-
-whirlwindwarp: whirlwindwarp.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-rotzoomer: rotzoomer.o $(HACK_OBJS) $(GRAB) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
-
-whirlygig: whirlygig.o $(HACK_OBJS) $(DBE) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(COL) $(HACK_LIBS)
-
-speedmine: speedmine.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-vermiculate: vermiculate.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-twang: twang.o $(HACK_OBJS) $(GRAB) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
-
-fluidballs: fluidballs.o $(HACK_OBJS) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
-
-anemone: anemone.o $(HACK_OBJS) $(COL) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
-
-halftone: halftone.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-metaballs: metaballs.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-eruption: eruption.o $(HACK_OBJS) $(SHM)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(HACK_LIBS) $(THRL)
-
-popsquares: popsquares.o $(HACK_OBJS) $(DBE) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(COL) $(HACK_LIBS)
-
-barcode: barcode.o $(HACK_OBJS) $(HSV)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS)
-
-piecewise: piecewise.o $(HACK_OBJS) $(COL) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
-
-cloudlife: cloudlife.o $(HACK_OBJS) $(COL) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
-
-fontglide: fontglide.o $(HACK_OBJS) $(DBE) $(TEXT)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(TEXT) $(HACK_LIBS) $(TEXT_LIBS)
-
-pong: pong.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
-
-wormhole: wormhole.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-fuzzyflakes: fuzzyflakes.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-anemotaxis: anemotaxis.o $(HACK_OBJS) $(COL) $(DBE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
-
-memscroller: memscroller.o $(HACK_OBJS) $(SHM) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(COL) $(HACK_LIBS) $(THRL)
-
-substrate: substrate.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-intermomentary: intermomentary.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-interaggregate: interaggregate.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-fireworkx: fireworkx.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-boxfit: boxfit.o $(HACK_OBJS) $(COL) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(GRAB) $(HACK_LIBS)
-
-ifs: ifs.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-celtic: celtic.o $(HACK_OBJS) $(COL) $(ERASE)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
-
-cwaves: cwaves.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-m6502.h:
- @echo "building m6502.h from $(srcdir)/images/m6502/*.asm"; \
- UTILS_SRC="$(UTILS_SRC)" \
- $(srcdir)/m6502.sh m6502.h $(srcdir)/images/m6502/*.asm
-
-m6502.o: m6502.h
-m6502: m6502.o asm6502.o $(HACK_OBJS) $(ATV) $(PNG)
- $(CC_HACK) -o $@ $@.o asm6502.o $(HACK_OBJS) $(ATV) $(PNG) $(PNG_LIBS) $(THRL)
-
-abstractile: abstractile.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-lcdscrub: lcdscrub.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-hexadrop: hexadrop.o $(HACK_OBJS) $(COL)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
-
-tessellimage: tessellimage.o delaunay.o $(HACK_OBJS) $(GRAB)
- $(CC_HACK) -o $@ $@.o delaunay.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
-
-glitchpeg: glitchpeg.o $(HACK_OBJS) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
-
-filmleader: filmleader.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
-
-vfeedback: vfeedback.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
-
-
-testx11: testx11.o glx/rotator.o $(HACK_OBJS) $(COL) $(PNG) $(BARS) $(ERASE)
- $(CC_HACK) -o $@ $@.o glx/rotator.o $(HACK_OBJS) $(COL) $(PNG) $(BARS) $(ERASE) $(PNG_LIBS)
-
-glx/rotator.o: glx/rotator.c
- cd glx ; \
- $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
-
-# The rules for those hacks which follow the `xlockmore' API.
-#
-
-bouboule: bouboule.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-braid: braid.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-drift: drift.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-flag: flag.o $(XLOCK_OBJS) $(PNG)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(PNG) $(PNG_LIBS)
-
-forest: forest.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-vines: vines.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-galaxy: galaxy.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-grav: grav.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-hopalong: hopalong.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-julia: julia.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-laser: laser.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-lightning: lightning.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-lisa: lisa.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-lissie: lissie.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-penrose: penrose.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-sierpinski: sierpinski.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-slip: slip.o $(XLOCK_OBJS) $(GRAB)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(GRAB) $(HACK_LIBS)
-
-sphere: sphere.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-spiral: spiral.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-strange: strange.o $(XLOCK_OBJS) $(SHM) $(THRO) $(UTILS_BIN)/pow2.o
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(THRO) $(UTILS_BIN)/pow2.o $(HACK_LIBS) $(THRL)
-
-swirl: swirl.o $(XLOCK_OBJS) $(SHM)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(HACK_LIBS) $(THRL)
-
-fadeplot: fadeplot.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-mountain: mountain.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-triangle: triangle.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-worm: worm.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-rotor: rotor.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-ant: ant.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-demon: demon.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-loop: loop.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-flow: flow.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-discrete: discrete.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-crystal: crystal.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-apollonian: apollonian.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-euler2d: euler2d.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-juggle: juggle.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-polyominoes: polyominoes.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-thornbird: thornbird.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-PACOBJS=pacman_ai.o pacman_level.o
-pacman: pacman.o $(PACOBJS) $(XLOCK_OBJS) $(PNG)
- $(CC_HACK) -o $@ $@.o $(PACOBJS) $(XLOCK_OBJS) $(PNG) $(PNG_LIBS)
-
-fiberlamp: fiberlamp.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-scooter: scooter.o $(XLOCK_OBJS)
- $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
-
-# These are not like the others.
-#
-xsublim: xsublim.o $(HACK_OBJS_1)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS_1) $(HACK_LIBS)
-
-webcollage-helper: webcollage-helper.o
- $(CC_HACK) -o $@ $@.o $(PNG_LIBS) $(JPEG_LIBS)
-
-
-##############################################################################
-#
-# DO NOT DELETE: updated by make distdepend
-
-abstractile.o: ../config.h
-abstractile.o: $(srcdir)/fps.h
-abstractile.o: $(srcdir)/recanim.h
-abstractile.o: $(srcdir)/screenhackI.h
-abstractile.o: $(srcdir)/screenhack.h
-abstractile.o: $(UTILS_SRC)/colors.h
-abstractile.o: $(UTILS_SRC)/font-retry.h
-abstractile.o: $(UTILS_SRC)/grabscreen.h
-abstractile.o: $(UTILS_SRC)/hsv.h
-abstractile.o: $(UTILS_SRC)/resources.h
-abstractile.o: $(UTILS_SRC)/usleep.h
-abstractile.o: $(UTILS_SRC)/visual.h
-abstractile.o: $(UTILS_SRC)/xft.h
-abstractile.o: $(UTILS_SRC)/yarandom.h
-analogtv-cli.o: $(srcdir)/analogtv.h
-analogtv-cli.o: ../config.h
-analogtv-cli.o: $(srcdir)/fps.h
-analogtv-cli.o: $(srcdir)/recanim.h
-analogtv-cli.o: $(srcdir)/screenhackI.h
-analogtv-cli.o: $(UTILS_SRC)/aligned_malloc.h
-analogtv-cli.o: $(UTILS_SRC)/colors.h
-analogtv-cli.o: $(UTILS_SRC)/font-retry.h
-analogtv-cli.o: $(UTILS_SRC)/grabscreen.h
-analogtv-cli.o: $(UTILS_SRC)/hsv.h
-analogtv-cli.o: $(UTILS_SRC)/resources.h
-analogtv-cli.o: $(UTILS_SRC)/thread_util.h
-analogtv-cli.o: $(UTILS_SRC)/usleep.h
-analogtv-cli.o: $(UTILS_SRC)/visual.h
-analogtv-cli.o: $(UTILS_SRC)/xft.h
-analogtv-cli.o: $(UTILS_SRC)/xshm.h
-analogtv-cli.o: $(UTILS_SRC)/yarandom.h
-analogtv-cli.o: $(srcdir)/ximage-loader.h
-analogtv.o: $(srcdir)/analogtv.h
-analogtv.o: ../config.h
-analogtv.o: images/gen/6x10font_png.h
-analogtv.o: $(UTILS_SRC)/aligned_malloc.h
-analogtv.o: $(UTILS_SRC)/font-retry.h
-analogtv.o: $(UTILS_SRC)/grabscreen.h
-analogtv.o: $(UTILS_SRC)/resources.h
-analogtv.o: $(UTILS_SRC)/thread_util.h
-analogtv.o: $(UTILS_SRC)/utils.h
-analogtv.o: $(UTILS_SRC)/visual.h
-analogtv.o: $(UTILS_SRC)/xft.h
-analogtv.o: $(UTILS_SRC)/xshm.h
-analogtv.o: $(UTILS_SRC)/yarandom.h
-analogtv.o: $(srcdir)/ximage-loader.h
-anemone.o: ../config.h
-anemone.o: $(srcdir)/fps.h
-anemone.o: $(srcdir)/recanim.h
-anemone.o: $(srcdir)/screenhackI.h
-anemone.o: $(srcdir)/screenhack.h
-anemone.o: $(UTILS_SRC)/colors.h
-anemone.o: $(UTILS_SRC)/font-retry.h
-anemone.o: $(UTILS_SRC)/grabscreen.h
-anemone.o: $(UTILS_SRC)/hsv.h
-anemone.o: $(UTILS_SRC)/resources.h
-anemone.o: $(UTILS_SRC)/usleep.h
-anemone.o: $(UTILS_SRC)/visual.h
-anemone.o: $(UTILS_SRC)/xdbe.h
-anemone.o: $(UTILS_SRC)/xft.h
-anemone.o: $(UTILS_SRC)/yarandom.h
-anemotaxis.o: ../config.h
-anemotaxis.o: $(srcdir)/fps.h
-anemotaxis.o: $(srcdir)/recanim.h
-anemotaxis.o: $(srcdir)/screenhackI.h
-anemotaxis.o: $(srcdir)/screenhack.h
-anemotaxis.o: $(UTILS_SRC)/colors.h
-anemotaxis.o: $(UTILS_SRC)/font-retry.h
-anemotaxis.o: $(UTILS_SRC)/grabscreen.h
-anemotaxis.o: $(UTILS_SRC)/hsv.h
-anemotaxis.o: $(UTILS_SRC)/resources.h
-anemotaxis.o: $(UTILS_SRC)/usleep.h
-anemotaxis.o: $(UTILS_SRC)/visual.h
-anemotaxis.o: $(UTILS_SRC)/xdbe.h
-anemotaxis.o: $(UTILS_SRC)/xft.h
-anemotaxis.o: $(UTILS_SRC)/yarandom.h
-ant.o: $(srcdir)/automata.h
-ant.o: ../config.h
-ant.o: $(srcdir)/fps.h
-ant.o: $(srcdir)/recanim.h
-ant.o: $(srcdir)/screenhackI.h
-ant.o: $(UTILS_SRC)/colors.h
-ant.o: $(UTILS_SRC)/erase.h
-ant.o: $(UTILS_SRC)/font-retry.h
-ant.o: $(UTILS_SRC)/grabscreen.h
-ant.o: $(UTILS_SRC)/hsv.h
-ant.o: $(UTILS_SRC)/resources.h
-ant.o: $(UTILS_SRC)/usleep.h
-ant.o: $(UTILS_SRC)/visual.h
-ant.o: $(UTILS_SRC)/xft.h
-ant.o: $(UTILS_SRC)/yarandom.h
-ant.o: $(srcdir)/xlockmoreI.h
-ant.o: $(srcdir)/xlockmore.h
-apollonian.o: ../config.h
-apollonian.o: $(srcdir)/fps.h
-apollonian.o: $(srcdir)/recanim.h
-apollonian.o: $(srcdir)/screenhackI.h
-apollonian.o: $(UTILS_SRC)/colors.h
-apollonian.o: $(UTILS_SRC)/erase.h
-apollonian.o: $(UTILS_SRC)/font-retry.h
-apollonian.o: $(UTILS_SRC)/grabscreen.h
-apollonian.o: $(UTILS_SRC)/hsv.h
-apollonian.o: $(UTILS_SRC)/resources.h
-apollonian.o: $(UTILS_SRC)/usleep.h
-apollonian.o: $(UTILS_SRC)/visual.h
-apollonian.o: $(UTILS_SRC)/xft.h
-apollonian.o: $(UTILS_SRC)/yarandom.h
-apollonian.o: $(srcdir)/xlockmoreI.h
-apollonian.o: $(srcdir)/xlockmore.h
-apple2-main.o: $(srcdir)/analogtv.h
-apple2-main.o: $(srcdir)/apple2.h
-apple2-main.o: ../config.h
-apple2-main.o: $(srcdir)/fps.h
-apple2-main.o: $(srcdir)/recanim.h
-apple2-main.o: $(srcdir)/screenhackI.h
-apple2-main.o: $(srcdir)/screenhack.h
-apple2-main.o: $(UTILS_SRC)/aligned_malloc.h
-apple2-main.o: $(UTILS_SRC)/colors.h
-apple2-main.o: $(UTILS_SRC)/font-retry.h
-apple2-main.o: $(UTILS_SRC)/grabscreen.h
-apple2-main.o: $(UTILS_SRC)/hsv.h
-apple2-main.o: $(UTILS_SRC)/resources.h
-apple2-main.o: $(UTILS_SRC)/textclient.h
-apple2-main.o: $(UTILS_SRC)/thread_util.h
-apple2-main.o: $(UTILS_SRC)/usleep.h
-apple2-main.o: $(UTILS_SRC)/utf8wc.h
-apple2-main.o: $(UTILS_SRC)/visual.h
-apple2-main.o: $(UTILS_SRC)/xft.h
-apple2-main.o: $(UTILS_SRC)/xshm.h
-apple2-main.o: $(UTILS_SRC)/yarandom.h
-apple2.o: $(srcdir)/analogtv.h
-apple2.o: $(srcdir)/apple2.h
-apple2.o: ../config.h
-apple2.o: $(srcdir)/fps.h
-apple2.o: images/gen/apple2font_png.h
-apple2.o: $(srcdir)/recanim.h
-apple2.o: $(srcdir)/screenhackI.h
-apple2.o: $(UTILS_SRC)/aligned_malloc.h
-apple2.o: $(UTILS_SRC)/colors.h
-apple2.o: $(UTILS_SRC)/font-retry.h
-apple2.o: $(UTILS_SRC)/grabscreen.h
-apple2.o: $(UTILS_SRC)/hsv.h
-apple2.o: $(UTILS_SRC)/resources.h
-apple2.o: $(UTILS_SRC)/thread_util.h
-apple2.o: $(UTILS_SRC)/usleep.h
-apple2.o: $(UTILS_SRC)/visual.h
-apple2.o: $(UTILS_SRC)/xft.h
-apple2.o: $(UTILS_SRC)/xshm.h
-apple2.o: $(UTILS_SRC)/yarandom.h
-apple2.o: $(srcdir)/ximage-loader.h
-asm6502.o: $(srcdir)/asm6502.h
-asm6502.o: ../config.h
-asm6502.o: $(UTILS_SRC)/yarandom.h
-attraction.o: ../config.h
-attraction.o: $(srcdir)/fps.h
-attraction.o: $(srcdir)/recanim.h
-attraction.o: $(srcdir)/screenhackI.h
-attraction.o: $(srcdir)/screenhack.h
-attraction.o: $(UTILS_SRC)/colors.h
-attraction.o: $(UTILS_SRC)/font-retry.h
-attraction.o: $(UTILS_SRC)/grabscreen.h
-attraction.o: $(UTILS_SRC)/hsv.h
-attraction.o: $(UTILS_SRC)/resources.h
-attraction.o: $(UTILS_SRC)/spline.h
-attraction.o: $(UTILS_SRC)/usleep.h
-attraction.o: $(UTILS_SRC)/visual.h
-attraction.o: $(UTILS_SRC)/xft.h
-attraction.o: $(UTILS_SRC)/yarandom.h
-barcode.o: ../config.h
-barcode.o: $(srcdir)/fps.h
-barcode.o: $(srcdir)/recanim.h
-barcode.o: $(srcdir)/screenhackI.h
-barcode.o: $(srcdir)/screenhack.h
-barcode.o: $(UTILS_SRC)/colors.h
-barcode.o: $(UTILS_SRC)/font-retry.h
-barcode.o: $(UTILS_SRC)/grabscreen.h
-barcode.o: $(UTILS_SRC)/hsv.h
-barcode.o: $(UTILS_SRC)/resources.h
-barcode.o: $(UTILS_SRC)/usleep.h
-barcode.o: $(UTILS_SRC)/visual.h
-barcode.o: $(UTILS_SRC)/xft.h
-barcode.o: $(UTILS_SRC)/yarandom.h
-binaryring.o: ../config.h
-binaryring.o: $(srcdir)/fps.h
-binaryring.o: $(srcdir)/recanim.h
-binaryring.o: $(srcdir)/screenhackI.h
-binaryring.o: $(srcdir)/screenhack.h
-binaryring.o: $(UTILS_SRC)/colors.h
-binaryring.o: $(UTILS_SRC)/font-retry.h
-binaryring.o: $(UTILS_SRC)/grabscreen.h
-binaryring.o: $(UTILS_SRC)/hsv.h
-binaryring.o: $(UTILS_SRC)/resources.h
-binaryring.o: $(UTILS_SRC)/usleep.h
-binaryring.o: $(UTILS_SRC)/visual.h
-binaryring.o: $(UTILS_SRC)/xft.h
-binaryring.o: $(UTILS_SRC)/yarandom.h
-blaster.o: ../config.h
-blaster.o: $(srcdir)/fps.h
-blaster.o: $(srcdir)/recanim.h
-blaster.o: $(srcdir)/screenhackI.h
-blaster.o: $(srcdir)/screenhack.h
-blaster.o: $(UTILS_SRC)/colors.h
-blaster.o: $(UTILS_SRC)/font-retry.h
-blaster.o: $(UTILS_SRC)/grabscreen.h
-blaster.o: $(UTILS_SRC)/hsv.h
-blaster.o: $(UTILS_SRC)/resources.h
-blaster.o: $(UTILS_SRC)/usleep.h
-blaster.o: $(UTILS_SRC)/visual.h
-blaster.o: $(UTILS_SRC)/xft.h
-blaster.o: $(UTILS_SRC)/yarandom.h
-blitspin.o: ../config.h
-blitspin.o: $(srcdir)/fps.h
-blitspin.o: images/gen/som_png.h
-blitspin.o: $(srcdir)/recanim.h
-blitspin.o: $(srcdir)/screenhackI.h
-blitspin.o: $(srcdir)/screenhack.h
-blitspin.o: $(UTILS_SRC)/colors.h
-blitspin.o: $(UTILS_SRC)/font-retry.h
-blitspin.o: $(UTILS_SRC)/grabscreen.h
-blitspin.o: $(UTILS_SRC)/hsv.h
-blitspin.o: $(UTILS_SRC)/pow2.h
-blitspin.o: $(UTILS_SRC)/resources.h
-blitspin.o: $(UTILS_SRC)/usleep.h
-blitspin.o: $(UTILS_SRC)/visual.h
-blitspin.o: $(UTILS_SRC)/xft.h
-blitspin.o: $(UTILS_SRC)/yarandom.h
-blitspin.o: $(srcdir)/ximage-loader.h
-bouboule.o: ../config.h
-bouboule.o: $(srcdir)/fps.h
-bouboule.o: $(srcdir)/recanim.h
-bouboule.o: $(srcdir)/screenhackI.h
-bouboule.o: $(UTILS_SRC)/colors.h
-bouboule.o: $(UTILS_SRC)/erase.h
-bouboule.o: $(UTILS_SRC)/font-retry.h
-bouboule.o: $(UTILS_SRC)/grabscreen.h
-bouboule.o: $(UTILS_SRC)/hsv.h
-bouboule.o: $(UTILS_SRC)/resources.h
-bouboule.o: $(UTILS_SRC)/usleep.h
-bouboule.o: $(UTILS_SRC)/visual.h
-bouboule.o: $(UTILS_SRC)/xft.h
-bouboule.o: $(UTILS_SRC)/yarandom.h
-bouboule.o: $(srcdir)/xlockmoreI.h
-bouboule.o: $(srcdir)/xlockmore.h
-boxfit.o: ../config.h
-boxfit.o: $(srcdir)/fps.h
-boxfit.o: $(srcdir)/recanim.h
-boxfit.o: $(srcdir)/screenhackI.h
-boxfit.o: $(srcdir)/screenhack.h
-boxfit.o: $(UTILS_SRC)/colors.h
-boxfit.o: $(UTILS_SRC)/font-retry.h
-boxfit.o: $(UTILS_SRC)/grabscreen.h
-boxfit.o: $(UTILS_SRC)/hsv.h
-boxfit.o: $(UTILS_SRC)/resources.h
-boxfit.o: $(UTILS_SRC)/usleep.h
-boxfit.o: $(UTILS_SRC)/visual.h
-boxfit.o: $(UTILS_SRC)/xft.h
-boxfit.o: $(UTILS_SRC)/yarandom.h
-boxfit.o: $(srcdir)/ximage-loader.h
-braid.o: ../config.h
-braid.o: $(srcdir)/fps.h
-braid.o: $(srcdir)/recanim.h
-braid.o: $(srcdir)/screenhackI.h
-braid.o: $(UTILS_SRC)/colors.h
-braid.o: $(UTILS_SRC)/erase.h
-braid.o: $(UTILS_SRC)/font-retry.h
-braid.o: $(UTILS_SRC)/grabscreen.h
-braid.o: $(UTILS_SRC)/hsv.h
-braid.o: $(UTILS_SRC)/resources.h
-braid.o: $(UTILS_SRC)/usleep.h
-braid.o: $(UTILS_SRC)/visual.h
-braid.o: $(UTILS_SRC)/xft.h
-braid.o: $(UTILS_SRC)/yarandom.h
-braid.o: $(srcdir)/xlockmoreI.h
-braid.o: $(srcdir)/xlockmore.h
-bsod.o: $(srcdir)/analogtv.h
-bsod.o: $(srcdir)/apple2.h
-bsod.o: ../config.h
-bsod.o: $(srcdir)/fps.h
-bsod.o: images/gen/amiga_png.h
-bsod.o: images/gen/android_png.h
-bsod.o: images/gen/apple_png.h
-bsod.o: images/gen/atari_png.h
-bsod.o: images/gen/atm_png.h
-bsod.o: images/gen/dvd_png.h
-bsod.o: images/gen/gnome1_png.h
-bsod.o: images/gen/gnome2_png.h
-bsod.o: images/gen/hmac_png.h
-bsod.o: images/gen/macbomb_png.h
-bsod.o: images/gen/mac_png.h
-bsod.o: images/gen/osx_10_2_png.h
-bsod.o: images/gen/osx_10_3_png.h
-bsod.o: images/gen/ransomware_png.h
-bsod.o: images/gen/sun_png.h
-bsod.o: $(srcdir)/recanim.h
-bsod.o: $(srcdir)/screenhackI.h
-bsod.o: $(srcdir)/screenhack.h
-bsod.o: $(UTILS_SRC)/aligned_malloc.h
-bsod.o: $(UTILS_SRC)/colors.h
-bsod.o: $(UTILS_SRC)/font-retry.h
-bsod.o: $(UTILS_SRC)/grabscreen.h
-bsod.o: $(UTILS_SRC)/hsv.h
-bsod.o: $(UTILS_SRC)/resources.h
-bsod.o: $(UTILS_SRC)/thread_util.h
-bsod.o: $(UTILS_SRC)/usleep.h
-bsod.o: $(UTILS_SRC)/visual.h
-bsod.o: $(UTILS_SRC)/xft.h
-bsod.o: $(UTILS_SRC)/xshm.h
-bsod.o: $(UTILS_SRC)/yarandom.h
-bsod.o: $(srcdir)/ximage-loader.h
-bubbles-default.o: $(srcdir)/bubbles.h
-bubbles-default.o: ../config.h
-bubbles-default.o: images/gen/blood10_png.h
-bubbles-default.o: images/gen/blood11_png.h
-bubbles-default.o: images/gen/blood1_png.h
-bubbles-default.o: images/gen/blood2_png.h
-bubbles-default.o: images/gen/blood3_png.h
-bubbles-default.o: images/gen/blood4_png.h
-bubbles-default.o: images/gen/blood5_png.h
-bubbles-default.o: images/gen/blood6_png.h
-bubbles-default.o: images/gen/blood7_png.h
-bubbles-default.o: images/gen/blood8_png.h
-bubbles-default.o: images/gen/blood9_png.h
-bubbles-default.o: images/gen/blue10_png.h
-bubbles-default.o: images/gen/blue11_png.h
-bubbles-default.o: images/gen/blue1_png.h
-bubbles-default.o: images/gen/blue2_png.h
-bubbles-default.o: images/gen/blue3_png.h
-bubbles-default.o: images/gen/blue4_png.h
-bubbles-default.o: images/gen/blue5_png.h
-bubbles-default.o: images/gen/blue6_png.h
-bubbles-default.o: images/gen/blue7_png.h
-bubbles-default.o: images/gen/blue8_png.h
-bubbles-default.o: images/gen/blue9_png.h
-bubbles-default.o: images/gen/glass10_png.h
-bubbles-default.o: images/gen/glass11_png.h
-bubbles-default.o: images/gen/glass1_png.h
-bubbles-default.o: images/gen/glass2_png.h
-bubbles-default.o: images/gen/glass3_png.h
-bubbles-default.o: images/gen/glass4_png.h
-bubbles-default.o: images/gen/glass5_png.h
-bubbles-default.o: images/gen/glass6_png.h
-bubbles-default.o: images/gen/glass7_png.h
-bubbles-default.o: images/gen/glass8_png.h
-bubbles-default.o: images/gen/glass9_png.h
-bubbles-default.o: images/gen/jade10_png.h
-bubbles-default.o: images/gen/jade11_png.h
-bubbles-default.o: images/gen/jade1_png.h
-bubbles-default.o: images/gen/jade2_png.h
-bubbles-default.o: images/gen/jade3_png.h
-bubbles-default.o: images/gen/jade4_png.h
-bubbles-default.o: images/gen/jade5_png.h
-bubbles-default.o: images/gen/jade6_png.h
-bubbles-default.o: images/gen/jade7_png.h
-bubbles-default.o: images/gen/jade8_png.h
-bubbles-default.o: images/gen/jade9_png.h
-bubbles-default.o: $(UTILS_SRC)/yarandom.h
-bubbles.o: $(srcdir)/bubbles.h
-bubbles.o: ../config.h
-bubbles.o: $(srcdir)/fps.h
-bubbles.o: $(srcdir)/recanim.h
-bubbles.o: $(srcdir)/screenhackI.h
-bubbles.o: $(srcdir)/screenhack.h
-bubbles.o: $(UTILS_SRC)/colors.h
-bubbles.o: $(UTILS_SRC)/font-retry.h
-bubbles.o: $(UTILS_SRC)/grabscreen.h
-bubbles.o: $(UTILS_SRC)/hsv.h
-bubbles.o: $(UTILS_SRC)/resources.h
-bubbles.o: $(UTILS_SRC)/usleep.h
-bubbles.o: $(UTILS_SRC)/visual.h
-bubbles.o: $(UTILS_SRC)/xft.h
-bubbles.o: $(UTILS_SRC)/yarandom.h
-bubbles.o: $(srcdir)/ximage-loader.h
-bumps.o: ../config.h
-bumps.o: $(srcdir)/fps.h
-bumps.o: $(srcdir)/recanim.h
-bumps.o: $(srcdir)/screenhackI.h
-bumps.o: $(srcdir)/screenhack.h
-bumps.o: $(UTILS_SRC)/colors.h
-bumps.o: $(UTILS_SRC)/font-retry.h
-bumps.o: $(UTILS_SRC)/grabscreen.h
-bumps.o: $(UTILS_SRC)/hsv.h
-bumps.o: $(UTILS_SRC)/resources.h
-bumps.o: $(UTILS_SRC)/usleep.h
-bumps.o: $(UTILS_SRC)/visual.h
-bumps.o: $(UTILS_SRC)/xft.h
-bumps.o: $(UTILS_SRC)/xshm.h
-bumps.o: $(UTILS_SRC)/yarandom.h
-ccurve.o: ../config.h
-ccurve.o: $(srcdir)/fps.h
-ccurve.o: $(srcdir)/recanim.h
-ccurve.o: $(srcdir)/screenhackI.h
-ccurve.o: $(srcdir)/screenhack.h
-ccurve.o: $(UTILS_SRC)/colors.h
-ccurve.o: $(UTILS_SRC)/erase.h
-ccurve.o: $(UTILS_SRC)/font-retry.h
-ccurve.o: $(UTILS_SRC)/grabscreen.h
-ccurve.o: $(UTILS_SRC)/hsv.h
-ccurve.o: $(UTILS_SRC)/resources.h
-ccurve.o: $(UTILS_SRC)/usleep.h
-ccurve.o: $(UTILS_SRC)/visual.h
-ccurve.o: $(UTILS_SRC)/xft.h
-ccurve.o: $(UTILS_SRC)/yarandom.h
-celtic.o: ../config.h
-celtic.o: $(srcdir)/fps.h
-celtic.o: $(srcdir)/recanim.h
-celtic.o: $(srcdir)/screenhackI.h
-celtic.o: $(srcdir)/screenhack.h
-celtic.o: $(UTILS_SRC)/colors.h
-celtic.o: $(UTILS_SRC)/erase.h
-celtic.o: $(UTILS_SRC)/font-retry.h
-celtic.o: $(UTILS_SRC)/grabscreen.h
-celtic.o: $(UTILS_SRC)/hsv.h
-celtic.o: $(UTILS_SRC)/resources.h
-celtic.o: $(UTILS_SRC)/usleep.h
-celtic.o: $(UTILS_SRC)/visual.h
-celtic.o: $(UTILS_SRC)/xft.h
-celtic.o: $(UTILS_SRC)/yarandom.h
-cloudlife.o: ../config.h
-cloudlife.o: $(srcdir)/fps.h
-cloudlife.o: $(srcdir)/recanim.h
-cloudlife.o: $(srcdir)/screenhackI.h
-cloudlife.o: $(srcdir)/screenhack.h
-cloudlife.o: $(UTILS_SRC)/colors.h
-cloudlife.o: $(UTILS_SRC)/font-retry.h
-cloudlife.o: $(UTILS_SRC)/grabscreen.h
-cloudlife.o: $(UTILS_SRC)/hsv.h
-cloudlife.o: $(UTILS_SRC)/resources.h
-cloudlife.o: $(UTILS_SRC)/usleep.h
-cloudlife.o: $(UTILS_SRC)/visual.h
-cloudlife.o: $(UTILS_SRC)/xft.h
-cloudlife.o: $(UTILS_SRC)/yarandom.h
-compass.o: ../config.h
-compass.o: $(srcdir)/fps.h
-compass.o: $(srcdir)/recanim.h
-compass.o: $(srcdir)/screenhackI.h
-compass.o: $(srcdir)/screenhack.h
-compass.o: $(UTILS_SRC)/colors.h
-compass.o: $(UTILS_SRC)/font-retry.h
-compass.o: $(UTILS_SRC)/grabscreen.h
-compass.o: $(UTILS_SRC)/hsv.h
-compass.o: $(UTILS_SRC)/resources.h
-compass.o: $(UTILS_SRC)/usleep.h
-compass.o: $(UTILS_SRC)/visual.h
-compass.o: $(UTILS_SRC)/xdbe.h
-compass.o: $(UTILS_SRC)/xft.h
-compass.o: $(UTILS_SRC)/yarandom.h
-coral.o: ../config.h
-coral.o: $(srcdir)/fps.h
-coral.o: $(srcdir)/recanim.h
-coral.o: $(srcdir)/screenhackI.h
-coral.o: $(srcdir)/screenhack.h
-coral.o: $(UTILS_SRC)/colors.h
-coral.o: $(UTILS_SRC)/erase.h
-coral.o: $(UTILS_SRC)/font-retry.h
-coral.o: $(UTILS_SRC)/grabscreen.h
-coral.o: $(UTILS_SRC)/hsv.h
-coral.o: $(UTILS_SRC)/resources.h
-coral.o: $(UTILS_SRC)/usleep.h
-coral.o: $(UTILS_SRC)/visual.h
-coral.o: $(UTILS_SRC)/xft.h
-coral.o: $(UTILS_SRC)/yarandom.h
-critical.o: ../config.h
-critical.o: $(srcdir)/fps.h
-critical.o: $(srcdir)/recanim.h
-critical.o: $(srcdir)/screenhackI.h
-critical.o: $(srcdir)/screenhack.h
-critical.o: $(UTILS_SRC)/colors.h
-critical.o: $(UTILS_SRC)/erase.h
-critical.o: $(UTILS_SRC)/font-retry.h
-critical.o: $(UTILS_SRC)/grabscreen.h
-critical.o: $(UTILS_SRC)/hsv.h
-critical.o: $(UTILS_SRC)/resources.h
-critical.o: $(UTILS_SRC)/usleep.h
-critical.o: $(UTILS_SRC)/visual.h
-critical.o: $(UTILS_SRC)/xft.h
-critical.o: $(UTILS_SRC)/yarandom.h
-crystal.o: ../config.h
-crystal.o: $(srcdir)/fps.h
-crystal.o: $(srcdir)/recanim.h
-crystal.o: $(srcdir)/screenhackI.h
-crystal.o: $(UTILS_SRC)/colors.h
-crystal.o: $(UTILS_SRC)/erase.h
-crystal.o: $(UTILS_SRC)/font-retry.h
-crystal.o: $(UTILS_SRC)/grabscreen.h
-crystal.o: $(UTILS_SRC)/hsv.h
-crystal.o: $(UTILS_SRC)/resources.h
-crystal.o: $(UTILS_SRC)/usleep.h
-crystal.o: $(UTILS_SRC)/visual.h
-crystal.o: $(UTILS_SRC)/xft.h
-crystal.o: $(UTILS_SRC)/yarandom.h
-crystal.o: $(srcdir)/xlockmoreI.h
-crystal.o: $(srcdir)/xlockmore.h
-cwaves.o: ../config.h
-cwaves.o: $(srcdir)/fps.h
-cwaves.o: $(srcdir)/recanim.h
-cwaves.o: $(srcdir)/screenhackI.h
-cwaves.o: $(srcdir)/screenhack.h
-cwaves.o: $(UTILS_SRC)/colors.h
-cwaves.o: $(UTILS_SRC)/font-retry.h
-cwaves.o: $(UTILS_SRC)/grabscreen.h
-cwaves.o: $(UTILS_SRC)/hsv.h
-cwaves.o: $(UTILS_SRC)/resources.h
-cwaves.o: $(UTILS_SRC)/usleep.h
-cwaves.o: $(UTILS_SRC)/visual.h
-cwaves.o: $(UTILS_SRC)/xft.h
-cwaves.o: $(UTILS_SRC)/yarandom.h
-cwaves.o: $(srcdir)/ximage-loader.h
-cynosure.o: ../config.h
-cynosure.o: $(srcdir)/fps.h
-cynosure.o: $(srcdir)/recanim.h
-cynosure.o: $(srcdir)/screenhackI.h
-cynosure.o: $(srcdir)/screenhack.h
-cynosure.o: $(UTILS_SRC)/colors.h
-cynosure.o: $(UTILS_SRC)/font-retry.h
-cynosure.o: $(UTILS_SRC)/grabscreen.h
-cynosure.o: $(UTILS_SRC)/hsv.h
-cynosure.o: $(UTILS_SRC)/resources.h
-cynosure.o: $(UTILS_SRC)/usleep.h
-cynosure.o: $(UTILS_SRC)/visual.h
-cynosure.o: $(UTILS_SRC)/xft.h
-cynosure.o: $(UTILS_SRC)/yarandom.h
-decayscreen.o: ../config.h
-decayscreen.o: $(srcdir)/fps.h
-decayscreen.o: $(srcdir)/recanim.h
-decayscreen.o: $(srcdir)/screenhackI.h
-decayscreen.o: $(srcdir)/screenhack.h
-decayscreen.o: $(UTILS_SRC)/colors.h
-decayscreen.o: $(UTILS_SRC)/font-retry.h
-decayscreen.o: $(UTILS_SRC)/grabscreen.h
-decayscreen.o: $(UTILS_SRC)/hsv.h
-decayscreen.o: $(UTILS_SRC)/resources.h
-decayscreen.o: $(UTILS_SRC)/usleep.h
-decayscreen.o: $(UTILS_SRC)/visual.h
-decayscreen.o: $(UTILS_SRC)/xft.h
-decayscreen.o: $(UTILS_SRC)/yarandom.h
-deco.o: ../config.h
-deco.o: $(srcdir)/fps.h
-deco.o: $(srcdir)/recanim.h
-deco.o: $(srcdir)/screenhackI.h
-deco.o: $(srcdir)/screenhack.h
-deco.o: $(UTILS_SRC)/colors.h
-deco.o: $(UTILS_SRC)/font-retry.h
-deco.o: $(UTILS_SRC)/grabscreen.h
-deco.o: $(UTILS_SRC)/hsv.h
-deco.o: $(UTILS_SRC)/resources.h
-deco.o: $(UTILS_SRC)/usleep.h
-deco.o: $(UTILS_SRC)/visual.h
-deco.o: $(UTILS_SRC)/xft.h
-deco.o: $(UTILS_SRC)/yarandom.h
-delaunay.o: $(srcdir)/delaunay.h
-deluxe.o: ../config.h
-deluxe.o: $(srcdir)/fps.h
-deluxe.o: $(srcdir)/recanim.h
-deluxe.o: $(srcdir)/screenhackI.h
-deluxe.o: $(srcdir)/screenhack.h
-deluxe.o: $(UTILS_SRC)/alpha.h
-deluxe.o: $(UTILS_SRC)/colors.h
-deluxe.o: $(UTILS_SRC)/font-retry.h
-deluxe.o: $(UTILS_SRC)/grabscreen.h
-deluxe.o: $(UTILS_SRC)/hsv.h
-deluxe.o: $(UTILS_SRC)/resources.h
-deluxe.o: $(UTILS_SRC)/usleep.h
-deluxe.o: $(UTILS_SRC)/visual.h
-deluxe.o: $(UTILS_SRC)/xdbe.h
-deluxe.o: $(UTILS_SRC)/xft.h
-deluxe.o: $(UTILS_SRC)/yarandom.h
-demon.o: $(srcdir)/automata.h
-demon.o: ../config.h
-demon.o: $(srcdir)/fps.h
-demon.o: $(srcdir)/recanim.h
-demon.o: $(srcdir)/screenhackI.h
-demon.o: $(UTILS_SRC)/colors.h
-demon.o: $(UTILS_SRC)/erase.h
-demon.o: $(UTILS_SRC)/font-retry.h
-demon.o: $(UTILS_SRC)/grabscreen.h
-demon.o: $(UTILS_SRC)/hsv.h
-demon.o: $(UTILS_SRC)/resources.h
-demon.o: $(UTILS_SRC)/usleep.h
-demon.o: $(UTILS_SRC)/visual.h
-demon.o: $(UTILS_SRC)/xft.h
-demon.o: $(UTILS_SRC)/yarandom.h
-demon.o: $(srcdir)/xlockmoreI.h
-demon.o: $(srcdir)/xlockmore.h
-discrete.o: ../config.h
-discrete.o: $(srcdir)/fps.h
-discrete.o: $(srcdir)/recanim.h
-discrete.o: $(srcdir)/screenhackI.h
-discrete.o: $(UTILS_SRC)/colors.h
-discrete.o: $(UTILS_SRC)/erase.h
-discrete.o: $(UTILS_SRC)/font-retry.h
-discrete.o: $(UTILS_SRC)/grabscreen.h
-discrete.o: $(UTILS_SRC)/hsv.h
-discrete.o: $(UTILS_SRC)/resources.h
-discrete.o: $(UTILS_SRC)/usleep.h
-discrete.o: $(UTILS_SRC)/visual.h
-discrete.o: $(UTILS_SRC)/xft.h
-discrete.o: $(UTILS_SRC)/yarandom.h
-discrete.o: $(srcdir)/xlockmoreI.h
-discrete.o: $(srcdir)/xlockmore.h
-distort.o: ../config.h
-distort.o: $(srcdir)/fps.h
-distort.o: $(srcdir)/recanim.h
-distort.o: $(srcdir)/screenhackI.h
-distort.o: $(srcdir)/screenhack.h
-distort.o: $(UTILS_SRC)/colors.h
-distort.o: $(UTILS_SRC)/font-retry.h
-distort.o: $(UTILS_SRC)/grabscreen.h
-distort.o: $(UTILS_SRC)/hsv.h
-distort.o: $(UTILS_SRC)/resources.h
-distort.o: $(UTILS_SRC)/usleep.h
-distort.o: $(UTILS_SRC)/visual.h
-distort.o: $(UTILS_SRC)/xft.h
-distort.o: $(UTILS_SRC)/xshm.h
-distort.o: $(UTILS_SRC)/yarandom.h
-drift.o: ../config.h
-drift.o: $(srcdir)/fps.h
-drift.o: $(srcdir)/recanim.h
-drift.o: $(srcdir)/screenhackI.h
-drift.o: $(UTILS_SRC)/colors.h
-drift.o: $(UTILS_SRC)/erase.h
-drift.o: $(UTILS_SRC)/font-retry.h
-drift.o: $(UTILS_SRC)/grabscreen.h
-drift.o: $(UTILS_SRC)/hsv.h
-drift.o: $(UTILS_SRC)/resources.h
-drift.o: $(UTILS_SRC)/usleep.h
-drift.o: $(UTILS_SRC)/visual.h
-drift.o: $(UTILS_SRC)/xft.h
-drift.o: $(UTILS_SRC)/yarandom.h
-drift.o: $(srcdir)/xlockmoreI.h
-drift.o: $(srcdir)/xlockmore.h
-epicycle.o: ../config.h
-epicycle.o: $(srcdir)/fps.h
-epicycle.o: $(srcdir)/recanim.h
-epicycle.o: $(srcdir)/screenhackI.h
-epicycle.o: $(srcdir)/screenhack.h
-epicycle.o: $(UTILS_SRC)/colors.h
-epicycle.o: $(UTILS_SRC)/erase.h
-epicycle.o: $(UTILS_SRC)/font-retry.h
-epicycle.o: $(UTILS_SRC)/grabscreen.h
-epicycle.o: $(UTILS_SRC)/hsv.h
-epicycle.o: $(UTILS_SRC)/resources.h
-epicycle.o: $(UTILS_SRC)/usleep.h
-epicycle.o: $(UTILS_SRC)/visual.h
-epicycle.o: $(UTILS_SRC)/xft.h
-epicycle.o: $(UTILS_SRC)/yarandom.h
-eruption.o: ../config.h
-eruption.o: $(srcdir)/fps.h
-eruption.o: $(srcdir)/recanim.h
-eruption.o: $(srcdir)/screenhackI.h
-eruption.o: $(srcdir)/screenhack.h
-eruption.o: $(UTILS_SRC)/colors.h
-eruption.o: $(UTILS_SRC)/font-retry.h
-eruption.o: $(UTILS_SRC)/grabscreen.h
-eruption.o: $(UTILS_SRC)/hsv.h
-eruption.o: $(UTILS_SRC)/resources.h
-eruption.o: $(UTILS_SRC)/usleep.h
-eruption.o: $(UTILS_SRC)/visual.h
-eruption.o: $(UTILS_SRC)/xft.h
-eruption.o: $(UTILS_SRC)/xshm.h
-eruption.o: $(UTILS_SRC)/yarandom.h
-euler2d.o: ../config.h
-euler2d.o: $(srcdir)/fps.h
-euler2d.o: $(srcdir)/recanim.h
-euler2d.o: $(srcdir)/screenhackI.h
-euler2d.o: $(UTILS_SRC)/colors.h
-euler2d.o: $(UTILS_SRC)/erase.h
-euler2d.o: $(UTILS_SRC)/font-retry.h
-euler2d.o: $(UTILS_SRC)/grabscreen.h
-euler2d.o: $(UTILS_SRC)/hsv.h
-euler2d.o: $(UTILS_SRC)/resources.h
-euler2d.o: $(UTILS_SRC)/usleep.h
-euler2d.o: $(UTILS_SRC)/visual.h
-euler2d.o: $(UTILS_SRC)/xft.h
-euler2d.o: $(UTILS_SRC)/yarandom.h
-euler2d.o: $(srcdir)/xlockmoreI.h
-euler2d.o: $(srcdir)/xlockmore.h
-fadeplot.o: ../config.h
-fadeplot.o: $(srcdir)/fps.h
-fadeplot.o: $(srcdir)/recanim.h
-fadeplot.o: $(srcdir)/screenhackI.h
-fadeplot.o: $(UTILS_SRC)/colors.h
-fadeplot.o: $(UTILS_SRC)/erase.h
-fadeplot.o: $(UTILS_SRC)/font-retry.h
-fadeplot.o: $(UTILS_SRC)/grabscreen.h
-fadeplot.o: $(UTILS_SRC)/hsv.h
-fadeplot.o: $(UTILS_SRC)/resources.h
-fadeplot.o: $(UTILS_SRC)/usleep.h
-fadeplot.o: $(UTILS_SRC)/visual.h
-fadeplot.o: $(UTILS_SRC)/xft.h
-fadeplot.o: $(UTILS_SRC)/yarandom.h
-fadeplot.o: $(srcdir)/xlockmoreI.h
-fadeplot.o: $(srcdir)/xlockmore.h
-fiberlamp.o: ../config.h
-fiberlamp.o: $(srcdir)/fps.h
-fiberlamp.o: $(srcdir)/recanim.h
-fiberlamp.o: $(srcdir)/screenhackI.h
-fiberlamp.o: $(UTILS_SRC)/colors.h
-fiberlamp.o: $(UTILS_SRC)/erase.h
-fiberlamp.o: $(UTILS_SRC)/font-retry.h
-fiberlamp.o: $(UTILS_SRC)/grabscreen.h
-fiberlamp.o: $(UTILS_SRC)/hsv.h
-fiberlamp.o: $(UTILS_SRC)/resources.h
-fiberlamp.o: $(UTILS_SRC)/usleep.h
-fiberlamp.o: $(UTILS_SRC)/visual.h
-fiberlamp.o: $(UTILS_SRC)/xft.h
-fiberlamp.o: $(UTILS_SRC)/yarandom.h
-fiberlamp.o: $(srcdir)/xlockmoreI.h
-fiberlamp.o: $(srcdir)/xlockmore.h
-filmleader.o: $(srcdir)/analogtv.h
-filmleader.o: ../config.h
-filmleader.o: $(srcdir)/fps.h
-filmleader.o: $(srcdir)/recanim.h
-filmleader.o: $(srcdir)/screenhackI.h
-filmleader.o: $(srcdir)/screenhack.h
-filmleader.o: $(UTILS_SRC)/aligned_malloc.h
-filmleader.o: $(UTILS_SRC)/colors.h
-filmleader.o: $(UTILS_SRC)/font-retry.h
-filmleader.o: $(UTILS_SRC)/grabscreen.h
-filmleader.o: $(UTILS_SRC)/hsv.h
-filmleader.o: $(UTILS_SRC)/resources.h
-filmleader.o: $(UTILS_SRC)/thread_util.h
-filmleader.o: $(UTILS_SRC)/usleep.h
-filmleader.o: $(UTILS_SRC)/visual.h
-filmleader.o: $(UTILS_SRC)/xft.h
-filmleader.o: $(UTILS_SRC)/xshm.h
-filmleader.o: $(UTILS_SRC)/yarandom.h
-fireworkx.o: ../config.h
-fireworkx.o: $(srcdir)/fps.h
-fireworkx.o: $(srcdir)/recanim.h
-fireworkx.o: $(srcdir)/screenhackI.h
-fireworkx.o: $(srcdir)/screenhack.h
-fireworkx.o: $(UTILS_SRC)/colors.h
-fireworkx.o: $(UTILS_SRC)/font-retry.h
-fireworkx.o: $(UTILS_SRC)/grabscreen.h
-fireworkx.o: $(UTILS_SRC)/hsv.h
-fireworkx.o: $(UTILS_SRC)/resources.h
-fireworkx.o: $(UTILS_SRC)/usleep.h
-fireworkx.o: $(UTILS_SRC)/visual.h
-fireworkx.o: $(UTILS_SRC)/xft.h
-fireworkx.o: $(UTILS_SRC)/yarandom.h
-flag.o: ../config.h
-flag.o: $(srcdir)/fps.h
-flag.o: images/gen/bob_png.h
-flag.o: $(srcdir)/recanim.h
-flag.o: $(srcdir)/screenhackI.h
-flag.o: $(UTILS_SRC)/colors.h
-flag.o: $(UTILS_SRC)/erase.h
-flag.o: $(UTILS_SRC)/font-retry.h
-flag.o: $(UTILS_SRC)/grabscreen.h
-flag.o: $(UTILS_SRC)/hsv.h
-flag.o: $(UTILS_SRC)/resources.h
-flag.o: $(UTILS_SRC)/usleep.h
-flag.o: $(UTILS_SRC)/visual.h
-flag.o: $(UTILS_SRC)/xft.h
-flag.o: $(UTILS_SRC)/yarandom.h
-flag.o: $(srcdir)/ximage-loader.h
-flag.o: $(srcdir)/xlockmoreI.h
-flag.o: $(srcdir)/xlockmore.h
-flame.o: ../config.h
-flame.o: $(srcdir)/fps.h
-flame.o: $(srcdir)/recanim.h
-flame.o: $(srcdir)/screenhackI.h
-flame.o: $(srcdir)/screenhack.h
-flame.o: $(UTILS_SRC)/colors.h
-flame.o: $(UTILS_SRC)/font-retry.h
-flame.o: $(UTILS_SRC)/grabscreen.h
-flame.o: $(UTILS_SRC)/hsv.h
-flame.o: $(UTILS_SRC)/resources.h
-flame.o: $(UTILS_SRC)/usleep.h
-flame.o: $(UTILS_SRC)/visual.h
-flame.o: $(UTILS_SRC)/xft.h
-flame.o: $(UTILS_SRC)/yarandom.h
-flow.o: ../config.h
-flow.o: $(srcdir)/fps.h
-flow.o: $(srcdir)/recanim.h
-flow.o: $(srcdir)/screenhackI.h
-flow.o: $(UTILS_SRC)/colors.h
-flow.o: $(UTILS_SRC)/erase.h
-flow.o: $(UTILS_SRC)/font-retry.h
-flow.o: $(UTILS_SRC)/grabscreen.h
-flow.o: $(UTILS_SRC)/hsv.h
-flow.o: $(UTILS_SRC)/resources.h
-flow.o: $(UTILS_SRC)/usleep.h
-flow.o: $(UTILS_SRC)/visual.h
-flow.o: $(UTILS_SRC)/xft.h
-flow.o: $(UTILS_SRC)/yarandom.h
-flow.o: $(srcdir)/xlockmoreI.h
-flow.o: $(srcdir)/xlockmore.h
-fluidballs.o: ../config.h
-fluidballs.o: $(srcdir)/fps.h
-fluidballs.o: $(srcdir)/recanim.h
-fluidballs.o: $(srcdir)/screenhackI.h
-fluidballs.o: $(srcdir)/screenhack.h
-fluidballs.o: $(UTILS_SRC)/colors.h
-fluidballs.o: $(UTILS_SRC)/font-retry.h
-fluidballs.o: $(UTILS_SRC)/grabscreen.h
-fluidballs.o: $(UTILS_SRC)/hsv.h
-fluidballs.o: $(UTILS_SRC)/resources.h
-fluidballs.o: $(UTILS_SRC)/usleep.h
-fluidballs.o: $(UTILS_SRC)/visual.h
-fluidballs.o: $(UTILS_SRC)/xdbe.h
-fluidballs.o: $(UTILS_SRC)/xft.h
-fluidballs.o: $(UTILS_SRC)/yarandom.h
-fontglide.o: ../config.h
-fontglide.o: $(srcdir)/fps.h
-fontglide.o: $(srcdir)/recanim.h
-fontglide.o: $(srcdir)/screenhackI.h
-fontglide.o: $(srcdir)/screenhack.h
-fontglide.o: $(UTILS_SRC)/colors.h
-fontglide.o: $(UTILS_SRC)/font-retry.h
-fontglide.o: $(UTILS_SRC)/grabscreen.h
-fontglide.o: $(UTILS_SRC)/hsv.h
-fontglide.o: $(UTILS_SRC)/resources.h
-fontglide.o: $(UTILS_SRC)/textclient.h
-fontglide.o: $(UTILS_SRC)/usleep.h
-fontglide.o: $(UTILS_SRC)/utf8wc.h
-fontglide.o: $(UTILS_SRC)/visual.h
-fontglide.o: $(UTILS_SRC)/xdbe.h
-fontglide.o: $(UTILS_SRC)/xft.h
-fontglide.o: $(UTILS_SRC)/yarandom.h
-forest.o: ../config.h
-forest.o: $(srcdir)/fps.h
-forest.o: $(srcdir)/recanim.h
-forest.o: $(srcdir)/screenhackI.h
-forest.o: $(UTILS_SRC)/colors.h
-forest.o: $(UTILS_SRC)/erase.h
-forest.o: $(UTILS_SRC)/font-retry.h
-forest.o: $(UTILS_SRC)/grabscreen.h
-forest.o: $(UTILS_SRC)/hsv.h
-forest.o: $(UTILS_SRC)/resources.h
-forest.o: $(UTILS_SRC)/usleep.h
-forest.o: $(UTILS_SRC)/visual.h
-forest.o: $(UTILS_SRC)/xft.h
-forest.o: $(UTILS_SRC)/yarandom.h
-forest.o: $(srcdir)/xlockmoreI.h
-forest.o: $(srcdir)/xlockmore.h
-fps.o: ../config.h
-fps.o: $(srcdir)/fpsI.h
-fps.o: $(srcdir)/fps.h
-fps.o: $(srcdir)/recanim.h
-fps.o: $(srcdir)/screenhackI.h
-fps.o: $(UTILS_SRC)/colors.h
-fps.o: $(UTILS_SRC)/font-retry.h
-fps.o: $(UTILS_SRC)/grabscreen.h
-fps.o: $(UTILS_SRC)/hsv.h
-fps.o: $(UTILS_SRC)/resources.h
-fps.o: $(UTILS_SRC)/usleep.h
-fps.o: $(UTILS_SRC)/visual.h
-fps.o: $(UTILS_SRC)/xft.h
-fps.o: $(UTILS_SRC)/yarandom.h
-fuzzyflakes.o: ../config.h
-fuzzyflakes.o: $(srcdir)/fps.h
-fuzzyflakes.o: $(srcdir)/recanim.h
-fuzzyflakes.o: $(srcdir)/screenhackI.h
-fuzzyflakes.o: $(srcdir)/screenhack.h
-fuzzyflakes.o: $(UTILS_SRC)/colors.h
-fuzzyflakes.o: $(UTILS_SRC)/font-retry.h
-fuzzyflakes.o: $(UTILS_SRC)/grabscreen.h
-fuzzyflakes.o: $(UTILS_SRC)/hsv.h
-fuzzyflakes.o: $(UTILS_SRC)/resources.h
-fuzzyflakes.o: $(UTILS_SRC)/usleep.h
-fuzzyflakes.o: $(UTILS_SRC)/visual.h
-fuzzyflakes.o: $(UTILS_SRC)/xft.h
-fuzzyflakes.o: $(UTILS_SRC)/yarandom.h
-galaxy.o: ../config.h
-galaxy.o: $(srcdir)/fps.h
-galaxy.o: $(srcdir)/recanim.h
-galaxy.o: $(srcdir)/screenhackI.h
-galaxy.o: $(UTILS_SRC)/colors.h
-galaxy.o: $(UTILS_SRC)/erase.h
-galaxy.o: $(UTILS_SRC)/font-retry.h
-galaxy.o: $(UTILS_SRC)/grabscreen.h
-galaxy.o: $(UTILS_SRC)/hsv.h
-galaxy.o: $(UTILS_SRC)/resources.h
-galaxy.o: $(UTILS_SRC)/usleep.h
-galaxy.o: $(UTILS_SRC)/visual.h
-galaxy.o: $(UTILS_SRC)/xft.h
-galaxy.o: $(UTILS_SRC)/yarandom.h
-galaxy.o: $(srcdir)/xlockmoreI.h
-galaxy.o: $(srcdir)/xlockmore.h
-glitchpeg.o: ../config.h
-glitchpeg.o: $(srcdir)/fps.h
-glitchpeg.o: $(srcdir)/recanim.h
-glitchpeg.o: $(srcdir)/screenhackI.h
-glitchpeg.o: $(srcdir)/screenhack.h
-glitchpeg.o: $(UTILS_SRC)/colors.h
-glitchpeg.o: $(UTILS_SRC)/font-retry.h
-glitchpeg.o: $(UTILS_SRC)/grabscreen.h
-glitchpeg.o: $(UTILS_SRC)/hsv.h
-glitchpeg.o: $(UTILS_SRC)/resources.h
-glitchpeg.o: $(UTILS_SRC)/usleep.h
-glitchpeg.o: $(UTILS_SRC)/visual.h
-glitchpeg.o: $(UTILS_SRC)/xft.h
-glitchpeg.o: $(UTILS_SRC)/yarandom.h
-glitchpeg.o: $(srcdir)/ximage-loader.h
-goop.o: ../config.h
-goop.o: $(srcdir)/fps.h
-goop.o: $(srcdir)/recanim.h
-goop.o: $(srcdir)/screenhackI.h
-goop.o: $(srcdir)/screenhack.h
-goop.o: $(UTILS_SRC)/alpha.h
-goop.o: $(UTILS_SRC)/colors.h
-goop.o: $(UTILS_SRC)/font-retry.h
-goop.o: $(UTILS_SRC)/grabscreen.h
-goop.o: $(UTILS_SRC)/hsv.h
-goop.o: $(UTILS_SRC)/resources.h
-goop.o: $(UTILS_SRC)/spline.h
-goop.o: $(UTILS_SRC)/usleep.h
-goop.o: $(UTILS_SRC)/visual.h
-goop.o: $(UTILS_SRC)/xft.h
-goop.o: $(UTILS_SRC)/yarandom.h
-grav.o: ../config.h
-grav.o: $(srcdir)/fps.h
-grav.o: $(srcdir)/recanim.h
-grav.o: $(srcdir)/screenhackI.h
-grav.o: $(UTILS_SRC)/colors.h
-grav.o: $(UTILS_SRC)/erase.h
-grav.o: $(UTILS_SRC)/font-retry.h
-grav.o: $(UTILS_SRC)/grabscreen.h
-grav.o: $(UTILS_SRC)/hsv.h
-grav.o: $(UTILS_SRC)/resources.h
-grav.o: $(UTILS_SRC)/usleep.h
-grav.o: $(UTILS_SRC)/visual.h
-grav.o: $(UTILS_SRC)/xft.h
-grav.o: $(UTILS_SRC)/yarandom.h
-grav.o: $(srcdir)/xlockmoreI.h
-grav.o: $(srcdir)/xlockmore.h
-greynetic.o: ../config.h
-greynetic.o: $(srcdir)/fps.h
-greynetic.o: $(srcdir)/recanim.h
-greynetic.o: $(srcdir)/screenhackI.h
-greynetic.o: $(srcdir)/screenhack.h
-greynetic.o: $(UTILS_SRC)/colors.h
-greynetic.o: $(UTILS_SRC)/font-retry.h
-greynetic.o: $(UTILS_SRC)/grabscreen.h
-greynetic.o: $(UTILS_SRC)/hsv.h
-greynetic.o: $(UTILS_SRC)/resources.h
-greynetic.o: $(UTILS_SRC)/usleep.h
-greynetic.o: $(UTILS_SRC)/visual.h
-greynetic.o: $(UTILS_SRC)/xft.h
-greynetic.o: $(UTILS_SRC)/yarandom.h
-halftone.o: ../config.h
-halftone.o: $(srcdir)/fps.h
-halftone.o: $(srcdir)/recanim.h
-halftone.o: $(srcdir)/screenhackI.h
-halftone.o: $(srcdir)/screenhack.h
-halftone.o: $(UTILS_SRC)/colors.h
-halftone.o: $(UTILS_SRC)/font-retry.h
-halftone.o: $(UTILS_SRC)/grabscreen.h
-halftone.o: $(UTILS_SRC)/hsv.h
-halftone.o: $(UTILS_SRC)/resources.h
-halftone.o: $(UTILS_SRC)/usleep.h
-halftone.o: $(UTILS_SRC)/visual.h
-halftone.o: $(UTILS_SRC)/xft.h
-halftone.o: $(UTILS_SRC)/yarandom.h
-halo.o: ../config.h
-halo.o: $(srcdir)/fps.h
-halo.o: $(srcdir)/recanim.h
-halo.o: $(srcdir)/screenhackI.h
-halo.o: $(srcdir)/screenhack.h
-halo.o: $(UTILS_SRC)/colors.h
-halo.o: $(UTILS_SRC)/font-retry.h
-halo.o: $(UTILS_SRC)/grabscreen.h
-halo.o: $(UTILS_SRC)/hsv.h
-halo.o: $(UTILS_SRC)/resources.h
-halo.o: $(UTILS_SRC)/usleep.h
-halo.o: $(UTILS_SRC)/visual.h
-halo.o: $(UTILS_SRC)/xft.h
-halo.o: $(UTILS_SRC)/yarandom.h
-helix.o: ../config.h
-helix.o: $(srcdir)/fps.h
-helix.o: $(srcdir)/recanim.h
-helix.o: $(srcdir)/screenhackI.h
-helix.o: $(srcdir)/screenhack.h
-helix.o: $(UTILS_SRC)/colors.h
-helix.o: $(UTILS_SRC)/erase.h
-helix.o: $(UTILS_SRC)/font-retry.h
-helix.o: $(UTILS_SRC)/grabscreen.h
-helix.o: $(UTILS_SRC)/hsv.h
-helix.o: $(UTILS_SRC)/resources.h
-helix.o: $(UTILS_SRC)/usleep.h
-helix.o: $(UTILS_SRC)/visual.h
-helix.o: $(UTILS_SRC)/xft.h
-helix.o: $(UTILS_SRC)/yarandom.h
-hexadrop.o: ../config.h
-hexadrop.o: $(srcdir)/fps.h
-hexadrop.o: $(srcdir)/recanim.h
-hexadrop.o: $(srcdir)/screenhackI.h
-hexadrop.o: $(srcdir)/screenhack.h
-hexadrop.o: $(UTILS_SRC)/colors.h
-hexadrop.o: $(UTILS_SRC)/font-retry.h
-hexadrop.o: $(UTILS_SRC)/grabscreen.h
-hexadrop.o: $(UTILS_SRC)/hsv.h
-hexadrop.o: $(UTILS_SRC)/resources.h
-hexadrop.o: $(UTILS_SRC)/usleep.h
-hexadrop.o: $(UTILS_SRC)/visual.h
-hexadrop.o: $(UTILS_SRC)/xft.h
-hexadrop.o: $(UTILS_SRC)/yarandom.h
-hopalong.o: ../config.h
-hopalong.o: $(srcdir)/fps.h
-hopalong.o: $(srcdir)/recanim.h
-hopalong.o: $(srcdir)/screenhackI.h
-hopalong.o: $(UTILS_SRC)/colors.h
-hopalong.o: $(UTILS_SRC)/erase.h
-hopalong.o: $(UTILS_SRC)/font-retry.h
-hopalong.o: $(UTILS_SRC)/grabscreen.h
-hopalong.o: $(UTILS_SRC)/hsv.h
-hopalong.o: $(UTILS_SRC)/resources.h
-hopalong.o: $(UTILS_SRC)/usleep.h
-hopalong.o: $(UTILS_SRC)/visual.h
-hopalong.o: $(UTILS_SRC)/xft.h
-hopalong.o: $(UTILS_SRC)/yarandom.h
-hopalong.o: $(srcdir)/xlockmoreI.h
-hopalong.o: $(srcdir)/xlockmore.h
-hyperball.o: ../config.h
-hyperball.o: $(srcdir)/fps.h
-hyperball.o: $(srcdir)/recanim.h
-hyperball.o: $(srcdir)/screenhackI.h
-hyperball.o: $(srcdir)/screenhack.h
-hyperball.o: $(UTILS_SRC)/colors.h
-hyperball.o: $(UTILS_SRC)/font-retry.h
-hyperball.o: $(UTILS_SRC)/grabscreen.h
-hyperball.o: $(UTILS_SRC)/hsv.h
-hyperball.o: $(UTILS_SRC)/resources.h
-hyperball.o: $(UTILS_SRC)/usleep.h
-hyperball.o: $(UTILS_SRC)/visual.h
-hyperball.o: $(UTILS_SRC)/xft.h
-hyperball.o: $(UTILS_SRC)/yarandom.h
-hypercube.o: ../config.h
-hypercube.o: $(srcdir)/fps.h
-hypercube.o: $(srcdir)/recanim.h
-hypercube.o: $(srcdir)/screenhackI.h
-hypercube.o: $(srcdir)/screenhack.h
-hypercube.o: $(UTILS_SRC)/colors.h
-hypercube.o: $(UTILS_SRC)/font-retry.h
-hypercube.o: $(UTILS_SRC)/grabscreen.h
-hypercube.o: $(UTILS_SRC)/hsv.h
-hypercube.o: $(UTILS_SRC)/resources.h
-hypercube.o: $(UTILS_SRC)/usleep.h
-hypercube.o: $(UTILS_SRC)/visual.h
-hypercube.o: $(UTILS_SRC)/xft.h
-hypercube.o: $(UTILS_SRC)/yarandom.h
-ifs.o: ../config.h
-ifs.o: $(srcdir)/fps.h
-ifs.o: $(srcdir)/recanim.h
-ifs.o: $(srcdir)/screenhackI.h
-ifs.o: $(srcdir)/screenhack.h
-ifs.o: $(UTILS_SRC)/colors.h
-ifs.o: $(UTILS_SRC)/font-retry.h
-ifs.o: $(UTILS_SRC)/grabscreen.h
-ifs.o: $(UTILS_SRC)/hsv.h
-ifs.o: $(UTILS_SRC)/resources.h
-ifs.o: $(UTILS_SRC)/usleep.h
-ifs.o: $(UTILS_SRC)/visual.h
-ifs.o: $(UTILS_SRC)/xft.h
-ifs.o: $(UTILS_SRC)/yarandom.h
-imsmap.o: ../config.h
-imsmap.o: $(srcdir)/fps.h
-imsmap.o: $(srcdir)/recanim.h
-imsmap.o: $(srcdir)/screenhackI.h
-imsmap.o: $(srcdir)/screenhack.h
-imsmap.o: $(UTILS_SRC)/colors.h
-imsmap.o: $(UTILS_SRC)/font-retry.h
-imsmap.o: $(UTILS_SRC)/grabscreen.h
-imsmap.o: $(UTILS_SRC)/hsv.h
-imsmap.o: $(UTILS_SRC)/resources.h
-imsmap.o: $(UTILS_SRC)/usleep.h
-imsmap.o: $(UTILS_SRC)/visual.h
-imsmap.o: $(UTILS_SRC)/xft.h
-imsmap.o: $(UTILS_SRC)/yarandom.h
-interaggregate.o: ../config.h
-interaggregate.o: $(srcdir)/fps.h
-interaggregate.o: $(srcdir)/recanim.h
-interaggregate.o: $(srcdir)/screenhackI.h
-interaggregate.o: $(srcdir)/screenhack.h
-interaggregate.o: $(UTILS_SRC)/colors.h
-interaggregate.o: $(UTILS_SRC)/font-retry.h
-interaggregate.o: $(UTILS_SRC)/grabscreen.h
-interaggregate.o: $(UTILS_SRC)/hsv.h
-interaggregate.o: $(UTILS_SRC)/resources.h
-interaggregate.o: $(UTILS_SRC)/usleep.h
-interaggregate.o: $(UTILS_SRC)/visual.h
-interaggregate.o: $(UTILS_SRC)/xft.h
-interaggregate.o: $(UTILS_SRC)/yarandom.h
-interference.o: ../config.h
-interference.o: $(srcdir)/fps.h
-interference.o: $(srcdir)/recanim.h
-interference.o: $(srcdir)/screenhackI.h
-interference.o: $(srcdir)/screenhack.h
-interference.o: $(UTILS_SRC)/aligned_malloc.h
-interference.o: $(UTILS_SRC)/colors.h
-interference.o: $(UTILS_SRC)/font-retry.h
-interference.o: $(UTILS_SRC)/grabscreen.h
-interference.o: $(UTILS_SRC)/hsv.h
-interference.o: $(UTILS_SRC)/resources.h
-interference.o: $(UTILS_SRC)/thread_util.h
-interference.o: $(UTILS_SRC)/usleep.h
-interference.o: $(UTILS_SRC)/visual.h
-interference.o: $(UTILS_SRC)/xdbe.h
-interference.o: $(UTILS_SRC)/xft.h
-interference.o: $(UTILS_SRC)/xshm.h
-interference.o: $(UTILS_SRC)/yarandom.h
-intermomentary.o: ../config.h
-intermomentary.o: $(srcdir)/fps.h
-intermomentary.o: $(srcdir)/recanim.h
-intermomentary.o: $(srcdir)/screenhackI.h
-intermomentary.o: $(srcdir)/screenhack.h
-intermomentary.o: $(UTILS_SRC)/colors.h
-intermomentary.o: $(UTILS_SRC)/font-retry.h
-intermomentary.o: $(UTILS_SRC)/grabscreen.h
-intermomentary.o: $(UTILS_SRC)/hsv.h
-intermomentary.o: $(UTILS_SRC)/resources.h
-intermomentary.o: $(UTILS_SRC)/usleep.h
-intermomentary.o: $(UTILS_SRC)/visual.h
-intermomentary.o: $(UTILS_SRC)/xft.h
-intermomentary.o: $(UTILS_SRC)/yarandom.h
-juggle.o: ../config.h
-juggle.o: $(srcdir)/fps.h
-juggle.o: $(srcdir)/recanim.h
-juggle.o: $(srcdir)/screenhackI.h
-juggle.o: $(UTILS_SRC)/colors.h
-juggle.o: $(UTILS_SRC)/erase.h
-juggle.o: $(UTILS_SRC)/font-retry.h
-juggle.o: $(UTILS_SRC)/grabscreen.h
-juggle.o: $(UTILS_SRC)/hsv.h
-juggle.o: $(UTILS_SRC)/resources.h
-juggle.o: $(UTILS_SRC)/usleep.h
-juggle.o: $(UTILS_SRC)/visual.h
-juggle.o: $(UTILS_SRC)/xft.h
-juggle.o: $(UTILS_SRC)/yarandom.h
-juggle.o: $(srcdir)/xlockmoreI.h
-juggle.o: $(srcdir)/xlockmore.h
-julia.o: ../config.h
-julia.o: $(srcdir)/fps.h
-julia.o: $(srcdir)/recanim.h
-julia.o: $(srcdir)/screenhackI.h
-julia.o: $(UTILS_SRC)/colors.h
-julia.o: $(UTILS_SRC)/erase.h
-julia.o: $(UTILS_SRC)/font-retry.h
-julia.o: $(UTILS_SRC)/grabscreen.h
-julia.o: $(UTILS_SRC)/hsv.h
-julia.o: $(UTILS_SRC)/resources.h
-julia.o: $(UTILS_SRC)/usleep.h
-julia.o: $(UTILS_SRC)/visual.h
-julia.o: $(UTILS_SRC)/xft.h
-julia.o: $(UTILS_SRC)/yarandom.h
-julia.o: $(srcdir)/xlockmoreI.h
-julia.o: $(srcdir)/xlockmore.h
-kaleidescope.o: ../config.h
-kaleidescope.o: $(srcdir)/fps.h
-kaleidescope.o: $(srcdir)/recanim.h
-kaleidescope.o: $(srcdir)/screenhackI.h
-kaleidescope.o: $(srcdir)/screenhack.h
-kaleidescope.o: $(UTILS_SRC)/colors.h
-kaleidescope.o: $(UTILS_SRC)/font-retry.h
-kaleidescope.o: $(UTILS_SRC)/grabscreen.h
-kaleidescope.o: $(UTILS_SRC)/hsv.h
-kaleidescope.o: $(UTILS_SRC)/resources.h
-kaleidescope.o: $(UTILS_SRC)/spline.h
-kaleidescope.o: $(UTILS_SRC)/usleep.h
-kaleidescope.o: $(UTILS_SRC)/visual.h
-kaleidescope.o: $(UTILS_SRC)/xft.h
-kaleidescope.o: $(UTILS_SRC)/yarandom.h
-kumppa.o: ../config.h
-kumppa.o: $(srcdir)/fps.h
-kumppa.o: $(srcdir)/recanim.h
-kumppa.o: $(srcdir)/screenhackI.h
-kumppa.o: $(srcdir)/screenhack.h
-kumppa.o: $(UTILS_SRC)/colors.h
-kumppa.o: $(UTILS_SRC)/font-retry.h
-kumppa.o: $(UTILS_SRC)/grabscreen.h
-kumppa.o: $(UTILS_SRC)/hsv.h
-kumppa.o: $(UTILS_SRC)/resources.h
-kumppa.o: $(UTILS_SRC)/usleep.h
-kumppa.o: $(UTILS_SRC)/visual.h
-kumppa.o: $(UTILS_SRC)/xdbe.h
-kumppa.o: $(UTILS_SRC)/xft.h
-kumppa.o: $(UTILS_SRC)/yarandom.h
-laser.o: ../config.h
-laser.o: $(srcdir)/fps.h
-laser.o: $(srcdir)/recanim.h
-laser.o: $(srcdir)/screenhackI.h
-laser.o: $(UTILS_SRC)/colors.h
-laser.o: $(UTILS_SRC)/erase.h
-laser.o: $(UTILS_SRC)/font-retry.h
-laser.o: $(UTILS_SRC)/grabscreen.h
-laser.o: $(UTILS_SRC)/hsv.h
-laser.o: $(UTILS_SRC)/resources.h
-laser.o: $(UTILS_SRC)/usleep.h
-laser.o: $(UTILS_SRC)/visual.h
-laser.o: $(UTILS_SRC)/xft.h
-laser.o: $(UTILS_SRC)/yarandom.h
-laser.o: $(srcdir)/xlockmoreI.h
-laser.o: $(srcdir)/xlockmore.h
-lcdscrub.o: ../config.h
-lcdscrub.o: $(srcdir)/fps.h
-lcdscrub.o: $(srcdir)/recanim.h
-lcdscrub.o: $(srcdir)/screenhackI.h
-lcdscrub.o: $(srcdir)/screenhack.h
-lcdscrub.o: $(UTILS_SRC)/colors.h
-lcdscrub.o: $(UTILS_SRC)/font-retry.h
-lcdscrub.o: $(UTILS_SRC)/grabscreen.h
-lcdscrub.o: $(UTILS_SRC)/hsv.h
-lcdscrub.o: $(UTILS_SRC)/resources.h
-lcdscrub.o: $(UTILS_SRC)/usleep.h
-lcdscrub.o: $(UTILS_SRC)/visual.h
-lcdscrub.o: $(UTILS_SRC)/xft.h
-lcdscrub.o: $(UTILS_SRC)/yarandom.h
-lightning.o: ../config.h
-lightning.o: $(srcdir)/fps.h
-lightning.o: $(srcdir)/recanim.h
-lightning.o: $(srcdir)/screenhackI.h
-lightning.o: $(UTILS_SRC)/colors.h
-lightning.o: $(UTILS_SRC)/erase.h
-lightning.o: $(UTILS_SRC)/font-retry.h
-lightning.o: $(UTILS_SRC)/grabscreen.h
-lightning.o: $(UTILS_SRC)/hsv.h
-lightning.o: $(UTILS_SRC)/resources.h
-lightning.o: $(UTILS_SRC)/usleep.h
-lightning.o: $(UTILS_SRC)/visual.h
-lightning.o: $(UTILS_SRC)/xft.h
-lightning.o: $(UTILS_SRC)/yarandom.h
-lightning.o: $(srcdir)/xlockmoreI.h
-lightning.o: $(srcdir)/xlockmore.h
-lisa.o: ../config.h
-lisa.o: $(srcdir)/fps.h
-lisa.o: $(srcdir)/recanim.h
-lisa.o: $(srcdir)/screenhackI.h
-lisa.o: $(UTILS_SRC)/colors.h
-lisa.o: $(UTILS_SRC)/erase.h
-lisa.o: $(UTILS_SRC)/font-retry.h
-lisa.o: $(UTILS_SRC)/grabscreen.h
-lisa.o: $(UTILS_SRC)/hsv.h
-lisa.o: $(UTILS_SRC)/resources.h
-lisa.o: $(UTILS_SRC)/usleep.h
-lisa.o: $(UTILS_SRC)/visual.h
-lisa.o: $(UTILS_SRC)/xft.h
-lisa.o: $(UTILS_SRC)/yarandom.h
-lisa.o: $(srcdir)/xlockmoreI.h
-lisa.o: $(srcdir)/xlockmore.h
-lissie.o: ../config.h
-lissie.o: $(srcdir)/fps.h
-lissie.o: $(srcdir)/recanim.h
-lissie.o: $(srcdir)/screenhackI.h
-lissie.o: $(UTILS_SRC)/colors.h
-lissie.o: $(UTILS_SRC)/erase.h
-lissie.o: $(UTILS_SRC)/font-retry.h
-lissie.o: $(UTILS_SRC)/grabscreen.h
-lissie.o: $(UTILS_SRC)/hsv.h
-lissie.o: $(UTILS_SRC)/resources.h
-lissie.o: $(UTILS_SRC)/usleep.h
-lissie.o: $(UTILS_SRC)/visual.h
-lissie.o: $(UTILS_SRC)/xft.h
-lissie.o: $(UTILS_SRC)/yarandom.h
-lissie.o: $(srcdir)/xlockmoreI.h
-lissie.o: $(srcdir)/xlockmore.h
-lmorph.o: ../config.h
-lmorph.o: $(srcdir)/fps.h
-lmorph.o: $(srcdir)/recanim.h
-lmorph.o: $(srcdir)/screenhackI.h
-lmorph.o: $(srcdir)/screenhack.h
-lmorph.o: $(UTILS_SRC)/colors.h
-lmorph.o: $(UTILS_SRC)/font-retry.h
-lmorph.o: $(UTILS_SRC)/grabscreen.h
-lmorph.o: $(UTILS_SRC)/hsv.h
-lmorph.o: $(UTILS_SRC)/resources.h
-lmorph.o: $(UTILS_SRC)/usleep.h
-lmorph.o: $(UTILS_SRC)/visual.h
-lmorph.o: $(UTILS_SRC)/xft.h
-lmorph.o: $(UTILS_SRC)/yarandom.h
-loop.o: $(srcdir)/automata.h
-loop.o: ../config.h
-loop.o: $(srcdir)/fps.h
-loop.o: $(srcdir)/recanim.h
-loop.o: $(srcdir)/screenhackI.h
-loop.o: $(UTILS_SRC)/colors.h
-loop.o: $(UTILS_SRC)/erase.h
-loop.o: $(UTILS_SRC)/font-retry.h
-loop.o: $(UTILS_SRC)/grabscreen.h
-loop.o: $(UTILS_SRC)/hsv.h
-loop.o: $(UTILS_SRC)/resources.h
-loop.o: $(UTILS_SRC)/usleep.h
-loop.o: $(UTILS_SRC)/visual.h
-loop.o: $(UTILS_SRC)/xft.h
-loop.o: $(UTILS_SRC)/yarandom.h
-loop.o: $(srcdir)/xlockmoreI.h
-loop.o: $(srcdir)/xlockmore.h
-m6502.o: $(srcdir)/analogtv.h
-m6502.o: $(srcdir)/asm6502.h
-m6502.o: ../config.h
-m6502.o: $(srcdir)/fps.h
-m6502.o: m6502.h
-m6502.o: $(srcdir)/recanim.h
-m6502.o: $(srcdir)/screenhackI.h
-m6502.o: $(srcdir)/screenhack.h
-m6502.o: $(UTILS_SRC)/aligned_malloc.h
-m6502.o: $(UTILS_SRC)/colors.h
-m6502.o: $(UTILS_SRC)/font-retry.h
-m6502.o: $(UTILS_SRC)/grabscreen.h
-m6502.o: $(UTILS_SRC)/hsv.h
-m6502.o: $(UTILS_SRC)/resources.h
-m6502.o: $(UTILS_SRC)/thread_util.h
-m6502.o: $(UTILS_SRC)/usleep.h
-m6502.o: $(UTILS_SRC)/visual.h
-m6502.o: $(UTILS_SRC)/xft.h
-m6502.o: $(UTILS_SRC)/xshm.h
-m6502.o: $(UTILS_SRC)/yarandom.h
-maze.o: ../config.h
-maze.o: $(srcdir)/fps.h
-maze.o: images/gen/logo-180_png.h
-maze.o: images/gen/logo-360_png.h
-maze.o: images/gen/logo-50_png.h
-maze.o: $(srcdir)/recanim.h
-maze.o: $(srcdir)/screenhackI.h
-maze.o: $(srcdir)/screenhack.h
-maze.o: $(UTILS_SRC)/colors.h
-maze.o: $(UTILS_SRC)/erase.h
-maze.o: $(UTILS_SRC)/font-retry.h
-maze.o: $(UTILS_SRC)/grabscreen.h
-maze.o: $(UTILS_SRC)/hsv.h
-maze.o: $(UTILS_SRC)/resources.h
-maze.o: $(UTILS_SRC)/usleep.h
-maze.o: $(UTILS_SRC)/visual.h
-maze.o: $(UTILS_SRC)/xft.h
-maze.o: $(UTILS_SRC)/yarandom.h
-maze.o: $(srcdir)/ximage-loader.h
-memscroller.o: ../config.h
-memscroller.o: $(srcdir)/fps.h
-memscroller.o: $(srcdir)/recanim.h
-memscroller.o: $(srcdir)/screenhackI.h
-memscroller.o: $(srcdir)/screenhack.h
-memscroller.o: $(UTILS_SRC)/colors.h
-memscroller.o: $(UTILS_SRC)/font-retry.h
-memscroller.o: $(UTILS_SRC)/grabscreen.h
-memscroller.o: $(UTILS_SRC)/hsv.h
-memscroller.o: $(UTILS_SRC)/resources.h
-memscroller.o: $(UTILS_SRC)/usleep.h
-memscroller.o: $(UTILS_SRC)/visual.h
-memscroller.o: $(UTILS_SRC)/xft.h
-memscroller.o: $(UTILS_SRC)/xshm.h
-memscroller.o: $(UTILS_SRC)/yarandom.h
-metaballs.o: ../config.h
-metaballs.o: $(srcdir)/fps.h
-metaballs.o: $(srcdir)/recanim.h
-metaballs.o: $(srcdir)/screenhackI.h
-metaballs.o: $(srcdir)/screenhack.h
-metaballs.o: $(UTILS_SRC)/colors.h
-metaballs.o: $(UTILS_SRC)/font-retry.h
-metaballs.o: $(UTILS_SRC)/grabscreen.h
-metaballs.o: $(UTILS_SRC)/hsv.h
-metaballs.o: $(UTILS_SRC)/resources.h
-metaballs.o: $(UTILS_SRC)/usleep.h
-metaballs.o: $(UTILS_SRC)/visual.h
-metaballs.o: $(UTILS_SRC)/xft.h
-metaballs.o: $(UTILS_SRC)/yarandom.h
-moire2.o: ../config.h
-moire2.o: $(srcdir)/fps.h
-moire2.o: $(srcdir)/recanim.h
-moire2.o: $(srcdir)/screenhackI.h
-moire2.o: $(srcdir)/screenhack.h
-moire2.o: $(UTILS_SRC)/colors.h
-moire2.o: $(UTILS_SRC)/font-retry.h
-moire2.o: $(UTILS_SRC)/grabscreen.h
-moire2.o: $(UTILS_SRC)/hsv.h
-moire2.o: $(UTILS_SRC)/resources.h
-moire2.o: $(UTILS_SRC)/usleep.h
-moire2.o: $(UTILS_SRC)/visual.h
-moire2.o: $(UTILS_SRC)/xdbe.h
-moire2.o: $(UTILS_SRC)/xft.h
-moire2.o: $(UTILS_SRC)/yarandom.h
-moire.o: ../config.h
-moire.o: $(srcdir)/fps.h
-moire.o: $(srcdir)/recanim.h
-moire.o: $(srcdir)/screenhackI.h
-moire.o: $(srcdir)/screenhack.h
-moire.o: $(UTILS_SRC)/colors.h
-moire.o: $(UTILS_SRC)/font-retry.h
-moire.o: $(UTILS_SRC)/grabscreen.h
-moire.o: $(UTILS_SRC)/hsv.h
-moire.o: $(UTILS_SRC)/resources.h
-moire.o: $(UTILS_SRC)/usleep.h
-moire.o: $(UTILS_SRC)/visual.h
-moire.o: $(UTILS_SRC)/xft.h
-moire.o: $(UTILS_SRC)/xshm.h
-moire.o: $(UTILS_SRC)/yarandom.h
-mountain.o: ../config.h
-mountain.o: $(srcdir)/fps.h
-mountain.o: $(srcdir)/recanim.h
-mountain.o: $(srcdir)/screenhackI.h
-mountain.o: $(UTILS_SRC)/colors.h
-mountain.o: $(UTILS_SRC)/erase.h
-mountain.o: $(UTILS_SRC)/font-retry.h
-mountain.o: $(UTILS_SRC)/grabscreen.h
-mountain.o: $(UTILS_SRC)/hsv.h
-mountain.o: $(UTILS_SRC)/resources.h
-mountain.o: $(UTILS_SRC)/usleep.h
-mountain.o: $(UTILS_SRC)/visual.h
-mountain.o: $(UTILS_SRC)/xft.h
-mountain.o: $(UTILS_SRC)/yarandom.h
-mountain.o: $(srcdir)/xlockmoreI.h
-mountain.o: $(srcdir)/xlockmore.h
-munch.o: ../config.h
-munch.o: $(srcdir)/fps.h
-munch.o: $(srcdir)/recanim.h
-munch.o: $(srcdir)/screenhackI.h
-munch.o: $(srcdir)/screenhack.h
-munch.o: $(UTILS_SRC)/colors.h
-munch.o: $(UTILS_SRC)/font-retry.h
-munch.o: $(UTILS_SRC)/grabscreen.h
-munch.o: $(UTILS_SRC)/hsv.h
-munch.o: $(UTILS_SRC)/pow2.h
-munch.o: $(UTILS_SRC)/resources.h
-munch.o: $(UTILS_SRC)/usleep.h
-munch.o: $(UTILS_SRC)/visual.h
-munch.o: $(UTILS_SRC)/xft.h
-munch.o: $(UTILS_SRC)/yarandom.h
-nerverot.o: ../config.h
-nerverot.o: $(srcdir)/fps.h
-nerverot.o: $(srcdir)/recanim.h
-nerverot.o: $(srcdir)/screenhackI.h
-nerverot.o: $(srcdir)/screenhack.h
-nerverot.o: $(UTILS_SRC)/colors.h
-nerverot.o: $(UTILS_SRC)/font-retry.h
-nerverot.o: $(UTILS_SRC)/grabscreen.h
-nerverot.o: $(UTILS_SRC)/hsv.h
-nerverot.o: $(UTILS_SRC)/resources.h
-nerverot.o: $(UTILS_SRC)/usleep.h
-nerverot.o: $(UTILS_SRC)/visual.h
-nerverot.o: $(UTILS_SRC)/xft.h
-nerverot.o: $(UTILS_SRC)/yarandom.h
-noseguy.o: ../config.h
-noseguy.o: $(srcdir)/fps.h
-noseguy.o: images/gen/nose-f1_png.h
-noseguy.o: images/gen/nose-f2_png.h
-noseguy.o: images/gen/nose-f3_png.h
-noseguy.o: images/gen/nose-f4_png.h
-noseguy.o: images/gen/nose-l1_png.h
-noseguy.o: images/gen/nose-l2_png.h
-noseguy.o: images/gen/nose-r1_png.h
-noseguy.o: images/gen/nose-r2_png.h
-noseguy.o: $(srcdir)/recanim.h
-noseguy.o: $(srcdir)/screenhackI.h
-noseguy.o: $(srcdir)/screenhack.h
-noseguy.o: $(UTILS_SRC)/colors.h
-noseguy.o: $(UTILS_SRC)/font-retry.h
-noseguy.o: $(UTILS_SRC)/grabscreen.h
-noseguy.o: $(UTILS_SRC)/hsv.h
-noseguy.o: $(UTILS_SRC)/resources.h
-noseguy.o: $(UTILS_SRC)/textclient.h
-noseguy.o: $(UTILS_SRC)/usleep.h
-noseguy.o: $(UTILS_SRC)/visual.h
-noseguy.o: $(UTILS_SRC)/xft.h
-noseguy.o: $(UTILS_SRC)/yarandom.h
-noseguy.o: $(srcdir)/ximage-loader.h
-pacman_ai.o: ../config.h
-pacman_ai.o: $(srcdir)/fps.h
-pacman_ai.o: $(srcdir)/pacman_ai.h
-pacman_ai.o: $(srcdir)/pacman.h
-pacman_ai.o: $(srcdir)/pacman_level.h
-pacman_ai.o: $(srcdir)/recanim.h
-pacman_ai.o: $(srcdir)/screenhackI.h
-pacman_ai.o: $(UTILS_SRC)/colors.h
-pacman_ai.o: $(UTILS_SRC)/erase.h
-pacman_ai.o: $(UTILS_SRC)/font-retry.h
-pacman_ai.o: $(UTILS_SRC)/grabscreen.h
-pacman_ai.o: $(UTILS_SRC)/hsv.h
-pacman_ai.o: $(UTILS_SRC)/resources.h
-pacman_ai.o: $(UTILS_SRC)/usleep.h
-pacman_ai.o: $(UTILS_SRC)/visual.h
-pacman_ai.o: $(UTILS_SRC)/xft.h
-pacman_ai.o: $(UTILS_SRC)/yarandom.h
-pacman_ai.o: $(srcdir)/xlockmoreI.h
-pacman_level.o: ../config.h
-pacman_level.o: $(srcdir)/fps.h
-pacman_level.o: $(srcdir)/pacman.h
-pacman_level.o: $(srcdir)/pacman_level.h
-pacman_level.o: $(srcdir)/recanim.h
-pacman_level.o: $(srcdir)/screenhackI.h
-pacman_level.o: $(UTILS_SRC)/colors.h
-pacman_level.o: $(UTILS_SRC)/font-retry.h
-pacman_level.o: $(UTILS_SRC)/grabscreen.h
-pacman_level.o: $(UTILS_SRC)/hsv.h
-pacman_level.o: $(UTILS_SRC)/resources.h
-pacman_level.o: $(UTILS_SRC)/usleep.h
-pacman_level.o: $(UTILS_SRC)/visual.h
-pacman_level.o: $(UTILS_SRC)/xft.h
-pacman_level.o: $(UTILS_SRC)/yarandom.h
-pacman.o: ../config.h
-pacman.o: $(srcdir)/fps.h
-pacman.o: images/gen/pacman_png.h
-pacman.o: $(srcdir)/pacman_ai.h
-pacman.o: $(srcdir)/pacman.h
-pacman.o: $(srcdir)/pacman_level.h
-pacman.o: $(srcdir)/recanim.h
-pacman.o: $(srcdir)/screenhackI.h
-pacman.o: $(UTILS_SRC)/colors.h
-pacman.o: $(UTILS_SRC)/erase.h
-pacman.o: $(UTILS_SRC)/font-retry.h
-pacman.o: $(UTILS_SRC)/grabscreen.h
-pacman.o: $(UTILS_SRC)/hsv.h
-pacman.o: $(UTILS_SRC)/resources.h
-pacman.o: $(UTILS_SRC)/usleep.h
-pacman.o: $(UTILS_SRC)/visual.h
-pacman.o: $(UTILS_SRC)/xft.h
-pacman.o: $(UTILS_SRC)/yarandom.h
-pacman.o: $(srcdir)/ximage-loader.h
-pacman.o: $(srcdir)/xlockmoreI.h
-pacman.o: $(srcdir)/xlockmore.h
-pedal.o: ../config.h
-pedal.o: $(srcdir)/fps.h
-pedal.o: $(srcdir)/recanim.h
-pedal.o: $(srcdir)/screenhackI.h
-pedal.o: $(srcdir)/screenhack.h
-pedal.o: $(UTILS_SRC)/colors.h
-pedal.o: $(UTILS_SRC)/erase.h
-pedal.o: $(UTILS_SRC)/font-retry.h
-pedal.o: $(UTILS_SRC)/grabscreen.h
-pedal.o: $(UTILS_SRC)/hsv.h
-pedal.o: $(UTILS_SRC)/resources.h
-pedal.o: $(UTILS_SRC)/usleep.h
-pedal.o: $(UTILS_SRC)/visual.h
-pedal.o: $(UTILS_SRC)/xft.h
-pedal.o: $(UTILS_SRC)/yarandom.h
-penetrate.o: ../config.h
-penetrate.o: $(srcdir)/fps.h
-penetrate.o: $(srcdir)/recanim.h
-penetrate.o: $(srcdir)/screenhackI.h
-penetrate.o: $(srcdir)/screenhack.h
-penetrate.o: $(UTILS_SRC)/colors.h
-penetrate.o: $(UTILS_SRC)/font-retry.h
-penetrate.o: $(UTILS_SRC)/grabscreen.h
-penetrate.o: $(UTILS_SRC)/hsv.h
-penetrate.o: $(UTILS_SRC)/resources.h
-penetrate.o: $(UTILS_SRC)/usleep.h
-penetrate.o: $(UTILS_SRC)/visual.h
-penetrate.o: $(UTILS_SRC)/xft.h
-penetrate.o: $(UTILS_SRC)/yarandom.h
-penrose.o: ../config.h
-penrose.o: $(srcdir)/fps.h
-penrose.o: $(srcdir)/recanim.h
-penrose.o: $(srcdir)/screenhackI.h
-penrose.o: $(UTILS_SRC)/colors.h
-penrose.o: $(UTILS_SRC)/erase.h
-penrose.o: $(UTILS_SRC)/font-retry.h
-penrose.o: $(UTILS_SRC)/grabscreen.h
-penrose.o: $(UTILS_SRC)/hsv.h
-penrose.o: $(UTILS_SRC)/resources.h
-penrose.o: $(UTILS_SRC)/usleep.h
-penrose.o: $(UTILS_SRC)/visual.h
-penrose.o: $(UTILS_SRC)/xft.h
-penrose.o: $(UTILS_SRC)/yarandom.h
-penrose.o: $(srcdir)/xlockmoreI.h
-penrose.o: $(srcdir)/xlockmore.h
-petri.o: ../config.h
-petri.o: $(srcdir)/fps.h
-petri.o: $(srcdir)/recanim.h
-petri.o: $(srcdir)/screenhackI.h
-petri.o: $(srcdir)/screenhack.h
-petri.o: $(UTILS_SRC)/colors.h
-petri.o: $(UTILS_SRC)/font-retry.h
-petri.o: $(UTILS_SRC)/grabscreen.h
-petri.o: $(UTILS_SRC)/hsv.h
-petri.o: $(UTILS_SRC)/resources.h
-petri.o: $(UTILS_SRC)/spline.h
-petri.o: $(UTILS_SRC)/usleep.h
-petri.o: $(UTILS_SRC)/visual.h
-petri.o: $(UTILS_SRC)/xft.h
-petri.o: $(UTILS_SRC)/yarandom.h
-phosphor.o: ../config.h
-phosphor.o: $(srcdir)/fps.h
-phosphor.o: images/gen/6x10font_png.h
-phosphor.o: $(srcdir)/recanim.h
-phosphor.o: $(srcdir)/screenhackI.h
-phosphor.o: $(srcdir)/screenhack.h
-phosphor.o: $(UTILS_SRC)/colors.h
-phosphor.o: $(UTILS_SRC)/font-retry.h
-phosphor.o: $(UTILS_SRC)/grabscreen.h
-phosphor.o: $(UTILS_SRC)/hsv.h
-phosphor.o: $(UTILS_SRC)/resources.h
-phosphor.o: $(UTILS_SRC)/textclient.h
-phosphor.o: $(UTILS_SRC)/usleep.h
-phosphor.o: $(UTILS_SRC)/utf8wc.h
-phosphor.o: $(UTILS_SRC)/visual.h
-phosphor.o: $(UTILS_SRC)/xft.h
-phosphor.o: $(UTILS_SRC)/yarandom.h
-phosphor.o: $(srcdir)/ximage-loader.h
-piecewise.o: ../config.h
-piecewise.o: $(srcdir)/fps.h
-piecewise.o: $(srcdir)/recanim.h
-piecewise.o: $(srcdir)/screenhackI.h
-piecewise.o: $(srcdir)/screenhack.h
-piecewise.o: $(UTILS_SRC)/colors.h
-piecewise.o: $(UTILS_SRC)/font-retry.h
-piecewise.o: $(UTILS_SRC)/grabscreen.h
-piecewise.o: $(UTILS_SRC)/hsv.h
-piecewise.o: $(UTILS_SRC)/resources.h
-piecewise.o: $(UTILS_SRC)/usleep.h
-piecewise.o: $(UTILS_SRC)/visual.h
-piecewise.o: $(UTILS_SRC)/xdbe.h
-piecewise.o: $(UTILS_SRC)/xft.h
-piecewise.o: $(UTILS_SRC)/yarandom.h
-polyominoes.o: ../config.h
-polyominoes.o: $(srcdir)/fps.h
-polyominoes.o: $(srcdir)/recanim.h
-polyominoes.o: $(srcdir)/screenhackI.h
-polyominoes.o: $(UTILS_SRC)/colors.h
-polyominoes.o: $(UTILS_SRC)/erase.h
-polyominoes.o: $(UTILS_SRC)/font-retry.h
-polyominoes.o: $(UTILS_SRC)/grabscreen.h
-polyominoes.o: $(UTILS_SRC)/hsv.h
-polyominoes.o: $(UTILS_SRC)/resources.h
-polyominoes.o: $(UTILS_SRC)/usleep.h
-polyominoes.o: $(UTILS_SRC)/visual.h
-polyominoes.o: $(UTILS_SRC)/xft.h
-polyominoes.o: $(UTILS_SRC)/yarandom.h
-polyominoes.o: $(srcdir)/xlockmoreI.h
-polyominoes.o: $(srcdir)/xlockmore.h
-pong.o: $(srcdir)/analogtv.h
-pong.o: ../config.h
-pong.o: $(srcdir)/fps.h
-pong.o: $(srcdir)/recanim.h
-pong.o: $(srcdir)/screenhackI.h
-pong.o: $(srcdir)/screenhack.h
-pong.o: $(UTILS_SRC)/aligned_malloc.h
-pong.o: $(UTILS_SRC)/colors.h
-pong.o: $(UTILS_SRC)/font-retry.h
-pong.o: $(UTILS_SRC)/grabscreen.h
-pong.o: $(UTILS_SRC)/hsv.h
-pong.o: $(UTILS_SRC)/resources.h
-pong.o: $(UTILS_SRC)/thread_util.h
-pong.o: $(UTILS_SRC)/usleep.h
-pong.o: $(UTILS_SRC)/visual.h
-pong.o: $(UTILS_SRC)/xft.h
-pong.o: $(UTILS_SRC)/xshm.h
-pong.o: $(UTILS_SRC)/yarandom.h
-popsquares.o: ../config.h
-popsquares.o: $(srcdir)/fps.h
-popsquares.o: $(srcdir)/recanim.h
-popsquares.o: $(srcdir)/screenhackI.h
-popsquares.o: $(srcdir)/screenhack.h
-popsquares.o: $(UTILS_SRC)/colors.h
-popsquares.o: $(UTILS_SRC)/font-retry.h
-popsquares.o: $(UTILS_SRC)/grabscreen.h
-popsquares.o: $(UTILS_SRC)/hsv.h
-popsquares.o: $(UTILS_SRC)/resources.h
-popsquares.o: $(UTILS_SRC)/usleep.h
-popsquares.o: $(UTILS_SRC)/visual.h
-popsquares.o: $(UTILS_SRC)/xdbe.h
-popsquares.o: $(UTILS_SRC)/xft.h
-popsquares.o: $(UTILS_SRC)/yarandom.h
-pyro.o: ../config.h
-pyro.o: $(srcdir)/fps.h
-pyro.o: $(srcdir)/recanim.h
-pyro.o: $(srcdir)/screenhackI.h
-pyro.o: $(srcdir)/screenhack.h
-pyro.o: $(UTILS_SRC)/colors.h
-pyro.o: $(UTILS_SRC)/font-retry.h
-pyro.o: $(UTILS_SRC)/grabscreen.h
-pyro.o: $(UTILS_SRC)/hsv.h
-pyro.o: $(UTILS_SRC)/resources.h
-pyro.o: $(UTILS_SRC)/usleep.h
-pyro.o: $(UTILS_SRC)/visual.h
-pyro.o: $(UTILS_SRC)/xft.h
-pyro.o: $(UTILS_SRC)/yarandom.h
-qix.o: ../config.h
-qix.o: $(srcdir)/fps.h
-qix.o: $(srcdir)/recanim.h
-qix.o: $(srcdir)/screenhackI.h
-qix.o: $(srcdir)/screenhack.h
-qix.o: $(UTILS_SRC)/alpha.h
-qix.o: $(UTILS_SRC)/colors.h
-qix.o: $(UTILS_SRC)/font-retry.h
-qix.o: $(UTILS_SRC)/grabscreen.h
-qix.o: $(UTILS_SRC)/hsv.h
-qix.o: $(UTILS_SRC)/resources.h
-qix.o: $(UTILS_SRC)/usleep.h
-qix.o: $(UTILS_SRC)/visual.h
-qix.o: $(UTILS_SRC)/xft.h
-qix.o: $(UTILS_SRC)/yarandom.h
-rd-bomb.o: ../config.h
-rd-bomb.o: $(srcdir)/fps.h
-rd-bomb.o: $(srcdir)/recanim.h
-rd-bomb.o: $(srcdir)/screenhackI.h
-rd-bomb.o: $(srcdir)/screenhack.h
-rd-bomb.o: $(UTILS_SRC)/colors.h
-rd-bomb.o: $(UTILS_SRC)/font-retry.h
-rd-bomb.o: $(UTILS_SRC)/grabscreen.h
-rd-bomb.o: $(UTILS_SRC)/hsv.h
-rd-bomb.o: $(UTILS_SRC)/resources.h
-rd-bomb.o: $(UTILS_SRC)/usleep.h
-rd-bomb.o: $(UTILS_SRC)/visual.h
-rd-bomb.o: $(UTILS_SRC)/xft.h
-rd-bomb.o: $(UTILS_SRC)/xshm.h
-rd-bomb.o: $(UTILS_SRC)/yarandom.h
-recanim.o: ../config.h
-recanim.o: $(srcdir)/fps.h
-recanim.o: $(srcdir)/recanim.h
-recanim.o: $(srcdir)/screenhackI.h
-recanim.o: $(UTILS_SRC)/colors.h
-recanim.o: $(UTILS_SRC)/font-retry.h
-recanim.o: $(UTILS_SRC)/grabscreen.h
-recanim.o: $(UTILS_SRC)/hsv.h
-recanim.o: $(UTILS_SRC)/resources.h
-recanim.o: $(UTILS_SRC)/usleep.h
-recanim.o: $(UTILS_SRC)/visual.h
-recanim.o: $(UTILS_SRC)/xft.h
-recanim.o: $(UTILS_SRC)/yarandom.h
-ripples.o: ../config.h
-ripples.o: $(srcdir)/fps.h
-ripples.o: $(srcdir)/recanim.h
-ripples.o: $(srcdir)/screenhackI.h
-ripples.o: $(srcdir)/screenhack.h
-ripples.o: $(UTILS_SRC)/colors.h
-ripples.o: $(UTILS_SRC)/font-retry.h
-ripples.o: $(UTILS_SRC)/grabscreen.h
-ripples.o: $(UTILS_SRC)/hsv.h
-ripples.o: $(UTILS_SRC)/resources.h
-ripples.o: $(UTILS_SRC)/usleep.h
-ripples.o: $(UTILS_SRC)/visual.h
-ripples.o: $(UTILS_SRC)/xft.h
-ripples.o: $(UTILS_SRC)/xshm.h
-ripples.o: $(UTILS_SRC)/yarandom.h
-rocks.o: ../config.h
-rocks.o: $(srcdir)/fps.h
-rocks.o: $(srcdir)/recanim.h
-rocks.o: $(srcdir)/screenhackI.h
-rocks.o: $(srcdir)/screenhack.h
-rocks.o: $(UTILS_SRC)/colors.h
-rocks.o: $(UTILS_SRC)/font-retry.h
-rocks.o: $(UTILS_SRC)/grabscreen.h
-rocks.o: $(UTILS_SRC)/hsv.h
-rocks.o: $(UTILS_SRC)/resources.h
-rocks.o: $(UTILS_SRC)/usleep.h
-rocks.o: $(UTILS_SRC)/visual.h
-rocks.o: $(UTILS_SRC)/xft.h
-rocks.o: $(UTILS_SRC)/yarandom.h
-rorschach.o: ../config.h
-rorschach.o: $(srcdir)/fps.h
-rorschach.o: $(srcdir)/recanim.h
-rorschach.o: $(srcdir)/screenhackI.h
-rorschach.o: $(srcdir)/screenhack.h
-rorschach.o: $(UTILS_SRC)/colors.h
-rorschach.o: $(UTILS_SRC)/erase.h
-rorschach.o: $(UTILS_SRC)/font-retry.h
-rorschach.o: $(UTILS_SRC)/grabscreen.h
-rorschach.o: $(UTILS_SRC)/hsv.h
-rorschach.o: $(UTILS_SRC)/resources.h
-rorschach.o: $(UTILS_SRC)/usleep.h
-rorschach.o: $(UTILS_SRC)/visual.h
-rorschach.o: $(UTILS_SRC)/xft.h
-rorschach.o: $(UTILS_SRC)/yarandom.h
-rotor.o: ../config.h
-rotor.o: $(srcdir)/fps.h
-rotor.o: $(srcdir)/recanim.h
-rotor.o: $(srcdir)/screenhackI.h
-rotor.o: $(UTILS_SRC)/colors.h
-rotor.o: $(UTILS_SRC)/erase.h
-rotor.o: $(UTILS_SRC)/font-retry.h
-rotor.o: $(UTILS_SRC)/grabscreen.h
-rotor.o: $(UTILS_SRC)/hsv.h
-rotor.o: $(UTILS_SRC)/resources.h
-rotor.o: $(UTILS_SRC)/usleep.h
-rotor.o: $(UTILS_SRC)/visual.h
-rotor.o: $(UTILS_SRC)/xft.h
-rotor.o: $(UTILS_SRC)/yarandom.h
-rotor.o: $(srcdir)/xlockmoreI.h
-rotor.o: $(srcdir)/xlockmore.h
-rotzoomer.o: ../config.h
-rotzoomer.o: $(srcdir)/fps.h
-rotzoomer.o: $(srcdir)/recanim.h
-rotzoomer.o: $(srcdir)/screenhackI.h
-rotzoomer.o: $(srcdir)/screenhack.h
-rotzoomer.o: $(UTILS_SRC)/colors.h
-rotzoomer.o: $(UTILS_SRC)/font-retry.h
-rotzoomer.o: $(UTILS_SRC)/grabscreen.h
-rotzoomer.o: $(UTILS_SRC)/hsv.h
-rotzoomer.o: $(UTILS_SRC)/resources.h
-rotzoomer.o: $(UTILS_SRC)/usleep.h
-rotzoomer.o: $(UTILS_SRC)/visual.h
-rotzoomer.o: $(UTILS_SRC)/xft.h
-rotzoomer.o: $(UTILS_SRC)/xshm.h
-rotzoomer.o: $(UTILS_SRC)/yarandom.h
-scooter.o: ../config.h
-scooter.o: $(srcdir)/fps.h
-scooter.o: $(srcdir)/recanim.h
-scooter.o: $(srcdir)/screenhackI.h
-scooter.o: $(UTILS_SRC)/colors.h
-scooter.o: $(UTILS_SRC)/erase.h
-scooter.o: $(UTILS_SRC)/font-retry.h
-scooter.o: $(UTILS_SRC)/grabscreen.h
-scooter.o: $(UTILS_SRC)/hsv.h
-scooter.o: $(UTILS_SRC)/resources.h
-scooter.o: $(UTILS_SRC)/usleep.h
-scooter.o: $(UTILS_SRC)/visual.h
-scooter.o: $(UTILS_SRC)/xft.h
-scooter.o: $(UTILS_SRC)/yarandom.h
-scooter.o: $(srcdir)/xlockmoreI.h
-scooter.o: $(srcdir)/xlockmore.h
-screenhack.o: ../config.h
-screenhack.o: $(srcdir)/fps.h
-screenhack.o: $(srcdir)/recanim.h
-screenhack.o: $(srcdir)/screenhackI.h
-screenhack.o: $(UTILS_SRC)/colors.h
-screenhack.o: $(UTILS_SRC)/font-retry.h
-screenhack.o: $(UTILS_SRC)/grabscreen.h
-screenhack.o: $(UTILS_SRC)/hsv.h
-screenhack.o: $(UTILS_SRC)/resources.h
-screenhack.o: $(UTILS_SRC)/usleep.h
-screenhack.o: $(UTILS_SRC)/version.h
-screenhack.o: $(UTILS_SRC)/visual.h
-screenhack.o: $(UTILS_SRC)/vroot.h
-screenhack.o: $(UTILS_SRC)/xft.h
-screenhack.o: $(UTILS_SRC)/xmu.h
-screenhack.o: $(UTILS_SRC)/yarandom.h
-shadebobs.o: ../config.h
-shadebobs.o: $(srcdir)/fps.h
-shadebobs.o: $(srcdir)/recanim.h
-shadebobs.o: $(srcdir)/screenhackI.h
-shadebobs.o: $(srcdir)/screenhack.h
-shadebobs.o: $(UTILS_SRC)/colors.h
-shadebobs.o: $(UTILS_SRC)/font-retry.h
-shadebobs.o: $(UTILS_SRC)/grabscreen.h
-shadebobs.o: $(UTILS_SRC)/hsv.h
-shadebobs.o: $(UTILS_SRC)/resources.h
-shadebobs.o: $(UTILS_SRC)/usleep.h
-shadebobs.o: $(UTILS_SRC)/visual.h
-shadebobs.o: $(UTILS_SRC)/xft.h
-shadebobs.o: $(UTILS_SRC)/yarandom.h
-sierpinski.o: ../config.h
-sierpinski.o: $(srcdir)/fps.h
-sierpinski.o: $(srcdir)/recanim.h
-sierpinski.o: $(srcdir)/screenhackI.h
-sierpinski.o: $(UTILS_SRC)/colors.h
-sierpinski.o: $(UTILS_SRC)/erase.h
-sierpinski.o: $(UTILS_SRC)/font-retry.h
-sierpinski.o: $(UTILS_SRC)/grabscreen.h
-sierpinski.o: $(UTILS_SRC)/hsv.h
-sierpinski.o: $(UTILS_SRC)/resources.h
-sierpinski.o: $(UTILS_SRC)/usleep.h
-sierpinski.o: $(UTILS_SRC)/visual.h
-sierpinski.o: $(UTILS_SRC)/xft.h
-sierpinski.o: $(UTILS_SRC)/yarandom.h
-sierpinski.o: $(srcdir)/xlockmoreI.h
-sierpinski.o: $(srcdir)/xlockmore.h
-slidescreen.o: ../config.h
-slidescreen.o: $(srcdir)/fps.h
-slidescreen.o: $(srcdir)/recanim.h
-slidescreen.o: $(srcdir)/screenhackI.h
-slidescreen.o: $(srcdir)/screenhack.h
-slidescreen.o: $(UTILS_SRC)/colors.h
-slidescreen.o: $(UTILS_SRC)/font-retry.h
-slidescreen.o: $(UTILS_SRC)/grabscreen.h
-slidescreen.o: $(UTILS_SRC)/hsv.h
-slidescreen.o: $(UTILS_SRC)/resources.h
-slidescreen.o: $(UTILS_SRC)/usleep.h
-slidescreen.o: $(UTILS_SRC)/visual.h
-slidescreen.o: $(UTILS_SRC)/xft.h
-slidescreen.o: $(UTILS_SRC)/yarandom.h
-slip.o: ../config.h
-slip.o: $(srcdir)/fps.h
-slip.o: $(srcdir)/recanim.h
-slip.o: $(srcdir)/screenhackI.h
-slip.o: $(UTILS_SRC)/colors.h
-slip.o: $(UTILS_SRC)/erase.h
-slip.o: $(UTILS_SRC)/font-retry.h
-slip.o: $(UTILS_SRC)/grabscreen.h
-slip.o: $(UTILS_SRC)/hsv.h
-slip.o: $(UTILS_SRC)/resources.h
-slip.o: $(UTILS_SRC)/usleep.h
-slip.o: $(UTILS_SRC)/visual.h
-slip.o: $(UTILS_SRC)/xft.h
-slip.o: $(UTILS_SRC)/yarandom.h
-slip.o: $(srcdir)/xlockmoreI.h
-slip.o: $(srcdir)/xlockmore.h
-speedmine.o: ../config.h
-speedmine.o: $(srcdir)/fps.h
-speedmine.o: $(srcdir)/recanim.h
-speedmine.o: $(srcdir)/screenhackI.h
-speedmine.o: $(srcdir)/screenhack.h
-speedmine.o: $(UTILS_SRC)/colors.h
-speedmine.o: $(UTILS_SRC)/erase.h
-speedmine.o: $(UTILS_SRC)/font-retry.h
-speedmine.o: $(UTILS_SRC)/grabscreen.h
-speedmine.o: $(UTILS_SRC)/hsv.h
-speedmine.o: $(UTILS_SRC)/resources.h
-speedmine.o: $(UTILS_SRC)/usleep.h
-speedmine.o: $(UTILS_SRC)/visual.h
-speedmine.o: $(UTILS_SRC)/xft.h
-speedmine.o: $(UTILS_SRC)/yarandom.h
-sphere.o: ../config.h
-sphere.o: $(srcdir)/fps.h
-sphere.o: $(srcdir)/recanim.h
-sphere.o: $(srcdir)/screenhackI.h
-sphere.o: $(UTILS_SRC)/colors.h
-sphere.o: $(UTILS_SRC)/erase.h
-sphere.o: $(UTILS_SRC)/font-retry.h
-sphere.o: $(UTILS_SRC)/grabscreen.h
-sphere.o: $(UTILS_SRC)/hsv.h
-sphere.o: $(UTILS_SRC)/resources.h
-sphere.o: $(UTILS_SRC)/usleep.h
-sphere.o: $(UTILS_SRC)/visual.h
-sphere.o: $(UTILS_SRC)/xft.h
-sphere.o: $(UTILS_SRC)/yarandom.h
-sphere.o: $(srcdir)/xlockmoreI.h
-sphere.o: $(srcdir)/xlockmore.h
-spiral.o: ../config.h
-spiral.o: $(srcdir)/fps.h
-spiral.o: $(srcdir)/recanim.h
-spiral.o: $(srcdir)/screenhackI.h
-spiral.o: $(UTILS_SRC)/colors.h
-spiral.o: $(UTILS_SRC)/erase.h
-spiral.o: $(UTILS_SRC)/font-retry.h
-spiral.o: $(UTILS_SRC)/grabscreen.h
-spiral.o: $(UTILS_SRC)/hsv.h
-spiral.o: $(UTILS_SRC)/resources.h
-spiral.o: $(UTILS_SRC)/usleep.h
-spiral.o: $(UTILS_SRC)/visual.h
-spiral.o: $(UTILS_SRC)/xft.h
-spiral.o: $(UTILS_SRC)/yarandom.h
-spiral.o: $(srcdir)/xlockmoreI.h
-spiral.o: $(srcdir)/xlockmore.h
-spotlight.o: ../config.h
-spotlight.o: $(srcdir)/fps.h
-spotlight.o: $(srcdir)/recanim.h
-spotlight.o: $(srcdir)/screenhackI.h
-spotlight.o: $(srcdir)/screenhack.h
-spotlight.o: $(UTILS_SRC)/colors.h
-spotlight.o: $(UTILS_SRC)/font-retry.h
-spotlight.o: $(UTILS_SRC)/grabscreen.h
-spotlight.o: $(UTILS_SRC)/hsv.h
-spotlight.o: $(UTILS_SRC)/resources.h
-spotlight.o: $(UTILS_SRC)/usleep.h
-spotlight.o: $(UTILS_SRC)/visual.h
-spotlight.o: $(UTILS_SRC)/xft.h
-spotlight.o: $(UTILS_SRC)/yarandom.h
-squiral.o: ../config.h
-squiral.o: $(srcdir)/fps.h
-squiral.o: $(srcdir)/recanim.h
-squiral.o: $(srcdir)/screenhackI.h
-squiral.o: $(srcdir)/screenhack.h
-squiral.o: $(UTILS_SRC)/colors.h
-squiral.o: $(UTILS_SRC)/erase.h
-squiral.o: $(UTILS_SRC)/font-retry.h
-squiral.o: $(UTILS_SRC)/grabscreen.h
-squiral.o: $(UTILS_SRC)/hsv.h
-squiral.o: $(UTILS_SRC)/resources.h
-squiral.o: $(UTILS_SRC)/usleep.h
-squiral.o: $(UTILS_SRC)/visual.h
-squiral.o: $(UTILS_SRC)/xft.h
-squiral.o: $(UTILS_SRC)/yarandom.h
-starfish.o: ../config.h
-starfish.o: $(srcdir)/fps.h
-starfish.o: $(srcdir)/recanim.h
-starfish.o: $(srcdir)/screenhackI.h
-starfish.o: $(srcdir)/screenhack.h
-starfish.o: $(UTILS_SRC)/colors.h
-starfish.o: $(UTILS_SRC)/font-retry.h
-starfish.o: $(UTILS_SRC)/grabscreen.h
-starfish.o: $(UTILS_SRC)/hsv.h
-starfish.o: $(UTILS_SRC)/resources.h
-starfish.o: $(UTILS_SRC)/spline.h
-starfish.o: $(UTILS_SRC)/usleep.h
-starfish.o: $(UTILS_SRC)/visual.h
-starfish.o: $(UTILS_SRC)/xft.h
-starfish.o: $(UTILS_SRC)/yarandom.h
-strange.o: ../config.h
-strange.o: $(srcdir)/fps.h
-strange.o: $(srcdir)/recanim.h
-strange.o: $(srcdir)/screenhackI.h
-strange.o: $(UTILS_SRC)/aligned_malloc.h
-strange.o: $(UTILS_SRC)/colors.h
-strange.o: $(UTILS_SRC)/erase.h
-strange.o: $(UTILS_SRC)/font-retry.h
-strange.o: $(UTILS_SRC)/grabscreen.h
-strange.o: $(UTILS_SRC)/hsv.h
-strange.o: $(UTILS_SRC)/pow2.h
-strange.o: $(UTILS_SRC)/resources.h
-strange.o: $(UTILS_SRC)/thread_util.h
-strange.o: $(UTILS_SRC)/usleep.h
-strange.o: $(UTILS_SRC)/visual.h
-strange.o: $(UTILS_SRC)/xft.h
-strange.o: $(UTILS_SRC)/xshm.h
-strange.o: $(UTILS_SRC)/yarandom.h
-strange.o: $(srcdir)/xlockmoreI.h
-strange.o: $(srcdir)/xlockmore.h
-substrate.o: ../config.h
-substrate.o: $(srcdir)/fps.h
-substrate.o: $(srcdir)/recanim.h
-substrate.o: $(srcdir)/screenhackI.h
-substrate.o: $(srcdir)/screenhack.h
-substrate.o: $(UTILS_SRC)/colors.h
-substrate.o: $(UTILS_SRC)/font-retry.h
-substrate.o: $(UTILS_SRC)/grabscreen.h
-substrate.o: $(UTILS_SRC)/hsv.h
-substrate.o: $(UTILS_SRC)/resources.h
-substrate.o: $(UTILS_SRC)/usleep.h
-substrate.o: $(UTILS_SRC)/visual.h
-substrate.o: $(UTILS_SRC)/xft.h
-substrate.o: $(UTILS_SRC)/yarandom.h
-swirl.o: ../config.h
-swirl.o: $(srcdir)/fps.h
-swirl.o: $(srcdir)/recanim.h
-swirl.o: $(srcdir)/screenhackI.h
-swirl.o: $(UTILS_SRC)/colors.h
-swirl.o: $(UTILS_SRC)/erase.h
-swirl.o: $(UTILS_SRC)/font-retry.h
-swirl.o: $(UTILS_SRC)/grabscreen.h
-swirl.o: $(UTILS_SRC)/hsv.h
-swirl.o: $(UTILS_SRC)/resources.h
-swirl.o: $(UTILS_SRC)/usleep.h
-swirl.o: $(UTILS_SRC)/visual.h
-swirl.o: $(UTILS_SRC)/xft.h
-swirl.o: $(UTILS_SRC)/xshm.h
-swirl.o: $(UTILS_SRC)/yarandom.h
-swirl.o: $(srcdir)/xlockmoreI.h
-swirl.o: $(srcdir)/xlockmore.h
-t3d.o: ../config.h
-t3d.o: $(srcdir)/fps.h
-t3d.o: $(srcdir)/recanim.h
-t3d.o: $(srcdir)/screenhackI.h
-t3d.o: $(srcdir)/screenhack.h
-t3d.o: $(UTILS_SRC)/colors.h
-t3d.o: $(UTILS_SRC)/font-retry.h
-t3d.o: $(UTILS_SRC)/grabscreen.h
-t3d.o: $(UTILS_SRC)/hsv.h
-t3d.o: $(UTILS_SRC)/resources.h
-t3d.o: $(UTILS_SRC)/usleep.h
-t3d.o: $(UTILS_SRC)/visual.h
-t3d.o: $(UTILS_SRC)/xft.h
-t3d.o: $(UTILS_SRC)/yarandom.h
-tessellimage.o: ../config.h
-tessellimage.o: $(srcdir)/delaunay.h
-tessellimage.o: $(srcdir)/fps.h
-tessellimage.o: $(srcdir)/recanim.h
-tessellimage.o: $(srcdir)/screenhackI.h
-tessellimage.o: $(srcdir)/screenhack.h
-tessellimage.o: $(UTILS_SRC)/colors.h
-tessellimage.o: $(UTILS_SRC)/font-retry.h
-tessellimage.o: $(UTILS_SRC)/grabscreen.h
-tessellimage.o: $(UTILS_SRC)/hsv.h
-tessellimage.o: $(UTILS_SRC)/resources.h
-tessellimage.o: $(UTILS_SRC)/usleep.h
-tessellimage.o: $(UTILS_SRC)/visual.h
-tessellimage.o: $(UTILS_SRC)/xft.h
-tessellimage.o: $(UTILS_SRC)/yarandom.h
-testx11.o: ../config.h
-testx11.o: $(srcdir)/fps.h
-testx11.o: $(srcdir)/glx/rotator.h
-testx11.o: images/gen/logo-180_png.h
-testx11.o: $(srcdir)/recanim.h
-testx11.o: $(srcdir)/screenhackI.h
-testx11.o: $(srcdir)/screenhack.h
-testx11.o: $(UTILS_SRC)/colorbars.h
-testx11.o: $(UTILS_SRC)/colors.h
-testx11.o: $(UTILS_SRC)/erase.h
-testx11.o: $(UTILS_SRC)/font-retry.h
-testx11.o: $(UTILS_SRC)/grabscreen.h
-testx11.o: $(UTILS_SRC)/hsv.h
-testx11.o: $(UTILS_SRC)/resources.h
-testx11.o: $(UTILS_SRC)/usleep.h
-testx11.o: $(UTILS_SRC)/visual.h
-testx11.o: $(UTILS_SRC)/xft.h
-testx11.o: $(UTILS_SRC)/yarandom.h
-testx11.o: $(srcdir)/ximage-loader.h
-thornbird.o: ../config.h
-thornbird.o: $(srcdir)/fps.h
-thornbird.o: $(srcdir)/recanim.h
-thornbird.o: $(srcdir)/screenhackI.h
-thornbird.o: $(UTILS_SRC)/colors.h
-thornbird.o: $(UTILS_SRC)/erase.h
-thornbird.o: $(UTILS_SRC)/font-retry.h
-thornbird.o: $(UTILS_SRC)/grabscreen.h
-thornbird.o: $(UTILS_SRC)/hsv.h
-thornbird.o: $(UTILS_SRC)/resources.h
-thornbird.o: $(UTILS_SRC)/usleep.h
-thornbird.o: $(UTILS_SRC)/visual.h
-thornbird.o: $(UTILS_SRC)/xft.h
-thornbird.o: $(UTILS_SRC)/yarandom.h
-thornbird.o: $(srcdir)/xlockmoreI.h
-thornbird.o: $(srcdir)/xlockmore.h
-triangle.o: ../config.h
-triangle.o: $(srcdir)/fps.h
-triangle.o: $(srcdir)/recanim.h
-triangle.o: $(srcdir)/screenhackI.h
-triangle.o: $(UTILS_SRC)/colors.h
-triangle.o: $(UTILS_SRC)/erase.h
-triangle.o: $(UTILS_SRC)/font-retry.h
-triangle.o: $(UTILS_SRC)/grabscreen.h
-triangle.o: $(UTILS_SRC)/hsv.h
-triangle.o: $(UTILS_SRC)/resources.h
-triangle.o: $(UTILS_SRC)/usleep.h
-triangle.o: $(UTILS_SRC)/visual.h
-triangle.o: $(UTILS_SRC)/xft.h
-triangle.o: $(UTILS_SRC)/yarandom.h
-triangle.o: $(srcdir)/xlockmoreI.h
-triangle.o: $(srcdir)/xlockmore.h
-truchet.o: ../config.h
-truchet.o: $(srcdir)/fps.h
-truchet.o: $(srcdir)/recanim.h
-truchet.o: $(srcdir)/screenhackI.h
-truchet.o: $(srcdir)/screenhack.h
-truchet.o: $(UTILS_SRC)/colors.h
-truchet.o: $(UTILS_SRC)/font-retry.h
-truchet.o: $(UTILS_SRC)/grabscreen.h
-truchet.o: $(UTILS_SRC)/hsv.h
-truchet.o: $(UTILS_SRC)/resources.h
-truchet.o: $(UTILS_SRC)/usleep.h
-truchet.o: $(UTILS_SRC)/visual.h
-truchet.o: $(UTILS_SRC)/xft.h
-truchet.o: $(UTILS_SRC)/yarandom.h
-twang.o: ../config.h
-twang.o: $(srcdir)/fps.h
-twang.o: $(srcdir)/recanim.h
-twang.o: $(srcdir)/screenhackI.h
-twang.o: $(srcdir)/screenhack.h
-twang.o: $(UTILS_SRC)/colors.h
-twang.o: $(UTILS_SRC)/font-retry.h
-twang.o: $(UTILS_SRC)/grabscreen.h
-twang.o: $(UTILS_SRC)/hsv.h
-twang.o: $(UTILS_SRC)/resources.h
-twang.o: $(UTILS_SRC)/usleep.h
-twang.o: $(UTILS_SRC)/visual.h
-twang.o: $(UTILS_SRC)/xft.h
-twang.o: $(UTILS_SRC)/xshm.h
-twang.o: $(UTILS_SRC)/yarandom.h
-vermiculate.o: ../config.h
-vermiculate.o: $(srcdir)/fps.h
-vermiculate.o: $(srcdir)/recanim.h
-vermiculate.o: $(srcdir)/screenhackI.h
-vermiculate.o: $(srcdir)/screenhack.h
-vermiculate.o: $(UTILS_SRC)/colors.h
-vermiculate.o: $(UTILS_SRC)/font-retry.h
-vermiculate.o: $(UTILS_SRC)/grabscreen.h
-vermiculate.o: $(UTILS_SRC)/hsv.h
-vermiculate.o: $(UTILS_SRC)/resources.h
-vermiculate.o: $(UTILS_SRC)/usleep.h
-vermiculate.o: $(UTILS_SRC)/visual.h
-vermiculate.o: $(UTILS_SRC)/xft.h
-vermiculate.o: $(UTILS_SRC)/yarandom.h
-vfeedback.o: $(srcdir)/analogtv.h
-vfeedback.o: ../config.h
-vfeedback.o: $(srcdir)/fps.h
-vfeedback.o: $(srcdir)/recanim.h
-vfeedback.o: $(srcdir)/screenhackI.h
-vfeedback.o: $(srcdir)/screenhack.h
-vfeedback.o: $(UTILS_SRC)/aligned_malloc.h
-vfeedback.o: $(UTILS_SRC)/colors.h
-vfeedback.o: $(UTILS_SRC)/font-retry.h
-vfeedback.o: $(UTILS_SRC)/grabscreen.h
-vfeedback.o: $(UTILS_SRC)/hsv.h
-vfeedback.o: $(UTILS_SRC)/resources.h
-vfeedback.o: $(UTILS_SRC)/thread_util.h
-vfeedback.o: $(UTILS_SRC)/usleep.h
-vfeedback.o: $(UTILS_SRC)/visual.h
-vfeedback.o: $(UTILS_SRC)/xft.h
-vfeedback.o: $(UTILS_SRC)/xshm.h
-vfeedback.o: $(UTILS_SRC)/yarandom.h
-vines.o: ../config.h
-vines.o: $(srcdir)/fps.h
-vines.o: $(srcdir)/recanim.h
-vines.o: $(srcdir)/screenhackI.h
-vines.o: $(UTILS_SRC)/colors.h
-vines.o: $(UTILS_SRC)/erase.h
-vines.o: $(UTILS_SRC)/font-retry.h
-vines.o: $(UTILS_SRC)/grabscreen.h
-vines.o: $(UTILS_SRC)/hsv.h
-vines.o: $(UTILS_SRC)/resources.h
-vines.o: $(UTILS_SRC)/usleep.h
-vines.o: $(UTILS_SRC)/visual.h
-vines.o: $(UTILS_SRC)/xft.h
-vines.o: $(UTILS_SRC)/yarandom.h
-vines.o: $(srcdir)/xlockmoreI.h
-vines.o: $(srcdir)/xlockmore.h
-wander.o: ../config.h
-wander.o: $(srcdir)/fps.h
-wander.o: $(srcdir)/recanim.h
-wander.o: $(srcdir)/screenhackI.h
-wander.o: $(srcdir)/screenhack.h
-wander.o: $(UTILS_SRC)/colors.h
-wander.o: $(UTILS_SRC)/erase.h
-wander.o: $(UTILS_SRC)/font-retry.h
-wander.o: $(UTILS_SRC)/grabscreen.h
-wander.o: $(UTILS_SRC)/hsv.h
-wander.o: $(UTILS_SRC)/resources.h
-wander.o: $(UTILS_SRC)/usleep.h
-wander.o: $(UTILS_SRC)/visual.h
-wander.o: $(UTILS_SRC)/xft.h
-wander.o: $(UTILS_SRC)/yarandom.h
-webcollage-cocoa.o: ../config.h
-webcollage-cocoa.o: $(srcdir)/fps.h
-webcollage-cocoa.o: $(srcdir)/recanim.h
-webcollage-cocoa.o: $(srcdir)/screenhackI.h
-webcollage-cocoa.o: $(srcdir)/screenhack.h
-webcollage-cocoa.o: $(UTILS_SRC)/colors.h
-webcollage-cocoa.o: $(UTILS_SRC)/font-retry.h
-webcollage-cocoa.o: $(UTILS_SRC)/grabscreen.h
-webcollage-cocoa.o: $(UTILS_SRC)/hsv.h
-webcollage-cocoa.o: $(UTILS_SRC)/resources.h
-webcollage-cocoa.o: $(UTILS_SRC)/usleep.h
-webcollage-cocoa.o: $(UTILS_SRC)/visual.h
-webcollage-cocoa.o: $(UTILS_SRC)/xft.h
-webcollage-cocoa.o: $(UTILS_SRC)/yarandom.h
-webcollage-helper.o: ../config.h
-whirlwindwarp.o: ../config.h
-whirlwindwarp.o: $(srcdir)/fps.h
-whirlwindwarp.o: $(srcdir)/recanim.h
-whirlwindwarp.o: $(srcdir)/screenhackI.h
-whirlwindwarp.o: $(srcdir)/screenhack.h
-whirlwindwarp.o: $(UTILS_SRC)/colors.h
-whirlwindwarp.o: $(UTILS_SRC)/erase.h
-whirlwindwarp.o: $(UTILS_SRC)/font-retry.h
-whirlwindwarp.o: $(UTILS_SRC)/grabscreen.h
-whirlwindwarp.o: $(UTILS_SRC)/hsv.h
-whirlwindwarp.o: $(UTILS_SRC)/resources.h
-whirlwindwarp.o: $(UTILS_SRC)/usleep.h
-whirlwindwarp.o: $(UTILS_SRC)/visual.h
-whirlwindwarp.o: $(UTILS_SRC)/xft.h
-whirlwindwarp.o: $(UTILS_SRC)/yarandom.h
-whirlygig.o: ../config.h
-whirlygig.o: $(srcdir)/fps.h
-whirlygig.o: $(srcdir)/recanim.h
-whirlygig.o: $(srcdir)/screenhackI.h
-whirlygig.o: $(srcdir)/screenhack.h
-whirlygig.o: $(UTILS_SRC)/colors.h
-whirlygig.o: $(UTILS_SRC)/font-retry.h
-whirlygig.o: $(UTILS_SRC)/grabscreen.h
-whirlygig.o: $(UTILS_SRC)/hsv.h
-whirlygig.o: $(UTILS_SRC)/resources.h
-whirlygig.o: $(UTILS_SRC)/usleep.h
-whirlygig.o: $(UTILS_SRC)/visual.h
-whirlygig.o: $(UTILS_SRC)/xdbe.h
-whirlygig.o: $(UTILS_SRC)/xft.h
-whirlygig.o: $(UTILS_SRC)/yarandom.h
-wormhole.o: ../config.h
-wormhole.o: $(srcdir)/fps.h
-wormhole.o: $(srcdir)/recanim.h
-wormhole.o: $(srcdir)/screenhackI.h
-wormhole.o: $(srcdir)/screenhack.h
-wormhole.o: $(UTILS_SRC)/colors.h
-wormhole.o: $(UTILS_SRC)/font-retry.h
-wormhole.o: $(UTILS_SRC)/grabscreen.h
-wormhole.o: $(UTILS_SRC)/hsv.h
-wormhole.o: $(UTILS_SRC)/resources.h
-wormhole.o: $(UTILS_SRC)/usleep.h
-wormhole.o: $(UTILS_SRC)/visual.h
-wormhole.o: $(UTILS_SRC)/xft.h
-wormhole.o: $(UTILS_SRC)/yarandom.h
-worm.o: ../config.h
-worm.o: $(srcdir)/fps.h
-worm.o: $(srcdir)/recanim.h
-worm.o: $(srcdir)/screenhackI.h
-worm.o: $(UTILS_SRC)/colors.h
-worm.o: $(UTILS_SRC)/erase.h
-worm.o: $(UTILS_SRC)/font-retry.h
-worm.o: $(UTILS_SRC)/grabscreen.h
-worm.o: $(UTILS_SRC)/hsv.h
-worm.o: $(UTILS_SRC)/resources.h
-worm.o: $(UTILS_SRC)/usleep.h
-worm.o: $(UTILS_SRC)/visual.h
-worm.o: $(UTILS_SRC)/xft.h
-worm.o: $(UTILS_SRC)/yarandom.h
-worm.o: $(srcdir)/xlockmoreI.h
-worm.o: $(srcdir)/xlockmore.h
-xanalogtv.o: $(srcdir)/analogtv.h
-xanalogtv.o: ../config.h
-xanalogtv.o: $(srcdir)/fps.h
-xanalogtv.o: images/gen/logo-180_png.h
-xanalogtv.o: images/gen/testcard_bbcf_png.h
-xanalogtv.o: images/gen/testcard_pm5544_png.h
-xanalogtv.o: images/gen/testcard_rca_png.h
-xanalogtv.o: $(srcdir)/recanim.h
-xanalogtv.o: $(srcdir)/screenhackI.h
-xanalogtv.o: $(srcdir)/screenhack.h
-xanalogtv.o: $(UTILS_SRC)/aligned_malloc.h
-xanalogtv.o: $(UTILS_SRC)/colors.h
-xanalogtv.o: $(UTILS_SRC)/font-retry.h
-xanalogtv.o: $(UTILS_SRC)/grabscreen.h
-xanalogtv.o: $(UTILS_SRC)/hsv.h
-xanalogtv.o: $(UTILS_SRC)/resources.h
-xanalogtv.o: $(UTILS_SRC)/thread_util.h
-xanalogtv.o: $(UTILS_SRC)/usleep.h
-xanalogtv.o: $(UTILS_SRC)/visual.h
-xanalogtv.o: $(UTILS_SRC)/xft.h
-xanalogtv.o: $(UTILS_SRC)/xshm.h
-xanalogtv.o: $(UTILS_SRC)/yarandom.h
-xanalogtv.o: $(srcdir)/ximage-loader.h
-xflame.o: ../config.h
-xflame.o: $(srcdir)/fps.h
-xflame.o: images/gen/bob_png.h
-xflame.o: $(srcdir)/recanim.h
-xflame.o: $(srcdir)/screenhackI.h
-xflame.o: $(srcdir)/screenhack.h
-xflame.o: $(UTILS_SRC)/colors.h
-xflame.o: $(UTILS_SRC)/font-retry.h
-xflame.o: $(UTILS_SRC)/grabscreen.h
-xflame.o: $(UTILS_SRC)/hsv.h
-xflame.o: $(UTILS_SRC)/resources.h
-xflame.o: $(UTILS_SRC)/usleep.h
-xflame.o: $(UTILS_SRC)/visual.h
-xflame.o: $(UTILS_SRC)/xft.h
-xflame.o: $(UTILS_SRC)/xshm.h
-xflame.o: $(UTILS_SRC)/yarandom.h
-xflame.o: $(srcdir)/ximage-loader.h
-ximage-loader.o: ../config.h
-ximage-loader.o: $(srcdir)/fps.h
-ximage-loader.o: $(srcdir)/recanim.h
-ximage-loader.o: $(srcdir)/screenhackI.h
-ximage-loader.o: $(UTILS_SRC)/colors.h
-ximage-loader.o: $(UTILS_SRC)/font-retry.h
-ximage-loader.o: $(UTILS_SRC)/grabscreen.h
-ximage-loader.o: $(UTILS_SRC)/hsv.h
-ximage-loader.o: $(UTILS_SRC)/resources.h
-ximage-loader.o: $(UTILS_SRC)/usleep.h
-ximage-loader.o: $(UTILS_SRC)/visual.h
-ximage-loader.o: $(UTILS_SRC)/xft.h
-ximage-loader.o: $(UTILS_SRC)/yarandom.h
-ximage-loader.o: $(srcdir)/ximage-loader.h
-xjack.o: ../config.h
-xjack.o: $(srcdir)/fps.h
-xjack.o: $(srcdir)/recanim.h
-xjack.o: $(srcdir)/screenhackI.h
-xjack.o: $(srcdir)/screenhack.h
-xjack.o: $(UTILS_SRC)/colors.h
-xjack.o: $(UTILS_SRC)/font-retry.h
-xjack.o: $(UTILS_SRC)/grabscreen.h
-xjack.o: $(UTILS_SRC)/hsv.h
-xjack.o: $(UTILS_SRC)/resources.h
-xjack.o: $(UTILS_SRC)/usleep.h
-xjack.o: $(UTILS_SRC)/visual.h
-xjack.o: $(UTILS_SRC)/xft.h
-xjack.o: $(UTILS_SRC)/yarandom.h
-xlockmore.o: ../config.h
-xlockmore.o: $(srcdir)/fps.h
-xlockmore.o: $(srcdir)/recanim.h
-xlockmore.o: $(srcdir)/screenhackI.h
-xlockmore.o: $(srcdir)/screenhack.h
-xlockmore.o: $(UTILS_SRC)/colors.h
-xlockmore.o: $(UTILS_SRC)/erase.h
-xlockmore.o: $(UTILS_SRC)/font-retry.h
-xlockmore.o: $(UTILS_SRC)/grabscreen.h
-xlockmore.o: $(UTILS_SRC)/hsv.h
-xlockmore.o: $(UTILS_SRC)/resources.h
-xlockmore.o: $(UTILS_SRC)/usleep.h
-xlockmore.o: $(UTILS_SRC)/visual.h
-xlockmore.o: $(UTILS_SRC)/xft.h
-xlockmore.o: $(UTILS_SRC)/yarandom.h
-xlockmore.o: $(srcdir)/xlockmoreI.h
-xlyap.o: ../config.h
-xlyap.o: $(srcdir)/fps.h
-xlyap.o: $(srcdir)/recanim.h
-xlyap.o: $(srcdir)/screenhackI.h
-xlyap.o: $(srcdir)/screenhack.h
-xlyap.o: $(UTILS_SRC)/colors.h
-xlyap.o: $(UTILS_SRC)/font-retry.h
-xlyap.o: $(UTILS_SRC)/grabscreen.h
-xlyap.o: $(UTILS_SRC)/hsv.h
-xlyap.o: $(UTILS_SRC)/resources.h
-xlyap.o: $(UTILS_SRC)/usleep.h
-xlyap.o: $(UTILS_SRC)/visual.h
-xlyap.o: $(UTILS_SRC)/xft.h
-xlyap.o: $(UTILS_SRC)/yarandom.h
-xmatrix.o: ../config.h
-xmatrix.o: $(srcdir)/fps.h
-xmatrix.o: images/gen/matrix1b_png.h
-xmatrix.o: images/gen/matrix1_png.h
-xmatrix.o: images/gen/matrix2b_png.h
-xmatrix.o: images/gen/matrix2_png.h
-xmatrix.o: $(srcdir)/recanim.h
-xmatrix.o: $(srcdir)/screenhackI.h
-xmatrix.o: $(srcdir)/screenhack.h
-xmatrix.o: $(UTILS_SRC)/colors.h
-xmatrix.o: $(UTILS_SRC)/font-retry.h
-xmatrix.o: $(UTILS_SRC)/grabscreen.h
-xmatrix.o: $(UTILS_SRC)/hsv.h
-xmatrix.o: $(UTILS_SRC)/resources.h
-xmatrix.o: $(UTILS_SRC)/textclient.h
-xmatrix.o: $(UTILS_SRC)/usleep.h
-xmatrix.o: $(UTILS_SRC)/visual.h
-xmatrix.o: $(UTILS_SRC)/xft.h
-xmatrix.o: $(UTILS_SRC)/yarandom.h
-xmatrix.o: $(srcdir)/ximage-loader.h
-xrayswarm.o: ../config.h
-xrayswarm.o: $(srcdir)/fps.h
-xrayswarm.o: $(srcdir)/recanim.h
-xrayswarm.o: $(srcdir)/screenhackI.h
-xrayswarm.o: $(srcdir)/screenhack.h
-xrayswarm.o: $(UTILS_SRC)/colors.h
-xrayswarm.o: $(UTILS_SRC)/font-retry.h
-xrayswarm.o: $(UTILS_SRC)/grabscreen.h
-xrayswarm.o: $(UTILS_SRC)/hsv.h
-xrayswarm.o: $(UTILS_SRC)/resources.h
-xrayswarm.o: $(UTILS_SRC)/usleep.h
-xrayswarm.o: $(UTILS_SRC)/visual.h
-xrayswarm.o: $(UTILS_SRC)/xft.h
-xrayswarm.o: $(UTILS_SRC)/yarandom.h
-xscreensaver-getimage.o: ../config.h
-xscreensaver-getimage.o: $(srcdir)/../driver/prefs.h
-xscreensaver-getimage.o: $(UTILS_SRC)/colorbars.h
-xscreensaver-getimage.o: $(UTILS_SRC)/grabscreen.h
-xscreensaver-getimage.o: $(UTILS_SRC)/resources.h
-xscreensaver-getimage.o: $(UTILS_SRC)/utils.h
-xscreensaver-getimage.o: $(UTILS_SRC)/version.h
-xscreensaver-getimage.o: $(UTILS_SRC)/visual.h
-xscreensaver-getimage.o: $(UTILS_SRC)/vroot.h
-xscreensaver-getimage.o: $(UTILS_SRC)/xmu.h
-xscreensaver-getimage.o: $(UTILS_SRC)/yarandom.h
-xspirograph.o: ../config.h
-xspirograph.o: $(srcdir)/fps.h
-xspirograph.o: $(srcdir)/recanim.h
-xspirograph.o: $(srcdir)/screenhackI.h
-xspirograph.o: $(srcdir)/screenhack.h
-xspirograph.o: $(UTILS_SRC)/colors.h
-xspirograph.o: $(UTILS_SRC)/erase.h
-xspirograph.o: $(UTILS_SRC)/font-retry.h
-xspirograph.o: $(UTILS_SRC)/grabscreen.h
-xspirograph.o: $(UTILS_SRC)/hsv.h
-xspirograph.o: $(UTILS_SRC)/resources.h
-xspirograph.o: $(UTILS_SRC)/usleep.h
-xspirograph.o: $(UTILS_SRC)/visual.h
-xspirograph.o: $(UTILS_SRC)/xft.h
-xspirograph.o: $(UTILS_SRC)/yarandom.h
-xsublim.o: ../config.h
-xsublim.o: $(UTILS_SRC)/font-retry.h
-xsublim.o: $(UTILS_SRC)/resources.h
-xsublim.o: $(UTILS_SRC)/usleep.h
-xsublim.o: $(UTILS_SRC)/vroot.h
-xsublim.o: $(UTILS_SRC)/xft.h
-xsublim.o: $(UTILS_SRC)/yarandom.h
-zoom.o: ../config.h
-zoom.o: $(srcdir)/fps.h
-zoom.o: $(srcdir)/recanim.h
-zoom.o: $(srcdir)/screenhackI.h
-zoom.o: $(srcdir)/screenhack.h
-zoom.o: $(UTILS_SRC)/colors.h
-zoom.o: $(UTILS_SRC)/font-retry.h
-zoom.o: $(UTILS_SRC)/grabscreen.h
-zoom.o: $(UTILS_SRC)/hsv.h
-zoom.o: $(UTILS_SRC)/resources.h
-zoom.o: $(UTILS_SRC)/usleep.h
-zoom.o: $(UTILS_SRC)/visual.h
-zoom.o: $(UTILS_SRC)/xft.h
-zoom.o: $(UTILS_SRC)/yarandom.h
-
diff --git a/hacks/README b/hacks/README
deleted file mode 100644
index ffb2d17..0000000
--- a/hacks/README
+++ /dev/null
@@ -1,9 +0,0 @@
-
-This directory contains various graphics hacks. These are independent from
-the xscreensaver program (in the ../driver/ directory) but some of them use
-the utility functions found in the ../utils/ directory.
-
-If you have compilation problems, check the parameters in ../config.h.
-
-Writing a screen saver? Make sure you have read ../README.hacking.
-
diff --git a/hacks/abstractile.c b/hacks/abstractile.c
deleted file mode 100644
index 1b055c2..0000000
--- a/hacks/abstractile.c
+++ /dev/null
@@ -1,1614 +0,0 @@
-/*
- * Copyright (c) 2004-2009 Steve Sundstrom
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhack.h"
-#include "colors.h"
-#include "hsv.h"
-#include <stdio.h>
-#include <math.h>
-#include <sys/time.h>
-/*#include <sys/utsname.h>*/
-
-#define MODE_CREATE 0 /* init, create, then finish sleep */
-#define MODE_ERASE 1 /* erase, then reset colors */
-#define MODE_DRAW 2
-
-#define DIR_NONE 0
-#define DIR_UP 1
-#define DIR_DOWN 2
-#define DIR_LEFT 3
-#define DIR_RIGHT 4
-
-#define LINE_FORCE 1
-#define LINE_NEW 2
-#define LINE_BRIN 3
-#define LINE_BROUT 4
-
-#define PT_UL 0
-#define PT_MP 1
-#define PT_LR 2
-#define PT_NL 3
-
-#define D3D_NONE 0
-#define D3D_BLOCK 1
-#define D3D_NEON 2
-#define D3D_TILED 3
-
-#define TILE_RANDOM 0
-#define TILE_FLAT 1
-#define TILE_THIN 2
-#define TILE_OUTLINE 3
-#define TILE_BLOCK 4
-#define TILE_NEON 5
-#define TILE_TILED 6
-
-#define BASECOLORS 30
-#define SHADES 12
-#define MAXCOLORS 40
-#define LAYERS 4
-#define PATTERNS 40
-#define SHAPES 18
-#define DRAWORDERS 40
-#define COLORMAPS 20
-#define WAVES 6
-#define STRETCHES 8
-
-struct lineStruct {
- unsigned int x, y, len, obj, color, ndol;
- int deo;
- Bool hv;
-};
-
-struct gridStruct {
- unsigned int line, hl, hr, vu, vd, dhl, dhr, dvu, dvd;
-};
-
-/* basically the same as global variables, but used to keep them in a bucket
- and pass them around easier like the original C++ implementation */
-struct state {
- /* window values */
- Display *display;
- Window window;
- XWindowAttributes xgwa;
- GC fgc, bgc;
- XColor colors[255];
-
- /* memory values */
- struct lineStruct *dline, *eline;
- struct gridStruct *grid;
- unsigned int *zlist, *fdol;
- Bool *odi;
- /* draw, erase, fill, init, line, object, z indexes */
- unsigned int di, ei, fi, ii, bi, li, eli, oi, zi;
- /* size variables */
- int gridx, gridy; /* grid size */
- unsigned int gridn;
- int lwid, bwid, swid;/* line width, background width, shadow width */
- int narray, max_wxh;
- int elwid, elpu, egridx, egridy; /* for now */
- /* fill variables */
- int bnratio; /* ratio of branch lines to new lines */
- int maxlen; /* maximum length of line */
- int forcemax; /* make line be max possible length */
- int olen; /* open length set by findopen */
- int bln; /* blocking line number set by findopen, -1=edge */
- /* color variables */
- int ncolors; /* number of colors for screen */
- int shades;
- int rco[MAXCOLORS]; /* random ordering of colors for deo */
- int cmap;
- int layers;
- Bool newcols; /* can we create new colormaps with each screen */
- /* draw variables */
- int dmap, emap; /* pattern by which line draw order is determined */
- int dvar, evar; /* random number added to .deo to vary */
- int ddir, edir; /* draw/erase in forward direction or reverse */
- int lpu; /* lines drawn per update used to adjust speed */
- int d3d;
- int round;
- int outline;
- /* layered draw variables */
- int pattern[LAYERS], shape[LAYERS], mix[LAYERS];
- int csw[LAYERS], wsx[LAYERS], wsy[LAYERS], sec[LAYERS];
- int cs1[LAYERS], cs2[LAYERS], cs3[LAYERS]; int cs4[LAYERS];
- int wave[LAYERS], waveh[LAYERS], wavel[LAYERS];
- int rx1[LAYERS], rx2[LAYERS], rx3[LAYERS];
- int ry1[LAYERS], ry2[LAYERS], ry3[LAYERS];
- /* misc variables */
- int mode, sleep, speed, tile, dialog;
- Bool grid_full, resized;
- struct timeval time;
-};
-
-static int
-_min(int a, int b)
-{
- if (a<=b)
- return(a);
- return(b);
-}
-
-static int
-_max(int a, int b)
-{
- if (a>=b)
- return(a);
- return(b);
-}
-
-static int
-_dist(struct state *st, int x1, int x2, int y1, int y2, int s)
-{
- double xd=x1-x2;
- double yd=y1-y2;
- switch(s) {
- case 0:
- return((int)sqrt(xd*xd+yd*yd));
- case 1:
- return((int)sqrt(xd*xd*st->cs1[0]*2+yd*yd));
- case 2:
- return((int)sqrt(xd*xd+yd*yd*st->cs2[0]*2));
- default:
- return((int)sqrt(xd*xd*st->cs1[0]/st->cs2[0]+yd*yd*st->cs3[0]/st->cs4[0]));
- }
-}
-
-static int
-_wave(struct state *st, int x, int h, int l, int wave)
-{
- l+=1;
- switch(wave) {
- case 0: /* cos wave*/
- return((int)(cos((double)x*M_PI/l)*h));
- case 1: /* double wave*/
- case 2: /* double wave*/
- return((int)(cos((double)x*M_PI/l)*h)+(int)(sin((double)x*M_PI/l/st->cs1[1])*h));
- case 3: /* zig zag */
- return(abs((x%(l*2)-l))*h/l);
- case 4: /* giant zig zag */
- return(abs((x%(l*4)-l*2))*h*3/l);
- case 5: /* sawtooth */
- return((x%(l))*h/l);
- default: /* no wave */
- return(0);
- }
-}
-
-static int
-_triangle(struct state *st, int x, int y, int rx, int ry, int t)
-{
- switch(t) {
- case 1:
- return(_min(_min(x+y+rx-(st->gridx/2),st->gridx-x+y),(st->gridy-y+(ry/2))*3/2));
- case 2:
- return(_min(_min(x-rx,y-ry),(rx+ry-x-y)*2/3));
- case 3:
- return(_min(_min(st->gridx-x-rx,y-ry),(rx+ry-st->gridx+x-y)*2/3));
- case 4:
- return(_min(_min(x-rx,st->gridy-y-ry),(rx+ry-x-st->gridy+y)*2/3));
- }
- return(_min(_min(st->gridx-x-rx,st->gridy-y-ry),(rx+ry-st->gridx+x-st->gridy+y)*2/3));
-}
-
-static void
-_init_zlist(struct state *st)
-{
- unsigned int tmp, y, z;
-
- st->gridx=st->xgwa.width/st->lwid;
- st->gridy=st->xgwa.height/st->lwid;
- if ((st->gridx <= 0) || (st->gridy <= 0)) abort();
- st->gridn=st->gridx*st->gridy;
- /* clear grid */
- for (z=0; z<st->gridn; z++) {
- st->grid[z].line=st->grid[z].hl=st->grid[z].hr=st->grid[z].vu=st->grid[z].vd=st->grid[z].dhl=st->grid[z].dhr=st->grid[z].dvu=st->grid[z].dvd=0;
- st->zlist[z]=z;
- }
- /* rather than pull x,y points randomly and wait to hit final empy cells a
- list of all points is created and mixed so empty cells do get hit last */
- for (z=0; z<st->gridn; z++) {
- y=random()%st->gridn;
- tmp=st->zlist[y];
- st->zlist[y]=st->zlist[z];
- st->zlist[z]=tmp;
- }
-}
-
-static void
-make_color_ramp_rgb (Screen *screen, Visual *visual, Colormap cmap,
- int r1, int g1, int b1, int r2, int g2, int b2,
- XColor *colors, int *ncolorsP, Bool closed_p)
-{
- int h1, h2;
- double s1, s2, v1, v2;
- rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
- rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
- make_color_ramp(screen, visual, cmap, h1, s1, v1, h2, s2, v2,
- colors, ncolorsP, False, True, 0);
-}
-
-
-static void
-_init_colors(struct state *st)
-{
- int col[BASECOLORS];
- int c1, c2, c3, h1, h2, h3;
- int r1, g1, b1, r2, g2, b2, r3, g3, b3;
- double s1, s2, s3, v1, v2, v3;
- XColor tmp_col1[16], tmp_col2[16], tmp_col3[16];
-
- unsigned short basecol[BASECOLORS][3]={
- /* 0 dgray */ {0x3333,0x3333,0x3333},
- /* 1 dbrown */ {0x6666,0x3333,0x0000},
- /* 2 dred */ {0x9999,0x0000,0x0000},
- /* 3 orange */ {0xFFFF,0x6666,0x0000},
- /* 4 gold */ {0xFFFF,0xCCCC,0x0000},
- /* 5 olive */ {0x6666,0x6666,0x0000},
- /* 6 ivy */ {0x0000,0x6666,0x0000},
- /* 7 dgreen */ {0x0000,0x9999,0x0000},
- /* 8 bluegray */ {0x3333,0x6666,0x6666},
- /* 9 dblue */ {0x0000,0x0000,0x9999},
- /* 10 blue */ {0x3333,0x3333,0xFFFF},
- /* 11 dpurple */ {0x6666,0x0000,0xCCCC},
- /* 12 purple */ {0x6666,0x3333,0xFFFF},
- /* 13 violet */ {0x9999,0x3333,0x9999},
- /* 14 magenta */ {0xCCCC,0x3333,0xCCCC},
- /* lights */
- /* 15 gray */ {0x3333,0x3333,0x3333},
- /* 16 brown */ {0x9999,0x6666,0x3333},
- /* 17 tan */ {0xCCCC,0x9999,0x3333},
- /* 18 red */ {0xFFFF,0x0000,0x0000},
- /* 19 lorange */ {0xFFFF,0x9999,0x0000},
- /* 20 yellow */ {0xFFFF,0xFFFF,0x0000},
- /* 21 lolive */ {0x9999,0x9999,0x0000},
- /* 22 green */ {0x3333,0xCCCC,0x0000},
- /* 23 lgreen */ {0x3333,0xFFFF,0x3333},
- /* 24 cyan */ {0x0000,0xCCCC,0xCCCC},
- /* 25 sky */ {0x3333,0xFFFF,0xFFFF},
- /* 26 marine */ {0x3333,0x6666,0xFFFF},
- /* 27 lblue */ {0x3333,0xCCCC,0xFFFF},
- /* 28 lpurple */ {0x9999,0x9999,0xFFFF},
- /* 29 pink */ {0xFFFF,0x9999,0xFFFF}};
-
- if (st->d3d) {
- st->shades = (st->d3d==D3D_TILED) ? 5 : st->lwid/2+1;
- st->ncolors=4+random()%4;
- if (st->cmap>0) { /* tint the basecolors a bit */
- for (c1=0; c1<BASECOLORS; c1++)
- for (c2=0; c2<2; c2++)
- if (!basecol[c1][c2]) {
- basecol[c1][c2]+=random()%16000;
- } else if (basecol[c1][c2]==0xFFFF) {
- basecol[c1][c2]-=random()%16000;
- } else {
- basecol[c1][c2]-=8000;
- basecol[c1][c2]+=random()%16000;
- }
- }
- switch(st->cmap%4) {
- case 0: /* all */
- for (c1=0; c1<st->ncolors; c1++)
- col[c1]=random()%BASECOLORS;
- break;
- case 1: /* darks */
- for (c1=0; c1<st->ncolors; c1++)
- col[c1]=random()%15;
- break;
- case 2: /* semi consecutive darks */
- col[0]=random()%15;
- for (c1=1; c1<st->ncolors; c1++)
- col[c1]=(col[c1-1]+1+random()%2)%15;
- break;
- case 3: /* consecutive darks */
- col[0]=random()%(15-st->ncolors);
- for (c1=1; c1<st->ncolors; c1++)
- col[c1]=col[c1-1]+1;
- break;
- }
- for (c1=0; c1<st->ncolors; c1++) {
- /* adjust colors already set */
- for (h1=c1*st->shades-1; h1>=0; h1--)
- st->colors[h1+st->shades]=st->colors[h1];
- make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- basecol[col[c1]][0], basecol[col[c1]][1], basecol[col[c1]][2],
- 0xFFFF, 0xFFFF, 0xFFFF, st->colors, &st->shades,
- False);
- }
- return;
- }
- /* not 3d */
- st->shades=1;
- if (st->cmap%2) { /* basecolors */
- if (random()%3) {
- c1=random()%15;
- c2=(c1+3+(random()%5))%15;
- c3=(c2+3+(random()%5))%15;
- } else {
- c1=random()%BASECOLORS;
- c2=(c1+5+(random()%10))%BASECOLORS;
- c3=(c2+5+(random()%10))%BASECOLORS;
- }
- r1=basecol[c1][0];
- g1=basecol[c1][1];
- b1=basecol[c1][2];
- r2=basecol[c2][0];
- g2=basecol[c2][1];
- b2=basecol[c2][2];
- r3=basecol[c3][0];
- g3=basecol[c3][1];
- b3=basecol[c3][2];
- } else { /* random rgb's */
- r1=random()%65535;
- g1=random()%65535;
- b1=random()%65535;
- r2=(r1+16384+random()%32768)%65535;
- g2=(g1+16384+random()%32768)%65535;
- b2=(b1+16384+random()%32768)%65535;
- r3=(r2+16384+random()%32768)%65535;
- g3=(g2+16384+random()%32768)%65535;
- b3=(b2+16384+random()%32768)%65535;
- }
- switch(st->cmap) {
- case 0: /* make_color_ramp color->color */
- case 1:
- case 2: /* make_color_ramp color->white */
- case 3:
- st->ncolors=5+random()%5;
- if (st->cmap>1)
- r2=g2=b2=0xFFFF;
- make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- r1, g1, b1, r2, g2, b2,
- st->colors, &st->ncolors, random()%2);
- break;
- case 4: /* 3 color make_color_loop */
- case 5:
- case 6:
- case 7:
- st->ncolors=8+random()%12;
- rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
- rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
- rgb_to_hsv(r3, g3, b3, &h3, &s3, &v3);
-
- make_color_loop(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- h1, s1, v1, h2, s2, v2, h3, s3, v3,
- st->colors, &st->ncolors, True, False);
- break;
- case 8: /* random smooth */
- case 9:
- st->ncolors=(random()%4)*6+12;
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap, st->colors, &st->ncolors,
- True, False, True);
- break;
- case 10: /* rainbow */
- st->ncolors=(random()%4)*6+12;
- make_uniform_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap, st->colors, &st->ncolors,
- True, False, True);
- break;
- case 11: /* dark to light blend */
- case 12:
- case 13:
- case 14:
- st->ncolors=7;
- make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- r1, g1, b1, 0xFFFF, 0xFFFF, 0xFFFF,
- tmp_col1, &st->ncolors, False);
- make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- r2, g2, b2, 0xFFFF, 0xFFFF, 0xFFFF,
- tmp_col2, &st->ncolors, False);
- if (st->cmap<13) {
- for(c1=0; c1<=4; c1++) {
- st->colors[c1*2]=tmp_col1[c1];
- st->colors[c1*2+1]=tmp_col2[c1];
- }
- st->ncolors=10;
- } else {
- make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- r3, g3, b3, 0xFFFF, 0xFFFF, 0xFFFF,
- tmp_col3, &st->ncolors, False);
- for(c1=0; c1<=4; c1++) {
- st->colors[c1*3]=tmp_col1[c1];
- st->colors[c1*3+1]=tmp_col2[c1];
- st->colors[c1*3+2]=tmp_col3[c1];
- }
- st->ncolors=15;
- }
- break;
- default: /* random */
- st->ncolors=(random()%4)*6+12;
- make_random_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap, st->colors, &st->ncolors,
- False, True, False, True);
- break;
- }
-
- /* set random color order for drawing and erasing */
- for (c1=0; c1<MAXCOLORS; c1++)
- st->rco[c1]=c1;
- for (c1=0; c1<MAXCOLORS; c1++) {
- c3=random()%MAXCOLORS;
- c2=st->rco[c1];
- st->rco[c1]=st->rco[c3];
- st->rco[c3]=c2;
- }
-}
-
-static int _comparedeo(const void *i, const void *j)
-{
- struct lineStruct *h1, *h2;
-
- h1=(struct lineStruct *)i;
- h2=(struct lineStruct *)j;
- if (h1->deo > h2->deo)
- return(1);
- if (h1->deo < h2->deo)
- return(-1);
- return(0);
-}
-
-static int
-_hv(struct state *st, int x, int y, int d1, int d2, int pn, Bool de)
-{
- int v1, v2, r;
-
- switch (d1) {
- case 0:
- v1 = (de) ? st->egridx-x : st->gridx-x;
- break;
- case 1:
- v1 = y;
- break;
- case 2:
- v1 = x;
- break;
- default:
- v1 = (de) ? st->egridy-y : st->gridy-y;
- break;
- }
- switch (d2) {
- case 0:
- v2 = (de) ? st->egridx-x : st->gridx-x;
- break;
- case 1:
- v2 = y;
- break;
- case 2:
- v2 = x;
- break;
- default:
- v2 = (de) ? st->egridy-y : st->gridy-y;
- break;
- }
- r = (de) ? (st->dline[st->li].hv) ? (v1+10000)*pn : (v2+10000)*-pn :
- (st->eline[st->li].hv) ? (v1+10000)*pn : (v2+10000)*-pn;
- return(r);
-}
-
-static int
-_getdeo(struct state *st, int x, int y, int map, int de)
-{
- int cr;
- switch(map) {
- case 0: /* horizontal one side */
- return(x);
- case 1: /* vertical one side */
- return(y);
- case 2: /* horizontal two side */
- return(_min(x,st->gridx-x)+1);
- case 3: /* vertical two side */
- return(_min(y,st->gridy-y)+1);
- case 4: /* square */
- return(_max(abs(x-st->rx3[de]),abs(y-st->ry3[de]))+1);
- case 5: /* two squares */
- return(_min(_max(abs(x-(st->rx3[de]/2)),abs(y-st->ry3[de])),_max(abs(x-(st->gridx-(st->rx2[de]/2))),abs(y-st->ry2[de])))+1);
- case 6: /* horizontal rectangle */
- return(_max(abs(x-st->rx3[de]),abs(y-(st->ry3[de]))*st->cs1[de])+1);
- case 7: /* vertical rectangle */
- return(_max(abs(x-st->rx3[de])*st->cs1[de],abs(y-(st->ry3[de])))+1);
- case 8: /* + cross */
- return(_min(abs(x-st->rx3[de]),abs(y-(st->ry3[de])))+1);
- case 9: /* diagonal */
- return((x*3/4+y)+1);
- case 10: /* opposite diagonal */
- return((x*3/4+st->gridy-y)+1);
- case 11: /* diamond */
- return((abs(x-st->rx3[de])+abs(y-st->ry3[de]))/2+1);
- case 12: /* two diamonds */
- return(_min(abs(x-(st->rx3[de]/2))+abs(y-st->ry3[de]),abs(x-(st->gridx-(st->rx2[de]/2)))+abs(y-st->ry2[de]))/2+1);
- case 13: /* circle */
- return(_dist(st,x,st->rx3[de],y,st->ry3[de],0)+1);
- case 14: /* horizontal ellipse */
- return(_dist(st,x,st->rx3[de],y,st->ry3[de],1)+1);
- case 15: /* vertical ellipse */
- return(_dist(st,x,st->rx3[de],y,st->ry3[de],2)+1);
- case 16: /* two circles */
- return(_min(_dist(st,x,st->rx3[de]/2,y,st->ry3[de],0),_dist(st,x,st->gridx-(st->rx2[de]/2),y,st->ry2[de],0))+1);
- case 17: /* horizontal straight wave */
- return(x+_wave(st,st->gridy+y,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
- case 18: /* vertical straight wave */
- return(y+_wave(st,st->gridx+x,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
- case 19: /* horizontal wavey wave */
- return(x+_wave(st,st->gridy+y+((x/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
- case 20: /* vertical wavey wave */
- return(y+_wave(st,st->gridx+x+((y/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
-/* no d3d for 21,22 */
- case 21: /* simultaneous directional */
- return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,1,de));
- case 22: /* reverse directional */
- return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,-1,de));
- case 23: /* length */
- if (de)
- return(st->dline[st->li].len*1000+random()%5000);
- else
- return(st->eline[st->li].len*1000+random()%5000);
- case 24: /* object */
- case 25:
- case 26:
- case 27:
- if (de)
- return(st->dline[st->li].obj*100);
- else
- return(st->eline[st->li].obj*100);
- default: /* color */
- cr = (de) ? st->dline[st->li].color : st->eline[st->li].color;
- if (map<34) cr=st->rco[cr];
- if ((map%6<4) || (de)) { /* by color */
- cr*=1000;
- cr+=random()%1000;
- } else if (map%6==4) { /* by color horizontaly */
- cr*=st->gridx;
- cr+=(x+random()%(st->gridx/2));
- } else { /* by color vertically */
- cr*=st->gridy;
- cr+=(y+random()%(st->gridy/2));
- }
- return(cr);
- }
- return(1);
-}
-
-static void
-_init_screen(struct state *st)
-{
- int nstr, x;
- struct lineStruct *tmp;
-
- /* malloc memory in case of resize */
- if (st->resized) {
- st->max_wxh=st->xgwa.width*st->xgwa.height;
- if (st->dline!=NULL)
- free(st->dline);
- if (st->eline!=NULL)
- free(st->eline);
- if (st->grid!=NULL)
- free(st->grid);
- if (st->zlist!=NULL)
- free(st->zlist);
- if (st->fdol!=NULL)
- free(st->fdol);
- if (st->odi!=NULL)
- free(st->odi);
- st->narray = (st->xgwa.width+1)*(st->xgwa.height+1)/4+1;
- st->dline = calloc(st->narray, sizeof(struct lineStruct));
- st->eline = calloc(st->narray, sizeof(struct lineStruct));
- st->grid = calloc(st->narray, sizeof(struct gridStruct));
- st->zlist = calloc(st->narray, sizeof(unsigned int));
- st->fdol = calloc(st->narray, sizeof(unsigned int));
- st->odi = calloc(st->narray, sizeof(Bool));
- if ((st->dline == NULL) || (st->eline == NULL) ||
- (st->grid == NULL) || (st->zlist == NULL) ||
- (st->fdol == NULL) || (st->odi == NULL)) {
- fprintf(stderr, "not enough memory\n");
- exit(1);
- }
- st->dialog = (st->xgwa.width<500) ? 1 : 0;
- st->resized=False;
- }
- if (st->ii) {
- /* swap st->dline and st->eline pointers to resort and erase */
- tmp=st->eline;
- st->eline=st->dline;
- st->dline=tmp;
- st->eli=st->li;
- st->elwid=st->lwid;
- st->elpu=st->lpu;
- st->egridx=st->gridx;
- st->egridy=st->gridy;
-
- /* create new erase order */
- for (st->li=1; st->li<=st->eli; st->li++)
- st->eline[st->li].deo=(_getdeo(st,st->eline[st->li].x,st->eline[st->li].y,st->emap,0) + (random()%st->evar) + (random()%st->evar))*st->edir;
- qsort(st->eline, st->eli+1, sizeof(struct lineStruct), _comparedeo);
- }
- st->ii++;
-
- /* clear arrays and other counters */
- st->di=st->ei=st->fi=st->li=st->oi=st->zi=0;
- st->grid_full=False;
- /* li starts from 1 */
- st->dline[0].x=st->dline[0].y=st->dline[0].len=0;
- /* to keep it first after sorting so di is never null */
- st->dline[0].deo=-999999999;
-
- /* set random screen variables */
- st->lwid = (st->ii==1) ? 3 : 2+((random()%6)%4);
- st->d3d = ((st->tile==TILE_FLAT) || (st->tile==TILE_THIN) ||
- (st->tile==TILE_OUTLINE)) ? D3D_NONE :
- (st->tile==TILE_BLOCK) ? D3D_BLOCK :
- (st->tile==TILE_NEON) ? D3D_NEON :
- (st->tile==TILE_TILED) ? D3D_TILED :
- /* force TILE_D3D on first screen to properly load all shades */
- ((st->ii==1) && (!st->newcols)) ? D3D_TILED : (random()%5)%4;
-/* st->d3d=D3D_BLOCK; st->lwid=2; */
- st->outline = (st->tile==TILE_OUTLINE) ? 1 :
- ((st->tile!=TILE_RANDOM) || (random()%5)) ? 0 : 1;
- st->round = (st->d3d==D3D_NEON) ? 1 :
- ((st->d3d==D3D_BLOCK) || (st->outline) || (random()%6)) ? 0 : 1;
- if ((st->d3d) || (st->outline) || (st->round))
- st->lwid+=2;
- if ((!st->d3d) && (!st->round) && (!st->outline) && (st->lwid>3))
- st->lwid-=2;
- if (st->d3d==D3D_TILED)
- st->lwid++;
- if (st->tile==TILE_THIN)
- st->lwid=2;
-
- _init_zlist(st);
-
- st->maxlen=(st->lwid>6) ? 2+(random()%4) :
- (st->lwid>4) ? 2+(random()%8)%6 :
- (st->lwid>2) ? 2+(random()%12)%8 : 2+(random()%15)%10;
- st->bnratio = 4+(random()%4)+(random()%4);
- st->forcemax = (random()%6) ? 0 : 1;
-
- if ((st->ii==1) || (st->newcols))
- _init_colors(st);
-
- st->dmap = (st->emap+5+(random()%5))%DRAWORDERS;
-
- st->dmap=20+random()%20;
-
- st->dvar = (st->dmap>22) ? 100 : 10+(st->csw[0]*(random()%5));
- st->ddir= (random()%2) ? 1 : -1;
-
- st->emap = (st->dmap+10+(random()%10))%20;
- st->evar = (st->emap>22) ? 100 : 10+(st->csw[0]*(random()%5));
- st->edir= (random()%2) ? 1 : -1;
-
- st->layers= (random()%2) ? 2 : (random()%2) ? 1 : (random()%2) ? 3 : 4;
- st->cmap=(st->cmap+5+(random()%10))%COLORMAPS;
-
- for (x=0; x<LAYERS; x++) {
- st->pattern[x]=random()%PATTERNS;
- st->shape[x]=random()%SHAPES;
- st->mix[x]=random()%20;
- nstr = (st->lwid==2) ? 20+random()%12 :
- (st->lwid==3) ? 16+random()%8 :
- (st->lwid==4) ? 12+random()%6 :
- (st->lwid==5) ? 10+random()%5 :
- (st->lwid==6) ? 8+random()%4 :
- 5+random()%5;
- st->csw[x] = _max(5,st->gridy/nstr);
- st->wsx[x] = (st->wsx[x]+3+(random()%3))%STRETCHES;
- st->wsy[x] = (st->wsy[x]+3+(random()%3))%STRETCHES;
- st->sec[x] = random()%5;
- if ((!st->dialog) && (st->sec[x]<2)) st->csw[x]/=2;
- st->cs1[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
- st->cs2[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
- st->cs3[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
- st->cs4[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
- st->wave[x]=random()%WAVES;
- st->wavel[x]=st->csw[x]*(2+random()%6);
- st->waveh[x]=st->csw[x]*(1+random()%3);
- st->rx1[x]=(st->gridx/10+random()%(st->gridx*8/10));
- st->ry1[x]=(st->gridy/10+random()%(st->gridy*8/10));
- st->rx2[x]=(st->gridx*2/10+random()%(st->gridx*6/10));
- st->ry2[x]=(st->gridy*2/10+random()%(st->gridy*6/10));
- st->rx3[x]=(st->gridx*3/10+random()%(st->gridx*4/10));
- st->ry3[x]=(st->gridy*3/10+random()%(st->gridy*4/10));
- }
-}
-
-static int
-_shape(struct state *st, int x, int y, int rx, int ry, int n)
-{
- switch(st->shape[n]) {
- case 0: /* square/rectangle */
- case 1:
- case 2:
- return(1+_max(abs(x-rx)*st->cs1[n]/st->cs2[n],abs(y-ry)*st->cs3[n]/st->cs4[n]));
- case 3: /* diamond */
- case 4:
- return(1+(abs(x-rx)*st->cs1[n]/st->cs2[n]+abs(y-ry)*st->cs3[n]/st->cs4[n]));
- case 5: /* 8 point star */
- return(1+_min(_max(abs(x-rx),abs(y-ry))*3/2,abs(x-rx)+abs(y-ry)));
- case 6: /* circle/oval */
- case 7:
- case 8:
- return(1+_dist(st,x,rx,y,ry,st->cs1[n]));
- case 9: /* black hole circle */
- return(1+(st->gridx*st->gridy/(1+(_dist(st,x,rx,y,ry,st->cs2[n])))));
- case 10: /* sun */
- return(1+_min(abs(x-rx)*st->gridx/(abs(y-ry)+1),abs(y-ry)*st->gridx/(abs(x-rx)+1)));
- case 11: /* 2 circles+inverted circle */
- return(1+(_dist(st,x,rx,y,ry,st->cs1[n])*_dist(st,x,(rx*3)%st->gridx,y,(ry*5)%st->gridy,st->cs1[n])/(1+_dist(st,x,(rx*4)%st->gridx,y,(ry*7)%st->gridy,st->cs1[n]))));
- case 12: /* star */
- return(1+(int)sqrt(abs((x-rx)*(y-ry))));
- case 13: /* centered ellipse */
- return(1+_dist(st,x,rx,y,ry,0)+_dist(st,x,st->gridx-rx,y,st->gridy-ry,0));
- default: /* triangle */
- return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
- }
- return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
-}
-
-static int
-_pattern(struct state *st, int x, int y, int n)
-{
- int v=0, ox;
- ox=x;
- switch(st->wsx[n]) {
- case 0: /* slants */
- x+=y/(1+st->cs4[n]);
- break;
- case 1:
- x+=(st->gridy-y)/(1+st->cs4[n]);
- break;
- case 2: /* curves */
- x+=_wave(st,y,st->gridx/(1+st->cs1[n]),st->gridy,0);
- break;
- case 3:
- x+=_wave(st,st->gridy-y,st->gridy/(1+st->cs1[n]),st->gridy,0);
- break;
- case 4: /* U curves */
- x+=_wave(st,y,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
- break;
- case 5:
- x-=_wave(st,y,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
- break;
- }
- switch(st->wsy[0]) {
- case 0: /* slants */
- y+=ox/(1+st->cs1[n]);
- break;
- case 1:
- y+=(st->gridx-ox)/(1+st->cs1[n]);
- break;
- case 2: /* curves */
- y+=_wave(st,ox,st->gridx/(1+st->cs1[n]),st->gridx,0);
- break;
- case 3:
- y+=_wave(st,st->gridx-ox,st->gridx/(1+st->cs1[n]),st->gridx,0);
- break;
- case 4: /* U curves */
- y+=_wave(st,ox,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
- break;
- case 5:
- y-=_wave(st,ox,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
- break;
- }
- switch(st->pattern[n]) {
- case 0: /* horizontal stripes */
- v=y;
- break;
- case 1: /* vertical stripes */
- v=x;
- break;
- case 2: /* diagonal stripes */
- v=(x+(y*st->cs1[n]/st->cs2[n]));
- break;
- case 3: /* reverse diagonal stripes */
- v=(x-(y*st->cs1[n]/st->cs2[n]));
- break;
- case 4: /* checkerboard */
- v=(y/st->csw[n]*3+x/st->csw[n])*st->csw[n];
- break;
- case 5: /* diagonal checkerboard */
- v=((x+y)/2/st->csw[n]+(x+st->gridy-y)/2/st->csw[n]*3)*st->csw[n];
- break;
- case 6: /* + cross */
- v=st->gridx+(_min(abs(x-st->rx3[n]),abs(y-st->ry3[n]))*2);
- break;
- case 7: /* double + cross */
- v=_min(_min(abs(x-st->rx2[n]),abs(y-st->ry2[n])),_min(abs(x-st->rx1[n]),abs(y-st->ry1[n])))*2;
- break;
- case 8: /* X cross */
- v=st->gridx+(_min(abs(x-st->rx3[n])*st->cs1[n]/st->cs2[n]+abs(y-st->ry2[n])*st->cs3[n]/st->cs4[n],abs(x-st->rx3[n])*st->cs1[n]/st->cs2[n]-abs(y-st->ry3[n])*st->cs3[n]/st->cs4[n])*2);
- break;
- case 9: /* double X cross */
- v=_min(_min(abs(x-st->rx2[n])+abs(y-st->ry2[n]),abs(x-st->rx2[n])-abs(y-st->ry2[n])),_min(abs(x-st->rx1[n])+abs(y-st->ry1[n]),abs(x-st->rx1[n])-abs(y-st->ry1[n])))*2;
- break;
- case 10: /* horizontal stripes/waves */
- v=st->gridy+(y+_wave(st,x,st->waveh[n],st->wavel[n],st->wave[n]));
- break;
- case 11: /* vertical stripes/waves */
- v=st->gridx+(x+_wave(st,y,st->waveh[n],st->wavel[n],st->wave[n]));
- break;
- case 12: /* diagonal stripes/waves */
- v=st->gridx+(x+(y*st->cs1[n]/st->cs2[n])+_wave(st,x,st->waveh[n],st->wavel[n],st->wave[n]));
- break;
- case 13: /* diagonal stripes/waves */
- v=st->gridx+(x-(y*st->cs1[n]/st->cs2[n])+_wave(st,y,st->waveh[n],st->wavel[n],st->wave[n]));
- break;
- case 14: /* horizontal spikey waves */
- v=y+(st->csw[n]*st->cs4[n]/st->cs3[n])+_wave(st,x+((y/st->cs3[n])*st->edir),st->csw[n]/2*st->cs1[n]/st->cs2[n],st->csw[n]/2*st->cs2[n]/st->cs1[n],st->wave[n]);
- break;
- case 15: /* vertical spikey waves */
- v=x+(st->csw[n]*st->cs1[n]/st->cs2[n])+_wave(st,y+((x/st->cs3[n])*st->edir),st->csw[n]/2*st->cs1[n]/st->cs2[n],st->csw[n]/2*st->cs3[n]/st->cs4[n],st->wave[n]);
- break;
- case 16: /* big slanted hwaves */
- v=st->gridy-y-(x*st->cs1[n]/st->cs3[n])+(st->csw[n]*st->cs1[n]*st->cs2[n]) +_wave(st,x,st->csw[n]/3*st->cs1[n]*st->cs2[n],st->csw[n]/3*st->cs3[n]*st->cs2[n],st->wave[n]);
- break;
- case 17: /* big slanted vwaves */
- v=x-(y*st->cs1[n]/st->cs3[n])+(st->csw[n]*st->cs1[n]*st->cs2[n]) +_wave(st,y, st->csw[n]/3*st->cs1[n]*st->cs2[n], st->csw[n]/3*st->cs3[n]*st->cs2[n], st->wave[n]);
- break;
- case 18: /* double hwave */
- v=y+(y+st->csw[n]*st->cs3[n])+_wave(st,x,st->csw[n]/3*st->cs3[n],st->csw[n]/3*st->cs2[n],st->wave[n])+_wave(st,x,st->csw[n]/3*st->cs4[n],st->csw[n]/3*st->cs1[n]*3/2,st->wave[n]);
- break;
- case 19: /* double vwave */
- v=x+(x+st->csw[n]*st->cs1[n])+_wave(st,y,st->csw[n]/3*st->cs1[n],st->csw[n]/3*st->cs3[n],st->wave[n])+_wave(st,y,st->csw[n]/3*st->cs2[n],st->csw[n]/3*st->cs4[n]*3/2,st->wave[n]);
- break;
- case 20: /* one shape */
- case 21:
- case 22:
- v=_shape(st,x, y, st->rx3[n], st->ry3[n], n);
- break;
- case 23: /* two shapes */
- case 24:
- case 25:
- v=_min(_shape(st,x, y, st->rx1[n], st->ry1[n], n),_shape(st,x, y, st->rx2[n], st->ry2[n], n));
- break;
- case 26: /* two shapes opposites */
- case 27:
- v=_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->rx2[n], n));
- break;
- case 28: /* two shape checkerboard */
- case 29:
- v=((_shape(st,x, y, st->rx1[n], st->ry1[n], n)/st->csw[n])+(_shape(st,x, y, st->rx2[n], st->ry2[n], n)/st->csw[n]))*st->csw[n];
- break;
- case 30: /* two shape blob */
- case 31:
- v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,x, y, st->rx2[n], st->ry2[n], n))/2;
- break;
- case 32: /* inverted two shape blob */
- case 33:
- v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,st->gridx-x, st->gridy-y, st->rx1[n], st->ry1[n], n))/2;
- break;
- case 34: /* three shapes */
- case 35:
- v=_min(_shape(st,x, y, st->rx3[n], st->ry3[n], n),_min(_shape(st,x, y, st->rx1[n], st->ry1[n], n),_shape(st,x, y, st->rx2[n], st->ry2[n], n)));
- break;
- case 36: /* three shape blob */
- case 37:
- v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,x, y, st->rx2[n], st->ry2[n], n)+_shape(st,x, y, st->rx3[n], st->ry3[n], n))/3;
- break;
- case 38: /* 4 shapes */
- v=(_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->ry2[n], n)),_min(_shape(st,x, y, st->gridx-st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->rx2[n], st->gridy-st->ry2[n], n)));
- break;
- case 39: /* four rainbows */
- v=(_min(_shape(st,x, y, st->gridx-st->rx2[n]/2, st->csw[n], n),_shape(st,x, y, st->csw[n], st->ry2[n]/2, n)),_min(_shape(st,x, y, st->rx2[n]/2, st->gridy-st->csw[n], n),_shape(st,x, y, st->gridx-st->csw[n], st->gridy-(st->ry2[n]/2), n)));
- break;
- }
- /* stretch or contract stripe */
- switch(st->sec[n]) {
- case 0:
- v=(int)sqrt((int)sqrt(abs(v)*st->gridx)*st->gridx);
- break;
- case 1:
- v=((int)pow(v,2)/st->gridx);
- break;
- }
- return (abs(v));
-}
-
-static int
-_getcolor(struct state *st, int x, int y)
-{
- int n, cv[LAYERS];
-
- cv[0] = 0;
- for (n=0; n<st->layers; n++) {
- cv[n]=_pattern(st,x,y,n);
- /* first wave/shape */
- cv[0] = (!n) ? cv[0]/st->csw[0] :
- /* checkerboard+1 */
- (st->mix[n]<5) ? (cv[0]*st->csw[0]+cv[n])/st->csw[n] :
- /* checkerboard+ncol/2 */
- (st->mix[n]<12) ? cv[0]+(cv[n]/st->csw[n]*st->ncolors/2) :
- /* add mix */
- (st->mix[n]<16) ? cv[0]+(cv[n]/st->csw[n]) :
- /* subtract mix */
- (st->mix[n]<18) ? cv[0]-(cv[n]/st->csw[n]) :
- /* r to l morph mix */
- (st->mix[n]==18) ? ((cv[0]*x)+(cv[n]*(st->gridx-x)/st->csw[n]))/st->gridx :
- /* u to d morph mix */
- ((cv[0]*y)+(cv[n]*(st->gridy-y)/st->csw[n]))/st->gridy;
- }
- return(cv[0]);
-}
-
-/* return value=line direction
- st->olen=open space to edge or next blocking line
- st->bln=blocking line number or -1 if edge blocks */
-static int
-_findopen(struct state *st, int x, int y, int z)
-{
- int dir, od[4], no=0;
-
- if (((st->grid[z].hl) || (st->grid[z].hr)) &&
- ((st->grid[z].vu) || (st->grid[z].vd)))
- return(DIR_NONE);
- if ((z>st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
- (!st->grid[z-st->gridx].line)) {
- od[no]=DIR_UP;
- no++;
- }
- if ((z<st->gridn-st->gridx) && (!st->grid[z].hl) &&
- (!st->grid[z].hr) && (!st->grid[z+st->gridx].line)) {
- od[no]=DIR_DOWN;
- no++;
- }
- if ((x) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
- (!st->grid[z-1].line)) {
- od[no]=DIR_LEFT;
- no++;
- }
- if (((z+1)%st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
- (!st->grid[z+1].line)) {
- od[no]=DIR_RIGHT;
- no++;
- }
- if (!no)
- return(DIR_NONE);
- dir=od[random()%no];
- st->olen=st->bln=0;
- while ((st->olen<=st->maxlen) && (!st->bln)) {
- st->olen++;
- if (dir==DIR_UP)
- st->bln = (y-st->olen<0) ? -1 :
- st->grid[z-(st->olen*st->gridx)].line;
- if (dir==DIR_DOWN)
- st->bln = (y+st->olen>=st->gridy) ? -1 :
- st->grid[z+(st->olen*st->gridx)].line;
- if (dir==DIR_LEFT)
- st->bln = (x-st->olen<0) ? -1 :
- st->grid[z-st->olen].line;
- if (dir==DIR_RIGHT)
- st->bln = (x+st->olen>=st->gridx) ? -1 :
- st->grid[z+st->olen].line;
- }
- st->olen--;
- return(dir);
-}
-
-static void
-_fillgrid(struct state *st)
-{
- unsigned int gridc, n, add;
-
- gridc=st->gridx*st->dline[st->li].y+st->dline[st->li].x;
- add = (st->dline[st->li].hv) ? 1 : st->gridx;
- for (n=0; n<=st->dline[st->li].len; n++) {
- if (n)
- gridc+=add;
- if (!st->grid[gridc].line) {
- st->fi++;
- st->grid[gridc].line=st->li;
- }
- if (st->dline[st->li].hv) {
- if (n)
- st->grid[gridc].hr=st->li;
- if (n<st->dline[st->li].len)
- st->grid[gridc].hl=st->li;
- } else {
- if (n)
- st->grid[gridc].vd=st->li;
- if (n<st->dline[st->li].len)
- st->grid[gridc].vu=st->li;
- }
- if (st->fi>=st->gridn) {
- st->grid_full=True;
- return;
- }
- }
-}
-
-static void
-_newline(struct state *st)
-{
- int bl, bz, dir, lt, x, y, z;
-
- bl=0;
- z=st->zlist[st->zi];
- x=z%st->gridx;
- y=z/st->gridx;
- st->zi++;
- dir=_findopen(st,x,y,z);
-
- if (!st->grid[z].line) {
- /* this is an empty space, make a new line unless nothing is open around it */
- if (dir==DIR_NONE) {
- /* nothing is open, force a len 1 branch in any direction */
- lt=LINE_FORCE;
- while ((dir==DIR_NONE) ||
- ((dir==DIR_UP) && (!y)) ||
- ((dir==DIR_DOWN) && (y+1==st->gridy)) ||
- ((dir==DIR_LEFT) && (!x)) ||
- ((dir==DIR_RIGHT) && (x+1==st->gridx))) {
- dir=random()%4;
- }
- bz = (dir==DIR_UP) ? z-st->gridx : (dir==DIR_DOWN) ? z+st->gridx : (dir==DIR_LEFT) ? z-1 : z+1;
- bl = st->grid[bz].line;
- } else if ((st->bnratio>1) && (st->bln>0) &&
- (st->olen<st->maxlen) && (random()%st->bnratio)) {
- /* branch into blocking line */
- lt=LINE_BRIN;
- bl = st->bln;
- } else {
- /* make a new line and new object */
- lt=LINE_NEW;
- st->oi++;
- }
- } else {
- /* this is a filled space, make a branch unless nothing is open around it */
- if (dir==DIR_NONE)
- return;
- /* make a branch out of this line */
- lt=LINE_BROUT;
- bl=st->grid[z].line;
- }
- st->li++;
- st->dline[st->li].len = (lt==LINE_FORCE) ? 1 : (lt==LINE_BRIN) ?
- st->olen+1 : (!st->forcemax) ? st->olen : 1+random()%st->olen;
- st->dline[st->li].x=x;
- if (dir==DIR_LEFT)
- st->dline[st->li].x-=st->dline[st->li].len;
- st->dline[st->li].y=y;
- if (dir==DIR_UP)
- st->dline[st->li].y-=st->dline[st->li].len;
- st->dline[st->li].hv = ((dir==DIR_LEFT) || (dir==DIR_RIGHT)) ?
- True : False;
- st->dline[st->li].obj = (lt==LINE_NEW) ? st->oi :
- st->dline[bl].obj;
- if (lt==LINE_NEW) {
- int color = (_getcolor(st,x,y))%st->ncolors;
- if (color < 0) color += st->ncolors;
- st->dline[st->li].color = color;
- } else {
- st->dline[st->li].color = st->dline[bl].color;
- }
- st->dline[st->li].deo=(_getdeo(st,x,y,st->dmap,1) +
- (random()%st->dvar) + (random()%st->dvar))*st->ddir;
- st->dline[st->li].ndol=0;
- _fillgrid(st);
-}
-
-static void
-_create_screen(struct state *st)
-{
- while(!st->grid_full)
- _newline(st);
- qsort(st->dline, st->li+1, sizeof(struct lineStruct), _comparedeo);
-/*st->lpu=st->li/20/((6-st->speed)*3);
- Used to use a computed lpu, lines per update to control draw speed
- draw 1/lpu of the lines before each XSync which takes a split second
- the higher the lpu, the quicker the screen draws. This worked somewhat
- after the 4->5 update, however with the Mac updating so much more slowly,
- values tuned for it draw the screen in a blink on Linux. Therefore we
- draw 1/200th of the screen with each update and sleep, if necessary */
- st->lpu = (st->dialog) ? st->li/50 : st->li/200;
- if (!st->lpu) st->lpu = 1;
- st->bi=1;
- st->mode=MODE_ERASE;
-}
-
-static void
-_fill_outline(struct state *st, int di)
-{
- int x, y, h, w;
-
- if (!di)
- return;
- x=st->dline[di].x*st->lwid+1;
- y=st->dline[di].y*st->lwid+1;
- if (st->dline[di].hv) {
- w=(st->dline[di].len+1)*st->lwid-3;
- h=st->lwid-3;
- } else {
- w=st->lwid-3;
- h=(st->dline[di].len+1)*st->lwid-3;
- }
- XFillRectangle (st->display, st->window, st->bgc, x, y, w, h);
-}
-
-static void
-_XFillRectangle(struct state *st, int di, int adj)
-{
- int a, b, x, y, w, h;
-
- x=st->dline[di].x*st->lwid;
- y=st->dline[di].y*st->lwid;
- if (st->dline[di].hv) {
- w=(st->dline[di].len+1)*st->lwid-1;
- h=st->lwid-1;
- } else {
- w=st->lwid-1;
- h=(st->dline[di].len+1)*st->lwid-1;
- }
- switch (st->d3d) {
- case D3D_NEON:
- x+=adj;
- y+=adj;
- w-=adj*2;
- h-=adj*2;
- break;
- case D3D_BLOCK:
- x+=adj;
- y+=adj;
- w-=st->lwid/2-1;
- h-=st->lwid/2-1;
- break;
- }
- if (!st->round) {
- XFillRectangle(st->display, st->window, st->fgc, x, y, w, h);
- } else {
- if (h<st->lwid) { /* horizontal */
- a=(h-1)/2;
- for (b=0; b<=a; b++)
- XFillRectangle(st->display, st->window, st->fgc,
- x+b, y+a-b, w-b*2, h-((a-b)*2));
- } else { /* vertical */
- a=(w-1)/2;
- for (b=0; b<=a; b++)
- XFillRectangle(st->display, st->window, st->fgc,
- x+a-b, y+b, w-((a-b)*2), h-b*2);
- }
- }
-}
-
-static void
-_XFillTriangle(struct state *st, int color, int x1, int y1, int x2, int y2,
- int x3, int y3)
-{
- XPoint points[3];
-
- points[0].x=x1;
- points[0].y=y1;
- points[1].x=x2;
- points[1].y=y2;
- points[2].x=x3;
- points[2].y=y3;
- XSetForeground(st->display, st->fgc, st->colors[color].pixel);
- XFillPolygon (st->display, st->window, st->fgc, points, 3, Convex,
- CoordModeOrigin);
-}
-
-static void
-_XFillPolygon4(struct state *st, int color, int x1, int y1, int x2, int y2,
- int x3, int y3, int x4, int y4)
-{
- XPoint points[4];
-
- points[0].x=x1;
- points[0].y=y1;
- points[1].x=x2;
- points[1].y=y2;
- points[2].x=x3;
- points[2].y=y3;
- points[3].x=x4;
- points[3].y=y4;
- XSetForeground(st->display, st->fgc, st->colors[color].pixel);
- XFillPolygon (st->display, st->window, st->fgc, points, 4, Convex,
- CoordModeOrigin);
-}
-
-static void
-_draw_tiled(struct state *st, int color)
-{
- int a, c, d, x, y, z, m1, m2, lr, nl, w, h;
- a = (st->dline[st->di].hv) ? 1 : st->gridx;
- z = st->dline[st->di].y*st->gridx+st->dline[st->di].x;
- m1 = (st->lwid-1)/2;
- m2 = st->lwid/2;
- lr = st->lwid-1;
- nl = st->lwid;
-
- /* draw tiles one grid cell at a time */
- for (c=0; c<=st->dline[st->di].len; c++) {
- if (st->dline[st->di].hv) {
- x = (st->dline[st->di].x+c)*st->lwid;
- y = st->dline[st->di].y*st->lwid;
- if (c)
- st->grid[z].dhr=st->di;
- if (c<st->dline[st->di].len)
- st->grid[z].dhl=st->di;
- } else {
- x = st->dline[st->di].x*st->lwid;
- y = (st->dline[st->di].y+c)*st->lwid;
- if (c)
- st->grid[z].dvd=st->di;
- if (c<st->dline[st->di].len)
- st->grid[z].dvu=st->di;
- }
- d=0;
- if (st->grid[z].dhl)
- d+=8;
- if (st->grid[z].dhr)
- d+=4;
- if (st->grid[z].dvu)
- d+=2;
- if (st->grid[z].dvd)
- d++;
- /* draw line base */
- switch (d) {
- case 1:
- case 2: /* vertical */
- case 3:
- case 5:
- case 6:
- case 7:
- case 11:
- case 15:
- h = ((d==1) || (d==5)) ? lr : nl;
- XSetForeground(st->display, st->fgc,
- st->colors[color].pixel);
- XFillRectangle (st->display, st->window, st->fgc,
- x, y, m2, h);
- XSetForeground(st->display, st->fgc,
- st->colors[color+3].pixel);
- XFillRectangle (st->display, st->window, st->fgc,
- x+m2, y, m1, h);
- break;
- case 4:
- case 8: /* horizontal */
- case 9:
- case 10:
- case 12:
- case 13:
- case 14:
- w = (d==4) ? lr : nl;
- XSetForeground(st->display, st->fgc,
- st->colors[color+1].pixel);
- XFillRectangle (st->display, st->window, st->fgc,
- x, y, w, m2);
- XSetForeground(st->display, st->fgc,
- st->colors[color+2].pixel);
- XFillRectangle (st->display, st->window, st->fgc,
- x, y+m2, w, m1);
- break;
- }
- /* draw angles */
- switch(d) {
- case 1: /* bottom end ^ */
- _XFillTriangle(st,color+2, x, y+lr, x+lr, y+lr, x+m2, y+m2);
- break;
- case 2: /* top end \/ */
- _XFillTriangle(st,color+1, x, y, x+lr, y, x+m2, y+m2);
- break;
- case 4: /* right end < */
- _XFillTriangle(st,color+3, x+lr, y, x+lr, y+lr, x+m2, y+m2);
- break;
- case 5: /* LR corner */
- _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
- _XFillPolygon4(st,color+2, x, y+m2, x+m2, y+m2, x+lr, y+lr, x, y+lr);
- break;
- case 6: /* UR corner */
- _XFillPolygon4(st,color+1, x, y+m2, x+m2, y+m2, x+lr, y, x, y);
- _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
- break;
- case 7: /* T > into line */
- _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
- _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
- break;
- case 8: /* left end > */
- _XFillTriangle(st,color, x, y, x, y+lr, x+m2, y+m2);
- break;
- case 9: /* LL corner */
- _XFillPolygon4(st,color, x+m2, y, x+m2, y+m2, x, y+lr, x, y);
- _XFillTriangle(st,color+3, x+m2, y, x+m2, y+m2, x+lr, y);
- break;
- case 10: /* UL corner */
- _XFillPolygon4(st,color, x+m2, y+nl, x+m2, y+m2, x, y, x, y+nl);
- _XFillPolygon4(st,color+3, x+m2, y+nl, x+m2, y+m2, x+lr, y+lr, x+lr, y+nl);
- break;
- case 11: /* T < into line */
- _XFillPolygon4(st,color+1, x+nl, y+m2, x+m2, y+m2, x+lr, y, x+nl, y);
- _XFillPolygon4(st,color+2, x+nl, y+m2, x+m2, y+m2, x+lr, y+lr, x+nl, y+lr);
- break;
- case 13: /* T \/ into line */
- _XFillTriangle(st,color, x+m2, y, x+m2, y+m2, x, y);
- _XFillTriangle(st,color+3, x+m2, y, x+m2, y+m2, x+lr, y);
- break;
- case 14: /* T ^ into line */
- _XFillPolygon4(st,color, x+m2, y+nl, x+m2, y+m2, x, y+lr, x, y+nl);
- _XFillPolygon4(st,color+3, x+m2, y+nl, x+m2, y+m2, x+lr, y+lr, x+lr, y+nl);
- break;
- case 15: /* X intersection */
- _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
- _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
- _XFillPolygon4(st,color+1, x+nl, y+m2, x+m2, y+m2, x+lr, y, x+nl, y);
- _XFillPolygon4(st,color+2, x+nl, y+m2, x+m2, y+m2, x+lr, y+lr, x+nl, y+lr);
- break;
- }
- z+=a;
- }
-}
-
-static long
-_mselapsed(struct state *st)
-{
- struct timeval t;
- gettimeofday(&t, NULL);
- t.tv_sec -= st->time.tv_sec;
- t.tv_usec -= st->time.tv_usec;
- return ((long)t.tv_sec*1000000+t.tv_usec);
-}
-
-static void
-_draw_lines(struct state *st)
-{
- int n, z, a, color, sh, di;
- if (st->bi==1)
- for (a=0; a<=st->oi; a++)
- st->fdol[a]=0;
-
- for (st->di=st->bi; st->di<_min(st->li+1,st->bi+st->lpu); st->di++) {
- color=(st->dline[st->di].color%st->ncolors)*st->shades;
- XSetForeground(st->display, st->fgc, st->colors[color].pixel);
-
- switch (st->d3d) {
- case D3D_NEON:
- st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
- st->fdol[st->dline[st->di].obj]=st->di;
- for (sh=0; sh<st->lwid/2; sh++) {
- XSetForeground(st->display, st->fgc,
- st->colors[color+sh].pixel);
- di=st->di;
- while(di>0) {
- _XFillRectangle(st,di,sh);
- di=st->dline[di].ndol;
- }
- }
- break;
- case D3D_BLOCK:
- st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
- st->fdol[st->dline[st->di].obj]=st->di;
- for (sh=0; sh<st->lwid/2; sh++) {
- XSetForeground(st->display, st->fgc,
- st->colors[color+(st->lwid/2)-sh-1].pixel);
- di=st->di;
- while(di>0) {
- _XFillRectangle(st,di,sh);
- di=st->dline[di].ndol;
- }
- }
- break;
- case D3D_TILED:
- _draw_tiled(st,color);
- break;
- default: /* D3D_NONE */
- _XFillRectangle(st,st->di,0);
- if (st->outline) {
- _fill_outline(st, st->di);
- z=st->dline[st->di].y*st->gridx+st->dline[st->di].x;
- a = (st->dline[st->di].hv) ? 1 : st->gridx;
- for (n=0; n<=st->dline[st->di].len; n++) {
- _fill_outline(st, st->grid[z].dhl);
- _fill_outline(st, st->grid[z].dhr);
- _fill_outline(st, st->grid[z].dvu);
- _fill_outline(st, st->grid[z].dvd);
- if (st->dline[st->di].hv) {
- if (n)
- st->grid[z].dhr=st->di;
- if (n<st->dline[st->di].len)
- st->grid[z].dhl=st->di;
- } else {
- if (n)
- st->grid[z].dvd=st->di;
- if (n<st->dline[st->di].len)
- st->grid[z].dvu=st->di;
- }
- z+=a;
- }
- }
- break;
- }
- }
- if (st->di>st->li) {
- st->bi=1;
- st->mode=MODE_CREATE;
- } else {
- st->bi+=st->lpu;
- }
-}
-
-static void
-_erase_lines(struct state *st)
-{
- if (!st->ii)
- return;
- for (st->di=st->bi; st->di<_min(st->eli+1,st->bi+st->elpu); st->di++) {
- if (st->eline[st->di].hv) {
- XFillRectangle (st->display, st->window, st->bgc,
- st->eline[st->di].x*st->elwid,
- st->eline[st->di].y*st->elwid,
- (st->eline[st->di].len+1)*st->elwid, st->elwid);
- } else {
- XFillRectangle (st->display, st->window, st->bgc,
- st->eline[st->di].x*st->elwid,
- st->eline[st->di].y*st->elwid,
- st->elwid, (st->eline[st->di].len+1)*st->elwid);
- }
- if (st->di==st->eli) /* clear just in case */
- XFillRectangle(st->display, st->window, st->bgc, 0, 0,
- st->xgwa.width, st->xgwa.height);
- }
- if (st->di>st->eli) {
- st->bi=1;
- if (st->resized) {
- st->mode=MODE_CREATE;
- } else {
- st->mode=MODE_DRAW;
- }
- } else {
- st->bi+=st->elpu;
- }
-}
-
-static void *
-abstractile_init(Display *display, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
-/* struct utsname os;*/
-
- char *tile = get_string_resource(display, "tile", "Tile");
- if (tile && !strcmp(tile, "random")) st->tile = TILE_RANDOM;
- else if (tile && !strcmp(tile, "flat")) st->tile = TILE_FLAT;
- else if (tile && !strcmp(tile, "thin")) st->tile = TILE_THIN;
- else if (tile && !strcmp(tile, "outline")) st->tile = TILE_OUTLINE;
- else if (tile && !strcmp(tile, "block")) st->tile = TILE_BLOCK;
- else if (tile && !strcmp(tile, "neon")) st->tile = TILE_NEON;
- else if (tile && !strcmp(tile, "tiled")) st->tile = TILE_TILED;
- else {
- if (tile && *tile && !!strcmp(tile, "random"))
- fprintf(stderr, "%s: unknown tile option %s\n", progname, tile);
- st->tile = TILE_RANDOM;
- }
- if (tile) free (tile);
-
- st->speed = get_integer_resource(display, "speed", "Integer");
- if (st->speed < 0) st->speed = 0;
- if (st->speed > 5) st->speed = 5;
- st->sleep = get_integer_resource(display, "sleep", "Integer");
- if (st->sleep < 0) st->sleep = 0;
- if (st->sleep > 60) st->sleep = 60;
-
- st->display=display;
- st->window=window;
-
- /* get screen size and create Graphics Contexts */
- XGetWindowAttributes (display, window, &st->xgwa);
- gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
- "foreground", "Foreground");
- st->fgc = XCreateGC (display, window, GCForeground, &gcv);
- gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
- "background", "Background");
- st->bgc = XCreateGC (display, window, GCForeground, &gcv);
-
-/* Um, no. This is obscene. -jwz.
- uname(&os);
- st->newcols=((!strcmp(os.sysname,"Linux")) || (!strcmp(os.sysname,"Darwin")))
- ? True : False;
-*/
- st->newcols=False;
-
- st->mode=MODE_CREATE;
- st->ii=0;
- st->resized=True;
- return st;
-}
-
-static unsigned long
-abstractile_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int mse, usleep;
-
- gettimeofday(&st->time, NULL);
-
- /* If the window is too small, do nothing, sorry! */
- if (st->xgwa.width > 20 && st->xgwa.height > 20) {
- switch (st->mode) {
- case MODE_CREATE:
- _init_screen(st);
- _create_screen(st);
- break;
- case MODE_ERASE:
- _erase_lines(st);
- break;
- case MODE_DRAW:
- _draw_lines(st);
- break;
- }
- }
- mse=_mselapsed(st);
- usleep = ((!st->ii) && (st->mode==MODE_CREATE)) ? 0 :
- (st->mode==MODE_CREATE) ? st->sleep*1000000-mse :
- /* speed=0-5, goal is 10,8,6,4,2,0 sec normal and 5,4,3,2,1,0 dialog */
- (5-st->speed)*(2-st->dialog)*100000/st->lpu-mse;
- if (usleep>=0)
- return usleep;
- return 0;
-}
-
-static void
-abstractile_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->xgwa.width = w;
- st->xgwa.height = h;
- if (w*h>st->max_wxh)
- st->resized=True;
-}
-
-static Bool
-abstractile_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->mode=MODE_CREATE;
- return True;
- }
-
- return False;
-}
-
-static void
-abstractile_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- if (st->dline) free(st->dline);
- if (st->eline) free(st->eline);
- if (st->grid) free(st->grid);
- if (st->zlist) free(st->zlist);
- if (st->fdol) free(st->fdol);
- if (st->odi) free(st->odi);
- XFreeGC (dpy, st->fgc);
- XFreeGC (dpy, st->bgc);
- free (st);
-}
-
-static const char *abstractile_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*sleep: 3",
- "*speed: 3",
- "*tile: random",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec abstractile_options [] = {
- { "-sleep", ".sleep", XrmoptionSepArg, 0 },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-tile", ".tile", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("Abstractile", abstractile)
diff --git a/hacks/abstractile.man b/hacks/abstractile.man
deleted file mode 100644
index bbb096c..0000000
--- a/hacks/abstractile.man
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-abstractile \- draw abstract mosaic patterns of interlocking tiles
-.SH SYNOPSIS
-.B abstractile
-[\-sleep \fIseconds\fP] [\-speed \fIint\fP] [\-tile \fItile_mode\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIabstractile\fP program draws chaotic grids of randomly colored
-and shaped interlocking tiles.
-.SH OPTIONS
-.I abstractile
-accepts the following options:
-.TP 8
-.B \-sleep \fIseconds\fP
-Specify the number of seconds to sleep between screens (0-60).
-.TP 8
-.B \-speed \fIint\fP
-A value between 0 and 5 used to specify the speed at which each screen is drawn.
-.TP 8
-.B \-tile \fItile_mode\fP
-The type of tile that is drawn on each screen. Legal values are
-\fIrandom\fP, \fIflat\fP, \fIthin\fP, \fIoutline\fP,
-\fIblock\fP, \fIneon\fP, and \fItiled\fP
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2004 by Steve Sundstrom. Based on
-examples from the hacks directory of xscreensaver,
-Copyright (c) 1997, 1998, 2002 Jamie Zawinski
-<jwz@jwz.org>
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-Steve Sundstrom
diff --git a/hacks/analogtv-cli.c b/hacks/analogtv-cli.c
deleted file mode 100644
index 2c4a880..0000000
--- a/hacks/analogtv-cli.c
+++ /dev/null
@@ -1,1126 +0,0 @@
-/* xanalogtv-cli, Copyright (c) 2018-2020 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Performs the "Analog TV" transform on an image file, converting it to
- * an MP4. The MP4 file will have the same dimensions as the input image.
- * Requires 'ffmpeg' on $PATH.
- *
- * --duration Length in seconds of MP4.
- * --powerup Do the power-on animation at the beginning.
- * --logo FILE Small image overlayed onto the colorbars image.
- * --audio FILE Add a soundtrack.
- *
- * Created: 10-Dec-2018 by jwz.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <signal.h>
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xos.h>
-
-#include "screenhackI.h"
-#include "resources.h"
-#include "visual.h"
-#include "yarandom.h"
-#include "font-retry.h"
-#include "ximage-loader.h"
-#include "thread_util.h"
-#include "xshm.h"
-#include "analogtv.h"
-
-#ifdef HAVE_LIBPNG
-# include <png.h>
-#endif
-
-const char *progname;
-const char *progclass;
-int mono_p = 0;
-static Bool verbose_p = 0;
-
-#define MAX_MULTICHAN 2
-static int N_CHANNELS=12;
-static int MAX_STATIONS=6;
-
-typedef struct chansetting_s {
- analogtv_reception recs[MAX_MULTICHAN];
- double noise_level;
-} chansetting;
-
-struct state {
- XImage *output_frame;
- int frames_written;
- char *framefile_fmt;
-
- Display *dpy;
- Window window;
- analogtv *tv;
- analogtv_font ugly_font;
-
- int n_stations;
- analogtv_input **stations;
- Bool image_loading_p;
- XImage *logo, *logo_mask;
-
- int curinputi;
- chansetting *chansettings;
- chansetting *cs;
-};
-
-static struct state global_state;
-
-
-/* Since this program does not connect to an X server, or in fact link
- with Xlib, we need stubs for the few X11 routines that analogtv.c calls.
- Most are unused. It seems like I am forever implementing subsets of X11.
- */
-
-Status
-XAllocColor (Display *dpy, Colormap cmap, XColor *c)
-{
- abort();
-}
-
-int
-XClearArea (Display *dpy, Window win, int x, int y,
- unsigned int w, unsigned int h, Bool exp)
-{
- return 0;
-}
-
-int
-XClearWindow (Display *dpy, Window window)
-{
- return 0;
-}
-
-GC
-XCreateGC(Display *dpy, Drawable d, unsigned long mask, XGCValues *gcv)
-{
- return 0;
-}
-
-int screen_number (Screen *screen) { return 0; }
-
-
-XImage *
-XCreateImage (Display *dpy, Visual *v, unsigned int depth,
- int format, int offset, char *data,
- unsigned int width, unsigned int height,
- int bitmap_pad, int bytes_per_line)
-{
- XImage *ximage = (XImage *) calloc (1, sizeof(*ximage));
- unsigned long r, g, b;
-
- if (depth == 0) depth = 32;
-
- ximage->width = width;
- ximage->height = height;
- ximage->format = format;
- ximage->data = data;
- ximage->bitmap_unit = 8;
- ximage->byte_order = LSBFirst;
- ximage->bitmap_bit_order = ximage->byte_order;
- ximage->bitmap_pad = bitmap_pad;
- ximage->depth = depth;
- visual_rgb_masks (0, v, &r, &g, &b);
- ximage->red_mask = (depth == 1 ? 0 : r);
- ximage->green_mask = (depth == 1 ? 0 : g);
- ximage->blue_mask = (depth == 1 ? 0 : b);
- ximage->bits_per_pixel = (depth == 1 ? 1 : visual_pixmap_depth (0, v));
- ximage->bytes_per_line = bytes_per_line;
-
- XInitImage (ximage);
- if (! ximage->f.put_pixel) abort();
- return ximage;
-}
-
-Pixmap
-XCreatePixmap (Display *dpy, Drawable d, unsigned int width,
- unsigned int height, unsigned int depth)
-{
- abort();
-}
-
-Pixmap
-XCreatePixmapFromBitmapData (Display *dpy, Drawable d, char *data,
- unsigned int w, unsigned int h,
- unsigned long fg, unsigned long bg,
- unsigned int depth)
-{
- abort();
-}
-
-int
-XDrawString (Display *dpy, Drawable d, GC gc, int x, int y, const char *s,
- int len)
-{
- abort();
-}
-
-int
-XFillRectangle (Display *dpy, Drawable d, GC gc, int x, int y,
- unsigned int width, unsigned int height)
-{
- abort();
-}
-
-int
-XFreeColors (Display *dpy, Colormap cmap, unsigned long *px, int n,
- unsigned long planes)
-{
- abort();
-}
-
-int
-XFreeGC (Display *dpy, GC gc)
-{
- abort();
-}
-
-int
-XFreePixmap (Display *dpy, Pixmap p)
-{
- abort();
-}
-
-XImage *
-XGetImage (Display *dpy, Drawable d, int x, int y,
- unsigned int w, unsigned int h,
- unsigned long pm, int fmt)
-{
- abort();
-}
-
-Status
-XGetWindowAttributes (Display *dpy, Window w, XWindowAttributes *xgwa)
-{
- struct state *st = &global_state;
- memset (xgwa, 0, sizeof(*xgwa));
- xgwa->width = st->output_frame->width;
- xgwa->height = st->output_frame->height;
- return True;
-}
-
-int
-XPutImage (Display *dpy, Drawable d, GC gc, XImage *image,
- int src_x, int src_y, int dest_x, int dest_y,
- unsigned int w, unsigned int h)
-{
- struct state *st = &global_state;
- XImage *out = st->output_frame;
- int x, y;
- for (y = 0; y < h; y++) {
- int iy = src_y + y;
- int oy = dest_y + y;
- if (iy >= 0 &&
- oy >= 0 &&
- iy < image->height &&
- oy < out->height)
- for (x = 0; x < w; x++) {
- int ix = src_x + x;
- int ox = dest_x + x;
- if (ix >= 0 &&
- ox >= 0 &&
- ix < image->width &&
- ox < out->width) {
- XPutPixel (out, ox, oy, XGetPixel (image, ix, iy));
- }
- }
- }
- return 0;
-}
-
-int
-XQueryColor (Display *dpy, Colormap cmap, XColor *color)
-{
- uint16_t r = (color->pixel & 0x00FF0000L) >> 16;
- uint16_t g = (color->pixel & 0x0000FF00L) >> 8;
- uint16_t b = (color->pixel & 0x000000FFL);
- color->red = r | (r<<8);
- color->green = g | (g<<8);
- color->blue = b | (b<<8);
- color->flags = DoRed|DoGreen|DoBlue;
- return 0;
-}
-
-int
-XQueryColors (Display *dpy, Colormap cmap, XColor *c, int n)
-{
- int i;
- for (i = 0; i < n; i++)
- XQueryColor (dpy, cmap, &c[i]);
- return 0;
-}
-
-int
-XSetForeground (Display *dpy, GC gc, unsigned long fg)
-{
- abort();
-}
-
-int
-XSetWindowBackground (Display *dpy, Window win, unsigned long bg)
-{
- return 0;
-}
-
-XImage *
-create_xshm_image (Display *dpy, Visual *visual,
- unsigned int depth,
- int format, XShmSegmentInfo *shm_info,
- unsigned int width, unsigned int height)
-{
-# undef BitmapPad
-# define BitmapPad(dpy) 8
- XImage *image = XCreateImage (dpy, visual, depth, format, 0, NULL,
- width, height, BitmapPad(dpy), 0);
- int error = thread_malloc ((void **)&image->data, dpy,
- image->height * image->bytes_per_line);
- if (error) {
- XDestroyImage (image);
- image = NULL;
- } else {
- memset (image->data, 0, image->height * image->bytes_per_line);
- }
-
- return image;
-}
-
-void
-destroy_xshm_image (Display *dpy, XImage *image, XShmSegmentInfo *shm_info)
-{
- thread_free (image->data);
- image->data = NULL;
- XDestroyImage (image);
-}
-
-Bool
-get_boolean_resource (Display *dpy, char *name, char *class)
-{
- if (!strcmp(name, "useThreads")) return True;
- abort();
-}
-
-static int darkp = 0;
-double
-get_float_resource (Display *dpy, char *name, char *class)
-{
- if (!strcmp(name, "TVTint")) return 5; /* default 5 */
- if (!strcmp(name, "TVColor")) return 70; /* default 70 */
- if (!strcmp(name, "TVBrightness"))
- return (darkp ? -15 : 2); /* default 2 */
- if (!strcmp(name, "TVContrast")) return 150; /* default 150 */
- abort();
-}
-
-int
-get_integer_resource (Display *dpy, char *name, char *class)
-{
- if (!strcmp(name, "use_cmap")) return 0;
- abort();
-}
-
-unsigned int
-get_pixel_resource (Display *dpy, Colormap cmap, char *name, char *class)
-{
- if (!strcmp(name, "background")) return 0;
- abort();
-}
-
-XFontStruct *
-load_font_retry (Display *dpy, const char *xlfd)
-{
- abort();
-}
-
-Bool
-put_xshm_image (Display *dpy, Drawable d, GC gc, XImage *image,
- int src_x, int src_y, int dest_x, int dest_y,
- unsigned int width, unsigned int height,
- XShmSegmentInfo *shm_info)
-{
- return XPutImage (dpy, d, gc, image, src_x, src_y, dest_x, dest_y,
- width, height);
-}
-
-int
-visual_class (Screen *s, Visual *v)
-{
- return TrueColor;
-}
-
-int
-visual_pixmap_depth (Screen *s, Visual *v)
-{
- return 32;
-}
-
-void
-visual_rgb_masks (Screen *screen, Visual *visual,
- unsigned long *red_mask,
- unsigned long *green_mask,
- unsigned long *blue_mask)
-{
- *red_mask = 0x00FF0000L;
- *green_mask = 0x0000FF00L;
- *blue_mask = 0x000000FFL;
-}
-
-
-static void
-update_smpte_colorbars(analogtv_input *input)
-{
- struct state *st = (struct state *) input->client_data;
- int col;
- int black_ntsc[4];
-
- /*
- SMPTE is the society of motion picture and television engineers, and
- these are the standard color bars in the US. Following the partial spec
- at http://broadcastengineering.com/ar/broadcasting_inside_color_bars/
- These are luma, chroma, and phase numbers for each of the 7 bars.
- */
- double top_cb_table[7][3]={
- {75, 0, 0.0}, /* gray */
- {69, 31, 167.0}, /* yellow */
- {56, 44, 283.5}, /* cyan */
- {48, 41, 240.5}, /* green */
- {36, 41, 60.5}, /* magenta */
- {28, 44, 103.5}, /* red */
- {15, 31, 347.0} /* blue */
- };
- double mid_cb_table[7][3]={
- {15, 31, 347.0}, /* blue */
- {7, 0, 0}, /* black */
- {36, 41, 60.5}, /* magenta */
- {7, 0, 0}, /* black */
- {56, 44, 283.5}, /* cyan */
- {7, 0, 0}, /* black */
- {75, 0, 0.0} /* gray */
- };
-
- analogtv_lcp_to_ntsc(0.0, 0.0, 0.0, black_ntsc);
-
- analogtv_setup_sync(input, 1, 0);
-
- for (col=0; col<7; col++) {
- analogtv_draw_solid_rel_lcp(input, col*(1.0/7.0), (col+1)*(1.0/7.0), 0.00, 0.68,
- top_cb_table[col][0],
- top_cb_table[col][1], top_cb_table[col][2]);
-
- analogtv_draw_solid_rel_lcp(input, col*(1.0/7.0), (col+1)*(1.0/7.0), 0.68, 0.75,
- mid_cb_table[col][0],
- mid_cb_table[col][1], mid_cb_table[col][2]);
- }
-
- analogtv_draw_solid_rel_lcp(input, 0.0, 1.0/6.0,
- 0.75, 1.00, 7, 40, 303); /* -I */
- analogtv_draw_solid_rel_lcp(input, 1.0/6.0, 2.0/6.0,
- 0.75, 1.00, 100, 0, 0); /* white */
- analogtv_draw_solid_rel_lcp(input, 2.0/6.0, 3.0/6.0,
- 0.75, 1.00, 7, 40, 33); /* +Q */
- analogtv_draw_solid_rel_lcp(input, 3.0/6.0, 4.0/6.0,
- 0.75, 1.00, 7, 0, 0); /* black */
- analogtv_draw_solid_rel_lcp(input, 12.0/18.0, 13.0/18.0,
- 0.75, 1.00, 3, 0, 0); /* black -4 */
- analogtv_draw_solid_rel_lcp(input, 13.0/18.0, 14.0/18.0,
- 0.75, 1.00, 7, 0, 0); /* black */
- analogtv_draw_solid_rel_lcp(input, 14.0/18.0, 15.0/18.0,
- 0.75, 1.00, 11, 0, 0); /* black +4 */
- analogtv_draw_solid_rel_lcp(input, 5.0/6.0, 6.0/6.0,
- 0.75, 1.00, 7, 0, 0); /* black */
- if (st->logo)
- {
- double aspect = (double)
- st->output_frame->width / st->output_frame->height;
- int w2 = st->tv->xgwa.width * 0.35;
- int h2 = st->tv->xgwa.height * 0.35 * aspect;
- analogtv_load_ximage (st->tv, input, st->logo, st->logo_mask,
- (st->tv->xgwa.width - w2) / 2,
- st->tv->xgwa.height * 0.20,
- w2, h2);
- }
-
- input->next_update_time += 1.0;
-}
-
-
-
-static void
-analogtv_save_frame (struct state *st, const char *outfile,
- unsigned long frame)
-{
- char *pngfile = malloc (strlen (st->framefile_fmt) + 40);
- FILE *f;
-
- sprintf (pngfile, st->framefile_fmt, (int) frame);
- f = fopen (pngfile, "wb");
- if (! f) {
- fprintf (stderr, "%s: unable to write %s\n", progname, pngfile);
- exit (1);
- }
-
-# ifdef HAVE_LIBPNG
- {
- png_structp png_ptr;
- png_infop info_ptr;
- png_bytep row;
- XImage *img = st->output_frame;
- int x, y;
-
- png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
- if (!png_ptr) abort();
- info_ptr = png_create_info_struct (png_ptr);
- if (!info_ptr) abort();
- if (setjmp (png_jmpbuf (png_ptr))) abort();
-
- png_init_io (png_ptr, f);
-
- png_set_IHDR (png_ptr, info_ptr, img->width, img->height, 8,
- PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
- png_write_info (png_ptr, info_ptr);
-
- row = (png_bytep) malloc (3 * img->width * sizeof(png_byte));
- if (!row) abort();
- for (y = 0 ; y < img->height ; y++) {
- for (x = 0 ; x < img->width ; x++) {
- unsigned long p = XGetPixel (img, x, y);
- row[x*3+0] = (p & 0x000000FFL);
- row[x*3+1] = (p & 0x0000FF00L) >> 8;
- row[x*3+2] = (p & 0x00FF0000L) >> 16;
- }
- png_write_row (png_ptr, row);
- }
-
- png_write_end (png_ptr, 0);
-
- png_free_data (png_ptr, info_ptr, PNG_FREE_ALL, -1);
- png_destroy_write_struct (&png_ptr, 0);
- free (row);
- }
-#else /* ! HAVE_LIBPNG */
-# error libpng required
-# endif /* ! HAVE_LIBPNG */
-
- fclose (f);
- if (verbose_p > 1)
- fprintf (stderr, "%s: wrote %s\n", progname, pngfile);
- free (pngfile);
-}
-
-
-static void
-delete_tmp_files(void)
-{
- struct state *st = &global_state;
- char outfile[2048];
- int i;
- for (i = 0; i <= st->frames_written; i++)
- {
- sprintf (outfile, st->framefile_fmt, i);
- if (verbose_p > 2)
- fprintf (stderr, "%s: rm %s\n", progname, outfile);
- unlink (outfile);
- }
-}
-
-
-static RETSIGTYPE
-analogtv_signal (int sig)
-{
- signal (sig, SIG_DFL);
- delete_tmp_files();
- kill (getpid (), sig);
-}
-
-
-static char *
-quote (const char *s)
-{
- char *s2, *o;
- if (!s) return 0;
-
- s2 = malloc (strlen(s) * 2 + 2);
- o = s2;
- while (*s)
- {
- if (*s == '"' || *s == '\\')
- *o++ = '\\';
- *o++ = *s++;
- }
- *o = 0;
- return s2;
-}
-
-
-static void
-analogtv_write_mp4 (struct state *st, const char *outfile,
- const char *audiofile,
- unsigned long frames)
-{
- char cmd[1024];
- struct stat ss;
- char *qout = quote (outfile);
- char *qaudio = quote (audiofile);
-
- sprintf (cmd,
- "ffmpeg"
- " -hide_banner"
- " -loglevel error"
- " -framerate 30" /* rate of input: must be before -i */
- " -thread_queue_size 4096"
- " -i \"%s\""
- " -r 30", /* rate of output: must be after -i */
- st->framefile_fmt);
- if (audiofile)
- sprintf (cmd + strlen(cmd),
- " -i \"%s\""
- " -map 0:v:0"
- " -map 1:a:0"
- " -acodec aac"
- " -b:a 96k"
- /* Truncate or pad audio to length of video */
- " -filter_complex '[1:0] apad' -shortest",
- qaudio);
- sprintf (cmd + strlen(cmd),
- " -c:v libx264"
- " -profile:v high"
- " -pix_fmt yuv420p"
- " -preset veryfast"
- " -crf 24" /* 18 is very high; 24 is good enough */
- " '%s'"
- " </dev/null",
- qout);
-
- if (verbose_p > 1)
- fprintf (stderr, "%s: exec: %s\n", progname, cmd);
- unlink (outfile);
- system (cmd);
-
- delete_tmp_files();
-
- if (stat (outfile, &ss))
- {
- fprintf (stderr, "%s: %s was not created\n", progname, outfile);
- exit (1);
- }
-
- if (verbose_p)
- fprintf (stderr, "%s: wrote %s (%dx%d, %lu sec, %.0f MB)\n",
- progname, outfile,
- st->output_frame->width, st->output_frame->height,
- frames/30,
- (float) ss.st_size / (1024*1024));
-}
-
-
-static void
-flip_ximage (XImage *ximage)
-{
- char *data2, *in, *out;
- int y;
-
- if (!ximage) return;
- data2 = malloc (ximage->bytes_per_line * ximage->height);
- if (!data2) abort();
- in = ximage->data;
- out = data2 + ximage->bytes_per_line * (ximage->height - 1);
- for (y = 0; y < ximage->height; y++)
- {
- memcpy (out, in, ximage->bytes_per_line);
- in += ximage->bytes_per_line;
- out -= ximage->bytes_per_line;
- }
- free (ximage->data);
- ximage->data = data2;
-}
-
-
-static void
-analogtv_convert (const char **infiles, const char *outfile,
- const char *audiofile, const char *logofile,
- int duration, Bool powerp)
-{
- unsigned long start_time = time((time_t *)0);
- struct state *st = &global_state;
- Display *dpy = 0;
- Window window = 0;
- int i, n;
- unsigned long curticks = 0;
- time_t lastlog = time((time_t *)0);
- int frames_left = 0;
- int channel_changes = 0;
- int fps = 30;
- XImage **ximages;
- int singlep;
- int *stats;
-
- stats = (int *) calloc(N_CHANNELS, sizeof(*stats));
- ximages = calloc (MAX_STATIONS, sizeof(*ximages));
- i = 0;
- while (infiles[i])
- {
- ximages[i] = file_to_ximage (0, 0, infiles[i]);
- if (verbose_p > 1)
- fprintf (stderr, "%s: loaded %s %dx%d\n",
- progname, infiles[i], ximages[i]->width, ximages[i]->height);
- flip_ximage (ximages[i]);
- i++;
- }
-
- singlep = !infiles[1];
-
- if (singlep) powerp = 0; /* #### These don't work together but should */
-
- memset (st, 0, sizeof(*st));
- st->dpy = dpy;
- st->window = window;
-
- st->output_frame = XCreateImage (dpy, 0, ximages[0]->depth,
- ximages[0]->format, 0,
- NULL,
- ximages[0]->width & ~1, /* can't be odd */
- ximages[0]->height & ~1,
- ximages[0]->bitmap_pad, 0);
- st->output_frame->data = (char *)
- calloc (st->output_frame->height, st->output_frame->bytes_per_line);
-
- {
- char *s0, *slash, *dot;
- st->framefile_fmt = calloc (1, strlen(outfile) + 100);
-
- s0 = st->framefile_fmt;
- strcpy (st->framefile_fmt, outfile);
-
- slash = strrchr (st->framefile_fmt, '/');
- dot = strrchr (st->framefile_fmt, '.');
- if (dot && dot > slash) *dot = 0;
-
- /* Make tmp files be dotfiles */
- if (slash) {
- memmove (slash+1, slash, strlen(slash)+1);
- slash[1] = '.';
- } else {
- memmove (s0+1, s0, strlen(s0)+1);
- s0[0] = '.';
- }
-
- /* Can't have percents in the tmp file names */
- for (s0 = (slash ? slash : s0); *s0; s0++) {
- if (*s0 == '%') *s0 = '_';
- }
-
- sprintf (st->framefile_fmt + strlen(st->framefile_fmt),
- ".%08x.%%06d.png", (random() % 0xFFFFFFFF));
- }
-
- if (logofile) {
- int x, y;
- st->logo = file_to_ximage (0, 0, logofile);
- if (verbose_p)
- fprintf (stderr, "%s: loaded %s %dx%d\n",
- progname, logofile, st->logo->width, st->logo->height);
- flip_ximage (st->logo);
- /* Pull the alpha out of the logo and make a separate mask ximage. */
- st->logo_mask = XCreateImage (dpy, 0, st->logo->depth, st->logo->format, 0,
- NULL, st->logo->width, st->logo->height,
- st->logo->bitmap_pad, 0);
- st->logo_mask->data = (char *)
- calloc (st->logo_mask->height, st->logo_mask->bytes_per_line);
-
- for (y = 0; y < st->logo->height; y++)
- for (x = 0; x < st->logo->width; x++) {
- unsigned long p = XGetPixel (st->logo, x, y);
- uint8_t a = (p & 0xFF000000L) >> 24;
- XPutPixel (st->logo, x, y, (p & 0x00FFFFFFL));
- XPutPixel (st->logo_mask, x, y, (a ? 0x00FFFFFFL : 0));
- }
- }
-
-
- if (audiofile) {
- struct stat ss;
- if (stat (audiofile, &ss))
- {
- fprintf (stderr, "%s: %s does not exist\n", progname, audiofile);
- exit (1);
- }
- }
-
- /* Catch signals to delete tmp files before we start writing them. */
-
- signal (SIGHUP, analogtv_signal);
- signal (SIGINT, analogtv_signal);
- signal (SIGQUIT, analogtv_signal);
- signal (SIGILL, analogtv_signal);
- signal (SIGTRAP, analogtv_signal);
-# ifdef SIGIOT
- signal (SIGIOT, analogtv_signal);
-# endif
- signal (SIGABRT, analogtv_signal);
-# ifdef SIGEMT
- signal (SIGEMT, analogtv_signal);
-# endif
- signal (SIGFPE, analogtv_signal);
- signal (SIGBUS, analogtv_signal);
- signal (SIGSEGV, analogtv_signal);
-# ifdef SIGSYS
- signal (SIGSYS, analogtv_signal);
-# endif
- signal (SIGTERM, analogtv_signal);
-# ifdef SIGXCPU
- signal (SIGXCPU, analogtv_signal);
-# endif
-# ifdef SIGXFSZ
- signal (SIGXFSZ, analogtv_signal);
-# endif
-# ifdef SIGDANGER
- signal (SIGDANGER, analogtv_signal);
-# endif
-
- st->tv=analogtv_allocate(dpy, window);
-
- st->stations = (analogtv_input **)
- calloc (MAX_STATIONS, sizeof(*st->stations));
- while (st->n_stations < MAX_STATIONS) {
- analogtv_input *input=analogtv_input_allocate();
- st->stations[st->n_stations++]=input;
- input->client_data = st;
- }
-
- analogtv_set_defaults(st->tv, "");
- st->tv->need_clear=1;
-
- if (random()%4==0) {
- st->tv->tint_control += pow(frand(2.0)-1.0, 7) * 180.0;
- }
- if (1) {
- st->tv->color_control += frand(0.3) * RANDSIGN();
- }
- if (darkp) {
- if (random()%4==0) {
- st->tv->brightness_control += frand(0.15);
- }
- if (random()%4==0) {
- st->tv->contrast_control += frand(0.2) * RANDSIGN();
- }
- }
-
- st->chansettings = calloc (N_CHANNELS, sizeof (*st->chansettings));
- for (i=0; i<N_CHANNELS; i++) {
- st->chansettings[i].noise_level = 0.06;
- {
- int last_station=42;
- int stati;
- for (stati=0; stati<MAX_MULTICHAN; stati++) {
- analogtv_reception *rec=&st->chansettings[i].recs[stati];
- int station;
- while (1) {
- station=random()%st->n_stations;
- if (station!=last_station) break;
- if ((random()%10)==0) break;
- }
- last_station=station;
- rec->input = st->stations[station];
- rec->level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
- rec->ofs=random()%ANALOGTV_SIGNAL_LEN;
- if (random()%3) {
- rec->multipath = frand(1.0);
- } else {
- rec->multipath=0.0;
- }
- if (stati) {
- /* We only set a frequency error for ghosting stations,
- because it doesn't matter otherwise */
- rec->freqerr = (frand(2.0)-1.0) * 3.0;
- }
-
- if (rec->level > 0.3) break;
- if (random()%4) break;
- }
- }
- }
-
- st->curinputi=0;
- st->cs = &st->chansettings[st->curinputi];
-
- if (singlep)
- /* First channel (initial unadulterated image) stays for this long */
- frames_left = fps * (2 + frand(1.5));
-
- st->tv->powerup=0.0;
-
- /* load_station_images() */
-
- n = 0;
- for (i = 0; i < MAX_STATIONS; i++) {
- analogtv_input *input = st->stations[i];
-
- if (i == 1) { /* station 0 is the unadulterated image.
- station 1 is colorbars. */
- input->updater = update_smpte_colorbars;
- } else {
- XImage *ximage = ximages[n++];
- if (!ximage) {
- n = 0;
- ximage = ximages[n++];
- }
-
- {
- int w = ximage->width * 0.815; /* underscan */
- int h = ximage->height * 0.970;
- int x = (ximage->width - w) / 2;
- int y = (ximage->height - h) / 2;
- analogtv_input *input = st->stations[i];
- analogtv_setup_sync(input, 1, (random()%20)==0);
- analogtv_load_ximage (st->tv, input, ximage, 0, x, y, w, h);
- }
- }
- }
-
-
- /* xanalogtv_draw() */
-
- while (1) {
- const analogtv_reception *recs[MAX_MULTICHAN];
- unsigned rec_count = 0;
- double curtime=curticks*0.001;
-
- frames_left--;
- if (frames_left <= 0) {
-
- channel_changes++;
-
- if (singlep && channel_changes == 1) {
- /* Second channel has short duration, 0.25 to 0.75 sec. */
- frames_left = fps * (0.25 + frand(0.5));
- } else if (singlep) {
- /* 0.5 - 2.0 sec (was 0.5 - 3.0 sec) */
- frames_left = fps * (0.5 + frand(1.5));
- } else {
- /* 1 - 7 sec */
- frames_left = fps * (1 + frand(6));
- }
-
- if (singlep && channel_changes == 2) {
- /* Always use the unadulterated image for the third channel:
- So the effect is, plain, brief blip, plain, then random. */
- st->curinputi = 0;
- frames_left += fps * (0.1 + frand(0.5));
-
- } else if (singlep && st->curinputi != 0 && ((random() % 100) < 75)) {
- /* Use the unadulterated image 75% of the time (was 33%) */
- st->curinputi = 0;
- } else {
- /* Otherwise random */
- st->curinputi = 1 + (random() % (N_CHANNELS - 1));
- }
-
- stats[st->curinputi]++;
- st->cs = &st->chansettings[st->curinputi];
- /* Set channel change noise flag */
- st->tv->channel_change_cycles=200000;
-
- if (verbose_p > 1)
- fprintf (stderr, "%s: %.1f: channel %d\n",
- progname, curticks/1000.0, st->curinputi);
-
- /* Turn the knobs every now and then */
- if (! (random() % 5)) {
- if (random()%4==0) {
- st->tv->tint_control += pow(frand(2.0)-1.0, 7) * 180.0 * RANDSIGN();
- }
- if (1) {
- st->tv->color_control += frand(0.3) * RANDSIGN();
- }
- if (darkp) {
- if (random()%4==0) {
- st->tv->brightness_control += frand(0.15);
- }
- if (random()%4==0) {
- st->tv->contrast_control += frand(0.2) * RANDSIGN();
- }
- }
- }
- }
-
- for (i=0; i<MAX_MULTICHAN; i++) {
- analogtv_reception *rec = &st->cs->recs[i];
- analogtv_input *inp=rec->input;
- if (!inp) continue;
-
- if (inp->updater) {
- inp->next_update_time = curtime;
- (inp->updater)(inp);
- }
- rec->ofs += rec->freqerr;
- }
-
- st->tv->powerup=(powerp ? curtime : 9999);
-
- if (st->curinputi == 0 && singlep) {
- XPutImage (dpy, 0, 0, ximages[0], 0, 0, 0, 0,
- ximages[0]->width, ximages[0]->height);
- } else {
- for (i=0; i<MAX_MULTICHAN; i++) {
- analogtv_reception *rec = &st->cs->recs[i];
- if (rec->input) {
- analogtv_reception_update(rec);
- recs[rec_count] = rec;
- ++rec_count;
- }
- }
- analogtv_draw (st->tv, st->cs->noise_level, recs, rec_count);
- }
-
- analogtv_save_frame (st, outfile, st->frames_written);
-
- if (curtime >= duration) break;
-
- curticks += 1000/fps;
- st->frames_written++;
-
- if (verbose_p) {
- unsigned long now = time((time_t *)0);
- if (now > (verbose_p == 1 ? lastlog : lastlog + 10)) {
- unsigned long elapsed = now - start_time;
- double ratio = curtime / (double) duration;
- int remaining = (ratio ? (elapsed / ratio) - elapsed : 0);
- int pct = 100 * ratio;
- int cols = 47;
- char dots[80];
- int ii;
- for (ii = 0; ii < cols * ratio; ii++)
- dots[ii] = '.';
- dots[ii] = 0;
- fprintf (stderr, "%s%s: %s %2d%%, %d:%02d:%02d ETA%s",
- (verbose_p == 1 ? "\r" : ""),
- progname,
- dots, pct,
- (remaining/60/60),
- (remaining/60)%60,
- remaining%60,
- (verbose_p == 1 ? "" : "\n"));
- lastlog = now;
- }
- }
- }
-
- if (verbose_p == 1) fprintf(stderr, "\n");
-
- if (verbose_p > 1) {
- if (channel_changes == 0) channel_changes++;
- fprintf(stderr, "%s: channels shown: %d\n", progname, channel_changes);
- for (i = 0; i < N_CHANNELS; i++)
- fprintf(stderr, "%s: %2d: %3d%%\n", progname,
- i+1, stats[i] * 100 / channel_changes);
- }
-
- free (stats);
- analogtv_write_mp4 (st, outfile, audiofile, st->frames_written);
-}
-
-
-static void
-usage(const char *err)
-{
- if (err) fprintf (stderr, "%s: %s unknown\n", progname, err);
- fprintf (stderr, "usage: %s [--verbose] [--duration secs]"
- " [--audio mp3-file] [--no-powerup] infile.png ... outfile.mp4\n",
- progname);
- exit (1);
-}
-
-int
-main (int argc, char **argv)
-{
- int i;
- const char *infiles[1000];
- const char *outfile = 0;
- int duration = 30;
- Bool powerp = False;
- char *audio = 0;
- char *logo = 0;
- int nfiles = 0;
-
- char *s = strrchr (argv[0], '/');
- progname = s ? s+1 : argv[0];
- progclass = progname;
-
- memset (infiles, 0, sizeof(infiles));
-
- for (i = 1; i < argc; i++)
- {
- if (argv[i][0] == '-' && argv[i][1] == '-')
- argv[i]++;
- if (!strcmp(argv[i], "-v") ||
- !strcmp(argv[i], "-verbose"))
- verbose_p++;
- else if (!strcmp(argv[i], "-vv")) verbose_p += 2;
- else if (!strcmp(argv[i], "-vvv")) verbose_p += 3;
- else if (!strcmp(argv[i], "-vvvv")) verbose_p += 4;
- else if (!strcmp(argv[i], "-vvvvv")) verbose_p += 5;
- else if (!strcmp(argv[i], "-duration") && argv[i+1])
- {
- char dummy;
- i++;
- if (1 != sscanf (argv[i], " %d %c", &duration, &dummy))
- usage(argv[i]);
- }
- else if (!strcmp(argv[i], "-audio") && argv[i+1])
- audio = argv[++i];
- else if (!strcmp(argv[i], "-logo") && argv[i+1])
- logo = argv[++i];
- else if (!strcmp(argv[i], "-powerup") ||
- !strcmp(argv[i], "-power"))
- powerp = True;
- else if (!strcmp(argv[i], "-no-powerup") ||
- !strcmp(argv[i], "-no-power"))
- powerp = False;
- else if (argv[i][0] == '-')
- usage(argv[i]);
- else if (nfiles >= countof(infiles)-1)
- usage("too many files");
- else
- infiles[nfiles++] = argv[i];
- }
-
- if (nfiles < 2)
- usage("");
-
- outfile = infiles[nfiles-1];
- infiles[--nfiles] = 0;
-
- /* stations should be a multiple of files, but >= 6.
- channels should be double that. */
- MAX_STATIONS = 0;
- while (MAX_STATIONS < 6)
- MAX_STATIONS += nfiles;
- N_CHANNELS = MAX_STATIONS * 2;
-
- darkp = (nfiles == 1);
-
-# undef ya_rand_init
- ya_rand_init (0);
- analogtv_convert (infiles, outfile, audio, logo, duration, powerp);
- exit (0);
-}
diff --git a/hacks/analogtv.c b/hacks/analogtv.c
deleted file mode 100644
index ca87a12..0000000
--- a/hacks/analogtv.c
+++ /dev/null
@@ -1,2453 +0,0 @@
-/* analogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/*
-
- This is the code for implementing something that looks like a conventional
- analog TV set. It simulates the following characteristics of standard
- televisions:
-
- - Realistic rendering of a composite video signal
- - Compression & brightening on the right, as the scan gets truncated
- because of saturation in the flyback transformer
- - Blooming of the picture dependent on brightness
- - Overscan, cutting off a few pixels on the left side.
- - Colored text in mixed graphics/text modes
-
- It's amazing how much it makes your high-end monitor look like at large
- late-70s TV. All you need is to put a big "Solid State" logo in curly script
- on it and you'd be set.
-
- In DirectColor or TrueColor modes, it generates pixel values
- directly from RGB values it calculates across each scan line. In
- PseudoColor mode, it consider each possible pattern of 5 preceding
- bit values in each possible position modulo 4 and allocates a color
- for each. A few things, like the brightening on the right side as
- the horizontal trace slows down, aren't done in PseudoColor.
-
- I originally wrote it for the Apple ][ emulator, and generalized it
- here for use with a rewrite of xteevee and possibly others.
-
- A maxim of technology is that failures reveal underlying mechanism.
- A good way to learn how something works is to push it to failure.
- The way it fails will usually tell you a lot about how it works. The
- corollary for this piece of software is that in order to emulate
- realistic failures of a TV set, it has to work just like a TV set.
- So there is lots of DSP-style emulation of analog circuitry for
- things like color decoding, H and V sync following, and more. In
- 2003, computers are just fast enough to do this at television signal
- rates. We use a 14 MHz sample rate here, so we can do on the order
- of a couple hundred instructions per sample and keep a good frame
- rate.
-
- Trevor Blackwell <tlb@tlb.org>
-*/
-
-/*
- 2014-04-20, Dave Odell <dmo2118@gmail.com>:
- API change: Folded analogtv_init_signal and *_add_signal into *_draw().
- Added SMP support.
- Replaced doubles with floats, including constants and transcendental functions.
- Fixed a bug or two.
-*/
-
-/* 2015-02-27, Tomasz Sulej <tomeksul@gmail.com>:
- - tint_control variable is used now
- - removed unusable hashnoise code
- */
-
-/*
- 2016-10-09, Dave Odell <dmo2118@gmail.com>:
- Updated for new xshm.c.
-*/
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else /* !HAVE_JWXYZ */
-# include <X11/Xlib.h>
-# include <X11/Xutil.h>
-#endif
-#include <limits.h>
-
-#include <assert.h>
-#include <errno.h>
-#include "utils.h"
-#include "resources.h"
-#include "analogtv.h"
-#include "yarandom.h"
-#include "grabscreen.h"
-#include "visual.h"
-#include "xft.h"
-#include "font-retry.h"
-#include "ximage-loader.h"
-
-/* #define DEBUG 1 */
-
-#if defined(DEBUG) && (defined(__linux) || defined(__FreeBSD__))
-/* only works on linux + freebsd */
-#include <machine/cpufunc.h>
-
-#define DTIME_DECL u_int64_t dtimes[100]; int n_dtimes
-#define DTIME_START do {n_dtimes=0; dtimes[n_dtimes++]=rdtsc(); } while (0)
-#define DTIME dtimes[n_dtimes++]=rdtsc()
-#define DTIME_SHOW(DIV) \
-do { \
- double _dtime_div=(DIV); \
- printf("time/%.1f: ",_dtime_div); \
- for (i=1; i<n_dtimes; i++) \
- printf(" %0.9f",(dtimes[i]-dtimes[i-1])* 1e-9 / _dtime_div); \
- printf("\n"); \
-} while (0)
-
-#else
-
-#define DTIME_DECL
-#define DTIME_START do { } while (0)
-#define DTIME do { } while (0)
-#define DTIME_SHOW(DIV) do { } while (0)
-
-#endif
-
-
-#define FASTRND_A 1103515245
-#define FASTRND_C 12345
-#define FASTRND (fastrnd = fastrnd*FASTRND_A+FASTRND_C)
-
-static void analogtv_ntsc_to_yiq(const analogtv *it, int lineno, const float *signal,
- int start, int end, struct analogtv_yiq_s *it_yiq);
-
-static float puramp(const analogtv *it, float tc, float start, float over)
-{
- float pt=it->powerup-start;
- float ret;
- if (pt<0.0f) return 0.0f;
- if (pt>900.0f || pt/tc>8.0f) return 1.0f;
-
- ret=(1.0f-expf(-pt/tc))*over;
- if (ret>1.0f) return 1.0f;
- return ret*ret;
-}
-
-/*
- There are actual standards for TV signals: NTSC and RS-170A describe the
- system used in the US and Japan. Europe has slightly different systems, but
- not different enough to make substantially different screensaver displays.
- Sadly, the standards bodies don't do anything so useful as publish the spec on
- the web. Best bets are:
-
- http://www.ee.washington.edu/conselec/CE/kuhn/ntsc/95x4.htm
- http://www.ntsc-tv.com/ntsc-index-02.htm
-
- In DirectColor or TrueColor modes, it generates pixel values directly from RGB
- values it calculates across each scan line. In PseudoColor mode, it consider
- each possible pattern of 5 preceding bit values in each possible position
- modulo 4 and allocates a color for each. A few things, like the brightening on
- the right side as the horizontal trace slows down, aren't done in PseudoColor.
-
- I'd like to add a bit of visible retrace, but it conflicts with being able to
- bitcopy the image when fast scrolling. After another couple of CPU
- generations, we could probably regenerate the whole image from scratch every
- time. On a P4 2 GHz it can manage this fine for blinking text, but scrolling
- looks too slow.
-*/
-
-/* localbyteorder is MSBFirst or LSBFirst */
-static int localbyteorder;
-static const double float_low8_ofs=8388608.0;
-static int float_extraction_works;
-
-typedef union {
- float f;
- int i;
-} float_extract_t;
-
-static void
-analogtv_init(void)
-{
- int i;
- {
- unsigned int localbyteorder_loc = (MSBFirst<<24) | (LSBFirst<<0);
- localbyteorder=*(char *)&localbyteorder_loc;
- }
-
- if (1) {
- float_extract_t fe;
- int ans;
-
- float_extraction_works=1;
- for (i=0; i<256*4; i++) {
- fe.f=float_low8_ofs+(double)i;
- ans=fe.i&0x3ff;
- if (ans != i) {
-#ifdef DEBUG
- printf("Float extraction failed for %d => %d\n",i,ans);
-#endif
- float_extraction_works=0;
- break;
- }
- }
- }
-
-}
-
-void
-analogtv_set_defaults(analogtv *it, char *prefix)
-{
- char buf[256];
-
- sprintf(buf,"%sTVTint",prefix);
- it->tint_control = get_float_resource(it->dpy, buf,"TVTint");
- sprintf(buf,"%sTVColor",prefix);
- it->color_control = get_float_resource(it->dpy, buf,"TVColor")/100.0;
- sprintf(buf,"%sTVBrightness",prefix);
- it->brightness_control = get_float_resource(it->dpy, buf,"TVBrightness") / 100.0;
- sprintf(buf,"%sTVContrast",prefix);
- it->contrast_control = get_float_resource(it->dpy, buf,"TVContrast") / 100.0;
- it->height_control = 1.0;
- it->width_control = 1.0;
- it->squish_control = 0.0;
- it->powerup=1000.0;
-
- it->hashnoise_rpm=0;
- it->hashnoise_on=0;
- it->hashnoise_enable=1;
-
- it->horiz_desync=frand(10.0)-5.0;
- it->squeezebottom=frand(5.0)-1.0;
-
-#ifdef DEBUG
- printf("analogtv: prefix=%s\n",prefix);
- printf(" use: cmap=%d color=%d\n",
- it->use_cmap,it->use_color);
- printf(" controls: tint=%g color=%g brightness=%g contrast=%g\n",
- it->tint_control, it->color_control, it->brightness_control,
- it->contrast_control);
-/* printf(" freq_error %g: %g %d\n",
- it->freq_error, it->freq_error_inc, it->flutter_tint); */
- printf(" desync: %g %d\n",
- it->horiz_desync, it->flutter_horiz_desync);
- printf(" hashnoise rpm: %g\n",
- it->hashnoise_rpm);
- printf(" vis: %d %d\n",
- it->visclass, it->visdepth);
- printf(" shift: %d-%d %d-%d %d-%d\n",
- it->red_invprec,it->red_shift,
- it->green_invprec,it->green_shift,
- it->blue_invprec,it->blue_shift);
- printf(" size: %d %d %d %d xrepl=%d\n",
- it->usewidth, it->useheight,
- it->screen_xo, it->screen_yo, it->xrepl);
-
- printf(" ANALOGTV_V=%d\n",ANALOGTV_V);
- printf(" ANALOGTV_TOP=%d\n",ANALOGTV_TOP);
- printf(" ANALOGTV_VISLINES=%d\n",ANALOGTV_VISLINES);
- printf(" ANALOGTV_BOT=%d\n",ANALOGTV_BOT);
- printf(" ANALOGTV_H=%d\n",ANALOGTV_H);
- printf(" ANALOGTV_SYNC_START=%d\n",ANALOGTV_SYNC_START);
- printf(" ANALOGTV_BP_START=%d\n",ANALOGTV_BP_START);
- printf(" ANALOGTV_CB_START=%d\n",ANALOGTV_CB_START);
- printf(" ANALOGTV_PIC_START=%d\n",ANALOGTV_PIC_START);
- printf(" ANALOGTV_PIC_LEN=%d\n",ANALOGTV_PIC_LEN);
- printf(" ANALOGTV_FP_START=%d\n",ANALOGTV_FP_START);
- printf(" ANALOGTV_PIC_END=%d\n",ANALOGTV_PIC_END);
- printf(" ANALOGTV_HASHNOISE_LEN=%d\n",ANALOGTV_HASHNOISE_LEN);
-
-#endif
-
-}
-
-extern Bool mono_p; /* shoot me */
-
-static void
-analogtv_free_image(analogtv *it)
-{
- if (it->image) {
- destroy_xshm_image(it->dpy, it->image, &it->shm_info);
- it->image=NULL;
- }
-}
-
-static void
-analogtv_alloc_image(analogtv *it)
-{
- /* On failure, it->image is NULL. */
-
- unsigned bits_per_pixel = visual_pixmap_depth(it->screen, it->xgwa.visual);
- unsigned align = thread_memory_alignment(it->dpy) * 8 - 1;
- /* Width is in bits. */
- unsigned width = (it->usewidth * bits_per_pixel + align) & ~align;
-
- it->image=create_xshm_image(it->dpy, it->xgwa.visual, it->xgwa.depth,
- ZPixmap, &it->shm_info,
- width / bits_per_pixel, it->useheight);
-
- if (it->image) {
- memset (it->image->data, 0, it->image->height * it->image->bytes_per_line);
- } else {
- /* Not enough memory. Maybe try a smaller window. */
- fprintf(stderr, "analogtv: %s\n", strerror(ENOMEM));
- }
-}
-
-
-static void
-analogtv_configure(analogtv *it)
-{
- int oldwidth=it->usewidth;
- int oldheight=it->useheight;
- int wlim,hlim,height_diff;
-
- /* If the window is very small, don't let the image we draw get lower
- than the actual TV resolution (266x200.)
-
- If the aspect ratio of the window is close to a 4:3 or 16:9 ratio --
- or if it is a completely weird aspect ratio --
- then scale the image to exactly fill the window.
-
- Otherwise, center the image either horizontally or vertically,
- letterboxing or pillarboxing (but not both).
-
- If it's very close (2.5%) to a multiple of VISLINES, make it exact
- For example, it maps 1024 => 1000.
- */
- float percent = 0.15;
- float min_ratio = 4.0 / 3.0 * (1 - percent);
- float max_ratio = 16.0 / 9.0 * (1 + percent);
- float crazy_min_ratio = 10;
- float crazy_max_ratio = 1/crazy_min_ratio;
- float ratio;
- float height_snap=0.025;
-
- hlim = it->xgwa.height;
- wlim = it->xgwa.width;
- ratio = wlim / (float) hlim;
-
-#if defined(HAVE_MOBILE) || defined(NO_CONSTRAIN_RATIO)
- /* Fill the whole iPhone screen, even though that distorts the image. */
- min_ratio = 0;
- max_ratio = 10;
-#endif
-
- if (wlim < 266 || hlim < 200)
- {
- wlim = 266;
- hlim = 200;
-# ifdef DEBUG
- fprintf (stderr,
- "size: minimal: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
- wlim, hlim, it->xgwa.width, it->xgwa.height,
- min_ratio, ratio, max_ratio);
-# endif
- }
- else if (ratio > min_ratio && ratio < max_ratio)
- {
-# ifdef DEBUG
- fprintf (stderr,
- "size: close enough: %dx%d (%.3f < %.3f < %.3f)\n",
- wlim, hlim, min_ratio, ratio, max_ratio);
-# endif
- }
- else if (ratio >= max_ratio)
- {
- wlim = hlim*max_ratio;
-# ifdef DEBUG
- fprintf (stderr,
- "size: center H: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
- wlim, hlim, it->xgwa.width, it->xgwa.height,
- min_ratio, ratio, max_ratio);
-# endif
- }
- else /* ratio <= min_ratio */
- {
- hlim = wlim/min_ratio;
-# ifdef DEBUG
- fprintf (stderr,
- "size: center V: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
- wlim, hlim, it->xgwa.width, it->xgwa.height,
- min_ratio, ratio, max_ratio);
-# endif
- }
-
- if (ratio < crazy_min_ratio || ratio > crazy_max_ratio)
- {
- if (ratio < crazy_min_ratio)
- hlim = it->xgwa.height;
- else
- wlim = it->xgwa.width;
-# ifdef DEBUG
- fprintf (stderr,
- "size: aspect: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
- wlim, hlim, it->xgwa.width, it->xgwa.height,
- min_ratio, ratio, max_ratio);
-# endif
- }
-
-
- height_diff = ((hlim + ANALOGTV_VISLINES/2) % ANALOGTV_VISLINES) - ANALOGTV_VISLINES/2;
- if (height_diff != 0 && abs(height_diff) < hlim * height_snap)
- {
- hlim -= height_diff;
- }
-
-
- /* Most times this doesn't change */
- if (wlim != oldwidth || hlim != oldheight) {
-
- it->usewidth=wlim;
- it->useheight=hlim;
-
- it->xrepl=1+it->usewidth/640;
- if (it->xrepl>2) it->xrepl=2;
- it->subwidth=it->usewidth/it->xrepl;
-
- analogtv_free_image(it);
- analogtv_alloc_image(it);
- }
-
- it->screen_xo = (it->xgwa.width-it->usewidth)/2;
- it->screen_yo = (it->xgwa.height-it->useheight)/2;
- it->need_clear=1;
-}
-
-void
-analogtv_reconfigure(analogtv *it)
-{
- XGetWindowAttributes (it->dpy, it->window, &it->xgwa);
- analogtv_configure(it);
-}
-
-/* Can be any power-of-two <= 32. 16 a slightly better choice for 2-3 threads. */
-#define ANALOGTV_SUBTOTAL_LEN 32
-
-typedef struct analogtv_thread_s
-{
- analogtv *it;
- unsigned thread_id;
- size_t signal_start, signal_end;
-} analogtv_thread;
-
-#define SIGNAL_OFFSET(thread_id) \
- ((ANALOGTV_SIGNAL_LEN * (thread_id) / threads->count) & align)
-
-static int analogtv_thread_create(void *thread_raw, struct threadpool *threads,
- unsigned thread_id)
-{
- analogtv_thread *thread = (analogtv_thread *)thread_raw;
- unsigned align;
-
- thread->it = GET_PARENT_OBJ(analogtv, threads, threads);
- thread->thread_id = thread_id;
-
- align = thread_memory_alignment(thread->it->dpy) /
- sizeof(thread->it->signal_subtotals[0]);
- if (!align)
- align = 1;
- align = ~(align * ANALOGTV_SUBTOTAL_LEN - 1);
-
- thread->signal_start = SIGNAL_OFFSET(thread_id);
- thread->signal_end = thread_id + 1 == threads->count ?
- ANALOGTV_SIGNAL_LEN :
- SIGNAL_OFFSET(thread_id + 1);
-
- return 0;
-}
-
-static void analogtv_thread_destroy(void *thread_raw)
-{
-}
-
-analogtv *
-analogtv_allocate(Display *dpy, Window window)
-{
- static const struct threadpool_class cls = {
- sizeof(analogtv_thread),
- analogtv_thread_create,
- analogtv_thread_destroy
- };
-
- XGCValues gcv;
- analogtv *it=NULL;
- int i;
- const size_t rx_signal_len = ANALOGTV_SIGNAL_LEN + 2*ANALOGTV_H;
-
- analogtv_init();
-
- it=(analogtv *)calloc(1,sizeof(analogtv));
- if (!it) return 0;
- it->threads.count=0;
- it->rx_signal=NULL;
- it->signal_subtotals=NULL;
-
- it->dpy=dpy;
- it->window=window;
-
- if (thread_malloc((void **)&it->rx_signal, dpy,
- sizeof(it->rx_signal[0]) * rx_signal_len))
- goto fail;
-
- assert(!(ANALOGTV_SIGNAL_LEN % ANALOGTV_SUBTOTAL_LEN));
- if (thread_malloc((void **)&it->signal_subtotals, dpy,
- sizeof(it->signal_subtotals[0]) *
- (rx_signal_len / ANALOGTV_SUBTOTAL_LEN)))
- goto fail;
-
- if (threadpool_create(&it->threads, &cls, dpy, hardware_concurrency(dpy)))
- goto fail;
-
- assert(it->threads.count);
-
- it->shrinkpulse=-1;
-
- it->n_colors=0;
-
- XGetWindowAttributes (it->dpy, it->window, &it->xgwa);
-
- it->screen=it->xgwa.screen;
- it->colormap=it->xgwa.colormap;
- it->visclass=visual_class(it->xgwa.screen, it->xgwa.visual);
- it->visdepth=it->xgwa.depth;
- if (it->visclass == TrueColor || it->visclass == DirectColor) {
- if (get_integer_resource (it->dpy, "use_cmap", "Integer")) {
- it->use_cmap=1;
- } else {
- it->use_cmap=0;
- }
- it->use_color=!mono_p;
- }
- else if (it->visclass == PseudoColor || it->visclass == StaticColor) {
- it->use_cmap=1;
- it->use_color=!mono_p;
- }
- else {
- it->use_cmap=1;
- it->use_color=0;
- }
-
- visual_rgb_masks (it->xgwa.screen, it->xgwa.visual,
- &it->red_mask, &it->green_mask, &it->blue_mask);
- it->red_shift=it->red_invprec=-1;
- it->green_shift=it->green_invprec=-1;
- it->blue_shift=it->blue_invprec=-1;
- if (!it->use_cmap) {
- /* Is there a standard way to do this? Does this handle all cases? */
- int shift, prec;
- for (shift=0; shift<32; shift++) {
- for (prec=1; prec<16 && prec<40-shift; prec++) {
- unsigned long mask=(0xffffUL>>(16-prec)) << shift;
- if (it->red_shift<0 && mask==it->red_mask)
- it->red_shift=shift, it->red_invprec=16-prec;
- if (it->green_shift<0 && mask==it->green_mask)
- it->green_shift=shift, it->green_invprec=16-prec;
- if (it->blue_shift<0 && mask==it->blue_mask)
- it->blue_shift=shift, it->blue_invprec=16-prec;
- }
- }
- if (it->red_shift<0 || it->green_shift<0 || it->blue_shift<0) {
- if (0) fprintf(stderr,"Can't figure out color space\n");
- goto fail;
- }
-
- for (i=0; i<ANALOGTV_CV_MAX; i++) {
- int intensity=pow(i/256.0, 0.8)*65535.0; /* gamma correction */
- if (intensity>65535) intensity=65535;
- it->red_values[i]=((intensity>>it->red_invprec)<<it->red_shift);
- it->green_values[i]=((intensity>>it->green_invprec)<<it->green_shift);
- it->blue_values[i]=((intensity>>it->blue_invprec)<<it->blue_shift);
- }
-
- }
-
- gcv.background=get_pixel_resource(it->dpy, it->colormap,
- "background", "Background");
-
- it->gc = XCreateGC(it->dpy, it->window, GCBackground, &gcv);
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (it->dpy, it->gc, False);
-# endif
- XSetWindowBackground(it->dpy, it->window, gcv.background);
- XClearWindow(dpy,window);
-
- analogtv_configure(it);
-
- return it;
-
- fail:
- if (it) {
- if(it->threads.count)
- threadpool_destroy(&it->threads);
- thread_free(it->signal_subtotals);
- thread_free(it->rx_signal);
- free(it);
- }
- return NULL;
-}
-
-void
-analogtv_release(analogtv *it)
-{
- if (it->image) {
- destroy_xshm_image(it->dpy, it->image, &it->shm_info);
- it->image=NULL;
- }
- if (it->gc) XFreeGC(it->dpy, it->gc);
- it->gc=NULL;
- if (it->n_colors) XFreeColors(it->dpy, it->colormap, it->colors, it->n_colors, 0L);
- it->n_colors=0;
- threadpool_destroy(&it->threads);
- thread_free(it->rx_signal);
- thread_free(it->signal_subtotals);
- free(it);
-}
-
-
-/*
- First generate the I and Q reference signals, which we'll multiply
- the input signal by to accomplish the demodulation. Normally they
- are shifted 33 degrees from the colorburst. I think this was convenient
- for inductor-capacitor-vacuum tube implementation.
-
- The tint control, FWIW, just adds a phase shift to the chroma signal,
- and the color control controls the amplitude.
-
- In text modes (colormode==0) the system disabled the color burst, and no
- color was detected by the monitor.
-
- freq_error gives a mismatch between the built-in oscillator and the
- TV's colorbust. Some II Plus machines seemed to occasionally get
- instability problems -- the crystal oscillator was a single
- transistor if I remember correctly -- and the frequency would vary
- enough that the tint would change across the width of the screen.
- The left side would be in correct tint because it had just gotten
- resynchronized with the color burst.
-
- If we're using a colormap, set it up.
-*/
-int
-analogtv_set_demod(analogtv *it)
-{
- int y_levels=10,i_levels=5,q_levels=5;
-
- /*
- In principle, we might be able to figure out how to adjust the
- color map frame-by-frame to get some nice color bummage. But I'm
- terrified of changing the color map because we'll get flashing.
-
- I can hardly believe we still have to deal with colormaps. They're
- like having NEAR PTRs: an enormous hassle for the programmer just
- to save on memory. They should have been deprecated by 1995 or
- so. */
-
- cmap_again:
- if (it->use_cmap && !it->n_colors) {
-
- {
- int yli,qli,ili;
- for (yli=0; yli<y_levels; yli++) {
- for (ili=0; ili<i_levels; ili++) {
- for (qli=0; qli<q_levels; qli++) {
- double interpy,interpi,interpq;
- double levelmult=700.0;
- int r,g,b;
- XColor col;
-
- interpy=100.0 * ((double)yli/y_levels);
- interpi=50.0 * (((double)ili-(0.5*i_levels))/(double)i_levels);
- interpq=50.0 * (((double)qli-(0.5*q_levels))/(double)q_levels);
-
- r=(int)((interpy + 1.04*interpi + 0.624*interpq)*levelmult);
- g=(int)((interpy - 0.276*interpi - 0.639*interpq)*levelmult);
- b=(int)((interpy - 1.105*interpi + 1.729*interpq)*levelmult);
- if (r<0) r=0;
- if (r>65535) r=65535;
- if (g<0) g=0;
- if (g>65535) g=65535;
- if (b<0) b=0;
- if (b>65535) b=65535;
-
-#ifdef DEBUG
- printf("%0.2f %0.2f %0.2f => %02x%02x%02x\n",
- interpy, interpi, interpq,
- r/256,g/256,b/256);
-#endif
-
- col.red=r;
- col.green=g;
- col.blue=b;
- col.pixel=0;
- if (!XAllocColor(it->dpy, it->colormap, &col)) {
- if (q_levels > y_levels*4/12)
- q_levels--;
- else if (i_levels > y_levels*5/12)
- i_levels--;
- else
- y_levels--;
-
- if (y_levels<2)
- return -1;
- goto cmap_again;
- }
- it->colors[it->n_colors++]=col.pixel;
- }
- }
- }
-
- it->cmap_y_levels=y_levels;
- it->cmap_i_levels=i_levels;
- it->cmap_q_levels=q_levels;
- }
- }
-
- return 0;
-}
-
-#if 0
-unsigned int
-analogtv_line_signature(analogtv_input *input, int lineno)
-{
- int i;
- char *origsignal=&input->signal[(lineno+input->vsync)
- %ANALOGTV_V][input->line_hsync[lineno]];
- unsigned int hash=0;
-
- /* probably lame */
- for (i=0; i<ANALOGTV_PIC_LEN; i++) {
- int c=origsignal[i];
- hash = hash + (hash<<17) + c;
- }
-
- hash += input->line_hsync[lineno];
- hash ^= hash >> 2;
- /*
- hash += input->hashnoise_times[lineno];
- hash ^= hash >> 2;
- */
-
- return hash;
-}
-#endif
-
-
-/* Here we model the analog circuitry of an NTSC television.
- Basically, it splits the signal into 3 signals: Y, I and Q. Y
- corresponds to luminance, and you get it by low-pass filtering the
- input signal to below 3.57 MHz.
-
- I and Q are the in-phase and quadrature components of the 3.57 MHz
- subcarrier. We get them by multiplying by cos(3.57 MHz*t) and
- sin(3.57 MHz*t), and low-pass filtering. Because the eye has less
- resolution in some colors than others, the I component gets
- low-pass filtered at 1.5 MHz and the Q at 0.5 MHz. The I component
- is approximately orange-blue, and Q is roughly purple-green. See
- http://www.ntsc-tv.com for details.
-
- We actually do an awful lot to the signal here. I suspect it would
- make sense to wrap them all up together by calculating impulse
- response and doing FFT convolutions.
-
-*/
-
-static void
-analogtv_ntsc_to_yiq(const analogtv *it, int lineno, const float *signal,
- int start, int end, struct analogtv_yiq_s *it_yiq)
-{
- enum {MAXDELAY=32};
- int i;
- const float *sp;
- int phasecorr=(signal-it->rx_signal)&3;
- struct analogtv_yiq_s *yiq;
- int colormode;
- float agclevel=it->agclevel;
- float brightadd=it->brightness_control*100.0 - ANALOGTV_BLACK_LEVEL;
- float delay[MAXDELAY+ANALOGTV_PIC_LEN], *dp;
- float multiq2[4];
-
- {
-
- double cb_i=(it->line_cb_phase[lineno][(2+phasecorr)&3]-
- it->line_cb_phase[lineno][(0+phasecorr)&3])/16.0;
- double cb_q=(it->line_cb_phase[lineno][(3+phasecorr)&3]-
- it->line_cb_phase[lineno][(1+phasecorr)&3])/16.0;
-
- colormode = (cb_i * cb_i + cb_q * cb_q) > 2.8;
-
- if (colormode) {
- multiq2[0] = (cb_i*it->tint_i - cb_q*it->tint_q) * it->color_control;
- multiq2[1] = (cb_q*it->tint_i + cb_i*it->tint_q) * it->color_control;
- multiq2[2]=-multiq2[0];
- multiq2[3]=-multiq2[1];
- }
- }
-
-#if 0
- if (lineno==100) {
- printf("multiq = [%0.3f %0.3f %0.3f %0.3f] ",
- it->multiq[60],it->multiq[61],it->multiq[62],it->multiq[63]);
- printf("it->line_cb_phase = [%0.3f %0.3f %0.3f %0.3f]\n",
- it->line_cb_phase[lineno][0],it->line_cb_phase[lineno][1],
- it->line_cb_phase[lineno][2],it->line_cb_phase[lineno][3]);
- printf("multiq2 = [%0.3f %0.3f %0.3f %0.3f]\n",
- multiq2[0],multiq2[1],multiq2[2],multiq2[3]);
- }
-#endif
-
- dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
- for (i=0; i<5; i++) dp[i]=0.0f;
-
- assert(start>=0);
- assert(end < ANALOGTV_PIC_LEN+10);
-
- dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
- for (i=0; i<24; i++) dp[i]=0.0;
- for (i=start, yiq=it_yiq+start, sp=signal+start;
- i<end;
- i++, dp--, yiq++, sp++) {
-
- /* Now filter them. These are infinite impulse response filters
- calculated by the script at
- http://www-users.cs.york.ac.uk/~fisher/mkfilter. This is
- fixed-point integer DSP, son. No place for wimps. We do it in
- integer because you can count on integer being faster on most
- CPUs. We care about speed because we need to recalculate every
- time we blink text, and when we spew random bytes into screen
- memory. This is roughly 16.16 fixed point arithmetic, but we
- scale some filter values up by a few bits to avoid some nasty
- precision errors. */
-
- /* Filter Y with a 4-pole low-pass Butterworth filter at 3.5 MHz
- with an extra zero at 3.5 MHz, from
- mkfilter -Bu -Lp -o 4 -a 2.1428571429e-01 0 -Z 2.5e-01 -l
- Delay about 2 */
-
- dp[0] = sp[0] * 0.0469904257251935f * agclevel;
- dp[8] = (+1.0f*(dp[6]+dp[0])
- +4.0f*(dp[5]+dp[1])
- +7.0f*(dp[4]+dp[2])
- +8.0f*(dp[3])
- -0.0176648f*dp[12]
- -0.4860288f*dp[10]);
- yiq->y = dp[8] + brightadd;
- }
-
- if (colormode) {
- dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
- for (i=0; i<27; i++) dp[i]=0.0;
-
- for (i=start, yiq=it_yiq+start, sp=signal+start;
- i<end;
- i++, dp--, yiq++, sp++) {
- float sig=*sp;
-
- /* Filter I and Q with a 3-pole low-pass Butterworth filter at
- 1.5 MHz with an extra zero at 3.5 MHz, from
- mkfilter -Bu -Lp -o 3 -a 1.0714285714e-01 0 -Z 2.5000000000e-01 -l
- Delay about 3.
- */
-
- dp[0] = sig*multiq2[i&3] * 0.0833333333333f;
- yiq->i=dp[8] = (dp[5] + dp[0]
- +3.0f*(dp[4] + dp[1])
- +4.0f*(dp[3] + dp[2])
- -0.3333333333f * dp[10]);
-
- dp[16] = sig*multiq2[(i+3)&3] * 0.0833333333333f;
- yiq->q=dp[24] = (dp[16+5] + dp[16+0]
- +3.0f*(dp[16+4] + dp[16+1])
- +4.0f*(dp[16+3] + dp[16+2])
- -0.3333333333f * dp[24+2]);
- }
- } else {
- for (i=start, yiq=it_yiq+start; i<end; i++, yiq++) {
- yiq->i = yiq->q = 0.0f;
- }
- }
-}
-
-void
-analogtv_setup_teletext(analogtv_input *input)
-{
- int x,y;
- int teletext=ANALOGTV_BLACK_LEVEL;
-
- /* Teletext goes in line 21. But I suspect there are other things
- in the vertical retrace interval */
-
- for (y=19; y<22; y++) {
- for (x=ANALOGTV_PIC_START; x<ANALOGTV_PIC_END; x++) {
- if ((x&7)==0) {
- teletext=(random()&1) ? ANALOGTV_WHITE_LEVEL : ANALOGTV_BLACK_LEVEL;
- }
- input->signal[y][x]=teletext;
- }
- }
-}
-
-void
-analogtv_setup_frame(analogtv *it)
-{
- /* int i,x,y;*/
-
- it->redraw_all=0;
-
- if (it->flutter_horiz_desync) {
- /* Horizontal sync during vertical sync instability. */
- it->horiz_desync += -0.10*(it->horiz_desync-3.0) +
- ((int)(random()&0xff)-0x80) *
- ((int)(random()&0xff)-0x80) *
- ((int)(random()&0xff)-0x80) * 0.000001;
- }
-
- /* it wasn't used
- for (i=0; i<ANALOGTV_V; i++) {
- it->hashnoise_times[i]=0;
- }
- */
-
- /* let's leave it to process shrinkpulse */
- if (it->hashnoise_enable && !it->hashnoise_on) {
- if (random()%10000==0) {
- it->hashnoise_on=1;
- it->shrinkpulse=random()%ANALOGTV_V;
- }
- }
- if (random()%1000==0) {
- it->hashnoise_on=0;
- }
-
-#if 0 /* never used */
- if (it->hashnoise_on) {
- it->hashnoise_rpm += (15000.0 - it->hashnoise_rpm)*0.05 +
- ((int)(random()%2000)-1000)*0.1;
- } else {
- it->hashnoise_rpm -= 100 + 0.01*it->hashnoise_rpm;
- if (it->hashnoise_rpm<0.0) it->hashnoise_rpm=0.0;
- }
- if (it->hashnoise_rpm > 0.0) {
- int hni;
- double hni_double;
- int hnc=it->hashnoise_counter; /* in 24.8 format */
-
- /* Convert rpm of a 16-pole motor into dots in 24.8 format */
- hni_double = ANALOGTV_V * ANALOGTV_H * 256.0 /
- (it->hashnoise_rpm * 16.0 / 60.0 / 60.0);
- hni = (hni_double <= INT_MAX) ? (int)hni_double : INT_MAX;
-
- while (hnc < (ANALOGTV_V * ANALOGTV_H)<<8) {
- y=(hnc>>8)/ANALOGTV_H;
- x=(hnc>>8)%ANALOGTV_H;
-
- if (x>0 && x<ANALOGTV_H - ANALOGTV_HASHNOISE_LEN) {
- it->hashnoise_times[y]=x;
- }
- /* hnc += hni + (int)(random()%65536)-32768; */
- {
- hnc += (int)(random()%65536)-32768;
- if ((hnc >= 0) && (INT_MAX - hnc < hni)) break;
- hnc += hni;
- }
- }
- }
-#endif /* 0 */
-
-/* hnc -= (ANALOGTV_V * ANALOGTV_H)<<8;*/
-
-
- if (it->rx_signal_level != 0.0)
- it->agclevel = 1.0/it->rx_signal_level;
-
-
-#ifdef DEBUG2
- printf("filter: ");
- for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
- printf(" %0.3f",it->ghostfir[i]);
- }
- printf(" siglevel=%g agc=%g\n", siglevel, it->agclevel);
-#endif
-}
-
-void
-analogtv_setup_sync(analogtv_input *input, int do_cb, int do_ssavi)
-{
- int i,lineno,vsync;
- signed char *sig;
-
- int synclevel = do_ssavi ? ANALOGTV_WHITE_LEVEL : ANALOGTV_SYNC_LEVEL;
-
- for (lineno=0; lineno<ANALOGTV_V; lineno++) {
- vsync=lineno>=3 && lineno<7;
-
- sig=input->signal[lineno];
-
- i=ANALOGTV_SYNC_START;
- if (vsync) {
- while (i<ANALOGTV_BP_START) sig[i++]=ANALOGTV_BLANK_LEVEL;
- while (i<ANALOGTV_H) sig[i++]=synclevel;
- } else {
- while (i<ANALOGTV_BP_START) sig[i++]=synclevel;
- while (i<ANALOGTV_PIC_START) sig[i++]=ANALOGTV_BLANK_LEVEL;
- while (i<ANALOGTV_FP_START) sig[i++]=ANALOGTV_BLACK_LEVEL;
- }
- while (i<ANALOGTV_H) sig[i++]=ANALOGTV_BLANK_LEVEL;
-
- if (do_cb) {
- /* 9 cycles of colorburst */
- for (i=ANALOGTV_CB_START; i<ANALOGTV_CB_START+36*ANALOGTV_SCALE; i+=4*ANALOGTV_SCALE) {
- sig[i+1] += ANALOGTV_CB_LEVEL;
- sig[i+3] -= ANALOGTV_CB_LEVEL;
- }
- }
- }
-}
-
-static void
-analogtv_sync(analogtv *it)
-{
- int cur_hsync=it->cur_hsync;
- int cur_vsync=it->cur_vsync;
- int lineno = 0;
- int i,j;
- float osc,filt;
- float *sp;
- float cbfc=1.0f/128.0f;
-
-/* sp = it->rx_signal + lineno*ANALOGTV_H + cur_hsync;*/
- for (i=-32*ANALOGTV_SCALE; i<32*ANALOGTV_SCALE; i++) {
- lineno = (cur_vsync + i + ANALOGTV_V) % ANALOGTV_V;
- sp = it->rx_signal + lineno*ANALOGTV_H;
- filt=0.0f;
- for (j=0; j<ANALOGTV_H; j+=ANALOGTV_H/(16*ANALOGTV_SCALE)) {
- filt += sp[j];
- }
- filt *= it->agclevel;
-
- osc = (float)(ANALOGTV_V+i)/(float)ANALOGTV_V;
-
- if (osc >= 1.05f+0.0002f * filt) break;
- }
- cur_vsync = (cur_vsync + i + ANALOGTV_V) % ANALOGTV_V;
-
- for (lineno=0; lineno<ANALOGTV_V; lineno++) {
-
- if (lineno>5*ANALOGTV_SCALE && lineno<ANALOGTV_V-3*ANALOGTV_SCALE) { /* ignore vsync interval */
- unsigned lineno2 = (lineno + cur_vsync + ANALOGTV_V)%ANALOGTV_V;
- if (!lineno2) lineno2 = ANALOGTV_V;
- sp = it->rx_signal + lineno2*ANALOGTV_H + cur_hsync;
- for (i=-8*ANALOGTV_SCALE; i<8*ANALOGTV_SCALE; i++) {
- osc = (float)(ANALOGTV_H+i)/(float)ANALOGTV_H;
- filt=(sp[i-3]+sp[i-2]+sp[i-1]+sp[i]) * it->agclevel;
-
- if (osc >= 1.005f + 0.0001f*filt) break;
- }
- cur_hsync = (cur_hsync + i + ANALOGTV_H) % ANALOGTV_H;
- }
-
- it->line_hsync[lineno]=(cur_hsync + ANALOGTV_PIC_START +
- ANALOGTV_H) % ANALOGTV_H;
-
- /* Now look for the colorburst, which is a few cycles after the H
- sync pulse, and store its phase.
- The colorburst is 9 cycles long, and we look at the middle 5
- cycles.
- */
-
- if (lineno>15*ANALOGTV_SCALE) {
- sp = it->rx_signal + lineno*ANALOGTV_H + (cur_hsync&~3);
- for (i=ANALOGTV_CB_START+8*ANALOGTV_SCALE; i<ANALOGTV_CB_START+(36-8)*ANALOGTV_SCALE; i++) {
- it->cb_phase[i&3] = it->cb_phase[i&3]*(1.0f-cbfc) +
- sp[i]*it->agclevel*cbfc;
- }
- }
-
- {
- float tot=0.1f;
- float cbgain;
-
- for (i=0; i<4; i++) {
- tot += it->cb_phase[i]*it->cb_phase[i];
- }
- cbgain = 32.0f/sqrtf(tot);
-
- for (i=0; i<4; i++) {
- it->line_cb_phase[lineno][i]=it->cb_phase[i]*cbgain;
- }
- }
-
-#ifdef DEBUG
- if (0) printf("hs=%d cb=[%0.3f %0.3f %0.3f %0.3f]\n",
- cur_hsync,
- it->cb_phase[0], it->cb_phase[1],
- it->cb_phase[2], it->cb_phase[3]);
-#endif
-
- /* if (random()%2000==0) cur_hsync=random()%ANALOGTV_H; */
- }
-
- it->cur_hsync = cur_hsync;
- it->cur_vsync = cur_vsync;
-}
-
-static double
-analogtv_levelmult(const analogtv *it, int level)
-{
- static const double levelfac[3]={-7.5, 5.5, 24.5};
- return (40.0 + levelfac[level]*puramp(it, 3.0, 6.0, 1.0))/256.0;
-}
-
-static int
-analogtv_level(const analogtv *it, int y, int ytop, int ybot)
-{
- int level;
- if (ybot-ytop>=7) {
- if (y==ytop || y==ybot-1) level=0;
- else if (y==ytop+1 || y==ybot-2) level=1;
- else level=2;
- }
- else if (ybot-ytop>=5) {
- if (y==ytop || y==ybot-1) level=0;
- else level=2;
- }
- else if (ybot-ytop>=3) {
- if (y==ytop) level=0;
- else level=2;
- }
- else {
- level=2;
- }
- return level;
-}
-
-/*
- The point of this stuff is to ensure that when useheight is not a
- multiple of VISLINES so that TV scan lines map to different numbers
- of vertical screen pixels, the total brightness of each scan line
- remains the same.
- ANALOGTV_MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
- it interpolates extra black lines.
- */
-
-static void
-analogtv_setup_levels(analogtv *it, double avgheight)
-{
- int i,height;
- static const double levelfac[3]={-7.5, 5.5, 24.5};
-
- for (height=0; height<avgheight+2.0 && height<=ANALOGTV_MAX_LINEHEIGHT; height++) {
-
- for (i=0; i<height; i++) {
- it->leveltable[height][i].index = 2;
- }
-
- if (avgheight>=3) {
- it->leveltable[height][0].index=0;
- }
- if (avgheight>=5) {
- if (height >= 1) it->leveltable[height][height-1].index=0;
- }
- if (avgheight>=7) {
- it->leveltable[height][1].index=1;
- if (height >= 2) it->leveltable[height][height-2].index=1;
- }
-
- for (i=0; i<height; i++) {
- it->leveltable[height][i].value =
- (40.0 + levelfac[it->leveltable[height][i].index]*puramp(it, 3.0, 6.0, 1.0)) / 256.0;
- }
-
- }
-}
-
-static void rnd_combine(unsigned *a0, unsigned *c0, unsigned a1, unsigned c1)
-{
- *a0 = (*a0 * a1) & 0xffffffffu;
- *c0 = (c1 + a1 * *c0) & 0xffffffffu;
-}
-
-static void rnd_seek_ac(unsigned *a, unsigned *c, unsigned dist)
-{
- unsigned int a1 = *a, c1 = *c;
- *a = 1, *c = 0;
-
- while(dist)
- {
- if(dist & 1)
- rnd_combine(a, c, a1, c1);
- dist >>= 1;
- rnd_combine(&a1, &c1, a1, c1);
- }
-}
-
-static unsigned int rnd_seek(unsigned a, unsigned c, unsigned rnd, unsigned dist)
-{
- rnd_seek_ac(&a, &c, dist);
- return a * rnd + c;
-}
-
-static void analogtv_init_signal(const analogtv *it, double noiselevel, unsigned start, unsigned end)
-{
- float *ps=it->rx_signal + start;
- float *pe=it->rx_signal + end;
- float *p=ps;
- unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random0, start);
- unsigned int fastrnd_offset;
- float nm1,nm2;
- float noisemul = sqrt(noiselevel*150)/(float)0x7fffffff;
-
- fastrnd_offset = fastrnd - 0x7fffffff;
- nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
- while (p != pe) {
- nm2=nm1;
- fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
- fastrnd_offset = fastrnd - 0x7fffffff;
- nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
- *p++ = nm1*nm2;
- }
-}
-
-static void analogtv_add_signal(const analogtv *it, const analogtv_reception *rec, unsigned start, unsigned end, int ec)
-{
- analogtv_input *inp=rec->input;
- float *ps=it->rx_signal + start;
- float *pe=it->rx_signal + end;
- float *p=ps;
- signed char *ss=&inp->signal[0][0];
- signed char *se=&inp->signal[0][0] + ANALOGTV_SIGNAL_LEN;
- signed char *s=ss + ((start + (unsigned)rec->ofs) % ANALOGTV_SIGNAL_LEN);
- signed char *s2;
- int i;
- float level=rec->level;
- float hfloss=rec->hfloss;
- unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random1, start);
- float dp[5];
-
- const float noise_decay = 0.99995f;
- float noise_ampl = 1.3f * powf(noise_decay, start);
-
- if (ec > end)
- ec = end;
-
- /* assert((se-ss)%4==0 && (se-s)%4==0); */
-
- for (i = start; i < ec; i++) { /* Sometimes start > ec. */
-
- /* Do a big noisy transition. We can make the transition noise of
- high constant strength regardless of signal strength.
-
- There are two separate state machines. here, One is the noise
- process and the other is the
-
- We don't bother with the FIR filter here
- */
-
- float sig0=(float)s[0];
- unsigned int fastrnd_offset = fastrnd - 0x7fffffff;
- float noise = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * (50.0f/(float)0x7fffffff);
- fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
-
- p[0] += sig0 * level * (1.0f - noise_ampl) + noise * noise_ampl;
-
- noise_ampl *= noise_decay;
-
- p++;
- s++;
- if (s>=se) s=ss;
- }
-
- dp[0]=0.0;
- s2 = s;
- for (i=1; i<5; i++) {
- s2 -= 4;
- if (s2 < ss)
- s2 += ANALOGTV_SIGNAL_LEN;
- dp[i] = (float)((int)s2[0]+(int)s2[1]+(int)s2[2]+(int)s2[3]);
- }
-
- assert(p <= pe);
- assert(!((pe - p) % 4));
- while (p != pe) {
- float sig0,sig1,sig2,sig3,sigr;
-
- sig0=(float)s[0];
- sig1=(float)s[1];
- sig2=(float)s[2];
- sig3=(float)s[3];
-
- dp[0]=sig0+sig1+sig2+sig3;
-
- /* Get the video out signal, and add some ghosting, typical of RF
- monitor cables. This corresponds to a pretty long cable, but
- looks right to me.
- */
-
- sigr=(dp[1]*rec->ghostfir[0] + dp[2]*rec->ghostfir[1] +
- dp[3]*rec->ghostfir[2] + dp[4]*rec->ghostfir[3]);
- dp[4]=dp[3]; dp[3]=dp[2]; dp[2]=dp[1]; dp[1]=dp[0];
-
- p[0] += (sig0+sigr + sig2*hfloss) * level;
- p[1] += (sig1+sigr + sig3*hfloss) * level;
- p[2] += (sig2+sigr + sig0*hfloss) * level;
- p[3] += (sig3+sigr + sig1*hfloss) * level;
-
- p += 4;
- s += 4;
- if (s>=se) s = ss + (s-se);
- }
-
- assert(p == pe);
-}
-
-static void analogtv_thread_add_signals(void *thread_raw)
-{
- const analogtv_thread *thread = (analogtv_thread *)thread_raw;
- const analogtv *it = thread->it;
- unsigned i, j;
- unsigned subtotal_end;
-
- unsigned start = thread->signal_start;
- while(start != thread->signal_end)
- {
- float *p;
-
- /* Work on 8 KB blocks; these should fit in L1. */
- /* (Though it doesn't seem to help much on my system.) */
- unsigned end = start + 2048;
- if(end > thread->signal_end)
- end = thread->signal_end;
-
- analogtv_init_signal (it, it->noiselevel, start, end);
-
- for (i = 0; i != it->rec_count; ++i) {
- analogtv_add_signal (it, it->recs[i], start, end,
- !i ? it->channel_change_cycles : 0);
- }
-
- assert (!(start % ANALOGTV_SUBTOTAL_LEN));
- assert (!(end % ANALOGTV_SUBTOTAL_LEN));
-
- p = it->rx_signal + start;
- subtotal_end = end / ANALOGTV_SUBTOTAL_LEN;
- for (i = start / ANALOGTV_SUBTOTAL_LEN; i != subtotal_end; ++i) {
- float sum = p[0];
- for (j = 1; j != ANALOGTV_SUBTOTAL_LEN; ++j)
- sum += p[j];
- it->signal_subtotals[i] = sum;
- p += ANALOGTV_SUBTOTAL_LEN;
- }
-
- start = end;
- }
-}
-
-static int analogtv_get_line(const analogtv *it, int lineno, int *slineno,
- int *ytop, int *ybot, unsigned *signal_offset)
-{
- *slineno=lineno-ANALOGTV_TOP;
- *ytop=(int)((*slineno*it->useheight/ANALOGTV_VISLINES -
- it->useheight/2)*it->puheight) + it->useheight/2;
- *ybot=(int)(((*slineno+1)*it->useheight/ANALOGTV_VISLINES -
- it->useheight/2)*it->puheight) + it->useheight/2;
-#if 0
- int linesig=analogtv_line_signature(input,lineno)
- + it->hashnoise_times[lineno];
-#endif
- *signal_offset = ((lineno+it->cur_vsync+ANALOGTV_V) % ANALOGTV_V) * ANALOGTV_H +
- it->line_hsync[lineno];
-
- if (*ytop==*ybot) return 0;
- if (*ybot<0 || *ytop>it->useheight) return 0;
- if (*ytop<0) *ytop=0;
- if (*ybot>it->useheight) *ybot=it->useheight;
-
- if (*ybot > *ytop+ANALOGTV_MAX_LINEHEIGHT) *ybot=*ytop+ANALOGTV_MAX_LINEHEIGHT;
- return 1;
-}
-
-static void
-analogtv_blast_imagerow(const analogtv *it,
- float *rgbf, float *rgbf_end,
- int ytop, int ybot)
-{
- int i,j,x,y;
- float *rpf;
- char *level_copyfrom[3];
- int xrepl=it->xrepl;
- unsigned lineheight = ybot - ytop;
- if (lineheight > ANALOGTV_MAX_LINEHEIGHT) lineheight = ANALOGTV_MAX_LINEHEIGHT;
- for (i=0; i<3; i++) level_copyfrom[i]=NULL;
-
- for (y=ytop; y<ybot; y++) {
- char *rowdata=it->image->data + y*it->image->bytes_per_line;
- unsigned line = y-ytop;
-
- int level=it->leveltable[lineheight][line].index;
- float levelmult=it->leveltable[lineheight][line].value;
-
- /* Fast special cases to avoid the slow XPutPixel. Ugh. It goes to show
- why standard graphics sw has to be fast, or else people will have to
- work around it and risk incompatibility. The quickdraw folks
- understood this. The other answer would be for X11 to have fewer
- formats for bitm.. oh, never mind. If neither of these cases work
- (they probably cover 99% of setups) it falls back on the Xlib
- routines. */
-
- if (level_copyfrom[level]) {
- memcpy(rowdata, level_copyfrom[level], it->image->bytes_per_line);
- }
- else {
- level_copyfrom[level] = rowdata;
-
- if (0) {
- }
- else if (it->image->format==ZPixmap &&
- it->image->bits_per_pixel==32 &&
- sizeof(unsigned int)==4 &&
- it->image->byte_order==localbyteorder) {
- /* int is more likely to be 32 bits than long */
- unsigned int *pixelptr=(unsigned int *)rowdata;
- unsigned int pix;
-
- for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
- int ntscri=rpf[0]*levelmult;
- int ntscgi=rpf[1]*levelmult;
- int ntscbi=rpf[2]*levelmult;
- if (ntscri>=ANALOGTV_CV_MAX) ntscri=ANALOGTV_CV_MAX-1;
- if (ntscgi>=ANALOGTV_CV_MAX) ntscgi=ANALOGTV_CV_MAX-1;
- if (ntscbi>=ANALOGTV_CV_MAX) ntscbi=ANALOGTV_CV_MAX-1;
- pix = (it->red_values[ntscri] |
- it->green_values[ntscgi] |
- it->blue_values[ntscbi]);
- pixelptr[0] = pix;
- if (xrepl>=2) {
- pixelptr[1] = pix;
- if (xrepl>=3) pixelptr[2] = pix;
- }
- pixelptr+=xrepl;
- }
- }
- else if (it->image->format==ZPixmap &&
- it->image->bits_per_pixel==16 &&
- sizeof(unsigned short)==2 &&
- float_extraction_works &&
- it->image->byte_order==localbyteorder) {
- unsigned short *pixelptr=(unsigned short *)rowdata;
- float r2,g2,b2;
- float_extract_t r1,g1,b1;
- unsigned short pix;
-
- for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
- r2=rpf[0]; g2=rpf[1]; b2=rpf[2];
- r1.f=r2 * levelmult+float_low8_ofs;
- g1.f=g2 * levelmult+float_low8_ofs;
- b1.f=b2 * levelmult+float_low8_ofs;
- pix = (it->red_values[r1.i & 0x3ff] |
- it->green_values[g1.i & 0x3ff] |
- it->blue_values[b1.i & 0x3ff]);
- pixelptr[0] = pix;
- if (xrepl>=2) {
- pixelptr[1] = pix;
- if (xrepl>=3) pixelptr[2] = pix;
- }
- pixelptr+=xrepl;
- }
- }
- else if (it->image->format==ZPixmap &&
- it->image->bits_per_pixel==16 &&
- sizeof(unsigned short)==2 &&
- it->image->byte_order==localbyteorder) {
- unsigned short *pixelptr=(unsigned short *)rowdata;
- unsigned short pix;
-
- for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
- int r1=rpf[0] * levelmult;
- int g1=rpf[1] * levelmult;
- int b1=rpf[2] * levelmult;
- if (r1>=ANALOGTV_CV_MAX) r1=ANALOGTV_CV_MAX-1;
- if (g1>=ANALOGTV_CV_MAX) g1=ANALOGTV_CV_MAX-1;
- if (b1>=ANALOGTV_CV_MAX) b1=ANALOGTV_CV_MAX-1;
- pix = it->red_values[r1] | it->green_values[g1] | it->blue_values[b1];
- pixelptr[0] = pix;
- if (xrepl>=2) {
- pixelptr[1] = pix;
- if (xrepl>=3) pixelptr[2] = pix;
- }
- pixelptr+=xrepl;
- }
- }
- else {
- for (x=0, rpf=rgbf; rpf!=rgbf_end ; x++, rpf+=3) {
- int ntscri=rpf[0]*levelmult;
- int ntscgi=rpf[1]*levelmult;
- int ntscbi=rpf[2]*levelmult;
- if (ntscri>=ANALOGTV_CV_MAX) ntscri=ANALOGTV_CV_MAX-1;
- if (ntscgi>=ANALOGTV_CV_MAX) ntscgi=ANALOGTV_CV_MAX-1;
- if (ntscbi>=ANALOGTV_CV_MAX) ntscbi=ANALOGTV_CV_MAX-1;
- for (j=0; j<xrepl; j++) {
- XPutPixel(it->image, x*xrepl + j, y,
- it->red_values[ntscri] | it->green_values[ntscgi] |
- it->blue_values[ntscbi]);
- }
- }
- }
- }
- }
-}
-
-static void analogtv_thread_draw_lines(void *thread_raw)
-{
- const analogtv_thread *thread = (analogtv_thread *)thread_raw;
- const analogtv *it = thread->it;
-
- int lineno;
-
- float *raw_rgb_start;
- float *raw_rgb_end;
- raw_rgb_start=(float *)calloc(it->subwidth*3, sizeof(float));
-
- if (! raw_rgb_start) return;
-
- raw_rgb_end=raw_rgb_start+3*it->subwidth;
-
- for (lineno=ANALOGTV_TOP + thread->thread_id;
- lineno<ANALOGTV_BOT;
- lineno += it->threads.count) {
- int i,j,x,y;
-
- int slineno, ytop, ybot;
- unsigned signal_offset;
-
- const float *signal;
-
- int scanstart_i,scanend_i,squishright_i,squishdiv,pixrate;
- float *rgb_start, *rgb_end;
- float pixbright;
- int pixmultinc;
-
- float *rrp;
-
- struct analogtv_yiq_s yiq[ANALOGTV_PIC_LEN+10];
-
- if (! analogtv_get_line(it, lineno, &slineno, &ytop, &ybot,
- &signal_offset))
- continue;
-
- signal = it->rx_signal + signal_offset;
-
- {
-
- float bloomthisrow,shiftthisrow;
- float viswidth,middle;
- float scanwidth;
- int scw,scl,scr;
-
- bloomthisrow = -10.0f * it->crtload[lineno];
- if (bloomthisrow<-10.0f) bloomthisrow=-10.0f;
- if (bloomthisrow>2.0f) bloomthisrow=2.0f;
- if (slineno<16) {
- shiftthisrow=it->horiz_desync * (expf(-0.17f*slineno) *
- (0.7f+cosf(slineno*0.6f)));
- } else {
- shiftthisrow=0.0f;
- }
-
- viswidth=ANALOGTV_PIC_LEN * 0.79f - 5.0f*bloomthisrow;
- middle=ANALOGTV_PIC_LEN/2 - shiftthisrow;
-
- scanwidth=it->width_control * puramp(it, 0.5f, 0.3f, 1.0f);
-
- scw=it->subwidth*scanwidth;
- if (scw>it->subwidth) scw=it->usewidth;
- scl=it->subwidth/2 - scw/2;
- scr=it->subwidth/2 + scw/2;
-
- pixrate=(int)((viswidth*65536.0f*1.0f)/it->subwidth)/scanwidth;
- scanstart_i=(int)((middle-viswidth*0.5f)*65536.0f);
- scanend_i=(ANALOGTV_PIC_LEN-1)*65536;
- squishright_i=(int)((middle+viswidth*(0.25f + 0.25f*puramp(it, 2.0f, 0.0f, 1.1f)
- - it->squish_control)) *65536.0f);
- squishdiv=it->subwidth/15;
-
- rgb_start=raw_rgb_start+scl*3;
- rgb_end=raw_rgb_start+scr*3;
-
- assert(scanstart_i>=0);
-
-#ifdef DEBUG
- if (0) printf("scan %d: %0.3f %0.3f %0.3f scl=%d scr=%d scw=%d\n",
- lineno,
- scanstart_i/65536.0f,
- squishright_i/65536.0f,
- scanend_i/65536.0f,
- scl,scr,scw);
-#endif
- }
-
- if (it->use_cmap) {
- for (y=ytop; y<ybot; y++) {
- int level=analogtv_level(it, y, ytop, ybot);
- float levelmult=analogtv_levelmult(it, level);
- float levelmult_y = levelmult * it->contrast_control
- * puramp(it, 1.0f, 0.0f, 1.0f) / (0.5f+0.5f*it->puheight) * 0.070f;
- float levelmult_iq = levelmult * 0.090f;
-
- analogtv_ntsc_to_yiq(it, lineno, signal,
- (scanstart_i>>16)-10, (scanend_i>>16)+10, yiq);
- pixmultinc=pixrate;
-
- x=0;
- i=scanstart_i;
- while (i<0 && x<it->usewidth) {
- XPutPixel(it->image, x, y, it->colors[0]);
- i+=pixmultinc;
- x++;
- }
-
- while (i<scanend_i && x<it->usewidth) {
- float pixfrac=(i&0xffff)/65536.0f;
- float invpixfrac=(1.0f-pixfrac);
- int pati=i>>16;
- int yli,ili,qli,cmi;
-
- float interpy=(yiq[pati].y*invpixfrac
- + yiq[pati+1].y*pixfrac) * levelmult_y;
- float interpi=(yiq[pati].i*invpixfrac
- + yiq[pati+1].i*pixfrac) * levelmult_iq;
- float interpq=(yiq[pati].q*invpixfrac
- + yiq[pati+1].q*pixfrac) * levelmult_iq;
-
- yli = (int)(interpy * it->cmap_y_levels);
- ili = (int)((interpi+0.5f) * it->cmap_i_levels);
- qli = (int)((interpq+0.5f) * it->cmap_q_levels);
- if (yli<0) yli=0;
- if (yli>=it->cmap_y_levels) yli=it->cmap_y_levels-1;
- if (ili<0) ili=0;
- if (ili>=it->cmap_i_levels) ili=it->cmap_i_levels-1;
- if (qli<0) qli=0;
- if (qli>=it->cmap_q_levels) qli=it->cmap_q_levels-1;
-
- cmi=qli + it->cmap_i_levels*(ili + it->cmap_q_levels*yli);
-
-#ifdef DEBUG
- if ((random()%65536)==0) {
- printf("%0.3f %0.3f %0.3f => %d %d %d => %d\n",
- interpy, interpi, interpq,
- yli, ili, qli,
- cmi);
- }
-#endif
-
- for (j=0; j<it->xrepl; j++) {
- XPutPixel(it->image, x, y,
- it->colors[cmi]);
- x++;
- }
- if (i >= squishright_i) {
- pixmultinc += pixmultinc/squishdiv;
- }
- i+=pixmultinc;
- }
- while (x<it->usewidth) {
- XPutPixel(it->image, x, y, it->colors[0]);
- x++;
- }
- }
- }
- else {
- analogtv_ntsc_to_yiq(it, lineno, signal,
- (scanstart_i>>16)-10, (scanend_i>>16)+10, yiq);
-
- pixbright=it->contrast_control * puramp(it, 1.0f, 0.0f, 1.0f)
- / (0.5f+0.5f*it->puheight) * 1024.0f/100.0f;
- pixmultinc=pixrate;
- i=scanstart_i; rrp=rgb_start;
- while (i<0 && rrp!=rgb_end) {
- rrp[0]=rrp[1]=rrp[2]=0;
- i+=pixmultinc;
- rrp+=3;
- }
- while (i<scanend_i && rrp!=rgb_end) {
- float pixfrac=(i&0xffff)/65536.0f;
- float invpixfrac=1.0f-pixfrac;
- int pati=i>>16;
- float r,g,b;
-
- float interpy=(yiq[pati].y*invpixfrac + yiq[pati+1].y*pixfrac);
- float interpi=(yiq[pati].i*invpixfrac + yiq[pati+1].i*pixfrac);
- float interpq=(yiq[pati].q*invpixfrac + yiq[pati+1].q*pixfrac);
-
- /*
- According to the NTSC spec, Y,I,Q are generated as:
-
- y=0.30 r + 0.59 g + 0.11 b
- i=0.60 r - 0.28 g - 0.32 b
- q=0.21 r - 0.52 g + 0.31 b
-
- So if you invert the implied 3x3 matrix you get what standard
- televisions implement with a bunch of resistors (or directly in the
- CRT -- don't ask):
-
- r = y + 0.948 i + 0.624 q
- g = y - 0.276 i - 0.639 q
- b = y - 1.105 i + 1.729 q
- */
-
- r=(interpy + 0.948f*interpi + 0.624f*interpq) * pixbright;
- g=(interpy - 0.276f*interpi - 0.639f*interpq) * pixbright;
- b=(interpy - 1.105f*interpi + 1.729f*interpq) * pixbright;
- if (r<0.0f) r=0.0f;
- if (g<0.0f) g=0.0f;
- if (b<0.0f) b=0.0f;
- rrp[0]=r;
- rrp[1]=g;
- rrp[2]=b;
-
- if (i>=squishright_i) {
- pixmultinc += pixmultinc/squishdiv;
- pixbright += pixbright/squishdiv/2;
- }
- i+=pixmultinc;
- rrp+=3;
- }
- while (rrp != rgb_end) {
- rrp[0]=rrp[1]=rrp[2]=0.0f;
- rrp+=3;
- }
-
- analogtv_blast_imagerow(it, raw_rgb_start, raw_rgb_end,
- ytop,ybot);
- }
- }
-
- free(raw_rgb_start);
-}
-
-void
-analogtv_draw(analogtv *it, double noiselevel,
- const analogtv_reception *const *recs, unsigned rec_count)
-{
- int i,lineno;
- /* int bigloadchange,drawcount;*/
- double baseload;
- int overall_top, overall_bot;
-
- /* AnalogTV isn't very interesting if there isn't enough RAM. */
- if (!it->image)
- return;
-
- it->rx_signal_level = noiselevel;
- for (i = 0; i != rec_count; ++i) {
- const analogtv_reception *rec = recs[i];
- double level = rec->level;
- analogtv_input *inp=rec->input;
-
- it->rx_signal_level =
- sqrt(it->rx_signal_level * it->rx_signal_level +
- (level * level * (1.0 + 4.0*(rec->ghostfir[0] + rec->ghostfir[1] +
- rec->ghostfir[2] + rec->ghostfir[3]))));
-
- /* duplicate the first line into the Nth line to ease wraparound computation */
- memcpy(inp->signal[ANALOGTV_V], inp->signal[0],
- ANALOGTV_H * sizeof(inp->signal[0][0]));
- }
-
- analogtv_setup_frame(it);
- analogtv_set_demod(it);
-
- it->random0 = random();
- it->random1 = random();
- it->noiselevel = noiselevel;
- it->recs = recs;
- it->rec_count = rec_count;
- threadpool_run(&it->threads, analogtv_thread_add_signals);
- threadpool_wait(&it->threads);
-
- it->channel_change_cycles=0;
-
- /* rx_signal has an extra 2 lines at the end, where we copy the
- first 2 lines so we can index into it while only worrying about
- wraparound on a per-line level */
- memcpy(&it->rx_signal[ANALOGTV_SIGNAL_LEN],
- &it->rx_signal[0],
- 2*ANALOGTV_H*sizeof(it->rx_signal[0]));
-
- /* Repeat for signal_subtotals. */
-
- memcpy(&it->signal_subtotals[ANALOGTV_SIGNAL_LEN / ANALOGTV_SUBTOTAL_LEN],
- &it->signal_subtotals[0],
- (2*ANALOGTV_H/ANALOGTV_SUBTOTAL_LEN)*sizeof(it->signal_subtotals[0]));
-
- analogtv_sync(it); /* Requires the add_signals be complete. */
-
- baseload=0.5;
- /* if (it->hashnoise_on) baseload=0.5; */
-
- /*bigloadchange=1;
- drawcount=0;*/
- it->crtload[ANALOGTV_TOP-1]=baseload;
- it->puheight = puramp(it, 2.0, 1.0, 1.3) * it->height_control *
- (1.125 - 0.125*puramp(it, 2.0, 2.0, 1.1));
-
- analogtv_setup_levels(it, it->puheight * (double)it->useheight/(double)ANALOGTV_VISLINES);
-
- /* calculate tint once per frame */
- /* Christopher Mosher argues that this should use 33 degress instead of
- 103 degrees, and then TVTint should default to 0 in analogtv.h and
- all relevant XML files. But that makes all the colors go really green
- and saturated, so apparently that's not right. -- jwz, Nov 2020.
- */
- it->tint_i = -cos((103 + it->tint_control)*M_PI/180);
- it->tint_q = sin((103 + it->tint_control)*M_PI/180);
-
- for (lineno=ANALOGTV_TOP; lineno<ANALOGTV_BOT; lineno++) {
- int slineno, ytop, ybot;
- unsigned signal_offset;
- if (! analogtv_get_line(it, lineno, &slineno, &ytop, &ybot, &signal_offset))
- continue;
-
- if (lineno==it->shrinkpulse) {
- baseload += 0.4;
- /*bigloadchange=1;*/
- it->shrinkpulse=-1;
- }
-
-#if 0
- if (it->hashnoise_rpm>0.0 &&
- !(bigloadchange ||
- it->redraw_all ||
- (slineno<20 && it->flutter_horiz_desync) ||
- it->gaussiannoise_level>30 ||
- ((it->gaussiannoise_level>2.0 ||
- it->multipath) && random()%4) ||
- linesig != it->onscreen_signature[lineno])) {
- continue;
- }
- it->onscreen_signature[lineno] = linesig;
-#endif
- /* drawcount++;*/
-
- /*
- Interpolate the 600-dotclock line into however many horizontal
- screen pixels we're using, and convert to RGB.
-
- We add some 'bloom', variations in the horizontal scan width with
- the amount of brightness, extremely common on period TV sets. They
- had a single oscillator which generated both the horizontal scan and
- (during the horizontal retrace interval) the high voltage for the
- electron beam. More brightness meant more load on the oscillator,
- which caused an decrease in horizontal deflection. Look for
- (bloomthisrow).
-
- Also, the A2 did a bad job of generating horizontal sync pulses
- during the vertical blanking interval. This, and the fact that the
- horizontal frequency was a bit off meant that TVs usually went a bit
- out of sync during the vertical retrace, and the top of the screen
- would be bent a bit to the left or right. Look for (shiftthisrow).
-
- We also add a teeny bit of left overscan, just enough to be
- annoying, but you can still read the left column of text.
-
- We also simulate compression & brightening on the right side of the
- screen. Most TVs do this, but you don't notice because they overscan
- so it's off the right edge of the CRT. But the A2 video system used
- so much of the horizontal scan line that you had to crank the
- horizontal width down in order to not lose the right few characters,
- and you'd see the compression on the right edge. Associated with
- compression is brightening; since the electron beam was scanning
- slower, the same drive signal hit the phosphor harder. Look for
- (squishright_i) and (squishdiv).
- */
-
- {
- /* This used to be an int, I suspect by mistake. - Dave */
- float totsignal=0;
- float ncl/*,diff*/;
- unsigned frac;
- size_t end0, end1;
- const float *p;
-
- frac = signal_offset & (ANALOGTV_SUBTOTAL_LEN - 1);
- p = it->rx_signal + (signal_offset & ~(ANALOGTV_SUBTOTAL_LEN - 1));
- for (i=0; i != frac; i++) {
- totsignal -= p[i];
- }
-
- end0 = (signal_offset + ANALOGTV_PIC_LEN);
-
- end1 = end0 / ANALOGTV_SUBTOTAL_LEN;
- for (i=signal_offset / ANALOGTV_SUBTOTAL_LEN; i<end1; i++) {
- totsignal += it->signal_subtotals[i];
- }
-
- frac = end0 & (ANALOGTV_SUBTOTAL_LEN - 1);
- p = it->rx_signal + (end0 & ~(ANALOGTV_SUBTOTAL_LEN - 1));
- for (i=0; i != frac; i++) {
- totsignal += p[i];
- }
-
- totsignal *= it->agclevel;
- ncl = 0.95f * it->crtload[lineno-1] +
- 0.05f*(baseload +
- (totsignal-30000)/100000.0f +
- (slineno>184 ? (slineno-184)*(lineno-184)*0.001f * it->squeezebottom
- : 0.0f));
- /*diff=ncl - it->crtload[lineno];*/
- /*bigloadchange = (diff>0.01 || diff<-0.01);*/
- it->crtload[lineno]=ncl;
- }
- }
-
- threadpool_run(&it->threads, analogtv_thread_draw_lines);
- threadpool_wait(&it->threads);
-
-#if 0
- /* poor attempt at visible retrace */
- for (i=0; i<15; i++) {
- int ytop=(int)((i*it->useheight/15 -
- it->useheight/2)*puheight) + it->useheight/2;
- int ybot=(int)(((i+1)*it->useheight/15 -
- it->useheight/2)*puheight) + it->useheight/2;
- int div=it->usewidth*3/2;
-
- for (x=0; x<it->usewidth; x++) {
- y = ytop + (ybot-ytop)*x / div;
- if (y<0 || y>=it->useheight) continue;
- XPutPixel(it->image, x, y, 0xffffff);
- }
- }
-#endif
-
- if (it->need_clear) {
- XClearWindow(it->dpy, it->window);
- it->need_clear=0;
- }
-
- /*
- Subtle change: overall_bot was the bottom of the last scan line. Now it's
- the top of the next-after-the-last scan line. This is the same until
- the y-dimension is > 2400, note ANALOGTV_MAX_LINEHEIGHT.
- */
-
- overall_top=(int)(it->useheight*(1-it->puheight)/2);
- overall_bot=(int)(it->useheight*(1+it->puheight)/2);
-
- if (overall_top<0) overall_top=0;
- if (overall_bot>it->useheight) overall_bot=it->useheight;
-
- if (overall_top>0) {
- XClearArea(it->dpy, it->window,
- it->screen_xo, it->screen_yo,
- it->usewidth, overall_top, 0);
- }
- if (it->useheight > overall_bot) {
- XClearArea(it->dpy, it->window,
- it->screen_xo, it->screen_yo+overall_bot,
- it->usewidth, it->useheight-overall_bot, 0);
- }
-
- if (overall_bot > overall_top) {
- put_xshm_image(it->dpy, it->window, it->gc, it->image,
- 0, overall_top,
- it->screen_xo, it->screen_yo+overall_top,
- it->usewidth, overall_bot - overall_top,
- &it->shm_info);
- }
-
-#ifdef DEBUG
- if (0) {
- struct timeval tv;
- double fps;
- char buf[256];
- gettimeofday(&tv,NULL);
-
- fps=1.0/((tv.tv_sec - it->last_display_time.tv_sec)
- + 0.000001*(tv.tv_usec - it->last_display_time.tv_usec));
- sprintf(buf, "FPS=%0.1f",fps);
- XDrawString(it->dpy, it->window, it->gc, 50, it->useheight*2/3,
- buf, strlen(buf));
-
- it->last_display_time=tv;
- }
-#endif
-}
-
-analogtv_input *
-analogtv_input_allocate()
-{
- analogtv_input *ret=(analogtv_input *)calloc(1,sizeof(analogtv_input));
-
- return ret;
-}
-
-/*
- This takes a screen image and encodes it as a video camera would,
- including all the bandlimiting and YIQ modulation.
- This isn't especially tuned for speed.
-
- xoff, yoff: top left corner of rendered image, in window pixels.
- w, h: scaled size of rendered image, in window pixels.
- mask: BlackPixel means don't render (it's not full alpha)
-*/
-
-int
-analogtv_load_ximage(analogtv *it, analogtv_input *input,
- XImage *pic_im, XImage *mask_im,
- int xoff, int yoff, int target_w, int target_h)
-{
- int i,x,y;
- int img_w,img_h;
- int fyx[7],fyy[7];
- int fix[4],fiy[4];
- int fqx[4],fqy[4];
- XColor col1[ANALOGTV_PIC_LEN];
- XColor col2[ANALOGTV_PIC_LEN];
- char mask[ANALOGTV_PIC_LEN];
- int multiq[ANALOGTV_PIC_LEN+4];
- unsigned long black = 0; /* not BlackPixelOfScreen (it->xgwa.screen); */
-
- int x_length=ANALOGTV_PIC_LEN;
- int y_overscan=5*ANALOGTV_SCALE; /* overscan this much top and bottom */
- int y_scanlength=ANALOGTV_VISLINES+2*y_overscan;
-
- if (target_w > 0) x_length = x_length * target_w / it->xgwa.width;
- if (target_h > 0) y_scanlength = y_scanlength * target_h / it->xgwa.height;
-
- img_w = pic_im->width;
- img_h = pic_im->height;
-
- xoff = ANALOGTV_PIC_LEN * xoff / it->xgwa.width;
- yoff = ANALOGTV_VISLINES * yoff / it->xgwa.height;
-
- for (i=0; i<x_length+4; i++) {
- double phase=90.0-90.0*i;
- double ampl=1.0;
- multiq[i]=(int)(-cos(M_PI/180.0*(phase-303)) * 4096.0 * ampl);
- }
-
- for (y=0; y<y_scanlength; y++) {
- int picy1=(y*img_h)/y_scanlength;
- int picy2=(y*img_h + y_scanlength/2)/y_scanlength;
-
- for (x=0; x<x_length; x++) {
- int picx=(x*img_w)/x_length;
- col1[x].pixel=XGetPixel(pic_im, picx, picy1);
- col2[x].pixel=XGetPixel(pic_im, picx, picy2);
- if (mask_im)
- mask[x] = (XGetPixel(mask_im, picx, picy1) != black);
- else
- mask[x] = 1;
- }
- XQueryColors(it->dpy, it->colormap, col1, x_length);
- XQueryColors(it->dpy, it->colormap, col2, x_length);
- for (i=0; i<7; i++) fyx[i]=fyy[i]=0;
- for (i=0; i<4; i++) fix[i]=fiy[i]=fqx[i]=fqy[i]=0.0;
-
- for (x=0; x<x_length; x++) {
- int rawy,rawi,rawq;
- int filty,filti,filtq;
- int composite;
-
- if (!mask[x]) continue;
-
- /* Compute YIQ as:
- y=0.30 r + 0.59 g + 0.11 b
- i=0.60 r - 0.28 g - 0.32 b
- q=0.21 r - 0.52 g + 0.31 b
- The coefficients below are in .4 format */
-
- rawy=( 5*col1[x].red + 11*col1[x].green + 2*col1[x].blue +
- 5*col2[x].red + 11*col2[x].green + 2*col2[x].blue)>>7;
- rawi=(10*col1[x].red - 4*col1[x].green - 5*col1[x].blue +
- 10*col2[x].red - 4*col2[x].green - 5*col2[x].blue)>>7;
- rawq=( 3*col1[x].red - 8*col1[x].green + 5*col1[x].blue +
- 3*col2[x].red - 8*col2[x].green + 5*col2[x].blue)>>7;
-
- /* Filter y at with a 4-pole low-pass Butterworth filter at 3.5 MHz
- with an extra zero at 3.5 MHz, from
- mkfilter -Bu -Lp -o 4 -a 2.1428571429e-01 0 -Z 2.5e-01 -l */
-
- fyx[0] = fyx[1]; fyx[1] = fyx[2]; fyx[2] = fyx[3];
- fyx[3] = fyx[4]; fyx[4] = fyx[5]; fyx[5] = fyx[6];
- fyx[6] = (rawy * 1897) >> 16;
- fyy[0] = fyy[1]; fyy[1] = fyy[2]; fyy[2] = fyy[3];
- fyy[3] = fyy[4]; fyy[4] = fyy[5]; fyy[5] = fyy[6];
- fyy[6] = (fyx[0]+fyx[6]) + 4*(fyx[1]+fyx[5]) + 7*(fyx[2]+fyx[4]) + 8*fyx[3]
- + ((-151*fyy[2] + 8115*fyy[3] - 38312*fyy[4] + 36586*fyy[5]) >> 16);
- filty = fyy[6];
-
- /* Filter I at 1.5 MHz. 3 pole Butterworth from
- mkfilter -Bu -Lp -o 3 -a 1.0714285714e-01 0 */
-
- fix[0] = fix[1]; fix[1] = fix[2]; fix[2] = fix[3];
- fix[3] = (rawi * 1413) >> 16;
- fiy[0] = fiy[1]; fiy[1] = fiy[2]; fiy[2] = fiy[3];
- fiy[3] = (fix[0]+fix[3]) + 3*(fix[1]+fix[2])
- + ((16559*fiy[0] - 72008*fiy[1] + 109682*fiy[2]) >> 16);
- filti = fiy[3];
-
- /* Filter Q at 0.5 MHz. 3 pole Butterworth from
- mkfilter -Bu -Lp -o 3 -a 3.5714285714e-02 0 -l */
-
- fqx[0] = fqx[1]; fqx[1] = fqx[2]; fqx[2] = fqx[3];
- fqx[3] = (rawq * 75) >> 16;
- fqy[0] = fqy[1]; fqy[1] = fqy[2]; fqy[2] = fqy[3];
- fqy[3] = (fqx[0]+fqx[3]) + 3 * (fqx[1]+fqx[2])
- + ((2612*fqy[0] - 9007*fqy[1] + 10453 * fqy[2]) >> 12);
- filtq = fqy[3];
-
-
- composite = filty + ((multiq[x] * filti + multiq[x+3] * filtq)>>12);
- composite = ((composite*100)>>14) + ANALOGTV_BLACK_LEVEL;
- if (composite>125) composite=125;
- if (composite<0) composite=0;
-
- input->signal[y-y_overscan+ANALOGTV_TOP+yoff][x+ANALOGTV_PIC_START+xoff] = composite;
- }
- }
-
- return 1;
-}
-
-#if 0
-void analogtv_channel_noise(analogtv_input *it, analogtv_input *s2)
-{
- int x,y,newsig;
- int change=random()%ANALOGTV_V;
- unsigned int fastrnd=random();
- double hso=(int)(random()%1000)-500;
- int yofs=random()%ANALOGTV_V;
- int noise;
-
- for (y=change; y<ANALOGTV_V; y++) {
- int s2y=(y+yofs)%ANALOGTV_V;
- int filt=0;
- int noiselevel=60000 / (y-change+100);
-
- it->line_hsync[y] = s2->line_hsync[y] + (int)hso;
- hso *= 0.9;
- for (x=0; x<ANALOGTV_H; x++) {
- FASTRND;
- filt+= (-filt/16) + (int)(fastrnd&0xfff)-0x800;
- noise=(filt*noiselevel)>>16;
- newsig=s2->signal[s2y][x] + noise;
- if (newsig>120) newsig=120;
- if (newsig<0) newsig=0;
- it->signal[y][x]=newsig;
- }
- }
- s2->vsync=yofs;
-}
-#endif
-
-
-#ifdef FIXME
-/* add hash */
- if (it->hashnoise_times[lineno]) {
- int hnt=it->hashnoise_times[lineno] - input->line_hsync[lineno];
-
- if (hnt>=0 && hnt<ANALOGTV_PIC_LEN) {
- double maxampl=1.0;
- double cur=frand(150.0)-20.0;
- int len=random()%15+3;
- if (len > ANALOGTV_PIC_LEN-hnt) len=ANALOGTV_PIC_LEN-hnt;
- for (i=0; i<len; i++) {
- double sig=signal[hnt];
-
- sig += cur*maxampl;
- cur += frand(5.0)-5.0;
- maxampl = maxampl*0.9;
-
- signal[hnt]=sig;
- hnt++;
- }
- }
- }
-#endif
-
-
-void
-analogtv_reception_update(analogtv_reception *rec)
-{
- int i;
-
- if (rec->multipath > 0.0) {
- for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
- rec->ghostfir2[i] +=
- -(rec->ghostfir2[i]/16.0) + rec->multipath * (frand(0.02)-0.01);
- }
- if (random()%20==0) {
- rec->ghostfir2[random()%(ANALOGTV_GHOSTFIR_LEN)]
- = rec->multipath * (frand(0.08)-0.04);
- }
- for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
- rec->ghostfir[i] = 0.8*rec->ghostfir[i] + 0.2*rec->ghostfir2[i];
- }
-
- if (0) {
- rec->hfloss2 += -(rec->hfloss2/16.0) + rec->multipath * (frand(0.08)-0.04);
- rec->hfloss = 0.5*rec->hfloss + 0.5*rec->hfloss2;
- }
-
- } else {
- for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
- rec->ghostfir[i] = (i>=ANALOGTV_GHOSTFIR_LEN/2) ? ((i&1) ? +0.04 : -0.08) /ANALOGTV_GHOSTFIR_LEN
- : 0.0;
- }
- }
-}
-
-
-/* jwz: since MacOS doesn't have "6x10", I dumped this font to a PNG...
- */
-
-#include "images/gen/6x10font_png.h"
-
-void
-analogtv_make_font(Display *dpy, Window window, analogtv_font *f,
- int w, int h, char *fontname)
-{
- int i;
- GC gc;
- XGCValues gcv;
- XWindowAttributes xgwa;
-
- f->char_w = w;
- f->char_h = h;
-
- XGetWindowAttributes (dpy, window, &xgwa);
-
- if (fontname && !strcmp (fontname, "6x10")) {
-
- int pix_w, pix_h;
- XWindowAttributes xgwa;
- Pixmap m = 0;
- Pixmap p = image_data_to_pixmap (dpy, window,
- _6x10font_png, sizeof(_6x10font_png),
- &pix_w, &pix_h, &m);
- XImage *im = XGetImage (dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
- XImage *mm = XGetImage (dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
- unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
- int x, y;
-
- XFreePixmap (dpy, p);
- XFreePixmap (dpy, m);
- if (pix_w != 256*7) abort();
- if (pix_h != 10) abort();
-
- XGetWindowAttributes (dpy, window, &xgwa);
- f->text_im = XCreateImage (dpy, xgwa.visual, 1, XYBitmap, 0, 0,
- pix_w, pix_h, 8, 0);
- f->text_im->data = malloc (f->text_im->bytes_per_line * f->text_im->height);
-
- /* Convert deep image to 1 bit */
- for (y = 0; y < pix_h; y++)
- for (x = 0; x < pix_w; x++)
- XPutPixel (f->text_im, x, y,
- (XGetPixel (mm, x, y)
- ? XGetPixel (im, x, y) == black
- : 0));
- XDestroyImage (im);
- XDestroyImage (mm);
-
- } else if (fontname) {
-
- XftFont *font;
- XftColor xft_fg;
- XftDraw *xftdraw;
- Pixmap text_pm;
- XImage *xim;
- int x, y;
-
- font = load_xft_font_retry (dpy, screen_number (xgwa.screen), fontname);
- if (!font) {
- fprintf(stderr, "analogtv: can't load font %s\n", fontname);
- abort();
- }
-
- text_pm=XCreatePixmap(dpy, window, 256*f->char_w, f->char_h, xgwa.depth);
-
- memset(&gcv, 0, sizeof(gcv));
- gcv.foreground=1;
- gcv.background=0;
- gc=XCreateGC(dpy, text_pm, GCBackground|GCForeground, &gcv);
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (dpy, gc, False);
-# endif
-
- XSetForeground(dpy, gc, 0);
- XFillRectangle(dpy, text_pm, gc, 0, 0, 256*f->char_w, f->char_h);
-
- xftdraw = XftDrawCreate (dpy, text_pm, xgwa.visual, xgwa.colormap);
- xft_fg.pixel = ~0L;
- xft_fg.color.red = xft_fg.color.green = xft_fg.color.blue = ~0L;
-
- for (i=0; i<256; i++) {
- char c=i;
- int x=f->char_w*i+1;
- int y=f->char_h*8/10;
- XftDrawStringUtf8 (xftdraw, &xft_fg, font, x, y, (FcChar8 *) &c, 1);
- }
- xim = XGetImage(dpy, text_pm, 0, 0, 256*f->char_w, f->char_h,
- xgwa.depth, ZPixmap);
- f->text_im = XCreateImage(dpy, xgwa.visual, 1, XYPixmap, 0, 0,
- 256*f->char_w, f->char_h, 8, 0);
- f->text_im->data = (char *)calloc(f->text_im->height,
- f->text_im->bytes_per_line);
- for (y = 0; y < xim->height; y++)
- for (x = 0; x < xim->width; x++)
- XPutPixel (f->text_im, x, y, XGetPixel (xim, x, y) ? 1 : 0);
-
- XDestroyImage (xim);
- xim = 0;
-
-# if 0
- XWriteBitmapFile(dpy, "/tmp/tvfont.xbm", text_pm,
- 256*f->char_w, f->char_h, -1, -1);
-# endif
- XFreeGC(dpy, gc);
- XFreePixmap(dpy, text_pm);
- XftDrawDestroy (xftdraw);
-
- } else {
- f->text_im = XCreateImage(dpy, xgwa.visual, 1, XYPixmap, 0, 0,
- 256*f->char_w, f->char_h, 8, 0);
- f->text_im->data = (char *)calloc(f->text_im->height,
- f->text_im->bytes_per_line);
-
- }
- f->x_mult=4 * ANALOGTV_SCALE;
- f->y_mult=2 * ANALOGTV_SCALE;
-}
-
-int
-analogtv_font_pixel(analogtv_font *f, int c, int x, int y)
-{
- if (x<0 || x>=f->char_w) return 0;
- if (y<0 || y>=f->char_h) return 0;
- if (c<0 || c>=256) return 0;
- return XGetPixel(f->text_im, c*f->char_w + x, y) ? 1 : 0;
-}
-
-void
-analogtv_font_set_pixel(analogtv_font *f, int c, int x, int y, int value)
-{
- if (x<0 || x>=f->char_w) return;
- if (y<0 || y>=f->char_h) return;
- if (c<0 || c>=256) return;
-
- XPutPixel(f->text_im, c*f->char_w + x, y, value);
-}
-
-void
-analogtv_font_set_char(analogtv_font *f, int c, char *s)
-{
- int value,x,y;
-
- if (c<0 || c>=256) return;
-
- for (y=0; y<f->char_h; y++) {
- for (x=0; x<f->char_w; x++) {
- if (!*s) return;
- value=(*s==' ') ? 0 : 1;
- analogtv_font_set_pixel(f, c, x, y, value);
- s++;
- }
- }
-}
-
-void
-analogtv_lcp_to_ntsc(double luma, double chroma, double phase, int ntsc[4])
-{
- int i;
- for (i=0; i<4; i++) {
- double w=90.0*i + phase;
- double val=luma + chroma * (cos(M_PI/180.0*w));
- if (val<0.0) val=0.0;
- if (val>127.0) val=127.0;
- ntsc[i]=(int)val;
- }
-}
-
-void
-analogtv_draw_solid(analogtv_input *input,
- int left, int right, int top, int bot,
- int ntsc[4])
-{
- int x,y;
-
- if (right-left<4) right=left+4;
- if (bot-top<1) bot=top+1;
-
- for (y=top; y<bot; y++) {
- for (x=left; x<right; x++) {
- input->signal[y][x] = ntsc[x&3];
- }
- }
-}
-
-
-void
-analogtv_draw_solid_rel_lcp(analogtv_input *input,
- double left, double right, double top, double bot,
- double luma, double chroma, double phase)
-{
- int ntsc[4];
-
- int topi=(int)(ANALOGTV_TOP + ANALOGTV_VISLINES*top);
- int boti=(int)(ANALOGTV_TOP + ANALOGTV_VISLINES*bot);
- int lefti=(int)(ANALOGTV_VIS_START + ANALOGTV_VIS_LEN*left);
- int righti=(int)(ANALOGTV_VIS_START + ANALOGTV_VIS_LEN*right);
-
- analogtv_lcp_to_ntsc(luma, chroma, phase, ntsc);
- analogtv_draw_solid(input, lefti, righti, topi, boti, ntsc);
-}
-
-
-void
-analogtv_draw_char(analogtv_input *input, analogtv_font *f,
- int c, int x, int y, int ntsc[4])
-{
- int yc,xc,ys,xs,pix;
-
- for (yc=0; yc<f->char_h; yc++) {
- for (ys=y + yc*f->y_mult; ys<y + (yc+1)*f->y_mult; ys++) {
- if (ys<0 || ys>=ANALOGTV_V) continue;
-
- for (xc=0; xc<f->char_w; xc++) {
- pix=analogtv_font_pixel(f, c, xc, yc);
-
- for (xs=x + xc*f->x_mult; xs<x + (xc+1)*f->x_mult; xs++) {
- if (xs<0 || xs>=ANALOGTV_H) continue;
- if (pix) {
- input->signal[ys][xs] = ntsc[xs&3];
- }
- }
- }
- }
- }
-}
-
-void
-analogtv_draw_string(analogtv_input *input, analogtv_font *f,
- char *s, int x, int y, int ntsc[4])
-{
- while (*s) {
- analogtv_draw_char(input, f, *s, x, y, ntsc);
- x += f->char_w * f->x_mult;
- s++;
- }
-}
-
-void
-analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f,
- char *s, int x, int y, int ntsc[4])
-{
- int width=strlen(s) * f->char_w * f->x_mult;
- x -= width/2;
-
- analogtv_draw_string(input, f, s, x, y, ntsc);
-}
diff --git a/hacks/analogtv.h b/hacks/analogtv.h
deleted file mode 100644
index 474a7f8..0000000
--- a/hacks/analogtv.h
+++ /dev/null
@@ -1,346 +0,0 @@
-/* analogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef _XSCREENSAVER_ANALOGTV_H
-#define _XSCREENSAVER_ANALOGTV_H
-
-#include "thread_util.h"
-#include "xshm.h"
-
-#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
-# define HAVE_MOBILE
-#endif
-
-/* To simulate an NTSC CRT monitor with way more scanlines, and thus
- apply an ahistorical tv-like effect to a larger image, increase
- this resolution multiplier.
- */
-#ifndef ANALOGTV_SCALE
-# define ANALOGTV_SCALE 1
-#endif
-
-/*
- You'll need these to generate standard NTSC TV signals
- */
-enum {
- /* We don't handle interlace here */
- ANALOGTV_V=262*ANALOGTV_SCALE,
- ANALOGTV_TOP=30*ANALOGTV_SCALE,
- ANALOGTV_VISLINES=200*ANALOGTV_SCALE,
- ANALOGTV_BOT=ANALOGTV_TOP + ANALOGTV_VISLINES,
-
- /* This really defines our sampling rate, 4x the colorburst
- frequency. Handily equal to the Apple II's dot clock.
- You could also make a case for using 3x the colorburst freq,
- but 4x isn't hard to deal with. */
- ANALOGTV_H=912*ANALOGTV_SCALE,
-
- /* Each line is 63500 nS long. The sync pulse is 4700 nS long, etc.
- Define sync, back porch, colorburst, picture, and front porch
- positions */
- ANALOGTV_SYNC_START=0,
- ANALOGTV_BP_START=4700*ANALOGTV_H/63500,
- ANALOGTV_CB_START=5800*ANALOGTV_H/63500,
- /* signal[row][ANALOGTV_PIC_START] is the first displayed pixel */
- ANALOGTV_PIC_START=9400*ANALOGTV_H/63500,
- ANALOGTV_PIC_LEN=52600*ANALOGTV_H/63500,
- ANALOGTV_FP_START=62000*ANALOGTV_H/63500,
- ANALOGTV_PIC_END=ANALOGTV_FP_START,
-
- /* TVs scan past the edges of the picture tube, so normally you only
- want to use about the middle 3/4 of the nominal scan line.
- */
- ANALOGTV_VIS_START=ANALOGTV_PIC_START + (ANALOGTV_PIC_LEN*1/8),
- ANALOGTV_VIS_END=ANALOGTV_PIC_START + (ANALOGTV_PIC_LEN*7/8),
- ANALOGTV_VIS_LEN=ANALOGTV_VIS_END-ANALOGTV_VIS_START,
-
- ANALOGTV_HASHNOISE_LEN=6*ANALOGTV_SCALE,
-
- ANALOGTV_GHOSTFIR_LEN=4,
-
- /* analogtv.signal is in IRE units, as defined below: */
- ANALOGTV_WHITE_LEVEL=100,
- ANALOGTV_GRAY50_LEVEL=55,
- ANALOGTV_GRAY30_LEVEL=35,
- ANALOGTV_BLACK_LEVEL=10,
- ANALOGTV_BLANK_LEVEL=0,
- ANALOGTV_SYNC_LEVEL=-40,
- ANALOGTV_CB_LEVEL=20,
-
- ANALOGTV_SIGNAL_LEN=ANALOGTV_V*ANALOGTV_H,
-
- /* The number of intensity levels we deal with for gamma correction &c */
- ANALOGTV_CV_MAX=1024,
-
- /* MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
- it interpolates extra black lines. */
- ANALOGTV_MAX_LINEHEIGHT=12
-
-};
-
-typedef struct analogtv_input_s {
- signed char signal[ANALOGTV_V+1][ANALOGTV_H];
-
- int do_teletext;
-
- /* for client use */
- void (*updater)(struct analogtv_input_s *inp);
- void *client_data;
- double next_update_time;
-
-} analogtv_input;
-
-typedef struct analogtv_font_s {
- XImage *text_im;
- int char_w, char_h;
- int x_mult, y_mult;
-} analogtv_font;
-
-typedef struct analogtv_reception_s {
-
- analogtv_input *input;
- double ofs;
- double level;
- double multipath;
- double freqerr;
-
- double ghostfir[ANALOGTV_GHOSTFIR_LEN];
- double ghostfir2[ANALOGTV_GHOSTFIR_LEN];
-
- double hfloss;
- double hfloss2;
-
-} analogtv_reception;
-
-/*
- The rest of this should be considered mostly opaque to the analogtv module.
- */
-
-struct analogtv_yiq_s {
- float y,i,q;
-} /*yiq[ANALOGTV_PIC_LEN+10] */;
-
-typedef struct analogtv_s {
-
- Display *dpy;
- Window window;
- Screen *screen;
- XWindowAttributes xgwa;
-
- struct threadpool threads;
-
-#if 0
- unsigned int onscreen_signature[ANALOGTV_V];
-#endif
-
- int n_colors;
-
- int interlace;
- int interlace_counter;
-
- float agclevel;
-
- /* If you change these, call analogtv_set_demod */
- float tint_control,color_control,brightness_control,contrast_control;
- float height_control, width_control, squish_control;
- float horiz_desync;
- float squeezebottom;
- float powerup;
-
- /* internal cache */
- int blur_mult;
-
- /* For fast display, set fakeit_top, fakeit_bot to
- the scanlines (0..ANALOGTV_V) that can be preserved on screen.
- fakeit_scroll is the number of scan lines to scroll it up,
- or 0 to not scroll at all. It will DTRT if asked to scroll from
- an offscreen region.
- */
- int fakeit_top;
- int fakeit_bot;
- int fakeit_scroll;
- int redraw_all;
-
- int use_cmap,use_color;
- int bilevel_signal;
-
- XShmSegmentInfo shm_info;
- int visdepth,visclass,visbits;
- int red_invprec, red_shift;
- int green_invprec, green_shift;
- int blue_invprec, blue_shift;
- unsigned long red_mask, green_mask, blue_mask;
-
- Colormap colormap;
- int usewidth,useheight,xrepl,subwidth;
- XImage *image; /* usewidth * useheight */
- GC gc;
- int screen_xo,screen_yo; /* centers image in window */
-
- int flutter_horiz_desync;
- int flutter_tint;
-
- struct timeval last_display_time;
- int need_clear;
-
-
- /* Add hash (in the radio sense, not the programming sense.) These
- are the small white streaks that appear in quasi-regular patterns
- all over the screen when someone is running the vacuum cleaner or
- the blender. We also set shrinkpulse for one period which
- squishes the image horizontally to simulate the temporary line
- voltate drop when someone turns on a big motor */
- double hashnoise_rpm;
- int hashnoise_counter;
- int hashnoise_times[ANALOGTV_V];
- int hashnoise_signal[ANALOGTV_V];
- int hashnoise_on;
- int hashnoise_enable;
- int shrinkpulse;
-
- float crtload[ANALOGTV_V];
-
- unsigned int red_values[ANALOGTV_CV_MAX];
- unsigned int green_values[ANALOGTV_CV_MAX];
- unsigned int blue_values[ANALOGTV_CV_MAX];
-
- unsigned long colors[256];
- int cmap_y_levels;
- int cmap_i_levels;
- int cmap_q_levels;
-
- float tint_i, tint_q;
-
- int cur_hsync;
- int line_hsync[ANALOGTV_V];
- int cur_vsync;
- double cb_phase[4];
- double line_cb_phase[ANALOGTV_V][4];
-
- int channel_change_cycles;
- double rx_signal_level;
- float *rx_signal;
-
- struct {
- int index;
- double value;
- } leveltable[ANALOGTV_MAX_LINEHEIGHT+1][ANALOGTV_MAX_LINEHEIGHT+1];
-
- /* Only valid during draw. */
- unsigned random0, random1;
- double noiselevel;
- const analogtv_reception *const *recs;
- unsigned rec_count;
-
- float *signal_subtotals;
-
- float puheight;
-} analogtv;
-
-
-analogtv *analogtv_allocate(Display *dpy, Window window);
-analogtv_input *analogtv_input_allocate(void);
-
-/* call if window size changes */
-void analogtv_reconfigure(analogtv *it);
-
-void analogtv_set_defaults(analogtv *it, char *prefix);
-void analogtv_release(analogtv *it);
-int analogtv_set_demod(analogtv *it);
-void analogtv_setup_frame(analogtv *it);
-void analogtv_setup_sync(analogtv_input *input, int do_cb, int do_ssavi);
-void analogtv_draw(analogtv *it, double noiselevel,
- const analogtv_reception *const *recs, unsigned rec_count);
-
-int analogtv_load_ximage(analogtv *it, analogtv_input *input,
- XImage *pic_im, XImage *mask_im,
- int xoff, int yoff, int width, int height);
-
-void analogtv_reception_update(analogtv_reception *inp);
-
-void analogtv_setup_teletext(analogtv_input *input);
-
-
-/* Functions for rendering content into an analogtv_input */
-
-void analogtv_make_font(Display *dpy, Window window,
- analogtv_font *f, int w, int h, char *fontname);
-int analogtv_font_pixel(analogtv_font *f, int c, int x, int y);
-void analogtv_font_set_pixel(analogtv_font *f, int c, int x, int y, int value);
-void analogtv_font_set_char(analogtv_font *f, int c, char *s);
-void analogtv_lcp_to_ntsc(double luma, double chroma, double phase,
- int ntsc[4]);
-
-
-void analogtv_draw_solid(analogtv_input *input,
- int left, int right, int top, int bot,
- int ntsc[4]);
-
-void analogtv_draw_solid_rel_lcp(analogtv_input *input,
- double left, double right,
- double top, double bot,
- double luma, double chroma, double phase);
-
-void analogtv_draw_char(analogtv_input *input, analogtv_font *f,
- int c, int x, int y, int ntsc[4]);
-void analogtv_draw_string(analogtv_input *input, analogtv_font *f,
- char *s, int x, int y, int ntsc[4]);
-void analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f,
- char *s, int x, int y, int ntsc[4]);
-
-int analogtv_handle_events (analogtv *it);
-
-#ifdef HAVE_XSHM_EXTENSION
-#define ANALOGTV_DEFAULTS_SHM "*useSHM: True",
-#else
-#define ANALOGTV_DEFAULTS_SHM
-#endif
-
-#ifndef HAVE_MOBILE
-# define ANALOGTV_DEF_BRIGHTNESS "2"
-# define ANALOGTV_DEF_CONTRAST "150"
-#else
- /* Need to really crank this up for it to look good on the iPhone screen. */
-# define ANALOGTV_DEF_BRIGHTNESS "3"
-# define ANALOGTV_DEF_CONTRAST "400"
-#endif
-
-/* Brightness: useful range is around -75 to 100.
- Contrast: useful range is around 0 - 500.
- Color: useful range is around +/- 500.
- Tint: range is mod 360.
-
- The values in the 'analogtv' struct are the resource divided by 100.0,
- except for tint, which is exact.
- */
-
-#define ANALOGTV_DEFAULTS \
- "*TVColor: 70", \
- "*TVTint: 5", \
- "*TVBrightness: " ANALOGTV_DEF_BRIGHTNESS, \
- "*TVContrast: " ANALOGTV_DEF_CONTRAST, \
- "*Background: Black", \
- "*use_cmap: 0", \
- "*geometry: 800x600", \
- "*fpsSolid: True", \
- "*lowrez: True", \
- THREAD_DEFAULTS \
- ANALOGTV_DEFAULTS_SHM
-
-#define ANALOGTV_OPTIONS \
- THREAD_OPTIONS \
- { "-use-cmap", ".use_cmap", XrmoptionSepArg, 0 }, \
- { "-tv-color", ".TVColor", XrmoptionSepArg, 0 }, \
- { "-tv-tint", ".TVTint", XrmoptionSepArg, 0 }, \
- { "-tv-brightness", ".TVBrightness", XrmoptionSepArg, 0 }, \
- { "-tv-contrast", ".TVContrast", XrmoptionSepArg, 0 },
-
-#endif /* _XSCREENSAVER_ANALOGTV_H */
diff --git a/hacks/anemone.c b/hacks/anemone.c
deleted file mode 100644
index f0ea5e8..0000000
--- a/hacks/anemone.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/* anemone, Copyright (c) 2001 Gabriel Finch
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/*------------------------------------------------------------------------
- |
- | FILE anemone.c
- | MODULE OF xscreensaver
- |
- | DESCRIPTION Anemone.
- |
- | WRITTEN BY Gabriel Finch
- |
- |
- |
- | MODIFICATIONS june 2001 started
- |
- +----------------------------------------------------------------------*/
-
-
-#include <math.h>
-#include "screenhack.h"
-
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-#include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-
-/*-----------------------------------------------------------------------+
- | PRIVATE DATA |
- +-----------------------------------------------------------------------*/
-
-
-#define TWO_PI (2.0 * M_PI)
-#define RND(x) (random() % (x))
-#define MAXPEND 2000
-#define MAXPTS 200
-#define TRUE 1
-#define FALSE 0
-
-
-typedef struct {
- double x,y,z;
- int sx,sy,sz;
-} vPend;
-
-typedef struct {
- long col;
- int numpt;
- int growth;
- unsigned short rate;
-} appDef;
-
-struct state {
- Display *dpy;
- Pixmap b, ba, bb;
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- XdbeBackBuffer backb;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- int arms; /* number of arms */
- int finpoints; /* final number of points in each array. */
- long delay; /* usecs to wait between updates. */
-
- int scrWidth, scrHeight;
- GC gcDraw, gcClear;
-
- Bool dbuf;
- int width;
-
- vPend *vPendage; /* 3D representation of appendages */
- appDef *appD; /* defaults */
- vPend *vCurr, *vNext;
- appDef *aCurr;
-
- double turn, turndelta;
-
- int mx, my; /* max screen coordinates. */
- int withdraw;
-
- XGCValues gcv;
- Colormap cmap;
- XColor *colors;
- int ncolors;
-};
-
-
-
-/*-----------------------------------------------------------------------+
- | PUBLIC DATA |
- +-----------------------------------------------------------------------*/
-
-
-
-/*-----------------------------------------------------------------------+
- | PRIVATE FUNCTIONS |
- +-----------------------------------------------------------------------*/
-
-static void *
-xmalloc(size_t size)
-{
- void *ret;
-
- if ((ret = malloc(size)) == NULL) {
- fprintf(stderr, "anemone: out of memory\n");
- exit(1);
- }
- return ret;
-}
-
-
-static void
-initAppendages(struct state *st)
-{
- int i;
- /*int marginx, marginy; */
-
- /*double scalex, scaley;*/
-
- double x,y,z,dist;
-
- st->mx = st->scrWidth - 1;
- st->my = st->scrHeight - 1;
-
- /* each appendage will have: colour,
- number of points, and a grow or shrink indicator */
-
- /* added: growth rate 1-10 (smaller==faster growth) */
- /* each appendage needs virtual coords (x,y,z) with y and z combining to
- give the screen y */
-
- st->vPendage = (vPend *) xmalloc((st->finpoints + 1) * sizeof(vPend) * st->arms);
- st->appD = (appDef *) xmalloc(sizeof(appDef) * st->arms);
-
-
- for (i = 0; i < st->arms; i++) {
- st->aCurr = st->appD + i;
- st->vCurr = st->vPendage + (st->finpoints + 1) * i;
- st->vNext = st->vCurr + 1;
-
- st->aCurr->col = st->colors[random() % st->ncolors].pixel;
- st->aCurr->numpt = 1;
- st->aCurr->growth = st->finpoints / 2 + RND(st->finpoints / 2);
- st->aCurr->rate = RND(11) * RND(11);
-
- do {
- x = (1 - RND(1001) / 500);
- y = (1 - RND(1001) / 500);
- z = (1 - RND(1001) / 500);
- dist = x * x + y * y + z * z;
- } while (dist >= 1.);
-
- st->vCurr->x = x * 200;
- st->vCurr->y = st->my / 2 + y * 200;
- st->vCurr->z = 0 + z * 200;
-
- /* start the arm going outwards */
- st->vCurr->sx = st->vCurr->x / 5;
- st->vCurr->sy = (st->vCurr->y - st->my / 2) / 5;
- st->vCurr->sz = (st->vCurr->z) / 5;
-
-
- st->vNext->x = st->vCurr->x + st->vCurr->sx;
- st->vNext->y = st->vCurr->y + st->vCurr->sy;
- st->vNext->z = st->vCurr->z + st->vCurr->sz;
- }
-}
-
-static void *
-anemone_init (Display *disp, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XWindowAttributes wa;
-
- st->dpy = disp;
- st->turn = 0.;
-
- st->width = get_integer_resource(st->dpy, "width", "Integer");
- st->arms = get_integer_resource(st->dpy, "arms", "Integer");
- st->finpoints = get_integer_resource(st->dpy, "finpoints", "Integer");
- st->delay = get_integer_resource(st->dpy, "delay", "Integer");
- st->withdraw = get_integer_resource(st->dpy, "withdraw", "Integer");
- st->turndelta = get_float_resource(st->dpy, "turnspeed", "float") / 100000;
-
- st->dbuf = TRUE;
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- st->dbuf = False;
-# endif
-
- st->b = st->ba = st->bb = 0; /* double-buffer to reduce flicker */
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- st->b = st->backb = xdbe_get_backbuffer (st->dpy, window, XdbeUndefined);
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-
- XGetWindowAttributes(st->dpy, window, &wa);
- st->scrWidth = wa.width;
- st->scrHeight = wa.height;
- st->cmap = wa.colormap;
-
- st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
- st->ncolors += 3;
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
- make_smooth_colormap (wa.screen, wa.visual, st->cmap,
- st->colors, &st->ncolors,
- True, 0, True);
-
- st->gcDraw = XCreateGC(st->dpy, window, 0, &st->gcv);
- st->gcv.foreground = get_pixel_resource(st->dpy, st->cmap,
- "background", "Background");
- st->gcClear = XCreateGC(st->dpy, window, GCForeground, &st->gcv);
-
- if (st->dbuf) {
- if (!st->b)
- {
- st->ba = XCreatePixmap (st->dpy, window, st->scrWidth, st->scrHeight, wa.depth);
- st->bb = XCreatePixmap (st->dpy, window, st->scrWidth, st->scrHeight, wa.depth);
- st->b = st->ba;
- }
- }
- else
- {
- st->b = window;
- }
-
- if (st->ba) XFillRectangle (st->dpy, st->ba, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
- if (st->bb) XFillRectangle (st->dpy, st->bb, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
-
- XClearWindow(st->dpy, window);
- XSetLineAttributes(st->dpy, st->gcDraw, st->width, LineSolid, CapRound, JoinBevel);
-
- initAppendages(st);
-
- return st;
-}
-
-
-static void
-createPoints(struct state *st)
-{
- int i;
- int withdrawall = RND(st->withdraw);
-
- for (i = 0; i< st->arms; i++) {
- st->aCurr = st->appD + i;
- if (!withdrawall) {
- st->aCurr->growth = -st->finpoints;
- st->turndelta = -st->turndelta;
- }
-
- else if (withdrawall<11) st->aCurr->growth = -st->aCurr->numpt;
-
- else if (RND(100)<st->aCurr->rate) {
- if (st->aCurr->growth>0) {
- if (!(--st->aCurr->growth)) st->aCurr->growth = -RND(st->finpoints) - 1;
- st->vCurr = st->vPendage + (st->finpoints + 1) * i + st->aCurr->numpt - 1;
- if (st->aCurr->numpt<st->finpoints - 1) {
- /* add a piece */
- st->vNext = st->vCurr + 1;
- st->aCurr->numpt++;
- st->vNext->sx = st->vCurr->sx + RND(3) - 1;
- st->vNext->sy = st->vCurr->sy + RND(3) - 1;
- st->vNext->sz = st->vCurr->sz + RND(3) - 1;
- st->vCurr = st->vNext + 1;
- st->vCurr->x = st->vNext->x + st->vNext->sx;
- st->vCurr->y = st->vNext->y + st->vNext->sy;
- st->vCurr->z = st->vNext->z + st->vNext->sz;
- }
- }
- }
- }
-}
-
-
-static void
-drawImage(struct state *st, Drawable curr_window, double sint, double cost)
-{
- int q,numpt,mx2 = st->mx / 2;
- double cx,cy,cz,nx = 0,ny = 0,nz = 0;
-
- if ((numpt = st->aCurr->numpt)==1) return;
- XSetForeground(st->dpy, st->gcDraw, st->aCurr->col);
-
- st->vNext = st->vCurr + 1;
-
- cx = st->vCurr->x;
- cy = st->vCurr->y;
- cz = st->vCurr->z;
-
-
- for (q = 0; q < numpt - 1; q++) {
- nx = st->vNext->x + 2 - RND(5);
- ny = st->vNext->y + 2 - RND(5);
- nz = st->vNext->z + 2 - RND(5);
-
- XDrawLine(st->dpy, curr_window, st->gcDraw,
- mx2 + cx * cost - cz * sint, cy,
- mx2 + nx * cost - nz * sint, ny);
- st->vCurr++;
- st->vNext++;
-
- cx = nx;
- cy = ny;
- cz = nz;
- }
- XSetLineAttributes(st->dpy, st->gcDraw, st->width * 3,
- LineSolid, CapRound, JoinBevel);
- XDrawLine(st->dpy, curr_window, st->gcDraw,
- st->mx / 2 + cx * cost - cz * sint, cy,
- st->mx / 2 + nx * cost - nz * sint, ny);
- XSetLineAttributes(st->dpy, st->gcDraw, st->width,
- LineSolid, CapRound, JoinBevel);
-
-}
-
-static void
-animateAnemone(struct state *st, Drawable curr_window)
-{
- int i;
- double sint = sin(st->turn),cost = cos(st->turn);
-
- st->aCurr = st->appD;
- for (i = 0; i< st->arms; i++) {
- st->vCurr = st->vPendage + (st->finpoints + 1) * i;
- if (RND(25)<st->aCurr->rate) {
- if (st->aCurr->growth<0) {
- st->aCurr->numpt -= st->aCurr->numpt>1;
- if (!(++st->aCurr->growth)) st->aCurr->growth = RND(st->finpoints - st->aCurr->numpt) + 1;
- }
- }
- drawImage(st, curr_window, sint, cost);
- st->turn += st->turndelta;
- st->aCurr++;
- }
- createPoints(st);
-
- if (st->turn >= TWO_PI) st->turn -= TWO_PI;
-}
-
-static unsigned long
-anemone_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- XFillRectangle (st->dpy, st->b, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
-
- animateAnemone(st, st->b);
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (st->backb)
- {
- XdbeSwapInfo info[1];
- info[0].swap_window = window;
- info[0].swap_action = XdbeUndefined;
- XdbeSwapBuffers (st->dpy, info, 1);
- }
- else
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- if (st->dbuf)
- {
- XCopyArea (st->dpy, st->b, window, st->gcClear, 0, 0,
- st->scrWidth, st->scrHeight, 0, 0);
- st->b = (st->b == st->ba ? st->bb : st->ba);
- }
-
- return st->delay;
-}
-
-
-static void
-anemone_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->scrWidth = w;
- st->scrHeight = h;
-#if 0
- if (st->dbuf) {
- XWindowAttributes wa;
- XGetWindowAttributes(dpy, window, &wa);
- if (st->ba) XFreePixmap (dpy, st->ba);
- if (st->bb) XFreePixmap (dpy, st->bb);
- st->ba = XCreatePixmap (dpy, window, st->scrWidth, st->scrHeight, wa.depth);
- st->bb = XCreatePixmap (dpy, window, st->scrWidth, st->scrHeight, wa.depth);
- st->b = st->ba;
- }
-#endif
-}
-
-static Bool
-anemone_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-anemone_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- if (st->vPendage) free (st->vPendage);
- if (st->appD) free (st->appD);
- XFreeGC (dpy, st->gcDraw);
- XFreeGC (dpy, st->gcClear);
- free (st->colors);
- free (st);
-}
-
-
-
-static const char *anemone_defaults [] = {
- ".background: black",
- "*arms: 128",
- "*width: 2",
- "*finpoints: 64",
- "*delay: 40000",
- "*withdraw: 1200",
- "*turnspeed: 50",
- "*colors: 20",
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- "*useDBE: True",
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-
-static XrmOptionDescRec anemone_options [] = {
- { "-arms", ".arms", XrmoptionSepArg, 0 },
- { "-finpoints", ".finpoints", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-width", ".width", XrmoptionSepArg, 0 },
- { "-withdraw", ".withdraw", XrmoptionSepArg, 0 },
- { "-turnspeed", ".turnspeed", XrmoptionSepArg, 0 },
- { "-colors", ".colors", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Anemone", anemone)
diff --git a/hacks/anemone.man b/hacks/anemone.man
deleted file mode 100644
index 8c5464e..0000000
--- a/hacks/anemone.man
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-anemone \- wiggling tentacles.
-.SH SYNOPSIS
-.B anemone
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-arms \fInumber\fP]
-[\-finpoints \fInumber\fP]
-[\-width \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Wiggling tentacles.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
-.TP 8
-.B \-arms \fInumber\fP
-Arms. 2 - 500. Default: 128.
-.TP 8
-.B \-finpoints \fInumber\fP
-Tentacles. 3 - 200. Default: 64.
-.TP 8
-.B \-withdraw \fInumber\fP
-Frequency that the arms withdraw. Arms withdraw on randomly generated
-values between 1 and 11; this value determines the maximum value of
-that range. So 100 spends a lot of time withdrawn, while 1000,000 tends
-not to withdraw at all. Default: 1200.
-.TP 8
-.B \-turnspeed \fInumber\fP
-How fast it turns. At zero, not at all, all they way up to thousands
-which are very fast indeed. Default: 50.
-.TP 8
-.B \-width \fInumber\fP
-Thickness. 1 - 10. Default: 2.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Gabriel Finch. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Gabriel Finch.
diff --git a/hacks/anemotaxis.c b/hacks/anemotaxis.c
deleted file mode 100644
index 04c12e3..0000000
--- a/hacks/anemotaxis.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/* anemotaxis, Copyright (c) 2004 Eugene Balkovski
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation. No representations are made
- * about the suitability of this software for any purpose. It is
- * provided "as is" without express or implied warranty.
- */
-
-/*------------------------------------------------------------------------
- |
- | FILE anemotaxis.c
- |
- | DESCRIPTION Anemotaxis
- |
- | This code illustrates an optimal algorithm designed
- | for searching a source of particles on a plane.
- | The particles drift in one direction and walk randomly
- | in the other. The only information available to the
- | searcher is the presence of a particle at its location
- | and the local direction from where particle arrived.
- | The algorithm "explains" the behavior
- | of some animals and insects
- | who use olfactory and directional cues to find
- | sources of odor (mates, food, home etc) in
- | turbulent atmosphere (odor-modulated anemotaxis),
- | e.g. male moths locating females who release
- | pheromones to attract males. The search trajectories
- | resemble the trajectories that the animals follow.
- |
- |
- | WRITTEN BY Eugene Balkovski
- |
- | MODIFICATIONS june 2004 started
- |
- +----------------------------------------------------------------------*/
-
-/*
- Options:
-
- -distance <arg> size of the lattice
- -sources <arg> number of sources
- -searhers <arg> number of searcher */
-
-
-#include "screenhack.h"
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-#include "xdbe.h"
-#endif
-
-
-/*-----------------------------------------------------------------------+
- | PRIVATE DATA |
- +-----------------------------------------------------------------------*/
-
-#define MAX_DIST 250
-#define MIN_DIST 10
-#define LINE_WIDTH 4
-#define MAX_INV_RATE 5
-
-#define RND(x) (random() % (x))
-#define X(x) ((int) (st->ax * (x) + st->bx))
-#define Y(x) ((int) (st->ay * (x) + st->by))
-
-typedef struct {
- short x;
- short y;
-} Point;
-
-typedef struct {
-
- short y; /* y-coordinate of the particle (relative to the source) */
-
- short v; /* velocity of the particle. Allowed values are -1, 0, 1.
- 2 means the particle is not valid */
-} YV;
-
-typedef struct {
-
- int n; /* size of array xv */
-
- YV *yv; /* yv[i] keeps velocity and y-coordinate of the
- particle at (i + 1, yv[i].y) relative to the
- source */
-
- int inv_rate; /* Inverse rate of particle emission (if 0 then
- source doesn't emit new particles (although
- old ones can still exist )*/
-
- Point r; /* Position of the source */
-
- long color;
-
-} Source;
-
-
-typedef struct PList {
- Point r;
- struct PList *next;
-} PList;
-
-typedef enum {UP_LEFT, UP_RIGHT, LEFT, RIGHT, DONE} State_t;
-
-typedef struct {
-
- Point r; /* Current position */
-
- Point vertex; /* Position of the vertex of the most recent
- cone, which is the region where the source
- is located. We do exhaustive search in the
- cone until we encounter a new particle,
- which gives us a new cone. */
-
- State_t state; /* Internal state variable */
-
- unsigned char c; /* Concentration at r */
-
- short v; /* Velocity at r (good only when c != 0) */
-
- PList *hist; /* Trajectory */
-
- int rs; /* small shift of x-coordinate to avoid
- painting over the same x */
-
- long color;
-
-} Searcher;
-
-struct state {
- Source **source;
- Searcher **searcher;
-
- int max_dist, max_src, max_searcher;
-
- double ax, ay, bx, by;
- int dx, dy;
-
- Display *dpy;
- Window window;
-
- Pixmap b, ba, bb;
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- XdbeBackBuffer backb;
-#endif
-
- long delay; /* usecs to wait between updates. */
-
- int scrWidth, scrHeight;
- GC gcDraw, gcClear;
-
- Bool dbuf;
-
- XGCValues gcv;
- Colormap cmap;
- XColor *colors;
- int ncolors;
-};
-
-/*-----------------------------------------------------------------------+
- | PUBLIC DATA |
- +-----------------------------------------------------------------------*/
-
-
-
-/*-----------------------------------------------------------------------+
- | PRIVATE FUNCTIONS |
- +-----------------------------------------------------------------------*/
-
-static void *emalloc(size_t size)
-{
- void *ret = malloc(size);
-
- if (ret == NULL) {
- fprintf(stderr, "out of memory\n");
- exit(1);
- }
- return ret;
-}
-
-static Searcher *new_searcher(struct state *st)
-{
- Searcher *m = (Searcher *) emalloc(sizeof(Searcher));
-
- m->r.x = m->vertex.x = st->max_dist;
-
- do {
- m->r.y = RND(2 * st->max_dist);
- } while(m->r.y < MIN_DIST || m->r.y > 2 * st->max_dist - MIN_DIST);
-
- m->vertex.y = m->r.y;
-
- m->state = (RND(2) == 0 ? UP_RIGHT : UP_LEFT);
- m->hist = NULL;
- m->color = st->colors[random() % st->ncolors].pixel;
-
- m->rs = RND(st->dx);
-
- return m;
-}
-
-static void destroy_searcher(Searcher *m)
-{
- PList *p = m->hist, *q;
-
- while(p != NULL) {
- q = p->next;
- free(p);
- p = q;
- }
-
- free(m);
-}
-
-static void write_hist(Searcher *m)
-{
- PList *l;
-
- l = m->hist;
- m->hist = (PList *) emalloc(sizeof(PList));
- m->hist->next = l;
- m->hist->r = m->r;
-
-}
-
-static void move_searcher(Searcher *m)
-{
-
- if(m->c == True) {
- write_hist(m);
- m->r.x -= 1;
- m->r.y -= m->v;
- write_hist(m);
- m->state = (RND(2) == 0 ? UP_LEFT : UP_RIGHT);
- m->vertex = m->r;
- return;
-
- }
-
- switch(m->state) {
- case UP_LEFT:
-
- m->r.x -= 1;
- m->r.y += 1;
- m->state = RIGHT;
- write_hist(m);
- return;
-
- case RIGHT:
-
- m->r.y -= 1;
- if(m->vertex.x - m->r.x == m->vertex.y - m->r.y) {
- write_hist(m);
- m->state = UP_RIGHT;
- }
- return;
-
- case UP_RIGHT:
-
- m->r.x -= 1;
- m->r.y -= 1;
-
- m->state = LEFT;
- write_hist(m);
- return;
-
- case LEFT:
-
- m->r.y += 1;
-
- if(m->vertex.x - m->r.x == m->r.y - m->vertex.y) {
- write_hist(m);
- m->state = UP_LEFT;
- }
- return;
-
- default:
- break;
- }
-
-}
-
-static void evolve_source(Source *s)
-{
-
- int i;
-
- /* propagate existing particles */
-
- for(i = s->n - 1; i > 0; i--) {
-
- if(s->yv[i - 1].v == 2)
- s->yv[i].v = 2;
- else {
- s->yv[i].v = RND(3) - 1;
- s->yv[i].y = s->yv[i - 1].y + s->yv[i].v;
- }
-
- }
-
-
- if(s->inv_rate > 0 && (RND(s->inv_rate) == 0)) /* emit a particle */
- s->yv[0].y = s->yv[0].v = RND(3) - 1;
- else
- s->yv[0].v = 2;
-
-}
-
-static Source *new_source(struct state *st)
-{
- int i;
-
- Source *s = (Source *) emalloc(sizeof(Source));
- if(st->max_searcher == 0) {
- s->r.x = 0;
- s->r.y = RND(2 * st->max_dist);
- }
- else {
- s->r.x = RND(st->max_dist / 3);
- do {
- s->r.y = RND(2 * st->max_dist);
- } while(s->r.y < MIN_DIST || s->r.y > 2 * st->max_dist - MIN_DIST);
- }
-
- s->n = st->max_dist - s->r.x;
- s->yv = emalloc(sizeof(YV) * s->n);
-
- for(i = 0; i < s->n; i++)
- s->yv[i].v = 2;
-
- s->inv_rate = RND(MAX_INV_RATE);
-
- if(s->inv_rate == 0)
- s->inv_rate = 1;
-
- s->color = st->colors[random() % st->ncolors].pixel;
-
- return s;
-}
-
-static void destroy_source(Source *s)
-{
- free(s->yv);
- free(s);
-}
-
-static void get_v(const Source *s, Searcher *m)
-{
- int x = m->r.x - s->r.x - 1;
-
- m->c = 0;
-
- if(x < 0 || x >= s->n)
- return;
-
- if((s->yv[x].v == 2) || (s->yv[x].y != m->r.y - s->r.y))
- return;
-
- m->c = 1;
- m->v = s->yv[x].v;
- m->color = s->color;
-}
-
-
-static void *
-anemotaxis_init (Display *disp, Window win)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XWindowAttributes wa;
-
- st->dpy = disp;
- st->window = win;
-
- XGetWindowAttributes(st->dpy, st->window, &wa);
-
- st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
- st->ncolors++;
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
- make_random_colormap (wa.screen, wa.visual, wa.colormap,
- st->colors, &st->ncolors,
- True, True, 0, True);
-
- st->delay = get_integer_resource(st->dpy, "delay", "Integer");
- st->max_dist = get_integer_resource(st->dpy, "distance", "Integer");
-
- if(st->max_dist < MIN_DIST)
- st->max_dist = MIN_DIST + 1;
- if(st->max_dist > MAX_DIST)
- st->max_dist = MAX_DIST;
-
- st->max_src = get_integer_resource(st->dpy, "sources", "Integer");
-
- if(st->max_src <= 0)
- st->max_src = 1;
-
- st->max_searcher = get_integer_resource(st->dpy, "searchers", "Integer");
-
- if(st->max_searcher < 0)
- st->max_searcher = 0;
-
- st->dbuf = True;
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- st->dbuf = False;
-# endif
-
- st->source = (Source **) emalloc(sizeof(Source *) * st->max_src);
- memset(st->source, 0, st->max_src * sizeof(Source *));
-
- st->source[0] = new_source(st);
-
- st->searcher = (Searcher **) emalloc(st->max_searcher * sizeof(Searcher *));
-
- memset(st->searcher, 0, st->max_searcher * sizeof(Searcher *));
-
- st->b = st->ba = st->bb = 0; /* double-buffer to reduce flicker */
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- st->b = st->backb = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
-#endif
-
- st->scrWidth = wa.width;
- st->scrHeight = wa.height;
- st->cmap = wa.colormap;
- st->gcDraw = XCreateGC(st->dpy, st->window, 0, &st->gcv);
- st->gcv.foreground = get_pixel_resource(st->dpy, st->cmap,
- "background", "Background");
- st->gcClear = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
-
- if (st->dbuf) {
- if (!st->b) {
- st->ba = XCreatePixmap (st->dpy, st->window, st->scrWidth, st->scrHeight, wa.depth);
- st->bb = XCreatePixmap (st->dpy, st->window, st->scrWidth, st->scrHeight, wa.depth);
- st->b = st->ba;
- }
- }
- else
- st->b = st->window;
-
-
- if (st->ba) XFillRectangle (st->dpy, st->ba, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
- if (st->bb) XFillRectangle (st->dpy, st->bb, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
-
- st->ax = st->scrWidth / (double) st->max_dist;
- st->ay = st->scrHeight / (2. * st->max_dist);
- st->bx = 0.;
- st->by = 0.;
-
- if((st->dx = st->scrWidth / (2 * st->max_dist)) == 0)
- st->dx = 1;
- if((st->dy = st->scrHeight / (4 * st->max_dist)) == 0)
- st->dy = 1;
- XSetLineAttributes(st->dpy, st->gcDraw, st->dx / 3 + 1, LineSolid, CapRound, JoinRound);
- XClearWindow(st->dpy, st->window);
-
- return st;
-}
-
-static void draw_searcher(struct state *st, Drawable curr_window, int i)
-{
- Point r1, r2;
- PList *l;
-
- if(st->searcher[i] == NULL)
- return;
-
- XSetForeground(st->dpy, st->gcDraw, st->searcher[i]->color);
-
- r1.x = X(st->searcher[i]->r.x) + st->searcher[i]->rs;
- r1.y = Y(st->searcher[i]->r.y);
-
- XFillRectangle(st->dpy, curr_window, st->gcDraw, r1.x - 2, r1.y - 2, 4, 4);
-
- for(l = st->searcher[i]->hist; l != NULL; l = l->next) {
-
- r2.x = X(l->r.x) + st->searcher[i]->rs;
- r2.y = Y(l->r.y);
-
- XDrawLine(st->dpy, curr_window, st->gcDraw, r1.x, r1.y, r2.x, r2.y);
-
- r1 = r2;
- }
-
-}
-
-static void draw_image(struct state *st, Drawable curr_window)
-{
- int i, j;
- int x, y;
-
- for(i = 0; i < st->max_src; i++) {
-
- if(st->source[i] == NULL)
- continue;
-
- XSetForeground(st->dpy, st->gcDraw, st->source[i]->color);
-
- if(st->source[i]->inv_rate > 0) {
-
- if(st->max_searcher > 0) {
- x = (int) X(st->source[i]->r.x);
- y = (int) Y(st->source[i]->r.y);
- j = st->dx * (MAX_INV_RATE + 1 - st->source[i]->inv_rate) / (2 * MAX_INV_RATE);
- if(j == 0)
- j = 1;
- XFillArc(st->dpy, curr_window, st->gcDraw, x - j, y - j, 2 * j, 2 * j, 0, 360 * 64);
- }}
-
- for(j = 0; j < st->source[i]->n; j++) {
-
- int size = (st->scrWidth > 2560 ? 8 : 4); /* Retina displays */
-
- if(st->source[i]->yv[j].v == 2)
- continue;
-
- /* Move the particles slightly off lattice */
- x = X(st->source[i]->r.x + 1 + j) + RND(st->dx);
- y = Y(st->source[i]->r.y + st->source[i]->yv[j].y) + RND(st->dy);
- XFillArc(st->dpy, curr_window, st->gcDraw, x - size/2, y - size/2, size, size, 0, 360 * 64);
- }
-
- }
-
- for(i = 0; i < st->max_searcher; i++)
- draw_searcher(st, curr_window, i);
-
-}
-
-static void animate_anemotaxis(struct state *st, Drawable curr_window)
-{
- int i, j;
- Bool dead;
-
- for(i = 0; i < st->max_src; i++) {
-
- if(st->source[i] == NULL)
- continue;
-
- evolve_source(st->source[i]);
-
- /* reap dead sources for which all particles are gone */
- if(st->source[i]->inv_rate == 0) {
-
- dead = True;
-
- for(j = 0; j < st->source[i]->n; j++) {
- if(st->source[i]->yv[j].v != 2) {
- dead = False;
- break;
- }
- }
-
- if(dead == True) {
- destroy_source(st->source[i]);
- st->source[i] = NULL;
- }
- }
- }
-
- /* Decide if we want to add new sources */
-
- for(i = 0; i < st->max_src; i++) {
- if(st->source[i] == NULL && RND(st->max_dist * st->max_src) == 0)
- st->source[i] = new_source(st);
- }
-
- if(st->max_searcher == 0) { /* kill some sources when searchers don't do that */
- for(i = 0; i < st->max_src; i++) {
- if(st->source[i] != NULL && RND(st->max_dist * st->max_src) == 0) {
- destroy_source(st->source[i]);
- st->source[i] = 0;
- }
- }
- }
-
- /* Now deal with searchers */
-
- for(i = 0; i < st->max_searcher; i++) {
-
- if((st->searcher[i] != NULL) && (st->searcher[i]->state == DONE)) {
- destroy_searcher(st->searcher[i]);
- st->searcher[i] = NULL;
- }
-
- if(st->searcher[i] == NULL) {
-
- if(RND(st->max_dist * st->max_searcher) == 0) {
-
- st->searcher[i] = new_searcher(st);
-
- }
- }
-
- if(st->searcher[i] == NULL)
- continue;
-
- /* Check if searcher found a source or missed all of them */
- for(j = 0; j < st->max_src; j++) {
-
- if(st->source[j] == NULL || st->source[j]->inv_rate == 0)
- continue;
-
- if(st->searcher[i]->r.x < 0) {
- st->searcher[i]->state = DONE;
- break;
- }
-
- if((st->source[j]->r.y == st->searcher[i]->r.y) &&
- (st->source[j]->r.x == st->searcher[i]->r.x)) {
- st->searcher[i]->state = DONE;
- st->source[j]->inv_rate = 0; /* source disappears */
-
- /* Make it flash */
- st->searcher[i]->color = WhitePixel(st->dpy, DefaultScreen(st->dpy));
-
- break;
- }
- }
-
- st->searcher[i]->c = 0; /* set it here in case we don't get to get_v() */
-
- /* Find the concentration at searcher's location */
-
- if(st->searcher[i]->state != DONE) {
- for(j = 0; j < st->max_src; j++) {
-
- if(st->source[j] == NULL)
- continue;
-
- get_v(st->source[j], st->searcher[i]);
-
- if(st->searcher[i]->c == 1)
- break;
- }
- }
-
- move_searcher(st->searcher[i]);
-
- }
-
- draw_image(st, curr_window);
-}
-
-static unsigned long
-anemotaxis_draw (Display *disp, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XWindowAttributes wa;
- int w, h;
-
-
- XGetWindowAttributes(st->dpy, st->window, &wa);
-
- w = wa.width;
- h = wa.height;
-
- if(w != st->scrWidth || h != st->scrHeight) {
- st->scrWidth = w;
- st->scrHeight = h;
- st->ax = st->scrWidth / (double) st->max_dist;
- st->ay = st->scrHeight / (2. * st->max_dist);
- st->bx = 0.;
- st->by = 0.;
-
- if((st->dx = st->scrWidth / (2 * st->max_dist)) == 0)
- st->dx = 1;
- if((st->dy = st->scrHeight / (4 * st->max_dist)) == 0)
- st->dy = 1;
- XSetLineAttributes(st->dpy, st->gcDraw, st->dx / 3 + 1, LineSolid, CapRound, JoinRound);
- }
-
- XFillRectangle (st->dpy, st->b, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
- animate_anemotaxis(st, st->b);
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (st->backb) {
- XdbeSwapInfo info[1];
- info[0].swap_window = st->window;
- info[0].swap_action = XdbeUndefined;
- XdbeSwapBuffers (st->dpy, info, 1);
- }
- else
-#endif
- if (st->dbuf) {
- XCopyArea (st->dpy, st->b, st->window, st->gcClear, 0, 0,
- st->scrWidth, st->scrHeight, 0, 0);
- st->b = (st->b == st->ba ? st->bb : st->ba);
- }
-
- return st->delay;
-}
-
-
-
-static void
-anemotaxis_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static Bool
-anemotaxis_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-anemotaxis_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
- if (st->source) {
- for (i = 0; i < st->max_src; i++)
- if (st->source[i]) destroy_source (st->source[i]);
- free (st->source);
- }
- if (st->searcher) {
- for (i = 0; i < st->max_searcher; i++)
- if (st->searcher[i]) destroy_searcher (st->searcher[i]);
- free (st->searcher);
- }
- XFreeGC (dpy, st->gcDraw);
- XFreeGC (dpy, st->gcClear);
- free (st->colors);
- free (st);
-}
-
-
-
-
-static const char *anemotaxis_defaults [] = {
- ".background: black",
- "*distance: 40",
- "*sources: 25",
- "*searchers: 25",
- "*delay: 20000",
- "*colors: 20",
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- "*useDBE: True",
-#endif
- 0
-};
-
-
-static XrmOptionDescRec anemotaxis_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-distance", ".distance", XrmoptionSepArg, 0 },
- { "-sources", ".sources", XrmoptionSepArg, 0 },
- { "-searchers", ".searchers", XrmoptionSepArg, 0 },
- { "-colors", ".colors", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Anemotaxis", anemotaxis)
diff --git a/hacks/anemotaxis.man b/hacks/anemotaxis.man
deleted file mode 100644
index 7da9566..0000000
--- a/hacks/anemotaxis.man
+++ /dev/null
@@ -1,78 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-anemotaxis \- directional search on a plane.
-.SH SYNOPSIS
-.B anemotaxis
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-distance \fInumber\fP]
-[\-sources \fInumber\fP]
-[\-searchers \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-The program demonstrates a search algorithm designed for locating a
-source of odor in turbulent atmosphere. The odor is convected by wind
-which has a constant mean direction and fluctuations around it. The
-searcher is able to sense the odor and determine local instantaneous
-wind direction. The goal is to find the source in the shortest mean
-time. Some animals face this task to find mates, food, home etc. They
-exhibit very particular, zigzagging search trajectories.
-
-This is modeled as a search on a discrete two-dimensional lattice. The
-source releases particles that drift with constant velocity in one
-direction and walk randomly in the other direction. The searcher knows
-if it hit a particle, and if so, particle's position one time step
-earlier (local wind direction). The program paints sources and
-particles released by them as well as trajectories of searchers who are
-trying to capture the sources.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-distance \fInumber\fP
-Max initial distance to the source . 10 - 250. Default: 40.
-.TP 8
-.B \-sources \fInumber\fP
-Max number of sources. Default: 25.
-.TP 8
-.B \-searchers \fInumber\fP
-Max number of searchers. Default: 25.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2004 by Eugene Balkovsky. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Eugene Balkovsky
diff --git a/hacks/ant.c b/hacks/ant.c
deleted file mode 100644
index 56d3036..0000000
--- a/hacks/ant.c
+++ /dev/null
@@ -1,1350 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/*-
- * ant --- Chris Langton's generalized turing machine ants (also known
- * as Greg Turk's turmites) whose tape is the screen
- */
-
-#if 0
-static const char sccsid[] = "@(#)ant.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1995 by David Bagley.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 01-Nov-2000: Allocation checks
- * 10-May-1997: Compatible with xscreensaver
- * 16-Apr-1997: -neighbors 3 and 8 added
- * 01-Jan-1997: Updated ant.c to handle more kinds of ants. Thanks to
- * J Austin David <Austin.David@tlogic.com>. Check it out in
- * java at http://havoc.gtf.gatech.edu/austin He thought up the
- * new Ladder ant.
- * 04-Apr-1996: -neighbors 6 runtime-time option added for hexagonal ants
- * (bees), coded from an idea of Jim Propp's in Science News,
- * Oct 28, 1995 VOL. 148 page 287
- * 20-Sep-1995: Memory leak in ant fixed. Now random colors.
- * 05-Sep-1995: Coded from A.K. Dewdney's "Computer Recreations", Scientific
- * American Magazine" Sep 1989 pp 180-183, Mar 1990 p 121
- * Also used Ian Stewart's Mathematical Recreations, Scientific
- * American Jul 1994 pp 104-107
- * also used demon.c and life.c as a guide.
- */
-
-/*-
- Species Grid Number of Neighbors
- ------- ---- ------------------
- Ants Square 4 (or 8)
- Bees Hexagon 6
- Bees Triangle 3 (or 9, 12)
-
- Neighbors 6 and neighbors 3 produce the same Turk ants.
-*/
-
-#ifndef HAVE_JWXYZ
-/*# define DO_STIPPLE*/
-#endif
-
-#ifdef STANDALONE
-# define MODE_ant
-# define DEFAULTS "*delay: 20000 \n" \
- "*count: -3 \n" \
- "*cycles: 40000 \n" \
- "*size: -12 \n" \
- "*ncolors: 64 \n" \
- "*fpsSolid: true \n" \
-
-# define reshape_ant 0
-# define release_ant 0
-# define ant_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-#include "automata.h"
-
-#ifdef MODE_ant
-
-/*-
- * neighbors of 0 randomizes it for 3, 4, 6, 8, 12 (last 2 are less likely)
- */
-
-#define DEF_NEIGHBORS "0" /* choose random value */
-#define DEF_TRUCHET "False"
-#define DEF_EYES "False"
-#define DEF_SHARPTURN "False"
-
-static int neighbors;
-static Bool truchet;
-static Bool eyes;
-static Bool sharpturn;
-
-static XrmOptionDescRec opts[] =
-{
- {"-neighbors", ".ant.neighbors", XrmoptionSepArg, 0},
- {"-truchet", ".ant.truchet", XrmoptionNoArg, "on"},
- {"+truchet", ".ant.truchet", XrmoptionNoArg, "off"},
- {"-eyes", ".ant.eyes", XrmoptionNoArg, "on"},
- {"+eyes", ".ant.eyes", XrmoptionNoArg, "off"},
- {"-sharpturn", ".ant.sharpturn", XrmoptionNoArg, "on"},
- {"+sharpturn", ".ant.sharpturn", XrmoptionNoArg, "off"},
-};
-static argtype vars[] =
-{
- {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int},
- {&truchet, "truchet", "Truchet", DEF_TRUCHET, t_Bool},
- {&eyes, "eyes", "Eyes", DEF_EYES, t_Bool},
- {&sharpturn, "sharpturn", "SharpTurn", DEF_SHARPTURN, t_Bool},
-};
-static OptionStruct desc[] =
-{
- {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3 or 12"},
- {"-/+truchet", "turn on/off Truchet lines"},
- {"-/+eyes", "turn on/off eyes"},
- {"-/+sharpturn", "turn on/off sharp turns (6, 8 or 12 neighbors only)"}
-};
-
-ENTRYPOINT ModeSpecOpt ant_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-const ModStruct ant_description =
-{"ant",
- "init_ant", "draw_ant", (char *) NULL,
- "refresh_ant", "init_ant", "free_ant", &ant_opts,
- 1000, -3, 40000, -12, 64, 1.0, "",
- "Shows Langton's and Turk's generalized ants", 0, NULL};
-
-#endif
-
-#define ANTBITS(n,w,h)\
- if ((ap->pixmaps[ap->init_bits]=\
- XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1))==None){\
- free_ant(mi); return;} else {ap->init_bits++;}
-
-/* If you change the table you may have to change the following 2 constants */
-#define STATES 2
-#define MINANTS 1
-#define REDRAWSTEP 2000 /* How much tape to draw per cycle */
-#define MINGRIDSIZE 24
-#define MINSIZE 1
-#define MINRANDOMSIZE 5
-#define ANGLES 360
-
-typedef struct {
- unsigned char color;
- short direction;
- unsigned char next;
-} statestruct;
-
-typedef struct {
- int col, row;
- short direction;
- unsigned char state;
-} antstruct;
-
-typedef struct {
- Bool painted;
- int neighbors;
- int generation;
- int xs, ys;
- int xb, yb;
- int init_dir;
- int nrows, ncols;
- int width, height;
- unsigned char ncolors, nstates;
- int n;
- int redrawing, redrawpos;
- int truchet; /* Only for Turk modes */
- int eyes;
- int sharpturn;
- statestruct machine[NUMSTIPPLES * STATES];
- unsigned char *tape;
- unsigned char *truchet_state;
- antstruct *ants;
- int init_bits;
- unsigned char colors[NUMSTIPPLES - 1];
-# ifdef DO_STIPPLE
- GC stippledGC;
-# endif /* DO_STIPPLE */
- Pixmap pixmaps[NUMSTIPPLES - 1];
- union {
- XPoint hexagon[7]; /* Need more than 6 for truchet */
- XPoint triangle[2][4]; /* Need more than 3 for truchet */
- } shape;
-} antfarmstruct;
-
-static char plots[] =
-{3, 4, 6, 8,
-#ifdef NUMBER_9
- 9,
-#endif
- 12};
-
-#define NEIGHBORKINDS ((long) (sizeof plots / sizeof *plots))
-#define GOODNEIGHBORKINDS 3
-
-/* Relative ant moves */
-#define FS 0 /* Step */
-#define TRS 1 /* Turn right, then step */
-#define THRS 2 /* Turn hard right, then step */
-#define TBS 3 /* Turn back, then step */
-#define THLS 4 /* Turn hard left, then step */
-#define TLS 5 /* Turn left, then step */
-#define SF 6 /* Step */
-#define STR 7 /* Step then turn right */
-#define STHR 8 /* Step then turn hard right */
-#define STB 9 /* Step then turn back */
-#define STHL 10 /* Step then turn hard left */
-#define STL 11 /* Step then turn left */
-
-static antfarmstruct *antfarms = (antfarmstruct *) NULL;
-
-/* LANGTON'S ANT (10) Chaotic after 500, Builder after 10,000 (104p) */
-/* TURK'S 100 ANT Always chaotic?, tested past 150,000,000 */
-/* TURK'S 101 ANT Always chaotic? */
-/* TURK'S 110 ANT Builder at 150 (18p) */
-/* TURK'S 1000 ANT Always chaotic? */
-/* TURK'S 1100 SYMMETRIC ANT all even run 1's and 0's are symmetric */
-/* other examples 1001, 110011, 110000, 1001101 */
-/* TURK'S 1101 ANT Builder after 250,000 (388p) */
-/* Once saw a chess horse type builder (i.e. non-45 degree builder) */
-
-/* BEE ONLY */
-/* All alternating 10 appear symmetric, no proof (i.e. 10, 1010, etc) */
-/* Even runs of 0's and 1's are also symmetric */
-/* I have seen Hexagonal builders but they are more rare. */
-
-static unsigned char tables[][3 * NUMSTIPPLES * STATES + 2] =
-{
-#if 0
- /* Here just so you can figure out notation */
- { /* Langton's ant */
- 2, 1,
- 1, TLS, 0, 0, TRS, 0
- },
-#else
- /* First 2 numbers are the size (ncolors, nstates) */
- { /* LADDER BUILDER */
- 4, 1,
- 1, STR, 0, 2, STL, 0, 3, TRS, 0, 0, TLS, 0
- },
- { /* SPIRALING PATTERN */
- 2, 2,
- 1, TLS, 0, 0, FS, 1,
- 1, TRS, 0, 1, TRS, 0
- },
- { /* SQUARE (HEXAGON) BUILDER */
- 2, 2,
- 1, TLS, 0, 0, FS, 1,
- 0, TRS, 0, 1, TRS, 0
- },
-#endif
-};
-
-#define NTABLES (sizeof tables / sizeof tables[0])
-
-static void
-position_of_neighbor(antfarmstruct * ap, int dir, int *pcol, int *prow)
-{
- int col = *pcol, row = *prow;
-
- if (ap->neighbors == 6) {
- switch (dir) {
- case 0:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- break;
- case 60:
- if (!(row & 1))
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 120:
- if (row & 1)
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 180:
- col = (!col) ? ap->ncols - 1 : col - 1;
- break;
- case 240:
- if (row & 1)
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 300:
- if (!(row & 1))
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- default:
- (void) fprintf(stderr, "wrong direction %d\n", dir);
- }
- } else if (ap->neighbors == 4 || ap->neighbors == 8) {
- switch (dir) {
- case 0:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- break;
- case 45:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 90:
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 135:
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 180:
- col = (!col) ? ap->ncols - 1 : col - 1;
- break;
- case 225:
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 270:
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 315:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- default:
- (void) fprintf(stderr, "wrong direction %d\n", dir);
- }
- } else { /* TRI */
- if ((col + row) % 2) { /* right */
- switch (dir) {
- case 0:
- col = (!col) ? ap->ncols - 1 : col - 1;
- break;
- case 30:
- case 40:
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 60:
- col = (!col) ? ap->ncols - 1 : col - 1;
- if (!row)
- row = ap->nrows - 2;
- else if (!(row - 1))
- row = ap->nrows - 1;
- else
- row = row - 2;
- break;
- case 80:
- case 90:
- if (!row)
- row = ap->nrows - 2;
- else if (!(row - 1))
- row = ap->nrows - 1;
- else
- row = row - 2;
- break;
- case 120:
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 150:
- case 160:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 180:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- break;
- case 200:
- case 210:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 240:
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 270:
- case 280:
- if (row + 1 == ap->nrows)
- row = 1;
- else if (row + 2 == ap->nrows)
- row = 0;
- else
- row = row + 2;
- break;
- case 300:
- col = (!col) ? ap->ncols - 1 : col - 1;
- if (row + 1 == ap->nrows)
- row = 1;
- else if (row + 2 == ap->nrows)
- row = 0;
- else
- row = row + 2;
- break;
- case 320:
- case 330:
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- default:
- (void) fprintf(stderr, "wrong direction %d\n", dir);
- }
- } else { /* left */
- switch (dir) {
- case 0:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- break;
- case 30:
- case 40:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 60:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- if (row + 1 == ap->nrows)
- row = 1;
- else if (row + 2 == ap->nrows)
- row = 0;
- else
- row = row + 2;
- break;
- case 80:
- case 90:
- if (row + 1 == ap->nrows)
- row = 1;
- else if (row + 2 == ap->nrows)
- row = 0;
- else
- row = row + 2;
- break;
- case 120:
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 150:
- case 160:
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (row + 1 == ap->nrows) ? 0 : row + 1;
- break;
- case 180:
- col = (!col) ? ap->ncols - 1 : col - 1;
- break;
- case 200:
- case 210:
- col = (!col) ? ap->ncols - 1 : col - 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 240:
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- case 270:
- case 280:
- if (!row)
- row = ap->nrows - 2;
- else if (row == 1)
- row = ap->nrows - 1;
- else
- row = row - 2;
- break;
- case 300:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- if (!row)
- row = ap->nrows - 2;
- else if (row == 1)
- row = ap->nrows - 1;
- else
- row = row - 2;
- break;
- case 320:
- case 330:
- col = (col + 1 == ap->ncols) ? 0 : col + 1;
- row = (!row) ? ap->nrows - 1 : row - 1;
- break;
- default:
- (void) fprintf(stderr, "wrong direction %d\n", dir);
- }
- }
- }
- *pcol = col;
- *prow = row;
-}
-
-static void
-fillcell(ModeInfo * mi, GC gc, int col, int row)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
-
- if (ap->neighbors == 6) {
- int ccol = 2 * col + !(row & 1), crow = 2 * row;
-
- ap->shape.hexagon[0].x = ap->xb + ccol * ap->xs;
- ap->shape.hexagon[0].y = ap->yb + crow * ap->ys;
- if (ap->xs == 1 && ap->ys == 1)
- XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ap->shape.hexagon[0].x, ap->shape.hexagon[0].y);
- else
- XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ap->shape.hexagon, 6, Convex, CoordModePrevious);
- } else if (ap->neighbors == 4 || ap->neighbors == 8) {
- XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ap->xb + ap->xs * col, ap->yb + ap->ys * row,
- ap->xs - (ap->xs > 3), ap->ys - (ap->ys > 3));
- } else { /* TRI */
- int orient = (col + row) % 2; /* O left 1 right */
-
- ap->shape.triangle[orient][0].x = ap->xb + col * ap->xs;
- ap->shape.triangle[orient][0].y = ap->yb + row * ap->ys;
- if (ap->xs <= 3 || ap->ys <= 3)
- XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ((orient) ? -1 : 1) + ap->shape.triangle[orient][0].x,
- ap->shape.triangle[orient][0].y);
- else {
- if (orient)
- ap->shape.triangle[orient][0].x += (ap->xs / 2 - 1);
- else
- ap->shape.triangle[orient][0].x -= (ap->xs / 2 - 1);
- XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ap->shape.triangle[orient], 3, Convex, CoordModePrevious);
- }
- }
-}
-
-static void
-truchetcell(ModeInfo * mi, int col, int row, int truchetstate)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
-
- if (ap->neighbors == 6) {
-
- int ccol = 2 * col + !(row & 1), crow = 2 * row;
- int side;
- int fudge = 7; /* fudge because the hexagons are not exact */
- XPoint hex, hex2;
-
- if (ap->sharpturn) {
- hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs / 2.0) - 1;
- hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys / 2.0) - 1;
- for (side = 0; side < 6; side++) {
- if (side) {
- hex.x += ap->shape.hexagon[side].x;
- hex.y += ap->shape.hexagon[side].y;
- }
- if (truchetstate == side % 2)
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- hex.x, hex.y, ap->xs, ap->ys,
- ((570 - (side * 60) + fudge) % 360) * 64, (120 - 2 * fudge) * 64);
- }
- } else {
- /* Very crude approx of Sqrt 3, so it will not cause drawing errors. */
- hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs * 1.6 / 2.0) - 1;
- hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys * 1.6 / 2.0) - 1;
- for (side = 0; side < 6; side++) {
- if (side) {
- hex.x += ap->shape.hexagon[side].x;
- hex.y += ap->shape.hexagon[side].y;
- }
- hex2.x = hex.x + ap->shape.hexagon[side + 1].x / 2;
- hex2.y = hex.y + ap->shape.hexagon[side + 1].y / 2 + 1;
- /* Lots of fudging here */
- if (side == 1) {
- hex2.x += (short) (ap->xs * 0.1 + 1);
- hex2.y += (short) (ap->ys * 0.1 - ((ap->ys > 5) ? 1 : 0));
- } else if (side == 2) {
- hex2.x += (short) (ap->xs * 0.1);
- } else if (side == 4) {
- hex2.x += (short) (ap->xs * 0.1);
- hex2.y += (short) (ap->ys * 0.1 - 1);
- } else if (side == 5) {
- hex2.x += (short) (ap->xs * 0.5);
- hex2.y += (short) (-ap->ys * 0.3 + 1);
- }
- if (truchetstate == side % 3)
- /* Crude approx of 120 deg, so it will not cause drawing errors. */
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- hex2.x, hex2.y,
- (int) ((double) ap->xs * 1.5), (int) ((double) ap->ys * 1.5),
- ((555 - (side * 60)) % 360) * 64, 90 * 64);
- }
- }
- } else if (ap->neighbors == 4) {
- if (truchetstate) {
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ap->xb + ap->xs * col - ap->xs / 2 + 1,
- ap->yb + ap->ys * row + ap->ys / 2 - 1,
- ap->xs - 2, ap->ys - 2,
- 0 * 64, 90 * 64);
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ap->xb + ap->xs * col + ap->xs / 2 - 1,
- ap->yb + ap->ys * row - ap->ys / 2 + 1,
- ap->xs - 2, ap->ys - 2,
- -90 * 64, -90 * 64);
- } else {
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ap->xb + ap->xs * col - ap->xs / 2 + 1,
- ap->yb + ap->ys * row - ap->ys / 2 + 1,
- ap->xs - 2, ap->ys - 2,
- 0 * 64, -90 * 64);
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ap->xb + ap->xs * col + ap->xs / 2 - 1,
- ap->yb + ap->ys * row + ap->ys / 2 - 1,
- ap->xs - 2, ap->ys - 2,
- 90 * 64, 90 * 64);
- }
- } else if (ap->neighbors == 3) {
- int orient = (col + row) % 2; /* O left 1 right */
- int side, ang;
- int fudge = 7; /* fudge because the triangles are not exact */
- double fudge2 = 1.18;
- XPoint tri;
-
- tri.x = ap->xb + col * ap->xs;
- tri.y = ap->yb + row * ap->ys;
- if (orient) {
- tri.x += (ap->xs / 2 - 1);
- } else {
- tri.x -= (ap->xs / 2 - 1);
- }
- for (side = 0; side < 3; side++) {
- if (side > 0) {
- tri.x += ap->shape.triangle[orient][side].x;
- tri.y += ap->shape.triangle[orient][side].y;
- }
- if (truchetstate == side) {
- if (orient)
- ang = (510 - side * 120) % 360; /* Right */
- else
- ang = (690 - side * 120) % 360; /* Left */
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- (int) (tri.x - ap->xs * fudge2 / 2),
- (int) (tri.y - 3 * ap->ys * fudge2 / 4),
- (unsigned int) (ap->xs * fudge2),
- (unsigned int) (3 * ap->ys * fudge2 / 2),
- (ang + fudge) * 64, (60 - 2 * fudge) * 64);
- }
- }
- }
-}
-
-static void
-drawcell(ModeInfo * mi, int col, int row, unsigned char color)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
- GC gc;
-
- if (!color) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- gc = MI_GC(mi);
-# ifdef DO_STIPPLE
- } else if (MI_NPIXELS(mi) <= 2) {
- XGCValues gcv;
- gcv.foreground = MI_WHITE_PIXEL(mi);
- gcv.background = MI_BLACK_PIXEL(mi);
- gcv.stipple = ap->pixmaps[color - 1];
- XChangeGC(MI_DISPLAY(mi), ap->stippledGC,
- GCStipple | GCForeground | GCBackground, &gcv);
- gc = ap->stippledGC;
-# endif /* !DO_STIPPLE */
- } else {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_PIXEL(mi, ap->colors[color - 1]));
- gc = MI_GC(mi);
- }
- fillcell(mi, gc, col, row);
-}
-
-static void
-drawtruchet(ModeInfo * mi, int col, int row,
- unsigned char color, unsigned char truchetstate)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
-
- if (!color)
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
- else if (MI_NPIXELS(mi) > 2 || color > ap->ncolors / 2)
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- else
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
- truchetcell(mi, col, row, truchetstate);
-}
-
-static void
-draw_anant(ModeInfo * mi, int direction, int col, int row)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
- fillcell(mi, MI_GC(mi), col, row);
- if (ap->eyes) { /* Draw Eyes */
- XSetForeground(display, MI_GC(mi), MI_BLACK_PIXEL(mi));
- if (ap->neighbors == 6) {
- int ccol = 2 * col + !(row & 1), crow = 2 * row;
- int side, ang;
- XPoint hex;
-
- if (!(ap->xs > 3 && ap->ys > 3))
- return;
- hex.x = ap->xb + ccol * ap->xs;
- hex.y = ap->yb + crow * ap->ys + ap->ys / 2;
- ang = direction * ap->neighbors / ANGLES;
- for (side = 0; side < ap->neighbors; side++) {
- if (side) {
- hex.x -= ap->shape.hexagon[side].x / 2;
- hex.y += ap->shape.hexagon[side].y / 2;
- }
- if (side == (ap->neighbors + ang - 2) % ap->neighbors)
- XDrawPoint(display, window, MI_GC(mi), hex.x, hex.y);
- if (side == (ap->neighbors + ang - 1) % ap->neighbors)
- XDrawPoint(display, window, MI_GC(mi), hex.x, hex.y);
- }
- } else if (ap->neighbors == 4 || ap->neighbors == 8) {
- if (!(ap->xs > 3 && ap->ys > 3))
- return;
- switch (direction) {
- case 0:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * (col + 1) - 3,
- ap->yb + ap->ys * row + ap->ys / 2 - 2);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * (col + 1) - 3,
- ap->yb + ap->ys * row + ap->ys / 2);
- break;
- case 45:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * (col + 1) - 4,
- ap->yb + ap->ys * row + 1);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * (col + 1) - 3,
- ap->yb + ap->ys * row + 2);
- break;
- case 90:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + ap->xs / 2 - 2,
- ap->yb + ap->ys * row + 1);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + ap->xs / 2,
- ap->yb + ap->ys * row + 1);
- break;
- case 135:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + 2,
- ap->yb + ap->ys * row + 1);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + 1,
- ap->yb + ap->ys * row + 2);
- break;
- case 180:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + 1,
- ap->yb + ap->ys * row + ap->ys / 2 - 2);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + 1,
- ap->yb + ap->ys * row + ap->ys / 2);
- break;
- case 225:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + 2,
- ap->yb + ap->ys * (row + 1) - 3);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + 1,
- ap->yb + ap->ys * (row + 1) - 4);
- break;
- case 270:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + ap->xs / 2 - 2,
- ap->yb + ap->ys * (row + 1) - 3);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * col + ap->xs / 2,
- ap->yb + ap->ys * (row + 1) - 3);
- break;
- case 315:
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * (col + 1) - 4,
- ap->yb + ap->ys * (row + 1) - 3);
- XDrawPoint(display, window, MI_GC(mi),
- ap->xb + ap->xs * (col + 1) - 3,
- ap->yb + ap->ys * (row + 1) - 4);
- break;
- default:
- (void) fprintf(stderr, "wrong eyes direction %d for ant eyes\n", direction);
- }
- } else { /* TRI */
- int orient = (col + row) % 2; /* O left 1 right */
- int side, ang;
- XPoint tri;
-
- if (!(ap->xs > 6 && ap->ys > 6))
- return;
- tri.x = ap->xb + col * ap->xs;
- tri.y = ap->yb + row * ap->ys;
- if (orient)
- tri.x += (ap->xs / 6 - 1);
- else
- tri.x -= (ap->xs / 6 - 1);
- ang = direction * ap->neighbors / ANGLES;
- /* approx... does not work that well for even numbers */
- if (
-#ifdef NUMBER_9
- ap->neighbors == 9 ||
-#endif
- ap->neighbors == 12) {
-#ifdef UNDER_CONSTRUCTION
- /* Not sure why this does not work */
- ang = ((ang + ap->neighbors / 6) / (ap->neighbors / 3)) % 3;
-#else
- return;
-#endif
- }
- for (side = 0; side < 3; side++) {
- if (side) {
- tri.x += ap->shape.triangle[orient][side].x / 3;
- tri.y += ap->shape.triangle[orient][side].y / 3;
- }
- /* Either you have the eyes in back or one eye in front */
-#if 0
- if (side == ang)
- XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
-#else
- if (side == (ang + 2) % 3)
- XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
- if (side == (ang + 1) % 3)
- XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
-#endif
- }
- }
- }
-}
-
-#if 0
-static void
-RandomSoup(mi)
- ModeInfo *mi;
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
- int row, col, mrow = 0;
-
- for (row = 0; row < ap->nrows; ++row) {
- for (col = 0; col < ap->ncols; ++col) {
- ap->old[col + mrow] = (unsigned char) NRAND((int) ap->ncolors);
- drawcell(mi, col, row, ap->old[col + mrow]);
- }
- mrow += ap->nrows;
- }
-}
-
-#endif
-
-static short
-fromTableDirection(unsigned char dir, int local_neighbors)
-{
- /* Crafted to work for odd number of neighbors */
- switch (dir) {
- case FS:
- return 0;
- case TLS:
- return (ANGLES / local_neighbors);
- case THLS:
- return (2 * ANGLES / local_neighbors);
- case TBS:
- return ((local_neighbors / 2) * ANGLES / local_neighbors);
- case THRS:
- return (ANGLES - 2 * ANGLES / local_neighbors);
- case TRS:
- return (ANGLES - ANGLES / local_neighbors);
- case SF:
- return ANGLES;
- case STL:
- return (ANGLES + ANGLES / local_neighbors);
- case STHL:
- return (ANGLES + 2 * ANGLES / local_neighbors);
- case STB:
- return (ANGLES + (local_neighbors / 2) * ANGLES / local_neighbors);
- case STHR:
- return (2 * ANGLES - 2 * ANGLES / local_neighbors);
- case STR:
- return (2 * ANGLES - ANGLES / local_neighbors);
- default:
- (void) fprintf(stderr, "wrong direction %d from table\n", dir);
- }
- return -1;
-}
-
-static void
-getTable(ModeInfo * mi, int i)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
- int j, total;
- unsigned char *patptr;
-
- patptr = &tables[i][0];
- ap->ncolors = *patptr++;
- ap->nstates = *patptr++;
- total = ap->ncolors * ap->nstates;
- if (MI_IS_VERBOSE(mi))
- (void) fprintf(stdout,
- "ants %d, neighbors %d, table number %d, colors %d, states %d\n",
- ap->n, ap->neighbors, i, ap->ncolors, ap->nstates);
- for (j = 0; j < total; j++) {
- ap->machine[j].color = *patptr++;
- if (ap->sharpturn && ap->neighbors > 4) {
- int k = *patptr++;
-
- switch (k) {
- case TRS:
- k = THRS;
- break;
- case THRS:
- k = TRS;
- break;
- case THLS:
- k = TLS;
- break;
- case TLS:
- k = THLS;
- break;
- case STR:
- k = STHR;
- break;
- case STHR:
- k = STR;
- break;
- case STHL:
- k = STL;
- break;
- case STL:
- k = STHL;
- break;
- default:
- break;
- }
- ap->machine[j].direction = fromTableDirection(k, ap->neighbors);
- } else {
- ap->machine[j].direction = fromTableDirection(*patptr++, ap->neighbors);
- }
- ap->machine[j].next = *patptr++;
- }
- ap->truchet = False;
-}
-
-static void
-getTurk(ModeInfo * mi, int i)
-{
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
- int power2, j, number, total;
-
- /* To force a number, say <i = 2;> has i + 2 (or 4) binary digits */
- power2 = 1 << (i + 1);
- /* Do not want numbers which in binary are all 1's. */
- number = NRAND(power2 - 1) + power2;
- /* To force a particular number, say <number = 10;> */
-
- ap->ncolors = i + 2;
- ap->nstates = 1;
- total = ap->ncolors * ap->nstates;
- for (j = 0; j < total; j++) {
- ap->machine[j].color = (j + 1) % total;
- if (ap->sharpturn && ap->neighbors > 4) {
- ap->machine[j].direction = (power2 & number) ?
- fromTableDirection(THRS, ap->neighbors) :
- fromTableDirection(THLS, ap->neighbors);
- } else {
- ap->machine[j].direction = (power2 & number) ?
- fromTableDirection(TRS, ap->neighbors) :
- fromTableDirection(TLS, ap->neighbors);
- }
- ap->machine[j].next = 0;
- power2 >>= 1;
- }
- ap->truchet = (ap->truchet && ap->xs > 2 && ap->ys > 2 &&
- (ap->neighbors == 3 || ap->neighbors == 4 || ap->neighbors == 6));
- if (MI_IS_VERBOSE(mi))
- (void) fprintf(stdout,
- "ants %d, neighbors %d, Turk's number %d, colors %d\n",
- ap->n, ap->neighbors, number, ap->ncolors);
-}
-
-ENTRYPOINT void
-free_ant(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
- int shade;
-
-#ifdef DO_STIPPLE
- if (ap->stippledGC != None) {
- XFreeGC(display, ap->stippledGC);
- ap->stippledGC = None;
- }
-#endif /* DO_STIPPLE */
- for (shade = 0; shade < ap->init_bits; shade++) {
- XFreePixmap(display, ap->pixmaps[shade]);
- }
- ap->init_bits = 0;
- if (ap->tape != NULL) {
- (void) free((void *) ap->tape);
- ap->tape = (unsigned char *) NULL;
- }
- if (ap->ants != NULL) {
- (void) free((void *) ap->ants);
- ap->ants = (antstruct *) NULL;
- }
- if (ap->truchet_state != NULL) {
- (void) free((void *) ap->truchet_state);
- ap->truchet_state = (unsigned char *) NULL;
- }
-}
-
-ENTRYPOINT void
-init_ant(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- int size = MI_SIZE(mi);
- antfarmstruct *ap;
- int col, row, dir;
- int i;
-
- MI_INIT(mi, antfarms);
- /*if (antfarms == NULL) {
- if ((antfarms = (antfarmstruct *) calloc(MI_NUM_SCREENS(mi),
- sizeof (antfarmstruct))) == NULL)
- return;
- }*/
- ap = &antfarms[MI_SCREEN(mi)];
-
- ap->redrawing = 0;
-#ifdef DO_STIPPLE
- if (MI_NPIXELS(mi) <= 2) {
- Window window = MI_WINDOW(mi);
- if (ap->stippledGC == None) {
- XGCValues gcv;
-
- gcv.fill_style = FillOpaqueStippled;
- if ((ap->stippledGC = XCreateGC(display, window,
- GCFillStyle,
- &gcv)) == None) {
- free_ant(mi);
- return;
- }
- }
- if (ap->init_bits == 0) {
- for (i = 1; i < NUMSTIPPLES; i++) {
- ANTBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
- }
- }
- }
-#endif /* DO_STIPPLE */
- ap->generation = 0;
- ap->n = MI_COUNT(mi);
- if (ap->n < -MINANTS) {
- /* if ap->n is random ... the size can change */
- if (ap->ants != NULL) {
- (void) free((void *) ap->ants);
- ap->ants = (antstruct *) NULL;
- }
- ap->n = NRAND(-ap->n - MINANTS + 1) + MINANTS;
- } else if (ap->n < MINANTS)
- ap->n = MINANTS;
-
- ap->width = MI_WIDTH(mi);
- ap->height = MI_HEIGHT(mi);
-
- for (i = 0; i < NEIGHBORKINDS; i++) {
- if (neighbors == plots[i]) {
- ap->neighbors = plots[i];
- break;
- }
- if (i == NEIGHBORKINDS - 1) {
- if (!NRAND(10)) {
- /* Make above 6 rare */
- ap->neighbors = plots[NRAND(NEIGHBORKINDS)];
- } else {
- ap->neighbors = plots[NRAND(GOODNEIGHBORKINDS)];
- }
- break;
- }
- }
-
- if (ap->neighbors == 6) {
- int nccols, ncrows;
-
- if (ap->width < 8)
- ap->width = 8;
- if (ap->height < 8)
- ap->height = 8;
- if (size < -MINSIZE) {
- ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
- MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
- if (ap->ys < MINRANDOMSIZE)
- ap->ys = MIN(MINRANDOMSIZE,
- MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
- } else if (size < MINSIZE) {
- if (!size)
- ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
- else
- ap->ys = MINSIZE;
- } else
- ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
- MINGRIDSIZE));
- ap->xs = ap->ys;
- nccols = MAX(ap->width / ap->xs - 2, 2);
- ncrows = MAX(ap->height / ap->ys - 1, 4);
- ap->ncols = nccols / 2;
- ap->nrows = 2 * (ncrows / 4);
- ap->xb = (ap->width - ap->xs * nccols) / 2 + ap->xs / 2;
- ap->yb = (ap->height - ap->ys * (ncrows / 2) * 2) / 2 + ap->ys - 2;
- for (i = 0; i < 6; i++) {
- ap->shape.hexagon[i].x = (ap->xs - 1) * hexagonUnit[i].x;
- ap->shape.hexagon[i].y = ((ap->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
- }
- /* Avoid array bounds read of hexagonUnit */
- ap->shape.hexagon[6].x = 0;
- ap->shape.hexagon[6].y = 0;
- } else if (ap->neighbors == 4 || ap->neighbors == 8) {
- if (size < -MINSIZE) {
- ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
- MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
- if (ap->ys < MINRANDOMSIZE)
- ap->ys = MIN(MINRANDOMSIZE,
- MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
- } else if (size < MINSIZE) {
- if (!size)
- ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
- else
- ap->ys = MINSIZE;
- } else
- ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
- MINGRIDSIZE));
- ap->xs = ap->ys;
- ap->ncols = MAX(ap->width / ap->xs, 2);
- ap->nrows = MAX(ap->height / ap->ys, 2);
- ap->xb = (ap->width - ap->xs * ap->ncols) / 2;
- ap->yb = (ap->height - ap->ys * ap->nrows) / 2;
- } else { /* TRI */
- int orient;
-
- if (ap->width < 2)
- ap->width = 2;
- if (ap->height < 2)
- ap->height = 2;
- if (size < -MINSIZE) {
- ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
- MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
- if (ap->ys < MINRANDOMSIZE)
- ap->ys = MIN(MINRANDOMSIZE,
- MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
- } else if (size < MINSIZE) {
- if (!size)
- ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
- else
- ap->ys = MINSIZE;
- } else
- ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
- MINGRIDSIZE));
- ap->xs = (int) (1.52 * ap->ys);
- ap->ncols = (MAX(ap->width / ap->xs - 1, 2) / 2) * 2;
- ap->nrows = (MAX(ap->height / ap->ys - 1, 2) / 2) * 2;
- ap->xb = (ap->width - ap->xs * ap->ncols) / 2 + ap->xs / 2;
- ap->yb = (ap->height - ap->ys * ap->nrows) / 2 + ap->ys;
- for (orient = 0; orient < 2; orient++) {
- for (i = 0; i < 3; i++) {
- ap->shape.triangle[orient][i].x =
- (ap->xs - 2) * triangleUnit[orient][i].x;
- ap->shape.triangle[orient][i].y =
- (ap->ys - 2) * triangleUnit[orient][i].y;
- }
- /* Avoid array bounds read of triangleUnit */
- ap->shape.triangle[orient][3].x = 0;
- ap->shape.triangle[orient][3].y = 0;
- }
- }
-
- XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinMiter);
- MI_CLEARWINDOW(mi);
- ap->painted = False;
-
- if (MI_IS_FULLRANDOM(mi)) {
- ap->truchet = (Bool) (LRAND() & 1);
- ap->eyes = (Bool) (LRAND() & 1);
- ap->sharpturn = (Bool) (LRAND() & 1);
- } else {
- ap->truchet = truchet;
- ap->eyes = eyes;
- ap->sharpturn = sharpturn;
- }
- if (!NRAND(NUMSTIPPLES)) {
- getTable(mi, (int) (NRAND(NTABLES)));
- } else
- getTurk(mi, (int) (NRAND(NUMSTIPPLES - 1)));
- if (MI_NPIXELS(mi) > 2)
- for (i = 0; i < (int) ap->ncolors - 1; i++)
- ap->colors[i] = (unsigned char) (NRAND(MI_NPIXELS(mi)) +
- i * MI_NPIXELS(mi)) / ((int) (ap->ncolors - 1));
- if (ap->ants == NULL) {
- if ((ap->ants = (antstruct *) malloc(ap->n * sizeof (antstruct))) ==
- NULL) {
- free_ant(mi);
- return;
- }
- }
- if (ap->tape != NULL)
- (void) free((void *) ap->tape);
- if ((ap->tape = (unsigned char *) calloc(ap->ncols * ap->nrows,
- sizeof (unsigned char))) == NULL) {
- free_ant(mi);
- return;
- }
- if (ap->truchet_state != NULL)
- (void) free((void *) ap->truchet_state);
- if ((ap->truchet_state = (unsigned char *) calloc(ap->ncols * ap->nrows,
- sizeof (unsigned char))) == NULL) {
- free_ant(mi);
- return;
- }
-
- row = ap->nrows / 2;
- col = ap->ncols / 2;
- if (col > 0 && ((ap->neighbors % 2) || ap->neighbors == 12) && (LRAND() & 1))
- col--;
- dir = NRAND(ap->neighbors) * ANGLES / ap->neighbors;
- ap->init_dir = dir;
-#ifdef NUMBER_9
- if (ap->neighbors == 9 && !((col + row) & 1))
- dir = (dir + ANGLES - ANGLES / (ap->neighbors * 2)) % ANGLES;
-#endif
- /* Have them all start in the same spot, why not? */
- for (i = 0; i < ap->n; i++) {
- ap->ants[i].col = col;
- ap->ants[i].row = row;
- ap->ants[i].direction = dir;
- ap->ants[i].state = 0;
- }
- draw_anant(mi, dir, col, row);
-}
-
-ENTRYPOINT void
-draw_ant(ModeInfo * mi)
-{
- antstruct *anant;
- statestruct *status;
- int i, state_pos, tape_pos;
- unsigned char color;
- short chg_dir, old_dir;
- antfarmstruct *ap;
-
- if (antfarms == NULL)
- return;
- ap = &antfarms[MI_SCREEN(mi)];
- if (ap->ants == NULL)
- return;
-
- MI_IS_DRAWN(mi) = True;
- ap->painted = True;
- for (i = 0; i < ap->n; i++) {
- anant = &ap->ants[i];
- tape_pos = anant->col + anant->row * ap->ncols;
- color = ap->tape[tape_pos]; /* read tape */
- state_pos = color + anant->state * ap->ncolors;
- status = &(ap->machine[state_pos]);
- drawcell(mi, anant->col, anant->row, status->color);
- ap->tape[tape_pos] = status->color; /* write on tape */
-
- /* Find direction of Bees or Ants. */
- /* Translate relative direction to actual direction */
- old_dir = anant->direction;
- chg_dir = (2 * ANGLES - status->direction) % ANGLES;
- anant->direction = (chg_dir + old_dir) % ANGLES;
- if (ap->truchet) {
- int a = 0, b;
-
- if (ap->neighbors == 6) {
- if (ap->sharpturn) {
- a = (((ANGLES + anant->direction - old_dir) % ANGLES) == 240);
- /* should be some way of getting rid of the init_dir dependency... */
- b = !(ap->init_dir % 120);
- a = ((a && !b) || (b && !a));
- drawtruchet(mi, anant->col, anant->row, status->color, a);
- } else {
- a = (old_dir / 60) % 3;
- b = (anant->direction / 60) % 3;
- a = (a + b + 1) % 3;
- drawtruchet(mi, anant->col, anant->row, status->color, a);
- }
- } else if (ap->neighbors == 4) {
- a = old_dir / 180;
- b = anant->direction / 180;
- a = ((a && !b) || (b && !a));
- drawtruchet(mi, anant->col, anant->row, status->color, a);
- } else if (ap->neighbors == 3) {
- if (chg_dir == 240)
- a = (2 + anant->direction / 120) % 3;
- else
- a = (1 + anant->direction / 120) % 3;
- drawtruchet(mi, anant->col, anant->row, status->color, a);
- }
- ap->truchet_state[tape_pos] = a + 1;
- }
- anant->state = status->next;
-
- /* Allow step first and turn */
- old_dir = ((status->direction < ANGLES) ? anant->direction : old_dir);
-#if DEBUG
- (void) printf("old_dir %d, col %d, row %d", old_dir, anant->col, anant->row);
-#endif
- position_of_neighbor(ap, old_dir, &(anant->col), &(anant->row));
-#if DEBUG
- (void) printf(", ncol %d, nrow %d\n", anant->col, anant->row);
-#endif
- draw_anant(mi, anant->direction, anant->col, anant->row);
- }
- if (++ap->generation > MI_CYCLES(mi)) {
- init_ant(mi);
- }
- if (ap->redrawing) {
- for (i = 0; i < REDRAWSTEP; i++) {
- if (ap->tape[ap->redrawpos] ||
- (ap->truchet && ap->truchet_state[ap->redrawpos])) {
- drawcell(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
- ap->tape[ap->redrawpos]);
- if (ap->truchet)
- drawtruchet(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
- ap->tape[ap->redrawpos],
- ap->truchet_state[ap->redrawpos] - 1);
- }
- if (++(ap->redrawpos) >= ap->ncols * ap->nrows) {
- ap->redrawing = 0;
- break;
- }
- }
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_ant(ModeInfo * mi)
-{
- antfarmstruct *ap;
-
- if (antfarms == NULL)
- return;
- ap = &antfarms[MI_SCREEN(mi)];
-
- if (ap->painted) {
- MI_CLEARWINDOW(mi);
- ap->redrawing = 1;
- ap->redrawpos = 0;
- }
-}
-#endif
-
-XSCREENSAVER_MODULE ("Ant", ant)
-
-#endif /* MODE_ant */
diff --git a/hacks/ant.man b/hacks/ant.man
deleted file mode 100644
index aa006b6..0000000
--- a/hacks/ant.man
+++ /dev/null
@@ -1,96 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-ant \- cellular automaton.
-.SH SYNOPSIS
-.B ant
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-install]
-[\-noinstall]
-[\-root]
-[\-eyes]
-[\-no-eyes]
-[\-truchet]
-[\-no-truchet]
-[\-sharpturn]
-[\-no-sharpturn]
-[\-delay \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-count \fInumber\fP]
-[\-size \fInumber\fP]
-[\-neighbors 3]
-[\-neighbors 4]
-[\-neighbors 6]
-[\-neighbors 9]
-[\-neighbors 12]
-[\-ncolors \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-A cellular automaton that is really a two-dimensional Turing machine: as
-the heads ("ants") walk along the screen, they change pixel values in
-their path. Then, as they pass over changed pixels, their behavior is
-influenced.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-sharpturns | \-no-sharpturns
-Whether to do sharp turns.
-.TP 8
-.B \-truchet | \-no-truchet
-Whether to use truchet lines.
-.TP 8
-.B \-eyes | \-no-eyes
-Whether to draw eyes on the ants.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 1000 (0.0001 seconds.).
-.TP 8
-.B \-cycles \fInumber\fP
-How long to wait until resetting. 0 - 800000. Default: 40000.
-.TP 8
-.B \-count \fInumber\fP
-Ants Count. -20 - 20. Default: -3.
-.TP 8
-.B \-size \fInumber\fP
-Ant Size. -18 - 18. Default: -12.
-.TP 8
-.B \-neighbors \fIN\fP
-How many neighbors each cell has. Legal values are 3, 4, 6, 9, and 12.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of colors. Default: 64.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-David Bagley.
diff --git a/hacks/apollonian.c b/hacks/apollonian.c
deleted file mode 100644
index 782b41c..0000000
--- a/hacks/apollonian.c
+++ /dev/null
@@ -1,819 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* apollonian --- Apollonian Circles */
-
-#if 0
-static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 2000, 2001 by Allan R. Wilks <allan@research.att.com>.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * radius r = 1 / c (curvature)
- *
- * Descartes Circle Theorem: (a, b, c, d are curvatures of tangential circles)
- * Let a, b, c, d be the curvatures of for mutually (externally) tangent
- * circles in the plane. Then
- * a^2 + b^2 + c^2 + d^2 = (a + b + c + d)^2 / 2
- *
- * Complex Descartes Theorem: If the oriented curvatues and (complex) centers
- * of an oriented Descrates configuration in the plane are a, b, c, d and
- * w, x, y, z respectively, then
- * a^2*w^2 + b^2*x^2 + c^2*y^2 + d^2*z^2 = (aw + bx + cy + dz)^2 / 2
- * In addition these quantities satisfy
- * a^2*w + b^2*x + c^2*y + d^2*z = (aw + bx + cy + dz)(a + b + c + d) / 2
- *
- * Enumerate root integer Descartes quadruples (a,b,c,d) satisfying the
- * Descartes condition:
- * 2(a^2+b^2+c^2+d^2) = (a+b+c+d)^2
- * i.e., quadruples for which no application of the "pollinate" operator
- * z <- 2(a+b+c+d) - 3*z,
- * where z is in {a,b,c,d}, gives a quad of strictly smaller sum. This
- * is equivalent to the condition:
- * sum(a,b,c,d) >= 2*max(a,b,c,d)
- * which, because of the Descartes condition, is equivalent to
- * sum(a^2,b^2,c^2,d^2) >= 2*max(a,b,c,d)^2
- *
- *
- * Revision History:
- * 25-Jun-2001: Converted from C and Postscript code by David Bagley
- * Original code by Allan R. Wilks <allan@research.att.com>.
- *
- * From Circle Math Science News April 21, 2001 VOL. 254-255
- * http://www.sciencenews.org/20010421/toc.asp
- * Apollonian Circle Packings Assorted papers from Ronald L Graham,
- * Jeffrey Lagarias, Colin Mallows, Allan Wilks, Catherine Yan
- * http://front.math.ucdavis.edu/math.NT/0009113
- * http://front.math.ucdavis.edu/math.MG/0101066
- * http://front.math.ucdavis.edu/math.MG/0010298
- * http://front.math.ucdavis.edu/math.MG/0010302
- * http://front.math.ucdavis.edu/math.MG/0010324
- */
-
-#ifdef STANDALONE
-# define MODE_apollonian
-# define DEFAULTS "*delay: 1000000 \n" \
- "*count: 64 \n" \
- "*cycles: 20 \n" \
- "*ncolors: 64 \n" \
- "*font: sans-serif bold 10\n" \
- "*fpsTop: true \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True" \
-
-# define release_apollonian 0
-# define reshape_apollonian 0
-# define apollonian_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_apollonian
-
-#define DEF_ALTGEOM "True"
-#define DEF_LABEL "True"
-
-static Bool altgeom;
-static Bool label;
-
-static XrmOptionDescRec opts[] =
-{
- {"-altgeom", ".apollonian.altgeom", XrmoptionNoArg, "on"},
- {"+altgeom", ".apollonian.altgeom", XrmoptionNoArg, "off"},
- {"-label", ".apollonian.label", XrmoptionNoArg, "on"},
- {"+label", ".apollonian.label", XrmoptionNoArg, "off"},
-};
-static argtype vars[] =
-{
- {&altgeom, "altgeom", "AltGeom", DEF_ALTGEOM, t_Bool},
- {&label, "label", "Label", DEF_LABEL, t_Bool},
-};
-static OptionStruct desc[] =
-{
- {"-/+altgeom", "turn on/off alternate geometries (off euclidean space, on includes spherical and hyperbolic)"},
- {"-/+label", "turn on/off alternate space and number labeling"},
-};
-
-ENTRYPOINT ModeSpecOpt apollonian_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct apollonian_description =
-{"apollonian", "init_apollonian", "draw_apollonian", (char *) NULL,
- "init_apollonian", "init_apollonian", "free_apollonian", &apollonian_opts,
- 1000000, 64, 20, 1, 64, 1.0, "",
- "Shows Apollonian Circles", 0, NULL};
-
-#endif
-
-typedef struct {
- int a, b, c, d;
-} apollonian_quadruple;
-
-typedef struct {
- double e; /* euclidean bend */
- double s; /* spherical bend */
- double h; /* hyperbolic bend */
- double x, y; /* euclidean bend times euclidean position */
-} circle;
-enum space {
- euclidean = 0, spherical, hyperbolic
-};
-
-static const char * space_string[] = {
- "euclidean",
- "spherical",
- "hyperbolic"
-};
-
-/*
-Generate Apollonian packing starting with a quadruple of circles.
-The four input lines each contain the 5-tuple (e,s,h,x,y) representing
-the circle with radius 1/e and center (x/e,y/e). The s and h is propagated
-like e, x and y, but can differ from e so as to represent different
-geometries, spherical and hyperbolic, respectively. The "standard" picture,
-for example (-1, 2, 2, 3), can be labeled for the three geometries.
-Origins of circles z1, z2, z3, z4
-a * z1 = 0
-b * z2 = (a+b)/a
-c * z3 = (q123 + a * i)^2/(a*(a+b)) where q123 = sqrt(a*b+a*c+b*c)
-d * z4 = (q124 + a * i)^2/(a*(a+b)) where q124 = q123 - a - b
-If (e,x,y) represents the Euclidean circle (1/e,x/e,y/e) (so that e is
-the label in the standard picture) then the "spherical label" is
-(e^2+x^2+y^2-1)/(2*e) (an integer!) and the "hyperbolic label", is
-calulated by h + s = e.
-*/
-static circle examples[][4] = {
-{ /* double semi-bounded */
- { 0, 0, 0, 0, 1},
- { 0, 0, 0, 0, -1},
- { 1, 1, 1, -1, 0},
- { 1, 1, 1, 1, 0}
-},
-#if 0
-{ /* standard */
- {-1, 0, -1, 0, 0},
- { 2, 1, 1, 1, 0},
- { 2, 1, 1, -1, 0},
- { 3, 2, 1, 0, 2}
-},
-{ /* next simplest */
- {-2, -1, -1, 0.0, 0},
- { 3, 2, 1, 0.5, 0},
- { 6, 3, 3, -2.0, 0},
- { 7, 4, 3, -1.5, 2}
-},
-{ /* */
- {-3, -2, -1, 0.0, 0},
- { 4, 3, 1, 1.0 / 3.0, 0},
- {12, 7, 5, -3.0, 0},
- {13, 8, 5, -8.0 / 3.0, 2}
-},
-{ /* Mickey */
- {-3, -2, -1, 0.0, 0},
- { 5, 4, 1, 2.0 / 3.0, 0},
- { 8, 5, 3, -4.0 / 3.0, -1},
- { 8, 5, 3, -4.0 / 3.0, 1}
-},
-{ /* */
- {-4, -3, -1, 0.00, 0},
- { 5, 4, 1, 0.25, 0},
- {20, 13, 7, -4.00, 0},
- {21, 14, 7, -3.75, 2}
-},
-{ /* Mickey2 */
- {-4, -2, -2, 0.0, 0},
- { 8, 4, 4, 1.0, 0},
- { 9, 5, 4, -0.75, -1},
- { 9, 5, 4, -0.75, 1}
-},
-{ /* Mickey3 */
- {-5, -4, -1, 0.0, 0},
- { 7, 6, 1, 0.4, 0},
- {18, 13, 5, -2.4, -1},
- {18, 13, 5, -2.4, 1}
-},
-{ /* */
- {-6, -5, -1, 0.0, 0},
- { 7, 6, 1, 1.0 / 6.0, 0},
- {42, 31, 11, -6.0, 0},
- {43, 32, 11, -35.0 / 6.0, 2}
-},
-{ /* */
- {-6, -3, -3, 0.0, 0},
- {10, 5, 5, 2.0 / 3.0, 0},
- {15, 8, 7, -1.5, 0},
- {19, 10, 9, -5.0 / 6.0, 2}
-},
-{ /* asymmetric */
- {-6, -5, -1, 0.0, 0.0},
- {11, 10, 1, 5.0 / 6.0, 0.0},
- {14, 11, 3, -16.0 / 15.0, -0.8},
- {15, 12, 3, -0.9, 1.2}
-},
-#endif
-/* Non integer stuff */
-#define DELTA 2.154700538 /* ((3+2*sqrt(3))/3) */
-{ /* 3 fold symmetric bounded (x, y calculated later) */
- { -1, -1, -1, 0.0, 0.0},
- {DELTA, DELTA, DELTA, 1.0, 0.0},
- {DELTA, DELTA, DELTA, 1.0, -1.0},
- {DELTA, DELTA, DELTA, -1.0, 1.0}
-},
-{ /* semi-bounded (x, y calculated later) */
-#define ALPHA 2.618033989 /* ((3+sqrt(5))/2) */
- { 1.0, 1.0, 1.0, 0, 0},
- { 0.0, 0.0, 0.0, 0, -1},
- {1.0/(ALPHA*ALPHA), 1.0/(ALPHA*ALPHA), 1.0/(ALPHA*ALPHA), -1, 0},
- { 1.0/ALPHA, 1.0/ALPHA, 1.0/ALPHA, -1, 0}
-},
-{ /* unbounded (x, y calculated later) */
-/* #define PHI 1.618033989 *//* ((1+sqrt(5))/2) */
-#define BETA 2.890053638 /* (PHI+sqrt(PHI)) */
- { 1.0, 1.0, 1.0, 0, 0},
- {1.0/(BETA*BETA*BETA), 1.0/(BETA*BETA*BETA), 1.0/(BETA*BETA*BETA), 1, 0},
- { 1.0/(BETA*BETA), 1.0/(BETA*BETA), 1.0/(BETA*BETA), 1, 0},
- { 1.0/BETA, 1.0/BETA, 1.0/BETA, 1, 0}
-}
-};
-
-#define PREDEF_CIRCLE_GAMES (sizeof (examples) / (4 * sizeof (circle)))
-
-#if 0
-Euclidean
-0, 0, 1, 1
--1, 2, 2, 3
--2, 3, 6, 7
--3, 5, 8, 8
--4, 8, 9, 9
--3, 4, 12, 13
--6, 11, 14, 15
- -5, 7, 18, 18
- -6, 10, 15, 19
- -7, 12, 17, 20
- -4, 5, 20, 21
- -9, 18, 19, 22
- -8, 13, 21, 24
-Spherical
-0, 1, 1, 2
- -1, 2, 3, 4
- -2, 4, 5, 5
- -2, 3, 7, 8
-Hyperbolic
--1, 1, 1, 1
- 0, 0, 1, 3
- -2, 3, 5, 6
- -3, 6, 6, 7
-#endif
-
-typedef struct {
- int size;
- XPoint offset;
- int geometry;
- circle c1, c2, c3, c4;
- int color_offset;
- int count;
- Bool label, altgeom;
- apollonian_quadruple *quad;
- XftFont *font;
- XftColor xft_fg;
- XftDraw *xftdraw;
- int time;
- int game;
-} apollonianstruct;
-
-static apollonianstruct *apollonians = (apollonianstruct *) NULL;
-
-#define K 2.15470053837925152902 /* 1+2/sqrt(3) */
-#define MAXBEND 100 /* Do not want configurable by user since it will take too
- much time if increased. */
-
-static int
-gcd(int a, int b)
-{
- int r;
-
- while (b) {
- r = a % b;
- a = b;
- b = r;
- }
- return a;
-}
-
-static int
-isqrt(int n)
-{
- int y;
-
- if (n < 0)
- return -1;
- y = (int) (sqrt((double) n) + 0.5);
- return ((n == y*y) ? y : -1);
-}
-
-static void
-dquad(int n, apollonian_quadruple *quad)
-{
- int a, b, c, d;
- int counter = 0, B, C;
-
- for (a = 0; a < MAXBEND; a++) {
- B = (int) (K * a);
- for (b = a + 1; b <= B; b++) {
- C = (int) (((a + b) * (a + b)) / (4.0 * (b - a)));
- for (c = b; c <= C; c++) {
- d = isqrt(b*c-a*(b+c));
- if (d >= 0 && (gcd(a,gcd(b,c)) <= 1)) {
- quad[counter].a = -a;
- quad[counter].b = b;
- quad[counter].c = c;
- quad[counter].d = -a+b+c-2*d;
- if (++counter >= n) {
- return;
- }
- }
- }
- }
- }
- (void) printf("found only %d below maximum bend of %d\n",
- counter, MAXBEND);
- for (; counter < n; counter++) {
- quad[counter].a = -1;
- quad[counter].b = 2;
- quad[counter].c = 2;
- quad[counter].d = 3;
- }
- return;
-}
-
-/*
- * Given a Descartes quadruple of bends (a,b,c,d), with a<0, find a
- * quadruple of circles, represented by (bend,bend*x,bend*y), such
- * that the circles have the given bends and the bends times the
- * centers are integers.
- *
- * This just performs an exaustive search, assuming that the outer
- * circle has center in the unit square.
- *
- * It is always sufficient to look in {(x,y):0<=y<=x<=1/2} for the
- * center of the outer circle, but this may not lead to a packing
- * that can be labelled with integer spherical and hyperbolic labels.
- * To effect the smaller search, replace FOR(a) with
- *
- * for (pa = ea/2; pa <= 0; pa++) for (qa = pa; qa <= 0; qa++)
- */
-
-#define For(v,l,h) for (v = l; v <= h; v++)
-#define FOR(z) For(p##z,lop##z,hip##z) For(q##z,loq##z,hiq##z)
-#define H(z) ((e##z*e##z+p##z*p##z+q##z*q##z)%2)
-#define UNIT(z) ((abs(e##z)-1)*(abs(e##z)-1) >= p##z*p##z+q##z*q##z)
-#define T(z,w) is_tangent(e##z,p##z,q##z,e##w,p##w,q##w)
-#define LO(r,z) lo##r##z = iceil(e##z*(r##a+1),ea)-1
-#define HI(r,z) hi##r##z = iflor(e##z*(r##a-1),ea)-1
-#define B(z) LO(p,z); HI(p,z); LO(q,z); HI(q,z)
-
-static int
-is_quad(int a, int b, int c, int d)
-{
- int s;
-
- s = a+b+c+d;
- return 2*(a*a+b*b+c*c+d*d) == s*s;
-}
-
-static Bool
-is_tangent(int e1, int p1, int q1, int e2, int p2, int q2)
-{
- int dx, dy, s;
-
- dx = p1*e2 - p2*e1;
- dy = q1*e2 - q2*e1;
- s = e1 + e2;
- return dx*dx + dy*dy == s*s;
-}
-
-static int
-iflor(int a, int b)
-{
- int q;
-
- if (b == 0) {
- (void) printf("iflor: b = 0\n");
- return 0;
- }
- if (a%b == 0)
- return a/b;
- q = abs(a)/abs(b);
- return ((a<0)^(b<0)) ? -q-1 : q;
-}
-
-static int
-iceil(int a, int b)
-{
- int q;
-
- if (b == 0) {
- (void) printf("iceil: b = 0\n");
- return 0;
- }
- if (a%b == 0)
- return a/b;
- q = abs(a)/abs(b);
- return ((a<0)^(b<0)) ? -q : 1+q;
-}
-
-static double
-geom(int geometry, int e, int p, int q)
-{
- int g = (geometry == spherical) ? -1 :
- (geometry == hyperbolic) ? 1 : 0;
-
- if (g)
- return (e*e + (1.0 - p*p - q*q) * g) / (2.0*e);
- (void) printf("geom: g = 0\n");
- return e;
-}
-
-static void
-cquad(circle *c1, circle *c2, circle *c3, circle *c4)
-{
- int ea, eb, ec, ed;
- int pa, pb, pc, pd;
- int qa, qb, qc, qd;
- int lopa, lopb, lopc, lopd;
- int hipa, hipb, hipc, hipd;
- int loqa, loqb, loqc, loqd;
- int hiqa, hiqb, hiqc, hiqd;
-
- ea = (int) c1->e;
- eb = (int) c2->e;
- ec = (int) c3->e;
- ed = (int) c4->e;
- if (ea >= 0)
- (void) printf("ea = %d\n", ea);
- if (!is_quad(ea,eb,ec,ed))
- (void) printf("Error not quad %d %d %d %d\n", ea, eb, ec, ed);
- lopa = loqa = ea;
- hipa = hiqa = 0;
- FOR(a) {
- B(b); B(c); B(d);
- if (H(a) && UNIT(a)) FOR(b) {
- if (H(b) && T(a,b)) FOR(c) {
- if (H(c) && T(a,c) && T(b,c)) FOR(d) {
- if (H(d) && T(a,d) && T(b,d) && T(c,d)) {
- c1->s = geom(spherical, ea, pa, qa);
- c1->h = geom(hyperbolic, ea, pa, qa);
- c2->s = geom(spherical, eb, pb, qb);
- c2->h = geom(hyperbolic, eb, pb, qb);
- c3->s = geom(spherical, ec, pc, qc);
- c3->h = geom(hyperbolic, ec, pc, qc);
- c4->s = geom(spherical, ed, pd, qd);
- c4->h = geom(hyperbolic, ed, pd, qd);
- }
- }
- }
- }
- }
-}
-
-static void
-set_xft_color (ModeInfo *mi, XftColor *c, unsigned long pixel)
-{
- XColor xc;
- xc.pixel = pixel;
- XQueryColor (MI_DISPLAY(mi), MI_COLORMAP(mi), &xc);
- c->pixel = pixel;
- c->color.red = xc.red;
- c->color.green = xc.green;
- c->color.blue = xc.blue;
- c->color.alpha = 0xFFFF;
-}
-
-
-static void
-p(ModeInfo *mi, circle c)
-{
- apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
- char string[15];
- double g, e;
- int g_width;
- unsigned long pix;
-
-#ifdef DEBUG
- (void) printf("c.e=%g c.s=%g c.h=%g c.x=%g c.y=%g\n",
- c.e, c.s, c.h, c.x, c.y);
-#endif
- g = (cp->geometry == spherical) ? c.s : (cp->geometry == hyperbolic) ?
- c.h : c.e;
- if (c.e < 0.0) {
- if (g < 0.0)
- g = -g;
- if (MI_NPIXELS(mi) <= 2)
- pix = MI_WHITE_PIXEL(mi);
- else
- pix = MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g))
- % MI_NPIXELS(mi));
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), pix);
- set_xft_color (mi, &cp->xft_fg, pix);
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ((int) (cp->size * (-cp->c1.e) * (c.x - 1.0) /
- (-2.0 * c.e) + cp->size / 2.0 + cp->offset.x)),
- ((int) (cp->size * (-cp->c1.e) * (c.y - 1.0) /
- (-2.0 * c.e) + cp->size / 2.0 + cp->offset.y)),
- (int) (cp->c1.e * cp->size / c.e),
- (int) (cp->c1.e * cp->size / c.e), 0, 23040);
- if (!cp->label) {
-#ifdef DEBUG
- (void) printf("%g\n", -g);
-#endif
- return;
- }
-
- sprintf(string, "%g", (g == 0.0) ? 0 : -g);
- XftDrawStringUtf8 (cp->xftdraw, &cp->xft_fg, cp->font,
- ((int) (cp->size * c.x / (2.0 * c.e))) +
- cp->offset.x + cp->font->ascent * 2,
- ((int) (cp->size * c.y / (2.0 * c.e))) +
- cp->font->ascent * 4,
- (FcChar8 *) string,
- (g == 0 ? 1 :
- g < 10 ? 2 :
- g < 100 ? 3 : 4));
- XftDrawStringUtf8 (cp->xftdraw, &cp->xft_fg, cp->font,
- ((int) (cp->size * c.x / (2.0 * c.e) +
- cp->offset.x)) + cp->font->ascent * 2,
- ((int) (cp->size * c.y / (2.0 * c.e) +
- MI_HEIGHT(mi) - cp->font->ascent * 4)),
- (FcChar8 *) space_string[cp->geometry],
- strlen(space_string[cp->geometry]));
- return;
- }
- if (MI_NPIXELS(mi) <= 2)
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
- else
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g)) %
- MI_NPIXELS(mi)));
- if (c.e == 0.0) {
- if (c.x == 0.0 && c.y != 0.0) {
- XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- 0, (int) ((c.y + 1.0) * cp->size / 2.0 + cp->offset.y),
- MI_WIDTH(mi),
- (int) ((c.y + 1.0) * cp->size / 2.0 + cp->offset.y));
- } else if (c.y == 0.0 && c.x != 0.0) {
- XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- (int) ((c.x + 1.0) * cp->size / 2.0 + cp->offset.x), 0,
- (int) ((c.x + 1.0) * cp->size / 2.0 + cp->offset.x),
- MI_HEIGHT(mi));
- }
- return;
- }
- e = (cp->c1.e >= 0.0) ? 1.0 : -cp->c1.e;
- XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- ((int) (cp->size * e * (c.x - 1.0) / (2.0 * c.e) +
- cp->size / 2.0 + cp->offset.x)),
- ((int) (cp->size * e * (c.y - 1.0) / (2.0 * c.e) +
- cp->size / 2.0 + cp->offset.y)),
- (int) (e * cp->size / c.e), (int) (e * cp->size / c.e),
- 0, 23040);
- if (!cp->label) {
-#ifdef DEBUG
- (void) printf("%g\n", g);
-#endif
- return;
- }
- if (MI_NPIXELS(mi) <= 2)
- pix = MI_BLACK_PIXEL(mi);
- else
- pix = MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g) +
- MI_NPIXELS(mi) / 2) % MI_NPIXELS(mi));
- g_width = (g < 10.0) ? 1: ((g < 100.0) ? 2 : 3);
- if (c.e < e * cp->size / ((cp->font->ascent + cp->font->descent) * 2) &&
- g < 1000.0) {
- XGlyphInfo overall;
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), pix);
- set_xft_color (mi, &cp->xft_fg, pix);
- sprintf(string, "%g", g);
- XftTextExtentsUtf8 (MI_DISPLAY(mi), cp->font,
- (FcChar8 *) string, g_width, &overall);
- XftDrawStringUtf8 (cp->xftdraw, &cp->xft_fg, cp->font,
- ((int) (cp->size * e * c.x / (2.0 * c.e) +
- cp->size / 2.0 + cp->offset.x)) -
- overall.width / 2,
- ((int) (cp->size * e * c.y / (2.0 * c.e) +
- cp->size / 2.0 + cp->offset.y)) +
- cp->font->ascent / 2,
- (FcChar8 *) string, g_width);
- }
-}
-
-#define BIG 7
-static void
-f(ModeInfo *mi, circle c1, circle c2, circle c3, circle c4, int depth)
-{
- apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
- int e = (int) ((cp->c1.e >= 0.0) ? 1.0 : -cp->c1.e);
- circle c;
-
- if (depth > mi->recursion_depth) mi->recursion_depth = depth;
-
- c.e = 2*(c1.e+c2.e+c3.e) - c4.e;
- c.s = 2*(c1.s+c2.s+c3.s) - c4.s;
- c.h = 2*(c1.h+c2.h+c3.h) - c4.h;
- c.x = 2*(c1.x+c2.x+c3.x) - c4.x;
- c.y = 2*(c1.y+c2.y+c3.y) - c4.y;
- if (c.e == 0 ||
- c.e > cp->size * e || c.x / c.e > BIG || c.y / c.e > BIG ||
- c.x / c.e < -BIG || c.y / c.e < -BIG)
- return;
- p(mi, c);
- f(mi, c2, c3, c, c1, depth+1);
- f(mi, c1, c3, c, c2, depth+1);
- f(mi, c1, c2, c, c3, depth+1);
-}
-
-ENTRYPOINT void
-free_apollonian (ModeInfo * mi)
-{
- apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
-
- if (cp->quad != NULL) {
- (void) free((void *) cp->quad);
- cp->quad = (apollonian_quadruple *) NULL;
- }
-
- XftFontClose (MI_DISPLAY(mi), cp->font);
- XftDrawDestroy (cp->xftdraw);
-}
-
-#ifndef DEBUG
-static void
-randomize_c(int randomize, circle * c)
-{
- if (randomize / 2) {
- double temp;
-
- temp = c->x;
- c->x = c->y;
- c->y = temp;
- }
- if (randomize % 2) {
- c->x = -c->x;
- c->y = -c->y;
- }
-}
-#endif
-
-ENTRYPOINT void
-init_apollonian (ModeInfo * mi)
-{
- apollonianstruct *cp;
- int i;
- char *s;
-
- MI_INIT (mi, apollonians);
- cp = &apollonians[MI_SCREEN(mi)];
-
- cp->size = MAX(MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) - 1, 1);
- cp->offset.x = (MI_WIDTH(mi) - cp->size) / 2;
- cp->offset.y = (MI_HEIGHT(mi) - cp->size) / 2;
- cp->color_offset = NRAND(MI_NPIXELS(mi));
-
- cp->font = load_xft_font_retry (MI_DISPLAY(mi), MI_SCREEN(mi),
- get_string_resource (MI_DISPLAY(mi),
- "font", "Font"));
- cp->xftdraw = XftDrawCreate (MI_DISPLAY(mi), MI_WINDOW(mi),
- MI_VISUAL(mi), MI_COLORMAP(mi));
- s = get_string_resource (MI_DISPLAY(mi), "foreground", "Foreground");
- XftColorAllocName (MI_DISPLAY(mi), MI_VISUAL(mi), MI_COLORMAP(mi), s,
- &cp->xft_fg);
- free(s);
-
- cp->label = label;
- cp->altgeom = cp->label && altgeom;
-
- if (cp->quad == NULL) {
- cp->count = ABS(MI_COUNT(mi));
- if ((cp->quad = (apollonian_quadruple *) malloc(cp->count *
- sizeof (apollonian_quadruple))) == NULL) {
- return;
- }
- dquad(cp->count, cp->quad);
- }
- cp->game = NRAND(PREDEF_CIRCLE_GAMES + cp->count);
- cp->geometry = (cp->game && cp->altgeom) ? NRAND(3) : 0;
-
- if (cp->game < PREDEF_CIRCLE_GAMES) {
- cp->c1 = examples[cp->game][0];
- cp->c2 = examples[cp->game][1];
- cp->c3 = examples[cp->game][2];
- cp->c4 = examples[cp->game][3];
- /* do not label non int */
- cp->label = cp->label && (cp->c4.e == (int) cp->c4.e);
- } else { /* uses results of dquad, all int */
- i = cp->game - PREDEF_CIRCLE_GAMES;
- cp->c1.e = cp->quad[i].a;
- cp->c2.e = cp->quad[i].b;
- cp->c3.e = cp->quad[i].c;
- cp->c4.e = cp->quad[i].d;
- if (cp->geometry)
- cquad(&(cp->c1), &(cp->c2), &(cp->c3), &(cp->c4));
- }
- cp->time = 0;
- MI_CLEARWINDOW(mi);
- if (cp->game != 0) {
- double q123;
-
- if (cp->c1.e == 0.0 || cp->c1.e == -cp->c2.e)
- return;
- cp->c1.x = 0.0;
- cp->c1.y = 0.0;
- cp->c2.x = -(cp->c1.e + cp->c2.e) / cp->c1.e;
- cp->c2.y = 0;
- q123 = sqrt(cp->c1.e * cp->c2.e + cp->c1.e * cp->c3.e +
- cp->c2.e * cp->c3.e);
-#ifdef DEBUG
- (void) printf("q123 = %g, ", q123);
-#endif
- cp->c3.x = (cp->c1.e * cp->c1.e - q123 * q123) / (cp->c1.e *
- (cp->c1.e + cp->c2.e));
- cp->c3.y = -2.0 * q123 / (cp->c1.e + cp->c2.e);
- q123 = -cp->c1.e - cp->c2.e + q123;
- cp->c4.x = (cp->c1.e * cp->c1.e - q123 * q123) / (cp->c1.e *
- (cp->c1.e + cp->c2.e));
- cp->c4.y = -2.0 * q123 / (cp->c1.e + cp->c2.e);
-#ifdef DEBUG
- (void) printf("q124 = %g\n", q123);
- (void) printf("%g %g %g %g %g %g %g %g\n",
- cp->c1.x, cp->c1.y, cp->c2.x, cp->c2.y,
- cp->c3.x, cp->c3.y, cp->c4.x, cp->c4.y);
-#endif
- }
-#ifndef DEBUG
- if (LRAND() & 1) {
- cp->c3.y = -cp->c3.y;
- cp->c4.y = -cp->c4.y;
- }
- i = NRAND(4);
- randomize_c(i, &(cp->c1));
- randomize_c(i, &(cp->c2));
- randomize_c(i, &(cp->c3));
- randomize_c(i, &(cp->c4));
-#endif
-
- mi->recursion_depth = -1;
-}
-
-ENTRYPOINT void
-draw_apollonian (ModeInfo * mi)
-{
- apollonianstruct *cp;
-
- if (apollonians == NULL)
- return;
- cp = &apollonians[MI_SCREEN(mi)];
-
-
- MI_IS_DRAWN(mi) = True;
-
- if (cp->time < 5) {
- switch (cp->time) {
- case 0:
- p(mi, cp->c1);
- p(mi, cp->c2);
- p(mi, cp->c3);
- p(mi, cp->c4);
- break;
- case 1:
- f(mi, cp->c1, cp->c2, cp->c3, cp->c4, 0);
- break;
- case 2:
- f(mi, cp->c1, cp->c2, cp->c4, cp->c3, 0);
- break;
- case 3:
- f(mi, cp->c1, cp->c3, cp->c4, cp->c2, 0);
- break;
- case 4:
- f(mi, cp->c2, cp->c3, cp->c4, cp->c1, 0);
- }
- }
- if (++cp->time > MI_CYCLES(mi))
- init_apollonian(mi);
-}
-
-XSCREENSAVER_MODULE ("Apollonian", apollonian)
-
-#endif /* MODE_apollonian */
diff --git a/hacks/apollonian.man b/hacks/apollonian.man
deleted file mode 100644
index 3dd3ad1..0000000
--- a/hacks/apollonian.man
+++ /dev/null
@@ -1,70 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-apollonian \- Descartes Circle Theorem.
-.SH SYNOPSIS
-.B apollonian
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-no-label]
-[\-no-altgeom]
-[\-cycles \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Packs a large circle with smaller circles, demonstrating the Descartes
-Circle Theorem.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-label | \-no-label
-Draw Labels. Boolean.
-.TP 8
-.B \-altgeom | \-no-altgeom
-Include Alternate Geometries. Boolean.
-.TP 8
-.B \-cycles \fInumber\fP
-Depth. 1 - 20. Default: 20.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 64.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 1000000 (1.00 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Allan R. Wilks and David Bagley. Permission to
-use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided
-that the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation. No representations are made about the suitability of
-this software for any purpose. It is provided "as is" without express
-or implied warranty.
-.SH AUTHOR
-Allan R. Wilks and David Bagley.
diff --git a/hacks/apple2-main.c b/hacks/apple2-main.c
deleted file mode 100644
index a87ea1a..0000000
--- a/hacks/apple2-main.c
+++ /dev/null
@@ -1,1911 +0,0 @@
-/* xscreensaver, Copyright (c) 1998-2021 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
- * with additional work by Jamie Zawinski <jwz@jwz.org>
- * Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
- */
-
-#include "screenhack.h"
-#include "apple2.h"
-#include "textclient.h"
-#include "utf8wc.h"
-
-#include <math.h>
-#include <ctype.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#define SCREEN_COLS 40
-#define SCREEN_ROWS 24
-
-
-/* Given a bitmask, returns the position and width of the field.
- */
-static void
-decode_mask (unsigned int mask, unsigned int *pos_ret, unsigned int *size_ret)
-{
- int i;
- for (i = 0; i < 32; i++)
- if (mask & (1L << i))
- {
- int j = 0;
- *pos_ret = i;
- for (; i < 32; i++, j++)
- if (! (mask & (1L << i)))
- break;
- *size_ret = j;
- return;
- }
-}
-
-
-/* Given a value and a field-width, expands the field to fill out 8 bits.
- */
-static unsigned char
-spread_bits (unsigned char value, unsigned char width)
-{
- switch (width)
- {
- case 8: return value;
- case 7: return (value << 1) | (value >> 6);
- case 6: return (value << 2) | (value >> 4);
- case 5: return (value << 3) | (value >> 2);
- case 4: return (value << 4) | (value);
- case 3: return (value << 5) | (value << 2) | (value >> 2);
- case 2: return (value << 6) | (value << 4) | (value);
- default: abort(); break;
- }
-}
-
-
-/* Convert an XImage (of any size/depth/visual) to a 32bpp RGB array.
- Scales it (without dithering) to WxH.
- */
-static void
-scale_image (Display *dpy, Window window, XImage *in,
- int fromx, int fromy, int fromw, int fromh,
- unsigned int *out, int w, int h)
-{
- float scale;
- int x, y, i;
- unsigned int rpos=0, gpos=0, bpos=0; /* bitfield positions */
- unsigned int rsiz=0, gsiz=0, bsiz=0;
- unsigned long rmsk=0, gmsk=0, bmsk=0;
- unsigned char spread_map[3][256];
- XWindowAttributes xgwa;
- XColor *colors = 0;
-
- if (fromx + fromw > in->width ||
- fromy + fromh > in->height)
- abort();
-
- XGetWindowAttributes (dpy, window, &xgwa);
-
- /* Compute the field offsets for RGB decoding in the XImage,
- when in TrueColor mode. Otherwise we use the colormap.
- */
- if (visual_class (xgwa.screen, xgwa.visual) == PseudoColor ||
- visual_class (xgwa.screen, xgwa.visual) == GrayScale)
- {
- int ncolors = visual_cells (xgwa.screen, xgwa.visual);
- colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
- for (i = 0; i < ncolors; i++)
- colors[i].pixel = i;
- XQueryColors (dpy, xgwa.colormap, colors, ncolors);
- }
- else
- {
- visual_rgb_masks (xgwa.screen, xgwa.visual, &rmsk, &gmsk, &bmsk);
- decode_mask (rmsk, &rpos, &rsiz);
- decode_mask (gmsk, &gpos, &gsiz);
- decode_mask (bmsk, &bpos, &bsiz);
-
- for (i = 0; i < 256; i++)
- {
- spread_map[0][i] = spread_bits (i, rsiz);
- spread_map[1][i] = spread_bits (i, gsiz);
- spread_map[2][i] = spread_bits (i, bsiz);
- }
- }
-
- scale = (fromw > fromh
- ? (float) fromw / w
- : (float) fromh / h);
-
- /* Scale the pixmap from window size to Apple][ screen size (but 32bpp)
- */
- for (y = 0; y < h-1; y++) /* iterate over dest pixels */
- for (x = 0; x < w-1; x++)
- {
- int xx, yy;
- unsigned int r=0, g=0, b=0;
-
- int xx1 = x * scale + fromx;
- int yy1 = y * scale + fromy;
- int xx2 = (x+1) * scale + fromx;
- int yy2 = (y+1) * scale + fromy;
-
- /* Iterate over the source pixels contributing to this one, and sum. */
- for (xx = xx1; xx < xx2; xx++)
- for (yy = yy1; yy < yy2; yy++)
- {
- unsigned char rr, gg, bb;
- unsigned long sp = ((xx > in->width || yy > in->height)
- ? 0 : XGetPixel (in, xx, yy));
- if (colors)
- {
- rr = colors[sp].red & 0xFF;
- gg = colors[sp].green & 0xFF;
- bb = colors[sp].blue & 0xFF;
- }
- else
- {
- rr = (sp & rmsk) >> rpos;
- gg = (sp & gmsk) >> gpos;
- bb = (sp & bmsk) >> bpos;
- rr = spread_map[0][rr];
- gg = spread_map[1][gg];
- bb = spread_map[2][bb];
- }
- r += rr;
- g += gg;
- b += bb;
- }
-
- /* Scale summed pixel values down to 8/8/8 range */
- i = (xx2 - xx1) * (yy2 - yy1);
- if (i < 1) i = 1;
- r /= i;
- g /= i;
- b /= i;
-
- out[y * w + x] = (r << 16) | (g << 8) | b;
- }
-}
-
-
-/* Convert an XImage (of any size/depth/visual) to a 32bpp RGB array.
- Picks a random sub-image out of the source image, and scales it to WxH.
- */
-static void
-pick_a2_subimage (Display *dpy, Window window, XImage *in,
- unsigned int *out, int w, int h)
-{
- int fromx, fromy, fromw, fromh;
- if (in->width <= w || in->height <= h)
- {
- fromx = 0;
- fromy = 0;
- fromw = in->width;
- fromh = in->height;
- }
- else
- {
- int dw, dh;
- do {
- double scale = (0.5 + frand(0.7) + frand(0.7) + frand(0.7));
- fromw = w * scale;
- fromh = h * scale;
- } while (fromw > in->width ||
- fromh > in->height);
-
- dw = (in->width - fromw) / 2; /* near the center! */
- dh = (in->height - fromh) / 2;
-
- fromx = (dw <= 0 ? 0 : (random() % dw) + (dw/2));
- fromy = (dh <= 0 ? 0 : (random() % dh) + (dh/2));
- }
-
- scale_image (dpy, window, in,
- fromx, fromy, fromw, fromh,
- out, w, h);
-}
-
-
-/* Floyd-Steinberg dither. Derived from ppmquant.c,
- Copyright (c) 1989, 1991 by Jef Poskanzer.
- */
-static void
-a2_dither (unsigned int *in, unsigned char *out, int w, int h)
-{
- /*
- Apple ][ color map. Each pixel can only be 1 or 0, but what that
- means depends on whether it's an odd or even pixel, and whether
- the high bit in the byte is set or not. If it's 0, it's always
- black.
- */
- static const int a2_cmap[2][2][3] = {
- {
- /* hibit=0 */
- {/* odd pixels = blue */ 0x00, 0x80, 0xff},
- {/* even pixels = red */ 0xff, 0x80, 0x00}
- },
- {
- /* hibit=1 */
- {/* even pixels = purple */ 0xa0, 0x40, 0xa0},
- {/* odd pixels = green */ 0x40, 0xff, 0x40}
- }
- };
-
- int x, y;
- unsigned int **pixels;
- unsigned int *pP;
- int maxval = 255;
- long *this_rerr;
- long *next_rerr;
- long *this_gerr;
- long *next_gerr;
- long *this_berr;
- long *next_berr;
- long *temp_err;
- int fs_scale = 1024;
- int brightness = 75;
-
-#if 0
- {
- FILE *pipe = popen ("xv -", "w");
- fprintf (pipe, "P6\n%d %d\n%d\n", w, h, 255);
- for (y = 0; y < h; y++)
- for (x = 0; x < w; x++)
- {
- unsigned int p = in[y * w + x];
- unsigned int r = (p >> 16) & 0xFF;
- unsigned int g = (p >> 8) & 0xFF;
- unsigned int b = (p ) & 0xFF;
- fprintf(pipe, "%c%c%c", r, g, b);
- }
- fclose (pipe);
- }
-#endif
-
- /* Initialize Floyd-Steinberg error vectors. */
- this_rerr = (long *) calloc (w + 2, sizeof(long));
- next_rerr = (long *) calloc (w + 2, sizeof(long));
- this_gerr = (long *) calloc (w + 2, sizeof(long));
- next_gerr = (long *) calloc (w + 2, sizeof(long));
- this_berr = (long *) calloc (w + 2, sizeof(long));
- next_berr = (long *) calloc (w + 2, sizeof(long));
-
-
- /* #### do we really need more than one element of "pixels" at once?
- */
- pixels = (unsigned int **) malloc (h * sizeof (unsigned int *));
- for (y = 0; y < h; y++)
- pixels[y] = (unsigned int *) malloc (w * sizeof (unsigned int));
-
- for (x = 0; x < w + 2; ++x)
- {
- this_rerr[x] = random() % (fs_scale * 2) - fs_scale;
- this_gerr[x] = random() % (fs_scale * 2) - fs_scale;
- this_berr[x] = random() % (fs_scale * 2) - fs_scale;
- /* (random errors in [-1 .. 1]) */
- }
-
- for (y = 0; y < h; y++)
- for (x = 0; x < w; x++)
- pixels[y][x] = in[y * w + x];
-
- for (y = 0; y < h; y++)
- {
- int xbyte;
- int err;
- int prev_byte=0;
-
- for (x = 0; x < w + 2; x++)
- next_rerr[x] = next_gerr[x] = next_berr[x] = 0;
-
- /* It's too complicated to go back and forth on alternate rows,
- so we always go left-right here. It doesn't change the result
- very much.
-
- For each group of 7 pixels, we have to try it both with the
- high bit=0 and =1. For each high bit value, we add up the
- total error and pick the best one.
-
- Because we have to go through each group of bits twice, we
- don't propagate the error values through this_[rgb]err since
- it would add them twice. So we keep seperate local_[rgb]err
- variables for propagating error within the 7-pixel group.
- */
-
- pP = pixels[y];
- for (xbyte=0; xbyte<280; xbyte+=7)
- {
- int best_byte=0;
- int best_error=2000000000;
- int hibit;
- int sr, sg, sb;
- int r2, g2, b2;
- int local_rerr=0, local_gerr=0, local_berr=0;
-
- for (hibit=0; hibit<2; hibit++)
- {
- int byte = hibit<<7;
- int tot_error=0;
-
- for (x=xbyte; x<xbyte+7; x++)
- {
- int dist0, dist1;
-
- /* Use Floyd-Steinberg errors to adjust actual color. */
- sr = ((pP[x] >> 16) & 0xFF) * brightness/256;
- sg = ((pP[x] >> 8) & 0xFF) * brightness/256;
- sb = ((pP[x] ) & 0xFF) * brightness/256;
- sr += (this_rerr[x + 1] + local_rerr) / fs_scale;
- sg += (this_gerr[x + 1] + local_gerr) / fs_scale;
- sb += (this_berr[x + 1] + local_berr) / fs_scale;
-
- if (sr < 0) sr = 0;
- else if (sr > maxval) sr = maxval;
- if (sg < 0) sg = 0;
- else if (sg > maxval) sg = maxval;
- if (sb < 0) sb = 0;
- else if (sb > maxval) sb = maxval;
-
- /* This is the color we'd get if we set the bit 1. For 0,
- we get black */
- r2=a2_cmap[hibit][x&1][0];
- g2=a2_cmap[hibit][x&1][1];
- b2=a2_cmap[hibit][x&1][2];
-
- /*
- dist0 and dist1 are the error (Minkowski 2-metric
- distances in the color space) for choosing 0 and
- 1 respectively. 0 is black, 1 is the color r2,g2,b2.
- */
- dist1= (sr-r2)*(sr-r2) + (sg-g2)*(sg-g2) + (sb-b2)*(sb-b2);
- dist0= sr*sr + sg*sg + sb*sb;
-
- if (dist1<dist0)
- {
- byte |= 1 << (x-xbyte);
- tot_error += dist1;
-
- /* Wanted sr but got r2, so propagate sr-r2 */
- local_rerr = (sr - r2) * fs_scale * 7/16;
- local_gerr = (sg - g2) * fs_scale * 7/16;
- local_berr = (sb - b2) * fs_scale * 7/16;
- }
- else
- {
- tot_error += dist0;
-
- /* Wanted sr but got 0, so propagate sr */
- local_rerr = sr * fs_scale * 7/16;
- local_gerr = sg * fs_scale * 7/16;
- local_berr = sb * fs_scale * 7/16;
- }
- }
-
- if (tot_error < best_error)
- {
- best_byte = byte;
- best_error = tot_error;
- }
- }
-
- /* Avoid alternating 7f and ff in all-white areas, because it makes
- regular pink vertical lines */
- if ((best_byte&0x7f)==0x7f && (prev_byte&0x7f)==0x7f)
- best_byte=prev_byte;
- prev_byte=best_byte;
-
- /*
- Now that we've chosen values for all 8 bits of the byte, we
- have to fill in the real pixel values into pP and propagate
- all the error terms. We end up repeating a lot of the code
- above.
- */
-
- for (x=xbyte; x<xbyte+7; x++)
- {
- int bit=(best_byte>>(x-xbyte))&1;
- hibit=(best_byte>>7)&1;
-
- sr = (pP[x] >> 16) & 0xFF;
- sg = (pP[x] >> 8) & 0xFF;
- sb = (pP[x] ) & 0xFF;
- sr += this_rerr[x + 1] / fs_scale;
- sg += this_gerr[x + 1] / fs_scale;
- sb += this_berr[x + 1] / fs_scale;
-
- if (sr < 0) sr = 0;
- else if (sr > maxval) sr = maxval;
- if (sg < 0) sg = 0;
- else if (sg > maxval) sg = maxval;
- if (sb < 0) sb = 0;
- else if (sb > maxval) sb = maxval;
-
- r2=a2_cmap[hibit][x&1][0] * bit;
- g2=a2_cmap[hibit][x&1][1] * bit;
- b2=a2_cmap[hibit][x&1][2] * bit;
-
- pP[x] = (r2<<16) | (g2<<8) | (b2);
-
- /* Propagate Floyd-Steinberg error terms. */
- err = (sr - r2) * fs_scale;
- this_rerr[x + 2] += (err * 7) / 16;
- next_rerr[x ] += (err * 3) / 16;
- next_rerr[x + 1] += (err * 5) / 16;
- next_rerr[x + 2] += (err ) / 16;
- err = (sg - g2) * fs_scale;
- this_gerr[x + 2] += (err * 7) / 16;
- next_gerr[x ] += (err * 3) / 16;
- next_gerr[x + 1] += (err * 5) / 16;
- next_gerr[x + 2] += (err ) / 16;
- err = (sb - b2) * fs_scale;
- this_berr[x + 2] += (err * 7) / 16;
- next_berr[x ] += (err * 3) / 16;
- next_berr[x + 1] += (err * 5) / 16;
- next_berr[x + 2] += (err ) / 16;
- }
-
- /*
- And put the actual byte into out.
- */
-
- out[y*(w/7) + xbyte/7] = best_byte;
-
- }
-
- temp_err = this_rerr;
- this_rerr = next_rerr;
- next_rerr = temp_err;
- temp_err = this_gerr;
- this_gerr = next_gerr;
- next_gerr = temp_err;
- temp_err = this_berr;
- this_berr = next_berr;
- next_berr = temp_err;
- }
-
- free (this_rerr);
- free (next_rerr);
- free (this_gerr);
- free (next_gerr);
- free (this_berr);
- free (next_berr);
-
- for (y=0; y<h; y++)
- free (pixels[y]);
- free (pixels);
-
-#if 0
- {
- /* let's see what we got... */
- FILE *pipe = popen ("xv -", "w");
- fprintf (pipe, "P6\n%d %d\n%d\n", w, h, 255);
- for (y = 0; y < h; y++)
- for (x = 0; x < w; x++)
- {
- unsigned int r = (pixels[y][x]>>16)&0xff;
- unsigned int g = (pixels[y][x]>>8)&0xff;
- unsigned int b = (pixels[y][x]>>0)&0xff;
- fprintf(pipe, "%c%c%c", r, g, b);
- }
- fclose (pipe);
- }
-#endif
-}
-
-typedef struct slideshow_data_s {
- int slideno;
- int render_img_lineno;
- unsigned char *render_img;
- char *img_filename;
- Bool image_loading_p;
-} slideshow_data;
-
-
-static void
-image_loaded_cb (Screen *screen, Window window, Drawable p,
- const char *name, XRectangle *geometry,
- void *closure)
-{
- Display *dpy = DisplayOfScreen (screen);
- apple2_sim_t *sim = (apple2_sim_t *) closure;
- slideshow_data *mine = (slideshow_data *) sim->controller_data;
- XWindowAttributes xgwa;
- int w = 280;
- int h = 192;
- XImage *image;
- unsigned int *buf32 = (unsigned int *) calloc (w, h * 4);
- unsigned char *buf8 = (unsigned char *) calloc (w/7, h);
-
- if (!buf32 || !buf8)
- {
- fprintf (stderr, "%s: out of memory (%dx%d)\n", progname, w, h);
- exit (1);
- }
-
- XGetWindowAttributes (dpy, window, &xgwa);
-
- image = XGetImage (dpy, p, 0, 0, xgwa.width, xgwa.height, ~0, ZPixmap);
- XFreePixmap (dpy, p);
- p = 0;
-
- /* Scale the XImage down to Apple][ size, and convert it to a 32bpp
- image (regardless of whether it started as TrueColor/PseudoColor.)
- */
- pick_a2_subimage (dpy, window, image, buf32, w, h);
- free(image->data);
- image->data = 0;
- XDestroyImage(image);
-
- /* Then dither the 32bpp image to a 6-color Apple][ colormap.
- */
- a2_dither (buf32, buf8, w, h);
-
- free (buf32);
-
- mine->image_loading_p = False;
- mine->img_filename = (name ? strdup (name) : 0);
- mine->render_img = buf8;
-}
-
-
-
-static const char *apple2_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*mode: random",
- "*duration: 60",
- "*program: xscreensaver-text --cols 40",
- "*metaSendsESC: True",
- "*swapBSDEL: True",
- "*fast: False",
-# ifdef HAVE_FORKPTY
- "*usePty: True",
-#else
- "*usePty: False",
-# endif /* !HAVE_FORKPTY */
-
- ANALOGTV_DEFAULTS
- 0
-};
-
-static XrmOptionDescRec apple2_options [] = {
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-slideshow", ".mode", XrmoptionNoArg, "slideshow" },
- { "-basic", ".mode", XrmoptionNoArg, "basic" },
- { "-text", ".mode", XrmoptionNoArg, "text" },
- { "-program", ".program", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
- { "-pty", ".usePty", XrmoptionNoArg, "True" },
- { "-pipe", ".usePty", XrmoptionNoArg, "False" },
- { "-meta", ".metaSendsESC", XrmoptionNoArg, "False" },
- { "-esc", ".metaSendsESC", XrmoptionNoArg, "True" },
- { "-bs", ".swapBSDEL", XrmoptionNoArg, "False" },
- { "-del", ".swapBSDEL", XrmoptionNoArg, "True" },
- { "-fast", ".fast", XrmoptionNoArg, "True" },
- ANALOGTV_OPTIONS
- { 0, 0, 0, 0 }
-};
-
-/*
- TODO: this should load 10 images at startup time, then cycle through them
- to avoid the pause while it loads.
- */
-
-static void slideshow_controller(apple2_sim_t *sim, int *stepno,
- double *next_actiontime)
-{
- apple2_state_t *st=sim->st;
- int i;
- slideshow_data *mine;
-
- if (!sim->controller_data)
- sim->controller_data = calloc (1, sizeof(*mine));
- mine = (slideshow_data *) sim->controller_data;
-
- switch(*stepno) {
-
- case 0:
- a2_invalidate(st);
- a2_clear_hgr(st);
- a2_cls(st);
- sim->typing_rate = 0.3;
- sim->dec->powerup=0.0;
-
- a2_goto(st, 0, 16);
- a2_prints(st, "APPLE ][");
- a2_goto(st,23,0);
- a2_printc(st,']');
-
- *stepno=10;
- break;
-
- case 10:
- {
- XWindowAttributes xgwa;
- Pixmap p;
- XGetWindowAttributes (sim->dpy, sim->window, &xgwa);
- p = XCreatePixmap (sim->dpy, sim->window, xgwa.width, xgwa.height,
- xgwa.depth);
- mine->image_loading_p = True;
- load_image_async (xgwa.screen, sim->window, p, image_loaded_cb, sim);
-
- /* pause with a blank screen for a bit, while the image loads in the
- background. */
- *next_actiontime += 2.0;
- *stepno=11;
- }
- break;
-
- case 11:
- if (! mine->image_loading_p) { /* image is finally loaded */
- if (st->gr_mode) {
- *stepno=30;
- } else {
- *stepno=20;
- }
- *next_actiontime += 3.0;
- }
- break;
-
- case 20:
- sim->typing="HGR\n";
- *stepno=29;
- break;
-
- case 29:
- sim->printing="]";
- *stepno=30;
- break;
-
- case 30:
- st->gr_mode=A2_GR_HIRES;
- if (mine->img_filename) {
- char *basename, *tmp;
- char *s;
-
- basename = tmp = strdup (mine->img_filename);
- while (1)
- {
- char *slash = strchr(basename, '/');
- if (!slash || !slash[1]) break;
- basename = slash+1;
- }
- {
- char *dot=strrchr(basename,'.');
- if (dot) *dot=0;
- }
- if (strlen(basename)>20) basename[20]=0;
- for (s=basename; *s; s++) {
- *s = toupper (*s);
- if (*s <= ' ') *s = '_';
- }
- sprintf(sim->typing_buf, "BLOAD %s\n", basename);
- sim->typing = sim->typing_buf;
-
- free(tmp);
- } else {
- sim->typing = "BLOAD IMAGE\n";
- }
- mine->render_img_lineno=0;
-
- *stepno=35;
- break;
-
- case 35:
- *next_actiontime += 0.7;
- *stepno=40;
- break;
-
- case 40:
- if (mine->render_img_lineno>=192) {
- sim->printing="]";
- sim->typing="POKE 49234,0\n";
- *stepno=50;
- return;
- }
-
- for (i=0; i<6 && mine->render_img_lineno<192; i++) {
- a2_display_image_loading(st, mine->render_img,
- mine->render_img_lineno++);
- }
-
- /* The disk would have to seek every 13 sectors == 78 lines.
- (This ain't no newfangled 16-sector operating system) */
- if ((mine->render_img_lineno%78)==0) {
- *next_actiontime += 0.5;
- } else {
- *next_actiontime += 0.08;
- }
- break;
-
- case 50:
- st->gr_mode |= A2_GR_FULL;
- *stepno=60;
- /* Note that sim->delay is sometimes "infinite" in this controller.
- These images are kinda dull anyway, so don't leave it on too long. */
- *next_actiontime += 2;
- break;
-
- case 60:
- sim->printing="]";
- sim->typing="POKE 49235,0\n";
- *stepno=70;
- break;
-
- case 70:
- sim->printing="]";
- st->gr_mode &= ~A2_GR_FULL;
- if (mine->render_img) {
- free(mine->render_img);
- mine->render_img=NULL;
- }
- if (mine->img_filename) {
- free(mine->img_filename);
- mine->img_filename=NULL;
- }
- *stepno=10;
- break;
-
- case 80:
- /* Do nothing, just wait */
- *next_actiontime += 2.0;
- *stepno = A2CONTROLLER_FREE;
- break;
-
- case A2CONTROLLER_FREE:
- /* It is possible that still image is being loaded,
- in that case mine cannot be freed, because
- callback function tries to use it, so wait.
- */
- if (mine->image_loading_p) {
- *stepno = 80;
- break;
- }
- free(mine->render_img);
- free(mine->img_filename);
- free(mine);
- mine = 0;
- return;
-
- }
-}
-
-#define NPAR 16
-
-struct terminal_controller_data {
- Display *dpy;
- char curword[256];
- unsigned char lastc;
- double last_emit_time;
- text_data *tc;
-
- int escstate;
- int csiparam[NPAR];
- int curparam;
- int cursor_x, cursor_y;
- int saved_x, saved_y;
- int unicruds; char unicrud[7];
- union {
- struct {
- unsigned int bold : 1;
- unsigned int blink : 1;
- unsigned int rev : 1;
- } bf;
- int w;
- } termattrib;
- Bool fast_p;
-
-};
-
-
-/* The structure of closure linkage throughout this code is so amazingly
- baroque that I can't get to the 'struct state' from where I need it. */
-static char *global_program;
-static Bool global_fast_p;
-
-
-static void
-terminal_closegen(struct terminal_controller_data *mine)
-{
- if (mine->tc) {
- textclient_close (mine->tc);
- mine->tc = 0;
- }
-}
-
-static int
-terminal_read(struct terminal_controller_data *mine, unsigned char *buf, int n)
-{
- if (!mine || !mine->tc) {
- return 0;
- } else {
- int i, count = 0;
- for (i = 0; i < n; i++) {
- int c = textclient_getc (mine->tc);
- if (c <= 0) break;
- buf[i] = c;
- mine->lastc = c;
- count++;
- }
- return count;
- }
-}
-
-
-static int
-terminal_keypress_handler (Display *dpy, XEvent *event, void *data)
-{
- struct terminal_controller_data *mine =
- (struct terminal_controller_data *) data;
- mine->dpy = dpy;
- if (event->xany.type == KeyPress && mine->tc)
- return textclient_putc (mine->tc, &event->xkey);
- return 0;
-}
-
-
-static void
-a2_ascii_printc (apple2_state_t *st, unsigned char c,
- Bool bold_p, Bool blink_p, Bool rev_p,
- Bool scroll_p)
-{
- if (c >= 'a' && c <= 'z') /* upcase lower-case chars */
- {
- c &= 0xDF;
- }
- else if ((c >= 'A'+128) || /* upcase and blink */
- (c < ' ' && c != 014 && /* high-bit & ctl chrs */
- c != '\r' && c != '\n' && c!='\t'))
- {
- c = (c & 0x1F) | 0x80;
- }
- else if (c >= 'A' && c <= 'Z') /* invert upper-case chars */
- {
- c |= 0x80;
- }
-
- if (bold_p) c |= 0xc0;
- if (blink_p) c = (c & ~0x40) | 0x80;
- if (rev_p) c |= 0xc0;
-
- if (scroll_p)
- a2_printc(st, c);
- else
- a2_printc_noscroll(st, c);
-}
-
-
-static void
-a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
- unsigned char c)
-{
- apple2_state_t *st=sim->st;
- int cols = SCREEN_COLS;
- int rows = SCREEN_ROWS;
-
- int i;
- int start, end;
-
- /* Mostly duplicated in phosphor.c */
-
- switch (state->escstate)
- {
- case 0:
- switch (c)
- {
- case 7: /* BEL */
- /* Dummy case - we don't want the screensaver to beep */
- /* #### But maybe this should flash the screen? */
- break;
- case 8: /* BS */
- if (state->cursor_x > 0)
- state->cursor_x--;
- break;
- case 9: /* HT */
- if (state->cursor_x < cols - 8)
- {
- state->cursor_x = (state->cursor_x & ~7) + 8;
- }
- else
- {
- state->cursor_x = 0;
- if (state->cursor_y < rows - 1)
- state->cursor_y++;
- else
- a2_scroll (st);
- }
- break;
- case 10: /* LF */
-# ifndef HAVE_FORKPTY
- state->cursor_x = 0; /* No ptys on iPhone; assume CRLF. */
-# endif
- case 11: /* VT */
- case 12: /* FF */
- if (state->cursor_y < rows - 1)
- state->cursor_y++;
- else
- a2_scroll (st);
- break;
- case 13: /* CR */
- state->cursor_x = 0;
- break;
- case 14: /* SO */
- case 15: /* SI */
- /* Dummy case - there is one and only one font. */
- break;
- case 24: /* CAN */
- case 26: /* SUB */
- /* Dummy case - these interrupt escape sequences, so
- they don't do anything in this state */
- break;
- case 27: /* ESC */
- state->escstate = 1;
- break;
- case 127: /* DEL */
- /* Dummy case - this is supposed to be ignored */
- break;
- case 155: /* CSI */
- state->escstate = 2;
- for(i = 0; i < NPAR; i++)
- state->csiparam[i] = 0;
- state->curparam = 0;
- break;
- default:
-
- /* states 102-106 are for UTF-8 decoding */
-
- if ((c & 0xE0) == 0xC0) { /* 110xxxxx - 11 bits, 2 bytes */
- state->unicruds = 1;
- state->unicrud[0] = c;
- state->escstate = 102;
- break;
- } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx - 16 bits, 3 bytes */
- state->unicruds = 1;
- state->unicrud[0] = c;
- state->escstate = 103;
- break;
- } else if ((c & 0xF8) == 0xF0) { /* 11110xxx - 21 bits, 4 bytes */
- state->unicruds = 1;
- state->unicrud[0] = c;
- state->escstate = 104;
- break;
- } else if ((c & 0xFC) == 0xF8) { /* 111110xx - 26 bits, 5 bytes */
- state->unicruds = 1;
- state->unicrud[0] = c;
- state->escstate = 105;
- break;
- } else if ((c & 0xFE) == 0xFC) { /* 1111110x - 31 bits, 6 bytes */
- state->unicruds = 1;
- state->unicrud[0] = c;
- state->escstate = 106;
- break;
- }
-
- PRINT:
-
- /* If the cursor is in column 39 and we print a character, then
- that character shows up in column 39, and the cursor is no longer
- visible on the screen (it's in "column 40".) If another character
- is printed, then that character shows up in column 0, and the
- cursor moves to column 1.
-
- This is empirically what xterm and gnome-terminal do, so that must
- be the right thing. (In xterm, the cursor vanishes, whereas; in
- gnome-terminal, the cursor overprints the character in col 39.)
- */
- if (state->cursor_x >= cols)
- {
- state->cursor_x = 0;
- if (state->cursor_y >= rows - 1)
- a2_scroll (st);
- else
- state->cursor_y++;
- }
-
- a2_goto(st, state->cursor_y, state->cursor_x); /* clips range */
- a2_ascii_printc (st, c,
- state->termattrib.bf.bold,
- state->termattrib.bf.blink,
- state->termattrib.bf.rev,
- False);
- state->cursor_x++;
-
- break;
- }
- break;
- case 1:
- switch (c)
- {
- case 24: /* CAN */
- case 26: /* SUB */
- state->escstate = 0;
- break;
- case 'c': /* Reset */
- a2_cls(st);
- state->escstate = 0;
- break;
- case 'D': /* Linefeed */
- if (state->cursor_y < rows - 1)
- state->cursor_y++;
- else
- a2_scroll (st);
- state->escstate = 0;
- break;
- case 'E': /* Newline */
- state->cursor_x = 0;
- state->escstate = 0;
- break;
- case 'M': /* Reverse newline */
- if (state->cursor_y > 0)
- state->cursor_y--;
- state->escstate = 0;
- break;
- case '7': /* Save state */
- state->saved_x = state->cursor_x;
- state->saved_y = state->cursor_y;
- state->escstate = 0;
- break;
- case '8': /* Restore state */
- state->cursor_x = state->saved_x;
- state->cursor_y = state->saved_y;
- state->escstate = 0;
- break;
- case '[': /* CSI */
- state->escstate = 2;
- for(i = 0; i < NPAR; i++)
- state->csiparam[i] = 0;
- state->curparam = 0;
- break;
- case '%': /* Select charset */
- /* @: Select default (ISO 646 / ISO 8859-1)
- G: Select UTF-8
- 8: Select UTF-8 (obsolete)
-
- We can just ignore this and always process UTF-8, I think?
- We must still catch the last byte, though.
- */
- case '(':
- case ')':
- /* I don't support different fonts either - see above
- for SO and SI */
- state->escstate = 3;
- break;
- default:
- /* Escape sequences not supported:
- *
- * H - Set tab stop
- * Z - Terminal identification
- * > - Keypad change
- * = - Other keypad change
- * ] - OS command
- */
- state->escstate = 0;
- break;
- }
- break;
- case 2:
- switch (c)
- {
- case 24: /* CAN */
- case 26: /* SUB */
- state->escstate = 0;
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- if (state->curparam < NPAR)
- state->csiparam[state->curparam] =
- (state->csiparam[state->curparam] * 10) + (c - '0');
- break;
- case ';':
- state->csiparam[++state->curparam] = 0;
- break;
- case '[':
- state->escstate = 3;
- break;
- case '@':
- for (i = 0; i < state->csiparam[0]; i++)
- {
- if(++state->cursor_x > cols)
- {
- state->cursor_x = 0;
- if (state->cursor_y < rows - 1)
- state->cursor_y++;
- else
- a2_scroll (st);
- }
- }
- state->escstate = 0;
- break;
- case 'F':
- state->cursor_x = 0;
- case 'A':
- if (state->csiparam[0] == 0)
- state->csiparam[0] = 1;
- if ((state->cursor_y -= state->csiparam[0]) < 0)
- state->cursor_y = 0;
- state->escstate = 0;
- break;
- case 'E':
- state->cursor_x = 0;
- case 'e':
- case 'B':
- if (state->csiparam[0] == 0)
- state->csiparam[0] = 1;
- if ((state->cursor_y += state->csiparam[0]) >= rows)
- state->cursor_y = rows - 1;
- state->escstate = 0;
- break;
- case 'a':
- case 'C':
- if (state->csiparam[0] == 0)
- state->csiparam[0] = 1;
- if ((state->cursor_x += state->csiparam[0]) >= cols)
- state->cursor_x = cols - 1;
- state->escstate = 0;
- break;
- case 'D':
- if (state->csiparam[0] == 0)
- state->csiparam[0] = 1;
- if ((state->cursor_x -= state->csiparam[0]) < 0)
- state->cursor_x = 0;
- state->escstate = 0;
- break;
- case 'd':
- if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
- state->cursor_y = rows - 1;
- state->escstate = 0;
- break;
- case '`':
- case 'G':
- if ((state->cursor_x = (state->csiparam[0] - 1)) >= cols)
- state->cursor_x = cols - 1;
- state->escstate = 0;
- break;
- case 'f':
- case 'H':
- if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
- state->cursor_y = rows - 1;
- if ((state->cursor_x = (state->csiparam[1] - 1)) >= cols)
- state->cursor_x = cols - 1;
- if(state->cursor_y < 0)
- state->cursor_y = 0;
- if(state->cursor_x < 0)
- state->cursor_x = 0;
- state->escstate = 0;
- break;
- case 'J':
- start = 0;
- end = rows * cols;
- if (state->csiparam[0] == 0)
- start = cols * state->cursor_y + state->cursor_x;
- if (state->csiparam[0] == 1)
- end = cols * state->cursor_y + state->cursor_x;
-
- a2_goto(st, state->cursor_y, state->cursor_x);
- for (i = start; i < end; i++)
- {
- a2_ascii_printc(st, ' ', False, False, False, False);
- }
- state->escstate = 0;
- break;
- case 'K':
- start = 0;
- end = cols;
- if (state->csiparam[0] == 0)
- start = state->cursor_x;
- if (state->csiparam[1] == 1)
- end = state->cursor_x;
-
- a2_goto(st, state->cursor_y, state->cursor_x);
- for (i = start; i < end; i++)
- {
- a2_ascii_printc(st, ' ', False, False, False, False);
- }
- state->escstate = 0;
- break;
- case 'm': /* Set attributes */
- for (i = 0; i <= state->curparam; i++)
- {
- switch(state->csiparam[i])
- {
- case 0:
- state->termattrib.w = 0;
- break;
- case 1:
- state->termattrib.bf.bold = 1;
- break;
- case 5:
- state->termattrib.bf.blink = 1;
- break;
- case 7:
- state->termattrib.bf.rev = 1;
- break;
- case 21:
- case 22:
- state->termattrib.bf.bold = 0;
- break;
- case 25:
- state->termattrib.bf.blink = 0;
- break;
- case 27:
- state->termattrib.bf.rev = 0;
- break;
- }
- }
- state->escstate = 0;
- break;
- case 's': /* Save position */
- state->saved_x = state->cursor_x;
- state->saved_y = state->cursor_y;
- state->escstate = 0;
- break;
- case 'u': /* Restore position */
- state->cursor_x = state->saved_x;
- state->cursor_y = state->saved_y;
- state->escstate = 0;
- break;
- case '?': /* DEC Private modes */
- if ((state->curparam != 0) || (state->csiparam[0] != 0))
- state->escstate = 0;
- break;
- default:
- /* Known unsupported CSIs:
- *
- * L - Insert blank lines
- * M - Delete lines (I don't know what this means...)
- * P - Delete characters
- * X - Erase characters (difference with P being...?)
- * c - Terminal identification
- * g - Clear tab stop(s)
- * h - Set mode (Mainly due to its complexity and lack of good
- docs)
- * l - Clear mode
- * m - Set mode (Phosphor is, per defenition, green on black)
- * n - Status report
- * q - Set keyboard LEDs
- * r - Set scrolling region (too exhausting - noone uses this,
- right?)
- */
- state->escstate = 0;
- break;
- }
- break;
- case 3:
- state->escstate = 0;
- break;
-
- case 102:
- case 103:
- case 104:
- case 105:
- case 106:
- {
- int total = state->escstate - 100; /* see what I did there */
- if (state->unicruds < total) {
- /* Buffer more bytes of the UTF-8 sequence */
- state->unicrud[state->unicruds++] = c;
- }
-
- if (state->unicruds >= total) {
- /* Done! Convert it to ASCII and print that. */
- char *s;
- state->unicrud[state->unicruds] = 0;
- s = utf8_to_latin1 ((const char *) state->unicrud, True);
- state->unicruds = 0;
- state->escstate = 0;
- if (s) {
- c = s[0];
- free (s);
- goto PRINT;
- } else {
- /* c = 0; */
- }
- }
- }
- break;
-
- default:
- abort();
- }
- a2_goto(st, state->cursor_y, state->cursor_x);
-}
-
-
-/*
- It's fun to put things like "gdb" as the command. For one, it's
- amusing how the standard mumble (version, no warranty, it's
- GNU/Linux dammit) occupies an entire screen on the Apple ][.
-*/
-
-static void
-terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
-{
- apple2_state_t *st=sim->st;
- int c;
- int i;
-
- struct terminal_controller_data *mine;
- if (!sim->controller_data)
- sim->controller_data=calloc(sizeof(struct terminal_controller_data),1);
- mine=(struct terminal_controller_data *) sim->controller_data;
- mine->dpy = sim->dpy;
-
- mine->fast_p = global_fast_p;
-
- switch(*stepno) {
-
- case 0:
- if (random()%2)
- st->gr_mode |= A2_GR_FULL; /* Turn on color mode even through it's
- showing text */
- a2_cls(st);
- a2_goto(st,0,16);
- a2_prints(st, "APPLE ][");
- a2_goto(st,2,0);
- mine->cursor_y = 2;
-
- if (! mine->tc) {
- mine->tc = textclient_open (mine->dpy);
- textclient_reshape (mine->tc,
- SCREEN_COLS, SCREEN_ROWS,
- SCREEN_COLS, SCREEN_ROWS,
- 0);
- }
-
- if (! mine->fast_p)
- *next_actiontime += 4.0;
- *stepno = 10;
-
- mine->last_emit_time = sim->curtime;
- break;
-
- case 10:
- case 11:
- {
- Bool first_line_p = (*stepno == 10);
- unsigned char buf[1024];
- int nr,nwant;
- double elapsed;
-
- elapsed=sim->curtime - mine->last_emit_time;
-
- nwant = elapsed * 25.0; /* characters per second */
-
- if (first_line_p) {
- *stepno = 11;
- nwant = 1;
- }
-
- if (nwant > 40) nwant = 40;
-
- if (mine->fast_p)
- nwant = sizeof(buf)-1;
-
- if (nwant <= 0) break;
-
- mine->last_emit_time = sim->curtime;
-
- nr=terminal_read(mine, buf, nwant);
- for (i=0; i<nr; i++) {
- c=buf[i];
-
- if (mine->tc)
- a2_vt100_printc (sim, mine, c);
- else
- a2_ascii_printc (st, c, False, False, False, True);
- }
- }
- break;
-
- case A2CONTROLLER_FREE:
- terminal_closegen(mine);
- free(mine);
- mine = 0;
- return;
- }
-}
-
-struct basic_controller_data {
- int prog_line;
- int x,y,k;
- const char * const * progtext;
- int progstep;
- char *rep_str;
- int rep_pos;
- double prog_start_time;
- char error_buf[256];
-};
-
-/*
- Adding more programs is easy. Just add a listing here and to all_programs,
- then add the state machine to actually execute it to basic_controller.
- */
-static const char * const moire_program[]={
- "10 HGR2\n",
- "20 FOR Y = 0 TO 190 STEP 2\n",
- "30 HCOLOR=4 : REM BLACK\n",
- "40 HPLOT 0,191-Y TO 279,Y\n",
- "60 HCOLOR=7 : REM WHITE\n",
- "80 HPLOT 0,190-Y TO 279,Y+1\n",
- "90 NEXT Y\n",
- "100 FOR X = 0 TO 278 STEP 3\n",
- "110 HCOLOR=4\n",
- "120 HPLOT 279-X,0 TO X,191\n",
- "140 HCOLOR=7\n",
- "150 HPLOT 278-X,0 TO X+1,191\n",
- "160 NEXT X\n",
- NULL
-};
-
-static const char * const sinewave_program[] = {
- "10 HGR\n",
- "25 K=0\n",
- "30 FOR X = 0 TO 279\n",
- "32 HCOLOR= 0\n",
- "35 HPLOT X,0 TO X,159\n",
- "38 HCOLOR= 3\n",
- "40 Y = 80 + SIN(15*(X-K)/279) * 40\n",
- "50 HPLOT X,Y\n",
- "60 NEXT X\n",
- "70 K=K+4\n",
- "80 GOTO 30\n",
- NULL
-};
-
-#if 0
-static const char * const dumb_program[]={
- "10 PRINT \"APPLE ][ ROOLZ! TRS-80 DROOLZ!\"\n",
- "20 GOTO 10\n",
- NULL
-};
-#endif
-
-static const char * const random_lores_program[]={
- "1 REM APPLE ][ SCREEN SAVER\n",
- "10 GR\n",
- "100 COLOR= RND(1)*16\n",
-
- "110 X=RND(1)*40\n",
- "120 Y1=RND(1)*40\n",
- "130 Y2=RND(1)*40\n",
- "140 FOR Y = Y1 TO Y2\n",
- "150 PLOT X,Y\n",
- "160 NEXT Y\n",
-
- "210 Y=RND(1)*40\n",
- "220 X1=RND(1)*40\n",
- "230 X2=RND(1)*40\n",
- "240 FOR X = X1 TO X2\n",
- "250 PLOT X,Y\n",
- "260 NEXT X\n",
- "300 GOTO 100\n",
-
- NULL
-};
-
-static char typo_map[256];
-
-static int make_typo(char *out_buf, const char *orig, char *err_buf)
-{
- int i,j;
- int errc;
- int success=0;
- err_buf[0]=0;
-
- typo_map['A']='Q';
- typo_map['S']='A';
- typo_map['D']='S';
- typo_map['F']='G';
- typo_map['G']='H';
- typo_map['H']='J';
- typo_map['J']='H';
- typo_map['K']='L';
- typo_map['L']=';';
-
- typo_map['Q']='1';
- typo_map['W']='Q';
- typo_map['E']='3';
- typo_map['R']='T';
- typo_map['T']='Y';
- typo_map['Y']='U';
- typo_map['U']='Y';
- typo_map['I']='O';
- typo_map['O']='P';
- typo_map['P']='[';
-
- typo_map['Z']='X';
- typo_map['X']='C';
- typo_map['C']='V';
- typo_map['V']='C';
- typo_map['B']='N';
- typo_map['N']='B';
- typo_map['M']='N';
- typo_map[',']='.';
- typo_map['.']=',';
-
- typo_map['!']='1';
- typo_map['@']='2';
- typo_map['#']='3';
- typo_map['$']='4';
- typo_map['%']='5';
- typo_map['^']='6';
- typo_map['&']='7';
- typo_map['*']='8';
- typo_map['(']='9';
- typo_map[')']='0';
-
- typo_map['1']='Q';
- typo_map['2']='W';
- typo_map['3']='E';
- typo_map['4']='R';
- typo_map['5']='T';
- typo_map['6']='Y';
- typo_map['7']='U';
- typo_map['8']='I';
- typo_map['9']='O';
- typo_map['0']='-';
-
- strcpy(out_buf, orig);
- for (i=0; out_buf[i]; i++) {
- char *p = out_buf+i;
-
- if (i>2 && p[-2]=='R' && p[-1]=='E' && p[0]=='M')
- break;
-
- if (isalpha(p[0]) &&
- isalpha(p[1]) &&
- p[0] != p[1] &&
- random()%15==0)
- {
- int tmp=p[1];
- p[1]=p[0];
- p[0]=tmp;
- success=1;
- sprintf(err_buf,"?SYNTAX ERROR\n");
- break;
- }
-
- if (random()%10==0 && strlen(p)>=4 && (errc=typo_map[(int)(unsigned char)p[0]])) {
- int remain=strlen(p);
- int past=random()%(remain-2)+1;
- memmove(p+past+past, p, remain+1);
- p[0]=errc;
- for (j=0; j<past; j++) {
- p[past+j]=010;
- }
- break;
- }
- }
- return success;
-}
-
-static const struct {
- const char * const * progtext;
- int progstep;
-} all_programs[]={
- {moire_program, 100},
- /*{dumb_program, 200}, */
- {sinewave_program, 400},
- {random_lores_program, 500},
-};
-
-static void
-basic_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
-{
- apple2_state_t *st=sim->st;
- int i;
-
- struct basic_controller_data *mine;
- if (!sim->controller_data)
- sim->controller_data=calloc(sizeof(struct basic_controller_data),1);
- mine=(struct basic_controller_data *) sim->controller_data;
-
- switch (*stepno) {
- case 0:
- st->gr_mode=0;
- a2_cls(st);
- a2_goto(st,0,16);
- a2_prints(st, "APPLE ][");
- a2_goto(st,23,0);
- a2_printc(st,']');
- sim->typing_rate=0.2;
-
- i=random()%countof(all_programs);
- mine->progtext=all_programs[i].progtext;
- mine->progstep=all_programs[i].progstep;
- mine->prog_line=0;
-
- *next_actiontime += 1.0;
- *stepno=10;
- break;
-
- case 10:
- if (st->cursx==0) a2_printc(st,']');
- if (mine->progtext[mine->prog_line]) {
- if (random()%4==0) {
- int err=make_typo(sim->typing_buf,
- mine->progtext[mine->prog_line],
- mine->error_buf);
- sim->typing=sim->typing_buf;
- if (err) {
- *stepno=11;
- } else {
- mine->prog_line++;
- }
- } else {
- sim->typing=mine->progtext[mine->prog_line++];
- }
- } else {
- *stepno=15;
- }
- break;
-
- case 11:
- sim->printing=mine->error_buf;
- *stepno=12;
- break;
-
- case 12:
- if (st->cursx==0) a2_printc(st,']');
- *next_actiontime+=1.0;
- *stepno=10;
- break;
-
- case 15:
- sim->typing="RUN\n";
- mine->y=0;
- mine->x=0;
- mine->k=0;
- mine->prog_start_time=*next_actiontime;
- *stepno=mine->progstep;
- break;
-
- /* moire_program */
- case 100:
- st->gr_mode=A2_GR_HIRES|A2_GR_FULL;
- for (i=0; i<24 && mine->y<192; i++)
- {
- a2_hline(st, 4, 0, 191-mine->y, 279, mine->y);
- a2_hline(st, 7, 0, 191-mine->y-1, 279, mine->y+1);
- mine->y += 2;
- }
- if (mine->y>=192) {
- mine->x = 0;
- *stepno = 110;
- }
- break;
-
- case 110:
- for (i=0; i<24 && mine->x<280; i++)
- {
- a2_hline(st, 4, 279-mine->x, 0, mine->x, 192);
- a2_hline(st, 7, 279-mine->x-1, 0, mine->x+1, 192);
- mine->x+=3;
- }
- if (mine->x >= 280) *stepno=120;
- break;
-
- case 120:
- if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
- break;
-
- /* dumb_program */
- case 200:
- mine->rep_str="\nAPPLE ][ ROOLZ! TRS-80 DROOLZ!";
- for (i=0; i<30; i++) {
- a2_prints(st, mine->rep_str);
- }
- *stepno=210;
- break;
-
- case 210:
- i=random()%strlen(mine->rep_str);
- while (mine->rep_pos != i) {
- a2_printc(st, mine->rep_str[mine->rep_pos]);
- mine->rep_pos++;
- if (!mine->rep_str[mine->rep_pos]) mine->rep_pos=0;
- }
- if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
- break;
-
- /* sinewave_program */
- case 400:
- st->gr_mode=A2_GR_HIRES;
- *stepno=410;
- break;
-
- case 410:
- for (i=0; i<48; i++) {
- int y=80 + (int)(75.0*sin(15.0*(mine->x-mine->k)/279.0));
- a2_hline(st, 0, mine->x, 0, mine->x, 159);
- a2_hplot(st, 3, mine->x, y);
- mine->x += 1;
- if (mine->x>=279) {
- mine->x=0;
- mine->k+=4;
- }
- }
- if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
- break;
-
- case 420:
- a2_prints(st, "]");
- *stepno=999;
- break;
-
- /* random_lores_program */
- case 500:
- st->gr_mode=A2_GR_LORES|A2_GR_FULL;
- a2_clear_gr(st);
- *stepno=510;
-
- case 510:
- for (i=0; i<10; i++) {
- int color,x,y,x1,x2,y1,y2;
-
- color=random()%15;
- x=random()%40;
- y1=random()%48;
- y2=random()%48;
- for (y=y1; y<y2; y++) a2_plot(st, color, x, y);
-
- x1=random()%40;
- x2=random()%40;
- y=random()%48;
- for (x=x1; x<x2; x++) a2_plot(st, color, x, y);
- }
- if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
- break;
-
- case 999:
- *stepno=0;
- break;
-
- case A2CONTROLLER_FREE:
- free(mine);
- mine = 0;
- break;
- }
-
-}
-
-static void (* const controllers[]) (apple2_sim_t *sim, int *stepno,
- double *next_actiontime) = {
- slideshow_controller,
- terminal_controller,
- basic_controller
-};
-
-struct state {
- int duration;
- Bool random_p;
- apple2_sim_t *sim;
- void (*controller) (apple2_sim_t *sim, int *stepno, double *next_actiontime);
-};
-
-
-static void *
-apple2_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- char *s;
-
- st->duration = get_integer_resource (dpy, "duration", "Integer");
-
- st->controller = 0;
- if (st->duration < 1) st->duration = 1;
-
- s = get_string_resource (dpy, "mode", "Mode");
- if (!s || !*s || !strcasecmp(s, "random"))
- st->random_p = True;
- else if (!strcasecmp(s, "text"))
- st->controller = terminal_controller;
- else if (!strcasecmp(s, "slideshow"))
- st->controller = slideshow_controller;
- else if (!strcasecmp(s, "basic"))
- st->controller = basic_controller;
- else
- {
- fprintf (stderr, "%s: mode must be text, slideshow, or random; not %s\n",
- progname, s);
- exit (1);
- }
- if (s) free (s);
-
- if (!global_program) {
- global_program = get_string_resource (dpy, "program", "Program");
- global_fast_p = get_boolean_resource (dpy, "fast", "Boolean");
- }
-
-
- /* Kludge for MacOS standalone mode: see OSX/SaverRunner.m. */
- {
- const char *s = getenv ("XSCREENSAVER_STANDALONE");
- if (s && *s && strcmp(s, "0"))
- {
- st->controller = terminal_controller;
- st->random_p = False;
- if (global_program) free (global_program);
- global_program = strdup (getenv ("SHELL"));
- global_fast_p = True;
- }
- }
-
-
- if (! st->random_p) {
- if (st->controller == terminal_controller ||
- st->controller == slideshow_controller)
- st->duration = 999999; /* these run "forever" */
- }
-
- return st;
-}
-
-static unsigned long
-apple2_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if (! st->sim) {
- if (st->random_p)
- st->controller = controllers[random() % (countof(controllers))];
- st->sim = apple2_start (dpy, window, st->duration, st->controller);
- }
-
- if (! apple2_one_frame (st->sim)) {
- st->sim = 0;
- }
-
-#ifdef HAVE_MOBILE
- return 0;
-#else
- return 5000;
-#endif
-}
-
-static void
-apple2_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- if (st->sim)
- analogtv_reconfigure (st->sim->dec);
-}
-
-static Bool
-apple2_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
-
- if (st->sim &&
- st->controller == terminal_controller &&
- event->xany.type == KeyPress) {
- terminal_keypress_handler (dpy, event, st->sim->controller_data);
- return True;
- }
-
- return False;
-}
-
-static void
-apple2_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- if (st->sim) {
- st->sim->stepno = A2CONTROLLER_DONE;
- if (apple2_one_frame (st->sim))
- abort(); /* should have freed! */
- }
- if (global_program) free (global_program);
- global_program = 0;
- free (st);
-}
-
-
-XSCREENSAVER_MODULE ("Apple2", apple2)
diff --git a/hacks/apple2.c b/hacks/apple2.c
deleted file mode 100644
index 1918a5c..0000000
--- a/hacks/apple2.c
+++ /dev/null
@@ -1,885 +0,0 @@
-/* xscreensaver, Copyright (c) 1998-2010 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
- * with additional work by Jamie Zawinski <jwz@jwz.org>
- */
-
-#include <math.h>
-#include "screenhackI.h"
-#include "apple2.h"
-#include "ximage-loader.h"
-
-#ifdef HAVE_XSHM_EXTENSION
-#include "xshm.h"
-#endif
-
-/*
- * Implementation notes
- *
- * The A2 had 3 display modes: text, lores, and hires. Text was 40x24, and it
- * disabled color in the TV. Lores gave you 40x48 graphics blocks, using the
- * same memory as the text screen. Each could be one of 16 colors. Hires gave
- * you 280x192 pixels. Odd pixels were blue or purple, and even pixels were
- * orange or green depending on the setting of the high bit in each byte.
- *
- * The graphics modes could also have 4 lines of text at the bottom. This was
- * fairly unreadable if you had a color monitor.
- *
- * Each mode had 2 different screens using different memory space. In hires
- * mode this was sometimes used for double buffering, but more often the lower
- * screen was full of code/data and the upper screen was used for display, so
- * you got random garbage on the screen.
- *
- * The text font is based on X's standard 6x10 font, with a few tweaks like
- * putting a slash across the zero.
- *
- * To use this, you'll call apple2(display, window, duration,
- * controller) where the function controller defines what will happen.
- * See bsod.c and apple2-main.c for example controllers. The
- * controller function gets called whenever the machine ready to start
- * something new. By setting sim->printing or sim->typing, it'll be
- * busy for some time spitting characters out one at a time. By
- * setting *next_actiontime+=X.X, it'll pause and just update the screen
- * for that long before calling the controller function again.
- *
- * By setting stepno to A2CONTROLLER_DONE, the loop will end. It will also end
- * after the time specified by the delay parameter. In either case, it calls
- * the controller with stepno==A2CONTROLLER_FREE to allow it to release any
- * memory.
- *
- * The void* apple2_sim_t::controller_data is for the use of the controller.
- * It will be initialize to NULL, and the controller can store its own state
- * there.
- *
- */
-
-void
-a2_scroll(apple2_state_t *st)
-{
- int i;
- st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off cursor */
-
- for (i=0; i<23; i++) {
- memcpy(st->textlines[i],st->textlines[i+1],40);
- }
- memset(st->textlines[23],0xe0,40);
-}
-
-static void
-a2_printc_1(apple2_state_t *st, char c, int scroll_p)
-{
- st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
-
- if (c == '\n') /* ^J == NL */
- {
- if (st->cursy==23)
- {
- if (scroll_p)
- a2_scroll(st);
- }
- else
- {
- st->cursy++;
- }
- st->cursx=0;
- }
- else if (c == 014) /* ^L == CLS, Home */
- {
- a2_cls(st);
- a2_goto(st,0,0);
- }
- else if (c == '\t') /* ^I == tab */
- {
- a2_goto(st, st->cursy, (st->cursx+8)&~7);
- }
- else if (c == 010) /* ^H == backspace */
- {
- st->textlines[st->cursy][st->cursx]=0xe0;
- a2_goto(st, st->cursy, st->cursx-1);
- }
- else if (c == '\r') /* ^M == CR */
- {
- st->cursx=0;
- }
- else
- {
- st->textlines[st->cursy][st->cursx]=c ^ 0xc0;
- st->cursx++;
- if (st->cursx==40) {
- if (st->cursy==23) {
- if (scroll_p)
- a2_scroll(st);
- } else {
- st->cursy++;
- }
- st->cursx=0;
- }
- }
-
- st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
-}
-
-void
-a2_printc(apple2_state_t *st, char c)
-{
- a2_printc_1(st, c, 1);
-}
-
-void
-a2_printc_noscroll(apple2_state_t *st, char c)
-{
- a2_printc_1(st, c, 0);
-}
-
-
-void
-a2_prints(apple2_state_t *st, char *s)
-{
- while (*s) a2_printc(st, *s++);
-}
-
-void
-a2_goto(apple2_state_t *st, int r, int c)
-{
- if (r > 23) r = 23;
- if (c > 39) c = 39;
- st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
- st->cursy=r;
- st->cursx=c;
- st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
-}
-
-void
-a2_cls(apple2_state_t *st)
-{
- int i;
- for (i=0; i<24; i++) {
- memset(st->textlines[i],0xe0,40);
- }
-}
-
-void
-a2_clear_gr(apple2_state_t *st)
-{
- int i;
- for (i=0; i<24; i++) {
- memset(st->textlines[i],0x00,40);
- }
-}
-
-void
-a2_clear_hgr(apple2_state_t *st)
-{
- int i;
- for (i=0; i<192; i++) {
- memset(st->hireslines[i],0,40);
- }
-}
-
-void
-a2_invalidate(apple2_state_t *st)
-{
-}
-
-void
-a2_poke(apple2_state_t *st, int addr, int val)
-{
-
- if (addr>=0x400 && addr<0x800) {
- /* text memory */
- int row=((addr&0x380)/0x80) + ((addr&0x7f)/0x28)*8;
- int col=(addr&0x7f)%0x28;
- if (row<24 && col<40) {
- st->textlines[row][col]=val;
- if (!(st->gr_mode&(A2_GR_HIRES)) ||
- (!(st->gr_mode&(A2_GR_FULL)) && row>=20)) {
- }
- }
- }
- else if (addr>=0x2000 && addr<0x4000) {
- int row=(((addr&0x1c00) / 0x400) * 1 +
- ((addr&0x0380) / 0x80) * 8 +
- ((addr&0x0078) / 0x28) * 64);
- int col=((addr&0x07f)%0x28);
- if (row<192 && col<40) {
- st->hireslines[row][col]=val;
- if (st->gr_mode&A2_GR_HIRES) {
- }
- }
- }
-}
-
-void
-a2_hplot(apple2_state_t *st, int hcolor, int x, int y)
-{
- int highbit,run;
-
- highbit=((hcolor<<5)&0x80) ^ 0x80; /* capture bit 2 into bit 7 */
-
- if (y<0 || y>=192 || x<0 || x>=280) return;
-
- for (run=0; run<2 && x<280; run++) {
- unsigned char *vidbyte = &st->hireslines[y][x/7];
- unsigned char whichbit=1<<(x%7);
- int masked_bit;
-
- *vidbyte = (*vidbyte & 0x7f) | highbit;
-
- /* use either bit 0 or 1 of hcolor for odd or even pixels */
- masked_bit = (hcolor>>(1-(x&1)))&1;
-
- /* Set whichbit to 1 or 0 depending on color */
- *vidbyte = (*vidbyte & ~whichbit) | (masked_bit ? whichbit : 0);
-
- x++;
- }
-}
-
-void
-a2_hline(apple2_state_t *st, int hcolor, int x1, int y1, int x2, int y2)
-{
- int dx,dy,incx,incy,x,y,balance;
-
- /* Bresenham's line drawing algorithm */
-
- if (x2>=x1) {
- dx=x2-x1;
- incx=1;
- } else {
- dx=x1-x2;
- incx=-1;
- }
- if (y2>=y1) {
- dy=y2-y1;
- incy=1;
- } else {
- dy=y1-y2;
- incy=-1;
- }
-
- x=x1; y=y1;
-
- if (dx>=dy) {
- dy*=2;
- balance=dy-dx;
- dx*=2;
- while (x!=x2) {
- a2_hplot(st, hcolor, x, y);
- if (balance>=0) {
- y+=incy;
- balance-=dx;
- }
- balance+=dy;
- x+=incx;
- }
- a2_hplot(st, hcolor, x, y);
- } else {
- dx*=2;
- balance=dx-dy;
- dy*=2;
- while (y!=y2) {
- a2_hplot(st, hcolor, x, y);
- if (balance>=0) {
- x+=incx;
- balance-=dy;
- }
- balance+=dx;
- y+=incy;
- }
- a2_hplot(st, hcolor, x, y);
- }
-}
-
-void
-a2_plot(apple2_state_t *st, int color, int x, int y)
-{
- int textrow=y/2;
- unsigned char byte;
-
- if (x<0 || x>=40 || y<0 || y>=48) return;
-
- byte=st->textlines[textrow][x];
- if (y&1) {
- byte = (byte&0xf0) | (color&0x0f);
- } else {
- byte = (byte&0x0f) | ((color&0x0f)<<4);
- }
- st->textlines[textrow][x]=byte;
-}
-
-void
-a2_display_image_loading(apple2_state_t *st, unsigned char *image,
- int lineno)
-{
- /*
- When loading images,it would normally just load the big binary
- dump into screen memory while you watched. Because of the way
- screen memory was laid out, it wouldn't load from the top down,
- but in a funny interleaved way. You should call this with lineno
- increasing from 0 thru 191 over a period of a few seconds.
- */
-
- int row=(((lineno / 24) % 8) * 1 +
- ((lineno / 3 ) % 8) * 8 +
- ((lineno / 1 ) % 3) * 64);
-
- memcpy (st->hireslines[row], &image[row * 40], 40);
-}
-
-/*
- Simulate plausible initial memory contents for running a program.
-*/
-void
-a2_init_memory_active(apple2_sim_t *sim)
-{
- int i,j,x,y,c;
- int addr=0;
- apple2_state_t *st=sim->st;
-
- while (addr<0x4000) {
- int n;
-
- switch (random()%4) {
- case 0:
- case 1:
- n=random()%500;
- for (i=0; i<n && addr<0x4000; i++) {
- unsigned char rb=((random()%6==0 ? 0 : random()%16) |
- ((random()%5==0 ? 0 : random()%16)<<4));
- a2_poke(st, addr++, rb);
- }
- break;
-
- case 2:
- /* Simulate shapes stored in memory. We use the font since we have it.
- Unreadable, since rows of each character are stored in consecutive
- bytes. It was typical to store each of the 7 possible shifts of
- bitmaps, for fastest blitting to the screen. */
- x=random()%(sim->text_im->width);
- for (i=0; i<100; i++) {
- for (y=0; y<8; y++) {
- c=0;
- for (j=0; j<8; j++) {
- c |= XGetPixel(sim->text_im, (x+j)%sim->text_im->width, y)<<j;
- }
- a2_poke(st, addr++, c);
- }
- x=(x+1)%(sim->text_im->width);
- }
- break;
-
- case 3:
- if (addr>0x2000) {
- n=random()%200;
- for (i=0; i<n && addr<0x4000; i++) {
- a2_poke(st, addr++, 0);
- }
- }
- break;
-
- }
- }
-}
-
-
-#if 1 /* jwz: since MacOS doesn't have "6x10", I dumped this font to a PNG...
- */
-
-#include "images/gen/apple2font_png.h"
-
-static void
-a2_make_font(apple2_sim_t *sim)
-{
- int pix_w, pix_h;
- XWindowAttributes xgwa;
- Pixmap m = 0;
- Pixmap p = image_data_to_pixmap (sim->dpy, sim->window,
- apple2font_png, sizeof(apple2font_png),
- &pix_w, &pix_h, &m);
- XImage *im = XGetImage (sim->dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
- XImage *mm = XGetImage (sim->dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
- unsigned long black =
- BlackPixelOfScreen (DefaultScreenOfDisplay (sim->dpy));
- int x, y;
-
- XFreePixmap (sim->dpy, p);
- XFreePixmap (sim->dpy, m);
- if (pix_w != 64*7) abort();
- if (pix_h != 8) abort();
-
- XGetWindowAttributes (sim->dpy, sim->window, &xgwa);
- sim->text_im = XCreateImage (sim->dpy, xgwa.visual, 1, XYBitmap, 0, 0,
- pix_w, pix_h, 8, 0);
- sim->text_im->data = malloc (sim->text_im->bytes_per_line *
- sim->text_im->height);
-
- /* Convert deep image to 1 bit */
- for (y = 0; y < pix_h; y++)
- for (x = 0; x < pix_w; x++)
- XPutPixel (sim->text_im, x, y,
- (XGetPixel (mm, x, y)
- ? XGetPixel (im, x, y) == black
- : 0));
-
- XDestroyImage (im);
- XDestroyImage (mm);
-}
-
-#else /* 0 */
-
-/* This table lists fixes for characters that differ from the standard 6x10
- font. Each encodes a pixel, as (charindex*7 + x) + (y<<10) + (value<<15)
- where value is 0 for white and 1 for black. */
-static const unsigned short a2_fixfont[] = {
- /* Fix $ */ 0x8421, 0x941d,
- /* Fix % */ 0x8024, 0x0028, 0x8425, 0x0426, 0x0825, 0x1027, 0x1426, 0x9427,
- 0x1824, 0x9828,
- /* Fix * */ 0x8049, 0x8449, 0x8849, 0x0c47, 0x0c48, 0x0c4a, 0x0c4b, 0x9049,
- 0x9449, 0x9849,
- /* Fix , */ 0x9057, 0x1458, 0x9856, 0x1857, 0x1c56,
- /* Fix . */ 0x1465, 0x1864, 0x1866, 0x1c65,
- /* Fix / */ 0x006e, 0x186a,
- /* Fix 0 */ 0x8874, 0x8c73, 0x9072,
- /* Fix 1 */ 0x0878, 0x1878, 0x187c,
- /* Fix 5 */ 0x8895, 0x0c94, 0x0c95,
- /* Fix 6 */ 0x809f, 0x8c9c, 0x109c,
- /* Fix 7 */ 0x8ca4, 0x0ca5, 0x90a3, 0x10a4,
- /* Fix 9 */ 0x08b3, 0x8cb3, 0x98b0,
- /* Fix : */ 0x04b9, 0x08b8, 0x08ba, 0x0cb9, 0x90b9, 0x14b9, 0x18b8, 0x18b9,
- 0x18ba, 0x1cb9,
- /* Fix ; */ 0x04c0, 0x08bf, 0x08c1, 0x0cc0, 0x90c0, 0x14c1, 0x98bf, 0x18c0,
- 0x1cbf,
- /* Fix < */ 0x80c8, 0x00c9, 0x84c7, 0x04c8, 0x88c6, 0x08c7, 0x8cc5, 0x0cc6,
- 0x90c6, 0x10c7,
- 0x94c7, 0x14c8, 0x98c8, 0x18c9,
- /* Fix > */ 0x80d3, 0x00d4, 0x84d4, 0x04d5, 0x88d5, 0x08d6, 0x8cd6, 0x0cd7,
- 0x90d5, 0x10d6,
- 0x94d4, 0x14d5, 0x98d3, 0x18d4,
- /* Fix @ */ 0x88e3, 0x08e4, 0x8ce4, 0x98e5,
- /* Fix B */ 0x84ef, 0x04f0, 0x88ef, 0x08f0, 0x8cef, 0x90ef, 0x10f0, 0x94ef,
- 0x14f0,
- /* Fix D */ 0x84fd, 0x04fe, 0x88fd, 0x08fe, 0x8cfd, 0x0cfe, 0x90fd, 0x10fe,
- 0x94fd, 0x14fe,
- /* Fix G */ 0x8116, 0x0516, 0x9916,
- /* Fix J */ 0x0129, 0x012a, 0x052a, 0x852b, 0x092a, 0x892b, 0x0d2a, 0x8d2b,
- 0x112a, 0x912b,
- 0x152a, 0x952b, 0x992a,
- /* Fix M */ 0x853d, 0x853f, 0x093d, 0x893e, 0x093f,
- /* Fix Q */ 0x915a, 0x155a, 0x955b, 0x155c, 0x195b, 0x995c, 0x1d5c,
- /* Fix V */ 0x8d7b, 0x0d7c, 0x0d7e, 0x8d7f, 0x917b, 0x117c, 0x117e, 0x917f,
- /* Fix [ */ 0x819e, 0x81a2, 0x859e, 0x899e, 0x8d9e, 0x919e, 0x959e, 0x999e,
- 0x99a2,
- /* Fix \ */ 0x01a5, 0x19a9,
- /* Fix ] */ 0x81ac, 0x81b0, 0x85b0, 0x89b0, 0x8db0, 0x91b0, 0x95b0, 0x99ac,
- 0x99b0,
- /* Fix ^ */ 0x01b5, 0x05b4, 0x05b6, 0x09b3, 0x89b5, 0x09b7, 0x8db4, 0x8db6,
- 0x91b3, 0x91b7,
- /* Fix _ */ 0x9db9, 0x9dbf,
- 0,
-};
-
-static void
-a2_make_font(apple2_sim_t *sim)
-{
- /*
- Generate the font. It used a 5x7 font which looks a lot like the standard X
- 6x10 font, with a few differences. So we render up all the uppercase
- letters of 6x10, and make a few tweaks (like putting a slash across the
- zero) according to fixfont.
- */
-
- int i;
- const char *def_font="6x10";
- XFontStruct *font;
- Pixmap text_pm;
- GC gc;
- XGCValues gcv;
-
- font = load_font_retry (sim->dpy, def_font);
- if (!font) {
- fprintf(stderr, "%s: can't load font %s\n", progname, def_font);
- abort();
- }
-
- text_pm=XCreatePixmap(sim->dpy, sim->window, 64*7, 8, 1);
-
- memset(&gcv, 0, sizeof(gcv));
- gcv.foreground=1;
- gcv.background=0;
- gcv.font=font->fid;
- gc=XCreateGC(sim->dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv);
-
- XSetForeground(sim->dpy, gc, 0);
- XFillRectangle(sim->dpy, text_pm, gc, 0, 0, 64*7, 8);
- XSetForeground(sim->dpy, gc, 1);
- for (i=0; i<64; i++) {
- char c=32+i;
- int x=7*i+1;
- int y=7;
- if (c=='0') {
- c='O';
- XDrawString(sim->dpy, text_pm, gc, x, y, &c, 1);
- } else {
- XDrawString(sim->dpy, text_pm, gc, x, y, &c, 1);
- }
- }
-
-# if 0
- for (i=0; a2_fixfont[i]; i++) {
- XSetForeground (sim->dpy, gc, (a2_fixfont[i]>>15)&1);
- XDrawPoint(sim->dpy, text_pm, gc, a2_fixfont[i]&0x3ff,
- (a2_fixfont[i]>>10)&0xf);
- }
- XWriteBitmapFile(sim->dpy, "/tmp/a2font.xbm", text_pm, 64*7, 8, -1, -1);
-# endif
-
- sim->text_im = XGetImage(sim->dpy, text_pm, 0, 0, 64*7, 8, ~0L, ZPixmap);
- XFreeGC(sim->dpy, gc);
- XFreePixmap(sim->dpy, text_pm);
-
- for (i=0; a2_fixfont[i]; i++) {
- XPutPixel(sim->text_im, a2_fixfont[i]&0x3ff,
- (a2_fixfont[i]>>10)&0xf,
- (a2_fixfont[i]>>15)&1);
- }
-}
-
-#endif /* 0 */
-
-apple2_sim_t *
-apple2_start(Display *dpy, Window window, int delay,
- void (*controller)(apple2_sim_t *sim,
- int *stepno,
- double *next_actiontime))
-{
- apple2_sim_t *sim;
-
- sim=(apple2_sim_t *)calloc(1,sizeof(apple2_sim_t));
- sim->dpy = dpy;
- sim->window = window;
- sim->delay = delay;
- sim->controller = controller;
-
- sim->st = (apple2_state_t *)calloc(1,sizeof(apple2_state_t));
- sim->dec = analogtv_allocate(dpy, window);
- sim->inp = analogtv_input_allocate();
-
- sim->reception.input = sim->inp;
- sim->reception.level = 1.0;
-
- sim->prompt=']';
-
- if (random()%4==0 && !sim->dec->use_cmap && sim->dec->use_color && sim->dec->visbits>=8) {
- sim->dec->flutter_tint=1;
- }
- else if (random()%3==0) {
- sim->dec->flutter_horiz_desync=1;
- }
- sim->typing_rate = 1.0;
-
- analogtv_set_defaults(sim->dec, "");
- sim->dec->squish_control=0.05;
- analogtv_setup_sync(sim->inp, 1, 0);
-
-
- a2_make_font(sim);
-
- sim->stepno=0;
- a2_goto(sim->st,23,0);
-
- if (random()%2==0) sim->basetime_tv.tv_sec -= 1; /* random blink phase */
- sim->next_actiontime=0.0;
-
- sim->curtime=0.0;
- sim->next_actiontime=sim->curtime;
- sim->controller (sim, &sim->stepno, &sim->next_actiontime);
-
-# ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&sim->basetime_tv, NULL);
-# else
- gettimeofday(&sim->basetime_tv);
-# endif
-
- return sim;
-}
-
-int
-apple2_one_frame (apple2_sim_t *sim)
-{
- double blinkphase;
- int i;
- int textrow;
-
- if (sim->stepno==A2CONTROLLER_DONE)
- goto DONE; /* when caller says we're done, be done, dammit! */
-
- {
- struct timeval curtime_tv;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&curtime_tv, &tzp);
-# else
- gettimeofday(&curtime_tv);
-# endif
- sim->curtime=(curtime_tv.tv_sec - sim->basetime_tv.tv_sec) +
- 0.000001*(curtime_tv.tv_usec - sim->basetime_tv.tv_usec);
- if (sim->curtime > sim->dec->powerup)
- sim->dec->powerup=sim->curtime;
- }
-
- blinkphase=sim->curtime/0.8;
-
- /* The blinking rate was controlled by 555 timer with a resistor/capacitor
- time constant. Because the capacitor was electrolytic, the flash rate
- varied somewhat between machines. I'm guessing 1.6 seconds/cycle was
- reasonable. (I soldered a resistor in mine to make it blink faster.) */
- i=sim->st->blink;
- sim->st->blink=((int)blinkphase)&1;
- if (sim->st->blink!=i && !(sim->st->gr_mode&A2_GR_FULL)) {
- int downcounter=0;
- /* For every row with blinking text, set the changed flag. This basically
- works great except with random screen garbage in text mode, when we
- end up redrawing the whole screen every second */
- int row, col;
- for (row=(sim->st->gr_mode ? 20 : 0); row<24; row++) {
- for (col=0; col<40; col++) {
- int c=sim->st->textlines[row][col];
- if ((c & 0xc0) == 0x40) {
- downcounter=4;
- break;
- }
- }
- if (downcounter>0) {
- downcounter--;
- }
- }
- }
-
- if (sim->curtime >= sim->delay)
- sim->stepno = A2CONTROLLER_DONE;
-
- if (sim->printing) {
- int nlcnt=0;
- while (*sim->printing) {
- if (*sim->printing=='\001') { /* pause */
- sim->printing++;
- break;
- }
- else if (*sim->printing=='\n') {
- a2_printc(sim->st,*sim->printing);
- sim->printing++;
- nlcnt++;
- if (nlcnt>=2) break;
- }
- else {
- a2_printc(sim->st,*sim->printing);
- sim->printing++;
- }
- }
- if (!*sim->printing) sim->printing=NULL;
- }
- else if (sim->curtime >= sim->next_actiontime) {
- if (sim->typing) {
-
- int c;
- /* If we're in the midst of typing a string, emit a character with
- random timing. */
- c =*sim->typing;
- if (c==0) {
- sim->typing=NULL;
- }
- else {
- sim->typing++;
- a2_printc(sim->st, c);
- if (c=='\r' || c=='\n') {
- sim->next_actiontime = sim->curtime;
- }
- else if (c==010) {
- sim->next_actiontime = sim->curtime + 0.1;
- }
- else {
- sim->next_actiontime = (sim->curtime +
- (((random()%1000)*0.001 + 0.3) *
- sim->typing_rate));
- }
- }
- } else {
- sim->next_actiontime = sim->curtime;
-
- sim->controller (sim, &sim->stepno, &sim->next_actiontime);
-
- if (sim->stepno==A2CONTROLLER_DONE) {
-
- DONE:
- sim->stepno=A2CONTROLLER_FREE;
- sim->controller (sim, &sim->stepno, &sim->next_actiontime);
- /* if stepno is changed, return 1 */
- if (sim->stepno != A2CONTROLLER_FREE)
- return 1;
-
- XClearWindow(sim->dpy, sim->window);
-
- /* free sim */
- /* This is from a2_make_font */
- free(sim->text_im->data);
- sim->text_im->data = 0;
- XDestroyImage(sim->text_im);
-
- /* And free else */
- analogtv_release(sim->dec);
- free(sim->st);
- free(sim->inp);
- free(sim);
-
- return 0;
- }
-
- }
- }
-
-
- analogtv_setup_sync(sim->inp, sim->st->gr_mode? 1 : 0, 0);
- analogtv_setup_frame(sim->dec);
-
- for (textrow=0; textrow<24; textrow++) {
- int row;
- for (row=textrow*8; row<textrow*8+8; row++) {
-
- /* First we generate the pattern that the video circuitry shifts out
- of memory. It has a 14.something MHz dot clock, equal to 4 times
- the color burst frequency. So each group of 4 bits defines a color.
- Each character position, or byte in hires, defines 14 dots, so odd
- and even bytes have different color spaces. So, pattern[0..600]
- gets the dots for one scan line. */
-
- signed char *pp=&sim->inp->signal[row+ANALOGTV_TOP+4][ANALOGTV_PIC_START+100];
-
- if ((sim->st->gr_mode&A2_GR_HIRES) &&
- (row<160 || (sim->st->gr_mode&A2_GR_FULL))) {
- int col;
-
- /* Emulate the mysterious pink line, due to a bit getting
- stuck in a shift register between the end of the last
- row and the beginning of this one. */
- if ((sim->st->hireslines[row][0] & 0x80) &&
- (sim->st->hireslines[row][39]&0x40)) {
- pp[-1]=ANALOGTV_WHITE_LEVEL;
- }
-
- for (col=0; col<40; col++) {
- unsigned char b=sim->st->hireslines[row][col];
- int shift=(b&0x80)?0:1;
-
- /* Each of the low 7 bits in hires mode corresponded to 2 dot
- clocks, shifted by one if the high bit was set. */
- for (i=0; i<7; i++) {
- pp[shift+1] = pp[shift] = (((b>>i)&1)
- ?ANALOGTV_WHITE_LEVEL
- :ANALOGTV_BLACK_LEVEL);
- pp+=2;
- }
- }
- }
- else if ((sim->st->gr_mode&A2_GR_LORES) &&
- (row<160 || (sim->st->gr_mode&A2_GR_FULL))) {
- int col;
- for (col=0; col<40; col++) {
- unsigned char nib=((sim->st->textlines[textrow][col] >> (((row/4)&1)*4))
- & 0xf);
- /* The low or high nybble was shifted out one bit at a time. */
- for (i=0; i<14; i++) {
- *pp = (((nib>>((col*14+i)&3))&1)
- ?ANALOGTV_WHITE_LEVEL
- :ANALOGTV_BLACK_LEVEL);
- pp++;
- }
- }
- }
- else {
- int col;
- for (col=0; col<40; col++) {
- int rev;
- int c=sim->st->textlines[textrow][col]&0xff;
- /* hi bits control inverse/blink as follows:
- 0x00: inverse
- 0x40: blink
- 0x80: normal
- 0xc0: normal */
- rev=!(c&0x80) && (!(c&0x40) || sim->st->blink);
-
- for (i=0; i<7; i++) {
- unsigned long pix=XGetPixel(sim->text_im,
- ((c&0x3f)^0x20)*7+i,
- row%8);
- pp[1] = pp[2] = ((pix^rev)
- ?ANALOGTV_WHITE_LEVEL
- :ANALOGTV_BLACK_LEVEL);
- pp+=2;
- }
- }
- }
- }
- }
- analogtv_reception_update(&sim->reception);
- {
- const analogtv_reception *rec = &sim->reception;
- analogtv_draw(sim->dec, 0.02, &rec, 1);
- }
-
- return 1;
-}
-
-
-#if 0
-void
-a2controller_test(apple2_sim_t *sim, int *stepno, double *next_actiontime)
-{
- int row,col;
-
- switch(*stepno) {
- case 0:
- a2_invalidate(sim->st);
- /*
- For testing color rendering. The spec is:
- red grn blu
- 0 black 0 0 0
- 1 red 227 30 96
- 2 dk blue 96 78 189
- 3 purple 255 68 253
- 4 dk green 0 163 96
- 5 gray 156 156 156
- 6 med blue 20 207 253
- 7 lt blue 208 195 255
- 8 brown 96 114 3
- 9 orange 255 106 60
- 10 grey 156 156 156
- 11 pink 255 160 208
- 12 lt green 20 245 60
- 13 yellow 208 221 141
- 14 aqua 114 255 208
- 15 white 255 255 255
- */
- sim->st->gr_mode=A2_GR_LORES;
- for (row=0; row<24; row++) {
- for (col=0; col<40; col++) {
- sim->st->textlines[row][col]=(row&15)*17;
- }
- }
- *next_actiontime+=0.4;
- *stepno=99;
- break;
-
- case 99:
- if (sim->curtime > 10) *stepno=-1;
- break;
- }
-}
-#endif
diff --git a/hacks/apple2.h b/hacks/apple2.h
deleted file mode 100644
index 87f18a9..0000000
--- a/hacks/apple2.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* xscreensaver, Copyright (c) 1998-2004 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
- * with additional work by Jamie Zawinski <jwz@jwz.org>
- */
-
-#ifndef __XSCREENSAVER_APPLE_II__
-#define __XSCREENSAVER_APPLE_II__
-
-#include "analogtv.h"
-
-typedef struct apple2_state {
- unsigned char hireslines[192][40];
- unsigned char textlines[24][40];
- int gr_text;
- enum {
- A2_GR_FULL=1,
- A2_GR_LORES=2,
- A2_GR_HIRES=4
- } gr_mode;
- int cursx;
- int cursy;
- int blink;
-
-} apple2_state_t;
-
-
-typedef struct apple2_sim_s apple2_sim_t;
-struct apple2_sim_s {
-
- void *controller_data;
-
- apple2_state_t *st;
-
- analogtv *dec;
- analogtv_input *inp;
- analogtv_reception reception;
-
- const char *typing;
- char typing_buf[1024];
- double typing_rate;
-
- char *printing;
- char printing_buf[1024];
-
- char prompt;
-
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- XImage *text_im;
-
- struct timeval basetime_tv;
- double curtime;
- double delay;
-
- int stepno;
- double next_actiontime;
- void (*controller)(apple2_sim_t *sim,
- int *stepno,
- double *next_actiontime);
-
-};
-
-
-enum {
- A2_HCOLOR_BLACK=0,
- A2_HCOLOR_GREEN=1,
- A2_HCOLOR_PURPLE=2,
- A2_HCOLOR_WHITE=3,
- A2_HCOLOR_ALTBLACK=4,
- A2_HCOLOR_RED=5,
- A2_HCOLOR_BLUE=6,
- A2_HCOLOR_ALTWHITE=7
- };
-
-enum {
- A2CONTROLLER_DONE=-1,
- A2CONTROLLER_FREE=-2
-};
-
-
-extern apple2_sim_t * apple2_start (Display *, Window, int delay,
- void (*)(apple2_sim_t *, int *stepno,
- double *next_actiontime));
-extern int apple2_one_frame (apple2_sim_t *);
-
-
-void a2_poke(apple2_state_t *st, int addr, int val);
-void a2_goto(apple2_state_t *st, int r, int c);
-void a2_cls(apple2_state_t *st);
-void a2_invalidate(apple2_state_t *st);
-
-void a2_add_disk_item(apple2_state_t *st, char *name, unsigned char *data,
- int len, char type);
-void a2_scroll(apple2_state_t *st);
-void a2_printc(apple2_state_t *st, char c);
-void a2_printc_noscroll(apple2_state_t *st, char c);
-void a2_prints(apple2_state_t *st, char *s);
-void a2_goto(apple2_state_t *st, int r, int c);
-void a2_cls(apple2_state_t *st);
-void a2_clear_hgr(apple2_state_t *st);
-void a2_clear_gr(apple2_state_t *st);
-void a2_invalidate(apple2_state_t *st);
-void a2_poke(apple2_state_t *st, int addr, int val);
-void a2_display_image_loading(apple2_state_t *st, unsigned char *image,
- int lineno);
-void a2_init_memory_active(apple2_sim_t *sim);
-void a2_hplot(apple2_state_t *st, int hcolor, int x, int y);
-void a2_hline(apple2_state_t *st, int hcolor, int x1, int y1, int x2, int y2);
-void a2_plot(apple2_state_t *st, int color, int x, int y);
-
-#endif /* __XSCREENSAVER_APPLE_II__ */
diff --git a/hacks/apple2.man b/hacks/apple2.man
deleted file mode 100644
index ec0bcd3..0000000
--- a/hacks/apple2.man
+++ /dev/null
@@ -1,197 +0,0 @@
-.TH XScreenSaver 1 "5-May-2004" "X Version 11"
-.SH NAME
-apple2 \- Apple ][ display emulator
-.SH SYNOPSIS
-.B apple2
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-visual \fIvisual\fP]
-[\-program \fIcommand to run\fP]
-[\-basic] [\-slideshow] [\-text]
-[\-meta] [\-esc] [\-bs] [\-del] [\-fast]
-[\-fps]
-.SH DESCRIPTION
-The
-.I apple2
-program simulates an original Apple ][ Plus computer in all its 1979
-glory. It also reproduces the appearance of display on a color
-television set of the period.
-.PP
-There are 3 modes: basic, slideshow, and text. Normally it chooses a
-mode randomly, but you can override with the \fI\-basic\fP,
-\fI\-slideshow\fP, or \fI\-text\fP options.
-
-In basic mode a simulated user types in a Basic program and runs it.
-
-In slideshow mode it chooses a number of images from the image source
-you configured into XScreenSaver and displays them within the
-limitations of the Apple ][ display hardware. With only 6 available
-colors, you can only make out the general shape of the pictures.
-
-In text mode it displays the output of a command or the contents of
-a file or URL (via the default
-.BR xscreensaver\-text (MANSUFFIX)
-program, which can be overridden with \fI\-program\fP).
-
-In text mode, it is also a fully functional (if anachronistic)
-vt100 terminal emulator.
-.SH OPTIONS
-.I apple2
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-basic
-Choose basic mode
-.TP 8
-.B \-slideshow
-Choose slideshow mode
-.TP 8
-.B \-text
-Choose text mode
-.TP 8
-.B \-program \fIsh-command\fP
-In text mode, the command to run to generate the text to display. This
-option may be any string acceptable to /bin/sh. The program will be
-run at the end of a pipe, and any characters that it prints to
-\fIstdout\fP will be printed on the Apple ][ display. If the program
-exits, it will be launched again after 3 seconds. Default:
-.BR xscreensaver\-text (MANSUFFIX).
-
-In text mode, \fIapple2\fP emulates a vt100 terminal running on a 40x24
-uppercase-only screen.
-
-For example:
-.nf
-.sp
- apple2 -text \\
- -program 'cat /usr/src/linux*/README | fold -sw40'
- apple2 -text -program 'ping apple.com'
- apple2 -text -program 'ps -e'
- apple2 -text -program 'od -txCz -w7 /dev/urandom'
- apple2 -text -program 'cat /dev/random'
- apple2 -text -fast -program 'xemacs -nw -q -f life'
- apple2 -text -fast \\
- -program 'xemacs -nw -q --eval "(hanoi 5)"'
-.sp
-.fi
-You can also use \fIapple2\fP as an extremely lo-fi replacement for the
-.BR xterm (1)
-and
-.BR gnome-terminal (1)
-terminal emulators:
-.nf
-.sp
- apple2 -text -fast -program tcsh
-.sp
-.fi
-.TP 8
-.B \-pty
-In \fI\-text\fP mode, launch the sub-program under a pty so that it
-can address the screen directly. This is the default.
-.TP 8
-.B \-pipe
-In \fI\-text\fP mode, launch the sub-program at the end of a pipe:
-do not let it address the screen directly.
-.TP 8
-.B \-esc
-When the user types a key with the Alt or Meta keys held down, send an
-ESC character first. This is the default.
-.TP 8
-.B \-meta
-When Meta or Alt are held down, set the high bit on the character instead.
-.TP 8
-.B \-del
-Swap Backspace and Delete. This is the default.
-.TP 8
-.B \-bs
-Do not swap Backspace and Delete.
-.TP 8
-.B \-fast
-Normally, characters are printed at the speed of an original Apple][
-computer; however, when using this program as a terminal emulator,
-the novelty of those 300 baud characters might wear off. You can use
-the \fI\-fast\fP option to speed things up a bit.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH TERMINAL EMULATION
-By default, \fIapple2\fP allocates a pseudo-tty for the \fI\-text\fP-mode
-sub-process to run under. This has the desirable side effect that the
-program will be able to use
-.BR ioctl (2)
-to fetch information about terminal parameters and window size, which
-many programs (such as
-.BR top (1))
-need to run properly. \fIapple2\fP will also set the environment
-variable \fITERM\fP to \fIvt100\fP in the child process.
-
-Any characters typed on the apple2 window will be passed along to
-the sub-process. (Note that this only works when running in "window"
-mode, not when running in \fI\-root\fP mode under xscreensaver.)
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.TP 8
-.B TERM
-to inform the sub-process of the type of terminal emulation.
-.SH X RESOURCES
-Notable X resources supported include the following which correspond
-to standard TV controls:
-.BR analogTVTint ,
-.BR analogTVColor ,
-.BR analogTVBrightness ,
-and
-.BR analogTVContrast
-which correspond to standard TV controls. They range from 0 to
-100,except for tint which is an angle between -180 and +180.
-.SH TRADEMARKS
-Apple ][ and Applesoft are trademarks of Apple Computer.
-
-.SH SEE ALSO
-.BR xscreensaver (1),
-.BR bsod (MANSUFFIX),
-.BR xscreensaver\-text (MANSUFFIX),
-.BR fortune (1),
-.BR phosphor (MANSUFFIX),
-.BR starwars (MANSUFFIX),
-.BR ljlatest (MANSUFFIX),
-.BR dadadodo (1),
-.BR webcollage (MANSUFFIX),
-.BR driftnet (1)
-.BR EtherPEG ,
-.BR EtherPeek ,
-.BR console_codes (4).
-.SH COPYRIGHT
-Copyright \(co 2002-2003 by Trevor Blackwell. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Television and Apple ][ emulation by Trevor Blackwell <tlb@tlb.org>.
-Slideshow and text mode by Jamie Zawinski <jwz@jwz.org>.
-Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>.
diff --git a/hacks/asm6502.c b/hacks/asm6502.c
deleted file mode 100644
index 8876beb..0000000
--- a/hacks/asm6502.c
+++ /dev/null
@@ -1,2274 +0,0 @@
-/*-*- indent-tabs-mode:nil -*- */
-/* Copyright (C) 2007 Jeremy English <jhe@jeremyenglish.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Created: 12-April-2007
- */
-
-/*
- This is a port of the javascript 6502 assembler, compiler and
- debugger. The orignal code was copyright 2006 by Stian Soreng -
- www.6502asm.com
-
- I changed the structure of the assembler in this version.
-*/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-/*#include <malloc.h>*/
-#include <string.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <ctype.h>
-#include <math.h>
-
-#if defined(HAVE_STDINT_H)
-# include <stdint.h>
-#elif defined(HAVE_INTTYPES_H)
-# include <inttypes.h>
-#endif
-#include <unistd.h>
-
-#include "yarandom.h"
-#include "asm6502.h"
-
-/*#ifdef DEBUGGER
-# define random rand
-#endif*/
-
-#ifndef HAVE_MOBILE
-# define READ_FILES
-#endif
-
-typedef enum{
- LEFT, RIGHT
- } Side;
-
-/*
-
-Bit Flags
- _ _ _ _ _ _ _ _
- |N||V||F||B||D||I||Z||C|
- - - - - - - - -
- 7 6 5 4 3 2 1 0
-
-*/
-
-typedef enum{
- CARRY_FL = 0, ZERO_FL = 1, INTERRUPT_FL = 2,
- DECIMAL_FL = 3, BREAK_FL = 4, FUTURE_FL = 5,
- OVERFLOW_FL = 6, NEGATIVE_FL = 7
- } Flags;
-
-
-typedef BOOL (*CharTest) (char);
-
-/* A jump function takes a pointer to the current machine and a
- opcode. The opcode is needed to figure out the memory mode. */
-/*typedef void (*JumpFunc) (machine_6502* AddrMode);*/
-
-typedef struct {
- m6502_AddrMode type;
- Bit32 value[MAX_PARAM_VALUE];
- unsigned int vp; /*value pointer, index into the value table.*/
- char *label;
- Bit32 lbladdr;
-} Param;
-
-typedef struct {
- Bit32 addr; /* Address of the label */
- char *label;
-} Label;
-
-typedef struct AsmLine AsmLine;
-struct AsmLine {
- BOOL labelDecl; /* Does the line have a label declaration? */
- Label *label;
- char *command;
- Param *param;
- AsmLine *next; /* in list */
-};
-
-typedef struct {
- Bit16 addr;
- Bit16 value;
-} Pointer;
-
-
-/*static void *emalloc(size_t n) {
- void *p = malloc(n);
- if (! p) abort();
- return p;
-}*/
-
-static void *ecalloc(uint32_t nelm, size_t nsize){
- void *p = calloc(nelm, nsize);
- if (!p) abort();
- return p;
-}
-
-/* estrdup() - Allocates memory for a new string a returns a copy of the source sting in it. */
-static char *estrdup(const char *source){
- char *s = strdup (source);
- if (!s) abort();
- return s;
-}
-
-static void checkAddress(Bit32 address){
- /* XXX: Do we want to kill the program here? */
- if (address >= MEM_64K)
- fprintf(stderr, "Address %d is beyond 64k", address);
-}
-
-/*
- * stackPush() - Push byte to stack
- *
- */
-
-static void stackPush(machine_6502 *machine, Bit8 value ) {
- if(machine->regSP >= STACK_BOTTOM){
- machine->memory[machine->regSP--] = value;
- }
- else{
- fprintf(stderr, "The stack is full: %.4x\n", machine->regSP);
- machine->codeRunning = FALSE;
- }
-}
-
-
-/*
- * stackPop() - Pop byte from stack
- *
- */
-
-static Bit8 stackPop(machine_6502 *machine) {
- if (machine->regSP < STACK_TOP){
- Bit8 value =machine->memory[++machine->regSP];
- return value;
- }
- else {
- /* fprintf(stderr, "The stack is empty.\n"); xxx */
- machine->codeRunning = FALSE;
- return 0;
- }
-}
-
-static void pushByte(machine_6502 *machine, Bit32 value ) {
- Bit32 address = machine->defaultCodePC;
- checkAddress(address);
- machine->memory[address] = value & 0xff;
- machine->codeLen++;
- machine->defaultCodePC++;
-}
-
-/*
- * pushWord() - Push a word using pushByte twice
- *
- */
-
-static void pushWord(machine_6502 *machine, Bit16 value ) {
- pushByte(machine, value & 0xff );
- pushByte(machine, (value>>8) & 0xff );
-}
-
-/*
- * popByte( machine_6502 *machine,) - Pops a byte
- *
- */
-
-static Bit8 popByte( machine_6502 *machine) {
- Bit8 value = machine->memory[machine->regPC];
- machine->regPC++;
- return value;
-}
-
-/*
- * popWord() - Pops a word using popByte() twice
- *
- */
-
-static int popWord(machine_6502 *machine) {
- return popByte(machine) + (popByte(machine) << 8);
-}
-
-
-/*
- * memReadByte() - Peek a byte, don't touch any registers
- *
- */
-
-static int memReadByte( machine_6502 *machine, int addr ) {
- if( addr == 0xfe ) return floor( random()%255 );
- return machine->memory[addr];
-}
-
-static void updateDisplayPixel(machine_6502 *machine, Bit16 addr){
- Bit8 idx = memReadByte(machine,addr) & 0x0f;
- Bit8 x,y;
- addr -= 0x200;
- x = addr & 0x1f;
- y = (addr >> 5);
- if (machine->plot) {
- machine->plot(x,y,idx,machine->plotterState);
- }
-}
-
-/*
- * memStoreByte() - Poke a byte, don't touch any registers
- *
- */
-
-static void memStoreByte( machine_6502 *machine, int addr, int value ) {
- machine->memory[ addr ] = (value & 0xff);
- if( (addr >= 0x200) && (addr<=0x5ff) )
- updateDisplayPixel(machine, addr );
-}
-
-
-
-/* EMULATION CODE */
-
-static Bit8 bitOn(Bit8 value,Flags bit){
- Bit8 mask = 1;
- mask = mask << bit;
- return ((value & mask) > 0);
-}
-
-static Bit8 bitOff(Bit8 value, Flags bit){
- return (! bitOn(value,bit));
-}
-
-static Bit8 setBit(Bit8 value, Flags bit, int on){
- Bit8 onMask = 1;
- Bit8 offMask = 0xff;
- onMask = onMask << bit;
- offMask = offMask ^ onMask;
- return ((on) ? value | onMask : value & offMask);
-}
-
-static Bit8 nibble(Bit8 value, Side side){
- switch(side){
- case LEFT: return value & 0xf0;
- case RIGHT: return value & 0xf;
- default:
- fprintf(stderr,"nibble unknown side\n");
- return 0;
- }
-}
-
-
-/* used for tracing. XXX: combined with function getvalue */
-static BOOL peekValue(machine_6502 *machine, m6502_AddrMode adm, Pointer *pointer, Bit16 PC){
- Bit8 zp;
- pointer->value = 0;
- pointer->addr = 0;
- switch(adm){
- case SINGLE:
- return FALSE;
- case IMMEDIATE_LESS:
- case IMMEDIATE_GREAT:
- case IMMEDIATE_VALUE:
- pointer->value = memReadByte(machine, PC);
- return TRUE;
- case INDIRECT_X:
- zp = memReadByte(machine, PC) + machine->regX;
- pointer->addr = memReadByte(machine,zp) +
- (memReadByte(machine,zp+1)<<8);
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case INDIRECT_Y:
- zp = memReadByte(machine, PC);
- pointer->addr = memReadByte(machine,zp) +
- (memReadByte(machine,zp+1)<<8) + machine->regY;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ZERO:
- pointer->addr = memReadByte(machine, PC);
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ZERO_X:
- pointer->addr = memReadByte(machine, PC) + machine->regX;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ZERO_Y:
- pointer->addr = memReadByte(machine, PC) + machine->regY;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ABS_OR_BRANCH:
- pointer->addr = memReadByte(machine, PC);
- return TRUE;
- case ABS_VALUE:
- pointer->addr = memReadByte(machine, PC) + (memReadByte(machine, PC+1) << 8);
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ABS_LABEL_X:
- case ABS_X:
- pointer->addr = (memReadByte(machine, PC) +
- (memReadByte(machine, PC+1) << 8)) + machine->regX;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ABS_LABEL_Y:
- case ABS_Y:
- pointer->addr = (memReadByte(machine, PC) +
- (memReadByte(machine, PC+1) << 8)) + machine->regY;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case DCB_PARAM:
- /* Handled elsewhere */
- break;
- }
- return FALSE;
-
-}
-
-
-/* Figure out how to get the value from the addrmode and get it.*/
-static BOOL getValue(machine_6502 *machine, m6502_AddrMode adm, Pointer *pointer){
- Bit8 zp;
- pointer->value = 0;
- pointer->addr = 0;
- switch(adm){
- case SINGLE:
- return FALSE;
- case IMMEDIATE_LESS:
- case IMMEDIATE_GREAT:
- case IMMEDIATE_VALUE:
- pointer->value = popByte(machine);
- return TRUE;
- case INDIRECT_X:
- zp = popByte(machine) + machine->regX;
- pointer->addr = memReadByte(machine,zp) +
- (memReadByte(machine,zp+1)<<8);
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case INDIRECT_Y:
- zp = popByte(machine);
- pointer->addr = memReadByte(machine,zp) +
- (memReadByte(machine,zp+1)<<8) + machine->regY;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ZERO:
- pointer->addr = popByte(machine);
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ZERO_X:
- pointer->addr = popByte(machine) + machine->regX;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ZERO_Y:
- pointer->addr = popByte(machine) + machine->regY;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ABS_OR_BRANCH:
- pointer->addr = popByte(machine);
- return TRUE;
- case ABS_VALUE:
- pointer->addr = popWord(machine);
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ABS_LABEL_X:
- case ABS_X:
- pointer->addr = popWord(machine) + machine->regX;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case ABS_LABEL_Y:
- case ABS_Y:
- pointer->addr = popWord(machine) + machine->regY;
- pointer->value = memReadByte(machine, pointer->addr);
- return TRUE;
- case DCB_PARAM:
- /* Handled elsewhere */
- break;
- }
- return FALSE;
-
-}
-
-#if 0
-static void dismem(machine_6502 *machine, m6502_AddrMode adm, char *output){
- Bit8 zp;
- Bit16 n;
- switch(adm){
- case SINGLE:
- *output = 0;
- break;
- case IMMEDIATE_LESS:
- case IMMEDIATE_GREAT:
- case IMMEDIATE_VALUE:
- n = popByte(machine);
- sprintf(output,"#$%x",n);
- break;
- case INDIRECT_X:
- zp = popByte(machine);
- n = memReadByte(machine,zp) +
- (memReadByte(machine,zp+1)<<8);
- sprintf(output,"($%x,x)",n);
- break;
- case INDIRECT_Y:
- zp = popByte(machine);
- n = memReadByte(machine,zp) +
- (memReadByte(machine,zp+1)<<8);
- sprintf(output,"($%x),y",n);
- break;
- case ABS_OR_BRANCH:
- case ZERO:
- n = popByte(machine);
- sprintf(output,"$%x",n);
- break;
- case ZERO_X:
- n = popByte(machine);
- sprintf(output,"$%x,x",n);
- break;
- case ZERO_Y:
- n = popByte(machine);
- sprintf(output,"$%x,y",n);
- break;
- case ABS_VALUE:
- n = popWord(machine);
- sprintf(output,"$%x",n);
- break;
- case ABS_LABEL_X:
- case ABS_X:
- n = popWord(machine);
- sprintf(output,"$%x,x",n);
- break;
- case ABS_LABEL_Y:
- case ABS_Y:
- n = popWord(machine);
- sprintf(output,"$%x,x",n);
- break;
- case DCB_PARAM:
- *output = 0;
- break;
- }
-}
-#endif
-
-/* manZeroNeg - Manage the negative and zero flags */
-static void manZeroNeg(machine_6502 *machine, Bit8 value){
- machine->regP = setBit(machine->regP, ZERO_FL, (value == 0));
- machine->regP = setBit(machine->regP, NEGATIVE_FL, bitOn(value,NEGATIVE_FL));
-}
-
-static void warnValue(BOOL isValue){
- if (! isValue){
- fprintf(stderr,"Invalid Value from getValue.\n");
- }
-}
-
-static void jmpADC(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- Bit16 tmp;
- Bit8 c = bitOn(machine->regP, CARRY_FL);
- BOOL isValue = getValue(machine, adm, &ptr);
-
- warnValue(isValue);
-
- if (bitOn(machine->regA, NEGATIVE_FL) &&
- bitOn(ptr.value, NEGATIVE_FL))
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- else
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 1);
-
- if (bitOn(machine->regP, DECIMAL_FL)) {
- tmp = nibble(machine->regA,RIGHT) + nibble(ptr.value,RIGHT ) + c;
- /* The decimal part is limited to 0 through 9 */
- if (tmp >= 10){
- tmp = 0x10 | ((tmp + 6) & 0xf);
- }
- tmp += nibble(machine->regA,LEFT) + nibble(ptr.value,LEFT);
- if (tmp >= 160){
- machine->regP = setBit(machine->regP,CARRY_FL,1);
- if (bitOn(machine->regP, OVERFLOW_FL) && tmp >= 0x180)
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- tmp += 0x60;
- }
- else {
- machine->regP = setBit(machine->regP,CARRY_FL,0);
- if (bitOn(machine->regP, OVERFLOW_FL) && tmp < 0x80)
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- }
- } /* end decimal */
- else {
- tmp = machine->regA + ptr.value + c;
- if ( tmp >= 0x100 ){
- machine->regP = setBit(machine->regP,CARRY_FL,1);
- if (bitOn(machine->regP, OVERFLOW_FL) && tmp >= 0x180)
- machine->regP =setBit(machine->regP, OVERFLOW_FL, 0);
- }
- else {
- machine->regP = setBit(machine->regP,CARRY_FL,0);
- if (bitOn(machine->regP, OVERFLOW_FL) && tmp < 0x80)
- machine->regP =setBit(machine->regP, OVERFLOW_FL, 0);
- }
- }
-
- machine->regA = tmp;
- manZeroNeg(machine,machine->regA);
-}
-
-static void jmpAND(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regA &= ptr.value;
- manZeroNeg(machine,machine->regA);
-}
-
-static void jmpASL(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- if (isValue){
- machine->regP = setBit(machine->regP, CARRY_FL, bitOn(ptr.value, NEGATIVE_FL));
- ptr.value = ptr.value << 1;
- ptr.value = setBit(ptr.value, CARRY_FL, 0);
- memStoreByte(machine, ptr.addr, ptr.value);
- manZeroNeg(machine,ptr.value);
- }
- else { /* Accumulator */
- machine->regP = setBit(machine->regP, CARRY_FL, bitOn(machine->regA, NEGATIVE_FL));
- machine->regA = machine->regA << 1;
- machine->regA = setBit(machine->regA, CARRY_FL, 0);
- manZeroNeg(machine,machine->regA);
- }
-
-}
-
-static void jmpBIT(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regP = setBit(machine->regP, ZERO_FL, !(ptr.value & machine->regA));
- machine->regP = setBit(machine->regP, OVERFLOW_FL, bitOn(ptr.value, OVERFLOW_FL));
- machine->regP = setBit(machine->regP, NEGATIVE_FL, bitOn(ptr.value, NEGATIVE_FL));
-
-}
-
-static void jumpBranch(machine_6502 *machine, Bit16 offset){
- if ( offset > 0x7f )
- machine->regPC = machine->regPC - (0x100 - offset);
- else
- machine->regPC = machine->regPC + offset;
-}
-
-static void jmpBPL(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOff(machine->regP,NEGATIVE_FL))
- jumpBranch(machine, ptr.addr);
-
-}
-
-static void jmpBMI(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOn(machine->regP,NEGATIVE_FL))
- jumpBranch(machine, ptr.addr);
-
-}
-
-static void jmpBVC(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOff(machine->regP,OVERFLOW_FL))
- jumpBranch(machine, ptr.addr);
-}
-
-static void jmpBVS(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOn(machine->regP,OVERFLOW_FL))
- jumpBranch(machine, ptr.addr);
-}
-
-static void jmpBCC(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOff(machine->regP,CARRY_FL))
- jumpBranch(machine, ptr.addr);
-}
-
-static void jmpBCS(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOn(machine->regP,CARRY_FL))
- jumpBranch(machine, ptr.addr);
-}
-
-static void jmpBNE(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOff(machine->regP, ZERO_FL))
- jumpBranch(machine, ptr.addr);
-}
-
-static void jmpBEQ(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (bitOn(machine->regP, ZERO_FL))
- jumpBranch(machine, ptr.addr);
-}
-
-static void doCompare(machine_6502 *machine, Bit16 reg, Pointer *ptr){
- machine->regP = setBit(machine->regP,CARRY_FL, ((reg + ptr->value) > 0xff));
- manZeroNeg(machine,(reg - ptr->value));
-}
-
-static void jmpCMP(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- doCompare(machine,machine->regA,&ptr);
-}
-
-static void jmpCPX(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- doCompare(machine,machine->regX,&ptr);
-}
-
-static void jmpCPY(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- doCompare(machine,machine->regY,&ptr);
-}
-
-static void jmpDEC(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- if (ptr.value > 0)
- ptr.value--;
- else
- ptr.value = 0xFF;
- memStoreByte(machine, ptr.addr, ptr.value);
- manZeroNeg(machine,ptr.value);
-}
-
-static void jmpEOR(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regA ^= ptr.value;
- manZeroNeg(machine, machine->regA);
-}
-
-static void jmpCLC(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, CARRY_FL, 0);
-}
-
-static void jmpSEC(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, CARRY_FL, 1);
-}
-
-static void jmpCLI(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, INTERRUPT_FL, 0);
-}
-
-static void jmpSEI(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, INTERRUPT_FL, 1);
-}
-
-static void jmpCLV(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
-}
-
-static void jmpCLD(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, DECIMAL_FL, 0);
-}
-
-static void jmpSED(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = setBit(machine->regP, DECIMAL_FL, 1);
-}
-
-static void jmpINC(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- ptr.value = (ptr.value + 1) & 0xFF;
- memStoreByte(machine, ptr.addr, ptr.value);
- manZeroNeg(machine,ptr.value);
-}
-
-static void jmpJMP(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regPC = ptr.addr;
-}
-
-static void jmpJSR(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- /* Move past the 2 byte parameter. JSR is always followed by
- absolute address. */
- Bit16 currAddr = machine->regPC + 2;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- stackPush(machine, (currAddr >> 8) & 0xff);
- stackPush(machine, currAddr & 0xff);
- machine->regPC = ptr.addr;
-}
-
-static void jmpLDA(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regA = ptr.value;
- manZeroNeg(machine, machine->regA);
-}
-
-static void jmpLDX(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regX = ptr.value;
- manZeroNeg(machine, machine->regX);
-}
-
-static void jmpLDY(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regY = ptr.value;
- manZeroNeg(machine, machine->regY);
-}
-
-static void jmpLSR(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- if (isValue){
- machine->regP =
- setBit(machine->regP, CARRY_FL,
- bitOn(ptr.value, CARRY_FL));
- ptr.value = ptr.value >> 1;
- ptr.value = setBit(ptr.value,NEGATIVE_FL,0);
- memStoreByte(machine,ptr.addr,ptr.value);
- manZeroNeg(machine,ptr.value);
- }
- else { /* Accumulator */
- machine->regP =
- setBit(machine->regP, CARRY_FL,
- bitOn(machine->regA, CARRY_FL));
- machine->regA = machine->regA >> 1;
- machine->regA = setBit(machine->regA,NEGATIVE_FL,0);
- manZeroNeg(machine,ptr.value);
- }
-}
-
-static void jmpNOP(machine_6502 *machine, m6502_AddrMode adm){
- /* no operation */
-}
-
-static void jmpORA(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- machine->regA |= ptr.value;
- manZeroNeg(machine,machine->regA);
-}
-
-static void jmpTAX(machine_6502 *machine, m6502_AddrMode adm){
- machine->regX = machine->regA;
- manZeroNeg(machine,machine->regX);
-}
-
-static void jmpTXA(machine_6502 *machine, m6502_AddrMode adm){
- machine->regA = machine->regX;
- manZeroNeg(machine,machine->regA);
-}
-
-static void jmpDEX(machine_6502 *machine, m6502_AddrMode adm){
- if (machine->regX > 0)
- machine->regX--;
- else
- machine->regX = 0xFF;
- manZeroNeg(machine, machine->regX);
-}
-
-static void jmpINX(machine_6502 *machine, m6502_AddrMode adm){
- Bit16 value = machine->regX + 1;
- machine->regX = value & 0xFF;
- manZeroNeg(machine, machine->regX);
-}
-
-static void jmpTAY(machine_6502 *machine, m6502_AddrMode adm){
- machine->regY = machine->regA;
- manZeroNeg(machine, machine->regY);
-}
-
-static void jmpTYA(machine_6502 *machine, m6502_AddrMode adm){
- machine->regA = machine->regY;
- manZeroNeg(machine, machine->regA);
-}
-
-static void jmpDEY(machine_6502 *machine, m6502_AddrMode adm){
- if (machine->regY > 0)
- machine->regY--;
- else
- machine->regY = 0xFF;
- manZeroNeg(machine, machine->regY);
-}
-
-static void jmpINY(machine_6502 *machine, m6502_AddrMode adm){
- Bit16 value = machine->regY + 1;
- machine->regY = value & 0xff;
- manZeroNeg(machine, machine->regY);
-}
-
-static void jmpROR(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- Bit8 cf;
- BOOL isValue = getValue(machine, adm, &ptr);
- if (isValue) {
- cf = bitOn(machine->regP, CARRY_FL);
- machine->regP =
- setBit(machine->regP, CARRY_FL,
- bitOn(ptr.value, CARRY_FL));
- ptr.value = ptr.value >> 1;
- ptr.value = setBit(ptr.value, NEGATIVE_FL, cf);
- memStoreByte(machine, ptr.addr, ptr.value);
- manZeroNeg(machine, ptr.value);
- }
- else { /* Implied */
- cf = bitOn(machine->regP, CARRY_FL);
- machine->regP =
- setBit(machine->regP, CARRY_FL,
- bitOn(machine->regA, CARRY_FL));
- machine->regA = machine->regA >> 1;
- machine->regA = setBit(machine->regA, NEGATIVE_FL, cf);
- manZeroNeg(machine, machine->regA);
- }
-}
-
-static void jmpROL(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- Bit8 cf;
- BOOL isValue = getValue(machine, adm, &ptr);
- if (isValue) {
- cf = bitOn(machine->regP, CARRY_FL);
- machine->regP =
- setBit(machine->regP, CARRY_FL,
- bitOn(ptr.value, NEGATIVE_FL));
- ptr.value = ptr.value << 1;
- ptr.value = setBit(ptr.value, CARRY_FL, cf);
- memStoreByte(machine, ptr.addr, ptr.value);
- manZeroNeg(machine, ptr.value);
- }
- else { /* Implied */
- cf = bitOn(machine->regP, CARRY_FL);
- machine->regP =
- setBit(machine->regP, CARRY_FL,
- bitOn(machine->regA,NEGATIVE_FL));
- machine->regA = machine->regA << 1;
- machine->regA = setBit(machine->regA, CARRY_FL, cf);
- manZeroNeg(machine, machine->regA);
- }
-}
-
-static void jmpRTI(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = stackPop(machine);
- machine->regPC = stackPop(machine);
-}
-
-static void jmpRTS(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- Bit16 nr = stackPop(machine);
- Bit16 nl = stackPop(machine);
- warnValue(! isValue);
- machine->regPC = (nl << 8) | nr;
-}
-
-static void jmpSBC(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- /*Bit8 vflag;*/
- Bit8 c = bitOn(machine->regP, CARRY_FL);
- Bit16 tmp, w;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- /*vflag = (bitOn(machine->regA,NEGATIVE_FL) &&
- bitOn(ptr.value, NEGATIVE_FL));*/
-
- if (bitOn(machine->regP, DECIMAL_FL)) {
- Bit8 ar = nibble(machine->regA, RIGHT);
- Bit8 br = nibble(ptr.value, RIGHT);
- Bit8 al = nibble(machine->regA, LEFT);
- Bit8 bl = nibble(ptr.value, LEFT);
-
- tmp = 0xf + ar - br + c;
- if ( tmp < 0x10){
- w = 0;
- tmp -= 6;
- }
- else {
- w = 0x10;
- tmp -= 0x10;
- }
- w += 0xf0 + al - bl;
- if ( w < 0x100) {
- machine->regP = setBit(machine->regP, CARRY_FL, 0);
- if (bitOn(machine->regP, OVERFLOW_FL) && w < 0x80)
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- w -= 0x60;
- }
- else {
- machine->regP = setBit(machine->regP, CARRY_FL, 1);
- if (bitOn(machine->regP, OVERFLOW_FL) && w >= 0x180)
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- }
- w += tmp;
- } /* end decimal mode */
- else {
- w = 0xff + machine->regA - ptr.value + c;
- if ( w < 0x100 ){
- machine->regP = setBit(machine->regP, CARRY_FL, 0);
- if (bitOn(machine->regP, OVERFLOW_FL) && w < 0x80)
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- }
- else {
- machine->regP = setBit(machine->regP, CARRY_FL, 1);
- if (bitOn(machine->regP, OVERFLOW_FL) && w >= 0x180)
- machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
- }
- }
- machine->regA = w;
- manZeroNeg(machine,machine->regA);
-}
-
-static void jmpSTA(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- memStoreByte(machine,ptr.addr,machine->regA);
-}
-
-static void jmpTXS(machine_6502 *machine, m6502_AddrMode adm){
- stackPush(machine,machine->regX);
-}
-
-static void jmpTSX(machine_6502 *machine, m6502_AddrMode adm){
- machine->regX = stackPop(machine);
- manZeroNeg(machine, machine->regX);
-}
-
-static void jmpPHA(machine_6502 *machine, m6502_AddrMode adm){
- stackPush(machine, machine->regA);
-}
-
-static void jmpPLA(machine_6502 *machine, m6502_AddrMode adm){
- machine->regA = stackPop(machine);
- manZeroNeg(machine, machine->regA);
-}
-
-static void jmpPHP(machine_6502 *machine, m6502_AddrMode adm){
- stackPush(machine,machine->regP);
-}
-
-static void jmpPLP(machine_6502 *machine, m6502_AddrMode adm){
- machine->regP = stackPop(machine);
- machine->regP = setBit(machine->regP, FUTURE_FL, 1);
-}
-
-static void jmpSTX(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- memStoreByte(machine,ptr.addr,machine->regX);
-}
-
-static void jmpSTY(machine_6502 *machine, m6502_AddrMode adm){
- Pointer ptr;
- BOOL isValue = getValue(machine, adm, &ptr);
- warnValue(isValue);
- memStoreByte(machine,ptr.addr,machine->regY);
-}
-
-
-
-/* OPCODES */
-static void assignOpCodes(m6502_Opcodes *opcodes){
-
- #define SETOP(num, _name, _Imm, _ZP, _ZPX, _ZPY, _ABS, _ABSX, _ABSY, _INDX, _INDY, _SNGL, _BRA, _func) \
-{sprintf(opcodes[num].name, "%.*s", MAX_LABEL_LEN-1, _name); \
- opcodes[num].Imm = _Imm; opcodes[num].ZP = _ZP; \
- opcodes[num].ZPX = _ZPX; opcodes[num].ZPY = _ZPY; opcodes[num].ABS = _ABS; \
- opcodes[num].ABSX = _ABSX; opcodes[num].ABSY = _ABSY; opcodes[num].INDX = _INDX; \
- opcodes[num].INDY = _INDY; opcodes[num].SNGL = _SNGL; opcodes[num].BRA = _BRA; \
- opcodes[num].func = _func;}
-
- /* OPCODE Imm ZP ZPX ZPY ABS ABSX ABSY INDX INDY SGNL BRA Jump Function*/
- SETOP( 0, "ADC", 0x69, 0x65, 0x75, 0x00, 0x6d, 0x7d, 0x79, 0x61, 0x71, 0x00, 0x00, jmpADC);
- SETOP( 1, "AND", 0x29, 0x25, 0x35, 0x31, 0x2d, 0x3d, 0x39, 0x00, 0x00, 0x00, 0x00, jmpAND);
- SETOP( 2, "ASL", 0x00, 0x06, 0x16, 0x00, 0x0e, 0x1e, 0x00, 0x00, 0x00, 0x0a, 0x00, jmpASL);
- SETOP( 3, "BIT", 0x00, 0x24, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpBIT);
- SETOP( 4, "BPL", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, jmpBPL);
- SETOP( 5, "BMI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, jmpBMI);
- SETOP( 6, "BVC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, jmpBVC);
- SETOP( 7, "BVS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, jmpBVS);
- SETOP( 8, "BCC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, jmpBCC);
- SETOP( 9, "BCS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, jmpBCS);
- SETOP(10, "BNE", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, jmpBNE);
- SETOP(11, "BEQ", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, jmpBEQ);
- SETOP(12, "CMP", 0xc9, 0xc5, 0xd5, 0x00, 0xcd, 0xdd, 0xd9, 0xc1, 0xd1, 0x00, 0x00, jmpCMP);
- SETOP(13, "CPX", 0xe0, 0xe4, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpCPX);
- SETOP(14, "CPY", 0xc0, 0xc4, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpCPY);
- SETOP(15, "DEC", 0x00, 0xc6, 0xd6, 0x00, 0xce, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, jmpDEC);
- SETOP(16, "EOR", 0x49, 0x45, 0x55, 0x00, 0x4d, 0x5d, 0x59, 0x41, 0x51, 0x00, 0x00, jmpEOR);
- SETOP(17, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, jmpCLC);
- SETOP(18, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, jmpSEC);
- SETOP(19, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, jmpCLI);
- SETOP(20, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, jmpSEI);
- SETOP(21, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, jmpCLV);
- SETOP(22, "CLD", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, jmpCLD);
- SETOP(23, "SED", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, jmpSED);
- SETOP(24, "INC", 0x00, 0xe6, 0xf6, 0x00, 0xee, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, jmpINC);
- SETOP(25, "JMP", 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpJMP);
- SETOP(26, "JSR", 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpJSR);
- SETOP(27, "LDA", 0xa9, 0xa5, 0xb5, 0x00, 0xad, 0xbd, 0xb9, 0xa1, 0xb1, 0x00, 0x00, jmpLDA);
- SETOP(28, "LDX", 0xa2, 0xa6, 0x00, 0xb6, 0xae, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, jmpLDX);
- SETOP(29, "LDY", 0xa0, 0xa4, 0xb4, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, jmpLDY);
- SETOP(30, "LSR", 0x00, 0x46, 0x56, 0x00, 0x4e, 0x5e, 0x00, 0x00, 0x00, 0x4a, 0x00, jmpLSR);
- SETOP(31, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, jmpNOP);
- SETOP(32, "ORA", 0x09, 0x05, 0x15, 0x00, 0x0d, 0x1d, 0x19, 0x01, 0x11, 0x00, 0x00, jmpORA);
- SETOP(33, "TAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, jmpTAX);
- SETOP(34, "TXA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, jmpTXA);
- SETOP(35, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, jmpDEX);
- SETOP(36, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, jmpINX);
- SETOP(37, "TAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, jmpTAY);
- SETOP(38, "TYA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, jmpTYA);
- SETOP(39, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, jmpDEY);
- SETOP(40, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, jmpINY);
- SETOP(41, "ROR", 0x00, 0x66, 0x76, 0x00, 0x6e, 0x7e, 0x00, 0x00, 0x00, 0x6a, 0x00, jmpROR);
- SETOP(42, "ROL", 0x00, 0x26, 0x36, 0x00, 0x2e, 0x3e, 0x00, 0x00, 0x00, 0x2a, 0x00, jmpROL);
- SETOP(43, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, jmpRTI);
- SETOP(44, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, jmpRTS);
- SETOP(45, "SBC", 0xe9, 0xe5, 0xf5, 0x00, 0xed, 0xfd, 0xf9, 0xe1, 0xf1, 0x00, 0x00, jmpSBC);
- SETOP(46, "STA", 0x00, 0x85, 0x95, 0x00, 0x8d, 0x9d, 0x99, 0x81, 0x91, 0x00, 0x00, jmpSTA);
- SETOP(47, "TXS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, jmpTXS);
- SETOP(48, "TSX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, jmpTSX);
- SETOP(49, "PHA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, jmpPHA);
- SETOP(50, "PLA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, jmpPLA);
- SETOP(51, "PHP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, jmpPHP);
- SETOP(52, "PLP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, jmpPLP);
- SETOP(53, "STX", 0x00, 0x86, 0x00, 0x96, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpSTX);
- SETOP(54, "STY", 0x00, 0x84, 0x94, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpSTY);
- SETOP(55, "---", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, NULL);
-}
-
-static void buildIndexCache(machine_6502 *machine){
- unsigned int i;
- for (i = 0; i < NUM_OPCODES; i++) {
- if (machine->opcodes[i].Imm != 0x00){
- machine->opcache[machine->opcodes[i].Imm].adm = IMMEDIATE_VALUE;
- machine->opcache[machine->opcodes[i].Imm].index = i;
- }
- if (machine->opcodes[i].ZP != 0x00){
- machine->opcache[machine->opcodes[i].ZP].adm = ZERO;
- machine->opcache[machine->opcodes[i].ZP].index = i;
- }
- if (machine->opcodes[i].ZPX != 0x00){
- machine->opcache[machine->opcodes[i].ZPX].adm = ZERO_X;
- machine->opcache[machine->opcodes[i].ZPX].index = i;;
- }
- if (machine->opcodes[i].ZPY != 0x00){
- machine->opcache[machine->opcodes[i].ZPY].adm = ZERO_Y;
- machine->opcache[machine->opcodes[i].ZPY].index = i;;
- }
- if (machine->opcodes[i].ABS != 0x00){
- machine->opcache[machine->opcodes[i].ABS].adm = ABS_VALUE;
- machine->opcache[machine->opcodes[i].ABS].index = i;;
- }
- if (machine->opcodes[i].ABSX != 0x00){
- machine->opcache[machine->opcodes[i].ABSX].adm = ABS_X;
- machine->opcache[machine->opcodes[i].ABSX].index = i;;
- }
- if (machine->opcodes[i].ABSY != 0x00){
- machine->opcache[machine->opcodes[i].ABSY].adm = ABS_Y;
- machine->opcache[machine->opcodes[i].ABSY].index = i;;
- }
- if (machine->opcodes[i].INDX != 0x00){
- machine->opcache[machine->opcodes[i].INDX].adm = INDIRECT_X;
- machine->opcache[machine->opcodes[i].INDX].index = i;;
- }
- if (machine->opcodes[i].INDY != 0x00){
- machine->opcache[machine->opcodes[i].INDY].adm = INDIRECT_Y;
- machine->opcache[machine->opcodes[i].INDY].index = i;;
- }
- if (machine->opcodes[i].SNGL != 0x00){
- machine->opcache[machine->opcodes[i].SNGL].adm = SINGLE;
- machine->opcache[machine->opcodes[i].SNGL].index = i;
- }
- if (machine->opcodes[i].BRA != 0x00){
- machine->opcache[machine->opcodes[i].BRA].adm = ABS_OR_BRANCH;
- machine->opcache[machine->opcodes[i].BRA].index = i;
- }
- }
-}
-
-/* opIndex() - Search the opcode table for a match. If found return
- the index into the optable and the address mode of the opcode. If
- the opcode is not found then return -1. */
-static int opIndex(machine_6502 *machine, Bit8 opcode, m6502_AddrMode *adm){
- /* XXX could catch errors by setting a addressmode of error or something */
- *adm = machine->opcache[opcode].adm;
- return machine->opcache[opcode].index;
-}
-
-
-/* Assembly parser */
-
-static Param *newParam(void){
- Param *newp;
- int i = 0;
-
- newp = (Param *) ecalloc(1, sizeof(Param));
- newp->type = SINGLE;
- for (i = 0; i < MAX_PARAM_VALUE; i++)
- newp->value[i] = 0;
- newp->vp = 0;
- newp->label = ecalloc(MAX_LABEL_LEN,sizeof(char));
- newp->lbladdr = 0;
- return newp;
-}
-
-/* Copy the fields from p2 to p1 */
-static void copyParam(Param *p1, Param *p2){
- int i = 0;
- strncpy(p1->label,p2->label,MAX_LABEL_LEN);
- for(i = 0; i < MAX_PARAM_VALUE; i++)
- p1->value[i] = p2->value[i];
- p1->vp = p2->vp;
- p1->type = p2->type;
-}
-
-static Label *newLabel(void){
- Label *newp;
-
- newp = (Label *) ecalloc(1, sizeof(Label));
- newp->addr = 0;
- newp->label = ecalloc(MAX_LABEL_LEN,sizeof(char));
-
- return newp;
-}
-
-static AsmLine *newAsmLine(char *cmd, char *label, BOOL decl, Param *param, int lc)
-{
- AsmLine *newp;
-
- newp = (AsmLine *) ecalloc(1, sizeof(AsmLine));
- newp->labelDecl = decl;
- newp->label = newLabel();
- sprintf(newp->label->label, "%.*s", MAX_LABEL_LEN - 1, label);
- newp->command = estrdup(cmd);
- newp->param = newParam();
- copyParam(newp->param, param);
- newp->next = NULL;
- return newp;
-}
-
-static AsmLine *addend(AsmLine *listp, AsmLine *newp)
-{
- AsmLine *p;
- if(listp == NULL)
- return newp;
- for (p =listp; p->next != NULL; p = p->next)
- ;
- p->next = newp;
- return listp;
-}
-
-static BOOL apply(AsmLine *listp, BOOL(*fn)(AsmLine*, void*), void *arg)
-{
- AsmLine *p;
- if(listp == NULL)
- return FALSE;
- for (p = listp; p != NULL; p = p->next)
- if (! fn(p,arg) )
- return FALSE;
- return TRUE;
-}
-
-static void freeParam(Param *param){
- free(param->label);
- free(param);
-}
-
-static void freeLabel(Label *label){
- free(label->label);
- free(label);
-}
-
-static void freeallAsmLine(AsmLine *listp)
-{
- AsmLine *next;
- for(; listp != NULL; listp = next){
- next = listp->next;
- freeParam(listp->param);
- freeLabel(listp->label);
- free(listp->command);
- free(listp);
- }
-}
-
-static BOOL addvalue(Param *param,Bit32 value){
- /* jwz: suppress "0 <= unsigned" warning */
- if (/*0 <= param->vp &&*/ param->vp < MAX_PARAM_VALUE) {
- param->value[param->vp++] = value;
- return TRUE;
- }
- else {
- fprintf(stderr,"Wrong number of parameters: %d. The limit is %d\n",param->vp+1, MAX_PARAM_VALUE);
- return FALSE;
- }
-}
-
-static void parseError(char *s){
- fprintf(stderr,"6502 Syntax Error: %s\n", s);
-}
-
-/* stoupper() - Destructivley modifies the string making all letters upper case*/
-static void stoupper(char **s){
- int i = 0;
- while((*s)[i] != '\0'){
- (*s)[i] = toupper((*s)[i]);
- i++;
- }
-}
-
-static BOOL isWhite(char c){
- return (c == '\r' || c == '\t' || c == ' ');
-}
-
-static void skipSpace(char **s){
- for(; isWhite(**s); (*s)++)
- ;
-}
-
-/* nullify() - fills a string with upto sourceLength null characters. */
-static void nullify(char *token, unsigned int sourceLength){
- unsigned int i = 0;
- while (i < sourceLength)
- token[i++] = '\0';
-}
-
-static BOOL isBlank(const char *token){
- return (token[0] == '\0');
-}
-
-static BOOL isCommand(machine_6502 *machine, const char *token){
- int i = 0;
-
- while (i < NUM_OPCODES) {
- if (strcmp(machine->opcodes[i].name,token) == 0)
- return TRUE;
- i++;
- }
-
- if (strcmp(token, "DCB") == 0) return TRUE;
- return FALSE;
-}
-
-/* hasChar() - Check to see if the current line has a certain
- charater */
-static BOOL hasChar(char *s, char c){
- for(; *s != '\0' && *s != '\n'; s++) {
- if (*s == c)
- return TRUE;
- }
- return FALSE;
-}
-
-static BOOL ishexdigit(char c){
- if (isdigit(c))
- return TRUE;
- else {
- char c1 = toupper(c);
- return ('A' <= c1 && c1 <= 'F');
- }
-}
-
-/* isCmdChar() - Is this a valid character for a command. All of the
- command are alpha except for the entry point code that is "*=" */
-static BOOL isCmdChar(char c){
- return (isalpha(c) || c == '*' || c == '=');
-}
-
-
-/* command() - parse a command from the source code. We pass along a
- machine so the opcode can be validated. */
-static BOOL command(machine_6502 *machine, char **s, char **cmd){
- int i = 0;
- skipSpace(s);
- for(;isCmdChar(**s) && i < MAX_CMD_LEN; (*s)++)
- (*cmd)[i++] = **s;
- if (i == 0)
- return TRUE; /* Could be a blank line. */
- else if (strcmp(*cmd,"*=") == 0)
- return TRUE; /* This is an entry point. */
- else
- return isCommand(machine,*cmd);
-}
-
-static BOOL declareLabel(char **s, char **label){
- int i = 0;
- skipSpace(s);
- for(;**s != ':' && **s != '\n' && **s != '\0'; (*s)++){
- if (isWhite(**s))
- continue;
- (*label)[i++] = **s;
- }
- if (i == 0)
- return FALSE; /* Current line has to have a label */
- else if (**s == ':'){
- (*s)++; /* Skip colon */
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static BOOL parseHex(char **s, Bit32 *value){
- enum { MAX_HEX_LEN = 5 };
- if (**s == '$') {
- char *hex = ecalloc(MAX_HEX_LEN, sizeof(char));
- int i = 0;
-
- (*s)++; /* move pass $ */
- for(; ishexdigit(**s) && i < MAX_HEX_LEN; (*s)++)
- hex[i++] = **s;
-
- *value = strtol(hex,NULL,16);
- free(hex);
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static BOOL parseDec(char **s, Bit32 *value){
- enum { MAX_DEC_LEN = 4 };
- char *dec = ecalloc(MAX_DEC_LEN, sizeof(char));
- int i;
- for(i = 0; isdigit(**s) && i < MAX_DEC_LEN; (*s)++)
- dec[i++] = **s;
-
- if (i > 0){
- *value = atoi(dec);
- free(dec);
- return TRUE;
- }
- else{
- free(dec);
- return FALSE;
- }
-}
-
-static BOOL parseValue(char **s, Bit32 *value){
- skipSpace(s);
- if (**s == '$')
- return parseHex(s, value);
- else
- return parseDec(s, value);
-}
-
-static BOOL paramLabel(char **s, char **label){
- int i;
- for(i = 0; (isalnum(**s) || **s == '_') && i < MAX_LABEL_LEN; (*s)++)
- (*label)[i++] = **s;
-
- if (i > 0)
- return TRUE;
- else
- return FALSE;
-}
-
-static BOOL immediate(char **s, Param *param){
- if (**s != '#')
- return FALSE;
-
- (*s)++; /*Move past hash */
- if (**s == '<' || **s == '>'){
- char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
- param->type = (**s == '<') ? IMMEDIATE_LESS : IMMEDIATE_GREAT;
- (*s)++; /* move past < or > */
- if (paramLabel(s, &label)){
- sprintf(param->label, "%.*s", MAX_LABEL_LEN-1, label);
- free(label);
- return TRUE;
- }
- free(label);
- }
- else {
- Bit32 value;
- if (parseValue(s, &value)){
- if (value > 0xFF){
- parseError("Immediate value is too large.");
- return FALSE;
- }
- param->type = IMMEDIATE_VALUE;
- return addvalue(param, value);
- }
- }
- return FALSE;
-}
-
-static BOOL isDirection(char c){
- return (c == 'X' || c == 'Y');
-}
-
-static BOOL getDirection(char **s, char *direction){
- skipSpace(s);
- if (**s == ','){
- (*s)++;
- skipSpace(s);
- if (isDirection(**s)){
- *direction = **s;
- (*s)++;
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static BOOL indirect(char **s, Param *param){
- Bit32 value;
- char c;
- if (**s == '(')
- (*s)++;
- else
- return FALSE;
-
- if (! parseHex(s,&value))
- return FALSE;
- if (value > 0xFF) {
- parseError("Indirect value is too large.");
- return FALSE;
- }
- if (!addvalue(param, value))
- return FALSE;
- skipSpace(s);
- if (**s == ')'){
- (*s)++;
- if (getDirection(s,&c)) {
- if (c == 'Y'){
- param->type = INDIRECT_Y;
- return TRUE;
- }
- }
- }
- else if (getDirection(s, &c)){
- if (c == 'X'){
- skipSpace(s);
- if (**s == ')'){
- (*s)++;
- param->type = INDIRECT_X;
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-
-static BOOL dcbValue(char **s, Param *param){
- Bit32 val;
- if (! parseValue(s,&val))
- return FALSE;
-
- if (val > 0xFF)
- return FALSE;
-
- if (!addvalue(param,val))
- return FALSE;
-
- param->type = DCB_PARAM;
-
- skipSpace(s);
- if(**s == ','){
- (*s)++;
- return dcbValue(s, param);
- }
- else
- return TRUE;
-}
-
-static BOOL value(char **s, Param *param){
- Bit32 val;
- BOOL abs;
- BOOL dir;
- char c = '\0';
- if (! parseValue(s,&val))
- return FALSE;
-
- abs = (val > 0xFF);
- dir = getDirection(s,&c);
- if (!addvalue(param,val))
- return FALSE;
-
- if(abs && dir){
- if (c == 'X')
- param->type = ABS_X;
- else if (c == 'Y')
- param->type = ABS_Y;
- else
- return FALSE;
- }
- else if (abs)
- param->type = ABS_VALUE;
- else if (dir){
- if (c == 'X')
- param->type = ZERO_X;
- else if (c == 'Y')
- param->type = ZERO_Y;
- else
- return FALSE;
- }
- else
- param->type = ZERO;
-
- return TRUE;
-}
-
-static BOOL label(char **s, Param *param){
- char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
- char c;
- BOOL labelOk = FALSE;
- if (paramLabel(s, &label)){
- labelOk = TRUE;
- param->type = ABS_OR_BRANCH;
- if (getDirection(s, &c)){
- if (c == 'X')
- param->type = ABS_LABEL_X;
- else if (c == 'Y')
- param->type = ABS_LABEL_Y;
- else
- labelOk = FALSE;
- }
- strncpy(param->label,label,MAX_LABEL_LEN);
- }
- free(label);
- return labelOk;
-}
-
-static BOOL parameter(const char *cmd, char **s, Param *param){
- skipSpace(s);
- if (**s == '\0' || **s == '\n')
- return TRUE;
- else if (**s == '#')
- return immediate(s,param);
- else if (**s == '(')
- return indirect(s,param);
- else if (**s == '$' || isdigit(**s)){
- if (strcmp(cmd, "DCB") == 0)
- return dcbValue(s,param);
- else
- return value(s,param);
- }
- else if (isalpha(**s))
- return label(s ,param);
- else
- return FALSE; /* Invalid Parameter */
-}
-
-static void comment(char **s){
- skipSpace(s);
- if (**s == ';')
- for(;**s != '\n' && **s != '\0'; (*s)++)
- ;
-}
-
-static void initParam(Param *param){
- int i;
- param->type = SINGLE;
- for(i = 0; i < MAX_PARAM_VALUE; i++)
- param->value[i] = 0;
- param->vp = 0;
- nullify(param->label,MAX_LABEL_LEN);
-}
-
-
-static AsmLine *parseAssembly(machine_6502 *machine, BOOL *codeOk, const char *code){
- char *s;
- char *cmd = ecalloc(MAX_CMD_LEN, sizeof(char));
- char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
- char *start; /*pointer to the start of the code.*/
- unsigned int lc = 1;
- Param *param;
- BOOL decl;
- AsmLine *listp = NULL;
-
- *codeOk = TRUE;
- param = newParam();
- s = estrdup(code);
- start = s;
- stoupper(&s);
-
- while(*s != '\0' && *codeOk){
- initParam(param);
- nullify(cmd, MAX_CMD_LEN);
- nullify(label, MAX_LABEL_LEN);
- decl = FALSE;
- skipSpace(&s);
- comment(&s);
- if (*s == '\n'){
- lc++;
- s++;
- continue; /* blank line */
- }
- else if (*s == '\0')
- continue; /* no newline at the end of the code */
- else if (hasChar(s,':')){
- decl = TRUE;
- if(! declareLabel(&s,&label)){
- *codeOk = FALSE;
- break;
- }
- skipSpace(&s);
- }
- if(!command(machine, &s, &cmd)){
- *codeOk = FALSE;
- break;
- }
- skipSpace(&s);
- comment(&s);
- if(!parameter(cmd, &s, param)){
- *codeOk = FALSE;
- break;
- }
- skipSpace(&s);
- comment(&s);
- if (*s == '\n' || *s == '\0'){
- AsmLine *asmm;
- asmm = newAsmLine(cmd,label,decl,param,lc);
- listp = addend(listp,asmm);
- }
- else {
- *codeOk = FALSE;
- break;
- }
- }
- if (! *codeOk)
- fprintf(stderr,"Syntax error at line %u\n", lc);
- free(start);
- free(cmd);
- free(label);
- freeParam(param);
- return listp;
-}
-
-#ifdef READ_FILES
-/* fileToBuffer() - Allocates a buffer and loads all of the file into memory. */
-static char *fileToBuffer(const char *filename){
- const int defaultSize = 1024;
- FILE *ifp;
- int c;
- int size = defaultSize;
- int i = 0;
- char *buffer = ecalloc(defaultSize,sizeof(char));
-
- if (!buffer) abort();
-
- ifp = fopen(filename, "rb");
- if (!ifp) abort();
-
- while((c = getc(ifp)) != EOF){
- buffer[i++] = c;
- if (i == size){
- size += defaultSize;
- buffer = realloc(buffer, size);
- if (buffer == NULL) {
- abort();
- }
- }
- }
- fclose(ifp);
- buffer = realloc(buffer, i+2);
- if (!buffer) abort();
- /* Make sure we have a line feed at the end */
- buffer[i] = '\n';
- buffer[i+1] = '\0';
- return buffer;
-}
-#endif
-
-
-/* Routines */
-
-/* reset() - Reset CPU and memory. */
-static void reset(machine_6502 *machine){
- int x, y;
- for ( y = 0; y < 32; y++ ){
- for (x = 0; x < 32; x++){
- machine->screen[x][y] = 0;
- }
- }
-
- for(x=0; x < MEM_64K; x++)
- machine->memory[x] = 0;
-
- machine->codeCompiledOK = FALSE;
- machine->regA = 0;
- machine->regX = 0;
- machine->regY = 0;
- machine->regP = setBit(machine->regP, FUTURE_FL, 1);
- machine->defaultCodePC = machine->regPC = PROG_START;
- machine->regSP = STACK_TOP;
- machine->runForever = FALSE;
- machine->labelPtr = 0;
- machine->codeRunning = FALSE;
-}
-
-/* hexDump() - Dump the memory to output */
-void m6502_hexDump(machine_6502 *machine, Bit16 start, Bit16 numbytes, FILE *output){
- Bit32 address;
- Bit32 i;
- for( i = 0; i < numbytes; i++){
- address = start + i;
- if ( (i&15) == 0 ) {
- fprintf(output,"\n%.4x: ", address);
- }
- fprintf(output,"%.2x%s",machine->memory[address], (i & 1) ? " ":"");
- }
- fprintf(output,"%s\n",(i&1)?"--":"");
-}
-
-/* XXX */
-/* void save_program(machine_6502 *machine, char *filename){ */
-/* FILE *ofp; */
-/* Bit16 pc = PROG_START; */
-/* Bit16 end = pc + machine->codeLen; */
-/* Bit16 n; */
-/* ofp = fopen(filename, "w"); */
-/* if (!ofp) abort(); */
-
-/* fprintf(ofp,"Bit8 prog[%d] =\n{",machine->codeLen); */
-/* n = 1; */
-/* while(pc < end) */
-/* fprintf(ofp,"0x%.2x,%s",machine->memory[pc++],n++%10?" ":"\n"); */
-/* fseek(ofp,-2,SEEK_CUR); */
-/* fprintf(ofp,"};\n"); */
-
-/* fclose(ofp); */
-/* } */
-
-static BOOL translate(m6502_Opcodes *op,Param *param, machine_6502 *machine){
- switch(param->type){
- case SINGLE:
- if (op->SNGL)
- pushByte(machine, op->SNGL);
- else {
- fprintf(stderr,"%s needs a parameter.\n",op->name);
- return FALSE;
- }
- break;
- case IMMEDIATE_VALUE:
- if (op->Imm) {
- pushByte(machine, op->Imm);
- pushByte(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take IMMEDIATE_VALUE parameters.\n",op->name);
- return FALSE;
- }
- case IMMEDIATE_GREAT:
- if (op->Imm) {
- pushByte(machine, op->Imm);
- pushByte(machine, param->lbladdr >> 8);
- break;
- }
- else {
- fprintf(stderr,"%s does not take IMMEDIATE_GREAT parameters.\n",op->name);
- return FALSE;
- }
- case IMMEDIATE_LESS:
- if (op->Imm) {
- pushByte(machine, op->Imm);
- pushByte(machine, param->lbladdr & 0xFF);
- break;
- }
- else {
- fprintf(stderr,"%s does not take IMMEDIATE_LESS parameters.\n",op->name);
- return FALSE;
- }
- case INDIRECT_X:
- if (op->INDX) {
- pushByte(machine, op->INDX);
- pushByte(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take INDIRECT_X parameters.\n",op->name);
- return FALSE;
- }
- case INDIRECT_Y:
- if (op->INDY) {
- pushByte(machine, op->INDY);
- pushByte(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take INDIRECT_Y parameters.\n",op->name);
- return FALSE;
- }
- case ZERO:
- if (op->ZP) {
- pushByte(machine, op->ZP);
- pushByte(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ZERO parameters.\n",op->name);
- return FALSE;
- }
- case ZERO_X:
- if (op->ZPX) {
- pushByte(machine, op->ZPX);
- pushByte(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ZERO_X parameters.\n",op->name);
- return FALSE;
- }
- case ZERO_Y:
- if (op->ZPY) {
- pushByte(machine, op->ZPY);
- pushByte(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ZERO_Y parameters.\n",op->name);
- return FALSE;
- }
- case ABS_VALUE:
- if (op->ABS) {
- pushByte(machine, op->ABS);
- pushWord(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ABS_VALUE parameters.\n",op->name);
- return FALSE;
- }
- case ABS_OR_BRANCH:
- if (op->ABS > 0){
- pushByte(machine, op->ABS);
- pushWord(machine, param->lbladdr);
- }
- else {
- if (op->BRA) {
- pushByte(machine, op->BRA);
- {
- int diff = abs((int)param->lbladdr - (int)machine->defaultCodePC);
- int backward = (param->lbladdr < machine->defaultCodePC);
- pushByte(machine, (backward) ? 0xff - diff : diff - 1);
- }
- }
- else {
- fprintf(stderr,"%s does not take BRANCH parameters.\n",op->name);
- return FALSE;
- }
- }
- break;
- case ABS_X:
- if (op->ABSX) {
- pushByte(machine, op->ABSX);
- pushWord(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ABS_X parameters.\n",op->name);
- return FALSE;
- }
- case ABS_Y:
- if (op->ABSY) {
- pushByte(machine, op->ABSY);
- pushWord(machine, param->value[0]);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ABS_Y parameters.\n",op->name);
- return FALSE;
- }
- case ABS_LABEL_X:
- if (op->ABSX) {
- pushByte(machine, op->ABSX);
- pushWord(machine, param->lbladdr);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ABS_LABEL_X parameters.\n",op->name);
- return FALSE;
- }
- case ABS_LABEL_Y:
- if (op->ABSY) {
- pushByte(machine, op->ABSY);
- pushWord(machine, param->lbladdr);
- break;
- }
- else {
- fprintf(stderr,"%s does not take ABS_LABEL_Y parameters.\n",op->name);
- return FALSE;
- }
- case DCB_PARAM:
- /* Handled elsewhere */
- break;
- }
- return TRUE;
-}
-
-/* compileLine() - Compile one line of code. Returns
- TRUE if it compile successfully. */
-static BOOL compileLine(AsmLine *asmline, void *args){
- machine_6502 *machine;
- machine = args;
- if (isBlank(asmline->command)) return TRUE;
- if (strcmp("*=",asmline->command) == 0){
- machine->defaultCodePC = asmline->param->value[0];
- }
- else if (strcmp("DCB",asmline->command) == 0){
- int i;
- for(i = 0; i < asmline->param->vp; i++)
- pushByte(machine, asmline->param->value[i]);
- }
- else{
- int i;
- char *command = asmline->command;
- m6502_Opcodes op;
- for(i = 0; i < NUM_OPCODES; i++){
- if (strcmp(machine->opcodes[i].name, command) == 0){
- op = machine->opcodes[i];
- break;
- }
- }
- if (i == NUM_OPCODES)
- return FALSE; /* unknow upcode */
- else
- return translate(&op,asmline->param,machine);
- }
- return TRUE;
-}
-
-/* indexLabels() - Get the address for each label */
-static BOOL indexLabels(AsmLine *asmline, void *arg){
- machine_6502 *machine;
- int thisPC;
- Bit16 oldDefault;
- machine = arg;
- oldDefault = machine->defaultCodePC;
- thisPC = machine->regPC;
- /* Figure out how many bytes this instruction takes */
- machine->codeLen = 0;
-
- if ( ! compileLine(asmline, machine) ){
- return FALSE;
- }
-
- /* If the machine's defaultCodePC has changed then we encountered a
- *= which changes the load address. We need to initials our code
- *counter with the current default. */
- if (oldDefault == machine->defaultCodePC){
- machine->regPC += machine->codeLen;
- }
- else {
- machine->regPC = machine->defaultCodePC;
- /*oldDefault = machine->defaultCodePC;*/
- }
-
- if (asmline->labelDecl) {
- asmline->label->addr = thisPC;
- }
- return TRUE;
-}
-
-static BOOL changeParamLabelAddr(AsmLine *asmline, void *label){
- Label *la = label;
- if (strcmp(asmline->param->label, la->label) == 0)
- asmline->param->lbladdr = la->addr;
- return TRUE;
-}
-
-static BOOL linkit(AsmLine *asmline, void *asmlist){
- apply(asmlist,changeParamLabelAddr,asmline->label);
- return TRUE;
-}
-
-/* linkLabels - Make sure all of the references to the labels contain
- the right address*/
-static void linkLabels(AsmLine *asmlist){
- apply(asmlist,linkit,asmlist);
-}
-
-/* compileCode() - Compile the current assembly code for the machine */
-static BOOL compileCode(machine_6502 *machine, const char *code){
- BOOL codeOk;
- AsmLine *asmlist;
-
- reset(machine);
- machine->defaultCodePC = machine->regPC = PROG_START;
- asmlist = parseAssembly(machine, &codeOk, code);
-
- if(codeOk){
- /* First pass: Find the addresses for the labels */
- if (!apply(asmlist, indexLabels, machine))
- return FALSE;
- /* update label references */
- linkLabels(asmlist);
-
-#if 0 /* prints out some debugging information */
- {
- AsmLine *p;
- if(asmlist != NULL){
- for (p = asmlist; p != NULL; p = p->next)
- fprintf(stderr,"%s lbl: %s addr: %x ParamLbl: %s ParamAddr: %x\n",
- p->command, p->label->label, p->label->addr,
- p->param->label, p->param->lbladdr);
- }
- }
-
-#endif
-
- /* Second pass: translate the instructions */
- machine->codeLen = 0;
- /* Link label call push_byte which increments defaultCodePC.
- We need to reset it so the compiled code goes in the
- correct spot. */
- machine->defaultCodePC = PROG_START;
- if (!apply(asmlist, compileLine, machine))
- return FALSE;
-
- if (machine->defaultCodePC > PROG_START ){
- machine->memory[machine->defaultCodePC] = 0x00;
- codeOk = TRUE;
- }
- else{
- fprintf(stderr,"No Code to run.\n");
- codeOk = FALSE;
- }
- }
- else{
- fprintf(stderr,"An error occurred while parsing the file.\n");
- codeOk = FALSE;
- }
- freeallAsmLine(asmlist);
- return codeOk;
-}
-
-
-/*
- * execute() - Executes one instruction.
- * This is the main part of the CPU emulator.
- *
- */
-
-static void execute(machine_6502 *machine){
- Bit8 opcode;
- m6502_AddrMode adm;
- int opidx;
-
- if(!machine->codeRunning) return;
-
- opcode = popByte(machine);
- if (opcode == 0x00)
- machine->codeRunning = FALSE;
- else {
- opidx = opIndex(machine,opcode,&adm);
- if(opidx > -1)
- machine->opcodes[opidx].func(machine, adm);
- else
- fprintf(stderr,"Invalid opcode!\n");
- }
- if( (machine->regPC == 0) ||
- (!machine->codeRunning) ) {
- machine->codeRunning = FALSE;
- }
-}
-
-machine_6502 *m6502_build(void){
- machine_6502 *machine;
- machine = ecalloc(1, sizeof(machine_6502));
- assignOpCodes(machine->opcodes);
- buildIndexCache(machine);
- reset(machine);
- return machine;
-}
-
-void m6502_destroy6502(machine_6502 *machine){
- free(machine);
-}
-
-void m6502_trace(machine_6502 *machine, FILE *output){
- Bit8 opcode = memReadByte(machine,machine->regPC);
- m6502_AddrMode adm;
- Pointer ptr;
- int opidx = opIndex(machine,opcode,&adm);
- int stacksz = STACK_TOP - machine->regSP;
-
- fprintf(output,"\n NVFBDIZC\nP: %d%d%d%d%d%d%d%d ",
- bitOn(machine->regP,NEGATIVE_FL),
- bitOn(machine->regP,OVERFLOW_FL),
- bitOn(machine->regP,FUTURE_FL),
- bitOn(machine->regP,BREAK_FL),
- bitOn(machine->regP,DECIMAL_FL),
- bitOn(machine->regP,INTERRUPT_FL),
- bitOn(machine->regP,ZERO_FL),
- bitOn(machine->regP,CARRY_FL));
- fprintf(output,"A: %.2x X: %.2x Y: %.2x SP: %.4x PC: %.4x\n",
- machine->regA, machine->regX, machine->regY, machine->regSP, machine->regPC);
- if (opidx > -1){
- Bit16 pc = machine->regPC;
- fprintf(output,"\n%.4x:\t%s",machine->regPC, machine->opcodes[opidx].name);
- if (peekValue(machine, adm, &ptr, pc+1))
- fprintf(output,"\tAddress:%.4x\tValue:%.4x\n",
- ptr.addr,ptr.value);
- else
- fprintf(output,"\n");
- }
- fprintf(output,"STACK:");
- m6502_hexDump(machine,(STACK_TOP - stacksz) + 1, stacksz, output);
-}
-
-#if 0
-void disassemble(machine_6502 *machine, FILE *output){
- /* Read the opcode
- increment the program counter
- print the opcode
- loop until end of program. */
- m6502_AddrMode adm;
- Bit16 addr;
- Bit8 opcode;
- int opidx;
- char *mem;
- int i;
- Bit16 opc = machine->regPC;
- mem = calloc(20,sizeof(char));
- machine->regPC = PROG_START;
- do{
- addr = machine->regPC;
- opcode = popByte(machine);
- opidx = opIndex(machine,opcode,&adm);
- for (i = 0; i < 20; i++) mem[i] = '\0';
- dismem(machine, adm, mem);
- fprintf(output,"%x\t%s\t%s\n",
- addr,machine->opcodes[opidx].name,mem);
- }while((machine->regPC - PROG_START) < machine->codeLen); /*XXX - may need to change since defaultCodePC */
- free(mem);
- machine->regPC = opc;
-}
-#endif
-
-
-#ifdef READ_FILES
-void m6502_eval_file(machine_6502 *machine, const char *filename, m6502_Plotter plot, void *plotterState){
- char *code = NULL;
-
- machine->plot = plot;
- machine->plotterState = plotterState;
-
- code = fileToBuffer(filename);
-
- if (! compileCode(machine, code) ) abort();
-
- free(code);
-
- machine->defaultCodePC = machine->regPC = PROG_START;
- machine->codeRunning = TRUE;
- do{
- sleep(0); /* XXX */
-#if 0
- m6502_trace(machine, stdout);
-#endif
- execute(machine);
- }while(machine->codeRunning);
-}
-
-void m6502_start_eval_file(machine_6502 *machine, const char *filename, m6502_Plotter plot, void *plotterState){
- char *code = NULL;
- reset(machine);
-
- machine->plot = plot;
- machine->plotterState = plotterState;
-
- code = fileToBuffer(filename);
-
- if (! compileCode(machine, code) ) abort();
-
- free(code);
-
- machine->defaultCodePC = machine->regPC = PROG_START;
- machine->codeRunning = TRUE;
- execute(machine);
-}
-#endif /* READ_FILES */
-
-void m6502_start_eval_string(machine_6502 *machine, const char *code,
- m6502_Plotter plot, void *plotterState){
- reset(machine);
-
- machine->plot = plot;
- machine->plotterState = plotterState;
-
- if (! compileCode(machine, code) ){
- fprintf(stderr,"Could not compile code.\n");
- }
-
- machine->defaultCodePC = machine->regPC = PROG_START;
- machine->codeRunning = TRUE;
- execute(machine);
-}
-
-/* void start_eval_binary(machine_6502 *machine, Bit8 *program, */
-/* unsigned int proglen, */
-/* Plotter plot, void *plotterState){ */
-/* unsigned int pc, n; */
-/* reset(machine); */
-/* machine->plot = plot; */
-/* machine->plotterState = plotterState; */
-
-/* machine->regPC = PROG_START; */
-/* pc = machine->regPC; */
-/* machine->codeLen = proglen; */
-/* n = 0; */
-/* while (n < proglen){ */
-/* machine->memory[pc++] = program[n++]; */
-/* } */
-/* machine->codeRunning = TRUE; */
-/* execute(machine); */
-/* } */
-
-void m6502_next_eval(machine_6502 *machine, int insno){
- int i = 0;
- for (i = 1; i < insno; i++){
- if (machine->codeRunning){
-#if 0
- trace(machine, stdout);
-#endif
- execute(machine);
- }
- else
- break;
- }
-}
-
diff --git a/hacks/asm6502.h b/hacks/asm6502.h
deleted file mode 100644
index 79b13a2..0000000
--- a/hacks/asm6502.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2007 Jeremy English <jhe@jeremyenglish.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Created: 07-May-2007
- */
-
-/*
- This is a port of the javascript 6502 assembler, compiler and
- debugger. The orignal code was copyright 2006 by Stian Soreng -
- www.6502asm.com
-
- The stack space is in page $100 to $1ff. The video buffer starts at
- $200 and is 1024 bytes. Programs get loaded at address
- $600. Address $fe is random and byte $ff is used for user input.
-
- User input is disabled.
-*/
-
-#ifndef __ASM6502_H__
-#define __ASM6502_H__
-
-typedef uint8_t Bit8;
-typedef uint16_t Bit16;
-typedef uint32_t Bit32;
-
-#undef BOOL
-#undef TRUE
-#undef FALSE
-#define BOOL Bit8
-#define TRUE 1
-#define FALSE 0
-
-enum {
- MAX_LABEL_LEN = 80,
- NUM_OPCODES = 56, /* Number of unique instructions not counting DCB */
- MEM_64K = 65536, /* We have 64k of memory to work with. */
- MAX_PARAM_VALUE = 25, /* The number of values allowed behind dcb */
- MAX_CMD_LEN = 4, /* Each assembly command is 3 characeters long */
-/* The stack works from the top down in page $100 to $1ff */
- STACK_TOP = 0x1ff,
- STACK_BOTTOM = 0x100,
- PROG_START = 0x600 /* The default entry point for the program */
-};
-
-typedef enum{
- SINGLE, IMMEDIATE_VALUE, IMMEDIATE_GREAT,
- IMMEDIATE_LESS, INDIRECT_X, INDIRECT_Y,
- ZERO, ZERO_X, ZERO_Y,
- ABS_VALUE, ABS_OR_BRANCH, ABS_X, ABS_Y,
- ABS_LABEL_X, ABS_LABEL_Y, DCB_PARAM
-} m6502_AddrMode;
-
-typedef struct machine_6502 machine_6502;
-
-typedef struct {
- char name[MAX_CMD_LEN];
- Bit8 Imm;
- Bit8 ZP;
- Bit8 ZPX;
- Bit8 ZPY;
- Bit8 ABS;
- Bit8 ABSX;
- Bit8 ABSY;
- Bit8 INDX;
- Bit8 INDY;
- Bit8 SNGL;
- Bit8 BRA;
- void (*func) (machine_6502*, m6502_AddrMode);
-} m6502_Opcodes;
-
-/* Used to cache the index of each opcode */
-typedef struct {
- Bit8 index;
- m6502_AddrMode adm;
-} m6502_OpcodeIndex;
-
-/* Plotter is a function that will be called everytime a pixel
- needs to be updated. The first two parameter are the x and y
- values. The third parameter is the color index:
-
- Color Index Table
- 00 black #000000
- 01 white #ffffff
- 02 Red #880000
- 03 seafoam #aaffee
- 04 fuscia #cc44cc
- 05 green #00cc55
- 06 blue #0000aa
- 07 Yellow #eeee77
- 08 tangerine #dd8855
- 09 brown #664400
- 10 salmon #ff7777
- 11 charcoal #333333
- 12 smoke #777777
- 13 lime #aaff66
- 14 light blue #0088ff
- 15 gray #bbbbbb
-
- The plotter state variable of the machine gets passed as the forth
- parameter. You can use this parameter to store state information.
-
-*/
-typedef void (*m6502_Plotter) (Bit8, Bit8, Bit8, void*);
-
-struct machine_6502 {
- BOOL codeCompiledOK;
- Bit8 regA;
- Bit8 regX;
- Bit8 regY;
- Bit8 regP;
- Bit16 regPC; /* A pair of 8 bit registers */
- Bit16 regSP;
- Bit16 defaultCodePC;
- Bit8 memory[MEM_64K];
- BOOL runForever;
- int labelPtr;
- BOOL codeRunning;
- int myInterval;
- m6502_Opcodes opcodes[NUM_OPCODES];
- int screen[32][32];
- int codeLen;
- m6502_OpcodeIndex opcache[0xff];
- m6502_Plotter plot;
- void *plotterState;
-};
-
-/* build6502() - Creates an instance of the 6502 machine */
-machine_6502 *m6502_build(void);
-
-/* destroy6502() - compile the file and exectue it until the program
- is finished */
-void m6502_destroy6502(machine_6502 *machine);
-
-/* eval_file() - Compiles and runs a file until the program is
- finished */
-void m6502_eval_file(machine_6502 *machine, const char *filename,
- m6502_Plotter plot, void *plotterState);
-
-/* start_eval_file() - Compile the file and execute the first
- instruction */
-void m6502_start_eval_file(machine_6502 *machine, const char *filename,
- m6502_Plotter plot, void *plotterState);
-
-/* XXX
-void m6502_start_eval_binary(machine_6502 *machine, Bit8 *program,
- unsigned int proglen,
- Plotter plot, void *plotterState);
-*/
-
-void m6502_start_eval_string(machine_6502 *machine, const char *code,
- m6502_Plotter plot, void *plotterState);
-
-/* next_eval() - Execute the next insno of machine instructions */
-void m6502_next_eval(machine_6502 *machine, int insno);
-
-/* hexDump() - Dumps memory to output */
-void m6502_hexDump(machine_6502 *machine, Bit16 start,
- Bit16 numbytes, FILE *output);
-
-/* Disassemble() - Prints the assembly code for the program currently
- loaded in memory.*/
-void m6502_disassemble(machine_6502 *machine, FILE *output);
-
-/* trace() - Prints to output the current value of registers, the
- current nmemonic, memory address and value. */
-void m6502_trace(machine_6502 *machine, FILE *output);
-
-/* save_program() - Writes a binary file of the program loaded in
- memory. */
-/* XXX
-void save_program(machine_6502 *machine, const char *filename);
-*/
-#endif /* __ASM6502_H__ */
diff --git a/hacks/attraction.c b/hacks/attraction.c
deleted file mode 100644
index 25bc3b0..0000000
--- a/hacks/attraction.c
+++ /dev/null
@@ -1,1114 +0,0 @@
-/* xscreensaver, Copyright (c) 1992-2013 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda
- a little like the strong and weak electromagnetic forces. Derived from
- a Lispm screensaver by John Pezaris <pz@mit.edu>. Viscosity added by
- Philip Edward Cutone, III <pc2d+@andrew.cmu.edu>.
-
- John sez:
-
- The simulation started out as a purely accurate gravitational
- simulation, but, with constant simulation step size, I quickly
- realized the field being simulated while grossly gravitational
- was, in fact, non-conservative. It also had the rather annoying
- behavior of dealing very badly with colliding orbs. Therefore,
- I implemented a negative-gravity region (with two thresholds; as
- I read your code, you only implemented one) to prevent orbs from
- every coming too close together, and added a viscosity factor if
- the speed of any orb got too fast. This provides a nice stable
- system with interesting behavior.
-
- I had experimented with a number of fields including the van der
- Waals force (very interesting orbiting behavior) and 1/r^3
- gravity (not as interesting as 1/r^2). An even normal viscosity
- (rather than the thresholded version to bleed excess energy) is
- also not interesting. The 1/r^2, -1/r^2, -10/r^2 thresholds
- proved not only robust but also interesting -- the orbs never
- collided and the threshold viscosity fixed the
- non-conservational problem.
-
- Philip sez:
- > An even normal viscosity (rather than the thresholded version to
- > bleed excess energy) is also not interesting.
-
- unless you make about 200 points.... set the viscosity to about .8
- and drag the mouse through it. it makes a nice wave which travels
- through the field.
-
- And (always the troublemaker) Joe Keane <jgk@jgk.org> sez:
-
- Despite what John sez, the field being simulated is always
- conservative. The real problem is that it uses a simple hack,
- computing acceleration *based only on the starting position*,
- instead of a real differential equation solver. Thus you'll
- always have energy coming out of nowhere, although it's most
- blatant when balls get close together. If it were done right,
- you wouldn't need viscosity or artificial limits on how close
- the balls can get.
-
- Matt <straitm@carleton.edu> sez:
-
- Added a switch to remove the walls.
-
- Added a switch to make the threshold viscosity optional. If
- nomaxspeed is specified, then balls going really fast do not
- recieve special treatment.
-
- I've made tail mode prettier by eliminating the first erase line
- that drew from the upper left corner to the starting position of
- each point.
-
- Made the balls in modes other than "balls" bounce exactly at the
- walls. (Because the graphics for different modes are drawn
- differently with respect to the "actual" position of the point,
- they used to be able to run somewhat past the walls, or bounce
- before hitting them.)
-
- Added an option to output each ball's speed in the form of a bar
- graph drawn on the same window as the balls. If only x or y is
- selected, they will be represented on the appropriate axis down
- the center of the window. If both are selected, they will both
- be displayed along the diagonal such that the x and y bars for
- each point start at the same place. If speed is selected, the
- speed will be displayed down the left side. */
-
-#include <stdio.h>
-#include <math.h>
-#include "screenhack.h"
-#include "spline.h"
-
-/* The normal (and max) width for a graph bar */
-#define BAR_SIZE 11
-#define MAX_SIZE 16
-#define min(a,b) ((a)<(b)?(a):(b))
-#define max(a,b) ((a)>(b)?(a):(b))
-
-
-enum object_mode {
- ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode,
- tail_mode
-};
-
-enum graph_mode {
- graph_none, graph_x, graph_y, graph_both, graph_speed
-};
-
-struct ball {
- double x, y;
- double vx, vy;
- double dx, dy;
- double mass;
- int size;
- int pixel_index;
- int hue;
-};
-
-struct state {
- struct ball *balls;
- double *x_vels;
- double *y_vels;
- double *speeds;
- int npoints;
- int threshold;
- int delay;
- int global_size;
- int segments;
- Bool glow_p;
- Bool orbit_p;
- Bool walls_p;
- Bool maxspeed_p;
- Bool cbounce_p;
- XPoint *point_stack;
- int point_stack_size, point_stack_fp;
- XColor *colors;
- int ncolors;
- int fg_index;
- int color_shift;
- int xlim, ylim;
- Bool no_erase_yet; /* for tail mode fix */
- double viscosity;
-
- int mouse_ball; /* index of ball being dragged, or 0 if none. */
- unsigned long mouse_pixel;
-
- enum object_mode mode;
- enum graph_mode graph_mode;
-
- GC draw_gc, erase_gc;
-
- int total_ticks;
- int color_tick;
- spline *spl;
-};
-
-
-static void *
-attraction_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- int i;
- XWindowAttributes xgwa;
- XGCValues gcv;
- int midx, midy, r, vx, vy;
- double th;
- Colormap cmap;
- char *mode_str, *graph_mode_str;
- double size_scale;
-
- XGetWindowAttributes (dpy, window, &xgwa);
- st->xlim = xgwa.width;
- st->ylim = xgwa.height;
- cmap = xgwa.colormap;
- midx = st->xlim/2;
- midy = st->ylim/2;
- st->walls_p = get_boolean_resource (dpy, "walls", "Boolean");
-
- /* if there aren't walls, don't set a limit on the radius */
- r = get_integer_resource (dpy, "radius", "Integer");
- if (r <= 0 || (r > min (st->xlim/2, st->ylim/2) && st->walls_p) )
- r = min (st->xlim/2, st->ylim/2) - 50;
-
- vx = get_integer_resource (dpy, "vx", "Integer");
- vy = get_integer_resource (dpy, "vy", "Integer");
-
- st->npoints = get_integer_resource (dpy, "points", "Integer");
- if (st->npoints < 1)
- st->npoints = 3 + (random () % 5);
- st->balls = (struct ball *) malloc (st->npoints * sizeof (struct ball));
-
- st->no_erase_yet = 1; /* for tail mode fix */
-
- st->segments = get_integer_resource (dpy, "segments", "Integer");
- if (st->segments < 0) st->segments = 1;
-
- st->threshold = get_integer_resource (dpy, "threshold", "Integer");
- if (st->threshold < 0) st->threshold = 0;
-
- st->delay = get_integer_resource (dpy, "delay", "Integer");
- if (st->delay < 0) st->delay = 0;
-
- st->global_size = get_integer_resource (dpy, "size", "Integer");
- if (st->global_size < 0) st->global_size = 0;
-
- st->glow_p = get_boolean_resource (dpy, "glow", "Boolean");
-
- st->orbit_p = get_boolean_resource (dpy, "orbit", "Boolean");
-
- st->maxspeed_p = get_boolean_resource (dpy, "maxspeed", "Boolean");
-
- st->cbounce_p = get_boolean_resource (dpy, "cbounce", "Boolean");
-
- st->color_shift = get_integer_resource (dpy, "colorShift", "Integer");
- if (st->color_shift <= 0) st->color_shift = 5;
-
- st->viscosity = get_float_resource (dpy, "viscosity", "Float");
-
- mode_str = get_string_resource (dpy, "mode", "Mode");
- if (! mode_str) st->mode = ball_mode;
- else if (!strcmp (mode_str, "balls")) st->mode = ball_mode;
- else if (!strcmp (mode_str, "lines")) st->mode = line_mode;
- else if (!strcmp (mode_str, "polygons")) st->mode = polygon_mode;
- else if (!strcmp (mode_str, "tails")) st->mode = tail_mode;
- else if (!strcmp (mode_str, "splines")) st->mode = spline_mode;
- else if (!strcmp (mode_str, "filled-splines"))st->mode = spline_filled_mode;
- else {
- fprintf (stderr,
- "%s: mode must be balls, lines, tails, polygons, splines, or\n\
- filled-splines, not \"%s\"\n",
- progname, mode_str);
- exit (1);
- }
- if (mode_str) free (mode_str);
-
- graph_mode_str = get_string_resource (dpy, "graphmode", "Mode");
- if (! graph_mode_str) st->graph_mode = graph_none;
- else if (!strcmp (graph_mode_str, "x")) st->graph_mode = graph_x;
- else if (!strcmp (graph_mode_str, "y")) st->graph_mode = graph_y;
- else if (!strcmp (graph_mode_str, "both")) st->graph_mode = graph_both;
- else if (!strcmp (graph_mode_str, "speed")) st->graph_mode = graph_speed;
- else if (!strcmp (graph_mode_str, "none")) st->graph_mode = graph_none;
- else {
- fprintf (stderr,
- "%s: graphmode must be speed, x, y, both, or none, not \"%s\"\n",
- progname, graph_mode_str);
- exit (1);
- }
- if (graph_mode_str) free (graph_mode_str);
-
- /* only allocate memory if it is needed */
- if(st->graph_mode != graph_none)
- {
- if(st->graph_mode == graph_x || st->graph_mode == graph_both)
- st->x_vels = (double *) malloc (st->npoints * sizeof (double));
- if(st->graph_mode == graph_y || st->graph_mode == graph_both)
- st->y_vels = (double *) malloc (st->npoints * sizeof (double));
- if(st->graph_mode == graph_speed)
- st->speeds = (double *) malloc (st->npoints * sizeof (double));
- }
-
- if (st->mode != ball_mode && st->mode != tail_mode) st->glow_p = False;
-
- if (st->mode == polygon_mode && st->npoints < 3)
- st->mode = line_mode;
-
- st->ncolors = get_integer_resource (dpy, "colors", "Colors");
- if (st->ncolors < 2) st->ncolors = 2;
- if (st->ncolors <= 2) mono_p = True;
- st->colors = 0;
-
- if (!mono_p)
- {
- st->fg_index = 0;
- switch (st->mode)
- {
- case ball_mode:
- if (st->glow_p)
- {
- int H = random() % 360;
- double S1 = 0.25;
- double S2 = 1.00;
- double V = frand(0.25) + 0.75;
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
- make_color_ramp (xgwa.screen, xgwa.visual, cmap,
- H, S1, V, H, S2, V, st->colors, &st->ncolors,
- False, True, False);
- }
- else
- {
- st->ncolors = st->npoints;
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
- make_random_colormap (xgwa.screen, xgwa.visual, cmap,
- st->colors, &st->ncolors,
- True, True, False, True);
- }
- break;
- case line_mode:
- case polygon_mode:
- case spline_mode:
- case spline_filled_mode:
- case tail_mode:
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
- make_smooth_colormap (xgwa.screen, xgwa.visual, cmap,
- st->colors, &st->ncolors,
- True, False, True);
- break;
- default:
- abort ();
- }
- }
-
- if (!mono_p && st->ncolors <= 2)
- {
- if (st->colors) free (st->colors);
- st->colors = 0;
- mono_p = True;
- }
-
- st->mouse_pixel =
- get_pixel_resource (dpy, cmap, "mouseForeground", "MouseForeground");
- st->mouse_ball = -1;
-
- if (st->mode != ball_mode)
- {
- int size = (st->segments ? st->segments : 1);
- st->point_stack_size = size * (st->npoints + 1);
- st->point_stack = (XPoint *) calloc (st->point_stack_size, sizeof (XPoint));
- st->point_stack_fp = 0;
- }
-
- gcv.line_width = (st->mode == tail_mode
- ? (st->global_size ? st->global_size : (MAX_SIZE * 2 / 3))
- : 1);
- gcv.cap_style = (st->mode == tail_mode ? CapRound : CapButt);
-
- if (mono_p)
- gcv.foreground = get_pixel_resource(dpy, cmap, "foreground", "Foreground");
- else
- gcv.foreground = st->colors[st->fg_index].pixel;
- st->draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
-
- gcv.foreground = get_pixel_resource(dpy, cmap, "background", "Background");
- st->erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv);
-
-
-#ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (dpy, st->draw_gc, False);
- jwxyz_XSetAntiAliasing (dpy, st->erase_gc, False);
-#endif
-
- size_scale = 3;
- if (xgwa.width < 100 || xgwa.height < 100) /* tiny windows */
- size_scale = 0.75;
-
- /* let's make the balls bigger by default */
-#define rand_size() (size_scale * (8 + (random () % 7)))
-
- if (st->orbit_p && !st->global_size)
- /* To orbit, all objects must be the same mass, or the math gets
- really hairy... */
- st->global_size = rand_size ();
-
- RETRY_NO_ORBIT:
- th = frand (M_PI+M_PI);
- for (i = 0; i < st->npoints; i++)
- {
- int new_size = (st->global_size ? st->global_size : rand_size ());
- st->balls [i].dx = 0;
- st->balls [i].dy = 0;
- st->balls [i].size = new_size;
- st->balls [i].mass = (new_size * new_size * 10);
- st->balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / st->npoints) + th);
- st->balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / st->npoints) + th);
- if (! st->orbit_p)
- {
- st->balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0);
- st->balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0);
- }
- if (mono_p || st->mode != ball_mode)
- st->balls [i].pixel_index = -1;
- else if (st->glow_p)
- st->balls [i].pixel_index = 0;
- else
- st->balls [i].pixel_index = random() % st->ncolors;
- }
-
- /* This lets modes where the points don't really have any size use the whole
- window. Otherwise, since the points still have a positive size
- assigned to them, they will be bounced somewhat early. Mass and size are
- seperate, so this shouldn't cause problems. It's a bit kludgy, tho.
- */
- if(st->mode == line_mode || st->mode == spline_mode ||
- st->mode == spline_filled_mode || st->mode == polygon_mode)
- {
- for(i = 1; i < st->npoints; i++)
- {
- st->balls[i].size = 0;
- }
- }
-
- if (st->orbit_p)
- {
- double a = 0;
- double v;
- double v_mult = get_float_resource (dpy, "vMult", "Float");
- if (v_mult == 0.0) v_mult = 1.0;
-
- for (i = 1; i < st->npoints; i++)
- {
- double _2ipi_n = (2 * i * M_PI / st->npoints);
- double x = r * cos (_2ipi_n);
- double y = r * sin (_2ipi_n);
- double distx = r - x;
- double dist2 = (distx * distx) + (y * y);
- double dist = sqrt (dist2);
- double a1 = ((st->balls[i].mass / dist2) *
- ((dist < st->threshold) ? -1.0 : 1.0) *
- (distx / dist));
- a += a1;
- }
- if (a < 0.0)
- {
- /* "domain error: forces on balls too great" */
- fprintf (stderr, "%s: window too small for these orbit settings.\n",
- progname);
- st->orbit_p = False;
- goto RETRY_NO_ORBIT;
- }
- v = sqrt (a * r) * v_mult;
- for (i = 0; i < st->npoints; i++)
- {
- double k = ((2 * i * M_PI / st->npoints) + th);
- st->balls [i].vx = -v * sin (k);
- st->balls [i].vy = v * cos (k);
- }
- }
-
- if (mono_p) st->glow_p = False;
-
- XClearWindow (dpy, window);
- return st;
-}
-
-static void
-compute_force (struct state *st, int i, double *dx_ret, double *dy_ret)
-{
- int j;
- double x_dist, y_dist, dist, dist2;
- *dx_ret = 0;
- *dy_ret = 0;
- for (j = 0; j < st->npoints; j++)
- {
- if (i == j) continue;
- x_dist = st->balls [j].x - st->balls [i].x;
- y_dist = st->balls [j].y - st->balls [i].y;
- dist2 = (x_dist * x_dist) + (y_dist * y_dist);
- dist = sqrt (dist2);
-
- if (dist > 0.1) /* the balls are not overlapping */
- {
- double new_acc = ((st->balls[j].mass / dist2) *
- ((dist < st->threshold) ? -1.0 : 1.0));
- double new_acc_dist = new_acc / dist;
- *dx_ret += new_acc_dist * x_dist;
- *dy_ret += new_acc_dist * y_dist;
- }
- else
- { /* the balls are overlapping; move randomly */
- *dx_ret += (frand (10.0) - 5.0);
- *dy_ret += (frand (10.0) - 5.0);
- }
- }
-}
-
-
-/* Draws meters along the diagonal for the x velocity */
-static void
-draw_meter_x(Display *dpy, Window window, struct state *st, int i, int alone)
-{
- XWindowAttributes xgwa;
- int x1,x2,y,w1,w2,h;
- XGetWindowAttributes (dpy, window, &xgwa);
-
- /* set the width of the bars to use */
- if(xgwa.height < BAR_SIZE*st->npoints)
- {
- y = i*(xgwa.height/st->npoints);
- h = (xgwa.height/st->npoints) - 2;
- }
- else
- {
- y = BAR_SIZE*i;
- h = BAR_SIZE - 2;
- }
-
- if(alone)
- {
- x1 = xgwa.width/2;
- x2 = x1;
- }
- else
- {
- x1 = i*(h+2);
- if(x1 < i)
- x1 = i;
- x2 = x1;
- }
-
- if(y<1) y=i;
- if(h<1) h=1;
-
- w1 = (int)(20*st->x_vels[i]);
- w2 = (int)(20*st->balls[i].vx);
- st->x_vels[i] = st->balls[i].vx;
-
- if (w1<0) {
- w1=-w1;
- x1=x1-w1;
- }
- if (w2<0) {
- w2=-w2;
- x2=x2-w2;
- }
- XDrawRectangle(dpy,window,st->erase_gc,x1+(h+2)/2,y,w1,h);
- XDrawRectangle(dpy,window,st->draw_gc,x2+(h+2)/2,y,w2,h);
-}
-
-/* Draws meters along the diagonal for the y velocity.
- Is there some way to make draw_meter_x and draw_meter_y
- one function instead of two without making them completely unreadable?
-*/
-static void
-draw_meter_y (Display *dpy, Window window, struct state *st, int i, int alone)
-{
- XWindowAttributes xgwa;
- int y1,y2,x,h1,h2,w;
- XGetWindowAttributes (dpy, window, &xgwa);
-
- if(xgwa.height < BAR_SIZE*st->npoints){ /*needs to be height still */
- x = i*(xgwa.height/st->npoints);
- w = (xgwa.height/st->npoints) - 2;
- }
- else{
- x = BAR_SIZE*i;
- w = BAR_SIZE - 2;
- }
-
- if(alone)
- {
- y1 = xgwa.height/2;
- y2 = y1;
- }
- else
- {
- y1 = i*(w+2);
- if(y1 < i)
- y1 = i;
- y2 = y1;
- }
-
- if(x < 1) x = i;
- if(w < 1) w = 1;
-
- h1 = (int)(20*st->y_vels[i]);
- h2 = (int)(20*st->balls[i].vy);
- st->y_vels[i] = st->balls[i].vy;
-
- if (h1<0) {
- h1=-h1;
- y1=y1-h1;
- }
- if (h2<0) {
- h2=-h2;
- y2=y2-h2;
- }
- XDrawRectangle(dpy,window,st->erase_gc,x,y1+(w+2)/2,w,h1);
- XDrawRectangle(dpy,window,st->draw_gc,x,y2+(w+2)/2,w,h2);
-}
-
-
-/* Draws meters of the total speed of the balls */
-static void
-draw_meter_speed (Display *dpy, Window window, struct state *st, int i)
-{
- XWindowAttributes xgwa;
- int y,x1,x2,h,w1,w2;
- XGetWindowAttributes (dpy, window, &xgwa);
-
- if(xgwa.height < BAR_SIZE*st->npoints)
- {
- y = i*(xgwa.height/st->npoints);
- h = (xgwa.height/st->npoints) - 2;
- }
- else{
- y = BAR_SIZE*i;
- h = BAR_SIZE - 2;
- }
-
- x1 = 0;
- x2 = x1;
-
- if(y < 1) y = i;
- if(h < 1) h = 1;
-
- w1 = (int)(5*st->speeds[i]);
- w2 = (int)(5*(st->balls[i].vy*st->balls[i].vy+st->balls[i].vx*st->balls[i].vx));
- st->speeds[i] = st->balls[i].vy*st->balls[i].vy+st->balls[i].vx*st->balls[i].vx;
-
- XDrawRectangle(dpy,window,st->erase_gc,x1,y,w1,h);
- XDrawRectangle(dpy,window,st->draw_gc, x2,y,w2,h);
-}
-
-/* Returns the position of the mouse relative to the root window.
- */
-static void
-query_mouse (Display *dpy, Window win, int *x, int *y)
-{
- Window root1, child1;
- int mouse_x, mouse_y, root_x, root_y;
- unsigned int mask;
- if (XQueryPointer (dpy, win, &root1, &child1,
- &root_x, &root_y, &mouse_x, &mouse_y, &mask))
- {
- *x = mouse_x;
- *y = mouse_y;
- }
- else
- {
- *x = -9999;
- *y = -9999;
- }
-}
-
-static unsigned long
-attraction_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int last_point_stack_fp = st->point_stack_fp;
-
- int i, radius = st->global_size/2;
-
- st->total_ticks++;
-
- if(st->global_size == 0)
- radius = (MAX_SIZE / 3);
-
- if(st->graph_mode != graph_none)
- {
- if(st->graph_mode == graph_both)
- {
- for(i = 0; i < st->npoints; i++)
- {
- draw_meter_x(dpy, window, st, i, 0);
- draw_meter_y(dpy, window, st, i, 0);
- }
- }
- else if(st->graph_mode == graph_x)
- {
- for(i = 0; i < st->npoints; i++)
- {
- draw_meter_x(dpy, window, st, i, 1);
- }
- }
- else if(st->graph_mode == graph_y)
- {
- for(i = 0; i < st->npoints; i++)
- {
- draw_meter_y(dpy, window, st, i, 1);
- }
- }
- else if(st->graph_mode == graph_speed)
- {
- for(i = 0; i < st->npoints; i++)
- {
- draw_meter_speed(dpy, window, st, i);
- }
- }
-
- }
-
- /* compute the force of attraction/repulsion among all balls */
- for (i = 0; i < st->npoints; i++)
- compute_force (st, i, &st->balls[i].dx, &st->balls[i].dy);
-
- /* move the balls according to the forces now in effect */
- for (i = 0; i < st->npoints; i++)
- {
- double old_x = st->balls[i].x;
- double old_y = st->balls[i].y;
- double new_x, new_y;
- int size = st->balls[i].size;
-
- st->balls[i].vx += st->balls[i].dx;
- st->balls[i].vy += st->balls[i].dy;
-
- /* "don't let them get too fast: impose a terminal velocity
- (actually, make the medium have friction)"
- Well, what this first step really does is give the medium a
- viscosity of .9 for balls going over the speed limit. Anyway,
- this is now optional
- */
- if (fabs(st->balls[i].vx) > 10 && st->maxspeed_p)
- {
- st->balls[i].vx *= 0.9;
- st->balls[i].dx = 0;
- }
- if (st->viscosity != 1)
- {
- st->balls[i].vx *= st->viscosity;
- }
-
- if (fabs(st->balls[i].vy) > 10 && st->maxspeed_p)
- {
- st->balls[i].vy *= 0.9;
- st->balls[i].dy = 0;
- }
- if (st->viscosity != 1)
- {
- st->balls[i].vy *= st->viscosity;
- }
-
- st->balls[i].x += st->balls[i].vx;
- st->balls[i].y += st->balls[i].vy;
-
-
- /* bounce off the walls if desired
- note: a ball is actually its upper left corner */
- if(st->walls_p)
- {
- if(st->cbounce_p) /* with correct bouncing */
- {
- /* so long as it's out of range, keep bouncing */
- /* limit the maximum number to bounce to 4.*/
- int bounce_allowed = 4;
-
- while( bounce_allowed && (
- (st->balls[i].x >= (st->xlim - st->balls[i].size)) ||
- (st->balls[i].y >= (st->ylim - st->balls[i].size)) ||
- (st->balls[i].x <= 0) ||
- (st->balls[i].y <= 0) )
- )
- {
- bounce_allowed--;
- if (st->balls[i].x >= (st->xlim - st->balls[i].size))
- {
- st->balls[i].x = (2*(st->xlim - st->balls[i].size) - st->balls[i].x);
- st->balls[i].vx = -st->balls[i].vx;
- }
- if (st->balls[i].y >= (st->ylim - st->balls[i].size))
- {
- st->balls[i].y = (2*(st->ylim - st->balls[i].size) - st->balls[i].y);
- st->balls[i].vy = -st->balls[i].vy;
- }
- if (st->balls[i].x <= 0)
- {
- st->balls[i].x = -st->balls[i].x;
- st->balls[i].vx = -st->balls[i].vx;
- }
- if (st->balls[i].y <= 0)
- {
- st->balls[i].y = -st->balls[i].y;
- st->balls[i].vy = -st->balls[i].vy;
- }
- }
- }
- else /* with old bouncing */
- {
- if (st->balls[i].x >= (st->xlim - st->balls[i].size))
- {
- st->balls[i].x = (st->xlim - st->balls[i].size - 1);
- if (st->balls[i].vx > 0) /* why is this check here? */
- st->balls[i].vx = -st->balls[i].vx;
- }
- if (st->balls[i].y >= (st->ylim - st->balls[i].size))
- {
- st->balls[i].y = (st->ylim - st->balls[i].size - 1);
- if (st->balls[i].vy > 0)
- st->balls[i].vy = -st->balls[i].vy;
- }
- if (st->balls[i].x <= 0)
- {
- st->balls[i].x = 0;
- if (st->balls[i].vx < 0)
- st->balls[i].vx = -st->balls[i].vx;
- }
- if (st->balls[i].y <= 0)
- {
- st->balls[i].y = 0;
- if (st->balls[i].vy < 0)
- st->balls[i].vy = -st->balls[i].vy;
- }
- }
- }
-
- if (i == st->mouse_ball)
- {
- int x, y;
- query_mouse (dpy, window, &x, &y);
- if (st->mode == ball_mode)
- {
- x -= st->balls[i].size / 2;
- y -= st->balls[i].size / 2;
- }
-
- st->balls[i].x = x;
- st->balls[i].y = y;
- }
-
- new_x = st->balls[i].x;
- new_y = st->balls[i].y;
-
- if (!mono_p)
- {
- if (st->mode == ball_mode)
- {
- if (st->glow_p)
- {
- /* make color saturation be related to particle
- acceleration. */
- double limit = 0.5;
- double s, fraction;
- double vx = st->balls [i].dx;
- double vy = st->balls [i].dy;
- if (vx < 0) vx = -vx;
- if (vy < 0) vy = -vy;
- fraction = vx + vy;
- if (fraction > limit) fraction = limit;
-
- s = 1 - (fraction / limit);
- st->balls[i].pixel_index = (st->ncolors * s);
- }
- XSetForeground (dpy, st->draw_gc,
- (i == st->mouse_ball
- ? st->mouse_pixel
- : st->colors[st->balls[i].pixel_index].pixel));
- }
- }
-
- if (st->mode == ball_mode)
- {
- XFillArc (dpy, window, st->erase_gc, (int) old_x, (int) old_y,
- size, size, 0, 360*64);
- XFillArc (dpy, window, st->draw_gc, (int) new_x, (int) new_y,
- size, size, 0, 360*64);
- }
- else
- {
- st->point_stack [st->point_stack_fp].x = new_x;
- st->point_stack [st->point_stack_fp].y = new_y;
- st->point_stack_fp++;
- }
- }
-
- /* draw the lines or polygons after computing all points */
- if (st->mode != ball_mode)
- {
- st->point_stack [st->point_stack_fp].x = st->balls [0].x; /* close the polygon */
- st->point_stack [st->point_stack_fp].y = st->balls [0].y;
- st->point_stack_fp++;
- if (st->point_stack_fp == st->point_stack_size)
- st->point_stack_fp = 0;
- else if (st->point_stack_fp > st->point_stack_size) /* better be aligned */
- abort ();
- if (!mono_p)
- {
- if (st->color_tick++ == st->color_shift)
- {
- st->color_tick = 0;
- st->fg_index = (st->fg_index + 1) % st->ncolors;
- XSetForeground (dpy, st->draw_gc, st->colors[st->fg_index].pixel);
- }
- }
- }
-
- switch (st->mode)
- {
- case ball_mode:
- break;
- case line_mode:
- if (st->segments > 0)
- XDrawLines (dpy, window, st->erase_gc, st->point_stack + st->point_stack_fp,
- st->npoints + 1, CoordModeOrigin);
- XDrawLines (dpy, window, st->draw_gc, st->point_stack + last_point_stack_fp,
- st->npoints + 1, CoordModeOrigin);
- break;
- case polygon_mode:
- if (st->segments > 0)
- XFillPolygon (dpy, window, st->erase_gc, st->point_stack + st->point_stack_fp,
- st->npoints + 1, (st->npoints == 3 ? Convex : Complex),
- CoordModeOrigin);
- XFillPolygon (dpy, window, st->draw_gc, st->point_stack + last_point_stack_fp,
- st->npoints + 1, (st->npoints == 3 ? Convex : Complex),
- CoordModeOrigin);
- break;
- case tail_mode:
- {
- for (i = 0; i < st->npoints; i++)
- {
- int index = st->point_stack_fp + i;
- int next_index = (index + (st->npoints + 1)) % st->point_stack_size;
- if(st->no_erase_yet == 1)
- {
- if(st->total_ticks >= st->segments)
- {
- st->no_erase_yet = 0;
- XDrawLine (dpy, window, st->erase_gc,
- st->point_stack [index].x + radius,
- st->point_stack [index].y + radius,
- st->point_stack [next_index].x + radius,
- st->point_stack [next_index].y + radius);
- }
- }
- else
- {
- XDrawLine (dpy, window, st->erase_gc,
- st->point_stack [index].x + radius,
- st->point_stack [index].y + radius,
- st->point_stack [next_index].x + radius,
- st->point_stack [next_index].y + radius);
- }
- index = last_point_stack_fp + i;
- next_index = (index - (st->npoints + 1)) % st->point_stack_size;
- if (next_index < 0) next_index += st->point_stack_size;
- if (st->point_stack [next_index].x == 0 &&
- st->point_stack [next_index].y == 0)
- continue;
- XDrawLine (dpy, window, st->draw_gc,
- st->point_stack [index].x + radius,
- st->point_stack [index].y + radius,
- st->point_stack [next_index].x + radius,
- st->point_stack [next_index].y + radius);
- }
- }
- break;
- case spline_mode:
- case spline_filled_mode:
- {
- if (! st->spl) st->spl = make_spline (st->npoints);
- if (st->segments > 0)
- {
- for (i = 0; i < st->npoints; i++)
- {
- st->spl->control_x [i] = st->point_stack [st->point_stack_fp + i].x;
- st->spl->control_y [i] = st->point_stack [st->point_stack_fp + i].y;
- }
- compute_closed_spline (st->spl);
- if (st->mode == spline_filled_mode)
- XFillPolygon (dpy, window, st->erase_gc, st->spl->points, st->spl->n_points,
- (st->spl->n_points == 3 ? Convex : Complex),
- CoordModeOrigin);
- else
- XDrawLines (dpy, window, st->erase_gc, st->spl->points, st->spl->n_points,
- CoordModeOrigin);
- }
- for (i = 0; i < st->npoints; i++)
- {
- st->spl->control_x [i] = st->point_stack [last_point_stack_fp + i].x;
- st->spl->control_y [i] = st->point_stack [last_point_stack_fp + i].y;
- }
- compute_closed_spline (st->spl);
- if (st->mode == spline_filled_mode)
- XFillPolygon (dpy, window, st->draw_gc, st->spl->points, st->spl->n_points,
- (st->spl->n_points == 3 ? Convex : Complex),
- CoordModeOrigin);
- else
- XDrawLines (dpy, window, st->draw_gc, st->spl->points, st->spl->n_points,
- CoordModeOrigin);
- }
- break;
- default:
- abort ();
- }
-
- return st->delay;
-}
-
-static void
-attraction_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->xlim = w;
- st->ylim = h;
-}
-
-static Bool
-attraction_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
-
- if (event->xany.type == ButtonPress)
- {
- int i;
- if (st->mouse_ball != -1) /* second down-click? drop the ball. */
- {
- st->mouse_ball = -1;
- return True;
- }
- else
- {
- /* When trying to pick up a ball, first look for a click directly
- inside the ball; but if we don't find it, expand the radius
- outward until we find something nearby.
- */
- int x = event->xbutton.x;
- int y = event->xbutton.y;
- float max = 10 * (st->global_size ? st->global_size : MAX_SIZE);
- float step = max / 100;
- float r2;
- for (r2 = step; r2 < max; r2 += step)
- {
- for (i = 0; i < st->npoints; i++)
- {
- float d = ((st->balls[i].x - x) * (st->balls[i].x - x) +
- (st->balls[i].y - y) * (st->balls[i].y - y));
- float r = st->balls[i].size;
- if (r2 > r) r = r2;
- if (d < r*r)
- {
- st->mouse_ball = i;
- return True;
- }
- }
- }
- }
- return True;
- }
- else if (event->xany.type == ButtonRelease) /* drop the ball */
- {
- st->mouse_ball = -1;
- return True;
- }
-
-
-
- return False;
-}
-
-static void
-attraction_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if (st->balls) free (st->balls);
- if (st->x_vels) free (st->x_vels);
- if (st->y_vels) free (st->y_vels);
- if (st->speeds) free (st->speeds);
- if (st->point_stack) free (st->point_stack);
- if (st->colors) free (st->colors);
- if (st->spl) free_spline (st->spl);
-
- XFreeGC (dpy, st->draw_gc);
- XFreeGC (dpy, st->erase_gc);
-
- free (st);
-}
-
-
-static const char *attraction_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*mode: balls",
- "*graphmode: none",
- "*points: 0",
- "*size: 0",
- "*colors: 200",
- "*threshold: 200",
- "*delay: 10000",
- "*glow: false",
- "*walls: true",
- "*maxspeed: true",
- "*cbounce: true",
- "*viscosity: 1.0",
- "*orbit: false",
- "*colorShift: 3",
- "*segments: 500",
- "*vMult: 0.9",
- "*radius: 0",
- "*vx: 0",
- "*vy: 0",
- "*mouseForeground: white",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec attraction_options [] = {
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-graphmode", ".graphmode", XrmoptionSepArg, 0 },
- { "-colors", ".colors", XrmoptionSepArg, 0 },
- { "-points", ".points", XrmoptionSepArg, 0 },
- { "-color-shift", ".colorShift", XrmoptionSepArg, 0 },
- { "-threshold", ".threshold", XrmoptionSepArg, 0 },
- { "-segments", ".segments", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-size", ".size", XrmoptionSepArg, 0 },
- { "-radius", ".radius", XrmoptionSepArg, 0 },
- { "-vx", ".vx", XrmoptionSepArg, 0 },
- { "-vy", ".vy", XrmoptionSepArg, 0 },
- { "-vmult", ".vMult", XrmoptionSepArg, 0 },
- { "-viscosity", ".viscosity", XrmoptionSepArg, 0 },
- { "-glow", ".glow", XrmoptionNoArg, "true" },
- { "-noglow", ".glow", XrmoptionNoArg, "false" },
- { "-orbit", ".orbit", XrmoptionNoArg, "true" },
- { "-nowalls", ".walls", XrmoptionNoArg, "false" },
- { "-walls", ".walls", XrmoptionNoArg, "true" },
- { "-nomaxspeed", ".maxspeed", XrmoptionNoArg, "false" },
- { "-maxspeed", ".maxspeed", XrmoptionNoArg, "true" },
- { "-correct-bounce", ".cbounce", XrmoptionNoArg, "false" },
- { "-fast-bounce", ".cbounce", XrmoptionNoArg, "true" },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Attraction", attraction)
diff --git a/hacks/attraction.man b/hacks/attraction.man
deleted file mode 100644
index 1238f92..0000000
--- a/hacks/attraction.man
+++ /dev/null
@@ -1,204 +0,0 @@
-.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
-.SH NAME
-attraction \- interactions of opposing forces
-.SH SYNOPSIS
-.B attraction
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-visual \fIvisual\fP] [\-points \fIint\fP] [\-threshold \fIint\fP]
-[\-mode balls | lines | polygons | splines | filled-splines | tails ]
-[\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP]
-[\-color-shift \fIint\fP] [\-radius \fIint\fP]
-[\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow]
-[\-orbit] [\-viscosity \fIfloat\fP]
-[\-walls] [\-nowalls] [\-maxspeed] [\-nomaxspeed]
-[\-correct-bounce] [\-fast-bounce]
-[\-fps]
-.SH DESCRIPTION
-The \fIattraction\fP program has several visually different modes of
-operation, all of which are based on the interactions of a set of control
-points which attract each other up to a certain distance, and then begin
-to repel each other. The attraction/repulsion is proportional to the
-distance between any two particles.
-.SH OPTIONS
-.I attraction
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-points integer
-How many control points should be used, or 0 to select the number randomly.
-Default 0. Between 3 and 15 works best.
-.TP 8
-.B \-threshold integer
-The distance (in pixels) from each particle at which the attractive force
-becomes repulsive. Default 100.
-.TP 8
-.B \-mode "balls | lines | polygons | tails | splines | filled-splines"
-In \fIballs\fP mode (the default) the control points are drawn as filled
-circles. The larger the circle, the more massive the particle.
-
-In \fIlines\fP mode, the control points are connected by straight lines;
-the effect is something like \fIqix\fP.
-
-In \fIpolygons\fP mode, the control points are connected by straight
-lines, and filled in. This is most interesting in color.
-
-In \fIsplines\fP mode, a closed spline is interpolated from the control
-points.
-
-In \fIfilled-splines\fP mode, the splines are filled in instead of being
-outlines. This is most interesting in color.
-
-In \fItails\fP mode, the path which each particle follows is indicated
-by a worm-like trail, whose length is controlled by the \fIsegments\fP
-parameter.
-.TP 8
-.B \-size integer
-The size of the balls in pixels, or 0, meaning to select the sizes
-randomly (the default.) If this is specified, then all balls will be
-the same size. This option has an effect in all modes, since the ``size''
-of the balls controls their mass.
-.TP 8
-.B \-segments integer
-If in \fIlines\fP or \fIpolygons\fP mode, how many sets of line segments
-or polygons should be drawn. Default 500. This has no effect in \fIballs\fP
-mode. If \fIsegments\fP is 0, then no segments will ever be erased (this
-is only useful in color.)
-.TP 8
-.B \-delay microseconds
-How much of a delay should be introduced between steps of the animation.
-Default 10000, or about 0.01 seconds.
-.TP 8
-.B \-color-shift int
-If on a color display, the color of the line segments or polygons will
-cycle through the color map. This specifies how many lines will be drawn
-before a new color is chosen. (When a small number of colors are available,
-increasing this value will yield smoother transitions.) Default 3.
-This has no effect in \fIballs\fP mode.
-.TP 8
-.B \-radius
-The size in pixels of the circle on which the points are initially positioned.
-The default is slightly smaller than the size of the window.
-.TP 8
-.B \-glow
-This is consulted only in \fIballs\fP mode. If this is specified, then
-the saturation of the colors of the points will vary according to their
-current acceleration. This has the effect that the balls flare brighter
-when they are reacting to each other most strongly.
-
-In \fIglow\fP mode, all of the balls will be drawn the same (random)
-color, modulo the saturation shifts. In non-glow mode, the balls will
-each be drawn in a random color that doesn't change.
-.TP 8
-.B \-noglow
-Don't do ``glowing.'' This is the default.
-.TP 8
-.B \-vx pixels
-.TP 8
-.B \-vy pixels
-Initial velocity of the balls. This has no effect in \fB\-orbit\fP mode.
-.TP 8
-.B \-orbit
-Make the initial force on each ball be tangential to the circle on which
-they are initially placed, with the right velocity to hold them in orbit
-about each other. After a while, roundoff errors will cause the orbit
-to decay.
-.TP 8
-.B \-vmult float
-In orbit mode, the initial velocity of the balls is multiplied by this;
-a number less than 1 will make the balls pull closer together, and a larger
-number will make them move apart. The default is 0.9, meaning a slight
-inward pull.
-.TP 8
-.B \-viscosity float
-This sets the viscosity of the hypothetical fluid through which the control
-points move; the default is 1, meaning no resistance. Values higher than 1
-aren't interesting; lower values cause less motion.
-
-One interesting thing to try is
-.nf
-.sp
- attraction -viscosity 0.8 -points 300 \\
- -size 10 -geometry =500x500
-.sp
-.fi
-Give it a few seconds to settle down into a stable clump, and then move
-the drag the mouse through it to make "waves".
-.TP 8
-.B \-nowalls
-This will cause the balls to continue on past the edge of the
-screen or window. They will still be kept track of and can come back.
-.TP 8
-.B \-walls
-This will cause the balls to bounce when they get
-to the edge of the screen or window. This is the default behavior.
-.TP 8
-.B \-maxspeed
-Imposes a maximum speed (default). If a ball ends up going faster than
-this, it will be treated as though there were .9 viscosity until it is
-under the limit. This stops the balls from continually accelerating (which
-they have a tendency to do), but also causes balls moving very fast to
-tend to clump in the lower right corner.
-.TP 8
-.B \-nomaxspeed
-If this is specified, no maximum speed is set for the balls.
-.TP 8
-.B \-fast-bounce
-Uses the old, simple bouncing algorithm (default). This simply moves any
-ball that is out of bounds back to a wall and reverses its velocity.
-This works fine for most cases, but under some circumstances, the
-simplification can lead to annoying effects.
-.TP 8
-.B \-correct-bounce
-Uses a more intelligent bouncing algorithm. This method actually reflects
-the balls off the walls until they are within bounds. This can be slow
-if balls are bouncing a whole lot, perhaps because of -nomaxspeed.
-.TP 8
-.B \-graphmode none | x | y | both | speed
-For "x", "y", and "both", displays the given velocities of each ball as a
-bar graph in the same window as the balls. For "speed", displays the total
-speed of each ball. Default is "none".
-.BR
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for any
-purpose is hereby granted without fee, provided that the above copyright
-notice appear in all copies and that both that copyright notice and this
-permission notice appear in supporting documentation. No representations are
-made about the suitability of this software for any purpose. It is provided
-"as is" without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Viscosity support by Philip Edward Cutone, III.
-
-Walls, speed limit options, new bouncing, graphs, and tail mode fix by
-Matthew Strait. 31 March 2001
diff --git a/hacks/automata.h b/hacks/automata.h
deleted file mode 100644
index ad30d47..0000000
--- a/hacks/automata.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/*-
- * automata.c - special stuff for automata modes
- *
- * Copyright (c) 1995 by David Bagley.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- */
-
-#define NUMSTIPPLES 11
-#define STIPPLESIZE 8
-
-static XPoint hexagonUnit[6] =
-{
- {0, 0},
- {1, 1},
- {0, 2},
- {-1, 1},
- {-1, -1},
- {0, -2}
-};
-
-static XPoint triangleUnit[2][3] =
-{
- {
- {0, 0},
- {1, -1},
- {0, 2}
- },
- {
- {0, 0},
- {-1, 1},
- {0, -2}
- }
-};
-
-
-#ifdef DO_STIPPLE
-static unsigned char stipples[NUMSTIPPLES][STIPPLESIZE] =
-{
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* white */
- {0x11, 0x22, 0x11, 0x22, 0x11, 0x22, 0x11, 0x22}, /* grey+white | stripe */
- {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}, /* spots */
- {0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11}, /* lt. / stripe */
- {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, /* | bars */
- {0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa}, /* 50% grey */
- {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00}, /* - bars */
- {0xee, 0xdd, 0xbb, 0x77, 0xee, 0xdd, 0xbb, 0x77}, /* dark \ stripe */
- {0xff, 0x99, 0x99, 0xff, 0xff, 0x99, 0x99, 0xff}, /* spots */
- {0xaa, 0xff, 0xff, 0x55, 0xaa, 0xff, 0xff, 0x55}, /* black+grey - stripe */
- {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} /* black */
-};
-#endif /* DO_STIPPLE */
-
diff --git a/hacks/barcode.c b/hacks/barcode.c
deleted file mode 100644
index 75a2258..0000000
--- a/hacks/barcode.c
+++ /dev/null
@@ -1,2029 +0,0 @@
-/* barcode, draw some barcodes
- * by Dan Bornstein, danfuzz@milk.com
- * Copyright (c) 2003 Dan Bornstein. All rights reserved.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * See the included man page for more details.
- */
-
-#include <math.h>
-#include <time.h>
-#include "screenhack.h"
-
-/* non-user-modifiable immutable definitions */
-
-#define FLOAT double
-
-/* random float in the range (0..1) */
-#define RAND_FLOAT_01 \
- (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000))
-
-#define BARCODE_WIDTH (164)
-#define BARCODE_HEIGHT (69)
-#define MAX_MAG (7)
-
-
-/* simple bitmap structure */
-
-typedef struct
-{
- int width;
- int height;
- int widthBytes;
- char *buf;
-}
-Bitmap;
-
-
-
-/* the model */
-
-typedef struct
-{
- int x; /* x coordinate of the left of the barcode */
- int y; /* y coordinate of the left of the barcode */
- int mag; /* magnfication factor */
- Bitmap *bitmap; /* the bitmap */
- char code[128]; /* the barcode string */
- unsigned long pixel; /* the color */
-}
-Barcode;
-
-struct state {
- Display *dpy;
- Window window;
-
- /* parameters that are user configurable */
-
- /* delay (usec) between iterations */
- int delay;
-
- /* width and height of the window */
- int windowWidth;
- int windowHeight;
-
- Visual *visual; /* the visual to use */
- Colormap cmap; /* the colormap of the window */
-
- GC theGC; /* GC for drawing */
- unsigned long fg_pixel, grid_pixel;
- Bool button_down_p;
- int grid_alloced_p;
- char *strings[200];
-
- Barcode *barcodes; /* array of barcodes */
- int barcode_count; /* how many barcodes are currently active */
- int barcode_max; /* the maximum number of active barcodes */
-
- XImage *theImage; /* ginormo image for drawing */
- Bitmap *theBitmap; /* ginormo bitmap for drawing */
-
- enum { BC_SCROLL, BC_GRID, BC_CLOCK12, BC_CLOCK24 } mode;
-
- int grid_w;
- int grid_h;
-};
-
-/* a bunch of words */
-static const char *words[] =
-{
- "abdomen",
- "abeyance",
- "abhorrence",
- "abrasion",
- "abstraction",
- "acid",
- "addiction",
- "affluenza",
- "alertness",
- "Algeria",
- "antifa",
- "anxiety",
- "aorta",
- "argyle socks",
- "attrition",
- "axis of evil",
- "bamboo",
- "banana slug",
- "bangle",
- "bankruptcy",
- "baptism",
- "beer",
- "bellicosity",
- "bells",
- "belly",
- "bird flu",
- "bliss",
- "bogosity",
- "boobies",
- "boobs",
- "booty",
- "bread",
- "brogrammers",
- "bubba",
- "burrito",
- "California",
- "cancer",
- "capybara",
- "cardinality",
- "caribou",
- "carnage",
- "children",
- "chocolate",
- "chupacabra",
- "CLONE",
- "cock",
- "congress",
- "constriction",
- "contrition",
- "cop",
- "corpse",
- "coronavirus",
- "covid-19",
- "cowboy",
- "crabapple",
- "craziness",
- "cthulhu",
- "Death",
- "decepticon",
- "deception",
- "Decker",
- "decoder",
- "decoy",
- "defenestration",
- "democracy",
- "dependency",
- "despair",
- "desperation",
- "disease",
- "DNA Lounge",
- "doberman",
- "DOOM",
- "dot com",
- "dreams",
- "drugs",
- "easy",
- "ebony",
- "election",
- "eloquence",
- "emergency",
- "eureka",
- "excommunication",
- "fat",
- "fatherland",
- "Faust",
- "fear",
- "fever",
- "filth",
- "flatulence",
- "fluff",
- "fnord",
- "followers",
- "frak",
- "freedom",
- "fruit",
- "futility",
- "gerbils",
- "GOD",
- "goggles",
- "goobers",
- "gorilla",
- "halibut",
- "handmaid",
- "happiness",
- "hate",
- "helplessness",
- "hemorrhoid",
- "hermaphrodite",
- "heroin",
- "heroine",
- "hope",
- "hysteria",
- "icepick",
- "identity",
- "ignorance",
- "illuminati",
- "importance",
- "individuality",
- "influence",
- "influencers",
- "influenza",
- "inkling",
- "insurrection",
- "intoxicant",
- "ire",
- "irritant",
- "jade",
- "jaundice",
- "Joyce",
- "kidney stone",
- "kitchenette",
- "kiwi",
- "lathe",
- "lattice",
- "lawyer",
- "lemming",
- "likes",
- "liquidation",
- "lobbyist",
- "love",
- "lozenge",
- "magazine",
- "magnesium",
- "malfunction",
- "marmot",
- "marshmallow",
- "measles",
- "merit",
- "merkin",
- "mescaline",
- "methane",
- "milk",
- "mischief",
- "mistrust",
- "money",
- "monkey",
- "monkeybutter",
- "nationalism",
- "nature",
- "neuron",
- "noise",
- "nomenclature",
- "nutria",
- "OBEY",
- "ocelot",
- "offspring",
- "overseer",
- "pain",
- "pajamas",
- "passenger",
- "passion",
- "Passover",
- "peace",
- "penance",
- "persimmon",
- "petticoat",
- "pharmacist",
- "PhD",
- "pitchfork",
- "plague",
- "Poindexter",
- "politician",
- "pony",
- "presidency",
- "prison",
- "prophecy",
- "Prozac",
- "punishment",
- "punk rock",
- "punk",
- "pussy",
- "quagmire",
- "quarantine",
- "quartz",
- "rabies",
- "radish",
- "rage",
- "readout",
- "reality",
- "rectum",
- "reject",
- "rejection",
- "respect",
- "revolution",
- "roadrunner",
- "rootkit",
- "rule",
- "SARS",
- "SARS-CoV-2",
- "savor",
- "scab",
- "scalar",
- "Scandinavia",
- "schadenfreude",
- "security",
- "sediment",
- "self worth",
- "shadow profile",
- "sickness",
- "silicone",
- "slack",
- "slander",
- "slavery",
- "sledgehammer",
- "smegma",
- "smelly socks",
- "sorrow",
- "space program",
- "stamen",
- "standardization",
- "stench",
- "subculture",
- "subversion",
- "suffering",
- "surrender",
- "surveillance",
- "synthesis",
- "television",
- "tenant",
- "tendril",
- "terror",
- "terrorism",
- "terrorist",
- "the impossible",
- "the panopticon",
- "the unknown",
- "toast",
- "topography",
- "truism",
- "truthiness",
- "turgid",
- "twits",
- "underbrush",
- "underling",
- "unguent",
- "unusual",
- "uplink",
- "urge",
- "vaccines",
- "valor",
- "variance",
- "vaudeville",
- "vector",
- "vegetarian",
- "venom",
- "verifiability",
- "very fine people",
- "viagra",
- "vibrator",
- "victim",
- "vignette",
- "villainy",
- "W.A.S.T.E.",
- "wagon",
- "waiver",
- "warehouse",
- "waste",
- "waveform",
- "whiffle ball",
- "whorl",
- "windmill",
- "words",
- "worm",
- "worship",
- "Xanax",
- "Xerxes",
- "Xhosa",
- "xylophone",
- "yellow",
- "yesterday",
- "your nose",
- "Zanzibar",
- "zeal",
- "zebra",
- "zest",
- "zinc"
-};
-
-#define WORD_COUNT (sizeof(words) / sizeof(char *))
-
-
-
-/* ----------------------------------------------------------------------------
- * bitmap manipulation
- */
-
-/* construct a new bitmap */
-static Bitmap *makeBitmap (int width, int height)
-{
- Bitmap *result = malloc (sizeof (Bitmap));
- result->width = width;
- result->height = height;
- result->widthBytes = (width + 7) / 8;
- result->buf = calloc (1, height * result->widthBytes);
- return result;
-}
-
-/* clear a bitmap */
-static void bitmapClear (Bitmap *b)
-{
- memset (b->buf, 0, b->widthBytes * b->height);
-}
-
-/* free a bitmap */
-static void bitmapFree (Bitmap *b)
-{
- free (b->buf);
- free (b);
-}
-
-
-/* get the byte value at the given byte-offset coordinates in the given
- * bitmap */
-static int bitmapGetByte (Bitmap *b, int xByte, int y)
-{
- if ((xByte < 0) ||
- (xByte >= b->widthBytes) ||
- (y < 0) ||
- (y >= b->height))
- {
- /* out-of-range get returns 0 */
- return 0;
- }
-
- return b->buf[b->widthBytes * y + xByte];
-}
-
-/* get the bit value at the given coordinates in the given bitmap */
-static int bitmapGet (Bitmap *b, int x, int y)
-{
- int xbyte = x >> 3;
- int xbit = x & 0x7;
- int byteValue = bitmapGetByte (b, xbyte, y);
-
- return (byteValue & (1 << xbit)) >> xbit;
-}
-
-/* set the bit value at the given coordinates in the given bitmap */
-static void bitmapSet (Bitmap *b, int x, int y, int value)
-{
- int xbyte = x >> 3;
- int xbit = x & 0x7;
-
- if ((x < 0) ||
- (x >= b->width) ||
- (y < 0) ||
- (y >= b->height))
- {
- /* ignore out-of-range set */
- return;
- }
-
- if (value)
- {
- b->buf[b->widthBytes * y + xbyte] |= 1 << xbit;
- }
- else
- {
- b->buf[b->widthBytes * y + xbyte] &= ~(1 << xbit);
- }
-}
-
-/* copy the given rectangle to the given destination from the given source. */
-static void bitmapCopyRect (Bitmap *dest, int dx, int dy,
- Bitmap *src, int sx, int sy, int width, int height)
-{
- int x, y;
-
- for (y = 0; y < height; y++)
- {
- for (x = 0; x < width; x++)
- {
- bitmapSet (dest, x + dx, y + dy, bitmapGet (src, x + sx, y + sy));
- }
- }
-}
-
-/* draw a vertical line in the given bitmap */
-static void bitmapVlin (Bitmap *b, int x, int y1, int y2)
-{
- while (y1 <= y2)
- {
- bitmapSet (b, x, y1, 1);
- y1++;
- }
-}
-
-/* scale a bitmap into another bitmap */
-static void bitmapScale (Bitmap *dest, Bitmap *src, int mag)
-{
- int x, y, x2, y2;
-
- for (y = 0; y < BARCODE_HEIGHT; y++)
- {
- for (x = 0; x < BARCODE_WIDTH; x++)
- {
- int v = bitmapGet (src, x, y);
- for (x2 = 0; x2 < mag; x2++)
- {
- for (y2 = 0; y2 < mag; y2++)
- {
- bitmapSet (dest, x * mag + x2, y * mag + y2, v);
- }
- }
- }
- }
-}
-
-
-/* ----------------------------------------------------------------------------
- * character generation
- */
-
-static unsigned char font5x8Buf[] =
-{
- 0x1e, 0x01, 0x06, 0x01, 0x1e, 0x00, 0x1e, 0x01, 0x06, 0x01, 0x1e, 0x00,
- 0x1e, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x1f, 0x08, 0x04, 0x08,
- 0x1f, 0x00, 0x11, 0x1f, 0x11, 0x00, 0x1f, 0x01, 0x01, 0x00, 0x1f, 0x04,
- 0x0a, 0x11, 0x00, 0x01, 0x00, 0x0e, 0x11, 0x11, 0x00, 0x0e, 0x11, 0x11,
- 0x0e, 0x00, 0x1f, 0x08, 0x04, 0x08, 0x1f, 0x00, 0x44, 0x41, 0x4e, 0x20,
- 0x42, 0x4f, 0x52, 0x4e, 0x53, 0x54, 0x45, 0x49, 0x4e, 0x21, 0x21, 0x00,
- 0x66, 0x6e, 0x6f, 0x72, 0x64, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x05, 0x05, 0x05, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x0f, 0x05, 0x0f, 0x05, 0x05, 0x00,
- 0x02, 0x0f, 0x01, 0x0f, 0x08, 0x0f, 0x04, 0x00, 0x0b, 0x0b, 0x08, 0x06,
- 0x01, 0x0d, 0x0d, 0x00, 0x03, 0x05, 0x02, 0x05, 0x0d, 0x05, 0x0b, 0x00,
- 0x04, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x02,
- 0x02, 0x02, 0x04, 0x00, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x00,
- 0x00, 0x09, 0x06, 0x0f, 0x06, 0x09, 0x00, 0x00, 0x00, 0x02, 0x02, 0x07,
- 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x06, 0x00,
- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x02, 0x00, 0x08, 0x08, 0x04, 0x06, 0x02, 0x01, 0x01, 0x00,
- 0x0f, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x06, 0x04, 0x04, 0x04,
- 0x04, 0x04, 0x0f, 0x00, 0x0f, 0x09, 0x08, 0x0f, 0x01, 0x09, 0x0f, 0x00,
- 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x0f, 0x00, 0x09, 0x09, 0x09, 0x0f,
- 0x08, 0x08, 0x08, 0x00, 0x0f, 0x09, 0x01, 0x0f, 0x08, 0x09, 0x0f, 0x00,
- 0x03, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0c,
- 0x04, 0x04, 0x04, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x0f, 0x00,
- 0x0f, 0x09, 0x09, 0x0f, 0x08, 0x08, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00,
- 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x06, 0x00,
- 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x00,
- 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00,
- 0x0f, 0x09, 0x08, 0x0e, 0x02, 0x00, 0x02, 0x00, 0x0f, 0x09, 0x0d, 0x0d,
- 0x0d, 0x01, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x09, 0x00,
- 0x07, 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x00, 0x0f, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x0f, 0x00, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x00,
- 0x0f, 0x01, 0x01, 0x0f, 0x01, 0x01, 0x0f, 0x00, 0x0f, 0x01, 0x01, 0x0f,
- 0x01, 0x01, 0x01, 0x00, 0x0f, 0x01, 0x01, 0x0d, 0x09, 0x09, 0x0f, 0x00,
- 0x09, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x09, 0x00, 0x07, 0x02, 0x02, 0x02,
- 0x02, 0x02, 0x07, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x05, 0x07, 0x00,
- 0x09, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09, 0x00, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x0f, 0x00, 0x09, 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x00,
- 0x09, 0x0b, 0x0d, 0x09, 0x09, 0x09, 0x09, 0x00, 0x0f, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x01, 0x01, 0x01, 0x00,
- 0x0f, 0x09, 0x09, 0x09, 0x0b, 0x05, 0x0b, 0x00, 0x07, 0x09, 0x09, 0x07,
- 0x09, 0x09, 0x09, 0x00, 0x0f, 0x01, 0x01, 0x0f, 0x08, 0x08, 0x0f, 0x00,
- 0x0f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x0f, 0x00, 0x09, 0x09, 0x09, 0x09, 0x09, 0x05, 0x02, 0x00,
- 0x09, 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x09, 0x00, 0x09, 0x09, 0x05, 0x06,
- 0x0a, 0x09, 0x09, 0x00, 0x09, 0x09, 0x09, 0x0f, 0x08, 0x08, 0x0f, 0x00,
- 0x0f, 0x08, 0x08, 0x06, 0x01, 0x01, 0x0f, 0x00, 0x0e, 0x02, 0x02, 0x02,
- 0x02, 0x02, 0x0e, 0x00, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x08, 0x00,
- 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x02, 0x05, 0x05, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
- 0x02, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08,
- 0x0f, 0x09, 0x0f, 0x00, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x09, 0x0f, 0x00,
- 0x00, 0x00, 0x0f, 0x01, 0x01, 0x01, 0x0f, 0x00, 0x08, 0x08, 0x0f, 0x09,
- 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x09, 0x0f, 0x01, 0x0f, 0x00,
- 0x0e, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x09,
- 0x09, 0x0f, 0x08, 0x0c, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x09, 0x09, 0x00,
- 0x02, 0x00, 0x03, 0x02, 0x02, 0x02, 0x07, 0x00, 0x04, 0x00, 0x04, 0x04,
- 0x04, 0x04, 0x05, 0x07, 0x01, 0x01, 0x09, 0x05, 0x03, 0x05, 0x09, 0x00,
- 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x09, 0x0f,
- 0x0f, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x09, 0x00,
- 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x09,
- 0x09, 0x0f, 0x01, 0x01, 0x00, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x08, 0x08,
- 0x00, 0x00, 0x0f, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x01,
- 0x0f, 0x08, 0x0f, 0x00, 0x00, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x0e, 0x00,
- 0x00, 0x00, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x09,
- 0x09, 0x05, 0x02, 0x00, 0x00, 0x00, 0x09, 0x09, 0x0f, 0x0f, 0x09, 0x00,
- 0x00, 0x00, 0x09, 0x09, 0x06, 0x09, 0x09, 0x00, 0x00, 0x00, 0x09, 0x09,
- 0x09, 0x0f, 0x08, 0x0c, 0x00, 0x00, 0x0f, 0x08, 0x06, 0x01, 0x0f, 0x00,
- 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00, 0x02, 0x02, 0x02, 0x02,
- 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x04, 0x02, 0x02, 0x01, 0x00,
- 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00
-};
-
-static Bitmap font5x8 = { 8, 1024, 1, (char *) font5x8Buf };
-
-/* draw the given 5x8 character at the given coordinates */
-static void bitmapDrawChar5x8 (Bitmap *b, int x, int y, char c)
-{
- bitmapCopyRect (b, x, y, &font5x8, 0, c * 8, 5, 8);
-}
-
-/* draw a string of 5x8 characters at the given coordinates */
-static void bitmapDrawString5x8 (Bitmap *b, int x, int y, char *str)
-{
- int origx = x;
-
- while (*str != '\0')
- {
- char c = *str;
- if (c == '\n')
- {
- x = origx;
- y += 8;
- }
- else
- {
- if (c < ' ')
- {
- c = ' ';
- }
-
- bitmapDrawChar5x8 (b, x, y, c);
- x += 5;
- }
- str++;
- }
-}
-
-
-
-/* ----------------------------------------------------------------------------
- * upc/ean symbologies
- */
-
-/* A quick lesson in UPC and EAN barcodes:
- *
- * Each digit consists of 2 bars and 2 spaces, taking a total width of 7
- * times the width of the thinnest possible bar or space. There are three
- * different possible representations for each digit, used depending on
- * what side of a two-sided barcode the digit is used on, and to encode
- * checksum or other information in some cases. The three forms are
- * related. Taking as the "base" form the pattern as seen on the right-hand
- * side of a UPC-A barcode, the other forms are the inverse of the base
- * (that is, bar becomes space and vice versa) and the mirror image of the
- * base. Still confused? Here's a complete table, where 0 means space and 1
- * means bar:
- *
- * Left-A Left-B Right
- * ------- ------- -------
- * 0 0001101 0100111 1110010
- * 1 0011001 0110011 1100110
- * 2 0010011 0011011 1101100
- * 3 0111101 0100001 1000010
- * 4 0100011 0011101 1011100
- * 5 0110001 0111001 1001110
- * 6 0101111 0000101 1010000
- * 7 0111011 0010001 1000100
- * 8 0110111 0001001 1001000
- * 9 0001011 0010111 1110100
- *
- * A UPC-A barcode consists of 6 patterns from Left-A on the left-hand side,
- * 6 patterns from Right on the right-hand side, a guard pattern of 01010
- * in the middle, and a guard pattern of 101 on each end. The 12th digit
- * checksum is calculated as follows: Take the 1st, 3rd, ... 11th digits,
- * sum them and multiplying by 3, and add that to the sum of the other digits.
- * Subtract the final digit from 10, and that is the checksum digit. (If
- * the last digit of the sum is 0, then the check digit is 0.)
- *
- * An EAN-13 barcode is just like a UPC-A barcode, except that the characters
- * on the left-hand side have a pattern of Left-A and Left-B that encodes
- * an extra first digit. Note that an EAN-13 barcode with the first digit
- * of 0 is exactly the same as the UPC-A barcode of the rightmost 12 digits.
- * The patterns to encode the first digit are as follows:
- *
- * Left-Hand
- * Digit Position
- * 1 2 3 4 5 6
- * - - - - - -
- * 0 a a a a a a
- * 1 a a b a b b
- * 2 a a b b a b
- * 3 a a b b b a
- * 4 a b a a b b
- * 5 a b b a a b
- * 6 a b b b a a
- * 7 a b a b a b
- * 8 a b a b b a
- * 9 a b b a b a
- *
- * The checksum for EAN-13 is just like UPC-A, except the 2nd, 4th, ... 12th
- * digits are multiplied by 3 instead of the other way around.
- *
- * An EAN-8 barcode is just like a UPC-A barcode, except there are only 4
- * digits in each half. Unlike EAN-13, there's no nonsense about different
- * left-hand side patterns, either.
- *
- * A UPC-E barcode contains 6 explicit characters between a guard of 101
- * on the left and 010101 on the right. The explicit characters are the
- * middle six characters of the code. The first and last characters are
- * encoded in the parity pattern of the six characters. There are two
- * sets of parity patterns, one to use if the first digit of the number
- * is 0, and another if it is 1. (UPC-E barcodes may only start with a 0
- * or 1.) The patterns are as follows:
- *
- * First digit 0 First digit 1
- * Explicit Digit Explicit Digit
- * Position Position
- * 1 2 3 4 5 6 1 2 3 4 5 6
- * - - - - - - - - - - - -
- * 0 b b b a a a a a a b b b
- * 1 b b a b a a a a b a b b
- * 2 b b a a b a a a b b a b
- * 3 b b a a a b a a b b b a
- * 4 b a b b a a a b a a b b
- * 5 b a a b b a a b b a a b
- * 6 b a a a b b a b b b a a
- * 7 b a b a b a a b a b a b
- * 8 b a b a a b a b a b b a
- * 9 b a a b a b a b b a b a
- *
- * (Note that the two sets are the complements of each other. Also note
- * that the first digit 1 patterns are mostly the same as the EAN-13
- * first digit patterns.) The UPC-E check digit (the final digit encoded in
- * the parity pattern) is the same as the UPC-A check digit for the
- * expanded form of the UPC-E number. The expanstion is as follows, based
- * on the last explicit digit (the second to last digit) in the encoded
- * number:
- *
- * Corresponding
- * UPC-E form UPC-A form
- * ---------- -------------
- * XABCDE0Y XAB00000CDEY
- * XABCDE1Y XAB10000CDEY
- * XABCDE2Y XAB20000CDEY
- * XABCDE3Y XABC00000DEY
- * XABCDE4Y XABCD00000EY
- * XABCDE5Y XABCDE00005Y
- * XABCDE6Y XABCDE00006Y
- * XABCDE7Y XABCDE00007Y
- * XABCDE8Y XABCDE00008Y
- * XABCDE9Y XABCDE00009Y
- *
- * All UPC/EAN barcodes may have an additional 2- or 5-digit supplemental
- * code just to the right of the main barcode. The supplement starts about
- * one digit-length (that is about 7 times the width of the thinnest bar)
- * to the right of the main code, beginning with the guard pattern 1011.
- * After that comes each digit, with a guard pattern of 01 between each,
- * but not at the end. The digits are encoded using the left A and B
- * characters to encode a parity pattern.
- *
- * For 2-digit supplements, the parity pattern is determined by the
- * lower two bits of the numeric value of the code (e.g., 42 would use
- * pattern 2):
- *
- * Lower 2 bits Parity Pattern
- * ------------ --------------
- * 0 (bin 00) a a
- * 1 (bin 01) a b
- * 2 (bin 10) b a
- * 3 (bin 11) b b
- *
- * For 5-digit supplements, the parity pattern is calculated in a similar
- * manner to check digit calculation: The first, third, and fifth digits
- * are summed and multiplied by 3; the second and fourth digits are summed
- * and multiplied by nine; the parity digit is the sum of those two numbers,
- * modulo 10. The parity pattern is then the last five patterns from the
- * UPC-E final digit 0 table for the corresponding digit.
- */
-
-/* enum to indicate which pattern set to use */
-typedef enum
-{
- UPC_LEFT_A, UPC_LEFT_B, UPC_RIGHT
-}
-UpcSet;
-
-/* the Left A patterns */
-static unsigned int upcLeftA[] = {
- 0x0d, 0x19, 0x13, 0x3d, 0x23, 0x31, 0x2f, 0x3b, 0x37, 0x0b
-};
-
-/* the Left B patterns */
-static unsigned int upcLeftB[] = {
- 0x27, 0x33, 0x1b, 0x21, 0x1d, 0x39, 0x05, 0x11, 0x09, 0x17
-};
-
-/* the Right patterns */
-static unsigned int upcRight[] = {
- 0x72, 0x66, 0x6c, 0x42, 0x5c, 0x4e, 0x50, 0x44, 0x48, 0x74
-};
-
-/* the EAN-13 first-digit patterns */
-static unsigned int ean13FirstDigit[] = {
- 0x00, 0x0b, 0x0d, 0x0e, 0x13, 0x19, 0x1c, 0x15, 0x16, 0x1a
-};
-
-/* the UPC-E last-digit patterns for first digit 0 (complement for
- * digit 1); also used for 5-digit supplemental check patterns */
-static unsigned int upcELastDigit[] = {
- 0x38, 0x34, 0x32, 0x31, 0x2c, 0x26, 0x23, 0x2a, 0x29, 0x25
-};
-
-/* turn a character into an int representing its digit value; return
- * 0 for things not in the range '0'-'9' */
-static int charToDigit (char c)
-{
- if ((c >= '0') && (c <= '9'))
- {
- return c - '0';
- }
- else
- {
- return 0;
- }
-}
-
-/* draw the given digit character at the given coordinates; a '0' is
- * used in place of any non-digit character */
-static void drawDigitChar (struct state *st, Bitmap *b, int x, int y, char c)
-{
- if (st->mode != BC_CLOCK24 &&
- st->mode != BC_CLOCK12)
- if ((c < '0') || (c > '9'))
- c = '0';
-
- bitmapDrawChar5x8 (b, x, y, c);
-}
-
-/* draw a upc/ean digit at the given coordinates */
-static void drawUpcEanDigit (Bitmap *upcBitmap, int x, int y1, int y2, char n,
- UpcSet set)
-{
- unsigned int bits;
- int i;
-
- n = charToDigit (n);
- switch (set)
- {
- case UPC_LEFT_A:
- bits = upcLeftA[(int) n];
- break;
- case UPC_LEFT_B:
- bits = upcLeftB[(int) n];
- break;
- default /* case UPC_RIGHT */:
- bits = upcRight[(int) n];
- break;
- }
-
- for (i = 6; i >=0; i--)
- {
- if (bits & (1 << i))
- {
- bitmapVlin (upcBitmap, x, y1, y2);
- }
- x++;
- }
-}
-
-/* report the width of the given supplemental code or 0 if it is a bad
- * supplement form */
-static int upcEanSupplementWidth (char *digits)
-{
- switch (strlen (digits))
- {
- case 2: return 28; /* 8 + 4 + 2*7 + 1*2 */
- case 5: return 55; /* 8 + 4 + 5*7 + 4*2 */
- default: return 0;
- }
-}
-
-/* draw the given supplemental barcode, including the textual digits */
-static void drawUpcEanSupplementalBars (struct state *st,
- Bitmap *upcBitmap, char *digits,
- int x, int y, int y2, int textAbove)
-{
- int len = strlen (digits);
- int i;
- int parity;
- int textY;
- int textX;
-
- if (textAbove)
- {
- textY = y;
- y += 8;
- }
- else
- {
- y2 -= 8;
- textY = y2 + 2;
- }
-
- x += 8; /* skip the space between the main and supplemental */
-
- switch (len)
- {
- case 2:
- {
- textX = x + 5;
- parity = (charToDigit (digits[0]) * 10 +
- charToDigit (digits[1])) & 0x3;
- break;
- }
- case 5:
- {
- textX = x + 10;
- parity =
- ((charToDigit (digits[0]) + charToDigit (digits[2]) +
- charToDigit (digits[4])) * 3
- + (charToDigit (digits[1]) + charToDigit (digits[3])) * 9)
- % 10;
- parity = upcELastDigit[parity];
- break;
- }
- default:
- {
- fprintf (stderr, "%s: bad supplement (%d digits)\n",
- progname, len);
- exit(1);
- break;
- }
- }
-
- /* header */
- bitmapVlin (upcBitmap, x, y, y2);
- bitmapVlin (upcBitmap, x + 2, y, y2);
- bitmapVlin (upcBitmap, x + 3, y, y2);
-
- for (i = 0; i < len; i++)
- {
- UpcSet lset =
- (parity & (1 << (len - 1 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
- int baseX = x + 2 + i * 9;
-
- /* separator / end of header */
- if (i == 0)
- {
- bitmapVlin (upcBitmap, baseX, y, y2);
- }
- bitmapVlin (upcBitmap, baseX + 1, y, y2);
-
- drawUpcEanDigit (upcBitmap,
- baseX + 2,
- y,
- y2,
- digits[i],
- lset);
-
- drawDigitChar (st, upcBitmap, textX + i*6, textY, digits[i]);
- }
-}
-
-/* draw the actual barcode part of a UPC-A barcode */
-static void drawUpcABars (Bitmap *upcBitmap, char *digits, int x, int y,
- int barY2, int guardY2)
-{
- int i;
-
- /* header */
- bitmapVlin (upcBitmap, x, y, guardY2);
- bitmapVlin (upcBitmap, x + 2, y, guardY2);
-
- /* center marker */
- bitmapVlin (upcBitmap, x + 46, y, guardY2);
- bitmapVlin (upcBitmap, x + 48, y, guardY2);
-
- /* trailer */
- bitmapVlin (upcBitmap, x + 92, y, guardY2);
- bitmapVlin (upcBitmap, x + 94, y, guardY2);
-
- for (i = 0; i < 6; i++)
- {
- drawUpcEanDigit (upcBitmap,
- x + 3 + i*7,
- y,
- (i == 0) ? guardY2 : barY2,
- digits[i],
- UPC_LEFT_A);
- drawUpcEanDigit (upcBitmap,
- x + 50 + i*7,
- y,
- (i == 5) ? guardY2 : barY2,
- digits[i+6],
- UPC_RIGHT);
- }
-}
-
-/* make and return a full-height UPC-A barcode */
-static int makeUpcAFull (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int baseWidth = 108;
- int baseHeight = 60;
-
- int height = baseHeight + y;
- int i;
-
- bitmapClear (dest);
- drawUpcABars (dest, digits, 6, y, height - 10, height - 4);
-
- drawDigitChar (st, dest, 0, height - 14, digits[0]);
-
- for (i = 0; i < 5; i++)
- {
- drawDigitChar (st, dest, 18 + i*7, height - 7, digits[i+1]);
- drawDigitChar (st, dest, 57 + i*7, height - 7, digits[i+6]);
- }
-
- drawDigitChar (st, dest, 103, height - 14, digits[11]);
-
- return baseWidth;
-}
-
-/* make and return a UPC-A barcode */
-static int makeUpcA (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int i;
- unsigned int mul = 3;
- unsigned int sum = 0;
-
- for (i = 0; i < 11; i++)
- {
- sum += charToDigit (digits[i]) * mul;
- mul ^= 2;
- }
-
- if (digits[11] == '?')
- {
- digits[11] = ((10 - (sum % 10)) % 10) + '0';
- }
-
- return makeUpcAFull (st, dest, digits, y);
-}
-
-/* draw the actual barcode part of a UPC-E barcode */
-static void drawUpcEBars (struct state *st,
- Bitmap *upcBitmap, char *digits, int x, int y,
- int barY2, int guardY2)
-{
- int i;
- int parityPattern = upcELastDigit[charToDigit(digits[7])];
-
- int clockp = (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24);
-
- if (digits[0] == '1')
- {
- parityPattern = ~parityPattern;
- }
-
- /* header */
- bitmapVlin (upcBitmap, x, y, guardY2);
- bitmapVlin (upcBitmap, x + 2, y, guardY2);
-
- /* trailer */
- bitmapVlin (upcBitmap, x + 46 + (clockp?8:0), y, guardY2);
- bitmapVlin (upcBitmap, x + 48 + (clockp?8:0), y, guardY2);
- bitmapVlin (upcBitmap, x + 50 + (clockp?8:0), y, guardY2);
-
- /* clock kludge -- this draws an extra set of dividers after
- digits 2 and 4. This makes this *not* be a valid bar code,
- but, it looks pretty for the clock dpy.
- */
- if (clockp)
- {
- bitmapVlin (upcBitmap, x + 18, y, guardY2);
- bitmapVlin (upcBitmap, x + 18 + 2, y, guardY2);
-
- bitmapVlin (upcBitmap, x + 36, y, guardY2);
- bitmapVlin (upcBitmap, x + 36 + 2, y, guardY2);
- }
-
- for (i = 0; i < 6; i++)
- {
- UpcSet lset =
- (parityPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
- int off = (clockp
- ? (i < 2 ? 0 :
- i < 4 ? 4 : /* extra spacing for clock bars */
- 8)
- : 0);
- drawUpcEanDigit (upcBitmap,
- x + 3 + i*7 + off,
- y,
- barY2,
- digits[i + 1],
- lset);
- }
-}
-
-/* make and return a full-height UPC-E barcode */
-static int makeUpcEFull (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int baseWidth = 64;
- int baseHeight = 60;
-
- int height = baseHeight + y;
- int i;
-
- bitmapClear (dest);
- drawUpcEBars (st, dest, digits, 6, y, height - 10, height - 4);
-
- drawDigitChar (st, dest, 0, height - 14, digits[0]);
-
- for (i = 0; i < 6; i++)
- {
- drawDigitChar (st, dest, 11 + i*7, height - 7, digits[i+1]);
- }
-
- drawDigitChar (st, dest, 59, height - 14, digits[7]);
-
- return baseWidth;
-}
-
-/* expand 8 UPC-E digits into a UPC-A number, storing into the given result
- * array, or just store '\0' into the first element, if the form factor
- * is incorrect; this will also calculate the check digit, if it is
- * specified as '?' */
-static void expandToUpcADigits (char *compressed, char *expanded)
-{
- int i;
-
- if ((compressed[0] != '0') && (compressed[0] != '1'))
- {
- return;
- }
-
- expanded[0] = compressed[0];
- expanded[6] = '0';
- expanded[7] = '0';
- expanded[11] = compressed[7];
-
- switch (compressed[6])
- {
- case '0':
- case '1':
- case '2':
- {
- expanded[1] = compressed[1];
- expanded[2] = compressed[2];
- expanded[3] = compressed[6];
- expanded[4] = '0';
- expanded[5] = '0';
- expanded[8] = compressed[3];
- expanded[9] = compressed[4];
- expanded[10] = compressed[5];
- break;
- }
- case '3':
- {
- expanded[1] = compressed[1];
- expanded[2] = compressed[2];
- expanded[3] = compressed[3];
- expanded[4] = '0';
- expanded[5] = '0';
- expanded[8] = '0';
- expanded[9] = compressed[4];
- expanded[10] = compressed[5];
- break;
- }
- case '4':
- {
- expanded[1] = compressed[1];
- expanded[2] = compressed[2];
- expanded[3] = compressed[3];
- expanded[4] = compressed[4];
- expanded[5] = '0';
- expanded[8] = '0';
- expanded[9] = '0';
- expanded[10] = compressed[5];
- break;
- }
- default:
- {
- expanded[1] = compressed[1];
- expanded[2] = compressed[2];
- expanded[3] = compressed[3];
- expanded[4] = compressed[4];
- expanded[5] = compressed[5];
- expanded[8] = '0';
- expanded[9] = '0';
- expanded[10] = compressed[6];
- break;
- }
- }
-
- if (expanded[11] == '?')
- {
- unsigned int mul = 3;
- unsigned int sum = 0;
-
- for (i = 0; i < 11; i++)
- {
- sum += charToDigit (expanded[i]) * mul;
- mul ^= 2;
- }
-
- expanded[11] = ((10 - (sum % 10)) % 10) + '0';
- }
-}
-
-/* make and return a UPC-E barcode */
-static int makeUpcE (struct state *st, Bitmap *dest, char *digits, int y)
-{
- char expandedDigits[13];
- char compressedDigits[9];
-
- expandedDigits[0] = '\0';
- compressedDigits[0] = '0';
- strcpy (compressedDigits + 1, digits);
-
- expandToUpcADigits (compressedDigits, expandedDigits);
- if (expandedDigits[0] == '\0')
- {
- return 0;
- }
-
- compressedDigits[7] = expandedDigits[11];
-
- return makeUpcEFull (st, dest, compressedDigits, y);
-}
-
-/* draw the actual barcode part of a EAN-13 barcode */
-static void drawEan13Bars (Bitmap *upcBitmap, char *digits, int x, int y,
- int barY2, int guardY2)
-{
- int i;
- int leftPattern = ean13FirstDigit[charToDigit (digits[0])];
-
- /* header */
- bitmapVlin (upcBitmap, x, y, guardY2);
- bitmapVlin (upcBitmap, x + 2, y, guardY2);
-
- /* center marker */
- bitmapVlin (upcBitmap, x + 46, y, guardY2);
- bitmapVlin (upcBitmap, x + 48, y, guardY2);
-
- /* trailer */
- bitmapVlin (upcBitmap, x + 92, y, guardY2);
- bitmapVlin (upcBitmap, x + 94, y, guardY2);
-
- for (i = 0; i < 6; i++)
- {
- UpcSet lset = (leftPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
-
- drawUpcEanDigit (upcBitmap,
- x + 3 + i*7,
- y,
- barY2,
- digits[i+1],
- lset);
- drawUpcEanDigit (upcBitmap,
- x + 50 + i*7,
- y,
- barY2,
- digits[i+7],
- UPC_RIGHT);
- }
-}
-
-/* make and return a full-height EAN-13 barcode */
-static int makeEan13Full (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int baseWidth = 102;
- int baseHeight = 60;
-
- int height = baseHeight + y;
- int i;
-
- bitmapClear (dest);
- drawEan13Bars (dest, digits, 6, y, height - 10, height - 4);
-
- drawDigitChar (st, dest, 0, height - 7, digits[0]);
-
- for (i = 0; i < 6; i++)
- {
- drawDigitChar (st, dest, 11 + i*7, height - 7, digits[i+1]);
- drawDigitChar (st, dest, 57 + i*7, height - 7, digits[i+7]);
- }
-
- return baseWidth;
-}
-
-/* make and return an EAN-13 barcode */
-static int makeEan13 (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int i;
- unsigned int mul = 1;
- unsigned int sum = 0;
-
- for (i = 0; i < 12; i++)
- {
- sum += charToDigit (digits[i]) * mul;
- mul ^= 2;
- }
-
- if (digits[12] == '?')
- {
- digits[12] = ((10 - (sum % 10)) % 10) + '0';
- }
-
- return makeEan13Full (st, dest, digits, y);
-}
-
-/* draw the actual barcode part of an EAN-8 barcode */
-static void drawEan8Bars (Bitmap *upcBitmap, char *digits, int x, int y,
- int barY2, int guardY2)
-{
- int i;
-
- /* header */
- bitmapVlin (upcBitmap, x, y, guardY2);
- bitmapVlin (upcBitmap, x + 2, y, guardY2);
-
- /* center marker */
- bitmapVlin (upcBitmap, x + 32, y, guardY2);
- bitmapVlin (upcBitmap, x + 34, y, guardY2);
-
- /* trailer */
- bitmapVlin (upcBitmap, x + 64, y, guardY2);
- bitmapVlin (upcBitmap, x + 66, y, guardY2);
-
- for (i = 0; i < 4; i++)
- {
- drawUpcEanDigit (upcBitmap,
- x + 3 + i*7,
- y,
- barY2,
- digits[i],
- UPC_LEFT_A);
- drawUpcEanDigit (upcBitmap,
- x + 36 + i*7,
- y,
- barY2,
- digits[i+4],
- UPC_RIGHT);
- }
-}
-
-/* make and return a full-height EAN-8 barcode */
-static int makeEan8Full (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int baseWidth = 68;
- int baseHeight = 60;
-
- int height = baseHeight + y;
- int i;
-
- bitmapClear (dest);
- drawEan8Bars (dest, digits, 0, y, height - 10, height - 4);
-
- for (i = 0; i < 4; i++)
- {
- drawDigitChar (st, dest, 5 + i*7, height - 7, digits[i]);
- drawDigitChar (st, dest, 37 + i*7, height - 7, digits[i+4]);
- }
-
- return baseWidth;
-}
-
-/* make and return an EAN-8 barcode */
-static int makeEan8 (struct state *st, Bitmap *dest, char *digits, int y)
-{
- int i;
- unsigned int mul = 3;
- unsigned int sum = 0;
-
- for (i = 0; i < 7; i++)
- {
- sum += charToDigit (digits[i]) * mul;
- mul ^= 2;
- }
-
- if (digits[7] == '?')
- {
- digits[7] = ((10 - (sum % 10)) % 10) + '0';
- }
-
- return makeEan8Full (st, dest, digits, y);
-}
-
-/* Dispatch to the right form factor UPC/EAN barcode generator */
-static void processUpcEan (struct state *st, char *str, Bitmap *dest)
-{
- char digits[16];
- int digitCount = 0;
- char supDigits[8];
- int supDigitCount = 0;
- char *instr = str;
- char *banner = NULL;
- int supplement = 0;
- int vstart = 9;
- int width = 0;
-
- while ((digitCount < 15) && (supDigitCount < 7))
- {
- char c = *instr;
- if (((c >= '0') && (c <= '9')) || (c == '?'))
- {
- if (supplement)
- {
- supDigits[supDigitCount] = *instr;
- supDigitCount++;
- }
- else
- {
- digits[digitCount] = *instr;
- digitCount++;
- }
- }
- else if (c == ',')
- {
- supplement = 1;
- }
- else if (c == ':')
- {
- banner = instr + 1;
- break;
- }
- else if (c == '\0')
- {
- break;
- }
- instr++;
- }
-
- digits[digitCount] = '\0';
- supDigits[supDigitCount] = '\0';
-
- if (supDigitCount == 0)
- {
- supplement = 0;
- }
- else if ((supDigitCount == 2) || (supDigitCount == 5))
- {
- supplement = upcEanSupplementWidth (supDigits);
- }
- else
- {
- fprintf (stderr, "%s: invalid supplement (must be 2 or 5 digits)\n",
- progname);
- exit (1);
- }
-
- if (banner == NULL)
- {
- banner = "barcode";
- }
-
- switch (digitCount)
- {
- case 7:
- {
- width = makeUpcE (st, dest, digits, vstart);
- break;
- }
- case 8:
- {
- width = makeEan8 (st, dest, digits, vstart);
- break;
- }
- case 12:
- {
- width = makeUpcA (st, dest, digits, vstart);
- break;
- }
- case 13:
- {
- width = makeEan13 (st, dest, digits, vstart);
- break;
- }
- default:
- {
- fprintf (stderr, "%s: bad barcode (%d digits)\n",
- progname, digitCount);
- exit(1);
- }
- }
-
- if (supplement)
- {
- drawUpcEanSupplementalBars (st, dest, supDigits,
- width,
- vstart + 1, dest->height - 4, 1);
- }
-
- if (banner != NULL)
- {
- bitmapDrawString5x8 (dest,
- (width + supplement -
- ((int) strlen (banner) * 5)) / 2,
- 0,
- banner);
- }
-}
-
-
-
-/* ----------------------------------------------------------------------------
- * the screenhack
- */
-
-/*
- * overall setup stuff
- */
-
-/* set up the system */
-static void setup (struct state *st)
-{
- XWindowAttributes xgwa;
- XGCValues gcv;
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
-
- st->visual = xgwa.visual;
- st->cmap = xgwa.colormap;
- st->windowWidth = xgwa.width;
- st->windowHeight = xgwa.height;
-
- gcv.background = get_pixel_resource (st->dpy, xgwa.colormap,
- "background", "Background");
- gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap,
- "foreground", "Foreground");
- st->fg_pixel = gcv.foreground;
- st->theGC = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
-
- st->theBitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG, BARCODE_HEIGHT * MAX_MAG);
- st->theImage = XCreateImage(st->dpy, st->visual, 1, XYBitmap, 0, st->theBitmap->buf,
- st->theBitmap->width, st->theBitmap->height, 8,
- st->theBitmap->widthBytes);
- st->theImage->bitmap_bit_order = LSBFirst;
- st->theImage->byte_order = LSBFirst;
-}
-
-
-
-/*
- * the simulation
- */
-
-/* set up the model */
-static void setupModel (struct state *st)
-{
- int i;
-
- st->barcode_max = 20;
- st->barcode_count = 0;
- st->barcodes = malloc (sizeof (Barcode) * st->barcode_max);
-
- for (i = 0; i < st->barcode_max; i++)
- {
- st->barcodes[i].bitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG,
- BARCODE_HEIGHT * MAX_MAG);
- }
-}
-
-/* make a new barcode string */
-static void makeBarcodeString (struct state *st, char *str)
-{
- int dig, i;
-
- switch ((int) (RAND_FLOAT_01 * 4))
- {
- case 0: dig = 6; break;
- case 1: dig = 7; break;
- case 2: dig = 11; break;
- default: dig = 12; break;
- }
-
- for (i = 0; i < dig; i++)
- {
- str[i] = RAND_FLOAT_01 * 10 + '0';
- }
-
- str[i] = '?';
- i++;
-
- switch ((int) (RAND_FLOAT_01 * 3))
- {
- case 0: dig = 0; break;
- case 1: dig = 2; break;
- default: dig = 5; break;
- }
-
- if (dig != 0)
- {
- str[i] = ',';
- i++;
- while (dig > 0)
- {
- str[i] = RAND_FLOAT_01 * 10 + '0';
- i++;
- dig--;
- }
- }
-
- str[i] = ':';
- i++;
-
- strcpy(&str[i], words[(int) (RAND_FLOAT_01 * WORD_COUNT)]);
-}
-
-/* update the model for one iteration */
-static void scrollModel (struct state *st)
-{
- int i;
-
- for (i = 0; i < st->barcode_count; i++)
- {
- Barcode *b = &st->barcodes[i];
- b->x--;
- if ((b->x + BARCODE_WIDTH * b->mag) < 0)
- {
- /* fell off the edge */
- if (i != (st->barcode_count - 1)) {
- Bitmap *oldb = b->bitmap;
- memmove (b, b + 1, (st->barcode_count - i - 1) * sizeof (Barcode));
- st->barcodes[st->barcode_count - 1].bitmap = oldb;
-
- XFreeColors (st->dpy, st->cmap, &b->pixel, 1, 0);
- }
-
- i--;
- st->barcode_count--;
- }
- }
-
- while (st->barcode_count < st->barcode_max)
- {
- Barcode *barcode = &st->barcodes[st->barcode_count];
- barcode->x = (st->barcode_count == 0) ?
- 0 :
- (st->barcodes[st->barcode_count - 1].x +
- st->barcodes[st->barcode_count - 1].mag * BARCODE_WIDTH);
- barcode->x += RAND_FLOAT_01 * 100;
- barcode->mag = RAND_FLOAT_01 * MAX_MAG;
-
- if (st->windowWidth < 100 || st->windowHeight < 100) {
- barcode->mag *= 0.5;
- if (barcode->mag <= 0) barcode->mag = 1;
- }
-
- barcode->y =
- RAND_FLOAT_01 * (st->windowHeight - BARCODE_HEIGHT * barcode->mag);
- if (barcode->y < 0)
- {
- barcode->y = 0;
- }
- makeBarcodeString(st, barcode->code);
- processUpcEan (st, barcode->code, st->theBitmap);
- bitmapScale (barcode->bitmap, st->theBitmap, barcode->mag);
-
- {
- XColor c;
- int ii, ok = 0;
- for (ii = 0; ii < 100; ii++)
- {
- hsv_to_rgb (random() % 360, 1.0, 1.0, &c.red, &c.green, &c.blue);
- ok = XAllocColor (st->dpy, st->cmap, &c);
- if (ok) break;
- }
- if (!ok)
- {
- c.red = c.green = c.blue = 0xFFFF;
- if (!XAllocColor (st->dpy, st->cmap, &c))
- abort();
- }
- barcode->pixel = c.pixel;
- }
-
- st->barcode_count++;
- }
-}
-
-/* update the model for one iteration */
-static void updateGrid (struct state *st)
-{
- int i, x, y;
-
- if (st->grid_w == 0 || st->grid_h == 0 ||
- (! (random() % 400)))
- {
- XClearWindow (st->dpy, st->window);
- st->grid_w = 1 + (random() % 3);
- st->grid_h = 1 + (random() % 4);
- }
-
- if (!st->grid_alloced_p || (! (random() % 100)))
- {
- XColor c;
- hsv_to_rgb (random() % 360, 1.0, 1.0, &c.red, &c.green, &c.blue);
- if (st->grid_alloced_p)
- XFreeColors (st->dpy, st->cmap, &st->grid_pixel, 1, 0);
- XAllocColor (st->dpy, st->cmap, &c);
- st->grid_pixel = c.pixel;
- st->grid_alloced_p = 1;
- }
-
- st->barcode_count = st->grid_w * st->grid_h;
- if (st->barcode_count > st->barcode_max) abort();
-
- for (i = 0; i < st->barcode_max; i++)
- {
- Barcode *b = &st->barcodes[i];
- b->x = b->y = 999999;
- }
-
- i = 0;
- for (y = 0; y < st->grid_h; y++)
- for (x = 0; x < st->grid_w; x++, i++)
- {
- Barcode *b = &st->barcodes[i];
- int digits = 12;
-
- int cell_w = (st->windowWidth / st->grid_w);
- int cell_h = (st->windowHeight / st->grid_h);
- int mag_x = cell_w / BARCODE_WIDTH;
- int mag_y = cell_h / BARCODE_HEIGHT;
- int BW = 108 /*BARCODE_WIDTH*/;
- int BH = BARCODE_HEIGHT;
-
- b->mag = (mag_x < mag_y ? mag_x : mag_y);
-
- b->x = (x * cell_w) + ((cell_w - b->mag * BW) / 2);
- b->y = (y * cell_h) + ((cell_h - b->mag * BH) / 2);
- b->pixel = st->grid_pixel;
-
- if (!st->strings[i])
- {
- int j;
- char *s = malloc (digits + 10);
- st->strings[i] = s;
- for (j = 0; j < digits; j++)
- s[j] = (random() % 10) + '0';
- s[j++] = '?';
- s[j++] = ':';
- s[j] = 0;
- }
-
- /* change one digit in this barcode */
- st->strings[i][random() % digits] = (random() % 10) + '0';
-
- strcpy (b->code, st->strings[i]);
- processUpcEan (st, b->code, b->bitmap);
- }
-}
-
-
-/* update the model for one iteration.
- This one draws a clock. By jwz. */
-static void updateClock (struct state *st)
-{
- Barcode *b = &st->barcodes[0];
- int BW = 76 /* BARCODE_WIDTH */;
- int BH = BARCODE_HEIGHT;
- int mag_x, mag_y;
- int i;
- time_t now = time ((time_t *) 0);
- struct tm *tm = localtime (&now);
- XWindowAttributes xgwa;
- int ow = st->windowWidth;
- int oh = st->windowHeight;
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- st->windowWidth = xgwa.width;
- st->windowHeight = xgwa.height;
-
- mag_x = st->windowWidth / BW;
- mag_y = st->windowHeight / BH;
-
- st->barcode_count = 1;
-
- b->mag = (mag_x < mag_y ? mag_x : mag_y);
-
- if (b->mag > MAX_MAG) b->mag = MAX_MAG;
- if (b->mag < 1) b->mag = 1;
-
- b->x = (st->windowWidth - (b->mag * BW )) / 2;
- b->y = (st->windowHeight - (b->mag * (BH + 9))) / 2;
- b->pixel = st->fg_pixel;
-
- if (!st->button_down_p)
- sprintf (b->code, "0%02d%02d%02d?:",
- (st->mode == BC_CLOCK24
- ? tm->tm_hour
- : (tm->tm_hour > 12
- ? tm->tm_hour - 12
- : (tm->tm_hour == 0
- ? 12
- : tm->tm_hour))),
- tm->tm_min,
- tm->tm_sec);
- else
- sprintf (b->code, "0%02d%02d%02d?:",
- tm->tm_year % 100, tm->tm_mon+1, tm->tm_mday);
-
- {
- int vstart = 9;
- int hh = BH + vstart;
- char expandedDigits[13];
-
- expandedDigits[0] = '\0';
-
- expandToUpcADigits (b->code, expandedDigits);
- if (expandedDigits[0] != '\0')
- b->code[7] = expandedDigits[11];
-
- bitmapClear (st->theBitmap);
- drawUpcEBars (st, st->theBitmap, b->code, 6, 9, 59, 65);
- for (i = 0; i < 6; i++)
- {
- int off = (i < 2 ? 0 :
- i < 4 ? 4 :
- 8);
- drawDigitChar (st, st->theBitmap, 11 + i*7 + off, hh - 16, b->code[i+1]);
- }
-
- if (!st->button_down_p)
- {
-#if 0
- char *days[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
- char *s = days[tm->tm_wday];
- bitmapDrawString5x8 (st->theBitmap, (BW - strlen (s)*5) / 2, 0, s);
-#endif
- drawDigitChar (st, st->theBitmap, 0, hh - 23, (tm->tm_hour < 12 ? 'A' : 'P'));
- drawDigitChar (st, st->theBitmap, 68, hh - 23, 'M');
- }
- else
- {
- char s[20];
- sprintf (s, "%03d", tm->tm_yday);
- bitmapDrawString5x8 (st->theBitmap, (BW - strlen (s)*5) / 2, 0, s);
- }
- }
-
- bitmapScale (b->bitmap, st->theBitmap, b->mag);
-
- if (ow != st->windowWidth || oh != st->windowHeight)
- XClearWindow (st->dpy, st->window);
-}
-
-
-
-/* render and dpy the current model */
-static void renderFrame (struct state *st)
-{
- int i;
-
- for (i = 0; i < st->barcode_count; i++)
- {
- Barcode *barcode = &st->barcodes[i];
-
- if (barcode->x > st->windowWidth) {
- break;
- }
-
- /* bitmapScale (st->theBitmap, barcode->bitmap, barcode->mag);*/
- st->theImage->data = barcode->bitmap->buf;
-
- XSetForeground (st->dpy, st->theGC, barcode->pixel);
- XPutImage (st->dpy, st->window, st->theGC, st->theImage,
- 0, 0, barcode->x, barcode->y,
- BARCODE_WIDTH * barcode->mag,
- BARCODE_HEIGHT * barcode->mag);
- }
-}
-
-/* do one iteration */
-static unsigned long
-barcode_draw (Display *dpy, Window win, void *closure)
-{
- struct state *st = (struct state *) closure;
- if (st->mode == BC_SCROLL)
- scrollModel (st);
- else if (st->mode == BC_GRID)
- updateGrid (st);
- else if (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24)
- updateClock (st);
- else
- abort();
-
- renderFrame (st);
-
- return st->delay;
-}
-
-
-static Bool
-barcode_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- int clockp = (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24);
- if (clockp && event->xany.type == ButtonPress) {
- st->button_down_p = True;
- return True;
- } else if (clockp && event->xany.type == ButtonRelease) {
- st->button_down_p = False;
- return True;
- } else
- return False;
-}
-
-static void
-barcode_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->windowWidth = w;
- st->windowHeight = h;
-}
-
-static void
-barcode_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
- XFreeGC (dpy, st->theGC);
- st->theImage->data = 0;
- XDestroyImage (st->theImage);
- bitmapFree (st->theBitmap);
- for (i = 0; i < st->barcode_max; i++)
- bitmapFree (st->barcodes[i].bitmap);
- free (st->barcodes);
- free (st);
-}
-
-
-/* main and options and stuff */
-
-static const char *barcode_defaults [] = {
- ".background: black",
- ".foreground: green",
- ".lowrez: true",
- "*fpsSolid: true",
- "*delay: 10000",
- "*mode: scroll",
- 0
-};
-
-static XrmOptionDescRec barcode_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-scroll", ".mode", XrmoptionNoArg, "scroll" },
- { "-grid", ".mode", XrmoptionNoArg, "grid" },
- { "-clock", ".mode", XrmoptionNoArg, "clock" },
- { "-clock12", ".mode", XrmoptionNoArg, "clock12" },
- { "-clock24", ".mode", XrmoptionNoArg, "clock24" },
- { 0, 0, 0, 0 }
-};
-
-/* initialize the user-specifiable params */
-static void initParams (struct state *st)
-{
- int problems = 0;
- char *s;
-
- st->delay = get_integer_resource (st->dpy, "delay", "Delay");
- if (st->delay < 0)
- {
- fprintf (stderr, "%s: delay must be at least 0\n", progname);
- problems = 1;
- }
-
- s = get_string_resource (st->dpy, "mode", "Mode");
- if (!s || !*s || !strcasecmp (s, "scroll"))
- st->mode = BC_SCROLL;
- else if (!strcasecmp (s, "grid"))
- st->mode = BC_GRID;
- else if (!strcasecmp (s, "clock") ||
- !strcasecmp (s, "clock12"))
- st->mode = BC_CLOCK12;
- else if (!strcasecmp (s, "clock24"))
- st->mode = BC_CLOCK24;
- else
- {
- fprintf (stderr, "%s: unknown mode \"%s\"\n", progname, s);
- problems = 1;
- }
- free (s);
-
- if (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24)
- st->delay = 10000; /* only update every 1/10th second */
-
- if (problems)
- {
- exit (1);
- }
-}
-
-static void *
-barcode_init (Display *dpy, Window win)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- st->dpy = dpy;
- st->window = win;
-
- initParams (st);
- setup (st);
- setupModel (st);
- return st;
-}
-
-
-XSCREENSAVER_MODULE ("Barcode", barcode)
diff --git a/hacks/barcode.man b/hacks/barcode.man
deleted file mode 100644
index b21fb8f..0000000
--- a/hacks/barcode.man
+++ /dev/null
@@ -1,61 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-barcode \- draws a random sequence of barcodes for the products you enjoy
-.SH SYNOPSIS
-.B barcode
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-clock]
-[\-clock24]
-[\-fps]
-.SH DESCRIPTION
-This draws a random sequence of colorful barcodes scrolling across your
-screen.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.02 seconds.).
-.TP 8
-.B \-clock
-Instead of drawing a stream of barcodes, draw a barcode-based digital clock.
-.TP 8
-.B \-clock24
-Same as \fI\-clock\fP, but display 24-hour time instead of 12-hour time.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Dan Bornstein. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Dan Bornstein <danfuzz@milk.com>
diff --git a/hacks/binaryring.c b/hacks/binaryring.c
deleted file mode 100644
index 755a1b4..0000000
--- a/hacks/binaryring.c
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Binary Ring
- * Copyright (c) 2006-2014 Emilio Del Tessandoro <emilio.deltessa@gmail.com>
- *
- * Directly ported code from complexification.net Binary Ring art
- * http://www.complexification.net/gallery/machines/binaryRing/appletm/BinaryRing_m.pde
- *
- * Binary Ring code:
- * j.tarbell June, 2004
- * Albuquerque, New Mexico
- * complexification.net
- *
- * Directly based the hacks of:
- *
- * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhack.h"
-#include "colors.h"
-#include "hsv.h"
-
-#define ANTIALIAS 1
-#define BLACK 0
-#define WHITE 1
-
-#define swap(a, b) do { __typeof__(a) tmp; tmp = a; a = b; b = tmp; } while(0)
-#define frand1() ((((int) random() ) << 1) * 4.65661287524579692411E-10)
-#define min(a,b) ((a)<(b)?(a):(b))
-#define max(a,b) ((a)>(b)?(a):(b))
-
-/* better if signed */
-typedef unsigned long pixel_t;
-
-
-typedef struct {
- float x, y;
- float xx, yy;
- float vx, vy;
- float color;
- int age; /* age from 0 to ageMax */
-} particle_t;
-
-
-struct state {
- int epoch;
- int growth_delay;
- int ring_radius;
- int max_age;
- float curliness;
- int particles_number;
- particle_t* particles;
-
-
- Display *display; /* variables for the X stuff */
- Window window;
- GC gc;
- XGCValues gcv;
- Visual* visual;
- int depth;
-
- int width;
- int height;
-
- Pixmap pix; /* for reshape */
- XImage* buf; /* buffer */
- pixel_t* buffer;
- pixel_t colors[2];
-
- Bool color;
-};
-
-
-
-static void point2rgb(int depth, pixel_t c, int *r, int *g, int *b)
-{
- switch(depth) {
- case 32:
- case 24:
-#ifdef HAVE_JWXYZ
- /* This program idiotically does not go through a color map, so
- we have to hardcode in knowledge of how jwxyz.a packs pixels!
- Fix it to go through st->colors[st->ncolors] instead!
- */
- *r = (c & 0x00ff0000) >> 16;
- *g = (c & 0x0000ffff) >> 8;
- *b = (c & 0x000000ff);
-#else
- *g = (c & 0xff00) >> 8;
- *r = (c & 0xff0000) >> 16;
- *b = c & 0xff;
-#endif
- break;
- case 16:
- *g = ((c >> 5) & 0x3f) << 2;
- *r = ((c >> 11) & 0x1f) << 3;
- *b = (c & 0x1f) << 3;
- break;
- case 15:
- *g = ((c >> 5) & 0x1f) << 3;
- *r = ((c >> 10) & 0x1f) << 3;
- *b = (c & 0x1f) << 3;
- break;
- }
-}
-
-static pixel_t rgb2point(int depth, int r, int g, int b)
-{
- pixel_t ret = 0;
-
- switch(depth) {
- case 32:
- case 24:
-#ifdef HAVE_JWXYZ
- /* This program idiotically does not go through a color map, so
- we have to hardcode in knowledge of how jwxyz.a packs pixels!
- Fix it to go through st->colors[st->ncolors] instead!
- */
- ret = 0xFF000000 | (r << 16) | (g << 8) | b;
-#else
- ret |= (r << 16) | (g << 8) | b;
-#endif
- break;
- case 16:
- ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3);
- break;
- case 15:
- ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3);
- break;
- }
-
- return ret;
-}
-
-void print_color ( struct state* st, pixel_t color );
-/* alpha blended point drawing -- this is Not Right and will likely fail on
- * non-intel platforms as it is now, needs fixing
- */
-
-static
-void draw_point ( struct state* st,
- int x, int y, pixel_t myc, float a ) {
-
- int or = 0, og = 0, ob = 0;
- int r = 0, g = 0, b = 0;
- int nr, ng, nb;
- register pixel_t c;
-
- /*or = st->buffer[ 3 * ( y * st->width + x ) + 0 ];
- og = st->buffer[ 3 * ( y * st->width + x ) + 1 ];
- ob = st->buffer[ 3 * ( y * st->width + x ) + 2 ];*/
-
- c = st->buffer[ y * st->width + x ];
- point2rgb( st->depth, c, &or, &og, &ob );
- point2rgb( st->depth, myc, &r, &g, &b );
-
- nr = or + (r - or) * a;
- ng = og + (g - og) * a;
- nb = ob + (b - ob) * a;
-
- /*st->buffer[ 3 * ( y * st->width + x ) + 0 ] = nr;
- st->buffer[ 3 * ( y * st->width + x ) + 1 ] = ng;
- st->buffer[ 3 * ( y * st->width + x ) + 2 ] = nb;*/
- c = rgb2point(st->depth, nr, ng, nb);
- st->buffer[ y * st->width + x ] = c;
-
- XPutPixel( st->buf, x, y, c );
-}
-
-
-
-
-void print_color ( struct state* st, pixel_t color ) {
- int r=0, g=0, b=0;
- point2rgb(st->depth, color, &r, &g, &b);
- printf( "%d %d %d\n", r, g, b);
-}
-
-
-
-#if ANTIALIAS
-#define plot_(X,Y,D) do{ \
- _dla_plot(st, (X), (Y), color, (D) * alpha); }while(0)
-
-static
-void _dla_plot(struct state* st, int x, int y, pixel_t col, float br)
-{
- if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) ) {
- if ( br > 1.0f ) br = 1.0f;
- draw_point( st, x, y, col, br );
- }
-}
-
-#define ipart_(X) ((int)(X))
-#define round_(X) ((int)(((float)(X))+0.5))
-#define fpart_(X) (((float)(X))-(float)ipart_(X))
-#define rfpart_(X) (1.0-fpart_(X))
-
-static
-void draw_line_antialias(
- struct state* st,
- int x1, int y1,
- int x2, int y2,
- pixel_t color, float alpha )
-{
- float dx = (float)x2 - (float)x1;
- float dy = (float)y2 - (float)y1;
- float gradient;
- float xend;
- float yend;
- float xgap;
- float ygap;
- int xpxl1;
- int ypxl1;
- float intery;
- float interx;
- int xpxl2;
- int ypxl2;
- int x;
- int y;
-
- /* hard clipping, because this routine has some problems with negative coordinates */
- /* TODO: fix the alpha for that boundary cases. Using fabs() could solve? */
- if ( ( x1 < 0 || x1 > st->width ) ||
- ( x2 < 0 || x2 > st->width ) ||
- ( y1 < 0 || y1 > st->height ) ||
- ( y2 < 0 || y2 > st->height ) )
- return;
-
- if ( fabs(dx) > fabs(dy) ) {
- if ( x2 < x1 ) {
- swap(x1, x2);
- swap(y1, y2);
- }
- gradient = dy / dx;
- xend = round_(x1);
- yend = y1 + gradient*(xend - x1);
- xgap = rfpart_(x1 + 0.5);
- xpxl1 = xend;
- ypxl1 = ipart_(yend);
- plot_(xpxl1, ypxl1, rfpart_(yend)*xgap);
- plot_(xpxl1, ypxl1+1, fpart_(yend)*xgap);
- intery = yend + gradient;
-
- xend = round_(x2);
- yend = y2 + gradient*(xend - x2);
- xgap = fpart_(x2+0.5);
- xpxl2 = xend;
- ypxl2 = ipart_(yend);
- plot_(xpxl2, ypxl2, rfpart_(yend) * xgap);
- plot_(xpxl2, ypxl2 + 1, fpart_(yend) * xgap);
-
- /*if ( rfpart_(yend) * xgap < 0 || fpart_(yend) * xgap < 0)
- printf("%f %f\n", rfpart_(yend) * xgap, fpart_(yend) * xgap);*/
- for(x=xpxl1+1; x <= (xpxl2-1); x++) {
- plot_(x, ipart_(intery), rfpart_(intery));
- plot_(x, ipart_(intery) + 1, fpart_(intery));
- /*if ( rfpart_(intery) < 0 || fpart_(intery) < 0)
- printf("%f %f\n", rfpart_(intery), fpart_(intery));*/
- intery += gradient;
- }
- } else {
- if ( y2 < y1 ) {
- swap(x1, x2);
- swap(y1, y2);
- }
- gradient = dx / dy;
- yend = round_(y1);
- xend = x1 + gradient*(yend - y1);
- ygap = rfpart_(y1 + 0.5);
- ypxl1 = yend;
- xpxl1 = ipart_(xend);
- plot_(xpxl1, ypxl1, rfpart_(xend)*ygap);
- plot_(xpxl1, ypxl1+1, fpart_(xend)*ygap);
- interx = xend + gradient;
-
- yend = round_(y2);
- xend = x2 + gradient*(yend - y2);
- ygap = fpart_(y2+0.5);
- ypxl2 = yend;
- xpxl2 = ipart_(xend);
- plot_(xpxl2, ypxl2, rfpart_(xend) * ygap);
- plot_(xpxl2, ypxl2 + 1, fpart_(xend) * ygap);
-
- for(y=ypxl1+1; y <= (ypxl2-1); y++) {
- plot_(ipart_(interx), y, rfpart_(interx));
- plot_(ipart_(interx) + 1, y, fpart_(interx));
- interx += gradient;
- }
- }
-}
-#undef plot_
-#undef ipart_
-#undef fpart_
-#undef round_
-#undef rfpart_
-
-#else
-
-static
-void draw_line ( struct state* st, int x0, int y0, int x1, int y1, int color, float a ) {
- register int steep;
- register int deltax;
- register int deltay;
- register int error;
- register int ystep;
- register int y;
- register int x;
-
-
- steep = abs ( y1 - y0 ) > abs ( x1 - x0 );
- if ( steep ) { swap(x0,y0); swap(x1,y1); }
- if ( x0 > x1 ) { swap(x0,x1); swap(y0,y1); }
- deltax = x1 - x0;
- deltay = abs(y1-y0);
- error = 0;
- y = y0;
- ystep = y0 < y1 ? 1 : -1;
- if ( a > 1.0f ) a = 1.0f;
-
- for ( x = x0; x < x1; x++ ) {
- if ( steep ) {
- if ( ( y >= 0 && y < st->width ) && ( x >= 0 && x < st->height ) )
- draw_point( st, y, x, color, a );
- } else {
- if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) )
- draw_point( st, x, y, color, a );
- }
- error += deltay;
- if ( ( error << 1 ) > deltax ) {
- y += ystep;
- error -= deltax;
- }
- }
-}
-#endif
-
-static void create_buffers ( struct state* st, Display* display, Screen* screen, Window window, GC gc ) {
-
- XWindowAttributes xgwa;
- XGetWindowAttributes( display, window, &xgwa );
-
- /* Initialize the pixmap */
- if ( st->buf != NULL ) XFreePixmap( display, st->pix );
-
- XSetForeground( display, gc, st->colors[BLACK] );
- st->pix = XCreatePixmap( display, window, st->width, st->height,
- xgwa.depth );
- XFillRectangle( display, st->pix, gc, 0, 0, st->width, st->height);
-
- /* Initialize the bitmap */
- if ( st->buf != NULL ) XDestroyImage ( st->buf );
- st->buf = XGetImage( display, st->pix, 0, 0, st->width, st->height, visual_depth(screen, st->visual), ZPixmap );
- st->buffer = (pixel_t*) calloc(sizeof(pixel_t), st->width * st->height);
- /*int i;
- for ( i = 0; i < st->width * st->height; ++i ) st->buffer[i] = st->colors[BLACK];*/
-}
-
-static void init_particle ( particle_t* p, float dx, float dy, float direction, int color, int max_age ) {
- float max_initial_velocity = 2.0f;
- p->x = -dx;
- p->y = -dy;
- p->xx = 0;
- p->yy = 0;
- p->vx = max_initial_velocity * cos(direction);
- p->vy = max_initial_velocity * sin(direction);
-
- p->age = random() % max_age;
-
- p->color = color;
-}
-
-static void clamp ( int* value, int l, int h ) {
- if ( *value < l ) *value = l;
- if ( *value > h ) *value = h;
-}
-
-static pixel_t next_color ( struct state* st, pixel_t current ) {
- int r=0, g=0, b=0;
-
- point2rgb(st->depth, current, &r, &g, &b);
- r += random() % 5 - 2;
- g += random() % 5 - 2;
- b += random() % 5 - 2;
- clamp(&r, 0, 255);
- clamp(&g, 0, 255);
- clamp(&b, 0, 255);
-
- return rgb2point( st->depth, r, g, b );
-}
-
-
-static void create_particles ( struct state* st ) {
- int i;
- float emitx, emity;
- float direction;
-
- for ( i = 0; i < st->particles_number; i++ ) {
- emitx = ( st->ring_radius * sinf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
- emity = ( st->ring_radius * cosf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
- direction = (M_PI * i) / st->particles_number;
-
- if ( st->epoch == WHITE && st->color )
- st->colors[WHITE] = next_color(st, st->colors[WHITE]);
-
- init_particle(st->particles + i, emitx, emity, direction, st->colors[WHITE], st->max_age);
- }
-}
-
-
-/* randomly move one particle and draw it */
-static void move ( particle_t* p, struct state * st ) {
- int w = st->width / 2;
- int h = st->height / 2;
- float max_dv = 1.0f;
-
- p->xx = p->x;
- p->yy = p->y;
- p->x += p->vx;
- p->y += p->vy;
- p->vx += frand1() * st->curliness * max_dv;
- p->vy += frand1() * st->curliness * max_dv;
-
-
-#if ANTIALIAS
- draw_line_antialias( st,
- w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
- draw_line_antialias( st,
- w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
-#else
- draw_line( st, w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
- draw_line( st, w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
-#endif
-
- p->age++;
- /* if this is too old, die and reborn */
- if ( p->age > st->max_age ) {
- float dir = frand1() * 2 * M_PI;
- p->x = st->ring_radius * sin(dir);
- p->y = st->ring_radius * cos(dir);
- p->xx = p->yy = p->vx = p->vy = 0;
- p->age = 0;
-
- if ( st->epoch == WHITE && st->color )
- st->colors[WHITE] = next_color(st, st->colors[WHITE] );
-
- p->color = st->colors[st->epoch];
- }
-}
-
-
-
-
-/* Initialize Everything */
-static void* binaryring_init ( Display* display, Window window ) {
- XWindowAttributes xgwa;
-
- struct state *st = ( struct state* ) calloc ( 1, sizeof( *st ) );
-
- XGetWindowAttributes( display, window, &xgwa );
-
- st->epoch = WHITE;
- st->display = display;
- st->window = window;
- st->particles_number = (get_integer_resource(st->display, "particles_number", "Integer"));
- st->growth_delay = (get_integer_resource(st->display, "growth_delay", "Integer"));
- st->ring_radius = (get_integer_resource(st->display, "ring_radius", "Integer"));
- st->max_age = (get_integer_resource(st->display, "max_age", "Integer"));
- st->color = get_boolean_resource(st->display, "color", "Boolean");
- st->height = xgwa.height;
- st->width = xgwa.width;
- st->visual = xgwa.visual;
- st->curliness = 0.5;
-
-
- st->depth = visual_depth(xgwa.screen, st->visual);
- st->colors[0] = rgb2point(st->depth, 0, 0, 0);
- st->colors[1] = rgb2point(st->depth, 255, 255, 255);
-
- /*describe_visual (stdout, xgwa.screen, xgwa.visual, False);*/
-
- st->particles = malloc (st->particles_number * sizeof( particle_t ) );
- create_particles ( st );
-
- st->gc = XCreateGC( st->display, st->window, 0, &st->gcv );
- create_buffers ( st, display, xgwa.screen, window, st->gc );
-
-
- return st;
-}
-
-
-static unsigned long binaryring_draw ( Display* display, Window win, void *closure ) {
- struct state *st = (struct state *) closure;
- int i;
-
- for ( i = 0; i < st->particles_number; i++ )
- move( &(st->particles[i]), st );
-
- /* draw the XImage in the Pixmap and the put the Pixmap on the screen */
- XPutImage( display, st->pix, st->gc, st->buf, 0, 0, 0, 0, st->width, st->height);
- XCopyArea( display, st->pix, win, st->gc, 0, 0, st->width, st->height, 0, 0 );
-
- /* randomly switch ageColor periods */
- if ( random() % 10000 > 9950 )
- st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
-
- return st->growth_delay;
-}
-
-
-
-static void binaryring_reshape ( Display* display, Window win, void *closure, unsigned int w, unsigned int h ) {
- struct state *st = (struct state *) closure;
-
- XWindowAttributes tmp;
- XGetWindowAttributes(display, win, &tmp);
-
- if ( tmp.height != st->height || tmp.width != st->width ) {
- st->height = tmp.height;
- st->width = tmp.width;
-
-
- st->epoch = WHITE;
- create_particles ( st );
-
- create_buffers ( st, display, tmp.screen, win, st->gc );
- }
-}
-
-
-/* if someone press a key switch the color */
-static Bool binaryring_event ( Display* display, Window win, void *closure, XEvent* event ) {
- struct state *st = (struct state *) closure;
-
- if ( (*event).xany.type == KeyPress ) {
- st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
- }
-
- return False;
-}
-
-
-/* delete everything */
-static void binaryring_free ( Display* display, Window win, void *closure ) {
- struct state *st = (struct state *) closure;
- XWindowAttributes tmp;
- XGetWindowAttributes(display, win, &tmp);
-
- if (st->gc) XFreeGC (display, st->gc);
- if (st->pix) XFreePixmap (display, st->pix);
- if (st->buf) XDestroyImage (st->buf);
- free (st->buffer);
- free (st->particles);
- free (st);
-}
-
-
-/* Default resources of the program */
-static const char* binaryring_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*growth_delay: 10000",
- "*particles_number: 5000",
- "*ring_radius: 40",
- "*max_age: 400",
- "*color: True",
- "*ignoreRotation: True",
- 0
-};
-
-static XrmOptionDescRec binaryring_options [] = {
- { "-particles-number", ".particles_number", XrmoptionSepArg, 0 },
- { "-growth-delay", ".growth_delay", XrmoptionSepArg, 0 },
- { "-ring-radius", ".ring_radius", XrmoptionSepArg, 0 },
- { "-max-age", ".max_age", XrmoptionSepArg, 0 },
- { "-color", ".color", XrmoptionNoArg, "True" },
- { "-no-color", ".color", XrmoptionNoArg, "False" },
- { 0, 0, 0, 0}
-};
-
-XSCREENSAVER_MODULE("BinaryRing", binaryring)
diff --git a/hacks/binaryring.man b/hacks/binaryring.man
deleted file mode 100644
index 9dce286..0000000
--- a/hacks/binaryring.man
+++ /dev/null
@@ -1,88 +0,0 @@
-.TH "Binary Ring" 1 "02-Sep-14" "X Version 11"
-.SH NAME
-binaryring \- A system of path tracing particles evolves continuously from an initial creation.
-.SH SYNOPSIS
-.B binaryring
-[\-fps]
-[\-install]
-[\-noinstall]
-[\-mono]
-[\-root]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-window\-id \fIwindow\-id\fP]
-[\-color]
-[\-no\-color]
-[\-growth\-delay \fIdelayms\fP]
-[\-particle\-number \fIparticles\fP]
-[\-ring\-radius \fIradius\fP]
-.SH DESCRIPTION
-A system of path tracing particles evolves continuously from an initial circular creation.
-Ages of darkness play arbitrarily with ages of light.
-
-Ported (with some extensions) from the code by J. Tarbell at http://complexification.net
-.SH OPTIONS
-.I binaryring
-accepts the following options:
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-noinstall
-Don't install a private colormap for the window.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual
-class or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-window\-id \fIwindow\-id\fP
-Specify which window id to use.
-.TP 8
-.B \-color (Default)
-Particles have random generated colors that gradually change over time.
-.TP 8
-.B \-no\-color
-Use the original black and white visualization.
-.TP 8
-.B \-growth\-delay \fIdelayms\fP (Default: \fI10000\fP)
-Delay in ms between growth cycles. More delay, slower (but less CPU intensive).
-.TP 8
-.B \-particles\-number \fIparticles\fP (Default: \fI5000\fP)
-The number of particles in the system. With more particles the fps
-can also be affected.
-.TP 8
-.B \-ring\-radius \fIradius\fP (Default: \fI40\fP)
-The radius of the ring where the particles are born, in pixels.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global
-resources stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by J. Tarbell
-(complex@complexification.net, http://www.complexification.net).
-
-Ported to XScreensaver by Emilio Del Tessandoro (emilio.deltessa@gmail.com)
-.SH AUTHOR
-J. Tarbell <complex@complexification.net>, Jun-03
-
-Emilio Del Tessandoro <emilio.deltessa@gmail.com>, Aug-14
diff --git a/hacks/blaster.c b/hacks/blaster.c
deleted file mode 100644
index 5ab3741..0000000
--- a/hacks/blaster.c
+++ /dev/null
@@ -1,1193 +0,0 @@
-/* -*- mode: C; tab-width: 2 -*-
- * blaster, Copyright (c) 1999 Jonathan H. Lin <jonlin@tesuji.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Robots that move randomly and shoot lasers at each other. If the
- * mothership is active, it will fly back and forth horizontally,
- * firing 8 lasers in the 8 cardinal directions. The explosions are
- * a 20 frame animation. Robots regenerate after the explosion is finished
- * and all of its lasers have left the screen.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include "screenhack.h"
-
-struct laser_state {
- int active;
- int start_x,start_y;
- int end_x, end_y;
-};
-
-struct robot_state {
- int alive;
- int death;
-
- int move_style;
- int target;
-
- int old_x, old_y;
- int new_x, new_y;
-
- int radius;
- GC robot_color;
- GC laser_color;
- struct laser_state *lasers;
-};
-
-struct mother_ship_state {
- int active;
- int death;
- int old_x,new_x;
- int y;
- GC ship_color;
- GC laser_color;
- struct laser_state *lasers;
-};
-
-
-
-
-struct state {
- Display *dpy;
- Window window;
-
- GC r_color0, r_color1, r_color2, r_color3, r_color4, r_color5, l_color0, l_color1;
- GC s_color;
- GC black;
-
- int delay;
-
- int NUM_ROBOTS;
- int NUM_LASERS;
-
- int MOTHER_SHIP;
- int MOTHER_SHIP_WIDTH;
- int MOTHER_SHIP_HEIGHT;
- int MOTHER_SHIP_LASER;
- int MOTHER_SHIP_PERIOD;
- int MOTHER_SHIP_HITS;
-
- int LINE_MOVE_STYLE;
- int RANDOM_MOVE_STYLE;
- int NUM_MOVE_STYLES;
-
- int EXPLODE_SIZE_1;
- int EXPLODE_SIZE_2;
- int EXPLODE_SIZE_3;
- GC EXPLODE_COLOR_1;
- GC EXPLODE_COLOR_2;
-
- XArc *stars;
- int NUM_STARS;
- int MOVE_STARS;
- int MOVE_STARS_X;
- int MOVE_STARS_Y;
- int MOVE_STARS_RANDOM;
-
- struct mother_ship_state *mother;
-
- struct robot_state *robots;
-
- XWindowAttributes xgwa;
-
- int initted;
-
- int draw_x;
- int draw_y;
- int draw_z;
-};
-
-
-/* creates a new robot. It starts out on one of the edges somewhere and
- has no initial velocity. A target is randomly picked. */
-static void make_new_robot(struct state *st, int index)
-{
- int laser_check = 0;
- int x=0;
-
- for(x=0;x<st->NUM_LASERS;x++) {
- if(st->robots[index].lasers[x].active) {
- x=st->NUM_LASERS;
- laser_check = 1;
- }
- }
- if(laser_check==0) {
- st->robots[index].alive=1;
-
- st->robots[index].radius = 7+(random()%7);
-
- st->robots[index].move_style = random()%st->NUM_MOVE_STYLES;
- if(random()%2==0) {
- st->robots[index].new_x=random()%(st->xgwa.width-st->robots[index].radius);
- st->robots[index].old_x=st->robots[index].new_x;
- if(random()%2==0) {
- st->robots[index].new_y=0;
- st->robots[index].old_y=0;
- }
- else {
- st->robots[index].new_y=st->xgwa.height-st->robots[index].radius;
- st->robots[index].old_y = st->robots[index].new_y;
- }
- }
- else {
- st->robots[index].new_y=random()%(st->xgwa.height-st->robots[index].radius);
- st->robots[index].old_y = st->robots[index].new_y;
- if(random()%2) {
- st->robots[index].new_x=0;
- st->robots[index].old_x=0;
- }
- else {
- st->robots[index].new_x=st->xgwa.width-st->robots[index].radius;
- st->robots[index].old_x=st->robots[index].new_x;
- }
- }
-
- x=random()%6;
- if(x==0) {
- st->robots[index].robot_color = st->r_color0;
- }
- else if(x==1) {
- st->robots[index].robot_color = st->r_color1;
- }
- else if(x==2) {
- st->robots[index].robot_color = st->r_color2;
- }
- else if(x==3) {
- st->robots[index].robot_color = st->r_color3;
- }
- else if(x==4) {
- st->robots[index].robot_color = st->r_color4;
- }
- else if(x==5) {
- st->robots[index].robot_color = st->r_color5;
- }
-
- if(random()%2==0) {
- st->robots[index].laser_color = st->l_color0;
- }
- else {
- st->robots[index].laser_color = st->l_color1;
- }
-
- if(st->NUM_ROBOTS>1) {
- st->robots[index].target = random()%st->NUM_ROBOTS;
- while(st->robots[index].target==index) {
- st->robots[index].target = random()%st->NUM_ROBOTS;
- }
- }
- }
-}
-
-/* moves each robot, randomly changing its direction and velocity.
- At random a laser is shot toward that robot's target. Also at random
- the target can change. */
-static void move_robots(struct state *st)
-{
- int x=0;
- int y=0;
- int dx=0;
- int dy=0;
- int target_x = 0;
- int target_y = 0;
- double slope = 0;
-
- for(x=0;x<st->NUM_ROBOTS;x++) {
- if(st->robots[x].alive) {
- if((st->robots[x].new_x == st->robots[x].old_x) && (st->robots[x].new_y == st->robots[x].old_y)) {
- if(st->robots[x].new_x==0) {
- st->robots[x].old_x = -((random()%3)+1);
- }
- else {
- st->robots[x].old_x = st->robots[x].old_x + (random()%3)+1;
- }
- if(st->robots[x].new_y==0) {
- st->robots[x].old_y = -((random()%3)+1);
- }
- else {
- st->robots[x].old_y = st->robots[x].old_y + (random()%3)+1;
- }
- }
- if(st->robots[x].move_style==st->LINE_MOVE_STYLE) {
- dx = st->robots[x].new_x - st->robots[x].old_x;
- dy = st->robots[x].new_y - st->robots[x].old_y;
- if(dx > 3) {
- dx = 3;
- }
- else if(dx < -3) {
- dx = -3;
- }
- if(dy > 3) {
- dy = 3;
- }
- else if(dy < -3) {
- dy = -3;
- }
- st->robots[x].old_x = st->robots[x].new_x;
- st->robots[x].old_y = st->robots[x].new_y;
-
- st->robots[x].new_x = st->robots[x].new_x + dx;
- st->robots[x].new_y = st->robots[x].new_y + dy;
- }
- else if(st->robots[x].move_style==st->RANDOM_MOVE_STYLE) {
- dx = st->robots[x].new_x - st->robots[x].old_x;
- dy = st->robots[x].new_y - st->robots[x].old_y;
- y=random()%3;
- if(y==0) {
- dx = dx - ((random()%7)+1);
- }
- else if(y==1){
- dx = dx + ((random()%7)+1);
- }
- else {
- dx = (-1)*dx;
- }
- if(dx > 3) {
- dx = 3;
- }
- else if(dx < -3) {
- dx = -3;
- }
-
- y = random()%3;
- if(y==0) {
- dy = dy - ((random()%7)+1);
- }
- else if(y==1){
- dy = dy + ((random()%7)+1);
- }
- else {
- dx = (-1)*dx;
- }
- if(dy > 3) {
- dy = 3;
- }
- else if(dy < -3) {
- dy = -3;
- }
- st->robots[x].old_x = st->robots[x].new_x;
- st->robots[x].old_y = st->robots[x].new_y;
-
- st->robots[x].new_x = st->robots[x].new_x + dx;
- st->robots[x].new_y = st->robots[x].new_y + dy;
- }
-
- /* bounds corrections */
- if(st->robots[x].new_x >= st->xgwa.width-st->robots[x].radius) {
- st->robots[x].new_x = st->xgwa.width - st->robots[x].radius;
- }
- else if(st->robots[x].new_x < 0) {
- st->robots[x].new_x = 0;
- }
- if(st->robots[x].new_y >= st->xgwa.height-st->robots[x].radius) {
- st->robots[x].new_y = st->xgwa.height - st->robots[x].radius;
- }
- else if(st->robots[x].new_y < 0) {
- st->robots[x].new_y = 0;
- }
-
- if(random()%10==0) {
- st->robots[x].move_style = 1;
- }
- else {
- st->robots[x].move_style = 0;
- }
-
- if(st->NUM_ROBOTS>1) {
- if(random()%2==0) {
- if(random()%200==0) {
- st->robots[x].target = random()%st->NUM_ROBOTS;
- while(st->robots[x].target==x) {
- st->robots[x].target = random()%st->NUM_ROBOTS;
- }
- for(y=0;y<st->NUM_LASERS;y++) {
- if(st->robots[x].lasers[y].active == 0) {
- st->robots[x].lasers[y].active = 1;
- if(random()%2==0) {
- if(random()%2==0) {
- st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius;
- st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
- }
- else {
- st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius;
- st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
- }
- }
- else {
- if(random()%2==0) {
- st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius;
- st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
- }
- else {
- st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius;
- st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
- }
- }
- y = st->NUM_LASERS;
- }
- }
- }
- else {
- for(y=0;y<st->NUM_LASERS;y++) {
- if(st->robots[x].lasers[y].active==0) {
- target_x = st->robots[st->robots[x].target].new_x;
- target_y = st->robots[st->robots[x].target].new_y;
- if((target_x-st->robots[x].new_x)!=0) {
- slope = ((double)target_y-st->robots[x].new_y)/((double)(target_x-st->robots[x].new_x));
-
- if((slope<1) && (slope>-1)) {
- if(target_x>st->robots[x].new_x) {
- st->robots[x].lasers[y].start_x = st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x + 7;
- }
- else {
- st->robots[x].lasers[y].start_x = -st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x - 7;
- }
- st->robots[x].lasers[y].start_y = (int)(st->robots[x].lasers[y].start_x * slope);
- st->robots[x].lasers[y].end_y = (int)(st->robots[x].lasers[y].end_x * slope);
- }
- else {
- slope = (target_x-st->robots[x].new_x)/(target_y-st->robots[x].new_y);
- if(target_y>st->robots[x].new_y) {
- st->robots[x].lasers[y].start_y = st->robots[x].radius;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y + 7;
- }
- else {
- st->robots[x].lasers[y].start_y = -st->robots[x].radius;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y - 7;
- }
- st->robots[x].lasers[y].start_x = (int)(st->robots[x].lasers[y].start_y * slope);;
- st->robots[x].lasers[y].end_x = (int)(st->robots[x].lasers[y].end_y * slope);
- }
- st->robots[x].lasers[y].start_x = st->robots[x].lasers[y].start_x + st->robots[x].new_x;
- st->robots[x].lasers[y].start_y = st->robots[x].lasers[y].start_y + st->robots[x].new_y;
- st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].end_x + st->robots[x].new_x;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].end_y + st->robots[x].new_y;
- }
- else {
- if(target_y > st->robots[x].new_y) {
- st->robots[x].lasers[y].start_x = st->robots[x].new_x;
- st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].new_x;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
- }
- else {
- st->robots[x].lasers[y].start_x = st->robots[x].new_x;
- st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
- st->robots[x].lasers[y].end_x = st->robots[x].new_x;
- st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
- }
- }
-
- if((((st->robots[x].lasers[y].start_x - st->robots[x].lasers[y].end_x) > 7) ||
- ((st->robots[x].lasers[y].end_x - st->robots[x].lasers[y].start_x) > 7)) &&
- (((st->robots[x].lasers[y].start_y - st->robots[x].lasers[y].end_y) > 7) ||
- ((st->robots[x].lasers[y].end_y - st->robots[x].lasers[y].start_y) > 7))) {
- }
- else {
- st->robots[x].lasers[y].active = 1;
- y = st->NUM_LASERS;
- }
- }
- }
- }
- }
- }
- }
- else {
- if(st->robots[x].death==0) {
- make_new_robot(st,x);
- }
- }
- }
-
-}
-
-/* This moves a single laser one frame. collisions with other robots or
- the mothership is checked. */
-static void move_laser(struct state *st, int rindex, int index)
-{
- int x=0;
- int y=0;
- int z=0;
- int dx=0;
- int dy=0;
- struct laser_state *laser;
- if(rindex>=0) {
- laser = st->robots[rindex].lasers;
- }
- else {
- laser = st->mother->lasers;
- }
- if(laser[index].active) {
- /* collision with other robots are checked here */
- for(x=0;x<st->NUM_ROBOTS;x++) {
- if(x!=rindex) {
- if(st->robots[x].alive) {
- y = laser[index].start_x-st->robots[x].new_x;
- if(y<0) {
- y = st->robots[x].new_x-laser[index].start_x;
- }
- z = laser[index].start_y-st->robots[x].new_y;
- if(z<0) {
- z = st->robots[x].new_y-laser[index].start_y;
- }
- if((z<st->robots[x].radius-1)&&(y<st->robots[x].radius-1)) {
- st->robots[x].alive = 0;
- st->robots[x].death = 20;
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- laser[index].active = 0;
- x = st->NUM_ROBOTS;
- }
- else {
- y = laser[index].end_x-st->robots[x].new_x;
- if(y<0) {
- y = st->robots[x].new_x-laser[index].end_x;
- }
- z = laser[index].end_y-st->robots[x].new_y;
- if(z<0) {
- z = st->robots[x].new_y-laser[index].end_y;
- }
- if((z<st->robots[x].radius-1)&&(y<st->robots[x].radius-1)) {
- st->robots[x].alive = 0;
- st->robots[x].death = 20;
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- laser[index].active = 0;
- x = st->NUM_ROBOTS;
- }
- }
- }
- }
- }
- if((st->MOTHER_SHIP)&&(rindex!=-1)) {
- if(laser[index].active) {
- if(st->mother->active) {
- y = laser[index].start_x-st->mother->new_x;
- if(y<0) {
- y = st->mother->new_x-laser[index].start_x;
- }
- z = laser[index].start_y-st->mother->y;
- if(z<0) {
- z = st->mother->y-laser[index].start_y;
- }
- if((z<st->MOTHER_SHIP_HEIGHT-1)&&(y<st->MOTHER_SHIP_WIDTH-1)) {
- laser[index].active = 0;
- st->mother->active--;
- }
- else {
- y = laser[index].end_x-st->mother->new_x;
- if(y<0) {
- y = st->mother->new_x-laser[index].end_x;
- }
- z = laser[index].end_y-st->mother->y;
- if(z<0) {
- z = st->mother->y-laser[index].end_y;
- }
- if((z<st->MOTHER_SHIP_HEIGHT-1)&&(y<st->MOTHER_SHIP_WIDTH-1)) {
- laser[index].active = 0;
- st->mother->active--;
- }
- }
-
- if(st->mother->active==0) {
- st->mother->death=20;
- }
- }
- }
- }
-
- if(laser[index].active) {
- dx = laser[index].start_x - laser[index].end_x;
- dy = laser[index].start_y - laser[index].end_y;
-
- laser[index].start_x = laser[index].end_x;
- laser[index].start_y = laser[index].end_y;
- laser[index].end_x = laser[index].end_x-dx;
- laser[index].end_y = laser[index].end_y-dy;
-
- if((laser[index].end_x < 0) || (laser[index].end_x >= st->xgwa.width) ||
- (laser[index].end_y < 0) || (laser[index].end_y >= st->xgwa.height)) {
- laser[index].active = 0;
- }
- }
- }
-}
-
-/* All the robots are drawn, including the mother ship and the explosions.
- After all the robots have been drawn, their laser banks are check and
- the active lasers are drawn. */
-static void draw_robots(struct state *st)
-{
- int x=0;
- int y=0;
-
- for(x=0;x<st->NUM_ROBOTS;x++) {
- if(st->robots[x].alive) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- XFillArc(st->dpy, st->window, st->robots[x].robot_color, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- }
- else {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
- if(st->robots[x].death) {
- if(st->robots[x].death==20) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==18) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==17) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==15) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==14) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==13) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==12) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==11) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==10) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==9) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==8) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==7) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->robots[x].death==6) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- }
- else if(st->robots[x].death==4) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- }
- else if(st->robots[x].death==3) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- }
- else if(st->robots[x].death==2) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(1.7*st->robots[x].radius/2), st->robots[x].new_y+(1.7*st->robots[x].radius/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
- }
- else if(st->robots[x].death==1) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(1.7*st->robots[x].radius/2), st->robots[x].new_y+(1.7*st->robots[x].radius/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
- }
- st->robots[x].death--;
- }
- }
- }
-
- for(x=0;x<st->NUM_ROBOTS;x++) {
- for(y=0;y<st->NUM_LASERS;y++) {
- if(st->robots[x].lasers[y].active) {
- if (st->black) XDrawLine(st->dpy, st->window, st->black, st->robots[x].lasers[y].start_x,
- st->robots[x].lasers[y].start_y,
- st->robots[x].lasers[y].end_x,
- st->robots[x].lasers[y].end_y);
- move_laser(st, x, y);
- if(st->robots[x].lasers[y].active) {
- XDrawLine(st->dpy, st->window, st->robots[x].laser_color, st->robots[x].lasers[y].start_x,
- st->robots[x].lasers[y].start_y,
- st->robots[x].lasers[y].end_x,
- st->robots[x].lasers[y].end_y);
- }
- else {
- if (st->black) XDrawLine(st->dpy, st->window, st->black, st->robots[x].lasers[y].start_x,
- st->robots[x].lasers[y].start_y,
- st->robots[x].lasers[y].end_x,
- st->robots[x].lasers[y].end_y);
- }
- }
- }
- }
-
- if(st->MOTHER_SHIP) {
- if(st->mother->active) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- XFillArc(st->dpy, st->window, st->mother->ship_color, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- }
- else {
- if(st->mother->death) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- if(st->mother->death==20) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==18) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==17) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==15) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==14) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==13) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==12) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==11) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==10) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==9) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==8) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==7) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
- }
- else if(st->mother->death==6) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- }
- else if(st->mother->death==4) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- }
- else if(st->mother->death==3) {
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- }
- else if(st->mother->death==2) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
- XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+(1.7*st->MOTHER_SHIP_WIDTH/2), st->mother->y+(1.7*st->MOTHER_SHIP_HEIGHT/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
- }
- else if(st->mother->death==1) {
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+(1.7*st->MOTHER_SHIP_WIDTH/2), st->mother->y+(1.7*st->MOTHER_SHIP_HEIGHT/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
- }
- st->mother->death--;
- }
- }
- for(y=0;y<8;y++) {
- if(st->mother->lasers[y].active) {
- if (st->black) XDrawLine(st->dpy, st->window, st->black, st->mother->lasers[y].start_x,
- st->mother->lasers[y].start_y,
- st->mother->lasers[y].end_x,
- st->mother->lasers[y].end_y);
- move_laser(st, -1,y);
- if(st->mother->lasers[y].active) {
- XDrawLine(st->dpy, st->window, st->mother->laser_color, st->mother->lasers[y].start_x,
- st->mother->lasers[y].start_y,
- st->mother->lasers[y].end_x,
- st->mother->lasers[y].end_y);
- }
- else {
- if (st->black) XDrawLine(st->dpy, st->window, st->black, st->mother->lasers[y].start_x,
- st->mother->lasers[y].start_y,
- st->mother->lasers[y].end_x,
- st->mother->lasers[y].end_y);
- }
- }
- }
- }
-}
-
-static void
-init_stars(struct state *st)
-{
- if(st->NUM_STARS) {
- if (! st->stars)
- st->stars = (XArc *) malloc (st->NUM_STARS * sizeof(XArc));
- for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
- st->stars[st->draw_x].x = random()%st->xgwa.width;
- st->stars[st->draw_x].y = random()%st->xgwa.height;
- st->stars[st->draw_x].width = random()%4 + 1;
- st->stars[st->draw_x].height = st->stars[st->draw_x].width;
- st->stars[st->draw_x].angle1 = 0;
- st->stars[st->draw_x].angle2 = 360 * 64;
- }
- }
-}
-
-
-static unsigned long
-blaster_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- XClearWindow (dpy, window);
-#endif
-
- if (!st->initted)
- {
- st->initted = 1;
-
- st->robots = (struct robot_state *) malloc(st->NUM_ROBOTS * sizeof (struct robot_state));
- for(st->draw_x=0;st->draw_x<st->NUM_ROBOTS;st->draw_x++) {
- st->robots[st->draw_x].alive = 0;
- st->robots[st->draw_x].death = 0;
- st->robots[st->draw_x].lasers = (struct laser_state *) malloc (st->NUM_LASERS * sizeof(struct laser_state));
- for(st->draw_y=0;st->draw_y<st->NUM_LASERS;st->draw_y++) {
- st->robots[st->draw_x].lasers[st->draw_y].active = 0;
- }
- }
-
- init_stars(st);
- }
-
- if(st->NUM_STARS) {
- if(st->MOVE_STARS) {
- if (st->black) XFillArcs(st->dpy,st->window,st->black,st->stars,st->NUM_STARS);
- if(st->MOVE_STARS_RANDOM) {
- st->draw_y = st->MOVE_STARS_X;
- st->draw_z = st->MOVE_STARS_Y;
- if(random()%167==0) {
- st->draw_y = (-1)*st->draw_y;
- }
- if(random()%173==0) {
- st->draw_z = (-1)*st->draw_z;
- }
- if(random()%50==0) {
- if(random()%2) {
- st->draw_y++;
- if(st->draw_y>st->MOVE_STARS_RANDOM) {
- st->draw_y = st->MOVE_STARS_RANDOM;
- }
- }
- else {
- st->draw_y--;
- if(st->draw_y < -(st->MOVE_STARS_RANDOM)) {
- st->draw_y = -(st->MOVE_STARS_RANDOM);
- }
- }
- }
- if(random()%50==0) {
- if(random()%2) {
- st->draw_z++;
- if(st->draw_z>st->MOVE_STARS_RANDOM) {
- st->draw_z = st->MOVE_STARS_RANDOM;
- }
- }
- else {
- st->draw_z--;
- if(st->draw_z < -st->MOVE_STARS_RANDOM) {
- st->draw_z = -st->MOVE_STARS_RANDOM;
- }
- }
- }
- st->MOVE_STARS_X = st->draw_y;
- st->MOVE_STARS_Y = st->draw_z;
- for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
- st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->draw_y;
- st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->draw_z;
- if(st->stars[st->draw_x].x<0) {
- st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->xgwa.width;
- }
- else if(st->stars[st->draw_x].x>st->xgwa.width) {
- st->stars[st->draw_x].x = st->stars[st->draw_x].x - st->xgwa.width;
- }
- if(st->stars[st->draw_x].y<0) {
- st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->xgwa.height;
- }
- else if(st->stars[st->draw_x].y>st->xgwa.height) {
- st->stars[st->draw_x].y = st->stars[st->draw_x].y - st->xgwa.height;
- }
- }
- }
- else {
- for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
- st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->MOVE_STARS_X;
- st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->MOVE_STARS_Y;
- if(st->stars[st->draw_x].x<0) {
- st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->xgwa.width;
- }
- else if(st->stars[st->draw_x].x>st->xgwa.width) {
- st->stars[st->draw_x].x = st->stars[st->draw_x].x - st->xgwa.width;
- }
- if(st->stars[st->draw_x].y<0) {
- st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->xgwa.height;
- }
- else if(st->stars[st->draw_x].y>st->xgwa.height) {
- st->stars[st->draw_x].y = st->stars[st->draw_x].y - st->xgwa.height;
- }
- }
- }
- XFillArcs(st->dpy,st->window,st->s_color,st->stars,st->NUM_STARS);
- }
- else {
- XFillArcs(st->dpy,st->window,st->s_color,st->stars,st->NUM_STARS);
- }
- }
-
- if(st->MOTHER_SHIP) {
- if(random()%st->MOTHER_SHIP_PERIOD==0) {
- if((st->mother->active==0)&&(st->mother->death==0)) {
- st->mother->active = st->MOTHER_SHIP_HITS;
- st->mother->y = random()%(st->xgwa.height-7);
- if(random()%2==0) {
- st->mother->old_x=0;
- st->mother->new_x=0;
- }
- else {
- st->mother->old_x=st->xgwa.width-25;
- st->mother->new_x=st->xgwa.width-25;
- }
- }
- }
- }
- move_robots(st);
- if(st->MOTHER_SHIP) {
- if(st->mother->active) {
- if(st->mother->old_x==st->mother->new_x) {
- if(st->mother->old_x==0) {
- st->mother->new_x=3;
- }
- else {
- st->mother->new_x=st->mother->new_x-3;
- }
- }
- else {
- if(st->mother->old_x>st->mother->new_x) {
- st->mother->old_x = st->mother->new_x;
- st->mother->new_x = st->mother->new_x-3;
- if(st->mother->new_x<0) {
- st->mother->active=0;
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- }
- }
- else {
- st->mother->old_x = st->mother->new_x;
- st->mother->new_x = st->mother->new_x+3;
- if(st->mother->new_x>st->xgwa.width) {
- st->mother->active=0;
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
- }
- }
- }
- st->draw_y=0;
- for(st->draw_x=0;st->draw_x<8;st->draw_x++) {
- if(st->mother->lasers[st->draw_x].active) {
- st->draw_y=1;
- st->draw_x=8;
- }
- }
- if(st->draw_y==0) {
- for(st->draw_x=0;st->draw_x<8;st->draw_x++) {
- st->mother->lasers[st->draw_x].active = 1;
- st->mother->lasers[st->draw_x].start_x=st->mother->new_x+(st->MOTHER_SHIP_WIDTH/2);
- st->mother->lasers[st->draw_x].start_y=st->mother->y+(st->MOTHER_SHIP_HEIGHT/2);
- }
- st->draw_y = (int)(st->MOTHER_SHIP_LASER/1.5);
- st->mother->lasers[0].end_x=st->mother->lasers[0].start_x-st->MOTHER_SHIP_LASER;
- st->mother->lasers[0].end_y=st->mother->lasers[0].start_y;
- st->mother->lasers[1].end_x=st->mother->lasers[1].start_x-st->draw_y;
- st->mother->lasers[1].end_y=st->mother->lasers[1].start_y-st->draw_y;
- st->mother->lasers[2].end_x=st->mother->lasers[2].start_x;
- st->mother->lasers[2].end_y=st->mother->lasers[2].start_y-st->MOTHER_SHIP_LASER;
- st->mother->lasers[3].end_x=st->mother->lasers[3].start_x+st->draw_y;
- st->mother->lasers[3].end_y=st->mother->lasers[3].start_y-st->draw_y;
- st->mother->lasers[4].end_x=st->mother->lasers[4].start_x+st->MOTHER_SHIP_LASER;
- st->mother->lasers[4].end_y=st->mother->lasers[4].start_y;
- st->mother->lasers[5].end_x=st->mother->lasers[5].start_x+st->draw_y;
- st->mother->lasers[5].end_y=st->mother->lasers[5].start_y+st->draw_y;
- st->mother->lasers[6].end_x=st->mother->lasers[6].start_x;
- st->mother->lasers[6].end_y=st->mother->lasers[6].start_y+st->MOTHER_SHIP_LASER;
- st->mother->lasers[7].end_x=st->mother->lasers[7].start_x-st->draw_y;
- st->mother->lasers[7].end_y=st->mother->lasers[7].start_y+st->draw_y;
- }
- }
- }
- draw_robots(st);
-
- return st->delay;
-}
-
-static void *
-blaster_init (Display *d, Window w)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- Colormap cmap;
- unsigned long bg;
-
- st->dpy = d;
- st->window = w;
- XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
- cmap = st->xgwa.colormap;
-
- st->NUM_ROBOTS=5;
- st->NUM_LASERS=3;
-
- st->MOTHER_SHIP_WIDTH=25;
- st->MOTHER_SHIP_HEIGHT=7;
- st->MOTHER_SHIP_LASER=15;
- st->MOTHER_SHIP_PERIOD=150;
- st->MOTHER_SHIP_HITS=10;
-
- st->RANDOM_MOVE_STYLE=1;
- st->NUM_MOVE_STYLES=2;
-
- st->EXPLODE_SIZE_1=27;
- st->EXPLODE_SIZE_2=19;
- st->EXPLODE_SIZE_3=7;
-
-
- st->delay = get_integer_resource(st->dpy, "delay", "Integer");
- if(st->delay==0) {
- st->delay=10000;
- }
- st->NUM_ROBOTS = get_integer_resource(st->dpy, "num_robots","Integer");
- if(st->NUM_ROBOTS==0) {
- st->NUM_ROBOTS=5;
- }
- st->NUM_LASERS = get_integer_resource(st->dpy, "num_lasers","Integer");
- st->EXPLODE_SIZE_1 = get_integer_resource(st->dpy, "explode_size_1","Integer");
- st->EXPLODE_SIZE_2 = get_integer_resource(st->dpy, "explode_size_2","Integer");
- st->EXPLODE_SIZE_3 = get_integer_resource(st->dpy, "explode_size_3","Integer");
-
- st->NUM_STARS = get_integer_resource(st->dpy, "num_stars","Integer");
- if(get_boolean_resource(st->dpy, "move_stars","Boolean")) {
- st->MOVE_STARS = 1;
- st->MOVE_STARS_X = get_integer_resource(st->dpy, "move_stars_x","Integer");
- st->MOVE_STARS_Y = get_integer_resource(st->dpy, "move_stars_y","Integer");
- st->MOVE_STARS_RANDOM = get_integer_resource(st->dpy, "move_stars_random","Integer");
- }
- else {
- st->MOVE_STARS = 0;
- }
-
-
- bg = get_pixel_resource(st->dpy, cmap, "background","Background");
- gcv.function = GXcopy;
-
-#define make_gc(color,name) \
- gcv.foreground = get_pixel_resource (st->dpy, cmap, (name), "Foreground"); \
- color = XCreateGC (st->dpy, st->window, GCForeground|GCFunction, &gcv)
-
- if(mono_p) {
- gcv.foreground = bg;
- st->black = XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv);
- gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
- st->r_color0 = st->r_color1 = st->r_color2 = st->r_color3 = st->r_color4 = st->r_color5 = st->l_color0 = st->l_color1 = st->s_color=
- XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv);
- if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) {
- st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer");
- st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer");
- st->MOTHER_SHIP_LASER=get_integer_resource(st->dpy, "mother_ship_laser","Integer");
- st->MOTHER_SHIP_PERIOD=get_integer_resource(st->dpy, "mother_ship_period","Integer");
- st->MOTHER_SHIP_HITS=get_integer_resource(st->dpy, "mother_ship_hits","Integer");
- st->MOTHER_SHIP=1;
- st->mother = (struct mother_ship_state *) malloc(sizeof(struct mother_ship_state));
- st->mother->lasers = (struct laser_state *) malloc(8*sizeof(struct laser_state));
- st->mother->active = 0;
- st->mother->death = 0;
- st->mother->ship_color = st->r_color0;
- st->mother->laser_color = st->r_color0;
- }
- }
- else {
- if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) {
- st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer");
- st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer");
- st->MOTHER_SHIP_LASER=get_integer_resource(st->dpy, "mother_ship_laser","Integer");
- st->MOTHER_SHIP_PERIOD=get_integer_resource(st->dpy, "mother_ship_period","Integer");
- st->MOTHER_SHIP_HITS=get_integer_resource(st->dpy, "mother_ship_hits","Integer");
- st->MOTHER_SHIP=1;
- st->mother = (struct mother_ship_state *) malloc(sizeof(struct mother_ship_state));
- st->mother->lasers = (struct laser_state *) malloc(8*sizeof(struct laser_state));
- st->mother->active = 0;
- st->mother->death = 0;
- make_gc(st->mother->ship_color,"mother_ship_color0");
- make_gc(st->mother->laser_color,"mother_ship_color1");
- }
-
- make_gc (st->s_color,"star_color");
-
- make_gc (st->EXPLODE_COLOR_1,"explode_color_1");
- make_gc (st->EXPLODE_COLOR_2,"explode_color_2");
-
- make_gc (st->r_color0,"r_color0");
- make_gc (st->r_color1,"r_color1");
- make_gc (st->r_color2,"r_color2");
- make_gc (st->r_color3,"r_color3");
- make_gc (st->r_color4,"r_color4");
- make_gc (st->r_color5,"r_color5");
- make_gc (st->l_color0,"l_color0");
- make_gc (st->l_color1,"l_color1");
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- st->black = 0;
-#else
- make_gc (st->black,"background");
-#endif
- }
-
- return st;
-}
-
-
-static void
-blaster_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XGetWindowAttributes (dpy, window, &st->xgwa);
- XClearWindow (dpy, window);
- init_stars (st);
-}
-
-static Bool
-blaster_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-blaster_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
- if (st->r_color0) XFreeGC (dpy, st->r_color0);
- if (st->r_color1) XFreeGC (dpy, st->r_color1);
- if (st->r_color2) XFreeGC (dpy, st->r_color2);
- if (st->r_color3) XFreeGC (dpy, st->r_color3);
- if (st->r_color4) XFreeGC (dpy, st->r_color4);
- if (st->r_color5) XFreeGC (dpy, st->r_color5);
- if (st->l_color0) XFreeGC (dpy, st->l_color0);
- if (st->l_color1) XFreeGC (dpy, st->l_color1);
- if (st->s_color) XFreeGC (dpy, st->s_color);
- if (st->black) XFreeGC (dpy, st->black);
- if (st->EXPLODE_COLOR_1) XFreeGC (dpy, st->EXPLODE_COLOR_1);
- if (st->EXPLODE_COLOR_2) XFreeGC (dpy, st->EXPLODE_COLOR_2);
- if (st->stars) free (st->stars);
- if (st->mother) {
- free (st->mother->lasers);
- free (st->mother);
- }
- for (i = 0; i < st->NUM_ROBOTS; i++)
- free (st->robots[i].lasers);
- free (st->robots);
- free (st);
-}
-
-
-static const char *blaster_defaults [] = {
- ".lowrez: true",
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*r_color0: #FF00FF",
- "*r_color1: #FFA500",
- "*r_color2: #FFFF00",
- "*r_color3: #FFFFFF",
- "*r_color4: #0000FF",
- "*r_color5: #00FFFF",
- "*l_color0: #00FF00",
- "*l_color1: #FF0000",
- "*mother_ship_color0: #00008B",
- "*mother_ship_color1: #FFFFFF",
- "*explode_color_1: #FFFF00",
- "*explode_color_2: #FFA500",
- "*delay: 10000",
- "*num_robots: 5",
- "*num_lasers: 3",
- "*mother_ship: false",
- "*mother_ship_width: 25",
- "*mother_ship_height: 7",
- "*mother_ship_laser: 15",
- "*mother_ship_period: 150",
- "*mother_ship_hits: 10",
- "*explode_size_1: 27",
- "*explode_size_2: 19",
- "*explode_size_3: 7",
- "*num_stars: 50",
- "*star_color: white",
- "*move_stars: true",
- "*move_stars_x: 2",
- "*move_stars_y: 1",
- "*move_stars_random: 0",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec blaster_options [] = {
- /* These are the 6 robot colors */
- { "-r_color0", ".r_color0", XrmoptionSepArg, 0 },
- { "-r_color1", ".r_color1", XrmoptionSepArg, 0 },
- { "-r_color2", ".r_color2", XrmoptionSepArg, 0 },
- { "-r_color3", ".r_color3", XrmoptionSepArg, 0 },
- { "-r_color4", ".r_color4", XrmoptionSepArg, 0 },
- { "-r_color5", ".r_color5", XrmoptionSepArg, 0 },
- /* These are the 2 laser colors that robots have */
- { "-l_color0", ".l_color0", XrmoptionSepArg, 0 },
- { "-l_color1", ".l_color1", XrmoptionSepArg, 0 },
- /* These are the colors for the mothership and the mothership lasers */
- { "-mother_ship_color0", ".mother_ship_color0", XrmoptionSepArg, 0},
- { "-mother_ship_color1", ".mother_ship_color1", XrmoptionSepArg, 0},
- /* These are the two colors of the animated explosion */
- { "-explode_color_1", ".explode_color_1", XrmoptionSepArg, 0 },
- { "-explode_color_2", ".explode_color_2", XrmoptionSepArg, 0 },
- /* This is the delay in the main loop */
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- /* The number of robots and the number of lasers each robot has */
- { "-num_robots", ".num_robots", XrmoptionSepArg, 0},
- { "-num_lasers", ".num_lasers", XrmoptionSepArg, 0},
- /* If this is set, a mothership will appear, otherwise no mothership */
- { "-mother_ship", ".mother_ship", XrmoptionNoArg, "true"},
- { "-no_mother_ship", ".mother_ship", XrmoptionNoArg, "false"},
- /* This is the width, height, and laser length of the mothership */
- { "-mother_ship_width", ".mother_ship_width", XrmoptionSepArg, 0},
- { "-mother_ship_height", ".mother_ship_height", XrmoptionSepArg, 0},
- { "-mother_ship_laser", ".mother_ship_laser", XrmoptionSepArg, 0},
- /* This is the period which the mothership comes out, higher period==less often */
- { "-mother_ship_period", ".mother_ship_period", XrmoptionSepArg, 0},
- /* This is the number of hits it takes to destroy the mothership */
- { "-mother_ship_hits", ".mother_ship_hits", XrmoptionSepArg, 0},
- /* These are the size of the radius of the animated explosions */
- { "-explode_size_1", ".explode_size_1", XrmoptionSepArg, 0},
- { "-explode_size_2", ".explode_size_2", XrmoptionSepArg, 0},
- { "-explode_size_3", ".explode_size_3", XrmoptionSepArg, 0},
- /* This sets the number of stars in the star field, if this is set to 0, there will be no stars */
- { "-num_stars", ".num_stars", XrmoptionSepArg, 0},
- /* This is the color of the stars */
- { "-star_color", ".star_color", XrmoptionSepArg, 0},
- /* If this is true, the stars will move */
- { "-move_stars", ".move_stars", XrmoptionNoArg, "true"},
- /* This is the amount the stars will move in the x and y direction */
- { "-move_stars_x", ".move_stars_x", XrmoptionSepArg, 0},
- { "-move_stars_y", ".move_stars_y", XrmoptionSepArg, 0},
- /* If this is non-zero, the stars will move randomly, but will not move more than this number in
- either the x or y direction */
- { "-move_stars_random", ".move_stars_random", XrmoptionSepArg, 0},
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("Blaster", blaster)
diff --git a/hacks/blaster.man b/hacks/blaster.man
deleted file mode 100644
index 92f26fd..0000000
--- a/hacks/blaster.man
+++ /dev/null
@@ -1,65 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-blaster \- simulation of space combat
-.SH SYNOPSIS
-.B blaster
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-num_robots \fInumber\fP]
-[\-num_lasers \fInumber\fP]
-[\-num_stars \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Draws a simulation of flying space-combat robots (cleverly disguised as
-colored circles) doing battle in front of a moving star field.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-num_robots \fInumber\fP
-Robots. 2 - 50. Default: 5.
-.TP 8
-.B \-num_lasers \fInumber\fP
-Lasers. 1 - 100. Default: 3.
-.TP 8
-.B \-num_stars \fInumber\fP
-Stars. 5 - 200. Default: 50.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jonathan Lin. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jonathan Lin.
diff --git a/hacks/blitspin.c b/hacks/blitspin.c
deleted file mode 100644
index 00d9109..0000000
--- a/hacks/blitspin.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* Rotate a bitmap using using bitblts.
- The bitmap must be square, and must be a power of 2 in size.
- This was translated from SmallTalk code which appeared in the
- August 1981 issue of Byte magazine.
-
- The input bitmap may be non-square, it is padded and centered
- with the background color. Another way would be to subdivide
- the bitmap into square components and rotate them independently
- (and preferably in parallel), but I don't think that would be as
- interesting looking.
-
- It's too bad almost nothing uses blitter hardware these days,
- or this might actually win.
- */
-
-#include "screenhack.h"
-#include "pow2.h"
-#include "ximage-loader.h"
-#include <stdio.h>
-#include <time.h>
-
-#include "images/gen/som_png.h"
-
-/* Implementing this using XCopyArea doesn't work with color images on OSX.
- This means that the Cocoa implementation of XCopyArea in jwxyz.m is
- broken with the GXor, GXand, and/or the GXxor GC operations. This
- probably means that (e.g.) "kCGBlendModeDarken" is not close enough
- to being "GXand" to use for that. (It works with monochrome images,
- just not color ones).
-
- So, on OSX, we implement the blitter by hand. It is correct, but
- orders of magnitude slower.
- */
-#ifndef HAVE_JWXYZ
-# define USE_XCOPYAREA
-#endif
-
-struct state {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- int width, height, size;
- Bool scale_up;
- Pixmap self, temp, mask;
-# ifdef USE_XCOPYAREA
- GC gc_set, gc_clear, gc_copy, gc_and, gc_or, gc_xor;
-# endif
- GC gc;
- int delay, delay2;
- int duration;
- Pixmap bitmap;
- unsigned int fg, bg;
-
- int qwad; /* fuckin' C, man... who needs namespaces? */
- int first_time;
- int last_w, last_h;
-
- time_t start_time;
- Bool loaded_p;
- Bool load_ext_p;
- async_load_state *img_loader;
-};
-
-static void display (struct state *, Pixmap);
-static void blitspin_init_2 (struct state *);
-
-#define copy_to(from, xoff, yoff, to, op) \
- bitblt (st, st->from, st->to, op, 0, 0, \
- st->size-(xoff), st->size-(yoff), (xoff), (yoff))
-
-#define copy_from(to, xoff, yoff, from, op) \
- bitblt (st, st->from, st->to, op, (xoff), (yoff), \
- st->size-(xoff), st->size-(yoff), 0, 0)
-
-
-#ifdef USE_XCOPYAREA
-# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \
- XCopyArea((st)->dpy, (from), (to), (st)->gc_##op, \
- (src_x), (src_y), (w), (h), (dst_x), (dst_y))
-#else /* !USE_XCOPYAREA */
-
-# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \
- do_bitblt((st)->dpy, (from), (to), st->gc, GX##op, \
- (src_x), (src_y), (w), (h), (dst_x), (dst_y))
-
-static void
-do_bitblt (Display *dpy, Drawable src, Drawable dst, GC gc, int op,
- int src_x, int src_y,
- unsigned int width, unsigned int height,
- int dst_x, int dst_y)
-{
- if (op == GXclear)
- {
- XSetForeground (dpy, gc, 0xFF000000); /* ARGB black for Cocoa */
- XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height);
- }
- else if (op == GXset)
- {
- XSetForeground (dpy, gc, ~0L);
- XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height);
- }
- else if (op == GXcopy)
- {
- XCopyArea (dpy, src, dst, gc, src_x, src_y, width, height, dst_x, dst_y);
- }
- else
- {
- XImage *srci = XGetImage (dpy, src, src_x, src_y, width, height,
- ~0L, ZPixmap);
- XImage *dsti = XGetImage (dpy, dst, dst_x, dst_y, width, height,
- ~0L, ZPixmap);
- unsigned long *out = (unsigned long *) dsti->data;
- unsigned long *in = (unsigned long *) srci->data;
- unsigned long *end = (in + (height * srci->bytes_per_line
- / sizeof(unsigned long)));
- switch (op)
- {
- case GXor: while (in < end) { *out++ |= *in++; } break;
- case GXand: while (in < end) { *out++ &= *in++; } break;
- case GXxor: while (in < end) { *out++ ^= *in++; } break;
- default: abort();
- }
- XPutImage (dpy, dst, gc, dsti, 0, 0, dst_x, dst_y, width, height);
- XDestroyImage (srci);
- XDestroyImage (dsti);
- }
-}
-
-#endif /* !USE_XCOPYAREA */
-
-
-
-static unsigned long
-blitspin_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int this_delay = st->delay;
- int qwad;
-
- if (st->img_loader) /* still loading */
- {
- st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
-
- if (!st->img_loader) { /* just finished */
- st->first_time = 0;
- st->loaded_p = True;
- st->qwad = -1;
- st->start_time = time ((time_t *) 0);
- blitspin_init_2 (st);
- }
-
- /* Rotate nothing if the very first image is not yet loaded */
- if (! st->loaded_p)
- return this_delay;
- }
-
- if (!st->img_loader &&
- st->load_ext_p &&
- st->start_time + st->duration < time ((time_t *) 0)) {
- /* Start a new image loading, but keep rotating the old image
- until the new one arrives. */
- st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
- st->bitmap, 0, 0);
- }
-
- if (st->qwad == -1)
- {
- bitblt(st, st->mask, st->mask, clear,0,0, st->size, st->size, 0,0);
- bitblt(st, st->mask, st->mask, set, 0,0, st->size>>1, st->size>>1, 0,0);
- st->qwad = st->size>>1;
- }
-
- if (st->first_time)
- {
- st->first_time = 0;
- display (st, st->self);
- return st->delay2;
- }
-
- /* for (st->qwad = st->size>>1; st->qwad > 0; st->qwad>>=1) */
-
- qwad = st->qwad;
-
- copy_to (mask, 0, 0, temp, copy); /* 1 */
- copy_to (mask, 0, qwad, temp, or); /* 2 */
- copy_to (self, 0, 0, temp, and); /* 3 */
- copy_to (temp, 0, 0, self, xor); /* 4 */
- copy_from (temp, qwad, 0, self, xor); /* 5 */
- copy_from (self, qwad, 0, self, or); /* 6 */
- copy_to (temp, qwad, 0, self, xor); /* 7 */
- copy_to (self, 0, 0, temp, copy); /* 8 */
- copy_from (temp, qwad, qwad, self, xor); /* 9 */
- copy_to (mask, 0, 0, temp, and); /* A */
- copy_to (temp, 0, 0, self, xor); /* B */
- copy_to (temp, qwad, qwad, self, xor); /* C */
- copy_from (mask, qwad>>1, qwad>>1, mask, and); /* D */
- copy_to (mask, qwad, 0, mask, or); /* E */
- copy_to (mask, 0, qwad, mask, or); /* F */
- display (st, st->self);
-
- st->qwad >>= 1;
- if (st->qwad == 0) /* done with this round */
- {
- st->qwad = -1;
- this_delay = st->delay2;
- }
-
- return this_delay;
-}
-
-
-static int
-blitspin_to_pow2(int n, Bool up)
-{
- int pow2 = to_pow2 (n);
- if (n == pow2)
- return n;
- else
- return up ? pow2 : pow2 >> 1;
-}
-
-static void *
-blitspin_init (Display *d_arg, Window w_arg)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- char *bitmap_name;
-
- st->dpy = d_arg;
- st->window = w_arg;
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- st->fg = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- st->bg = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "background", "Background");
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
- st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
- if (st->delay < 0) st->delay = 0;
- if (st->delay2 < 0) st->delay2 = 0;
- if (st->duration < 1) st->duration = 1;
-
- st->start_time = time ((time_t *) 0);
-
- bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap");
- if (! bitmap_name || !*bitmap_name)
- bitmap_name = strdup ("(default)");
-
- if (!strcasecmp (bitmap_name, "(default)") ||
- !strcasecmp (bitmap_name, "default")) {
- free (bitmap_name);
- bitmap_name = strdup ("(screen)");
- }
-
- if (!strcasecmp (bitmap_name, "(builtin)") ||
- !strcasecmp (bitmap_name, "builtin"))
- {
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (st->dpy, st->window,
- som_png, sizeof(som_png),
- &st->width, &st->height, &mask);
- XGCValues gcv;
- GC gc;
- gcv.foreground = st->bg;
- gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
- st->bitmap = XCreatePixmap (st->dpy, st->window,
- st->xgwa.width, st->xgwa.height,
- st->xgwa.depth);
- XFillRectangle (st->dpy, st->bitmap, gc, 0, 0, st->width, st->height);
- XSetClipMask (st->dpy, gc, mask);
- XCopyArea (st->dpy, pixmap, st->bitmap, gc, 0, 0, st->width, st->height,
- 0, 0);
- XFreeGC (st->dpy, gc);
- XFreePixmap (st->dpy, pixmap);
- XFreePixmap (st->dpy, mask);
-
- st->scale_up = True; /* definitely. */
- st->loaded_p = True;
- blitspin_init_2 (st);
- }
- else if (!strcasecmp (bitmap_name, "(screen)") ||
- !strcasecmp (bitmap_name, "screen"))
- {
- st->bitmap = XCreatePixmap (st->dpy, st->window,
- st->xgwa.width, st->xgwa.height,
- st->xgwa.depth);
- st->width = st->xgwa.width;
- st->height = st->xgwa.height;
- st->scale_up = True; /* maybe? */
- st->load_ext_p = True;
- st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
- st->bitmap, 0, 0);
- }
- else
- {
- st->bitmap = file_to_pixmap (st->dpy, st->window, bitmap_name,
- &st->width, &st->height, 0);
- st->scale_up = True; /* probably? */
- blitspin_init_2 (st);
- }
-
- if (bitmap_name) free (bitmap_name);
- return st;
-}
-
-
-static void
-blitspin_init_2 (struct state *st)
-{
- XGCValues gcv;
-
- /* make it square */
- st->size = (st->width < st->height) ? st->height : st->width;
- /* round up to power of 2 */
- st->size = blitspin_to_pow2(st->size, st->scale_up);
- { /* don't exceed screen size */
- int s = XScreenNumberOfScreen(st->xgwa.screen);
- int w = blitspin_to_pow2(XDisplayWidth(st->dpy, s), False);
- int h = blitspin_to_pow2(XDisplayHeight(st->dpy, s), False);
- if (st->size > w) st->size = w;
- if (st->size > h) st->size = h;
- }
-
- if (st->self) XFreePixmap (st->dpy, st->self);
- if (st->temp) XFreePixmap (st->dpy, st->temp);
- if (st->mask) XFreePixmap (st->dpy, st->mask);
-
- st->self = XCreatePixmap (st->dpy, st->window, st->size, st->size,
- st->xgwa.depth);
- st->temp = XCreatePixmap (st->dpy, st->window, st->size, st->size,
- st->xgwa.depth);
- st->mask = XCreatePixmap (st->dpy, st->window, st->size, st->size,
- st->xgwa.depth);
- gcv.foreground = (st->xgwa.depth == 1 ? 1 : (~0));
-
-# ifdef USE_XCOPYAREA
-# define make_gc(op) \
- gcv.function=GX##op; \
- if (st->gc_##op) XFreeGC (st->dpy, st->gc_##op); \
- st->gc_##op = XCreateGC (st->dpy, st->self, GCFunction|GCForeground, &gcv)
- make_gc(set);
- make_gc(clear);
- make_gc(copy);
- make_gc(and);
- make_gc(or);
- make_gc(xor);
-# endif /* USE_XCOPYAREA */
-
- gcv.foreground = gcv.background = st->bg;
- if (st->gc) XFreeGC (st->dpy, st->gc);
- st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
- /* Clear st->self to the background color (not to 0, which 'clear' does.) */
- XFillRectangle (st->dpy, st->self, st->gc, 0, 0, st->size, st->size);
- XSetForeground (st->dpy, st->gc, st->fg);
-
- XCopyArea (st->dpy, st->bitmap, st->self, st->gc, 0, 0,
- st->width, st->height,
- (st->size - st->width) >> 1,
- (st->size - st->height) >> 1);
-
- st->qwad = -1;
- st->first_time = 1;
-}
-
-static void
-display (struct state *st, Pixmap pixmap)
-{
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- if (st->xgwa.width != st->last_w ||
- st->xgwa.height != st->last_h)
- {
- XClearWindow (st->dpy, st->window);
- st->last_w = st->xgwa.width;
- st->last_h = st->xgwa.height;
- }
- if (st->xgwa.depth != 1)
- XCopyArea (st->dpy, pixmap, st->window, st->gc, 0, 0, st->size, st->size,
- (st->xgwa.width - st->size) >> 1,
- (st->xgwa.height - st->size) >> 1);
- else
- XCopyPlane (st->dpy, pixmap, st->window, st->gc, 0, 0, st->size, st->size,
- (st->xgwa.width - st->size) >> 1,
- (st->xgwa.height - st->size) >> 1,
- 1);
-/*
- XDrawRectangle (st->dpy, st->window, st->gc,
- ((st->xgwa.width - st->size) >> 1) - 1,
- ((st->xgwa.height - st->size) >> 1) - 1,
- st->size+2, st->size+2);
-*/
-}
-
-static void
-blitspin_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static Bool
-blitspin_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->start_time = 0;
- return True;
- }
- return False;
-}
-
-static void
-blitspin_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-# ifdef USE_XCOPYAREA
- if (st->gc_set) XFreeGC (dpy, st->gc_set);
- if (st->gc_clear) XFreeGC (dpy, st->gc_clear);
- if (st->gc_copy) XFreeGC (dpy, st->gc_copy);
- if (st->gc_and) XFreeGC (dpy, st->gc_and);
- if (st->gc_or) XFreeGC (dpy, st->gc_or);
- if (st->gc_xor) XFreeGC (dpy, st->gc_xor);
-# endif
- if (st->gc) XFreeGC (dpy, st->gc);
- XFreePixmap (dpy, st->bitmap);
- free (st);
-}
-
-
-static const char *blitspin_defaults [] = {
- ".background: black",
- ".foreground: white",
- ".fpsSolid: true",
- "*delay: 500000",
- "*delay2: 500000",
- "*duration: 120",
- "*bitmap: (default)",
- "*geometry: 1080x1080",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec blitspin_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-delay2", ".delay2", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
- { "-bitmap", ".bitmap", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("BlitSpin", blitspin)
diff --git a/hacks/blitspin.man b/hacks/blitspin.man
deleted file mode 100644
index 1b70c7b..0000000
--- a/hacks/blitspin.man
+++ /dev/null
@@ -1,96 +0,0 @@
-.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
-.SH NAME
-blitspin \- rotate a bitmap in an interesting way
-.SH SYNOPSIS
-.B blitspin
-[\-display \fIhost:display.screen\fP]
-[\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root]
-[\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP]
-[\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-duration \fIsecs\fP]
-.SH DESCRIPTION
-The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by
-using logical operations: the bitmap is divided into quadrants, and the
-quadrants are shifted clockwise. Then the same thing is done again with
-progressively smaller quadrants, except that all sub-quadrants of a
-given size are rotated in parallel. So this takes \fBO(16*log2(N))\fP
-blits of size NxN, with the limitation that the image must be square,
-and the size must be a power of 2.
-.SH OPTIONS
-.I blitspin
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-bitmap \fIfilename\fP
-The file name of a bitmap to rotate. It need not be square: it
-will be padded with the background color. If unspecified or the
-string \fI(default)\fP, a builtin bitmap is used.
-
-If support for the \fIXPM\fP library was enabled at compile-time,
-the specified file may be in \fIXPM\fP format as well as \fIXBM\fP, and
-thus may be a color image.
-
-The \fB*bitmapFilePath\fP resource will be searched if the bitmap
-name is not a fully-qualified pathname.
-.TP 8
-.B \-grab\-screen
-If this option is specified, then the image which is spun will be grabbed
-from the portion of the screen underlying the blitspin window, or from
-the system's video input, or from a random file on disk, as indicated by
-the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
-and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP file;
-see
-.BR xscreensaver\-settings (1)
-for more details.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long to delay between steps of the rotation process, in microseconds.
-Default is 500000, one-half second.
-.TP 8
-.B \-duration \fIseconds\fP
-How long to run before loading a new image. Default 120 seconds.
-.TP 8
-.B \-delay2 \fImicroseconds\fP
-How long to delay between each 90-degree rotation, in microseconds.
-Default is 500000, one-half second.
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 2001 by Jamie Zawinski.
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation. No
-representations are made about the suitability of this software for any
-purpose. It is provided "as is" without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 17-aug-92.
-
-Based on SmallTalk code which appeared in the August 1981 issue of Byte
-magazine.
diff --git a/hacks/bouboule.c b/hacks/bouboule.c
deleted file mode 100644
index 1ac0425..0000000
--- a/hacks/bouboule.c
+++ /dev/null
@@ -1,858 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*-
- Ported from xlockmore 4.03a12 to be a standalone program and thus usable
- with xscreensaver by Jamie Zawinski <jwz@jwz.org> on 15-May-97.
-
- Original copyright notice from xlock.c:
-
- * Copyright (c) 1988-91 by Patrick J. Naughton.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- */
-
-#if 0
-static const char sccsid[] = "@(#)bouboule.c 4.00 97/01/01 xlockmore";
-#endif
-
-/*-
- * bouboule.c (bouboule mode for xlockmore)
- *
- * Sort of starfield for xlockmore. I found that making a starfield for
- * a 3D engine and thought it could be a nice lock mode. For a real starfield,
- * I only scale the sort of sphere you see to the whole sky and clip the stars
- * to the camera screen.
- *
- * Code Copyright 1996 by Jeremie PETIT (jeremie_petit@geocities.com)
- *
- * Use: batchcount is the number of stars.
- * cycles is the maximum size for a star
- *
- * 15-May-97: jwz@jwz.org: turned into a standalone program.
- * 04-Sep-96: Added 3d support (Henrik Theiling, theiling@coli-uni-sb.de)
- * 20-Feb-96: Added tests so that already malloced objects are not
- * malloced twice, thanks to the report from <mccomb@interport.net>
- * 01-Feb-96: Patched by Jouk Jansen <joukj@alpha.chem.uva.nl> for VMS
- * Patched by <bagleyd@bigfoot.com> for TrueColor displays
- * 30-Jan-96: Wrote all that I wanted to.
- *
- * DONE: Build up a XArc list and Draw everything once with XFillArcs
- * That idea came from looking at swarm code.
- * DONE: Add an old arcs list for erasing.
- * DONE: Make center of starfield SinVariable.
- * DONE: Add some random in the sinvary() function.
- * DONE: check time for erasing the stars with the two methods and use the
- * better one. Note that sometimes the time difference between
- * beginning of erasing and its end is negative! I check this, and
- * do not use this result when it occurs. If all values are negative,
- * the erasing will continue being done in the currently tested mode.
- * DONE: Allow stars size customization.
- * DONE: Make sizey be no less than half sizex or no bigger than twice sizex.
- *
- * IDEA: A simple check can be performed to know which stars are "behind"
- * and which are "in front". So is possible to very simply change
- * the drawing mode for these two sorts of stars. BUT: this would lead
- * to a rewrite of the XArc list code because drawing should be done
- * in two steps: "behind" stars then "in front" stars. Also, what could
- * be the difference between the rendering of these two types of stars?
- * IDEA: Calculate the distance of each star to the "viewer" and render the
- * star accordingly to this distance. Same remarks as for previous
- * ideas can be pointed out. This would even lead to reget the old stars
- * drawing code, that has been replaced by the XFillArcs. On another
- * hand, this would allow particular stars (own color, shape...), as
- * far as they would be individually drawn. One should be careful to
- * draw them according to their distance, that is not drawing a far
- * star after a close one.
- */
-
-#ifdef STANDALONE
-# define DEFAULTS "*count: 100 \n" \
- "*size: 15 \n" \
- "*delay: 20000 \n" \
- "*ncolors: 64 \n" \
- "*use3d: True \n" \
- "*delta3d: 1.5 \n" \
- "*right3d: red \n" \
- "*left3d: blue \n" \
- "*both3d: magenta \n" \
- "*none3d: black \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n"
-
-# define SMOOTH_COLORS
-# define release_bouboule 0
-# define bouboule_handle_event 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-# define ENTRYPOINT /**/
-#endif /* !STANDALONE */
-
-ENTRYPOINT ModeSpecOpt bouboule_opts = {
- 0, NULL, 0, NULL, NULL };
-
-#define USEOLDXARCS 1 /* If 1, we use old xarcs list for erasing.
- * else we just roughly erase the window.
- * This mainly depends on the number of stars,
- * because when they are many, it is faster to
- * erase the whole window than to erase each star
- */
-
-#if HAVE_GETTIMEOFDAY
-#define ADAPT_ERASE 1 /* If 1, then we try ADAPT_CHECKS black XFillArcs,
- * and after, ADAPT_CHECKS XFillRectangle.
- * We check which method seems better, knowing that
- * XFillArcs is generally visually better. So we
- * consider that XFillArcs is still better if its time
- * is about XFillRectangle * ADAPT_ARC_PREFERED
- * We need gettimeofday
- * for this... Does it exist on other systems ? Do we
- * have to use another function for others ?
- * This value overrides USEOLDXARCS.
- */
-
-#ifdef USE_XVMSUTILS
-# if 0
-# include "../xvmsutils/unix_time.h"
-# else
-# include <X11/unix_time.h>
-# endif
-#endif
-
-#include <sys/time.h>
-
-#define ADAPT_CHECKS 50
-#define ADAPT_ARC_PREFERED 150 /* Maybe the value that is the most important
- * for adapting to a system */
-#endif
-
-#define dtor(x) (((x) * M_PI) / 180.0) /* Degrees to radians */
-
-#define MINSTARS 1
-#define MINSIZE 1
-/* jwz: I think slower color changes look better */
-#define COLOR_CHANGES 50 /* How often we change colors (1 = always)
- * This value should be tuned accordingly to
- * the number of stars */
-#define MAX_SIZEX_SIZEY 2. /* This controls whether the sphere can be very
- * very large and have a small height (or the
- * opposite) or no. */
-
-#define THETACANRAND 80 /* percentage of changes for the speed of
- * change of the 3 theta values */
-#define SIZECANRAND 80 /* percentage of changes for the speed of
- * change of the sizex and sizey values */
-#define POSCANRAND 80 /* percentage of changes for the speed of
- * change of the x and y values */
-/* Note that these XXXCANRAND values can be 0, that is no rand acceleration *
- variation. */
-
-#define VARRANDALPHA (NRAND((int) (M_PI * 1000.0))/1000.0)
-#define VARRANDSTEP (M_PI/(NRAND(100)+100.0))
-#define VARRANDMIN (-70.0)
-#define VARRANDMAX 70.0
-
-#define MINZVAL 100 /* stars can come this close */
-#define SCREENZ 2000 /* this is where the screen is */
-#define MAXZVAL 10000 /* stars can go this far away */
-
-#define GETZDIFF(z) ((MI_DELTA3D(mi))*20.0*(1.0-(SCREENZ)/(z+1000)))
-#define MAXDIFF MAX(-GETZDIFF(MINZVAL),GETZDIFF(MAXZVAL))
-
-/* These values are the variation parameters of the acceleration variation *
- of the SinVariables that are randomized. */
-
-/******************************/
-typedef struct SinVariableStruct
-/******************************/
-{
- double alpha; /*
- * Alpha is the current state of the sinvariable
- * alpha should be initialized to a value between
- * 0.0 and 2 * M_PI
- */
- double step; /*
- * Speed of evolution of alpha. It should be a reasonable
- * fraction of 2 * M_PI. This value directly influence
- * the variable speed of variation.
- */
- double minimum; /* Minimum value for the variable */
- double maximum; /* Maximum value for the variable */
- double value; /* Current value */
- int mayrand; /* Flag for knowing whether some randomization can be
- * applied to the variable */
- struct SinVariableStruct *varrand; /* Evolving Variable: the variation of
- * alpha */
-} SinVariable;
-
-/***********************/
-typedef struct StarStruct
-/***********************/
-{
- double x, y, z; /* Position of the star */
- short size; /* Try to guess */
-} Star;
-
-/****************************/
-typedef struct StarFieldStruct
-/****************************/
-{
- short width, height; /* width and height of the starfield window */
- short max_star_size; /* Maximum radius for stars. stars radius will
- * vary from 1 to MAX_STAR_SIZE */
- SinVariable x; /* Evolving variables: */
- SinVariable y; /* Center of the field on the screen */
- SinVariable z;
- SinVariable sizex; /* Evolving variable: half width of the field */
- SinVariable sizey; /* Evolving variable: half height of the field */
- SinVariable thetax; /* Evolving Variables: */
- SinVariable thetay; /* rotation angles of the starfield */
- SinVariable thetaz; /* around x, y and z local axis */
- Star *star; /* List of stars */
- XArc *xarc; /* Current List of arcs */
- XArc *xarcleft; /* additional list for the left arcs */
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- XArc *oldxarc; /* Old list of arcs */
- XArc *oldxarcleft;
-#endif
- unsigned long color; /* Current color of the starfield */
- int colorp; /* Pointer to color of the starfield */
- int NbStars; /* Number of stars */
- short colorchange; /* Counter for the color change */
-#if (ADAPT_ERASE == 1)
- short hasbeenchecked;
- long rect_time;
- long xarc_time;
-#endif
-} StarField;
-
-static StarField *starfield = NULL;
-
-/*********/
-static void
-sinvary(SinVariable * v)
-/*********/
-
-{
- v->value = v->minimum +
- (v->maximum - v->minimum) * (sin(v->alpha) + 1.0) / 2.0;
-
- if (v->mayrand == 0)
- v->alpha += v->step;
- else {
- int vaval = NRAND(100);
-
- if (vaval <= v->mayrand)
- sinvary(v->varrand);
- v->alpha += (100.0 + (v->varrand->value)) * v->step / 100.0;
- }
-
- if (v->alpha > 2 * M_PI)
- v->alpha -= 2 * M_PI;
-}
-
-/*************************************************/
-static void
-sininit(SinVariable * v,
- double alpha, double step, double minimum, double maximum,
- short int mayrand)
-{
- v->alpha = alpha;
- v->step = step;
- v->minimum = minimum;
- v->maximum = maximum;
- v->mayrand = mayrand;
- if (mayrand != 0) {
- if (v->varrand == NULL)
- v->varrand = (SinVariable *) calloc(1, sizeof (SinVariable));
- sininit(v->varrand,
- VARRANDALPHA,
- VARRANDSTEP,
- VARRANDMIN,
- VARRANDMAX,
- 0);
- sinvary(v->varrand);
- }
- /* We calculate the values at least once for initialization */
- sinvary(v);
-}
-
-static void
-sinfree(SinVariable * point)
-{
- SinVariable *temp, *next;
-
- next = point->varrand;
- while (next) {
- temp = next;
- next = temp->varrand;
- (void) free((void *) temp);
- }
-}
-
-
-/***************/
-ENTRYPOINT void
-init_bouboule(ModeInfo * mi)
-/***************/
-
-/*-
- * The stars init part was first inspirated from the net3d game starfield
- * code. But net3d starfield is not really 3d starfield, and I needed real 3d,
- * so only remains the net3d starfield initialization main idea, that is
- * the stars distribution on a sphere (theta and omega computing)
- */
-{
- StarField *sp;
- int size = MI_SIZE(mi);
- int i;
- double theta, omega;
-
- if (MI_WIDTH(mi) > 2560) size *= 2; /* Retina displays */
-
- MI_INIT (mi, starfield);
- sp = &starfield[MI_SCREEN(mi)];
-
- sp->width = MI_WIN_WIDTH(mi);
- sp->height = MI_WIN_HEIGHT(mi);
-
- /* use the right `black' pixel values: */
- if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi));
- XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- 0, 0, sp->width, sp->height);
- } else
- XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
-
- if (size < -MINSIZE)
- sp->max_star_size = NRAND(-size - MINSIZE + 1) + MINSIZE;
- else if (size < MINSIZE)
- sp->max_star_size = MINSIZE;
- else
- sp->max_star_size = size;
-
- sp->NbStars = MI_BATCHCOUNT(mi);
- if (sp->NbStars < -MINSTARS) {
- if (sp->star) {
- (void) free((void *) sp->star);
- sp->star = NULL;
- }
- if (sp->xarc) {
- (void) free((void *) sp->xarc);
- sp->xarc = NULL;
- }
- if (sp->xarcleft) {
- (void) free((void *) sp->xarcleft);
- sp->xarcleft = NULL;
- }
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- if (sp->oldxarc) {
- (void) free((void *) sp->oldxarc);
- sp->oldxarc = NULL;
- }
- if (sp->oldxarcleft) {
- (void) free((void *) sp->oldxarcleft);
- sp->oldxarcleft = NULL;
- }
-#endif
- sp->NbStars = NRAND(-sp->NbStars - MINSTARS + 1) + MINSTARS;
- } else if (sp->NbStars < MINSTARS)
- sp->NbStars = MINSTARS;
-
- /* We get memory for lists of objects */
- if (sp->star == NULL)
- sp->star = (Star *) malloc(sp->NbStars * sizeof (Star));
- if (sp->xarc == NULL)
- sp->xarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
- if (MI_WIN_IS_USE3D(mi) && sp->xarcleft == NULL)
- sp->xarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- if (sp->oldxarc == NULL)
- sp->oldxarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
- if (MI_WIN_IS_USE3D(mi) && sp->oldxarcleft == NULL)
- sp->oldxarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
-#endif
-
- {
- /* We initialize evolving variables */
- sininit(&sp->x,
- NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
- ((double) sp->width) / 4.0,
- 3.0 * ((double) sp->width) / 4.0,
- POSCANRAND);
- sininit(&sp->y,
- NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
- ((double) sp->height) / 4.0,
- 3.0 * ((double) sp->height) / 4.0,
- POSCANRAND);
-
- /* for z, we have to ensure that the bouboule does not get behind */
- /* the eyes of the viewer. His/Her eyes are at 0. Because the */
- /* bouboule uses the x-radius for the z-radius, too, we have to */
- /* use the x-values. */
- sininit(&sp->z,
- NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
- ((double) sp->width / 2.0 + MINZVAL),
- ((double) sp->width / 2.0 + MAXZVAL),
- POSCANRAND);
-
-
- sininit(&sp->sizex,
- NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
- MIN(((double) sp->width) - sp->x.value,
- sp->x.value) / 5.0,
- MIN(((double) sp->width) - sp->x.value,
- sp->x.value),
- SIZECANRAND);
-
- sininit(&sp->sizey,
- NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
- MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
- sp->sizey.maximum / 5.0),
- MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
- MIN(((double) sp->height) -
- sp->y.value,
- sp->y.value)),
- SIZECANRAND);
-
- sininit(&sp->thetax,
- NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
- -M_PI, M_PI,
- THETACANRAND);
- sininit(&sp->thetay,
- NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
- -M_PI, M_PI,
- THETACANRAND);
- sininit(&sp->thetaz,
- NRAND(3142) / 1000.0, M_PI / (NRAND(400) + 400.0),
- -M_PI, M_PI,
- THETACANRAND);
- }
- for (i = 0; i < sp->NbStars; i++) {
- Star *star;
- XArc *arc = NULL, *arcleft = NULL;
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- XArc *oarc = NULL, *oarcleft = NULL;
-#endif
-
- star = &(sp->star[i]);
- arc = &(sp->xarc[i]);
- if (MI_WIN_IS_USE3D(mi))
- arcleft = &(sp->xarcleft[i]);
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- oarc = &(sp->oldxarc[i]);
- if (MI_WIN_IS_USE3D(mi))
- oarcleft = &(sp->oldxarcleft[i]);
-#endif
- /* Elevation and bearing of the star */
- theta = dtor((NRAND(1800)) / 10.0 - 90.0);
- omega = dtor((NRAND(3600)) / 10.0 - 180.0);
-
- /* Stars coordinates in a 3D space */
- star->x = cos(theta) * sin(omega);
- star->y = sin(omega) * sin(theta);
- star->z = cos(omega);
-
- /* We set the stars size */
- star->size = NRAND(2 * sp->max_star_size);
- if (star->size < sp->max_star_size)
- star->size = 0;
- else
- star->size -= sp->max_star_size;
-
- /* We set default values for the XArc lists elements */
- arc->x = arc->y = 0;
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft->x = arcleft->y = 0;
- }
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- oarc->x = oarc->y = 0;
- if (MI_WIN_IS_USE3D(mi)) {
- oarcleft->x = oarcleft->y = 0;
- }
-#endif
- arc->width = 2 + star->size;
- arc->height = 2 + star->size;
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft->width = 2 + star->size;
- arcleft->height = 2 + star->size;
- }
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- oarc->width = 2 + star->size;
- oarc->height = 2 + star->size;
- if (MI_WIN_IS_USE3D(mi)) {
- oarcleft->width = 2 + star->size;
- oarcleft->height = 2 + star->size;
- }
-#endif
-
- arc->angle1 = 0;
- arc->angle2 = 360 * 64;
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft->angle1 = 0;
- arcleft->angle2 = 360 * 64;
- }
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- oarc->angle1 = 0;
- oarc->angle2 = 360 * 64; /* ie. we draw whole disks:
- * from 0 to 360 degrees */
- if (MI_WIN_IS_USE3D(mi)) {
- oarcleft->angle1 = 0;
- oarcleft->angle2 = 360 * 64;
- }
-#endif
- }
-
- if (MI_NPIXELS(mi) > 2)
- sp->colorp = NRAND(MI_NPIXELS(mi));
- /* We set up the starfield color */
- if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2)
- sp->color = MI_PIXEL(mi, sp->colorp);
- else
- sp->color = MI_WIN_WHITE_PIXEL(mi);
-
-#if (ADAPT_ERASE == 1)
- /* We initialize the adaptation code for screen erasing */
- sp->hasbeenchecked = ADAPT_CHECKS * 2;
- sp->rect_time = 0;
- sp->xarc_time = 0;
-#endif
-}
-
-/****************/
-ENTRYPOINT void
-draw_bouboule(ModeInfo * mi)
-/****************/
-
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GC gc = MI_GC(mi);
- StarField *sp = &starfield[MI_SCREEN(mi)];
- int i, diff = 0;
- double CX, CY, CZ, SX, SY, SZ;
- Star *star;
- XArc *arc = NULL, *arcleft = NULL;
-
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
-#endif
-
-#if (ADAPT_ERASE == 1)
- struct timeval tv1;
- struct timeval tv2;
-
-#endif
-
-#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
- short x_1, y_1, x_2, y_2;
-
- /* bounding rectangle around the old starfield,
- * for erasing with the smallest rectangle
- * instead of filling the whole screen */
- int maxdiff = 0; /* maximal distance between left and right */
-
- /* star in 3d mode, otherwise 0 */
-#endif
-
-#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
- if (MI_WIN_IS_USE3D(mi)) {
- maxdiff = (int) MAXDIFF;
- }
- x_1 = (int) sp->x.value - (int) sp->sizex.value -
- sp->max_star_size - maxdiff;
- y_1 = (int) sp->y.value - (int) sp->sizey.value -
- sp->max_star_size;
- x_2 = 2 * ((int) sp->sizex.value + sp->max_star_size + maxdiff);
- y_2 = 2 * ((int) sp->sizey.value + sp->max_star_size);
-#endif
- /* We make variables vary. */
- sinvary(&sp->thetax);
- sinvary(&sp->thetay);
- sinvary(&sp->thetaz);
-
- sinvary(&sp->x);
- sinvary(&sp->y);
- if (MI_WIN_IS_USE3D(mi))
- sinvary(&sp->z);
-
- /* A little trick to prevent the bouboule from being
- * bigger than the screen */
- sp->sizex.maximum =
- MIN(((double) sp->width) - sp->x.value,
- sp->x.value);
- sp->sizex.minimum = sp->sizex.maximum / 3.0;
-
- /* Another trick to make the ball not too flat */
- sp->sizey.minimum =
- MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
- sp->sizey.maximum / 3.0);
- sp->sizey.maximum =
- MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
- MIN(((double) sp->height) - sp->y.value,
- sp->y.value));
-
- sinvary(&sp->sizex);
- sinvary(&sp->sizey);
-
- /*
- * We calculate the rotation matrix values. We just make the
- * rotation on the fly, without using a matrix.
- * Star positions are recorded as unit vectors pointing in various
- * directions. We just make them all rotate.
- */
- CX = cos(sp->thetax.value);
- SX = sin(sp->thetax.value);
- CY = cos(sp->thetay.value);
- SY = sin(sp->thetay.value);
- CZ = cos(sp->thetaz.value);
- SZ = sin(sp->thetaz.value);
-
- for (i = 0; i < sp->NbStars; i++) {
- star = &(sp->star[i]);
- arc = &(sp->xarc[i]);
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft = &(sp->xarcleft[i]);
- /* to help the eyes, the starfield is always as wide as */
- /* deep, so .sizex.value can be used. */
- diff = (int) GETZDIFF(sp->sizex.value *
- ((SY * CX) * star->x + (SX) * star->y +
- (CX * CY) * star->z) + sp->z.value);
- }
- arc->x = (short) ((sp->sizex.value *
- ((CY * CZ - SX * SY * SZ) * star->x +
- (-CX * SZ) * star->y +
- (SY * CZ + SZ * SX * CY) * star->z) +
- sp->x.value));
- arc->y = (short) ((sp->sizey.value *
- ((CY * SZ + SX * SY * CZ) * star->x +
- (CX * CZ) * star->y +
- (SY * SZ - SX * CY * CZ) * star->z) +
- sp->y.value));
-
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft->x = (short) ((sp->sizex.value *
- ((CY * CZ - SX * SY * SZ) * star->x +
- (-CX * SZ) * star->y +
- (SY * CZ + SZ * SX * CY) * star->z) +
- sp->x.value));
- arcleft->y = (short) ((sp->sizey.value *
- ((CY * SZ + SX * SY * CZ) * star->x +
- (CX * CZ) * star->y +
- (SY * SZ - SX * CY * CZ) * star->z) +
- sp->y.value));
- arc->x += diff;
- arcleft->x -= diff;
- }
- if (star->size != 0) {
- arc->x -= star->size;
- arc->y -= star->size;
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft->x -= star->size;
- arcleft->y -= star->size;
- }
- }
- }
-
- /* First, we erase the previous starfield */
- if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi))
- XSetForeground(display, gc, MI_NONE_COLOR(mi));
- else
- XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
-
-#if (ADAPT_ERASE == 1)
- if (sp->hasbeenchecked == 0) {
- /* We just calculate which method is the faster and eventually free
- * the oldxarc list */
- if (sp->xarc_time >
- ADAPT_ARC_PREFERED * sp->rect_time) {
- sp->hasbeenchecked = -2; /* XFillRectangle mode */
- (void) free((void *) sp->oldxarc);
- sp->oldxarc = NULL;
- if (MI_WIN_IS_USE3D(mi)) {
- (void) free((void *) sp->oldxarcleft);
- sp->oldxarcleft = NULL;
- }
- } else {
- sp->hasbeenchecked = -1; /* XFillArcs mode */
- }
- }
- if (sp->hasbeenchecked == -2) {
- /* Erasing is done with XFillRectangle */
- XFillRectangle(display, window, gc,
- x_1, y_1, x_2, y_2);
- } else if (sp->hasbeenchecked == -1) {
- /* Erasing is done with XFillArcs */
- XFillArcs(display, window, gc,
- sp->oldxarc, sp->NbStars);
- if (MI_WIN_IS_USE3D(mi))
- XFillArcs(display, window, gc,
- sp->oldxarcleft, sp->NbStars);
- } else {
- long usec;
-
- if (sp->hasbeenchecked > ADAPT_CHECKS) {
-#ifdef GETTIMEOFDAY_TWO_ARGS
- (void) gettimeofday(&tv1, NULL);
-#else
- (void) gettimeofday(&tv1);
-#endif
- XFillRectangle(display, window, gc,
- x_1, y_1, x_2, y_2);
-#ifdef GETTIMEOFDAY_TWO_ARGS
- (void) gettimeofday(&tv2, NULL);
-#else
- (void) gettimeofday(&tv2);
-#endif
- usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
- if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
- sp->rect_time += usec + tv2.tv_usec - tv1.tv_usec;
- sp->hasbeenchecked--;
- }
- } else {
-#ifdef GETTIMEOFDAY_TWO_ARGS
- (void) gettimeofday(&tv1, NULL);
-#else
- (void) gettimeofday(&tv1);
-#endif
- XFillArcs(display, window, gc,
- sp->oldxarc, sp->NbStars);
- if (MI_WIN_IS_USE3D(mi))
- XFillArcs(display, window, gc,
- sp->oldxarcleft, sp->NbStars);
-#ifdef GETTIMEOFDAY_TWO_ARGS
- (void) gettimeofday(&tv2, NULL);
-#else
- (void) gettimeofday(&tv2);
-#endif
- usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
- if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
- sp->xarc_time += usec + tv2.tv_usec - tv1.tv_usec;
- sp->hasbeenchecked--;
- }
- }
- }
-#else
-#if (USEOLDXARCS == 1)
- XFillArcs(display, window, gc,
- sp->oldxarc, sp->NbStars);
- if (MI_WIN_IS_USE3D(mi))
- XFillArcs(display, window, gc,
- sp->oldxarcleft, sp->NbStars);
-#else
- XFillRectangle(display, window, gc,
- x_1, y_1, x_2, y_2);
-#endif
-#endif
-
- /* Then we draw the new one */
- if (MI_WIN_IS_USE3D(mi)) {
- if (MI_WIN_IS_INSTALL(mi))
- XSetFunction(display, gc, GXor);
- XSetForeground(display, gc, MI_RIGHT_COLOR(mi));
- XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
- XSetForeground(display, gc, MI_LEFT_COLOR(mi));
- XFillArcs(display, window, gc, sp->xarcleft, sp->NbStars);
- if (MI_WIN_IS_INSTALL(mi))
- XSetFunction(display, gc, GXcopy);
- } else {
- XSetForeground(display, gc, sp->color);
- XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
- }
-
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
-#if (ADAPT_ERASE == 1)
- if (sp->hasbeenchecked >= -1) {
- arc = sp->xarc;
- sp->xarc = sp->oldxarc;
- sp->oldxarc = arc;
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft = sp->xarcleft;
- sp->xarcleft = sp->oldxarcleft;
- sp->oldxarcleft = arcleft;
- }
- }
-#else
- arc = sp->xarc;
- sp->xarc = sp->oldxarc;
- sp->oldxarc = arc;
- if (MI_WIN_IS_USE3D(mi)) {
- arcleft = sp->xarcleft;
- sp->xarcleft = sp->oldxarcleft;
- sp->oldxarcleft = arcleft;
- }
-#endif
-#endif
-
- /* We set up the color for the next drawing */
- if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2 &&
- (++sp->colorchange >= COLOR_CHANGES)) {
- sp->colorchange = 0;
- if (++sp->colorp >= MI_NPIXELS(mi))
- sp->colorp = 0;
- sp->color = MI_PIXEL(mi, sp->colorp);
- }
-}
-
-ENTRYPOINT void
-free_bouboule(ModeInfo * mi)
-{
- StarField *sp = &starfield[MI_SCREEN(mi)];
-
- if (sp->star)
- (void) free((void *) sp->star);
- if (sp->xarc)
- (void) free((void *) sp->xarc);
- if (sp->xarcleft)
- (void) free((void *) sp->xarcleft);
-#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
- if (sp->oldxarc)
- (void) free((void *) sp->oldxarc);
- if (sp->oldxarcleft)
- (void) free((void *) sp->oldxarcleft);
-#endif
- sinfree(&(sp->x));
- sinfree(&(sp->y));
- sinfree(&(sp->z));
- sinfree(&(sp->sizex));
- sinfree(&(sp->sizey));
- sinfree(&(sp->thetax));
- sinfree(&(sp->thetay));
- sinfree(&(sp->thetaz));
-}
-
-ENTRYPOINT void
-reshape_bouboule(ModeInfo * mi, int width, int height)
-{
- StarField *sp = &starfield[MI_SCREEN(mi)];
- sp->width = width;
- sp->height = height;
- sininit(&sp->x,
- sp->x.alpha, sp->x.step,
- ((double) sp->width) / 4.0,
- 3.0 * ((double) sp->width) / 4.0,
- POSCANRAND);
- sininit(&sp->y,
- sp->y.alpha, sp->y.step,
- ((double) sp->height) / 4.0,
- 3.0 * ((double) sp->height) / 4.0,
- POSCANRAND);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_bouboule(ModeInfo * mi)
-{
- /* Do nothing, it will refresh by itself */
-}
-#endif
-
-XSCREENSAVER_MODULE ("Bouboule", bouboule)
diff --git a/hacks/bouboule.man b/hacks/bouboule.man
deleted file mode 100644
index cc50c28..0000000
--- a/hacks/bouboule.man
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH XScreenSaver 1 "15-May-97" "X Version 11"
-.SH NAME
-bouboule \- draws spinning 3D blobs
-.SH SYNOPSIS
-.B bouboule
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIbouboule\fP program draws spinning 3D blobs.
-.SH OPTIONS
-.I bouboule
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 64.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-3d
-Do red/blue 3d separations (for 3d glasses.)
-
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 by Jeremie Petit.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-
-.SH AUTHOR
-Jeremie Petit <jpetit@essi.fr>, 1996.
-
-3D support by Henrik Theiling <theiling@coli-uni-sb.de>, 04-Sep-96.
-
-VMS support by Jouk Jansen <joukj@alpha.chem.uva.nl>, 01-Feb-96.
-
-TrueColor support by David Bagley <bagleyd@bigfoot.com>, 01-Feb-96.
-
-Ability to run standalone or with \fIxscreensaver\fP added by
-Jamie Zawinski <jwz@jwz.org>, 15-May-97.
diff --git a/hacks/boxfit.c b/hacks/boxfit.c
deleted file mode 100644
index 09d2ef7..0000000
--- a/hacks/boxfit.c
+++ /dev/null
@@ -1,567 +0,0 @@
-/* xscreensaver, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Boxfit -- fills space with a gradient of growing boxes or circles.
- *
- * Written by jwz, 21-Feb-2005.
- *
- * Inspired by http://www.levitated.net/daily/levBoxFitting.html
- */
-
-#include "screenhack.h"
-#include <stdio.h>
-#include "ximage-loader.h"
-
-#define ALIVE 1
-#define CHANGED 2
-#define UNDEAD 4
-
-typedef struct {
- unsigned long fill_color;
- short x, y, w, h;
- char flags;
-} box;
-
-typedef struct {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- GC gc;
- unsigned long fg_color, bg_color;
- int border_size;
- int spacing;
- int inc;
-
- int mode;
- Bool circles_p;
- Bool growing_p;
- Bool color_horiz_p;
-
- int box_count;
- int boxes_size;
- int nboxes;
- box *boxes;
-
- XImage *image;
- int ncolors;
- XColor *colors;
- int delay;
- int countdown;
-
- Bool done_once;
- async_load_state *img_loader;
- Pixmap loading_pixmap;
-
-} state;
-
-
-static void
-reset_boxes (state *st)
-{
- st->nboxes = 0;
- st->growing_p = True;
- st->color_horiz_p = random() & 1;
-
- if (st->done_once && st->colors)
- free_colors (st->xgwa.screen, st->xgwa.colormap, st->colors, st->ncolors);
-
- if (!st->done_once)
- {
- char *s = get_string_resource (st->dpy, "mode", "Mode");
- if (!s || !*s || !strcasecmp (s, "random"))
- st->mode = -1;
- else if (!strcasecmp (s, "squares") || !strcasecmp (s, "square"))
- st->mode = 0;
- else if (!strcasecmp (s, "circles") || !strcasecmp (s, "circle"))
- st->mode = 1;
- else
- {
- fprintf (stderr,
- "%s: mode must be random, squares, or circles, not '%s'\n",
- progname, s);
- exit (1);
- }
- free (s);
- }
-
- if (st->mode == -1)
- st->circles_p = random() & 1;
- else
- st->circles_p = (st->mode == 1);
-
- st->done_once = True;
-
- if (st->image || get_boolean_resource (st->dpy, "grab", "Boolean"))
- {
- if (st->image) XDestroyImage (st->image);
- st->image = 0;
-
- if (st->loading_pixmap) abort();
- if (st->img_loader) abort();
- if (!get_boolean_resource (st->dpy, "peek", "Boolean"))
- st->loading_pixmap = XCreatePixmap (st->dpy, st->window,
- st->xgwa.width, st->xgwa.height,
- st->xgwa.depth);
-
- XClearWindow (st->dpy, st->window);
- st->img_loader = load_image_async_simple (0, st->xgwa.screen,
- st->window,
- (st->loading_pixmap
- ? st->loading_pixmap
- : st->window),
- 0, 0);
- }
- else
- {
- st->ncolors = get_integer_resource (st->dpy, "colors", "Colors"); /* re-get */
- if (st->ncolors < 1) st->ncolors = 1;
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors, True, 0, False);
- if (st->ncolors < 1) abort();
- XClearWindow (st->dpy, st->window);
- }
-}
-
-
-static void
-reshape_boxes (state *st)
-{
- int i;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
- for (i = 0; i < st->nboxes; i++)
- {
- box *b = &st->boxes[i];
- b->flags |= CHANGED;
- }
-}
-
-static void *
-boxfit_init (Display *dpy, Window window)
-{
- XGCValues gcv;
- state *st = (state *) calloc (1, sizeof (*st));
-
- st->dpy = dpy;
- st->window = window;
- st->delay = get_integer_resource (dpy, "delay", "Integer");
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-/* XSelectInput (dpy, window, st->xgwa.your_event_mask | ExposureMask);*/
-
- if (! get_boolean_resource (dpy, "grab", "Boolean"))
- {
- st->ncolors = get_integer_resource (dpy, "colors", "Colors");
- if (st->ncolors < 1) st->ncolors = 1;
- st->colors = (XColor *) malloc (sizeof(XColor) * st->ncolors);
- }
-
- st->inc = get_integer_resource (dpy, "growBy", "GrowBy");
- st->spacing = get_integer_resource (dpy, "spacing", "Spacing");
- st->border_size = get_integer_resource (dpy, "borderSize", "BorderSize");
- st->fg_color = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- st->bg_color = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "background", "Background");
- if (st->inc < 1) st->inc = 1;
- if (st->border_size < 0) st->border_size = 0;
-
- gcv.line_width = st->border_size;
- gcv.background = st->bg_color;
- st->gc = XCreateGC (st->dpy, st->window, GCBackground|GCLineWidth, &gcv);
-
- st->box_count = get_integer_resource (dpy, "boxCount", "BoxCount");
- if (st->box_count < 1) st->box_count = 1;
-
- st->nboxes = 0;
- st->boxes_size = st->box_count * 2;
- st->boxes = (box *) calloc (st->boxes_size, sizeof(*st->boxes));
-
- reset_boxes (st);
-
- reshape_boxes (st);
- return st;
-}
-
-
-
-static Bool
-boxes_overlap_p (box *a, box *b, int pad)
-{
- /* Two rectangles overlap if the max of the tops is less than the
- min of the bottoms and the max of the lefts is less than the min
- of the rights.
- */
-# undef MAX
-# undef MIN
-# define MAX(A,B) ((A)>(B)?(A):(B))
-# define MIN(A,B) ((A)<(B)?(A):(B))
-
- int maxleft = MAX(a->x - pad, b->x);
- int maxtop = MAX(a->y - pad, b->y);
- int minright = MIN(a->x + a->w + pad + pad - 1, b->x + b->w);
- int minbot = MIN(a->y + a->h + pad + pad - 1, b->y + b->h);
- return (maxtop < minbot && maxleft < minright);
-}
-
-
-static Bool
-circles_overlap_p (box *a, box *b, int pad)
-{
- int ar = a->w/2; /* radius */
- int br = b->w/2;
- int ax = a->x + ar; /* center */
- int ay = a->y + ar;
- int bx = b->x + br;
- int by = b->y + br;
- int d2 = (((bx - ax) * (bx - ax)) + /* distance between centers squared */
- ((by - ay) * (by - ay)));
- int r2 = ((ar + br + pad) * /* sum of radii squared */
- (ar + br + pad));
- return (d2 < r2);
-}
-
-
-static Bool
-box_collides_p (state *st, box *a, int pad)
-{
- int i;
-
- /* collide with wall */
- if (a->x - pad < 0 ||
- a->y - pad < 0 ||
- a->x + a->w + pad + pad >= st->xgwa.width ||
- a->y + a->h + pad + pad >= st->xgwa.height)
- return True;
-
- /* collide with another box */
- for (i = 0; i < st->nboxes; i++)
- {
- box *b = &st->boxes[i];
- if (a != b &&
- (st->circles_p
- ? circles_overlap_p (a, b, pad)
- : boxes_overlap_p (a, b, pad)))
- return True;
- }
-
- return False;
-}
-
-
-static unsigned int
-grow_boxes (state *st)
-{
- int inc2 = st->inc + st->spacing + st->border_size;
- int i;
- int live_count = 0;
-
- /* check box collisions, and grow if none.
- */
- for (i = 0; i < st->nboxes; i++)
- {
- box *a = &st->boxes[i];
- if (!(a->flags & ALIVE)) continue;
-
- if (box_collides_p (st, a, inc2))
- {
- a->flags &= ~ALIVE;
- continue;
- }
-
- live_count++;
- a->x -= st->inc;
- a->y -= st->inc;
- a->w += st->inc + st->inc;
- a->h += st->inc + st->inc;
- a->flags |= CHANGED;
- }
-
- /* Add more boxes.
- */
- while (live_count < st->box_count)
- {
- box *a;
- st->nboxes++;
- if (st->boxes_size <= st->nboxes)
- {
- st->boxes_size = (st->boxes_size * 1.2) + st->nboxes;
- st->boxes = (box *)
- realloc (st->boxes, st->boxes_size * sizeof(*st->boxes));
- if (! st->boxes)
- {
- fprintf (stderr, "%s: out of memory (%d boxes)\n",
- progname, st->boxes_size);
- exit (1);
- }
- }
-
- a = &st->boxes[st->nboxes-1];
- a->flags = CHANGED;
-
- for (i = 0; i < 100; i++)
- {
- a->x = inc2 + (random() % (st->xgwa.width - inc2));
- a->y = inc2 + (random() % (st->xgwa.height - inc2));
- a->w = 0;
- a->h = 0;
-
- if (! box_collides_p (st, a, inc2))
- {
- a->flags |= ALIVE;
- live_count++;
- break;
- }
- }
-
- if (! (a->flags & ALIVE) || /* too many retries; */
- st->nboxes > 65535) /* that's about 1MB of box structs. */
- {
- st->nboxes--; /* go into "fade out" mode now. */
- st->growing_p = False;
- return 2000000; /* make customizable... */
- }
-
- /* Pick colors for this box */
- if (st->image)
- {
- int w = st->image->width;
- int h = st->image->height;
- a->fill_color = XGetPixel (st->image, a->x % w, a->y % h);
- }
- else
- {
- int n = (st->color_horiz_p
- ? (a->x * st->ncolors / st->xgwa.width)
- : (a->y * st->ncolors / st->xgwa.height));
- a->fill_color = st->colors [n % st->ncolors].pixel;
- }
- }
-
- return st->delay;
-}
-
-
-static unsigned int
-shrink_boxes (state *st)
-{
- int i;
- int remaining = 0;
-
- for (i = 0; i < st->nboxes; i++)
- {
- box *a = &st->boxes[i];
-
- if (a->w <= 0 || a->h <= 0) continue;
-
- a->x += st->inc;
- a->y += st->inc;
- a->w -= st->inc + st->inc;
- a->h -= st->inc + st->inc;
- a->flags |= CHANGED;
- if (a->w < 0) a->w = 0;
- if (a->h < 0) a->h = 0;
-
- if (a->w > 0 && a->h > 0)
- remaining++;
- }
-
- if (remaining == 0) {
- reset_boxes (st);
- return 1000000;
- } else {
- return st->delay;
- }
-}
-
-
-static void
-draw_boxes (state *st)
-{
- int i;
- for (i = 0; i < st->nboxes; i++)
- {
- box *b = &st->boxes[i];
-
- if (b->flags & UNDEAD) continue;
- if (! (b->flags & CHANGED)) continue;
- b->flags &= ~CHANGED;
-
- if (!st->growing_p)
- {
- /* When shrinking, black out an area outside of the border
- before re-drawing the box.
- */
- int margin = st->inc + st->border_size;
-
- XSetForeground (st->dpy, st->gc, st->bg_color);
- if (st->circles_p)
- XFillArc (st->dpy, st->window, st->gc,
- b->x - margin, b->y - margin,
- b->w + (margin*2), b->h + (margin*2),
- 0, 360*64);
- else
- XFillRectangle (st->dpy, st->window, st->gc,
- b->x - margin, b->y - margin,
- b->w + (margin*2), b->h + (margin*2));
-
- if (b->w <= 0 || b->h <= 0)
- b->flags |= UNDEAD; /* really very dead now */
- }
-
- if (b->w <= 0 || b->h <= 0) continue;
-
- XSetForeground (st->dpy, st->gc, b->fill_color);
-
- if (st->circles_p)
- XFillArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
- 0, 360*64);
- else
- XFillRectangle (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h);
-
- if (st->border_size > 0)
- {
- unsigned int bd = (st->image
- ? st->fg_color
- : st->colors [(b->fill_color + st->ncolors/2)
- % st->ncolors].pixel);
- XSetForeground (st->dpy, st->gc, bd);
- if (st->circles_p)
- XDrawArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
- 0, 360*64);
- else
- XDrawRectangle (st->dpy, st->window, st->gc,
- b->x, b->y, b->w, b->h);
- }
- }
-}
-
-
-static unsigned long
-boxfit_draw (Display *dpy, Window window, void *closure)
-{
- state *st = (state *) closure;
- int delay;
-
- if (st->img_loader) /* still loading */
- {
- st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
- if (! st->img_loader) /* just finished */
- {
- st->image = XGetImage (st->dpy,
- (st->loading_pixmap ? st->loading_pixmap :
- st->window),
- 0, 0,
- st->xgwa.width, st->xgwa.height, ~0L,
- ZPixmap);
- if (st->loading_pixmap) XFreePixmap (st->dpy, st->loading_pixmap);
- XSetWindowBackground (st->dpy, st->window, st->bg_color);
- if (st->loading_pixmap)
- XClearWindow (st->dpy, st->window);
- else
- st->countdown = 2000000;
- st->loading_pixmap = 0;
- }
- return st->delay;
- }
-
- if (st->countdown > 0)
- {
- st->countdown -= st->delay;
- if (st->countdown <= 0)
- {
- st->countdown = 0;
- XClearWindow (st->dpy, st->window);
- }
- return st->delay;
- }
-
- if (st->growing_p) {
- draw_boxes (st);
- delay = grow_boxes (st);
- } else {
- delay = shrink_boxes (st);
- draw_boxes (st);
- }
- return delay;
-}
-
-static void
-boxfit_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- state *st = (state *) closure;
- reshape_boxes (st);
-}
-
-static Bool
-boxfit_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- state *st = (state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->growing_p = !st->growing_p;
- return True;
- }
- return False;
-}
-
-static void
-boxfit_free (Display *dpy, Window window, void *closure)
-{
- state *st = (state *) closure;
- if (st->boxes) free (st->boxes);
- if (st->colors) free (st->colors);
- XFreeGC (dpy, st->gc);
- free (st);
-}
-
-
-static const char *boxfit_defaults [] = {
- ".background: black",
- ".foreground: #444444",
- "*fpsSolid: true",
- "*delay: 20000",
- "*mode: random",
- "*colors: 64",
- "*boxCount: 50",
- "*growBy: 1",
- "*spacing: 1",
- "*borderSize: 1",
- "*grab: False",
- "*peek: False",
- "*grabDesktopImages: False", /* HAVE_JWXYZ */
- "*chooseRandomImages: True", /* HAVE_JWXYZ */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
- "*rotateImages: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec boxfit_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-colors", ".colors", XrmoptionSepArg, 0 },
- { "-count", ".boxCount", XrmoptionSepArg, 0 },
- { "-growby", ".growBy", XrmoptionSepArg, 0 },
- { "-spacing", ".spacing", XrmoptionSepArg, 0 },
- { "-border", ".borderSize", XrmoptionSepArg, 0 },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-circles", ".mode", XrmoptionNoArg, "circles" },
- { "-squares", ".mode", XrmoptionNoArg, "squares" },
- { "-random", ".mode", XrmoptionNoArg, "random" },
- { "-grab", ".grab", XrmoptionNoArg, "True" },
- { "-no-grab", ".grab", XrmoptionNoArg, "False" },
- { "-peek", ".peek", XrmoptionNoArg, "True" },
- { "-no-peek", ".peek", XrmoptionNoArg, "False" },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("BoxFit", boxfit)
diff --git a/hacks/boxfit.man b/hacks/boxfit.man
deleted file mode 100644
index 8e14dba..0000000
--- a/hacks/boxfit.man
+++ /dev/null
@@ -1,102 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-boxfit \- fills space with a gradient of growing boxes or circles.
-.SH SYNOPSIS
-.B boxfit
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fIusecs\fP]
-[\-count \fIint\fP]
-[\-growby \fIint\fP]
-[\-spacing \fIint\fP]
-[\-border \fIint\fP]
-[\-circles | \-squares | \-random]
-[\-grab]
-[\-peek]
-[\-fps]
-.SH DESCRIPTION
-Packs the screen with growing boxes or circles, colored according to a
-horizontal or vertical gradient. The objects grow until they touch,
-then stop. When the screen is full, they shrink away and the process
-restarts.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 20000, or about 0.02 seconds.
-.TP 8
-.B \-count \fIint\fP
-How many boxes or circles to animate simultaneously; default 50.
-Smaller numbers yield larger boxes/circles.
-.TP 8
-.B \-growby \fIint\fP
-How many pixels the objects should grow by, each frame. Default 1.
-.TP 8
-.B \-spacing \fIint\fP
-How many pixels of space should be left between the objects. Default 1.
-.TP 8
-.B \-border \fIint\fP
-Thickness of the colored border around each object. Default 1.
-.TP 8
-.B \-circles\fB | \-squares\fP | \-random\fP
-Draw circles, squares, or choose randomly (the default).
-.TP 8
-.B \-grab
-Normally it colors the boxes with a horizontal or vertical gradient.
-If \fI\-grab\fP is specified, it will instead load a random image,
-and color the boxes according to the colors in that image.
-As the picture fills in, some features of the underlying image
-may become recognisable.
-
-When grabbing images, the image will be grabbed from the portion of
-the screen underlying the window, or from the system's video input,
-or from a random file on disk, as indicated by
-the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
-and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
-file; see
-.BR xscreensaver\-settings (1)
-for more details.
-.TP 8
-.B \-peek
-This option says to briefly show you the underlying image before
-beginning. The default is not to show the unadulterated image at all.
-(This only has an effect when \fI\-grab\fP is used.)
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/braid.c b/hacks/braid.c
deleted file mode 100644
index 4f5a77c..0000000
--- a/hacks/braid.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/*-
- * braid --- random braids around a circle and then changes the color in
- * a rotational pattern
- */
-
-#if 0
-static const char sccsid[] = "@(#)braid.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1995 by John Neil.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 01-Nov-2000: Allocation checks
- * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
- * 01-Sep-1995: color knotted components differently, J. Neil.
- * 29-Aug-1995: Written. John Neil <neil@math.idbsu.edu>
- */
-
-#ifdef STANDALONE
-# define MODE_braid
-# define DEFAULTS "*delay: 1000 \n" \
- "*count: 15 \n" \
- "*cycles: 100 \n" \
- "*size: -7 \n" \
- "*ncolors: 64 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True" \
-
-# define UNIFORM_COLORS
-# define free_braid 0
-# define release_braid 0
-# define reshape_braid 0
-# define braid_handle_event 0
-# include "xlockmore.h"
-#else /* STANDALONE */
-# include "xlock.h"
-# define ENTRYPOINT /**/
-#endif /* STANDALONE */
-
-#ifdef MODE_braid
-
-ENTRYPOINT ModeSpecOpt braid_opts = {0, NULL, 0, NULL, NULL};
-
-#ifdef USE_MODULES
-ModStruct braid_description =
-{"braid", "init_braid", "draw_braid", (char *) NULL,
- "refresh_braid", "init_braid", (char *) NULL, &braid_opts,
- 1000, 15, 100, 1, 64, 1.0, "",
- "Shows random braids and knots", 0, NULL};
-
-#endif
-
-#if defined( COLORROUND ) && defined( COLORCOMP )
-#undef COLORROUND
-#undef COLORCOMP
-#endif
-
-#if !defined( COLORROUND ) && !defined( COLORCOMP )
-#if 0
-/* to color in a circular pattern use COLORROUND */
-#define COLORROUND
-#else
-/* to color by component use COLORCOMP */
-#define COLORCOMP
-#endif
-#endif
-
-#define MAXLENGTH 50 /* the maximum length of a braid word */
-#define MINLENGTH 8 /* the minimum length of a braid word */
-#define MAXSTRANDS 15 /* the maximum number of strands in the braid */
-#define MINSTRANDS 3 /* the minimum number of strands in the braid */
-#define SPINRATE 12.0 /* the rate at which the colors spin */
-
-#define INTRAND(min,max) (NRAND((max+1)-(min))+(min))
-#define FLOATRAND(min,max) ((min)+((double) LRAND()/((double) MAXRAND))*((max)-(min)))
-
-typedef struct {
- int linewidth;
- int braidword[MAXLENGTH];
- int components[MAXSTRANDS];
- int startcomp[MAXLENGTH][MAXSTRANDS];
- int nstrands;
- int braidlength;
- float startcolor;
- int center_x;
- int center_y;
- float min_radius;
- float max_radius;
- float top, bottom, left, right;
- int age;
- int color_direction;
-} braidtype;
-
-static braidtype *braids = (braidtype *) NULL;
-
-static int
-applyword(braidtype * braid, int string, int position)
-{
- int i, c;
-
- c = string;
- for (i = position; i < braid->braidlength; i++) {
- if (c == ABS(braid->braidword[i]))
- c--;
- else if (c == ABS(braid->braidword[i]) - 1)
- c++;
- }
- for (i = 0; i < position; i++) {
- if (c == ABS(braid->braidword[i]))
- c--;
- else if (c == ABS(braid->braidword[i]) - 1)
- c++;
- }
- return c;
-}
-
-#if 0
-static int
-applywordto(braidtype * braid, int string, int position)
-{
- int i, c;
-
- c = string;
- for (i = 0; i < position; i++) {
- if (c == ABS(braid->braidword[i])) {
- c--;
- } else if (c == ABS(braid->braidword[i]) - 1) {
- c++;
- }
- }
- return c;
-}
-#endif
-
-static int
-applywordbackto(braidtype * braid, int string, int position)
-{
- int i, c;
-
- c = string;
- for (i = position - 1; i >= 0; i--) {
- if (c == ABS(braid->braidword[i])) {
- c--;
- } else if (c == ABS(braid->braidword[i]) - 1) {
- c++;
- }
- }
- return c;
-}
-
-ENTRYPOINT void
-init_braid(ModeInfo * mi)
-{
- braidtype *braid;
- int used[MAXSTRANDS];
- int i, count, comp, c;
- float min_length;
-
- MI_INIT (mi, braids);
- braid = &braids[MI_SCREEN(mi)];
-
- braid->center_x = MI_WIDTH(mi) / 2;
- braid->center_y = MI_HEIGHT(mi) / 2;
- braid->age = 0;
-
- /* jwz: go in the other direction sometimes. */
- braid->color_direction = ((LRAND() & 1) ? 1 : -1);
-
- MI_CLEARWINDOW(mi);
-
- min_length = (braid->center_x > braid->center_y) ?
- braid->center_y : braid->center_x;
- braid->min_radius = min_length * 0.30;
- braid->max_radius = min_length * 0.90;
-
- if (MI_COUNT(mi) < MINSTRANDS)
- braid->nstrands = MINSTRANDS;
- else
- braid->nstrands = INTRAND(MINSTRANDS,
- MAX(MIN(MIN(MAXSTRANDS, MI_COUNT(mi)),
- (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS));
- braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH -1, braid->nstrands * 6));
-
- for (i = 0; i < braid->braidlength; i++) {
- braid->braidword[i] =
- INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
- if (i > 0)
- while (braid->braidword[i] == -braid->braidword[i - 1])
- braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
- }
-
- while (braid->braidword[0] == -braid->braidword[braid->braidlength - 1])
- braid->braidword[braid->braidlength - 1] =
- INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
-
- do {
- (void) memset((char *) used, 0, sizeof (used));
- count = 0;
- for (i = 0; i < braid->braidlength; i++)
- used[ABS(braid->braidword[i])]++;
- for (i = 0; i < braid->nstrands; i++)
- count += (used[i] > 0) ? 1 : 0;
- if (count < braid->nstrands - 1) {
- braid->braidword[braid->braidlength] =
- INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
- while (braid->braidword[braid->braidlength] ==
- -braid->braidword[braid->braidlength - 1] &&
- braid->braidword[0] == -braid->braidword[braid->braidlength])
- braid->braidword[braid->braidlength] =
- INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
- braid->braidlength++;
- }
- } while (count < braid->nstrands - 1 && braid->braidlength < MAXLENGTH);
-
- braid->startcolor = (MI_NPIXELS(mi) > 2) ?
- (float) NRAND(MI_NPIXELS(mi)) : 0.0;
- /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound,
- JoinRound); */
-
- (void) memset((char *) braid->components, 0, sizeof (braid->components));
- c = 1;
- comp = 0;
- braid->components[0] = 1;
- do {
- i = comp;
- do {
- i = applyword(braid, i, 0);
- braid->components[i] = braid->components[comp];
- } while (i != comp);
- count = 0;
- for (i = 0; i < braid->nstrands; i++)
- if (braid->components[i] == 0)
- count++;
- if (count > 0) {
- for (comp = 0; braid->components[comp] != 0; comp++);
- braid->components[comp] = ++c;
- }
- } while (count > 0);
-
- braid->linewidth = MI_SIZE(mi);
-
- if (braid->linewidth < 0)
- braid->linewidth = NRAND(-braid->linewidth) + 1;
- if (braid->linewidth * braid->linewidth * 8 > MIN(MI_WIDTH(mi), MI_HEIGHT(mi)))
- braid->linewidth = MIN(1, (int) sqrt((double) MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) / 8));
- for (i = 0; i < braid->nstrands; i++)
- if (!(braid->components[i] & 1))
- braid->components[i] *= -1;
-}
-
-ENTRYPOINT void
-draw_braid(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int num_points = 500;
- float t_inc;
- float theta, psi;
- float t, r_diff;
- int i, s;
- float x_1, y_1, x_2, y_2, r1, r2;
- float color, color_use = 0.0, color_inc;
- braidtype *braid;
-
- if (braids == NULL)
- return;
- braid = &braids[MI_SCREEN(mi)];
-
- MI_IS_DRAWN(mi) = True;
- XSetLineAttributes(display, MI_GC(mi), braid->linewidth,
- LineSolid,
- (braid->linewidth <= 3 ? CapButt : CapRound),
- JoinMiter);
-
- theta = (2.0 * M_PI) / (float) (braid->braidlength);
- t_inc = (2.0 * M_PI) / (float) num_points;
- color_inc = (float) MI_NPIXELS(mi) * braid->color_direction /
- (float) num_points;
- braid->startcolor += SPINRATE * color_inc;
- if (((int) braid->startcolor) >= MI_NPIXELS(mi))
- braid->startcolor = 0.0;
-
- r_diff = (braid->max_radius - braid->min_radius) / (float) (braid->nstrands);
-
- color = braid->startcolor;
- psi = 0.0;
- for (i = 0; i < braid->braidlength; i++) {
- psi += theta;
- for (t = 0.0; t < theta; t += t_inc) {
-#ifdef COLORROUND
- color += color_inc;
- if (((int) color) >= MI_NPIXELS(mi))
- color = 0.0;
- color_use = color;
-#endif
- for (s = 0; s < braid->nstrands; s++) {
- if (ABS(braid->braidword[i]) == s)
- continue;
- if (ABS(braid->braidword[i]) - 1 == s) {
- /* crosSINFg */
-#ifdef COLORCOMP
- if (MI_NPIXELS(mi) > 2) {
- color_use = color + SPINRATE *
- braid->components[applywordbackto(braid, s, i)] +
- (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
- while (((int) color_use) >= MI_NPIXELS(mi))
- color_use -= (float) MI_NPIXELS(mi);
- while (((int) color_use) < 0)
- color_use += (float) MI_NPIXELS(mi);
- }
-#endif
-#ifdef COLORROUND
- if (MI_NPIXELS(mi) > 2) {
- color_use += SPINRATE * color_inc;
- while (((int) color_use) >= MI_NPIXELS(mi))
- color_use -= (float) MI_NPIXELS(mi);
- }
-#endif
- r1 = braid->min_radius + r_diff * (float) (s);
- r2 = braid->min_radius + r_diff * (float) (s + 1);
- if (braid->braidword[i] > 0 ||
- (FABSF(t - theta / 2.0) > theta / 7.0)) {
- x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
- 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
- COSF(t + psi) + braid->center_x;
- y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
- 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
- SINF(t + psi) + braid->center_y;
- x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
- 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
- COSF(t + t_inc + psi) + braid->center_x;
- y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
- 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
- SINF(t + t_inc + psi) + braid->center_y;
- if (MI_NPIXELS(mi) > 2)
- XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
- else
- XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
-
- XDrawLine(display, window, MI_GC(mi),
- (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
- }
-#ifdef COLORCOMP
- if (MI_NPIXELS(mi) > 2) {
- color_use = color + SPINRATE *
- braid->components[applywordbackto(braid, s + 1, i)] +
- (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
- while (((int) color_use) >= MI_NPIXELS(mi))
- color_use -= (float) MI_NPIXELS(mi);
- while (((int) color_use) < 0)
- color_use += (float) MI_NPIXELS(mi);
- }
-#endif
- if (braid->braidword[i] < 0 ||
- (FABSF(t - theta / 2.0) > theta / 7.0)) {
- x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
- 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
- COSF(t + psi) + braid->center_x;
- y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
- 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
- SINF(t + psi) + braid->center_y;
- x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
- 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
- COSF(t + t_inc + psi) + braid->center_x;
- y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
- 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
- SINF(t + t_inc + psi) + braid->center_y;
- if (MI_NPIXELS(mi) > 2)
- XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
- else
- XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
-
- XDrawLine(display, window, MI_GC(mi),
- (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
- }
- } else {
- /* no crosSINFg */
-#ifdef COLORCOMP
- if (MI_NPIXELS(mi) > 2) {
- color_use = color + SPINRATE *
- braid->components[applywordbackto(braid, s, i)] +
- (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
- while (((int) color_use) >= MI_NPIXELS(mi))
- color_use -= (float) MI_NPIXELS(mi);
- while (((int) color_use) < 0)
- color_use += (float) MI_NPIXELS(mi);
- }
-#endif
-#ifdef COLORROUND
- if (MI_NPIXELS(mi) > 2) {
- color_use += SPINRATE * color_inc;
- while (((int) color_use) >= MI_NPIXELS(mi))
- color_use -= (float) MI_NPIXELS(mi);
- }
-#endif
- r1 = braid->min_radius + r_diff * (float) (s);
- x_1 = r1 * COSF(t + psi) + braid->center_x;
- y_1 = r1 * SINF(t + psi) + braid->center_y;
- x_2 = r1 * COSF(t + t_inc + psi) + braid->center_x;
- y_2 = r1 * SINF(t + t_inc + psi) + braid->center_y;
- if (MI_NPIXELS(mi) > 2)
- XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
- else
- XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
-
- XDrawLine(display, window, MI_GC(mi),
- (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
- }
- }
- }
- }
- XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinRound);
-
- if (++braid->age > MI_CYCLES(mi)) {
- init_braid(mi);
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_braid(ModeInfo * mi)
-{
- MI_CLEARWINDOW(mi);
-}
-#endif
-
-XSCREENSAVER_MODULE ("Braid", braid)
-
-#endif /* MODE_braid */
diff --git a/hacks/braid.man b/hacks/braid.man
deleted file mode 100644
index 19a3282..0000000
--- a/hacks/braid.man
+++ /dev/null
@@ -1,69 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-braid \- draws random color-cycling braids around a circle
-.SH SYNOPSIS
-.B braid
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIbraid\fP program draws random color-cycling braids around a circle.
-.SH OPTIONS
-.I braid
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 64.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1995 by John Neil.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-John Neil <neil@math.idbsu.edu>, 29-Aug-95.
-
-Ability to run standalone or with \fIxscreensaver\fP added by
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/bsod.c b/hacks/bsod.c
deleted file mode 100644
index 06fcb91..0000000
--- a/hacks/bsod.c
+++ /dev/null
@@ -1,7005 +0,0 @@
-/* xscreensaver, Copyright © 1998-2021 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Blue Screen of Death: the finest in personal computer emulation.
- * Concept cribbed from Stephen Martin <smartin@mks.com>;
- * this version written by jwz, 4-Jun-98.
- * Mostly rewritten by jwz, 20-Feb-2006.
- */
-
-
-/* To add a new mode:
-
- - Define a function `new_os(dpy,win)' that returns a `bsod_state' struct.
- - Draw on the window to set up its frame-zero state. This must be fast:
- no sleeping or long loops!
- - Populate the bsod_state structure with additional actions to take by
- using the various BSOD_ macros. Note that you can control the delays
- when printing text on a per-character or per-line basis.
- - Insert your function in the `all_modes' table.
- - Add a `doXXX' entry to `bsod_defaults'.
- - Add fonts or colors to `bsod_defaults' if necessary.
-
- Look at windows_31() for a simple example.
-
- Look at linux_fsck() for a more complicated example with random behavior.
-
- Or, you can bypass all that: look at nvidia() for a really hairy example.
- */
-
-
-#include "screenhack.h"
-#include "xft.h"
-#include "ximage-loader.h"
-#include "apple2.h"
-
-#include <ctype.h>
-#include <time.h>
-
-#ifdef HAVE_XSHM_EXTENSION
-#include "xshm.h"
-#endif
-
-#ifdef HAVE_UNAME
-# include <sys/utsname.h>
-#endif /* HAVE_UNAME */
-
-#include "images/gen/amiga_png.h"
-#include "images/gen/hmac_png.h"
-#include "images/gen/osx_10_2_png.h"
-#include "images/gen/osx_10_3_png.h"
-#include "images/gen/android_png.h"
-#include "images/gen/ransomware_png.h"
-#include "images/gen/atari_png.h"
-#include "images/gen/mac_png.h"
-#include "images/gen/macbomb_png.h"
-#include "images/gen/apple_png.h"
-#include "images/gen/atm_png.h"
-#include "images/gen/sun_png.h"
-#include "images/gen/dvd_png.h"
-#include "images/gen/gnome1_png.h"
-#include "images/gen/gnome2_png.h"
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-# undef MIN
-# undef MAX
-# define MIN(A,B) ((A)<(B)?(A):(B))
-# define MAX(A,B) ((A)>(B)?(A):(B))
-
-#undef EOF
-typedef enum { EOF=0,
- LEFT, CENTER, RIGHT,
- LEFT_FULL, CENTER_FULL, RIGHT_FULL,
- COLOR, INVERT, MOVETO, MARGINS,
- CURSOR_BLOCK, CURSOR_LINE, RECT, LINE, COPY, PIXMAP, IMG, FONT,
- PAUSE, CHAR_DELAY, LINE_DELAY,
- LOOP, RESET, VERT_MARGINS, CROP,
- WRAP, WORD_WRAP, TRUNCATE
-} bsod_event_type;
-
-struct bsod_event {
- bsod_event_type type;
- void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
-};
-
-struct bsod_state {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- XftFont *font, *fontA, *fontB, *fontC;
- XftDraw *xftdraw;
- XftColor xft_fg, xft_bg;
- unsigned long fg, bg;
- GC gc;
- int left_margin, right_margin; /* for text wrapping */
- int top_margin, bottom_margin; /* for text scrolling and cropping */
- int xoff, yoff;
- Bool wrap_p, word_wrap_p;
- char word_buf[80];
- Bool scroll_p;
- Bool crop_p; /* If True, chops off extra text vertically */
-
- Pixmap pixmap, mask; /* Source image used by BSOD_PIXMAP */
-
- int x, y; /* current text-drawing position */
- int current_left; /* don't use this */
- int last_nonwhite;
-
- int pos; /* position in queue */
- int queue_size;
- struct bsod_event *queue;
-
- unsigned long char_delay; /* delay between printing characters */
- unsigned long line_delay; /* delay between printing lines */
-
- Bool macx_eol_kludge;
-
- void *closure;
- int (*draw_cb) (struct bsod_state *);
- void (*free_cb) (struct bsod_state *);
-
- async_load_state *img_loader;
-};
-
-
-# if !defined(__GNUC__) && !defined(__extension__)
- /* don't warn about "string length is greater than the length ISO C89
- compilers are required to support" in these string constants... */
-# define __extension__ /**/
-# endif
-
-
-/* Draw text at the current position; align is LEFT, CENTER, RIGHT, or *_FULL
- (meaning to clear the whole line margin to margin).
- */
-#define BSOD_TEXT(bst,align,string) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = (align); \
- (bst)->queue[(bst)->pos].arg1 = (void *) strdup (__extension__ (string)); \
- (bst)->queue[(bst)->pos].arg2 = (bst)->queue[(bst)->pos].arg1; \
- (bst)->queue[(bst)->pos].arg3 = (void *) 0; \
- (bst)->pos++; \
- } while (0)
-
-/* Flip the foreground and background colors
- */
-#define BSOD_INVERT(bst) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = INVERT; \
- (bst)->pos++; \
- } while (0)
-
-/* Set the foreground and background colors to the given pixels
- */
-#define BSOD_COLOR(bst,fg,bg) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = COLOR; \
- (bst)->queue[(bst)->pos].arg1 = (void *) fg; \
- (bst)->queue[(bst)->pos].arg2 = (void *) bg; \
- (bst)->pos++; \
- } while (0)
-
-/* Set the position of the next text.
- Note that this is the baseline: lower left corner of next char printed.
- */
-#define BSOD_MOVETO(bst,x,y) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = MOVETO; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (x)); \
- (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (y)); \
- (bst)->pos++; \
- } while (0)
-
-/* Delay for at least the given number of microseconds.
- */
-#define BSOD_PAUSE(bst,usec) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = PAUSE; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (usec)); \
- (bst)->pos++; \
- } while (0)
-
-/* Set the delay after each character is printed.
- */
-#define BSOD_CHAR_DELAY(bst,usec) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = CHAR_DELAY; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (usec)); \
- (bst)->pos++; \
- } while (0)
-
-/* Set the delay after each newline.
- */
-#define BSOD_LINE_DELAY(bst,usec) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = LINE_DELAY; \
- (bst)->queue[(bst)->pos].arg1 = (void *) (usec); \
- (bst)->pos++; \
- } while (0)
-
-/* Set the prevailing left/right margins (used when strings have
- embedded newlines, and when centering or right-justifying text.)
- */
-#define BSOD_MARGINS(bst,left,right) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = MARGINS; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (left)); \
- (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (right)); \
- (bst)->pos++; \
- } while (0)
-
-/* Set the prevailing top/bottom margins (used when scrolling and cropping text)
- */
-#define BSOD_VERT_MARGINS(bst,top,bottom) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = VERT_MARGINS; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (top)); \
- (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (bottom)); \
- (bst)->pos++; \
- } while (0)
-
-/* Draw a blinking cursor; type is CURSOR_BLOCK or CURSOR_LINE.
- usec is how long 1/2 of a cycle is. count is how many times to blink.
- (You can pass a gigantic number if this is the last thing in your mode.)
- */
-#define BSOD_CURSOR(bst,ctype,usec,count) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = (ctype); \
- (bst)->queue[(bst)->pos].arg1 = (void *) (usec); \
- (bst)->queue[(bst)->pos].arg2 = (void *) (count); \
- (bst)->pos++; \
- } while (0)
-
-/* Draw or fill a rectangle. You can set line-width in the GC.
- */
-#define BSOD_RECT(bst,fill,x,y,w,h) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = RECT; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (fill)); \
- (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (x)); \
- (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (y)); \
- (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (w)); \
- (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (h)); \
- (bst)->pos++; \
- } while (0)
-
-/* Draw a line.
- */
-#define BSOD_LINE(bst,x,y,x2,y2,thick) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = LINE; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (x)); \
- (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (y)); \
- (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (x2)); \
- (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (y2)); \
- (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (thick)); \
- (bst)->pos++; \
- } while (0)
-
-/* Copy a rect from the window, to the window.
- */
-#define BSOD_COPY(bst,srcx,srcy,w,h,tox,toy) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = COPY; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (srcx)); \
- (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (srcy)); \
- (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (w)); \
- (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (h)); \
- (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (tox)); \
- (bst)->queue[(bst)->pos].arg6 = (void *) ((long) (toy)); \
- (bst)->pos++; \
- } while (0)
-
-/* Copy a rect from bst->pixmap to the window.
- */
-#define BSOD_PIXMAP(bst,srcx,srcy,w,h,tox,toy) do { \
- BSOD_COPY(bst,srcx,srcy,w,h,tox,toy); \
- (bst)->queue[(bst)->pos-1].type = PIXMAP; \
- } while (0)
-
-/* Load a random image (or the desktop) onto the window.
- */
-#define BSOD_IMG(bst) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = IMG; \
- (bst)->pos++; \
- } while (0)
-
-/* Switch between fonts A, B and C.
- */
-#define BSOD_FONT(bst,n) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = FONT; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (n)); \
- (bst)->pos++; \
- } while (0)
-
-/* Jump around in the state table. You can use this as the last thing
- in your state table to repeat the last N elements forever.
- */
-#define BSOD_LOOP(bst,off) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = LOOP; \
- (bst)->queue[(bst)->pos].arg1 = (void *) (off); \
- (bst)->pos++; \
- } while (0)
-
-/* Restart the whole thing from the beginning.
- */
-#define BSOD_RESET(bst) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = RESET; \
- (bst)->pos++; \
- } while (0)
-
-/* Sets the crop state, if True, will not write text below the bottom_margin
- */
-#define BSOD_CROP(bst, state) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = CROP; \
- (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (state)); \
- (bst)->pos++; \
- } while (0)
-
-#define BSOD_WRAP(bst) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = WRAP; \
- (bst)->pos++; \
- } while (0)
-
-#define BSOD_WORD_WRAP(bst) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = WORD_WRAP; \
- (bst)->pos++; \
- } while (0)
-
-#define BSOD_TRUNCATE(bst) do { \
- ensure_queue (bst); \
- (bst)->queue[(bst)->pos].type = TRUNCATE; \
- (bst)->pos++; \
- } while (0)
-
-
-static void
-ensure_queue (struct bsod_state *bst)
-{
- int n;
- if (bst->pos + 1 < bst->queue_size)
- return;
-
- n = bst->queue_size + 10;
- if (n < 100) n *= 2;
- n *= 1.2;
-
- bst->queue = (struct bsod_event *)
- realloc (bst->queue, n * sizeof(*bst->queue));
- if (!bst->queue) abort();
- memset (bst->queue + bst->queue_size, 0,
- (n - bst->queue_size) * sizeof(*bst->queue));
- bst->queue_size = n;
-}
-
-
-static void
-position_for_text (struct bsod_state *bst, const char *line)
-{
- int max_width = 0;
-
- const char *start = line;
-
- if (bst->queue[bst->pos].type != LEFT &&
- bst->queue[bst->pos].type != LEFT_FULL)
- while (*start)
- {
- XGlyphInfo ov;
- const char *end = start;
- while (*end && *end != '\r' && *end != '\n')
- end++;
-
- XftTextExtentsUtf8 (bst->dpy, bst->font,
- (FcChar8 *) start, end-start, &ov);
- if (ov.xOff > max_width)
- max_width = ov.xOff;
- if (!*end) break;
- start = end+1;
- }
-
- switch (bst->queue[bst->pos].type) {
- case LEFT:
- case LEFT_FULL:
- bst->current_left = bst->left_margin + bst->xoff;
- break;
- case RIGHT:
- case RIGHT_FULL:
- bst->x = max_width - bst->right_margin - bst->xoff;
- bst->current_left = bst->x;
- break;
- case CENTER:
- case CENTER_FULL:
- {
- int w = (bst->xgwa.width - bst->left_margin - bst->right_margin -
- max_width);
- if (w < 0) w = 0;
- bst->x = bst->left_margin + bst->xoff + (w / 2);
- bst->current_left = bst->x;
- break;
- }
- default:
- abort();
- }
-}
-
-
-static void
-bst_crlf (struct bsod_state *bst)
-{
- int lh = bst->font->ascent + bst->font->descent;
- bst->x = bst->current_left;
- if (!bst->scroll_p ||
- bst->y + lh < bst->xgwa.height - bst->bottom_margin - bst->yoff)
- bst->y += lh;
- else
- {
- int w = bst->xgwa.width - bst->right_margin - bst->left_margin;
- int h = bst->xgwa.height - bst->top_margin - bst->bottom_margin;
- XCopyArea (bst->dpy, bst->window, bst->window, bst->gc,
- bst->left_margin + bst->xoff,
- bst->top_margin + bst->yoff + lh,
- w, h - lh,
- bst->left_margin + bst->xoff,
- bst->top_margin + bst->yoff);
- XClearArea (bst->dpy, bst->window,
- bst->left_margin + bst->xoff,
- bst->top_margin + bst->yoff + h - lh, w, lh, False);
- }
-}
-
-
-/* This is slow, use it sparingly. */
-static void
-set_xft_color (Display *dpy, Colormap cmap, XftColor *c, unsigned long pixel)
-{
- XColor xc;
- if (c->pixel == pixel && c->color.alpha)
- return; /* Using alpha as "is initialized" */
- xc.pixel = pixel;
- XQueryColor (dpy, cmap, &xc);
- c->pixel = pixel;
- c->color.red = xc.red;
- c->color.green = xc.green;
- c->color.blue = xc.blue;
- c->color.alpha = 0xFFFF;
-}
-
-
-static void
-draw_char (struct bsod_state *bst, char c)
-{
- if (!c)
- abort();
- else if (bst->crop_p && bst->y >=
- (bst->xgwa.height - bst->bottom_margin - bst->yoff))
- {
- /* reached the bottom of the drawing area, and crop_p = True */
- return;
- }
- else if (c == '\r')
- {
- bst->x = bst->current_left;
- bst->last_nonwhite = bst->x;
- }
- else if (c == '\n')
- {
- if (bst->macx_eol_kludge)
- {
- /* Special case for the weird way OSX crashes print newlines... */
- XGlyphInfo ov;
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- XSetForeground (bst->dpy, bst->gc, bst->bg);
- XFillRectangle (bst->dpy, bst->window, bst->gc,
- bst->x, bst->y - bst->font->ascent,
- ov.width,
- (bst->font->ascent + bst->font->descent) * 2);
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- }
- bst_crlf (bst);
- }
- else if (c == '\b') /* backspace */
- {
- XGlyphInfo ov;
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- bst->x -= ov.xOff;
- if (bst->x < bst->left_margin + bst->xoff)
- bst->x = bst->left_margin + bst->xoff;
- }
- else
- {
- XGlyphInfo ov;
- Bool cursorp = (c == '\033'); /* apparently \e is non-standard now! */
-
- if (cursorp) c = ' ';
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) &c, 1, &ov);
-
- if (bst->x < bst->left_margin)
- bst->x = bst->left_margin;
-
- if ((bst->wrap_p || bst->word_wrap_p) &&
- bst->x + ov.xOff > bst->xgwa.width - bst->right_margin - bst->xoff)
- {
- XGlyphInfo ov2;
- int L = 0;
-
- if (bst->word_wrap_p && *bst->word_buf)
- {
- L = strlen(bst->word_buf);
- XftTextExtentsUtf8 (bst->dpy, bst->font,
- (FcChar8 *) bst->word_buf, L, &ov2);
- }
-
- if (L) /* Erase the truncated wrapped word */
- {
- XSetForeground (bst->dpy, bst->gc, bst->bg);
- XFillRectangle (bst->dpy, bst->window, bst->gc,
- bst->last_nonwhite,
- bst->y - bst->font->ascent,
- ov2.width,
- bst->font->ascent + bst->font->descent);
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- }
-
- bst_crlf (bst);
-
- if (L) /* Draw wrapped partial word on the next line, no delay */
- {
- XftTextExtentsUtf8 (bst->dpy, bst->font,
- (FcChar8 *) bst->word_buf, L, &ov);
- XSetForeground (bst->dpy, bst->gc, bst->bg);
- XFillRectangle (bst->dpy, bst->window, bst->gc,
- bst->x,
- bst->y - bst->font->ascent,
- ov.xOff,
- bst->font->ascent + bst->font->descent);
- XftDrawStringUtf8 (bst->xftdraw, &bst->xft_fg, bst->font,
- bst->x, bst->y,
- (FcChar8 *) bst->word_buf, L);
- bst->x += ov2.width;
- bst->last_nonwhite = bst->x;
- }
- }
-
- /* We render the character ESC as an inverted space (block cursor). */
-
- if (cursorp)
- {
- XftColor cswap = bst->xft_fg;
- unsigned long swap = bst->fg;
- bst->fg = bst->bg;
- bst->xft_fg = bst->xft_bg;
- bst->bg = swap;
- bst->xft_bg = cswap;
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- XSetBackground (bst->dpy, bst->gc, bst->bg);
- }
-
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) &c, 1, &ov);
- XSetForeground (bst->dpy, bst->gc, bst->bg);
- XFillRectangle (bst->dpy, bst->window, bst->gc,
- bst->x,
- bst->y - bst->font->ascent,
- ov.xOff,
- bst->font->ascent + bst->font->descent);
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- XftDrawStringUtf8 (bst->xftdraw, &bst->xft_fg, bst->font,
- bst->x, bst->y, (FcChar8 *) &c, 1);
-
- if (cursorp)
- {
- XftColor cswap = bst->xft_fg;
- unsigned long swap = bst->fg;
- bst->fg = bst->bg;
- bst->xft_fg = bst->xft_bg;
- bst->bg = swap;
- bst->xft_bg = cswap;
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- XSetBackground (bst->dpy, bst->gc, bst->bg);
- c = ' ';
- }
-
- bst->x += ov.xOff;
-
- if (bst->word_wrap_p)
- {
- if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
- {
- bst->word_buf[0] = 0;
- bst->last_nonwhite = bst->x;
- }
- else
- {
- int L = strlen (bst->word_buf);
- if (L >= sizeof(bst->word_buf)-1) abort();
- bst->word_buf[L] = c;
- bst->word_buf[L+1] = 0;
- }
- }
- }
-}
-
-
-static long
-bsod_pop (struct bsod_state *bst)
-{
- bsod_event_type type = bst->queue[bst->pos].type;
-
- if (bst->draw_cb)
- return bst->draw_cb (bst);
-
- if (bst->pos < 0) /* already done */
- abort();
-
- switch (type) {
-
- case LEFT: case LEFT_FULL:
- case CENTER: case CENTER_FULL:
- case RIGHT: case RIGHT_FULL:
- {
- const char *s = (const char *) bst->queue[bst->pos].arg2;
- char c;
-
- if (! *s)
- {
- long delay = bst->line_delay;
- /* Reset the string back to the beginning, in case we loop. */
- bst->queue[bst->pos].arg2 = bst->queue[bst->pos].arg1;
- bst->queue[bst->pos].arg3 = 0;
- bst->queue[bst->pos].type = (bsod_event_type)
- bst->queue[bst->pos].arg4;
- bst->pos++;
- bst->current_left = bst->left_margin + bst->xoff;
- return delay;
- }
-
- if (! bst->queue[bst->pos].arg3) /* "done once" */
- {
- position_for_text (bst, s);
- bst->queue[bst->pos].arg4 = (void *) bst->queue[bst->pos].type;
- bst->queue[bst->pos].type = LEFT;
- bst->word_buf[0] = 0;
- bst->last_nonwhite = bst->x;
-
- if (type == CENTER_FULL ||
- type == LEFT_FULL ||
- type == RIGHT_FULL)
- {
- XSetForeground (bst->dpy, bst->gc, bst->bg);
- XFillRectangle (bst->dpy, bst->window, bst->gc,
- 0,
- bst->y - bst->font->ascent,
- bst->xgwa.width,
- bst->font->ascent + bst->font->descent);
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- }
- }
-
- c = *s++;
- draw_char (bst, c);
- bst->queue[bst->pos].arg2 = (void *) s;
- bst->queue[bst->pos].arg3 = (void *) 1; /* "done once" */
-
- return (c == '\r' || c == '\n'
- ? bst->line_delay
- : bst->char_delay);
- }
- case INVERT:
- {
- XftColor cswap = bst->xft_fg;
- unsigned long swap = bst->fg;
- bst->fg = bst->bg;
- bst->xft_fg = bst->xft_bg;
- bst->bg = swap;
- bst->xft_bg = cswap;
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- XSetBackground (bst->dpy, bst->gc, bst->bg);
- bst->pos++;
- return 0;
- }
- case COLOR:
- {
- bst->fg = (unsigned long) bst->queue[bst->pos].arg1;
- bst->bg = (unsigned long) bst->queue[bst->pos].arg2;
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- XSetBackground (bst->dpy, bst->gc, bst->bg);
- set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_fg, bst->fg);
- bst->pos++;
- return 0;
- }
- case MOVETO:
- {
- bst->x = (long) bst->queue[bst->pos].arg1;
- bst->y = (long) bst->queue[bst->pos].arg2;
- bst->word_buf[0] = 0;
- bst->last_nonwhite = bst->x;
- bst->pos++;
- return 0;
- }
- case RECT:
- {
- int f = (long) bst->queue[bst->pos].arg1;
- int x = (long) bst->queue[bst->pos].arg2;
- int y = (long) bst->queue[bst->pos].arg3;
- int w = (long) bst->queue[bst->pos].arg4;
- int h = (long) bst->queue[bst->pos].arg5;
- if (f)
- XFillRectangle (bst->dpy, bst->window, bst->gc, x, y, w, h);
- else
- XDrawRectangle (bst->dpy, bst->window, bst->gc, x, y, w, h);
- bst->pos++;
- return 0;
- }
- case LINE:
- {
- int x1 = (long) bst->queue[bst->pos].arg1;
- int y1 = (long) bst->queue[bst->pos].arg2;
- int x2 = (long) bst->queue[bst->pos].arg3;
- int y2 = (long) bst->queue[bst->pos].arg4;
- int t = (long) bst->queue[bst->pos].arg5;
- XGCValues gcv;
- gcv.line_width = t;
- XChangeGC (bst->dpy, bst->gc, GCLineWidth, &gcv);
- XDrawLine (bst->dpy, bst->window, bst->gc, x1, y1, x2, y2);
- bst->pos++;
- return 0;
- }
- case COPY:
- case PIXMAP:
- {
- int srcx = (long) bst->queue[bst->pos].arg1;
- int srcy = (long) bst->queue[bst->pos].arg2;
- int w = (long) bst->queue[bst->pos].arg3;
- int h = (long) bst->queue[bst->pos].arg4;
- int tox = (long) bst->queue[bst->pos].arg5;
- int toy = (long) bst->queue[bst->pos].arg6;
-
- /* If ~0, place pixmap at current text pos */
- if (tox == ~0) tox = bst->x;
- if (toy == ~0) toy = bst->y - bst->font->ascent;
-
- if (type == PIXMAP && bst->mask)
- {
- XSetClipMask (bst->dpy, bst->gc, bst->mask);
- XSetClipOrigin (bst->dpy, bst->gc, tox, toy);
- }
- XCopyArea (bst->dpy,
- (type == PIXMAP ? bst->pixmap : bst->window),
- bst->window, bst->gc,
- srcx, srcy, w, h, tox, toy);
- if (type == PIXMAP && bst->mask)
- XSetClipMask (bst->dpy, bst->gc, None);
- bst->pos++;
- return 0;
- }
- case IMG:
- {
- if (bst->img_loader) abort();
- bst->img_loader = load_image_async_simple (0, bst->xgwa.screen,
- bst->window, bst->window,
- 0, 0);
- bst->pos++;
- return 0;
- }
- case FONT:
- {
- switch ((long) bst->queue[bst->pos].arg1) {
- case 0: bst->font = bst->fontA; break;
- case 1: bst->font = bst->fontB; break;
- case 2: bst->font = bst->fontC; break;
- default: abort(); break;
- }
- bst->pos++;
- return 0;
- }
- case PAUSE:
- {
- long delay = (long) bst->queue[bst->pos].arg1;
- bst->pos++;
- return delay;
- }
- case CHAR_DELAY:
- {
- bst->char_delay = (long) bst->queue[bst->pos].arg1;
- bst->pos++;
- return 0;
- }
- case LINE_DELAY:
- {
- bst->line_delay = (long) bst->queue[bst->pos].arg1;
- bst->pos++;
- return 0;
- }
- case MARGINS:
- {
- bst->left_margin = (long) bst->queue[bst->pos].arg1;
- bst->right_margin = (long) bst->queue[bst->pos].arg2;
- bst->pos++;
- return 0;
- }
- case VERT_MARGINS:
- {
- bst->top_margin = (long) bst->queue[bst->pos].arg1;
- bst->bottom_margin = (long) bst->queue[bst->pos].arg2;
- bst->pos++;
- return 0;
- }
- case CURSOR_BLOCK:
- case CURSOR_LINE:
- {
- long delay = (long) bst->queue[bst->pos].arg1;
- long count = (long) bst->queue[bst->pos].arg2;
- int ox = bst->x;
-
- if (type == CURSOR_BLOCK)
- {
- XGlyphInfo ov;
- XftColor cswap = bst->xft_fg;
- unsigned long swap = bst->fg;
- bst->fg = bst->bg;
- bst->xft_fg = bst->xft_bg;
- bst->bg = swap;
- bst->xft_bg = cswap;
- XSetForeground (bst->dpy, bst->gc, bst->fg);
- XSetBackground (bst->dpy, bst->gc, bst->bg);
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- XFillRectangle (bst->dpy, bst->window, bst->gc,
- bst->x, bst->y - bst->font->ascent,
- ov.width,
- bst->font->ascent + bst->font->descent);
- draw_char (bst, ' ');
- }
- else
- {
- draw_char (bst, (count & 1 ? ' ' : '_'));
- draw_char (bst, ' ');
- }
-
- bst->x = ox;
-
- count--;
- bst->queue[bst->pos].arg2 = (void *) count;
- if (count <= 0)
- bst->pos++;
-
- return delay;
- }
- case WRAP:
- bst->wrap_p = 1;
- bst->word_wrap_p = 0;
- bst->pos++;
- return 0;
-
- case WORD_WRAP:
- bst->wrap_p = 0;
- bst->word_wrap_p = 1;
- bst->pos++;
- return 0;
-
- case TRUNCATE:
- bst->wrap_p = 0;
- bst->word_wrap_p = 0;
- bst->pos++;
- return 0;
-
- case LOOP:
- {
- long off = (long) bst->queue[bst->pos].arg1;
- bst->pos += off;
- if (bst->pos < 0 || bst->pos >= bst->queue_size)
- abort();
- return 0;
- }
- case RESET:
- {
- int i;
- for (i = 0; i < bst->queue_size; i++)
- switch (bst->queue[i].type) {
- case LEFT: case LEFT_FULL:
- case CENTER: case CENTER_FULL:
- case RIGHT: case RIGHT_FULL:
- bst->queue[i].arg2 = bst->queue[i].arg1;
- bst->queue[i].arg3 = 0;
- bst->queue[i].type = (bsod_event_type) bst->queue[i].arg4;
- break;
- default: break;
- }
- bst->pos = 0;
- return 0;
- }
- case CROP:
- {
- bst->crop_p = (long) bst->queue[bst->pos].arg1;
- bst->pos++;
- return 0;
- }
- case EOF:
- {
- bst->pos = -1;
- return -1;
- }
- default:
- break;
- }
- abort();
-}
-
-
-static struct bsod_state *
-make_bsod_state (Display *dpy, Window window,
- const char *name, const char *class)
-{
- XGCValues gcv;
- struct bsod_state *bst;
- char buf1[1024], buf2[1024];
- char buf5[1024], buf6[1024];
- char buf7[1024], buf8[1024];
- char *font1, *font3, *font4;
- int screen_no;
-
- bst = (struct bsod_state *) calloc (1, sizeof (*bst));
- bst->queue_size = 10;
- bst->queue = (struct bsod_event *) calloc (bst->queue_size,
- sizeof (*bst->queue));
- bst->dpy = dpy;
- bst->window = window;
- XGetWindowAttributes (dpy, window, &bst->xgwa);
- screen_no = screen_number (bst->xgwa.screen);
-
- /* If the window is small, use ".font"; if big, ".bigFont". */
- if (
-# ifdef HAVE_MOBILE
- 1
-# else
- bst->xgwa.height < 640
-# endif
- )
- {
- sprintf (buf1, "%.100s.font", name);
- sprintf (buf2, "%.100s.font", class);
- }
- else
- {
- sprintf (buf1, "%.100s.bigFont", name);
- sprintf (buf2, "%.100s.bigFont", class);
- }
- sprintf (buf5, "%.100s.fontB", name);
- sprintf (buf6, "%.100s.fontB", class);
- sprintf (buf7, "%.100s.fontC", name);
- sprintf (buf8, "%.100s.fontC", class);
-
- font1 = get_string_resource (dpy, buf1, buf2);
- font3 = get_string_resource (dpy, buf5, buf6);
- font4 = get_string_resource (dpy, buf7, buf8);
-
- /* If there was no ".mode.font" resource also look for ".font".
- Under real X11, the wildcard does this, so this is redundant,
- but jwxyz needs it because it doesn't implement wildcards.
- */
-# define RES2(VAR, BUF1, BUF2) do { \
- if (! VAR) { \
- VAR = get_string_resource (dpy, \
- strchr (BUF1, '.') + 1, \
- strchr (BUF2, '.') + 1); \
- }} while(0)
- RES2 (font1, buf1, buf2);
- RES2 (font3, buf5, buf6);
- RES2 (font4, buf7, buf8);
-#undef RES2
-
- if (font1 && *font1)
- bst->font = load_xft_font_retry (dpy, screen_no, font1);
-
- if (! bst->font)
- abort();
-
- if (font3 && *font3)
- bst->fontB = load_xft_font_retry (dpy, screen_no, font3);
- if (font4 && *font4)
- bst->fontC = load_xft_font_retry (dpy, screen_no, font4);
-
- if (! bst->fontB) bst->fontB = bst->font;
- if (! bst->fontC) bst->fontC = bst->font;
-
- bst->fontA = bst->font;
-
- bst->xftdraw = XftDrawCreate (dpy, bst->window, bst->xgwa.visual,
- bst->xgwa.colormap);
-
- sprintf (buf1, "%.100s.foreground", name);
- sprintf (buf2, "%.100s.Foreground", class);
- bst->fg = gcv.foreground = get_pixel_resource (dpy, bst->xgwa.colormap,
- buf1, buf2);
- set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_fg, bst->fg);
-
- sprintf (buf1, "%.100s.background", name);
- sprintf (buf2, "%.100s.Background", class);
- bst->bg = gcv.background = get_pixel_resource (dpy, bst->xgwa.colormap,
- buf1, buf2);
-
- set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_fg, bst->fg);
- set_xft_color (bst->dpy, bst->xgwa.colormap, &bst->xft_bg, bst->bg);
-
- bst->gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
-
-#ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (dpy, bst->gc, True);
-#endif
-
-# ifdef HAVE_IPHONE
- /* Stupid iPhone X bezel.
- #### This is the worst of all possible ways to do this! But how else?
- This magic number should catch iPhone X and larger, but unfortunately
- also catches iPads which do not have the stupid bezel.
- */
- if (bst->xgwa.width >= 1218 || bst->xgwa.height >= 1218) {
- if (bst->xgwa.width > bst->xgwa.height)
- bst->xoff = 96;
- else
- bst->yoff = 96;
- }
-# endif
-
- bst->left_margin = bst->right_margin = 10;
- bst->x = bst->left_margin + bst->xoff;
- bst->y = bst->font->ascent + bst->left_margin + bst->yoff;
-
- XSetWindowBackground (dpy, window, gcv.background);
-
- if (font1) free (font1);
- if (font3) free (font3);
- if (font4) free (font4);
-
- return bst;
-}
-
-
-static void
-free_bsod_state (struct bsod_state *bst)
-{
- int i;
-
- if (bst->free_cb)
- bst->free_cb (bst);
- if (bst->pixmap)
- XFreePixmap(bst->dpy, bst->pixmap);
- if (bst->mask)
- XFreePixmap(bst->dpy, bst->mask);
-
- XftFontClose (bst->dpy, bst->font);
- if (bst->fontB && bst->fontB != bst->font)
- XftFontClose (bst->dpy, bst->fontB);
- if (bst->fontC && bst->fontC != bst->font)
- XftFontClose (bst->dpy, bst->fontC);
- XFreeGC (bst->dpy, bst->gc);
-
- XftDrawDestroy (bst->xftdraw);
-
- for (i = 0; i < bst->queue_size; i++)
- switch (bst->queue[i].type) {
- case LEFT: case LEFT_FULL:
- case RIGHT: case RIGHT_FULL:
- case CENTER: case CENTER_FULL:
- free ((char *) bst->queue[i].arg1);
- break;
- default:
- break;
- }
-
- free (bst->queue);
- free (bst);
-}
-
-
-static Pixmap
-double_pixmap (Display *dpy, Visual *visual, int depth, Pixmap pixmap,
- int pix_w, int pix_h)
-{
- int x, y;
- Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth);
- XImage *i1 = XGetImage (dpy, pixmap, 0, 0, pix_w, pix_h, ~0L,
- (depth == 1 ? XYPixmap : ZPixmap));
- XImage *i2 = XCreateImage (dpy, visual, depth,
- (depth == 1 ? XYPixmap : ZPixmap), 0, 0,
- pix_w*2, pix_h*2, 8, 0);
- XGCValues gcv;
- GC gc = XCreateGC (dpy, p2, 0, &gcv);
- i2->data = (char *) calloc(i2->height, i2->bytes_per_line);
- for (y = 0; y < pix_h; y++)
- for (x = 0; x < pix_w; x++)
- {
- unsigned long p = XGetPixel(i1, x, y);
- XPutPixel(i2, x*2, y*2, p);
- XPutPixel(i2, x*2+1, y*2, p);
- XPutPixel(i2, x*2, y*2+1, p);
- XPutPixel(i2, x*2+1, y*2+1, p);
- }
- free(i1->data); i1->data = 0;
- XDestroyImage(i1);
- XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height);
- XFreeGC (dpy, gc);
- free(i2->data); i2->data = 0;
- XDestroyImage(i2);
- XFreePixmap(dpy, pixmap);
- return p2;
-}
-
-
-/*****************************************************************************
- *****************************************************************************/
-
-static struct bsod_state *
-windows_31 (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
- int lines = 9;
-
- bst->xoff = bst->left_margin = bst->right_margin = 0;
-
- switch (random() % 8) {
-
- case 0: /* Windows 3.1 */
- case 1:
- case 2:
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "Windows\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- "A fatal exception 0E has occurred at F0AD:42494C4C\n"
- "the current application will be terminated.\n"
- "\n"
- "* Press any key to terminate the current application.\n"
- "* Press CTRL+ALT+DELETE again to restart your computer.\n"
- " You will lose any unsaved information in all applications.\n"
- "\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press any key to continue ");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
- break;
-
- case 3: /* Windows 3.1 */
- case 4:
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "NETSCAPE.EXE\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- " This windows application has stopped responding to the system.\n"
- "\n"
- "* Press ESC to cancel and return to Windows.\n"
- "* Press ENTER to close this application that is not responding.\n"
- " You will lose any unsaved information in this application.\n"
- "* Press CTRL+ALT+DEL again to restart your computer. You will\n"
- " lose any unsaved information in all applications.\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press ENTER for OK or ESC to Cancel: OK\b\b");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
- break;
-
- case 5: /* Windows 95 */
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "Windows\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- "An exception 00 has occurred at 0028:C18580AE in VxD HSFLOP(03) +\n"
- "0000156E. This was called from 0028:C1858AED in VxD HSFLOP(03) +\n"
- "0000F0AD. It may be possible to continue normally.\n"
- "\n"
- "* Press any key to attempt to continue.\n"
- "* Press CTRL+ALT+DEL to restart your computer. You will\n"
- " lose any unsaved information in all applications.\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press any key to continue ");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
- break;
-
- case 6: /* Windows 95 */
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "Windows\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- "A fatal exception 0E has occurred at F0AD:011747F3. The current\n"
- "application will be terminated.\n"
- "\n"
- "* Press any key to terminate the current application.\n"
- "* Press CTRL+ALT+DEL again to restart your computer. You will\n"
- " lose any unsaved information in all applications.\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press any key to continue ");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
- break;
-
- case 7: /* Windows 95 */
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "WARNING!\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- "The system is either busy or has become unstable. You can wait and\n"
- "see if it becomes available again, or you can restart your computer.\n"
- "\n"
- "* Press any key to return to Windows and wait.\n"
- "* Press CTRL+ALT+DEL again to restart your computer. You will\n"
- " lose unsaved information in any programs that are running.\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press any key to continue ");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
- break;
-
- default:
- abort();
- break;
- }
-
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * lines))
- / 2);
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-static struct bsod_state *
-vmware (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "vmware", "VMware");
-
- unsigned long fg = bst->fg;
- unsigned long bg = bst->bg;
- unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "vmware.foreground2",
- "vmware.foreground");
- BSOD_COLOR (bst, fg2, bg);
- BSOD_TEXT (bst, LEFT,
- "VMware ESX Server [Releasebuild-98103]\n");
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, LEFT,
- "PCPU 1 locked up. Failed to ack TLB invalidate.\n"
- "frame=0x3a37d98 ip=0x625e94 cr2=0x0 cr3=0x40c66000 cr4=0x16c\n"
- "es=0xffffffff ds=0xffffffff fs=0xffffffff gs=0xffffffff\n"
- "eax=0xffffffff ebx=0xffffffff ecx=0xffffffff edx=0xffffffff\n"
- "ebp=0x3a37ef4 esi=0xffffffff edi=0xffffffff err=-1 eflags=0xffffffff\n"
- "*0:1037/helper1-4 1:1107/vmm0:Fagi 2:1121/vmware-vm 3:1122/mks:Franc\n"
- "0x3a37ef4:[0x625e94]Panic+0x17 stack: 0x833ab4, 0x3a37f10, 0x3a37f48\n"
- "0x3a37f04:[0x625e94]Panic+0x17 stack: 0x833ab4, 0x1, 0x14a03a0\n"
- "0x3a37f48:[0x64bfa4]TLBDoInvalidate+0x38f stack: 0x3a37f54, 0x40, 0x2\n"
- "0x3a37f70:[0x66da4d]XMapForceFlush+0x64 stack: 0x0, 0x4d3a, 0x0\n"
- "0x3a37fac:[0x652b8b]helpFunc+0x2d2 stack: 0x1, 0x14a4580, 0x0\n"
- "0x3a37ffc:[0x750902]CpuSched_StartWorld+0x109 stack: 0x0, 0x0, 0x0\n"
- "0x3a38000:[0x0]blk_dev+0xfd76461f stack: 0x0, 0x0, 0x0\n"
- "VMK uptime: 7:05:43:45.014 TSC: 1751259712918392\n"
- "Starting coredump to disk\n");
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "using slot 1 of 1... ");
- BSOD_CHAR_DELAY (bst, 300000);
- BSOD_TEXT (bst, LEFT, "9876");
- BSOD_CHAR_DELAY (bst, 3000000);
- BSOD_TEXT (bst, LEFT, "66665");
- BSOD_CHAR_DELAY (bst, 100000);
- BSOD_TEXT (bst, LEFT, "4321");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT, "Disk dump successful.\n"
- "Waiting for Debugger (world 1037)\n"
- "Debugger is listening on serial port ...\n");
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "Press Escape to enter local debugger\n");
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "Remote debugger activated. Local debugger no longer available.\n");
-
-/* BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);*/
-
-/* bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 9))
- / 2);*/
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-/* Windows NT 3.1 - 4.0
- */
-static struct bsod_state *
-windows_nt (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "nt", "NT");
-
- switch (random() % 4) {
- case 0: case 1: case 2:
- BSOD_TEXT (bst, LEFT,
- "*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
- "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
- "\n"
- "Dll Base Date Stamp - Name Dll Base Date Stamp - Name\n"
- "80100000 2be154c9 - ntoskrnl.exe 80400000 2bc153b0 - hal.dll\n"
- "80258000 2bd49628 - ncrc710.sys 8025c000 2bd49688 - SCSIPORT.SYS \n"
- "80267000 2bd49683 - scsidisk.sys 802a6000 2bd496b9 - Fastfat.sys\n"
- "fa800000 2bd49666 - Floppy.SYS fa810000 2bd496db - Hpfs_Rec.SYS\n"
- "fa820000 2bd49676 - Null.SYS fa830000 2bd4965a - Beep.SYS\n"
- "fa840000 2bdaab00 - i8042prt.SYS fa850000 2bd5a020 - SERMOUSE.SYS\n"
- "fa860000 2bd4966f - kbdclass.SYS fa870000 2bd49671 - MOUCLASS.SYS\n"
- "fa880000 2bd9c0be - Videoprt.SYS fa890000 2bd49638 - NCC1701E.SYS\n"
- "fa8a0000 2bd4a4ce - Vga.SYS fa8b0000 2bd496d0 - Msfs.SYS\n"
- "fa8c0000 2bd496c3 - Npfs.SYS fa8e0000 2bd496c9 - Ntfs.SYS\n"
- "fa940000 2bd496df - NDIS.SYS fa930000 2bd49707 - wdlan.sys\n"
- "fa970000 2bd49712 - TDI.SYS fa950000 2bd5a7fb - nbf.sys\n"
- "fa980000 2bd72406 - streams.sys fa9b0000 2bd4975f - ubnb.sys\n"
- "fa9c0000 2bd5bfd7 - usbser.sys fa9d0000 2bd4971d - netbios.sys\n"
- "fa9e0000 2bd49678 - Parallel.sys fa9f0000 2bd4969f - serial.SYS\n"
- "faa00000 2bd49739 - mup.sys faa40000 2bd4971f - SMBTRSUP.SYS\n"
- "faa10000 2bd6f2a2 - srv.sys faa50000 2bd4971a - afd.sys\n"
- "faa60000 2bd6fd80 - rdr.sys faaa0000 2bd49735 - bowser.sys\n"
- "\n"
- "Address dword dump Dll Base - Name\n"
- "801afc20 80106fc0 80106fc0 00000000 00000000 80149905 : "
- "fa840000 - i8042prt.SYS\n"
- "801afc24 80149905 80149905 ff8e6b8c 80129c2c ff8e6b94 : "
- "8025c000 - SCSIPORT.SYS\n"
- "801afc2c 80129c2c 80129c2c ff8e6b94 00000000 ff8e6b94 : "
- "80100000 - ntoskrnl.exe\n"
- "801afc34 801240f2 80124f02 ff8e6df4 ff8e6f60 ff8e6c58 : "
- "80100000 - ntoskrnl.exe\n"
- "801afc54 80124f16 80124f16 ff8e6f60 ff8e6c3c 8015ac7e : "
- "80100000 - ntoskrnl.exe\n"
- "801afc64 8015ac7e 8015ac7e ff8e6df4 ff8e6f60 ff8e6c58 : "
- "80100000 - ntoskrnl.exe\n"
- "801afc70 80129bda 80129bda 00000000 80088000 80106fc0 : "
- "80100000 - ntoskrnl.exe\n"
- "\n"
- "Kernel Debugger Using: COM2 (Port 0x2f8, Baud Rate 19200)\n"
- "Restart and set the recovery options in the system control panel\n"
- "or the /CRASHDEBUG system start option. If this message reappears,\n"
- "contact your system administrator or technical support group."
- );
-
- bst->line_delay = 750;
- break;
-
- case 3:
- BSOD_TEXT (bst, CENTER,
- "Microsoft (R) Windows NT (R) Version 5.0 (Build 1796)\n"
- "1 System Processor [128 MB Memory] MultiProcessor Kernel\n"
- "\n"
- "*** STOP: 0x0000006B (0xC000003A, 0x00000002,0x00000000,0x00000000)\n"
- "PROCESS1_INITIALIZATION_FAILED\n"
- "\n"
- "If this is the first time you[ve seen this Stop error screen,\n"
- "restart your computer. If this screen appears again, follow\n"
- "these steps:\n"
- "\n"
- "Check to make sure any new hardware or software is properly installed.\n"
- "If this is a new installation, ask your hardware or software manufacturer\n"
- "for any Windows NT updates you might need.\n"
- "\n"
- "If problems continue, disable or remove any newly installed hardware\n"
- "or software. Disable BIOS memory options such as caching or shadowing.\n"
- "If you need to use Safe Mode to remove or disable components, restart\n"
- "your computer, press F8 to select Advanced Startup Options, and then\n"
- "select Safe Mode.\n"
- "\n"
- "Refer to your Getting Started manual for more information on\n"
- "troubleshooting Stop errors.\n"
- "\n");
- break;
- default:
- abort();
- }
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_2k (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
-
- switch (random() % 4) {
- case 0: case 1: case 2:
- BSOD_TEXT (bst, LEFT,
- "*** STOP: 0x000000D1 (0xE1D38000,0x0000001C,0x00000000,0xF09D42DA)\n"
- "DRIVER_IRQL_NOT_LESS_OR_EQUAL \n"
- "\n"
- "*** Address F09D42DA base at F09D4000, DateStamp 39f459ff - CRASHDD.SYS\n"
- "\n"
- "Beginning dump of physical memory\n");
- BSOD_PAUSE (bst, 4000000);
- BSOD_TEXT (bst, LEFT,
- "Physical memory dump complete. Contact your system administrator or\n"
- "technical support group.\n");
-
- bst->left_margin = 40;
- bst->y = (bst->font->ascent + bst->font->descent) * 10;
- bst->line_delay = 750;
- break;
-
- case 3:
- BSOD_TEXT (bst, CENTER,
- "\n\n\n"
- "*** STOP: 0x0000007B (0xF641F84C,0xC00000034,0x00000000,0x00000000)\n"
- "INACCESSIBLE_BOOT_DEVICE\n"
- "\n"
- "If this is the first time you[ve seen this Stop error screen,\n"
- "restart your computer. If this screen appears again, follow\n"
- "these steps:\n"
- "\n"
- "Check for viruses on your computer. Remove any newly installed\n"
- "hard drives or hard drive controllers. Chcek your hard drive\n"
- "to make sure it is properly configured and terminated.\n"
- "Run CHKDSK /F to check for hard drive corruption, and then\n"
- "restart your computer.\n"
- "\n"
- "Refer to your Getting Started manual for more information on\n"
- "troubleshooting Stop errors.\n"
- "\n"
- "\n");
- break;
-
- default:
- abort();
- }
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_me (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
-
- switch (random() % 3) {
- case 0: case 1:
- BSOD_TEXT (bst, LEFT,
- "Windows protection error. You need to restart your computer.\n\n"
- "System halted.");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
-
- bst->left_margin = 40;
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 3))
- / 2);
- break;
- case 2:
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "Windows\n");
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER,
- "\n"
- "An error has occurred. To continue:\n"
- "\n"
- "Press Enter to return to Windows, or\n"
- "\n"
- "Press CTRL+ALT+DEL to restart your computer. If you do this,\n"
- "you will lose any unsaved information in all open applications.\n"
- "\n"
- "Error: 0E : 015F : FOAD0D0D\n"
- "\n");
- BSOD_TEXT (bst, CENTER, "Press any key to continue ");
- BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 11))
- / 2);
- break;
- default:
- abort();
- }
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_xp (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
-
- switch (random() % 6) {
- case 0: case 1: case 2:
- BSOD_TEXT (bst, LEFT, /* From Wm. Rhodes <xscreensaver@27.org> */
- "A problem has been detected and windows has been shut down to prevent "
- "damage\n"
- "to your computer.\n"
- "\n"
- "If this is the first time you've seen this Stop error screen,\n"
- "restart your computer. If this screen appears again, follow\n"
- "these steps:\n"
- "\n"
- "Check to be sure you have adequate disk space. If a driver is\n"
- "identified in the Stop message, disable the driver or check\n"
- "with the manufacturer for driver updates. Try changing video\n"
- "adapters.\n"
- "\n"
- "Check with your hardware vendor for any BIOS updates. Disable\n"
- "BIOS memory options such as caching or shadowing. If you need\n"
- "to use Safe Mode to remove or disable components, restart your\n"
- "computer, press F8 to select Advanced Startup Options, and then\n"
- "select Safe Mode.\n"
- "\n"
- "Technical information:\n"
- "\n"
- "*** STOP: 0x0000007E (0xC0000005,0xF88FF190,0x0xF8975BA0,0xF89758A0)\n"
- "\n"
- "\n"
- "*** EPUSBDSK.sys - Address F88FF190 base at FF88FE000, datestamp "
- "3b9f3248\n"
- "\n"
- "Beginning dump of physical memory\n");
- BSOD_PAUSE (bst, 4000000);
- BSOD_TEXT (bst, LEFT,
- "Physical memory dump complete.\n"
- "Contact your system administrator or technical support group for "
- "further\n"
- "assistance.\n");
- break;
- case 3: /* Windows XP/Vista/7 */
- BSOD_TEXT (bst, LEFT,
- "STOP: C0000021a {Fatal System Error}\n"
- "The Session Manager Initialization system process terminated"
- " unexpectedly\n"
- "with a status of 0x00000001 (0x00000000 0x00000000).\n"
- "The system has been shut down.\n");
- break;
- case 4: /* Windows CE */
- BSOD_TEXT (bst, LEFT,
- "A error has occurred and Windows CE has been shut down to prevent\n"
- "damage to your computer.\n"
- "If you will try to restart your computer, press Ctrl+Alt+Delete.\n"
- "\n"
- "Technical information:\n"
- "\n"
- "*** STOP: 0x0004c2 (inaccessible embedded device)\n"
- "\n"
- "\n"
- "The computer will restart automatically\n"
- "after 23 seconds.\n");
- break;
- case 5: /* Windows 8 */
- BSOD_TEXT (bst, LEFT,
- "A problem has been detected and windows has been shut down to prevent\n"
- "damage to your computer.\n"
- "\n"
- "SYSTEM_SERVICE_EXCEPTION\n"
- "\n"
- "If this is the first time you[ve seen this Stop error screen,\n"
- "restart your computer. If this screen appears again, follow\n"
- "these steps:\n"
- "\n"
- "Check to make sure any new hardware or software is properly installed.\n"
- "If this is a new installation, ask your hardware or software"
- " manufacturer\n"
- "for any Windows NT updates you might need.\n"
- "\n"
- "If problems continue, disable or remove any newly installed hardware\n"
- "or software. Disable BIOS memory options such as caching or shadowing.\n"
- "If you need to use Safe Mode to remove or disable components, restart\n"
- "your computer, press F8 to select Advanced Startup Options, and then\n"
- "select Safe Mode.\n"
- "\n"
- "Technical information:\n"
- "\n"
- "*** STOP: 0x0000003B (0x00000000c000005,0xFFFFF880041C9062,"
- "0xFFFFF88002E22F60,0x0000000000000000(\n"
- "\n"
- "*** dxgmms1.sys - Address FFFFF880041C9062 base at FFFFF8800418F000,"
- " DateStamp 4cdb7409\n"
- "\n"
- "Collecting data for crash dump ...\n");
- BSOD_PAUSE (bst, 4000000);
- BSOD_TEXT (bst, LEFT,
- "Initializing disk for for crash dump ...\n");
- break;
- default:
- abort();
- }
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_lh (Display *dpy, Window window)
-{
- struct bsod_state *bst =
- make_bsod_state (dpy, window, "windowslh", "WindowsLH");
-
- unsigned long fg = bst->fg;
- unsigned long bg = bst->bg;
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "windowslh.background2",
- "WindowsLH.Background");
-
- /* The "RSOD" that appeared with "Windows Longhorn 5048.050401-0536_x86fre"
- As reported by http://joi.ito.com/RedScreen.jpg
- */
- BSOD_COLOR (bst, bg, bg2);
- BSOD_TEXT (bst, CENTER_FULL, "Windows Boot Error\n");
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, CENTER,
- "\n"
- "Windows Boot Manager has experienced a problem.\n"
- "\n"
- "\n"
- " Status: 0xc000000f\n"
- "\n"
- "\n"
- "\n"
- " Info: An error occurred transferring exectuion." /* (sic) */
- "\n"
- "\n"
- "\n"
- "You can try to recover the system with the Microsoft Windows "
- "System Recovery\n"
- "Tools. (You might need to restart the system manually.)\n"
- "\n"
- "If the problem continues, please contact your system administrator "
- "or computer\n"
- "manufacturer.\n"
- );
- BSOD_MOVETO (bst, bst->left_margin + bst->xoff,
- bst->xgwa.height - bst->yoff - bst->font->descent);
- BSOD_COLOR (bst, bg, bg2);
- BSOD_TEXT (bst, LEFT_FULL, " SPACE=Continue\n");
-
- bst->y = bst->font->ascent;
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_10_update (Display *dpy, Window window)
-{
- struct bsod_state *bst =
- make_bsod_state (dpy, window, "win10", "Win10");
- const char *fmt = "Working on updates %d%%";
- char line1[255];
- const char *line2 = "Don't turn off your PC. This will take a while.";
- const char *line3 = "Your PC will restart several times.";
- int line_height = bst->fontA->ascent + bst->fontA->descent;
- int y1 = bst->xgwa.height / 2 - line_height * 4;
- int y2 = bst->xgwa.height - bst->yoff - line_height * 3;
- int pct;
-
- /* TODO: win10_spinner.gif goes at (y - line_height * 2 - 64). */
-
- for (pct = 0; pct < 98; pct++)
- {
- BSOD_MOVETO (bst, 0, y1);
- sprintf (line1, fmt, pct);
- BSOD_TEXT (bst, CENTER, line1);
- BSOD_MOVETO (bst, 0, y1 + line_height);
- BSOD_TEXT (bst, CENTER, line2);
- BSOD_MOVETO (bst, 0, y2);
- BSOD_TEXT (bst, CENTER, line3);
- BSOD_PAUSE (bst, 200000 + (random() % 3000000) + (random() % 3000000));
- }
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_10 (Display *dpy, Window window)
-{
- struct bsod_state *bst =
- make_bsod_state (dpy, window, "win10", "Win10");
-
- int qr_width = 41;
- int qr_height = 41;
- static const unsigned char qr_bits[] = {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
- 0x03,0x9A,0x70,0xEE,0x80,0x01,0xFB,0x22,0xAA,0xA6,0xBE,0x01,
- 0x8B,0x8E,0x74,0xE7,0xA2,0x01,0x8B,0xEE,0x42,0xC4,0xA2,0x01,
- 0x8B,0x42,0x6E,0xED,0xA2,0x01,0xFB,0xDA,0x63,0xA6,0xBE,0x01,
- 0x03,0xAA,0xAA,0xAA,0x80,0x01,0xFF,0x8B,0xD8,0x9D,0xFF,0x01,
- 0x63,0x62,0xDA,0x1B,0x98,0x01,0x6F,0x67,0x98,0x9F,0xBC,0x01,
- 0x4F,0xCC,0x55,0x81,0x83,0x01,0xB7,0x6D,0xFF,0x68,0xB2,0x01,
- 0xC3,0x10,0x87,0x8B,0x96,0x01,0x6F,0xB1,0x91,0x58,0x94,0x01,
- 0xE3,0x36,0x88,0x84,0xB8,0x01,0x83,0x9B,0xFE,0x59,0xD7,0x01,
- 0x3B,0x74,0x98,0x5C,0xB4,0x01,0x37,0x75,0xDC,0x91,0xA6,0x01,
- 0x77,0xDE,0x01,0x54,0xBA,0x01,0xBB,0x6D,0x8B,0xB9,0xB5,0x01,
- 0x1F,0x06,0xBD,0x9B,0xB4,0x01,0xD3,0xBD,0x91,0x19,0x84,0x01,
- 0x0B,0x20,0xD8,0x91,0xB4,0x01,0x33,0x95,0xBC,0x0A,0xD5,0x01,
- 0xB3,0x60,0xDC,0xD9,0xB6,0x01,0xEF,0x77,0x18,0x09,0xA4,0x01,
- 0xA3,0xC2,0x95,0x51,0xB2,0x01,0xDF,0x63,0xDB,0xBE,0xB3,0x01,
- 0x03,0x08,0xC9,0x09,0xF0,0x01,0xFF,0xA3,0x19,0xBD,0xFB,0x01,
- 0x03,0x2E,0x84,0xA5,0xAA,0x01,0xFB,0x9A,0xFC,0x9B,0xBB,0x01,
- 0x8B,0x7E,0x9C,0x1D,0xB0,0x01,0x8B,0x6E,0x58,0xA1,0xDB,0x01,
- 0x8B,0xDA,0xD5,0x65,0xA2,0x01,0xFB,0x72,0xFB,0xE9,0xF0,0x01,
- 0x03,0x02,0x99,0x3B,0xB3,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0x01};
- Pixmap pixmap;
-
- const char *lines[] = {
- ":(\n",
- "\n",
- "Your PC ran into a problem and needs to restart. We're just\n",
- "collecting some error info, and then we'll restart for you.\n",
- "\n",
- "\n",
- "\n",
- "For more information about this issue and\n",
- "possible fixes, visit\n",
-/* "https://www.jwz.org/xscreensaver\n",*/
- "http://youtu.be/-RjmN9RZyr4\n",
- "\n",
- "If you call a support person, give them this info:\n",
- "Stop code CRITICAL_PROCESS_DIED",
- };
- int i, y = 0, y0 = 0;
- int line_height0 = bst->fontB->ascent;
- int line_height1 = bst->fontA->ascent + bst->fontA->descent;
- int line_height2 = bst->fontC->ascent + bst->fontC->descent;
- int line_height = line_height0;
- int top, left0, left;
- int stop = 60 + (random() % 39);
-
- if (!(random() % 7))
- return windows_10_update (dpy, window);
-
-
- line_height1 *= 1.3;
- line_height2 *= 1.5;
-
- top = ((bst->xgwa.height - bst->yoff
- - (line_height0 * 1 +
- line_height1 * 6 +
- line_height2 * 6))
- / 2);
-
- {
- XGlyphInfo ov;
- const char *s = lines[2];
-
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) s, strlen(s), &ov);
- left = left0 = (bst->xgwa.width - ov.xOff) / 2;
- }
-
- pixmap = XCreatePixmapFromBitmapData (dpy, window, (char *) qr_bits,
- qr_width, qr_height,
- bst->fg, bst->bg, bst->xgwa.depth);
- {
- int n = 2;
- if (bst->xgwa.width > 2560) n++; /* Retina displays */
- for (i = 0; i < n; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, qr_width, qr_height);
- qr_width *= 2;
- qr_height *= 2;
- }
- }
- bst->pixmap = pixmap;
-
- y = top;
- line_height = line_height0;
- BSOD_FONT (bst, 1);
- for (i = 0; i < countof(lines); i++)
- {
- BSOD_MOVETO (bst, left, y);
- BSOD_TEXT (bst, LEFT, lines[i]);
- y += line_height;
- if (i == 0)
- {
- BSOD_FONT (bst, 0);
- line_height = line_height1;
- }
- else if (i == 4)
- {
- y0 = y;
- y += line_height / 2;
- BSOD_PIXMAP (bst, 0, 0, qr_width, qr_height, left, y + line_height1);
- BSOD_FONT (bst, 2);
- line_height = line_height2;
- left += qr_width + line_height2 / 2;
-# ifdef HAVE_MOBILE
- y -= 14;
-# endif
- }
- }
-
- left = left0;
- BSOD_FONT (bst, 0);
- for (i = 0; i <= stop; i++)
- {
- char buf[100];
- sprintf (buf, "%d%% complete", i);
- BSOD_MOVETO (bst, left, y0);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 85000);
- }
- BSOD_PAUSE (bst, 3000000);
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-windows_other (Display *dpy, Window window)
-{
- /* Lump all of the 2K-ish crashes together and select them randomly...
- */
- int which = (random() % 4);
- switch (which) {
- case 0: return windows_2k (dpy, window); break;
- case 1: return windows_me (dpy, window); break;
- case 2: return windows_xp (dpy, window); break;
- case 3: return windows_lh (dpy, window); break;
- default: abort(); break;
- }
-}
-
-/* Windows and Apple2 ransomware.
- */
-static struct bsod_state *apple2ransomware (Display *, Window);
-
-static struct bsod_state *
-windows_ransomware (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window,
- "ransomware", "Ransomware");
- char buf[1024];
-
- int pix_w = 0, pix_h = 0;
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- ransomware_png, sizeof(ransomware_png),
- &pix_w, &pix_h, &mask);
- int i, n = 0;
-
- /* Don't start the countdown from the start, advance the deadline by 3 - 30
- hours */
- int advance_deadline = (random() % 97200) + 10800;
-
- time_t now = time(NULL);
- const time_t stage1_deadline = now + 259200 - advance_deadline; /* 3 days */
- const time_t stage2_deadline = now + 604800 - advance_deadline; /* 7 days */
- char stage1_deadline_str[25], stage2_deadline_str[25];
- char countdown_str[20];
- int countdown_d, countdown_h, countdown_m, countdown_s, countdown_r;
- int line_height = bst->font->ascent + bst->font->descent;
- int line_height1 = bst->fontA->ascent + bst->fontA->descent;
-
- const char *currencies[] = {
- "Blitcoin",
- "Bitcorn",
- "Buttcorn",
- "clicks",
- "clicks",
- "Ass Pennies",
- "Ass Pennies",
- "Dollary-doos",
- "Dunning-Krugerrands",
- "Dunning-Krugerrands",
- "Dunning-Krugerrands",
- "Dunning-Krugerrands",
- "Dunning-Krugerrands",
- "Dunning-Krugerrands",
- "gift certificates",
- "Creepto-Currency",
- "secret sauce",
- "Tribbles",
- };
-
- const char *currency = currencies[random() % countof(currencies)];
-
- const char *header_quips[] = {
- "Oops, your screens have been encrypted!",
- "Oops, your screens have been encrypted!",
- "Oops, your screens have been encrypted!",
- "Oops, your screens have been encrypted!",
- "Oops, your screen have encrypted!",
- "Oops, you're screens have been encrypted!",
- "Oops, your screens have been encrupted!",
- "Oops, your screens have been encrumpet!",
- "Oops, your screens have been encrusted!",
- "If you don't pay this ransom, then you are a theif!",
- "Your screen was subject to the laws of mathomatics!",
- "Oops, your screen was shaved by Occam's Razor!",
- "Oops, your screen was perturbated by Langford's Basilisk!",
- "Your screen is now stored as Snapchat messages!",
- "Oops, your screen is now stored on Betamax!",
- "Oops, your screen is now in the clown!",
- "Oops, your screen has been deprecated!",
- "Oops, you're screen was seized by the FBI!",
- "All your screen was shared with your coworkers!",
- "All your screen are belong to us.",
- "Well actually, your screen isn't needed anymore.",
- "u just got popped with some 0day shit!!",
- "M'lady,",
- };
-
- const char *header_quip = header_quips[random() % countof(header_quips)];
-
- /* You got this because... */
- const char *excuse_quips[] = {
- "all human actions are equivalent and all are on principle doomed "
- "to failure",
- "you hold a diverse portfolio of cryptocurrencies",
- "you need to get in on ransomware futures at the ground floor",
- "your flight was overbooked",
- "you did not apply the security update for bugs NSA keys secret from "
- "Microsoft in your Windows(R) operating system",
- "you are bad and you should feel bad",
- "you used the wifi at defcon",
- "you lack official Clown Strike[TM] threaty threat technology",
- };
-
- const char *excuse_quip = excuse_quips[random() % countof(excuse_quips)];
-
- /* WELL ACTUALLY, screensavers aren't really necessary anymore because... */
- const char *screensaver_quips[] = {
- "I read it on hacker news",
- "that's official Debian policy now",
- "that is the official policy of United Airlines",
- "they cause global warming",
- "they lack an eternal struggle",
- "they lack a vapid dichotomy",
- "those electrons could be used for gold farming instead",
- "you can make more money in art exhibitions",
- };
-
- const char *screensaver_quip =
- screensaver_quips[random() % countof(screensaver_quips)];
-
- const char *lines[] = {
- "*What Happened To My Computer?\n",
- "Your important pixels are paintcrypted. All of your documents, photos, ",
- "videos, databases, icons, dick pics are not accessible because they ",
- "have been bitblted. Maybe you are looking for a way to get them back, ",
- "but don't waste your time. Nobody can recover your pixels without our ",
- "pointer motion clicker services.\n",
- "\n",
- "*Can I Recover My Important Dick Pix?\n",
- "Yes. We guarantee that you can recover them safely and easily. But you ",
- "not have much time.\n",
- "You can expose some files for free. Try it now by pressing <The Any ",
- "Key>.\n",
- "But if you want to unsave all your screens, then you need to pay. ",
- "You have only 3 days to click. After that the clicks will double. ",
- "After 7 days your pixels will be gone forever.\n",
- "We will have free events for cheapskates who can't pay in 6 months, ",
- "long after all the pixels are xored.\n",
- "\n",
- "*How do I pay?\n",
- "Payment is accepted in ", "[C]",
- " only. For more information, press <About ", "[C]", ">.",
- " Please check the current price of ", "[C]", " and buy some ", "[C]",
- ". For more information, press <How to buy ", "[C]", ">.\n",
- "And send the correct amount to the address specified below. After your ",
- "payment, press <Check Payment>. Best time to check: 4-6am, Mon-Fri.\n",
- "\n",
- "*Why Did I Get This?\n",
- "You got this because ", "[Q]",
- ". Also you didn't click hard enough and now Tinkerbelle is dead.\n",
- "\n",
- "*But Aren't Screensavers Are Necessary?\n",
- "WELL ACTUALLY, screensavers aren't really necessary anymore because ",
- "[S]", ".\n",
- "\n",
- "Please file complaints to @POTUS on Twitter.\n",
- "\n"
- "\n"
- "\n"
- "\n",
- "*GREETZ TO CRASH OVERRIDE AND ALSO JOEY\n",
- };
-
- /* Positions of UI elements. Layout:
-
- +---------+-+---------------------------------------+
- | LOGO | | HEADER |
- | | |---------------------------------------|
- | | | NOTE TEXT |
- | DEAD | | |
- | LINE | | |
- | TIMERS | | |
- | | | |
- | | | |
- | | | |
- | | | |
- | | | |
- +---------+ | |
- | LINKS | +---------------------------------------+
- | LINKS | | FOOTER |
- +---------+-+---------------------------------------+
-
- The right side of the UI maximises to available width.
- The note text maximises to available height.
- The logo, header and timers are anchored to the top left of the window.
- The links and footer are anchored to the bottom left of the window.
- The entire window is a fixed 4:3 scale, with a minimum margin around it.
- */
-
- /* main window text */
- unsigned long fg = bst->fg;
- unsigned long bg = bst->bg;
- /* ransom note */
- unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "ransomware.foreground2",
- "Ransomware.Foreground");
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "ransomware.background2",
- "Ransomware.Background");
- /* buttons */
- unsigned long fg3 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "ransomware.foreground3",
- "Ransomware.Foreground");
- unsigned long bg3 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "ransomware.background3",
- "Ransomware.Background");
- /* links */
- unsigned long link = get_pixel_resource (dpy, bst->xgwa.colormap,
- "ransomware.link",
- "Ransomware.Foreground");
- /* headers */
- unsigned long theader = get_pixel_resource (dpy, bst->xgwa.colormap,
- "ransomware.timerheader",
- "Ransomware.Foreground");
- int left_column_width;
- int right_column_width;
- int right_column_height;
- int stage1_countdown_y, stage2_countdown_y;
- int margin;
- int top_height, bottom_height;
- int x, y;
-
- if (bst->xgwa.width > 2560) n++; /* Retina displays */
- for (i = 0; i < n; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1,
- mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
-
- margin = line_height;
- left_column_width = MAX (pix_w, line_height1 * 8);
- right_column_width = MIN (line_height * 40,
- MAX (line_height * 8,
- bst->xgwa.width - left_column_width
- - margin*2));
- top_height = line_height * 2.5;
- bottom_height = line_height * 6;
- right_column_height = MIN (line_height * 36,
- bst->xgwa.height - bottom_height - top_height
- - line_height);
-
- if ((bst->xgwa.width / 4) * 3 > bst->xgwa.height)
- /* Wide screen: keep the big text box at 4:3, centered. */
- right_column_height = MIN (right_column_height,
- right_column_width * 4 / 3);
- else if (right_column_width < line_height * 30)
- /* Tall but narrow screen: make the text box be full height. */
- right_column_height = (bst->xgwa.height - bottom_height - top_height
- - line_height);
-
- x = (bst->xgwa.width - left_column_width - right_column_width - margin) / 2;
- y = (bst->xgwa.height - right_column_height - bottom_height) / 2;
-
- bst->xoff = bst->left_margin = bst->right_margin = 0;
-
- if (!(random() % 8))
- return apple2ransomware (dpy, window);
-
- /* Draw the main red window */
- BSOD_INVERT (bst);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
-
- if (pixmap) {
- bst->pixmap = pixmap;
- bst->mask = mask;
- BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h,
- x + (left_column_width - pix_w) / 2,
- y);
- }
-
- /* Setup deadlines */
- strftime (stage1_deadline_str, sizeof(stage1_deadline_str),
- "%m/%d/%Y %H:%M:%S", localtime(&stage1_deadline));
- strftime (stage2_deadline_str, sizeof(stage1_deadline_str),
- "%m/%d/%Y %H:%M:%S", localtime(&stage2_deadline));
-
- BSOD_INVERT (bst);
- /* Draw header pane */
- BSOD_FONT (bst, 0);
-
- BSOD_MARGINS (bst,
- x + left_column_width + margin,
- bst->xgwa.width -
- (x + left_column_width + margin + right_column_width));
- BSOD_MOVETO (bst, x + left_column_width + margin,
- y + bst->fontA->ascent);
- BSOD_COLOR (bst, fg, bg);
- BSOD_WORD_WRAP (bst);
- BSOD_TEXT (bst, CENTER, header_quip);
- BSOD_TRUNCATE (bst);
-
- /* Draw left-side timers */
- BSOD_MARGINS (bst, x, bst->xgwa.width - (x + left_column_width));
- BSOD_MOVETO (bst, x, y + pix_h + line_height);
- BSOD_FONT (bst, 1);
-
- BSOD_COLOR (bst, theader, bg);
- BSOD_TEXT (bst, CENTER, "Payment will be raised on\n");
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, CENTER, stage1_deadline_str);
-
- stage1_countdown_y = y + pix_h + line_height + line_height1 * 3;
- BSOD_MOVETO (bst, x, stage1_countdown_y - line_height);
- BSOD_TEXT (bst, CENTER, "Time Left");
-
- BSOD_COLOR (bst, theader, bg);
- BSOD_WORD_WRAP (bst);
- BSOD_TEXT (bst, CENTER, "\n\n\n\nYour pixels will be lost on\n");
- BSOD_TRUNCATE (bst);
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, CENTER, stage2_deadline_str);
-
- stage2_countdown_y = stage1_countdown_y + line_height1 * 5;
- BSOD_MOVETO (bst, x, stage2_countdown_y - line_height);
- BSOD_TEXT (bst, CENTER, "Time Left");
-
- BSOD_FONT (bst, 1);
-
- /* Draw links, but skip on small screens */
- if (right_column_height > 425) {
- BSOD_MOVETO (bst, x,
- y + right_column_height + top_height + bottom_height
- - line_height1 * 5);
- BSOD_COLOR (bst, link, bg);
- BSOD_TEXT (bst, LEFT, "\n");
- BSOD_TEXT (bst, LEFT, "About ");
- BSOD_TEXT (bst, LEFT, currency);
- BSOD_TEXT (bst, LEFT, "\n\n"
- "How to buy ");
- BSOD_TEXT (bst, LEFT, currency);
- BSOD_TEXT (bst, LEFT, "\n\n"
- "Contact us\n");
- }
-
- /* Ransom note text area */
- BSOD_COLOR (bst, bg2, fg2);
- BSOD_RECT (bst, True,
- x + left_column_width + margin,
- y + top_height,
- right_column_width,
- right_column_height);
- BSOD_MOVETO (bst,
- x + left_column_width + margin + line_height / 2,
- y + top_height + line_height + line_height / 2);
- BSOD_MARGINS (bst,
- x + left_column_width + margin + line_height / 2,
- bst->xgwa.width -
- (x + left_column_width + margin + right_column_width));
- BSOD_VERT_MARGINS (bst,
- y + top_height + line_height / 2,
- bottom_height - line_height);
- BSOD_INVERT (bst);
-
- /* Write out the ransom note itself */
- BSOD_CROP (bst, True);
- BSOD_WORD_WRAP (bst);
- for (i = 0; i < countof(lines); i++)
- {
- const char *s = lines[i];
- if (!strcmp(s, "[C]")) s = currency;
- else if (!strcmp(s, "[Q]")) s = excuse_quip;
- else if (!strcmp(s, "[S]")) s = screensaver_quip;
-
- if (*s == '*')
- {
- s++;
- BSOD_FONT (bst, 2);
- }
- else
- BSOD_FONT (bst, 0);
-
- BSOD_TEXT (bst, LEFT, s);
- }
- BSOD_TRUNCATE (bst);
- BSOD_CROP (bst, False);
- BSOD_FONT (bst, 0);
-
- /* Draw over any overflowing ransom text. */
- BSOD_COLOR (bst, bg, fg);
- BSOD_RECT (bst, True,
- x + left_column_width + margin,
- y + top_height + right_column_height,
- bst->xgwa.width, bst->xgwa.height);
- BSOD_RECT (bst, True,
- x + left_column_width + margin + right_column_width,
- y + top_height,
- bst->xgwa.width, bst->xgwa.height);
-
- /* Draw the footer */
- BSOD_COLOR (bst, theader, bg);
- BSOD_MOVETO (bst,
- x + left_column_width + margin,
- y + top_height + right_column_height + line_height * 2);
-
- sprintf(buf, "Send $%.2f of %s to this address:\n", 101+frand(888), currency);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_COLOR (bst, fg2, bg2);
-
- /* address, has some extra slashes in there because it's a fake address */
- for (i = 0; i < 40; i++) {
- const char *s =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123459789";
- buf[i] = s[random() % strlen(s)];
- }
- memcpy (buf, " //", 3);
- buf[10] = '/';
- buf[17] = '/';
- buf[24] = '/';
- strcpy (buf+33, " ");
- BSOD_TEXT (bst, LEFT, buf);
-
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, LEFT, " ");
- BSOD_COLOR (bst, fg3, bg3);
- BSOD_TEXT (bst, LEFT, " Copy ");
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, LEFT, "\n\n");
-
- BSOD_COLOR (bst, fg3, bg3);
- BSOD_TEXT (bst, LEFT, " Demogrify Screen ");
- BSOD_COLOR (bst, fg, bg);
- BSOD_TEXT (bst, LEFT, " ");
- BSOD_COLOR (bst, fg3, bg3);
- BSOD_TEXT (bst, LEFT, " Check Payment ");
-
-
- /* Draw countdown timers */
- BSOD_COLOR (bst, fg, bg);
- BSOD_FONT (bst, 0);
- do {
- /* First timer */
- BSOD_MOVETO (bst, x, stage1_countdown_y);
- BSOD_MARGINS (bst, x, bst->xgwa.width - (x + left_column_width));
-
- countdown_r = stage1_deadline - now;
- countdown_s = countdown_r % 60;
- countdown_m = (countdown_r / 60) % 60;
- countdown_h = (countdown_r / 3600) % 24;
- countdown_d = (countdown_r / 86400);
-
- sprintf (countdown_str, "%02d:%02d:%02d:%02d\n",
- countdown_d, countdown_h, countdown_m, countdown_s);
-
- BSOD_TEXT (bst, CENTER, countdown_str);
-
- /* Second timer */
- BSOD_MOVETO (bst, x, stage2_countdown_y);
-
- countdown_r = stage2_deadline - now;
- countdown_s = countdown_r % 60;
- countdown_m = (countdown_r / 60) % 60;
- countdown_h = (countdown_r / 3600) % 24;
- countdown_d = (countdown_r / 86400);
-
- sprintf (countdown_str, "%02d:%02d:%02d:%02d\n",
- countdown_d, countdown_h, countdown_m, countdown_s);
-
- BSOD_TEXT (bst, CENTER, countdown_str);
-
- BSOD_PAUSE (bst, 1000000);
- now++;
-
- /* While the "correct" thing to do is create enough of a script to fill the
- * stage2_deadline, this would be 7 days of "frames", which is quite a bit
- * of memory. Instead, only fill the buffer with 1 hour of frames, which is
- * enough to make the point before xscreensaver cycles us.
- */
- } while (stage1_deadline - now > 3600);
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-/* As seen in Portal 2. By jwz.
- */
-static struct bsod_state *
-glados (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "glaDOS", "GlaDOS");
- const char * panicstr[] = {
- "\n",
- "MOLTEN CORE WARNING\n",
- "\n",
- "An operator error exception has occurred at FISSREAC0020093:09\n",
- "FISSREAC0020077:14 FISSREAC0020023:17 FISSREAC0020088:22\n",
- "neutron multiplication rate at spikevalue 99999999\n",
- "\n",
- "* Press any key to vent radiological emissions into atmosphere.\n",
- "* Consult reactor core manual for instructions on proper reactor core\n",
- "maintenance and repair.\n",
- "\n",
- "Press any key to continue\n",
- };
-
- int i;
-
- bst->xoff = bst->left_margin = bst->right_margin = 0;
-
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * countof(panicstr)))
- / 2);
-
- BSOD_MOVETO (bst, 0, bst->y);
- BSOD_INVERT (bst);
- BSOD_TEXT (bst, CENTER, "OPERATOR ERROR\n");
- BSOD_INVERT (bst);
- for (i = 0; i < countof(panicstr); i++)
- BSOD_TEXT (bst, CENTER, panicstr[i]);
- BSOD_PAUSE (bst, 1000000);
- BSOD_INVERT (bst);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_INVERT (bst);
- BSOD_PAUSE (bst, 250000);
- BSOD_RESET (bst);
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-
-/* SCO OpenServer 5 panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
- */
-static struct bsod_state *
-sco (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "sco", "SCO");
-
- BSOD_TEXT (bst, LEFT,
- "Unexpected trap in kernel mode:\n"
- "\n"
- "cr0 0x80010013 cr2 0x00000014 cr3 0x00000000 tlb 0x00000000\n"
- "ss 0x00071054 uesp 0x00012055 efl 0x00080888 ipl 0x00000005\n"
- "cs 0x00092585 eip 0x00544a4b err 0x004d4a47 trap 0x0000000E\n"
- "eax 0x0045474b ecx 0x0042544b edx 0x57687920 ebx 0x61726520\n"
- "esp 0x796f7520 ebp 0x72656164 esi 0x696e6720 edi 0x74686973\n"
- "ds 0x3f000000 es 0x43494c48 fs 0x43525343 gs 0x4f4d4b53\n"
- "\n"
- "PANIC: k_trap - kernel mode trap type 0x0000000E\n"
- "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n"
- );
- BSOD_CHAR_DELAY (bst, 100000);
- BSOD_TEXT (bst, LEFT,
- "................................................................."
- "..............\n"
- );
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "5023 pages dumped\n"
- "\n"
- "\n"
- );
- BSOD_PAUSE (bst, 2000000);
- BSOD_TEXT (bst, LEFT,
- "** Safe to Power Off **\n"
- " - or -\n"
- "** Press Any Key to Reboot **\n"
- );
-
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 18)));
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-/* Linux (sparc) panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
- */
-static struct bsod_state *
-sparc_linux (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window,
- "sparclinux", "SparcLinux");
- bst->scroll_p = True;
- bst->y = bst->xgwa.height - bst->yoff
- - bst->font->ascent - bst->font->descent;
-
- BSOD_TEXT (bst, LEFT,
- "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
- "Unable to handle kernel paging request at virtual address f0d4a000\n"
- "tsk->mm->context = 00000014\n"
- "tsk->mm->pgd = f26b0000\n"
- " \\|/ ____ \\|/\n"
- " \"@'/ ,. \\`@\"\n"
- " /_| \\__/ |_\\\n"
- " \\__U_/\n"
- "gawk(22827): Oops\n"
- "PSR: 044010c1 PC: f001c2cc NPC: f001c2d0 Y: 00000000\n"
- "g0: 00001000 g1: fffffff7 g2: 04401086 g3: 0001eaa0\n"
- "g4: 000207dc g5: f0130400 g6: f0d4a018 g7: 00000001\n"
- "o0: 00000000 o1: f0d4a298 o2: 00000040 o3: f1380718\n"
- "o4: f1380718 o5: 00000200 sp: f1b13f08 ret_pc: f001c2a0\n"
- "l0: efffd880 l1: 00000001 l2: f0d4a230 l3: 00000014\n"
- "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n"
- "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n"
- "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n"
- "Instruction DUMP:\n"
- );
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-/* BSD Panic by greywolf@starwolf.com - modeled after the Linux panic above.
- By Grey Wolf <greywolf@siteROCK.com>
- */
-static struct bsod_state *
-bsd (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "bsd", "BSD");
-
- const char * const panicstr[] = {
- "panic: ifree: freeing free inode\n",
- "panic: blkfree: freeing free block\n",
- "panic: improbability coefficient below zero\n",
- "panic: cgsixmmap\n",
- "panic: crazy interrupts\n",
- "panic: nmi\n",
- "panic: attempted windows install\n",
- "panic: don't\n",
- "panic: free inode isn't\n",
- "panic: cpu_fork: curproc\n",
- "panic: malloc: out of space in kmem_map\n",
- "panic: vogon starship detected\n",
- "panic: teleport chamber: out of order\n",
- "panic: Brain fried - core dumped\n"
- };
- int i, n, b;
- char syncing[80], bbuf[5];
-
- for (i = 0; i < sizeof(syncing); i++)
- syncing[i] = 0;
-
- i = (random() % (sizeof(panicstr) / sizeof(*panicstr)));
- BSOD_TEXT (bst, LEFT, panicstr[i]);
- BSOD_TEXT (bst, LEFT, "Syncing disks: ");
-
- b = (random() % 40);
- for (n = 0; (n < 20) && (b > 0); n++)
- {
- if (i)
- {
- i = (random() & 0x7);
- b -= (random() & 0xff) % 20;
- if (b < 0)
- b = 0;
- }
- sprintf (bbuf, "%d ", b);
- BSOD_TEXT (bst, LEFT, bbuf);
- BSOD_PAUSE (bst, 1000000);
- }
-
- BSOD_TEXT (bst, LEFT, "\n");
- BSOD_TEXT (bst, LEFT, (b ? "damn!" : "sunk!"));
- BSOD_TEXT (bst, LEFT, "\nRebooting\n");
-
- bst->y = ((bst->xgwa.height - bst->yoff -
- ((bst->font->ascent + bst->font->descent) * 4)));
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-amiga (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "amiga", "Amiga");
-
- const char *guru1 ="Software failure. Press left mouse button to continue.";
- const char *guru2 ="Guru Meditation #00000003.00C01570";
- Pixmap pixmap = 0;
- Pixmap mask = 0;
- int pix_w = 0, pix_h = 0;
- int height;
- int lw = bst->font->ascent + bst->font->descent;
- unsigned long fg = bst->fg;
- unsigned long bg = bst->bg;
-
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "amiga.background2",
- "Amiga.Background");
-
- bst->yoff = 0;
- bst->top_margin = bst->bottom_margin = 0;
-
- pixmap = image_data_to_pixmap (dpy, window,
- amiga_png, sizeof(amiga_png),
- &pix_w, &pix_h, &mask);
-
- if (pixmap)
- {
- int i, n = 0;
- if (MIN (bst->xgwa.width, bst->xgwa.height) > 600) n++;
- if (bst->xgwa.width > 2560) n++; /* Retina displays */
- for (i = 0; i < n; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
- }
-
- XSetLineAttributes (dpy, bst->gc, lw, LineSolid, CapButt, JoinMiter);
-
- height = lw * 5;
-
- bst->char_delay = bst->line_delay = 0;
-
- BSOD_PAUSE (bst, 2000000);
- BSOD_COPY (bst, 0, 0, bst->xgwa.width, bst->xgwa.height - height, 0, height);
-
- BSOD_COLOR (bst, fg, bg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, height); /* red */
- BSOD_COLOR (bst, bg, fg);
- BSOD_RECT (bst, True, lw/2, lw/2, bst->xgwa.width-lw, height-lw); /* black */
- BSOD_COLOR (bst, fg, bg);
- BSOD_MOVETO (bst, 0, lw*2);
- BSOD_TEXT (bst, CENTER, guru1);
- BSOD_MOVETO (bst, 0, lw*3.5);
- BSOD_TEXT (bst, CENTER, guru2);
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_COLOR (bst, bg, fg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, height); /* black */
- BSOD_COLOR (bst, fg, bg);
- BSOD_MOVETO (bst, 0, lw*2);
- BSOD_TEXT (bst, CENTER, guru1);
- BSOD_MOVETO (bst, 0, lw*3.5);
- BSOD_TEXT (bst, CENTER, guru2);
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_LOOP (bst, -17);
-
- XSetWindowBackground (dpy, window, bg2);
- XClearWindow (dpy, window);
- XSetWindowBackground (dpy, window, bst->bg);
-
- if (pixmap)
- {
- int x = (bst->xgwa.width - pix_w) / 2;
- int y = ((bst->xgwa.height - pix_h) / 2);
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, x, y);
- XCopyArea (dpy, pixmap, bst->window, bst->gc, 0, 0, pix_w, pix_h, x, y);
- XSetClipMask (dpy, bst->gc, None);
- XFreePixmap (dpy, pixmap);
- XFreePixmap (dpy, mask);
- }
-
- bst->y += lw;
-
- return bst;
-}
-
-
-
-/* Atari ST, by Marcus Herbert <rhoenie@nobiscum.de>
- Marcus had this to say:
-
- Though I still have my Atari somewhere, I hardly remember
- the meaning of the bombs. I think 9 bombs was "bus error" or
- something like that. And you often had a few bombs displayed
- quickly and then the next few ones coming up step by step.
- Perhaps somebody else can tell you more about it.. its just
- a quick hack :-}
- */
-static struct bsod_state *
-atari (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "atari", "Atari");
-
- int pix_w, pix_h;
- int offset;
- int i, x, y;
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- atari_png, sizeof(atari_png),
- &pix_w, &pix_h, &mask);
-
- for (i = 0; i < 3; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2; pix_h *= 2;
- }
-
- offset = pix_w;
- x = 0;
- y = bst->xgwa.height/2;
- if (y < 0) y = 0;
-
- for (i = 1; i< 7; i++)
- BSOD_COPY (bst, x, y, pix_w, pix_h, (x + (i*offset)), y);
-
- for (; i< 10; i++)
- {
- BSOD_PAUSE (bst, 1000000);
- BSOD_COPY (bst, x, y, pix_w, pix_h, (x + (i*offset)), y);
- }
-
- XClearWindow (dpy, window);
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, x, y);
- XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
- XSetClipMask (dpy, bst->gc, None);
- XFreePixmap (dpy, pixmap);
- XFreePixmap (dpy, mask);
-
- return bst;
-}
-
-
-static struct bsod_state *
-mac (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "mac", "Mac");
-
- int pix_w, pix_h;
- int i;
-
- const char *string = ("0 0 0 0 0 0 0 F\n"
- "0 0 0 0 0 0 0 3");
-
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- mac_png, sizeof(mac_png),
- &pix_w, &pix_h, &mask);
- int offset = pix_h * 4;
-
- bst->xoff = bst->left_margin = bst->right_margin = 0;
-
- for (i = 0; i < 2; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2; pix_h *= 2;
- }
-
- bst->x = (bst->xgwa.width - pix_w) / 2;
- bst->y = (((bst->xgwa.height + offset) / 2) -
- pix_h -
- (bst->font->ascent + bst->font->descent) * 2);
- if (bst->y < 0) bst->y = 0;
-
- XClearWindow (dpy, window);
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, bst->x, bst->y);
- XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, bst->x, bst->y);
- XSetClipMask (dpy, bst->gc, None);
- XFreePixmap (dpy, pixmap);
- XFreePixmap (dpy, mask);
-
- bst->y += offset + bst->font->ascent + bst->font->descent;
- BSOD_TEXT (bst, CENTER, string);
-
- return bst;
-}
-
-
-static struct bsod_state *
-macsbug (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "macsbug", "MacsBug");
-
- __extension__
- const char *left = (" SP \n"
- " 04EB0A58 \n"
- "58 00010000\n"
- "5C 00010000\n"
- " ........\n"
- "60 00000000\n"
- "64 000004EB\n"
- " ........\n"
- "68 0000027F\n"
- "6C 2D980035\n"
- " ....-..5\n"
- "70 00000054\n"
- "74 0173003E\n"
- " ...T.s.>\n"
- "78 04EBDA76\n"
- "7C 04EBDA8E\n"
- " .S.L.a.U\n"
- "80 00000000\n"
- "84 000004EB\n"
- " ........\n"
- "88 00010000\n"
- "8C 00010000\n"
- " ...{3..S\n"
- "\n"
- "\n"
- " CurApName \n"
- " Finder \n"
- "\n"
- " 32-bit VM \n"
- "SR Smxnzvc0\n"
- "D0 04EC0062\n"
- "D1 00000053\n"
- "D2 FFFF0100\n"
- "D3 00010000\n"
- "D4 00010000\n"
- "D5 04EBDA76\n"
- "D6 04EBDA8E\n"
- "D7 00000001\n"
- "\n"
- "A0 04EBDA76\n"
- "A1 04EBDA8E\n"
- "A2 A0A00060\n"
- "A3 027F2D98\n"
- "A4 027F2E58\n"
- "A5 04EC04F0\n"
- "A6 04EB0A86\n"
- "A7 04EB0A58");
- const char *bottom = (" _A09D\n"
- " +00884 40843714 #$0700,SR "
- " ; A973 | A973\n"
- " +00886 40843765 *+$0400 "
- " | 4A1F\n"
- " +00888 40843718 $0004(A7),([0,A7[)"
- " ; 04E8D0AE | 66B8");
- __extension__
- const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
- "BowelsOfTheMemoryMgr+04F9C\n"
- " Calling chain using A6/R1 links\n"
- " Back chain ISA Caller\n"
- " 00000000 PPC 28C5353C __start+00054\n"
- " 24DB03C0 PPC 28B9258C main+0039C\n"
- " 24DB0350 PPC 28B9210C MainEvent+00494\n"
- " 24DB02B0 PPC 28B91B40 HandleEvent+00278\n"
- " 24DB0250 PPC 28B83DAC DoAppleEvent+00020\n"
- " 24DB0210 PPC FFD3E5D0 "
- "AEProcessAppleEvent+00020\n"
- " 24DB0132 68K 00589468\n"
- " 24DAFF8C 68K 00589582\n"
- " 24DAFF26 68K 00588F70\n"
- " 24DAFEB3 PPC 00307098 "
- "EmToNatEndMoveParams+00014\n"
- " 24DAFE40 PPC 28B9D0B0 DoScript+001C4\n"
- " 24DAFDD0 PPC 28B9C35C RunScript+00390\n"
- " 24DAFC60 PPC 28BA36D4 run_perl+000E0\n"
- " 24DAFC10 PPC 28BC2904 perl_run+002CC\n"
- " 24DAFA80 PPC 28C18490 Perl_runops+00068\n"
- " 24DAFA30 PPC 28BE6CC0 Perl_pp_backtick+000FC\n"
- " 24DAF9D0 PPC 28BA48B8 Perl_my_popen+00158\n"
- " 24DAF980 PPC 28C5395C sfclose+00378\n"
- " 24DAF930 PPC 28BA568C free+0000C\n"
- " 24DAF8F0 PPC 28BA6254 pool_free+001D0\n"
- " 24DAF8A0 PPC FFD48F14 DisposePtr+00028\n"
- " 24DAF7C9 PPC 00307098 "
- "EmToNatEndMoveParams+00014\n"
- " 24DAF780 PPC 003AA180 __DisposePtr+00010");
-
- XGlyphInfo ov;
- const char *s;
- int body_lines = 1;
-
- int char_width, line_height;
- int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
- int xoff, yoff;
-
- unsigned long fg = bst->fg;
- unsigned long bg = bst->bg;
- unsigned long bc = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macsbug.borderColor",
- "MacsBug.BorderColor");
-
- bst->xoff = bst->left_margin = bst->right_margin = 0;
-
- for (s = body; *s; s++) if (*s == '\n') body_lines++;
-
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- char_width = ov.xOff;
- line_height = bst->font->ascent + bst->font->descent;
-
- col_right = char_width * 12; /* number of columns in `left' */
- page_bottom = line_height * 47; /* number of lines in `left' */
-
- if (page_bottom > bst->xgwa.height - bst->yoff)
- page_bottom = bst->xgwa.height - bst->yoff;
-
- row_bottom = page_bottom - line_height;
- row_top = row_bottom - (line_height * 4);
- page_right = col_right + (char_width * 88);
- body_top = row_top - (line_height * body_lines);
-
- page_bottom += 2;
- row_bottom += 2;
- body_top -= 4;
-
- if (body_top > 4)
- body_top = 4;
-
- xoff = (bst->xgwa.width - page_right) / 2;
- yoff = (bst->xgwa.height - page_bottom) / 2;
-
- if (xoff < 0) xoff = 0;
- if (yoff < 0) yoff = 0;
-
- BSOD_MARGINS (bst, xoff, xoff);
-
- BSOD_COLOR (bst, bc, bg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_COLOR (bst, bg, bg);
- BSOD_RECT (bst, True, xoff-2, yoff, page_right+4, page_bottom);
- BSOD_COLOR (bst, fg, bg);
-
- BSOD_MOVETO (bst, xoff, yoff + line_height);
- BSOD_TEXT (bst, LEFT, left);
- BSOD_MOVETO (bst, xoff+col_right, yoff + row_top + line_height);
- BSOD_TEXT (bst, LEFT, bottom);
-
- BSOD_RECT (bst, True, xoff + col_right, yoff, 2, page_bottom);
- BSOD_RECT (bst, True, xoff + col_right, yoff + row_top,
- page_right - col_right, 1);
- BSOD_RECT (bst, True, xoff + col_right, yoff + row_bottom,
- page_right - col_right, 1);
- BSOD_RECT (bst, False, xoff-2, yoff, page_right+4, page_bottom);
-
- BSOD_LINE_DELAY (bst, 500);
- BSOD_MOVETO (bst,
- xoff + col_right + char_width,
- yoff + body_top + line_height);
- BSOD_MARGINS (bst,
- xoff + col_right + char_width,
- xoff + col_right + char_width);
- BSOD_TEXT (bst, LEFT, body);
-
- BSOD_RECT (bst, False, xoff-2, yoff, page_right+4, page_bottom); /* again */
-
- BSOD_RECT (bst, False,
- xoff + col_right + (char_width/2)+2,
- yoff + row_bottom + 2,
- 0,
- page_bottom - row_bottom - 4);
-
- BSOD_PAUSE (bst, 666666);
- BSOD_INVERT (bst);
- BSOD_LOOP (bst, -3);
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-static struct bsod_state *
-mac1 (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "mac1", "Mac1");
-
- int pix_w, pix_h;
- int x, y;
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- macbomb_png, sizeof(macbomb_png),
- &pix_w, &pix_h, &mask);
-
- if (pixmap &&
- pix_w < bst->xgwa.width / 2 &&
- pix_h < bst->xgwa.height / 2)
- {
- int i, n = 1;
- if (bst->xgwa.width > 2560) n++; /* Retina displays */
- for (i = 0; i < n; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual,
- bst->xgwa.depth, pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
- }
-
- x = (bst->xgwa.width - pix_w) / 2;
- y = (bst->xgwa.height - pix_h) / 2;
- if (y < 0) y = 0;
-
- XClearWindow (dpy, window);
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, x, y);
- XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
- XSetClipMask (dpy, bst->gc, None);
- XFreePixmap (dpy, mask);
-
- return bst;
-}
-
-
-/* This is what kernel panics looked like on MacOS X 10.0 through 10.1.5.
- In later releases, it's a graphic of a power button with text in
- English, French, German, and Japanese overlayed transparently.
- */
-static struct bsod_state *
-macx_10_0 (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
- unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macx.textForeground",
- "MacX.TextForeground");
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macx.textBackground",
- "MacX.TextBackground");
- XClearWindow (dpy, window);
- {
- Pixmap pixmap = 0;
- Pixmap mask = 0;
- int x, y, pix_w, pix_h;
- pixmap = image_data_to_pixmap (dpy, window,
- hmac_png, sizeof(hmac_png),
- &pix_w, &pix_h, &mask);
-
-/*# ifdef HAVE_MOBILE*/
- if (pixmap)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual,
- bst->xgwa.depth, pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual,
- 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
-/*# endif*/
-
- x = (bst->xgwa.width - pix_w) / 2;
- y = (bst->xgwa.height - pix_h) / 2;
- if (y < 0) y = 0;
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, x, y);
- XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
- XSetClipMask (dpy, bst->gc, None);
- XFreePixmap (dpy, pixmap);
- XFreePixmap (dpy, mask);
- }
-
- bst->left_margin = 0;
- bst->right_margin = 0;
- bst->y = bst->font->ascent;
- bst->macx_eol_kludge = True;
- bst->wrap_p = True;
-
- BSOD_PAUSE (bst, 3000000);
- BSOD_COLOR(bst, fg2, bg2);
- BSOD_TEXT (bst, LEFT,
- "panic(cpu 0): Unable to find driver for this platform: "
- "\"PowerMac 3,5\".\n"
- "\n"
- "backtrace: 0x0008c2f4 0x0002a7a0 0x001f0204 0x001d4e4c 0x001d4c5c "
- "0x001a56cc 0x01d5dbc 0x001c621c 0x00037430 0x00037364\n"
- "\n"
- "\n"
- "\n"
- "No debugger configured - dumping debug information\n"
- "\n"
- "version string : Darwin Kernel Version 1.3:\n"
- "Thu Mar 1 06:56:40 PST 2001; root:xnu/xnu-123.5.obj~1/RELEASE_PPC\n"
- "\n"
- "\n"
- "\n"
- "\n"
- "DBAT0: 00000000 00000000\n"
- "DBAT1: 00000000 00000000\n"
- "DBAT2: 80001FFE 8000003A\n"
- "DBAT3: 90001FFE 9000003A\n"
- "MSR=00001030\n"
- "backtrace: 0x0008c2f4 0x0002a7a0 0x001f0204 0x001d4e4c 0x001d4c5c "
- "0x001a56cc 0x01d5dbc 0x001c621c 0x00037430 0x00037364\n"
- "\n"
- "panic: We are hanging here...\n");
-
- return bst;
-}
-
-
-static struct bsod_state *
-macx_10_2 (Display *dpy, Window window, Bool v10_3_p)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
-
- Pixmap mask = 0;
- Pixmap pixmap = 0;
- int pix_w = 0, pix_h = 0;
- int x, y;
-
- if (v10_3_p)
- pixmap = image_data_to_pixmap (dpy, window,
- osx_10_3_png, sizeof(osx_10_3_png),
- &pix_w, &pix_h, &mask);
- else
- pixmap = image_data_to_pixmap (dpy, window,
- osx_10_2_png, sizeof(osx_10_2_png),
- &pix_w, &pix_h, &mask);
- if (! pixmap) abort();
- if (! mask) abort();
-
-#if 1
- if (bst->xgwa.height > 600) /* scale up the bitmap */
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- if (! pixmap) abort();
- if (! mask) abort();
- pix_w *= 2;
- pix_h *= 2;
- }
-#endif
-
- BSOD_IMG (bst);
- BSOD_PAUSE (bst, 2000000);
-
- bst->pixmap = pixmap;
- bst->mask = mask;
-
- x = (bst->xgwa.width - pix_w) / 2;
- y = ((bst->xgwa.height - pix_h) / 2);
- BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
-
- return bst;
-}
-
-
-/* 2006 Mac Mini with MacOS 10.6 failing with a bad boot drive. By jwz.
- */
-static struct bsod_state *
-mac_diskfail (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "macdisk", "Mac");
- XGlyphInfo ov;
- int cw, h, L, T;
- unsigned long fg, bg, bg2;
-
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- cw = ov.xOff;
- h = bst->font->ascent + bst->font->descent;
- L = (bst->xgwa.width - (cw * 80)) / 2;
- T = (bst->xgwa.height - (h * 10)) / 2;
-
- fg = bst->fg;
- bg = bst->bg;
- bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macx.background", "Mac.Background");
- if (L < 0) L = 0;
- if (T < 0) T = 0;
-
- bst->wrap_p = True;
- bst->scroll_p = True;
-
- BSOD_COLOR(bst, bg2, bg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_PAUSE (bst, 3000000);
-
- BSOD_COLOR(bst, bg, fg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_COLOR(bst, fg, bg);
-
- BSOD_MARGINS (bst, L, L);
- BSOD_MOVETO (bst, L, T);
-
- BSOD_TEXT (bst, LEFT,
- "efiboot loaded from device: Acpi(PNP0A03,0)/Pci*1F|2)/Ata"
- "(Primary,Slave)/HD(Part\n"
- "2,Sig8997E427-064E-4FE7-8CB9-F27A784B232C)\n"
- "boot file path: \\System\\Library\\CoreServices\\boot.efi\n"
- ".Loading kernel cache file 'System\\Library\\Caches\\"
- "com.apple.kext.caches\\Startup\\\n"
- "kernelcache_i386.2A14EC2C'\n"
- "Loading 'mach_kernel'...\n"
- );
- BSOD_CHAR_DELAY (bst, 7000);
- BSOD_TEXT (bst, LEFT,
- ".....................\n"
- );
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "root device uuid is 'B62181B4-6755-3C27-BFA1-49A0E053DBD6\n"
- "Loading drivers...\n"
- "Loading System\\Library\\Caches\\com.apple.kext.caches\\"
- "Startup\\Extensions.mkext....\n"
- );
- BSOD_CHAR_DELAY (bst, 7000);
- BSOD_TEXT (bst, LEFT,
- "..............................................................."
- ".................\n"
- "..............................................................."
- ".................\n"
- "..............\n"
- );
- BSOD_INVERT (bst);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_INVERT (bst);
-
- BSOD_MARGINS (bst, 0, 0);
- BSOD_MOVETO (bst, 0, h);
-
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_LINE_DELAY (bst, 5000);
- BSOD_TEXT (bst, LEFT,
- "npvhash=4095\n"
- "PRE enabled\n"
- "Darwin Kernel Version 10.8.9: Tue Jun 7 16:33:36 PDT 2011;"
- " root:xnu-1504.15.3~1/RELEASE_I386\n"
- "vm_page_bootstrap: 508036 free pages and 16252 wired pages\n"
- "standard timeslicing quantum is 10000 us\n"
- "mig_table_max_displ = 73\n"
- "AppleACPICPU: ProcessorId=0 LocalApicId=0 Enabled\n"
- "AppleACPICPU: ProcessorId=1 LocalApicId=1 Enabled\n"
- "calling npo_policy_init for Quarantine\n"
- "Security policy loaded: Quaantine policy (Quarantine)\n"
- "calling npo_policy_init for Sandbox\n"
- "Security policy loaded: Seatbelt sandbox policy (Sandbox)\n"
- "calling npo_policy_init for TMSafetyNet\n"
- "Security policy loaded: Safety net for Time Machine "
- "(TMSafetyNet)\n"
- "Copyright (c) 1982, 1986, 1989, 1991, 1993\n"
- "The Regents of the University of California. All rights "
- "reserved.\n"
- "\n"
- "MAC Framework successfully initialized\n"
- "using 10485 buffer headers and 4096 cluster IO buffer headers\n"
- "IOAPIC: Version 0x20 Vectors 64:87\n"
- "ACPI: System State [S0 S3 S4 S5] (S3)\n"
- "PFM64 0x10000000, 0xf0000000\n"
- "[ PCI configuration begin ]\n"
- "PCI configuration changed (bridge=1 device=1 cardbus=0)\n"
- "[ PCI configuration end, bridges 4 devices 17 ]\n"
- "nbinit: done (64 MB memory set for nbuf pool)\n"
- "rooting via boot-uuid from /chosen: "
- "B62181B4-6755-3C27-BFA1-49A0E053DBD6\n"
- "Waiting on <dict ID=\"0\"><key>IOProviderClass</key>"
- "<string ID=\"1\">IOResources</string><key>IOResourceMatch</key>"
- "<string ID=\"2\">boot-uuid-nedia</string></dict>\n"
- "com.apple.AppleFSCCompressionTypeZlib kmod start\n"
- "com.apple.AppleFSCCompressionTypeZlib kmod succeeded\n"
- "AppleIntelCPUPowerManagementClient: ready\n"
- "FireWire (OHCI) Lucent ID 5811 built-in now active, GUID "
- "0019e3fffe97f8b4; max speed s400.\n"
- "Got boot device = IOService:/AppleACPIPlatformExpert/PCI000/"
- "AppleACPIPCI/SATA@1F,2/AppleAHCI/PRI202/IOAHCIDevice@0/"
- "AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/"
- "IOBlockStorageDriver/ST96812AS Media/IOGUIDPartitionScheme/"
- "Customer02\n"
- );
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "BSD root: Disk0s, major 14, minor 2\n"
- "[Bluetooth::CSRHIDTransition] switchtoHCIMode (legacy)\n"
- "[Bluetooth::CSRHIDTransition] transition complete.\n"
- "CSRUSBBluetoothHCIController::setupHardware super returned 0\n"
- );
- BSOD_PAUSE (bst, 3000000);
- BSOD_TEXT (bst, LEFT,
- "disk0s2: I/O error.\n"
- "0 [Level 3] [ReadUID 0] [Facility com.apple.system.fs] "
- "[ErrType IO] [ErrNo 5] [IOType Read] [PBlkNum 48424] "
- "[LBlkNum 1362] [FSLogMsgID 2009724291] [FSLogMsgOrder First]\n"
- "0 [Level 3] [ReadUID 0] [Facility com.apple.system.fs] "
- "[DevNode root_device] [MountPt /] [FSLogMsgID 2009724291] "
- "[FSLogMsgOrder Last]\n"
- "panic(cpu 0 caller 0x47f5ad): \"Process 1 exec of /sbin/launchd"
- " failed, errno 5\\n\"0/SourceCache/xnu/xnu-1504.15.3/bsd/kern/"
- "kern_exec.c:3145\n"
- "Debugger called: <panic>\n"
- "Backtrace (CPU 0), Frame : Return Address (4 potential args "
- "on stack)\n"
- "0x34bf3e48 : 0x21b837 (0x5dd7fc 0x34bf3e7c 0x223ce1 0x0)\n"
- "0x34bf3e98 : 0x47f5ad (0x5cf950 0x831c08 0x5 0x0)\n"
- "0x34bf3ef8 : 0x4696d2 (0x4800d20 0x1fe 0x45a69a0 0x80000001)\n"
- "0x34bf3f38 : 0x48fee5 (0x46077a8 0x84baa0 0x34bf3f88 "
- "0x34bf3f94)\n"
- "0x34bf3f68 : 0x219432 (0x46077a8 0xffffff7f 0x0 0x227c4b)\n"
- "0x34bf3fa8 : 0x2aacb4 (0xffffffff 0x1 0x22f8f5 0x227c4b)\n"
- "0x34bf3fc8 : 0x2a1976 (0x0 0x0 0x2a17ab 0x4023ef0)\n"
- "\n"
- "BSD process name corresponding to current thread: init\n"
- "\n"
- "Mac OS version:\n"
- "Not yet set\n"
- "\n"
- "Kernel version:\n"
- "Darwin Kernel version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; "
- "root:xnu-1504.15-3~1/RELEASE_I386\n"
- "System model name: Macmini1,1 (Mac-F4208EC0)\n"
- "\n"
- "System uptime in nanoseconds: 13239332027\n"
- );
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 999999);
-
- XClearWindow (dpy, window);
-
- return bst;
-}
-
-
-/* 2017 MacOS 10.12 interminable software update, by jwz.
- */
-static struct bsod_state *
-macx_install (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "macinstall", "MacX");
-
- int pix_w, pix_h;
- int x, y;
- int bw1, bh1;
- int bw2, bh2;
-
- unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macinstall.foreground",
- "Mac.Foreground");
- unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macinstall.background",
- "Mac.Background");
- unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macinstall.barForeground",
- "Mac.Foreground");
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "macinstall.barBackground",
- "Mac.Background");
- char buf[1024];
- int lh = bst->font->ascent + bst->font->descent;
- int i, min;
- double pct;
-
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- apple_png, sizeof(apple_png),
- &pix_w, &pix_h, &mask);
-
- bst->xoff = bst->left_margin = bst->right_margin = 0;
-
- if (pixmap)
- {
- int i, n = 0;
- if (bst->xgwa.width > 2560) n++; /* Retina displays */
- for (i = 0; i < n; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
- }
-
- bst->pixmap = pixmap;
- bst->mask = mask;
-
- x = (bst->xgwa.width - pix_w) / 2;
- y = (bst->xgwa.height) / 2 - pix_h;
- if (y < 0) y = 0;
-
- XSetLineAttributes (dpy, bst->gc, 1, LineSolid, CapRound, JoinMiter);
-
- BSOD_COLOR(bst, bg, bg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_COLOR(bst, fg, bg);
- BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
- y += pix_h * 2 - lh;
-
- /* progress bar */
- bw1 = pix_w * 2.5;
- bh1 = lh * 0.66;
- if (bh1 < 8) bh1 = 8;
-
- x = (bst->xgwa.width - bw1) / 2;
- BSOD_COLOR(bst, fg2, bg);
- BSOD_LINE (bst, x, y, x + bw1, y, bh1);
-
- bw2 = bw1 - 1;
- bh2 = bh1 - 4;
- BSOD_COLOR(bst, bg2, bg);
- BSOD_LINE (bst, x+1, y, x + bw2, y, bh2);
-
- BSOD_COLOR(bst, fg, bg);
- BSOD_LINE (bst, x, y, x + 1, y, bh1);
-
- pct = 5 + (random() % 40);
- min = 5 + (random() % 40);
-
- for (i = 0; i < 100; i++) {
- pct += frand(0.3);
- min += (random() % 3) - 1; /* sometimes down, mostly up */
-
- if (pct > 90) pct = 90;
- BSOD_RECT (bst, True, x, y - bh1/2, bw1 * pct / 100, bh1);
-
- sprintf (buf, " Installing Software Update: about %d minutes. ", min);
- bst->y = y + lh * 3;
- BSOD_TEXT (bst, CENTER, buf);
- BSOD_PAUSE (bst, 1000000);
- }
-
- return bst;
-}
-
-
-static struct bsod_state *
-macx (Display *dpy, Window window)
-{
- switch (random() % 5) {
- case 0: return macx_10_0 (dpy, window); break;
- case 1: return macx_10_2 (dpy, window, False); break;
- case 2: return macx_10_2 (dpy, window, True); break;
- case 3: return mac_diskfail (dpy, window); break;
- case 4: return macx_install (dpy, window); break;
- default: abort();
- }
-}
-
-
-#ifndef HAVE_JWXYZ /* #### I have no idea how to implement this without
- real plane-masks. I don't think it would look
- right if done with alpha-transparency... */
-/* blit damage
- *
- * by Martin Pool <mbp@samba.org>, Feb 2000.
- *
- * This is meant to look like the preferred failure mode of NCD
- * Xterms. The parameters for choosing what to copy where might not
- * be quite right, but it looks about ugly enough.
- */
-static struct bsod_state *
-blitdamage (Display *dpy, Window window)
-{
- struct bsod_state *bst =
- make_bsod_state (dpy, window, "blitdamage", "BlitDamage");
-
- int i;
- int delta_x = 0, delta_y = 0;
- int w, h;
- int chunk_h, chunk_w;
- int steps;
- int src_x, src_y;
- int x, y;
-
- w = bst->xgwa.width;
- h = bst->xgwa.height;
-
- XSetPlaneMask (dpy, bst->gc, random());
-
- steps = 50;
- chunk_w = w / (random() % 1 + 1);
- chunk_h = h / (random() % 1 + 1);
- if (random() & 0x1000)
- delta_y = random() % 600;
- if (!delta_y || (random() & 0x2000))
- delta_x = random() % 600;
- src_x = 0;
- src_y = 0;
- x = 0;
- y = 0;
-
- BSOD_IMG (bst);
- for (i = 0; i < steps; i++) {
- if (x + chunk_w > w)
- x -= w;
- else
- x += delta_x;
-
- if (y + chunk_h > h)
- y -= h;
- else
- y += delta_y;
-
- BSOD_COPY (bst, src_x, src_y, chunk_w, chunk_h, x, y);
- BSOD_PAUSE (bst, 1000);
- }
-
- return bst;
-}
-#endif /* !HAVE_JWXYZ */
-
-
-/*
- * OS/2 panics, by Knut St. Osmundsen <bird-xscreensaver@anduin.net>
- *
- * All but one messages are real ones, some are from my test machines
- * and system dumps, others are reconstructed from google results.
- * Please, don't be to hard if the formatting of the earlier systems
- * aren't 100% correct.
- */
-static struct bsod_state *
-os2 (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "os2", "OS2");
-
- __extension__
- static const char * const os2_panics[] =
- { /* OS/2 2.0 trap - details are bogus (CR0++). */
- "TRAP 0002 ERRCD=0000 ERACC=**** ERLIM=********\n"
- "EAX=7d240a58 EBX=ff202fdc ECX=00064423 EDX=00003624\n"
- "ESI=fff3272c EDI=7d240004 EBP=00004a44 FLG=00003202\n"
- "CS:EIP=0160:fff702a6 CSACC=c09d CSLIM=ffffffff\n"
- "SS:ESP=0030:00004a38 SSACC=1097 SSLIM=00003fff\n"
- "DS=0158 DSACC=c0f3 DSLIM=ffffffff CR0=fffffffb\n"
- "ES=0158 ESACC=c0f3 ESLIM=ffffffff CR2=1a060014\n"
- "FS=0000 FSACC=**** FSLIM=********\n"
- "GS=0000 GSACC=**** GSLIM=********\n"
- "\n"
- "The system detected an internal processing error\n"
- "at location ##0160:fff6453f - 000d:a53f\n"
- "60000, 9084\n"
- "\n"
- "038600d1\n"
- "Internal revision 6.307, 92/03/01\n"
- "\n",
-
- /* warp 3 (early) */
- "TRAP 000e ERRCD=0000 ERACC=**** ERLIM=********\n"
- "EAX=ff050c20 EBX=000000bb ECX=ffff00c1 EDx=fff379b8\n"
- "ESI=ffe55a3c EDI=00000000 EBP=00004eb8 FLG=00013282\n"
- "CS:EIP=0160:fff8dbb8 CSACC=c09b CSLIM=ffffffff\n"
- "SS:EIP=0030:00004eb4 SSACC=1097 SSLIM=00003fff\n"
- "DS=0158 DSACC=c0f3 DSLIM=ffffffff CR0=8001001b\n"
- "ES=0158 DSACC=c0f3 DSLIM=ffffffff CR2=000000c7\n"
- "FS=0000 FSACC=**** FSLIM=********\n"
- "GS=0000 GSACC=**** GSLIM=********\n"
- "\n"
- "The system detected an internal processing error\n"
- "at location ##0160:fff66bf0 - 000d:9bf0.\n"
- "60000, 9084\n"
- "\n"
- "048600b4\n"
- "Internal revision 8.125, 94/02/16\n"
- "\n"
- "The system is stopped. Record the location number of the error\n"
- "and contact your service representative.\n",
-
- /* warp 3 */
- "TRAP 000e ERRCD=0002 ERACC=**** ERLIM=********\n"
- "EAX=00000000 EBX=fdef1e0c ECX=00003824 EDX=0000edf9\n"
- "ESI=fdf30e80 EDI=fc8b0000 EBP=00005658 FLG=00012246\n"
- "CS:EIP=0160:fff8ada3 CSACC=c09b CSLIM=ffffffff\n"
- "SS:ESP=0030:000055d4 SSACC=1097 SSLIM=0000480f\n"
- "DS=0158 DSACC=c093 DSLIM=ffffffff CR0=8001001b\n"
- "ES=0158 ESACC=c093 ESLIM=ffffffff CR2=fc8b0000\n"
- "FS=03b8 FSACC=0093 FSLIM=00000023\n"
- "GS=0000 GSACC=**** GSLIM=********\n"
- "\n"
- "The system detected an internal processing error\n"
- "at location ##0160:fff5c364 - 000d:a364.\n"
- "60000, 9084\n"
- "\n"
- "05860526\n"
- "Internal revision 8200,94/11/07\n"
- "\n"
- "The system is stopped. Record all of the above information and\n"
- "contact your service representative.\n",
-
- /* warp 3 (late) */
- "TRAP 000d ERRCD=2200 ERACC=1092 ERLIM=00010fff\n"
- "EAX=0000802e EBX=fff001c8 ECX=9bd80000 EDX=00000000\n"
- "ESI=fff09bd8 EDI=fdeb001b EBP=00000000 FLG=00012012\n"
- "CS:EIP=0168:fff480a2 CSACC=c09b CSLIM=ffffffff\n"
- "SS:ESP=00e8:00001f32 SSACC=0093 SSLIM=00001fff\n"
- "DS=0940 DSACC=0093 DSLIM=00000397 CR0=8001001b\n"
- "ES=00e8 ESACC=0093 ESLIM=00001fff CR2=15760008\n"
- "FS=0000 FSACC=**** FSLIM=****\n"
- "GS=0000 GSACC=**** GSLIM=****\n"
- "\n"
- "The system detected an internal processing error\n"
- "at location ##0168:fff4b06e - 000e:c06e\n"
- "60000, 9084\n"
- "\n"
- "06860652\n"
- "Internal revision 8.259_uni,98/01/07\n"
- "\n"
- "The system is stopped. Record all of the above information and\n"
- "contact your service representative.\n",
-
- /* Warp 4.52+ - the official r0trap.exe from the debugging classes */
- "Exception in module: OS2KRNL\n"
- "TRAP 000e ERRCD=0002 ERACC=**** ERLIM=********\n"
- "EAX=00000001 EBX=80010002 ECX=ffed4638 EDX=0003f17b\n"
- "ESI=00000001 EDI=00000002 EBP=00005408 FLG=00012202\n"
- "CS:EIP=0168:fff3cd2e CSACC=c09b CSLIM=ffffffff\n"
- "SS:ESP=0030:000053ec SSACC=1097 SSLIM=000044ff\n"
- "DS=0160 DSACC=c093 DSLIM=ffffffff CR0=8001001b\n"
- "ES=0160 ESACC=c093 ESLIM=ffffffff CR2=00000001\n"
- "FS=0000 FSACC=**** FSLIM=********\n"
- "GS=0000 GSACC=**** GSLIM=********\n"
- "\n"
- "The system detected an internal processing error at\n"
- "location ##0168:fff1e3f3 - 000e:c3f3.\n"
- "60000, 9084\n"
- "\n"
- "068606a0\n"
- "Internal revision 14.097_UNI\n"
- "\n"
- "The system is stopped. Record all of the above information and\n"
- "contact your service representative.\n",
-
- /* Warp 4.52+, typical JFS problem. */
- "Exception in module: JFS\n"
- "TRAP 0003 ERRCD=0000 ERACC=**** ERLIM=********\n"
- "EAX=00000000 EBX=ffffff05 ECX=00000001 EDX=f5cd8010\n"
- "ESI=000000e6 EDI=000000e7 EBP=f9c7378e FLG=00002296\n"
- "CS:EIP=0168:f8df3250 CSACC=c09b CSLIM=ffffffff\n"
- "SS:ESP=1550:fdc73778 SSACC=c093 SSLIM=ffffffff\n"
- "DS=0160 DSACC=c093 DSLIM=ffffffff CR0=80010016\n"
- "ES=0160 ESACC=c093 DSLIM=ffffffff CR2=05318000\n"
- "FS=03c0 FSACC=0093 DSLIM=00000023\n"
- "GS=0160 GSACC=c093 DSLIM=ffffffff\n"
- "\n"
- "The system detected an internal processing error\n"
- "at location ##0168:fff1e2ab - 000e:c2ab.\n"
- "60000, 9084\n"
- "\n"
- "07860695\n"
- "\n"
- "Internal revision 14.100c_UNI\n"
- "\n"
- "The system is stopped. Record all of the above information and\n"
- "contact your service representative.\n"
- };
-
- BSOD_TEXT (bst, LEFT, os2_panics[random() % countof(os2_panics)]);
- BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);
-
- XClearWindow (dpy, window);
- return bst;
-}
-
-
-/* SPARC Solaris panic. Should look pretty authentic on Solaris boxes.
- * Anton Solovyev <solovam@earthlink.net>
- */
-static struct bsod_state *
-sparc_solaris (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "solaris", "Solaris");
- int i;
- int pix_w = 0, pix_h = 0;
- int char_width;
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- sun_png, sizeof(sun_png),
- &pix_w, &pix_h, &mask);
- XGlyphInfo ov;
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- char_width = ov.xOff;
-
- if (pixmap)
- while (pix_w < char_width * 4)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual,
- bst->xgwa.depth, pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
-
- bst->pixmap = pixmap;
- bst->mask = mask;
-
- bst->scroll_p = True;
- bst->wrap_p = True;
- bst->left_margin = bst->right_margin = bst->xgwa.width * 0.07;
- bst->top_margin = bst->bottom_margin = bst->xgwa.height * 0.07;
- bst->y = bst->top_margin + bst->yoff + bst->font->ascent;
-
-# if 0
- /* This looks correct if we have a desktop image behind it, but doesn't
- make sense if it's a photo. So let's skip it. */
- BSOD_IMG (bst);
- BSOD_PAUSE (bst, 3000000);
-# endif
-
- BSOD_LINE_DELAY (bst, 20000);
-
- BSOD_INVERT(bst);
- BSOD_RECT (bst, True,
- bst->left_margin, bst->top_margin,
- bst->xgwa.width - bst->left_margin - bst->right_margin,
- bst->xgwa.height - bst->top_margin - bst->bottom_margin);
- BSOD_INVERT(bst);
-
- BSOD_TEXT (bst, LEFT,
- "BAD TRAP: cpu=0 type=0x31 rp=0x2a10043b5e0 addr=0xf3880 mmu_fsr=0x0\n"
- "BAD TRAP occurred in module \"unix\" due to an illegal access to a"
- " user address.\n"
- "adb: trap type = 0x31\n"
- "addr=0xf3880\n"
- "pid=307, pc=0x100306e4, sp=0x2a10043ae81, tstate=0x4480001602,"
- " context=0x87f\n"
- "g1-g7: 1045b000, 32f, 10079440, 180, 300000ebde8, 0, 30000953a20\n"
- "Begin traceback... sp = 2a10043ae81\n"
- "Called from 100bd060, fp=2a10043af31, args=f3700 300008cc988 f3880 0"
- " 1 300000ebde0.\n"
- "Called from 101fe1bc, fp=2a10043b011, args=3000045a240 104465a0"
- " 300008e47d0 300008e48fa 300008ae350 300008ae410\n"
- "Called from 1007c520, fp=2a10043b0c1, args=300008e4878 300003596e8 0"
- " 3000045a320 0 3000045a220\n"
- "Called from 1007c498, fp=2a10043b171, args=1045a000 300007847f0 20"
- " 3000045a240 1 0\n"
- "Called from 1007972c, fp=2a10043b221, args=1 300009517c0 30000951e58 1"
- " 300007847f0 0\n"
- "Called from 10031e10, fp=2a10043b2d1, args=3000095b0c8 0 300009396a8"
- " 30000953a20 0 1\n"
- "Called from 10000bdd8, fp=ffffffff7ffff1c1, args=0 57 100131480"
- " 100131480 10012a6e0 0\n"
- "End traceback...\n"
- "panic[cpu0]/thread=30000953a20: trap\n"
- "syncing file systems...\033");
-
- BSOD_PAUSE (bst, 3000000);
-
- BSOD_TEXT (bst, LEFT, "\b 1 done\n");
- BSOD_TEXT (bst, LEFT, "dumping to /dev/dsk/c0t0d0s3, offset 26935296\n\033");
- BSOD_PAUSE (bst, 2000000);
- BSOD_TEXT (bst, LEFT, "\b");
-
- for (i = 1; i <= 100; ++i)
- {
- char buf[100];
- sprintf (buf, "\r %3d%% done\033", i);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 100000);
- }
-
- BSOD_TEXT (bst, LEFT,
- "\b: 2803 pages dumped, compression ratio 2.88, dump succeeded\n\033");
- BSOD_PAUSE (bst, 2000000);
-
- BSOD_TEXT (bst, LEFT,
- "\brebooting...\n"
- "Resetting ...\n\033");
-
- BSOD_PAUSE (bst, 3000000);
-
- BSOD_INVERT(bst);
- BSOD_RECT (bst, True,
- bst->left_margin, bst->top_margin,
- bst->xgwa.width - bst->left_margin - bst->right_margin,
- bst->xgwa.height - bst->top_margin - bst->bottom_margin);
- BSOD_INVERT(bst);
- BSOD_MOVETO (bst, bst->left_margin, bst->top_margin + bst->font->ascent);
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_TEXT (bst, LEFT,
- "Starting real time clock...\n"
- "Probing /sbus@1,f8000000 at 0,0 dma esp sd st le\n"
- "Probing /sbus@1,f8000000 at 1,0 Invalid FCode start byte at ffe70000\n"
- "Probing /sbus@1,f8000000 at 2,0 Invalid FCode start byte at ffe70000\n"
- "Probing /sbus@1,f8000000 at 3,0 bwtwo\n"
- "\n");
-
- BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, ~0, ~0);
- BSOD_MARGINS (bst,
- bst->left_margin + pix_w + char_width * 2,
- bst->left_margin + pix_w + char_width * 2);
- BSOD_TEXT (bst, LEFT,
- "SPARCstation IPC, Keyboard Present\n"
- "ROM Rev. 2.9, 16 MB memory installed, Serial #12648190.\n"
- "Ethernet address 8:0:20:37:1:87, Host ID: 52c0fefe.\n");
- BSOD_MARGINS (bst, bst->left_margin, bst->left_margin);
-
- BSOD_TEXT (bst, LEFT, "\n\n\033");
- BSOD_PAUSE (bst, 3000000);
- BSOD_TEXT (bst, LEFT, "\r");
-
- BSOD_TEXT (bst, LEFT, "Testing 16 megs of memory. Still to go \033 16");
-
- for (i = 16; i > 0; i--)
- {
- char buf[100];
- sprintf (buf, "\b\b%2d", i);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 100000);
- }
- BSOD_TEXT (bst, LEFT, "\b\b\b\b 0\n"
- "Initializing 16 megs of memory at addr 0\033 16");
- for (i = 16; i >= 0; i--)
- {
- char buf[100];
- sprintf (buf, "\b\b%2d", i);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 30000);
- }
- BSOD_TEXT (bst, LEFT, "\r"
- " \r"
- "Boot device: /sbus/le@0,c00000 File and args:\n\033");
-
- {
- int n = (random() % 10);
- for (i = 0; i < n; i++)
- {
- BSOD_PAUSE (bst, 3000000);
- BSOD_TEXT (bst, LEFT, "\rTimeout waiting for ARP/RARP packet\n\033");
- }
- }
- BSOD_TEXT (bst, LEFT, "\r");
-
- BSOD_TEXT (bst, LEFT,
- "Internal loopback test -- Wrong packet length;"
- " expected 36, observed 1600\n"
- "Can't open boot device\n"
- "\n"
- "Type b (boot), c (continue), or n (new command mode)\n"
- ">");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 10);
- BSOD_TEXT (bst, LEFT, "n\n");
- BSOD_PAUSE (bst, 500000);
- BSOD_TEXT (bst, LEFT, "Type help for more information\n"
- "ok ");
-
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4);
- BSOD_CHAR_DELAY (bst, 80000);
- BSOD_TEXT (bst, LEFT, /* "test net" */
- "t\033\be\033\bs\033\bt\033\b \033\bn\033\be\033\bt\033\b");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 2);
- BSOD_TEXT (bst, LEFT, "\n\033");
- BSOD_CHAR_DELAY (bst, 0);
-
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT, "\r Lance register test -- succeeded.\n\033");
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT, "\r Internal loopback test -- succeeded.\n\033");
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT, "\r External loopback test -- succeeded.\n"
- "ok ");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 8);
-
- BSOD_TEXT (bst, LEFT, "\rok ");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4);
- BSOD_CHAR_DELAY (bst, 80000);
- BSOD_TEXT (bst, LEFT, /* "boot cdrom" */
- "b\033\bo\033\bo\033\bt\033\b \033\bc\033\bd\033\br\033\bo\033\bm\033\b");
- BSOD_TEXT (bst, LEFT, " \n");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "\rBoot device: /sbus/esp@0,800000/sd@6,0:c File and args:\n\033");
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "\rroot on fstype 4.3\n"
- "Boot: vmunix\n\033");
-
- BSOD_TEXT (bst, LEFT, "\rSize: 696320+");
- BSOD_CHAR_DELAY (bst, 5000);
- BSOD_INVERT(bst);
- BSOD_TEXT (bst, LEFT, /* spinner */
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/"
- "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/" "\b-\b\\\b|\b/");
- BSOD_INVERT(bst);
- BSOD_TEXT (bst, LEFT, "\b+");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "2218504+28056 bytes\n\033");
- BSOD_PAUSE (bst, 1000000);
-
- i = random() % 3;
-
- if (i == 0)
- {
- BSOD_TEXT (bst, LEFT,
- "\rSunOS Release 4.1.1 (MUNIX) #1: Thu Oct 11 11:22:48 PDT 1990\n"
- "Copyright (c) 1983-1990, Sun Microsystems, Inc.\n"
- "mem = 16384K (0x1000000)\n"
- "avail mem = 12865536\n"
- "Ethernet address = 8:0:20:37:1:87\n"
- "No FPU in configuration\n"
- "cpu = SUNW,Sun 4/40\n"
- "zs0 at obio 0xf1000000 pri 12\n"
- "zs1 at obio 0xf0000000 pri 12\n"
- "sbus0 at SBus slot 0 0x0\n"
- "dma0 at SBus slot 0 0x400000\n"
- "esp0 at SBus slot 0 0x800000 pri 3\n"
- "\033");
- }
- else if (i == 1)
- {
- BSOD_TEXT (bst, LEFT,
- "\rSunOS Release 5.6 Version Generic [UNIX(R) System V Release 4.0]\n"
- "Copyright (c) 1983-1997, Sun Microsystems, Inc.\n"
- "No FPU in configuration\n"
- "WARNING: kbd: Unknown keyboard type, Type 3 assumed.\n"
- "WARNING: kbd: Unknown keyboard type, Type 3 assumed.\n"
- "Configuring devices...\n"
- "\033");
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "\rWARNING: /sbus@1,f8000000/esp@0,800000/sd@6,0 (sd6):\n"
- " incomplete read- retrying\n"
- "\n"
- "loadkeys: ioctl(KIOCLAYOUT): Invalid argument\n"
- "\033");
- }
- else
- {
- BSOD_TEXT (bst, LEFT,
- "\rSunOS Release 5.3 Version Generic [UNIX(R) System V Release 4.0]\n"
- "Copyright (c) 1983-1993, Sun Microsystems, Inc.\n"
- "No FPU in configuration\n"
- "WARNING: /sbus@1,f8000000/esp@0,800000/sd@3,0 (sd3):\n"
- " corrupt label - wrong magic number\n"
- "\n"
- "\\ unexpected data phase\n\033");
- for (i = 0; i < 3; i++)
- {
- BSOD_PAUSE (bst, 3000000);
- if (i > 0)
- BSOD_TEXT (bst, LEFT,
- "\r polled command timeout\n");
- BSOD_TEXT (bst, LEFT,
- "\resp: State=DATA Last State=UNKNOWN\n"
- "esp: Latched stat=0x11<XZERO,IO> intr=0x10<BUS,FCMO>"
- " fifo 0x0\n"
- "esp: lst msg out: IDENTIFY; lst msg in: COMMAND COMPLETE\n"
- "esp: DMA csr=0x10<INTEN>\n"
- "esp: addr=fff0100f dmacnt=8000 last=fff01008 last_cnt=7\n"
- "esp: Cmd dump for Target 6 Lun 0:\n"
- "esp: cdblen=6, cdb=[ 0x0 0x0 0x0 0x0 0x1 0x0 ]\n"
- "esp: pkt_state 0x3<SEL,ARB> pkt_flags 0x10000"
- " pkt_statistics 0x0\n"
- "esp: cmd_flags=0x10022 cmd_timeout=120\n"
- "\033");
- }
- BSOD_PAUSE (bst, 3000000);
- BSOD_TEXT (bst, LEFT,
- "\rWARNING: /sbus@1,f8000000/esp@0,800000/sd@6,0 (sd6):\n"
- " incomplete read- retrying\n"
- "\n"
- "loadkeys: ioctl(KIOCLAYOUT): Invalid argument\n"
- "\033");
- }
-
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "\rsd1 at esp0 target 1 lun 0\n"
- "sd1: corrupt label - wrong magic number\n"
- "sd1: Vendor ' SEAGAT', product ' ', 786432 512 byte blocks\n"
- "sr0: Unrecongized vendor 'Sony ',"
- " product 'CDU-76S 'sr0 at esp0 target 6 lun 0\n"
- "le0 at SBus slot 0 0xc00000 pri 5\n"
- "fd0 at obio 0xf7200000 pri 11\n\033");
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "\rrd0: using preloaded munixfs\n"
- "WARNING: TOD clock not initialized -- CHECK AND RESET THE DATE!\n"
- "root on rd0a fstype 4.2\n"
- "swap on ns0b fstype spec size 12480K\n"
- "dump on ns0b fstype spec size 12468K\n"
- "\033");
- BSOD_PAUSE (bst, 4000000);
-
- i = random() % 3;
-
- if (i == 0)
- {
- BSOD_TEXT (bst, LEFT,
- "\rStarting OpenWindows...\n"
- "\n"
- "\n"
- "waiting for X server to begin accepting connections \033");
- BSOD_PAUSE (bst, 2500000);
- BSOD_TEXT (bst, LEFT, "\b.\033");
- BSOD_PAUSE (bst, 2500000);
- BSOD_TEXT (bst, LEFT, "\b \n.\033");
- for (i = 0; i < 10; i++)
- {
- BSOD_PAUSE (bst, 2500000);
- BSOD_TEXT (bst, LEFT, "\b.\033");
- BSOD_PAUSE (bst, 2500000);
- BSOD_TEXT (bst, LEFT, "\b \n.\033");
- }
- }
- else if (i == 1)
- {
- BSOD_TEXT (bst, LEFT,
- "\rCan't invoke /sbin/init, error 13\n"
- "Can't invoke /etc/init, error 13\n"
- "Can't invoke /bin/init, error 13\n"
- "Can't invoke /usr/etc/init, error 13\n"
- "Can't invoke /usr/bin/init, error 13\n"
- "panic: icode\n"
- "syncing file systems...\033");
- BSOD_PAUSE (bst, 2000000);
- BSOD_TEXT (bst, LEFT, "\b done\n");
- BSOD_TEXT (bst, LEFT,
- "00000 low-memory static kernel pages\n"
- "00888 additional static and sysmap kernel pages\n"
- "00000 dynamic kernel data pages\n"
- "00008 additional user structure pages\n"
- "00000 segmap kernel pages\n"
- "00000 segvn kernel pages\n"
- "00000 current user process pages\n"
- "00000 user stack pages\n"
- "00896 total pages (896 chunks)\n"
- "\n"
- "dumping to vp ff007dd4, offset 17768\n"
- "0 total pages, dump failed: error 19\n"
- "rebooting...\n");
- }
- else
- {
- BSOD_TEXT (bst, LEFT,
- "\r \n"
- "What would you like to do?\n"
- " 1 - install SunOS mini-root\n"
- " 2 - exit to single user shell\n"
- "Enter a 1 or 2: ");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4);
- BSOD_TEXT (bst, LEFT,
- "2\n"
- "you may restart this script by typing <cntl-D>\n# ");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4);
- BSOD_CHAR_DELAY (bst, 80000);
- BSOD_TEXT (bst, LEFT, "l\033\bs\033\b");
- BSOD_TEXT (bst, LEFT, " \n");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- ".MUNIXFS bin extract stand\n"
- ".profile dev lib tmp\n"
- "README etc sbin usr\n"
- "# ");
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 4);
- BSOD_CHAR_DELAY (bst, 80000);
- BSOD_TEXT (bst, LEFT, /* ". extract" */
- ".\033\b \033\be\033\bx\033\bt\033\br\033\ba\033\bc\033\bt\033\b");
- BSOD_TEXT (bst, LEFT, " \n");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "using cdrom partition number 2\n"
- "esp0: data transfer overrun\n"
- " State=DATA Last State=DATA_DNE\n"
- " Latched stat=0x11<XZERO,IO> intr=0x10<BUS> fifo 0x0\n"
- " lst msg out: EXTENDED; lst msg in: COMMAND COMPLETE\n"
- " DMA csr=0x10<INTEN>\n"
- " addr=fff026d0 last=fff024d0 last_count=200\n"
- " Cmd dump for Target 6 Lun 0:\n"
- " cdb=[ 0x8 0x0 0x0 0x0 0x1 0x0 ]\n"
- " pkt_state 0xf<XFER,CMD,SEL,ARB> pkt_flags 0x0"
- " pkt_statistics 0x0\n"
- " Mapped Dma Space:\n"
- " Base = 0x24d0 Count = 0x200\n"
- " Transfer History:\n"
- " Base = 0x24d0 Count = 0x200\n");
- }
-
- BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 8);
-
- XClearWindow(dpy, window);
-
- return bst;
-}
-
-
-/* Linux panic and fsck, by jwz
- */
-static struct bsod_state *
-linux_fsck (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "linux", "Linux");
-
- int i;
- const char *sysname;
- char buf[1024];
-# ifdef HAVE_UNAME
- struct utsname uts;
-#endif /* UNAME */
-
- const char *linux_panic[] = {
- " kernel: Unable to handle kernel paging request at virtual "
- "address 0000f0ad\n",
- " kernel: printing eip:\n",
- " kernel: c01becd7\n",
- " kernel: *pde = 00000000\n",
- " kernel: Oops: 0000\n",
- " kernel: CPU: 0\n",
- " kernel: EIP: 0010:[<c01becd7>] Tainted: P \n",
- " kernel: EFLAGS: 00010286\n",
- " kernel: eax: 0000ff00 ebx: ca6b7e00 ecx: ce1d7a60 edx: ce1d7a60\n",
- " kernel: esi: ca6b7ebc edi: 00030000 ebp: d3655ca0 esp: ca6b7e5c\n",
- " kernel: ds: 0018 es: 0018 ss: 0018\n",
- " kernel: Process crond (pid: 1189, stackpage=ca6b7000)\n",
- " kernel: Stack: d3655ca0 ca6b7ebc 00030054 ca6b7e7c c01c1e5b "
- "00000287 00000020 c01c1fbf \n",
- "",
- " kernel: 00005a36 000000dc 000001f4 00000000 00000000 "
- "ce046d40 00000001 00000000 \n",
- "", "", "",
- " kernel: ffffffff d3655ca0 d3655b80 00030054 c01bef93 "
- "d3655ca0 ca6b7ebc 00030054 \n",
- "", "", "",
- " kernel: Call Trace: [<c01c1e5b>] [<c01c1fbf>] [<c01bef93>] "
- "[<c01bf02b>] [<c0134c4f>]\n",
- "", "", "",
- " kernel: [<c0142562>] [<c0114f8c>] [<c0134de3>] [<c010891b>]\n",
- " kernel: \n",
- " kernel: Code: 2a 00 75 08 8b 44 24 2c 85 c0 74 0c 8b 44 24 58 83 48 18 "
- "08 \n",
- 0
- };
-
- bst->scroll_p = True;
- bst->wrap_p = True;
- bst->left_margin = bst->right_margin = 10;
- bst->top_margin = bst->bottom_margin = 10;
-
- sysname = "linux";
-# ifdef HAVE_UNAME
- {
- char *s;
- if (uname (&uts) >= 0)
- sysname = uts.nodename;
- s = strchr (sysname, '.');
- if (s) *s = 0;
- }
-# endif /* !HAVE_UNAME */
-
-
- BSOD_TEXT (bst, LEFT, "waiting for X server to shut down ");
- BSOD_PAUSE (bst, 100000);
- BSOD_TEXT (bst, LEFT,
- "XIO: fatal IO error 2 (broken pipe) on X server \":0.0\"\n"
- " after 339471 requests (339471 known processed) "
- "with 0 events remaining\n");
- BSOD_CHAR_DELAY (bst, 300000);
- BSOD_TEXT (bst, LEFT, ".........\n");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "xinit: X server slow to shut down, sending KILL signal.\n"
- "waiting for server to die ");
- BSOD_CHAR_DELAY (bst, 300000);
- BSOD_TEXT (bst, LEFT, "...\n");
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_TEXT (bst, LEFT, "xinit: Can't kill server\n");
- BSOD_PAUSE (bst, 2000000);
-
- sprintf (buf, "\n%s Login: ", sysname);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "\n\n"
- "Parallelizing fsck version 1.22 (22-Jun-2001)\n"
- "e2fsck 1.22, 22-Jun-2001 for EXT2 FS 0.5b, 95/08/09\n"
- "Warning! /dev/hda1 is mounted.\n"
- "/dev/hda1 contains a file system with errors, check forced.\n");
- BSOD_PAUSE (bst, 1000000);
-
- if (0 == random() % 2)
- BSOD_TEXT (bst, LEFT,
- "Couldn't find ext2 superblock, trying backup blocks...\n"
- "The filesystem size (according to the superblock) is 3644739 blocks\n"
- "The physical size of the device is 3636706 blocks\n"
- "Either the superblock or the partition table is likely to be corrupt!\n"
- "Abort<y>? no\n");
- BSOD_PAUSE (bst, 1000000);
-
- AGAIN:
-
- BSOD_TEXT (bst, LEFT, "Pass 1: Checking inodes, blocks, and sizes\n");
- BSOD_PAUSE (bst, 2000000);
-
- i = (random() % 60) - 20;
- while (--i > 0)
- {
- int b = random() % 0xFFFF;
- sprintf (buf, "Deleted inode %d has zero dtime. Fix<y>? yes\n\n", b);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000);
- }
-
- i = (random() % 40) - 10;
- if (i > 0)
- {
- int g = random() % 0xFFFF;
- int b = random() % 0xFFFFFFF;
-
- BSOD_PAUSE (bst, 1000000);
-
- sprintf (buf, "Warning: Group %d's copy of the group descriptors "
- "has a bad block (%d).\n", g, b);
- BSOD_TEXT (bst, LEFT, buf);
-
- b = random() % 0x3FFFFF;
- while (--i > 0)
- {
- b += random() % 0xFFFF;
- sprintf (buf,
- "Error reading block %d (Attempt to read block "
- "from filesystem resulted in short read) while doing "
- "inode scan. Ignore error<y>?",
- b);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 10000);
- BSOD_TEXT (bst, LEFT, " yes\n\n");
- }
- }
-
- if (0 == (random() % 10))
- {
- BSOD_PAUSE (bst, 1000000);
-
- i = 3 + (random() % 10);
- while (--i > 0)
- {
- BSOD_TEXT (bst, LEFT,
- "Could not allocate 256 block(s) for inode table: "
- "No space left on device\n");
- BSOD_PAUSE (bst, 1000);
- }
- BSOD_TEXT (bst, LEFT, "Restarting e2fsck from the beginning...\n");
- BSOD_PAUSE (bst, 2000000);
-
- goto AGAIN;
- }
-
- i = (random() % 20) - 5;
-
- if (i > 0)
- BSOD_PAUSE (bst, 1000000);
-
- while (--i > 0)
- {
- int j = 5 + (random() % 10);
- int w = random() % 4;
-
- while (--j > 0)
- {
- int b = random() % 0xFFFFF;
- int g = random() % 0xFFF;
-
- if (0 == (random() % 10))
- b = 0;
- else if (0 == (random() % 10))
- b = -1;
-
- if (w == 0)
- sprintf (buf,
- "Inode table for group %d not in group. (block %d)\n"
- "WARNING: SEVERE DATA LOSS POSSIBLE.\n"
- "Relocate<y>?",
- g, b);
- else if (w == 1)
- sprintf (buf,
- "Block bitmap for group %d not in group. (block %d)\n"
- "Relocate<y>?",
- g, b);
- else if (w == 2)
- sprintf (buf,
- "Inode bitmap %d for group %d not in group.\n"
- "Continue<y>?",
- b, g);
- else /* if (w == 3) */
- sprintf (buf,
- "Bad block %d in group %d's inode table.\n"
- "WARNING: SEVERE DATA LOSS POSSIBLE.\n"
- "Relocate<y>?",
- b, g);
-
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_TEXT (bst, LEFT, " yes\n\n");
- BSOD_PAUSE (bst, 1000);
- }
- }
-
-
- if (0 == random() % 10) goto PANIC;
- BSOD_TEXT (bst, LEFT, "Pass 2: Checking directory structure\n");
- BSOD_PAUSE (bst, 2000000);
-
- i = (random() % 20) - 5;
- while (--i > 0)
- {
- int n = random() % 0xFFFFF;
- int o = random() % 0xFFF;
- sprintf (buf, "Directory inode %d, block 0, offset %d: "
- "directory corrupted\n"
- "Salvage<y>? ",
- n, o);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000);
- BSOD_TEXT (bst, LEFT, " yes\n\n");
-
- if (0 == (random() % 100))
- {
- sprintf (buf, "Missing '.' in directory inode %d.\nFix<y>?", n);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000);
- BSOD_TEXT (bst, LEFT, " yes\n\n");
- }
- }
-
- if (0 == random() % 10)
- goto PANIC;
-
- BSOD_TEXT (bst, LEFT,
- "Pass 3: Checking directory connectivity\n"
- "/lost+found not found. Create? yes\n");
- BSOD_PAUSE (bst, 2000000);
-
- /* Unconnected directory inode 4949 (/var/spool/squid/06/???)
- Connect to /lost+found<y>? yes
-
- '..' in /var/spool/squid/06/08 (20351) is <The NULL inode> (0), should be
- /var/spool/squid/06 (20350).
- Fix<y>? yes
-
- Unconnected directory inode 128337 (/var/spool/squid/06/???)
- Connect to /lost+found<y>? yes
- */
-
-
- if (0 == random() % 10) goto PANIC;
- BSOD_TEXT (bst, LEFT, "Pass 4: Checking reference counts\n");
- BSOD_PAUSE (bst, 2000000);
-
- /* Inode 2 ref count is 19, should be 20. Fix<y>? yes
-
- Inode 4949 ref count is 3, should be 2. Fix<y>? yes
-
- ...
-
- Inode 128336 ref count is 3, should be 2. Fix<y>? yes
-
- Inode 128337 ref count is 3, should be 2. Fix<y>? yes
-
- */
-
-
- if (0 == random() % 10) goto PANIC;
- BSOD_TEXT (bst, LEFT, "Pass 5: Checking group summary information\n");
- BSOD_PAUSE (bst, 2000000);
-
- i = (random() % 200) - 50;
- if (i > 0)
- {
- BSOD_TEXT (bst, LEFT, "Block bitmap differences: ");
- while (--i > 0)
- {
- sprintf (buf, " %d", -(random() % 0xFFF));
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000);
- }
- BSOD_TEXT (bst, LEFT, "\nFix? yes\n\n");
- }
-
-
- i = (random() % 100) - 50;
- if (i > 0)
- {
- BSOD_TEXT (bst, LEFT, "Inode bitmap differences: ");
- while (--i > 0)
- {
- sprintf (buf, " %d", -(random() % 0xFFF));
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000);
- }
- BSOD_TEXT (bst, LEFT, "\nFix? yes\n\n");
- }
-
- i = (random() % 20) - 5;
- while (--i > 0)
- {
- int g = random() % 0xFFFF;
- int c = random() % 0xFFFF;
- sprintf (buf,
- "Free blocks count wrong for group #0 (%d, counted=%d).\nFix? ",
- g, c);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000);
- BSOD_TEXT (bst, LEFT, " yes\n\n");
- }
-
- PANIC:
-
- i = 0;
- BSOD_TEXT (bst, LEFT, "\n\n");
- while (linux_panic[i])
- {
- time_t t = time ((time_t *) 0);
- struct tm *tm = localtime (&t);
- char prefix[100];
-
- if (*linux_panic[i])
- {
- strftime (prefix, sizeof(prefix)-1, "%b %d %H:%M:%S ", tm);
- BSOD_TEXT (bst, LEFT, prefix);
- BSOD_TEXT (bst, LEFT, sysname);
- BSOD_TEXT (bst, LEFT, linux_panic[i]);
- BSOD_PAUSE (bst, 1000);
- }
- else
- BSOD_PAUSE (bst, 300000);
-
- i++;
- }
- BSOD_PAUSE (bst, 4000000);
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/*
- * Linux (hppa) panic, by Stuart Brady <sdbrady@ntlworld.com>
- * Output courtesy of M. Grabert
- */
-static struct bsod_state *
-hppa_linux (Display *dpy, Window window)
-{
- struct bsod_state *bst =
- make_bsod_state (dpy, window, "hppalinux", "HPPALinux");
-
- int i = 0;
- const char *release, *sysname, *gccversion, *version;
- long int linedelay = 0;
- char ss[1024];
-# ifdef HAVE_UNAME
- struct utsname uts;
-# endif /* UNAME */
-
- __extension__
- struct { long int delay; const char *string; } linux_panic[] =
- {{ 0, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
- "\n\n\n\n\n\n\n\n\n\n\n\n\n" },
- { 0, "Linux version %s (root@%s) (gcc version %s) %s\n" },
- { 4000, "FP[0] enabled: Rev 1 Model 16\n" },
- { 10, "The 32-bit Kernel has started...\n" },
- { -1, "Determining PDC firmware type: System Map.\n" },
- { -1, "model 00005bb0 00000481 00000000 00000002 7778df9f 100000f0 "
- "00000008 000000b2 000000b2\n" },
- { -1, "vers 00000203\n" },
- { -1, "CPUID vers 17 rev 7 (0x00000227)\n" },
- { -1, "capabilities 0x3\n" },
- { -1, "model 9000/785/C3000\n" },
- { -1, "Total Memory: 1024 Mb\n" },
- { -1, "On node 0 totalpages: 262144\n" },
- { -1, " DMA zone: 262144 pages, LIFO batch:16\n" },
- { -1, " Normal zone: 0 pages, LIFO batch:1\n" },
- { -1, " HighMem zone: 0 pages, LIFO batch:1\n" },
- { -1, "LCD display at f05d0008,f05d0000 registered\n" },
- { -1, "Building zonelist for node : 0\n" },
- { -1, "Kernel command line: ide=nodma root=/dev/sda3 HOME=/ ip=off "
- "console=ttyS0 TERM=vt102 palo_kernel=2/vmlinux-2.6\n" },
- { -1, "ide_setup: ide=nodmaIDE: Prevented DMA\n" },
- { -1, "PID hash table entries: 16 (order 4: 128 bytes)\n" },
- {500, "Console: colour dummy device 160x64\n" },
- { 10, "Memory: 1034036k available\n" },
- { -1, "Calibrating delay loop... 796.67 BogoMIPS\n" },
- { -1, "Dentry cache hash table entries: 131072 (order: 7, 524288 "
- "bytes)\n" },
- { -1, "Inode-cache hash table entries: 65536 (order: 6, 262144 "
- "bytes)\n" },
- { -1, "Mount-cache hash table entries: 512 (order: 0, 4096 bytes)\n" },
- { -1, "POSIX conformance testing by UNIFIX\n" },
- { -1, "NET: Registered protocol family 16\n" },
- { 100, "Searching for devices...\n" },
- { 25, "Found devices:\n" },
- { 10, "1. Astro BC Runway Port at 0xfed00000 [10] "
- "{ 12, 0x0, 0x582, 0x0000b }\n" },
- { -1, "2. Elroy PCI Bridge at 0xfed30000 [10/0] "
- "{ 13, 0x0, 0x782, 0x0000a }\n" },
- { -1, "3. Elroy PCI Bridge at 0xfed32000 [10/1] "
- "{ 13, 0x0, 0x782, 0x0000a }\n" },
- { -1, "4. Elroy PCI Bridge at 0xfed38000 [10/4] "
- "{ 13, 0x0, 0x782, 0x0000a }\n" },
- { -1, "5. Elroy PCI Bridge at 0xfed3c000 [10/6] "
- "{ 13, 0x0, 0x782, 0x0000a }\n" },
- { -1, "6. AllegroHigh W at 0xfffa0000 [32] "
- "{ 0, 0x0, 0x5bb, 0x00004 }\n" },
- { -1, "7. Memory at 0xfed10200 [49] { 1, 0x0, 0x086, 0x00009 }\n" },
- { -1, "CPU(s): 1 x PA8500 (PCX-W) at 400.000000 MHz\n" },
- { -1, "SBA found Astro 2.1 at 0xfed00000\n" },
- { -1, "lba version TR2.1 (0x2) found at 0xfed30000\n" },
- { -1, "lba version TR2.1 (0x2) found at 0xfed32000\n" },
- { -1, "lba version TR2.1 (0x2) found at 0xfed38000\n" },
- { -1, "lba version TR2.1 (0x2) found at 0xfed3c000\n" },
- { 100, "SCSI subsystem initialized\n" },
- { 10, "drivers/usb/core/usb.c: registered new driver usbfs\n" },
- { -1, "drivers/usb/core/usb.c: registered new driver hub\n" },
- { -1, "ikconfig 0.7 with /proc/config*\n" },
- { -1, "Initializing Cryptographic API\n" },
- { 250, "SuperIO: probe of 0000:00:0e.0 failed with error -1\n" },
- { 20, "SuperIO: Found NS87560 Legacy I/O device at 0000:00:0e.1 "
- "(IRQ 64)\n" },
- { -1, "SuperIO: Serial port 1 at 0x3f8\n" },
- { -1, "SuperIO: Serial port 2 at 0x2f8\n" },
- { -1, "SuperIO: Parallel port at 0x378\n" },
- { -1, "SuperIO: Floppy controller at 0x3f0\n" },
- { -1, "SuperIO: ACPI at 0x7e0\n" },
- { -1, "SuperIO: USB regulator enabled\n" },
- { -1, "SuperIO: probe of 0000:00:0e.2 failed with error -1\n" },
- { -1, "Soft power switch enabled, polling @ 0xf0400804.\n" },
- { -1, "pty: 256 Unix98 ptys configured\n" },
- { -1, "Generic RTC Driver v1.07\n" },
- { -1, "Serial: 8250/16550 driver $" "Revision: 1.100 $ 13 ports, "
- "IRQ sharing disabled\n" },
- { -1, "ttyS0 at I/O 0x3f8 (irq = 0) is a 16550A\n" },
- { -1, "ttyS1 at I/O 0x2f8 (irq = 0) is a 16550A\n" },
- { -1, "Linux Tulip driver version 1.1.13 (May 11, 2002)\n" },
- { 150, "tulip0: no phy info, aborting mtable build\n" },
- { 10, "tulip0: MII transceiver #1 config 1000 status 782d "
- "advertising 01e1.\n" },
- { -1, "eth0: Digital DS21143 Tulip rev 65 at 0xf4008000, "
- "00:10:83:F9:B4:34, IRQ 66.\n" },
- { -1, "Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2\n" },
- { -1, "ide: Assuming 33MHz system bus speed for PIO modes; "
- "override with idebus=xx\n" },
- { 100, "SiI680: IDE controller at PCI slot 0000:01:06.0\n" },
- { 10, "SiI680: chipset revision 2\n" },
- { -1, "SiI680: BASE CLOCK == 133\n" },
- { -1, "SiI680: 100% native mode on irq 128\n" },
- { -1, " ide0: MMIO-DMA at 0xf4800000-0xf4800007 -- "
- "Error, MMIO ports already in use.\n" },
- { -1, " ide1: MMIO-DMA at 0xf4800008-0xf480000f -- "
- "Error, MMIO ports already in use.\n" },
- { 5, "hda: TS130220A2, ATA DISK drive\n" },
- { -1, " _______________________________\n" },
- { -1, " < Your System ate a SPARC! Gah! >\n" },
- { -1, " -------------------------------\n" },
- { -1, " \\ ^__^\n" },
- { -1, " \\ (xx)\\_______\n" },
- { -1, " (__)\\ )\\/\\\n" },
- { -1, " U ||----w |\n" },
- { -1, " || ||\n" },
- { -1, "swapper (pid 1): Breakpoint (code 0)\n" },
- { -1, "\n" },
- { -1, " YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n" },
- { -1, "PSW: 00000000000001001111111100001111 Not tainted\n" },
- { -1, "r00-03 4d6f6f21 1032f010 10208f34 103fc2e0\n" },
- { -1, "r04-07 103fc230 00000001 00000001 0000000f\n" },
- { -1, "r08-11 103454f8 000f41fa 372d3980 103ee404\n" },
- { -1, "r12-15 3ccbf700 10344810 103ee010 f0400004\n" },
- { -1, "r16-19 f00008c4 f000017c f0000174 00000000\n" },
- { -1, "r20-23 fed32840 fed32800 00000000 0000000a\n" },
- { -1, "r24-27 0000ffa0 000000ff 103fc2e0 10326010\n" },
- { -1, "r28-31 00000000 00061a80 4ff98340 10208f34\n" },
- { -1, "sr0-3 00000000 00000000 00000000 00000000\n" },
- { -1, "sr4-7 00000000 00000000 00000000 00000000\n" },
- { -1, "\n" },
- { -1, "IASQ: 00000000 00000000 IAOQ: 00000000 00000004\n" },
- { -1, " IIR: 00000000 ISR: 00000000 IOR: 00000000\n" },
- { -1, " CPU: 0 CR30: 4ff98000 CR31: 1037c000\n" },
- { -1, " ORIG_R28: 55555555\n" },
- { -1, " IAOQ[0]: 0x0\n" },
- { -1, " IAOQ[1]: 0x4\n" },
- { -1, " RP(r2): probe_hwif+0x218/0x44c\n" },
- { -1, "Kernel panic: Attempted to kill init!\n" },
- { 0, NULL }};
-
- bst->scroll_p = True;
- bst->wrap_p = True;
- bst->left_margin = bst->right_margin = 10;
- bst->top_margin = bst->bottom_margin = 10;
-
- release = "2.6.0-test11-pa2";
- sysname = "hppa";
- version = "#2 Mon Dec 8 06:09:27 GMT 2003";
-# ifdef HAVE_UNAME
- {
- char *s;
- if (uname (&uts) >= 0)
- {
- sysname = uts.nodename;
- if (!strcmp (uts.sysname, "Linux"))
- {
- release = uts.release;
- version = uts.version;
- }
- }
- s = strchr (sysname, '.');
- if (s) *s = 0;
- }
-# endif /* !HAVE_UNAME */
-
-# if (defined (__GNUC__) && defined (__VERSION__))
- gccversion = __VERSION__;
-# else /* !(defined (__GNUC__) && defined (__VERSION__)) */
- gccversion = "3.3.2 (Debian)";
-# endif /* !(defined (__GNUC__) && defined (__VERSION__)) */
-
- /* Insert current host name into banner on line 2 */
- {
- snprintf (ss, 1024, linux_panic[1].string,
- release, sysname, gccversion, version);
- linux_panic[1].string = ss;
- }
-
- BSOD_PAUSE (bst, 100000);
- while (linux_panic[i].string)
- {
- if (linux_panic[i].delay != -1)
- linedelay = linux_panic[i].delay * 1000;
- BSOD_PAUSE (bst, linedelay);
- BSOD_TEXT (bst, LEFT, linux_panic[i].string);
- i++;
- }
-
- bst->y = bst->xgwa.height - bst->yoff
- - bst->font->ascent - bst->font->descent;
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* VMS by jwz (text sent by Roland Barmettler <roli@barmettler.net>)
- */
-static struct bsod_state *
-vms (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "vms", "VMS");
-
- const char *sysname;
- int char_delay = 0;
- int dot_delay = 40000;
- int chunk_delay = 500000;
- char *s, *s1;
- int i;
- int arg_count;
-# ifdef HAVE_UNAME
- struct utsname uts;
-# endif /* UNAME */
-
- __extension__
-
- const char *lines[] = {
- "%CNXMAN, Lost connection to system #\n"
- "%SHADOW-I-VOLPROC, DSA0: shadow master has changed. "
- "Dump file WILL be written if system crashes.\n"
- "\n",
- "",
-
- "%CNXMAN, Quorum lost, blocking activity\n"
- "%CNXMAN, Timed-out lost connection to system #\n"
- "%CNXMAN, Timed-out lost connection to system #\n"
- "%CNXMAN, Timed-out lost connection to system #\n"
- "%CNXMAN, Proposing reconfiguration of the VMScluster\n",
- "",
-
- "%CNXMAN, Removed from VMScluster system #\n"
- "%CNXMAN, Removed from VMScluster system #\n"
- "%CNXMAN, Removed from VMScluster system #\n"
- "%CNXMAN, Completing VMScluster state transition\n",
-
- "\n"
- "**** OpenVMS (TM) Alpha Operating system V7.3-1 - BUGCHECK ****\n"
- "\n"
- "** Bugcheck code = 000005DC: CLUEXIT, Node voluntarily exiting "
- "VMScluster\n"
- "** Crash CPU: 00 Primary CPU: 00 Active CPUs: 00000001\n"
- "** Current Process = NULL\n"
- "** Current PSB ID = 00000001\n"
- "** Image Name =\n"
- "\n"
- "** Dumping error log buffers to HBVS unit 0\n"
- "**** Unable to dump error log buffers to remaining shadow set members\n"
- "** Error log buffers not dumped to HBVS unit 200\n"
- "\n"
- "** Dumping memory to HBVS unit 0\n"
- "**** Starting compressed selective memory dump at #...\n",
-
- "...",
-
- "\n"
- "**** Memory dump complete - not all processes or global pages saved\n",
-
- "\n"
- "halted CPU 0\n",
- "",
-
- "\n"
- "halt code = 5\n"
- "HALT instruction executed\n"
- "PC = ffffffff800c3884\n",
-
- "\n"
- "CPU 0 booting\n",
-
- "\n"
- "resetting all I/O buses\n"
- "\n"
- "\n"
- };
- char *args[8];
- int ids[3];
-
- bst->scroll_p = True;
- bst->wrap_p = True;
- bst->left_margin = bst->right_margin = 10;
- bst->top_margin = bst->bottom_margin = 10;
-
- sysname = "VMS001";
-# ifdef HAVE_UNAME
- {
- if (uname (&uts) >= 0)
- sysname = uts.nodename;
- s = strchr (sysname, '.');
- if (s) *s = 0;
- }
-# endif /* !HAVE_UNAME */
-
- args[0] = malloc (strlen(sysname) + 7);
- strcpy (args[0], sysname);
- args[0][5] = 0;
-
- /* Pick three numbers, 1-9, no overlaps. */
- ids[0] = 1 + (random() % 9);
- do { ids[1] = 1 + (random() % 9); } while (ids[1]==ids[0]);
- do { ids[2] = 1 + (random() % 9); } while (ids[2]==ids[0] || ids[2]==ids[1]);
-
- i = strlen(args[0])-1;
- if (i < 6) i++;
- args[0][i] = '0' + ids[0];
- args[0][i+1] = 0;
-
- for (s = args[0]; *s; s++)
- if (isalpha(*s)) *s = toupper (*s);
-
- args[1] = strdup (args[0]);
- args[2] = strdup (args[0]); args[2][i] = '0' + ids[1];
- args[3] = strdup (args[0]); args[3][i] = '0' + ids[2];
-
- args[4] = strdup (args[1]);
- args[5] = strdup (args[2]);
- args[6] = strdup (args[3]);
-
- {
- time_t t = time ((time_t *) 0);
- struct tm *tm = localtime (&t);
- args[7] = malloc (30);
- strftime (args[7], 29, "%d-%b-%Y %H:%M", tm);
- for (s = args[7]; *s; s++)
- if (isalpha(*s)) *s = toupper (*s);
- }
-
- arg_count = 0;
- for (i = 0; i < countof(lines); i++)
- {
- const char *fmt = lines[i];
- if (! strcmp (fmt, "..."))
- {
- int steps = 180 + (random() % 60);
- while (--steps >= 0)
- {
- BSOD_TEXT (bst, LEFT, ".");
- BSOD_PAUSE (bst, dot_delay);
- }
- }
- else
- {
- char *fmt2 = malloc (strlen (fmt) * 2 + 1);
- for (s = (char *) fmt, s1 = fmt2; *s; s++)
- {
- if (*s == '#')
- {
- strcpy (s1, args[arg_count++]);
- s1 += strlen(s1);
- }
- else
- *s1++ = *s;
- }
- *s1 = 0;
- BSOD_CHAR_DELAY (bst, char_delay);
- BSOD_TEXT (bst, LEFT, fmt2);
- free (fmt2);
- BSOD_CHAR_DELAY (bst, 0);
- BSOD_PAUSE (bst, chunk_delay);
- }
- }
-
- for (i = 0; i < countof (args); i++)
- free (args[i]);
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* HVX (formerly GCOS6) and TPS6 crash
- by Brian Garratt <brian-m.garratt@bull.co.uk>
-
- GCOS6 is a Unix-like operating system developed by Honeywell in the
- 1970s in collaboration with MIT and AT&T (who called their version
- UNIX). Both are very much like MULTICS which Honeywell got from GE.
-
- HVX ("High-performance Virtual System on Unix") is an AIX application
- which emulates GCOS6 hardware on RS6000-like machines.
- */
-static struct bsod_state *
-hvx (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "hvx", "HVX");
-
- bst->scroll_p = True;
- bst->wrap_p = True;
- bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
- - bst->font->ascent;
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT,
- "(TP) Trap no E Effective address 00000000 Instruction D7DE\n"
- "(TP) Registers :\n"
- "(TP) B1 -> B7 03801B02 00000000 03880D45 038BABDB 0388AFFD"
- " 0389B3F8 03972317\n"
- "(TP) R1 -> R7 0001 0007 F10F 090F 0020 0106 0272\n"
- "(TP) P I Z M1 0388A18B 3232 0000 FF00\n"
- "(TP) Program counter is at offset 0028 from string YTPAD\n"
- "(TP) User id of task which trapped is LT 626\n"
- "(TP)?\n"
- );
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 100000);
- BSOD_TEXT (bst, LEFT, " TP CLOSE ALL");
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "\n(TP)?\n");
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 100000);
- BSOD_TEXT (bst, LEFT, " TP ABORT -LT ALL");
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "\n(TP)?\n");
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 100000);
- BSOD_TEXT (bst, LEFT, " TP STOP KILL");
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT,
- "\n"
- "(TP)?\n"
- "Core dumps initiated for selected HVX processes ...\n"
- "Core dumps complete.\n"
- "Fri Jul 19 15:53:09 2002\n"
- "Live registers for cp 0:\n"
- " P = 7de3 IW=0000 I=32 CI=30000000 S=80006013"
- " IV=aa0 Level=13\n"
- " R1-7 = 1f 913 13 4 8 0 0\n"
- " B1-7 = 64e71b a93 50e 64e73c 6c2c 7000 b54\n"
- "Memory dump starting to file /var/hvx/dp01/diag/Level2 ...\n"
- "Memory dump complete.\n"
- );
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* HPUX panic, by Tobias Klausmann <klausman@schwarzvogel.de>
- */
-static struct bsod_state *
-hpux (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "hpux", "HPUX");
- const char *sysname;
- char buf[2048];
-# ifdef HAVE_UNAME
- struct utsname uts;
-# endif /* UNAME */
-
- bst->scroll_p = True;
- bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
- - bst->font->ascent;
-
- sysname = "HPUX";
-# ifdef HAVE_UNAME
- {
- char *s;
- if (uname (&uts) >= 0)
- sysname = uts.nodename;
- s = strchr (sysname, '.');
- if (s) *s = 0;
- }
-# endif /* !HAVE_UNAME */
-
- BSOD_TEXT (bst, LEFT,
- " "
- " "
- " \n");
- sprintf (buf, "%.100s [HP Release B.11.00] (see /etc/issue)\n", sysname);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1000000);
- BSOD_TEXT (bst, LEFT,
- "Console Login:\n"
- "\n"
- " ******* Unexpected HPMC/TOC. Processor HPA FFFFFFFF'"
- "FFFA0000 *******\n"
- " GENERAL REGISTERS:\n"
- "r00/03 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
- "006C76C0\n"
- "r04/07 00000000'00000001 00000000'0126E328 00000000'00000000 00000000'"
- "0122B640\n"
- "r08/11 00000000'00000000 00000000'0198CFC0 00000000'000476FE 00000000'"
- "00000001\n"
- "r12/15 00000000'40013EE8 00000000'08000080 00000000'4002530C 00000000'"
- "4002530C\n"
- "r16/19 00000000'7F7F2A00 00000000'00000001 00000000'00000000 00000000'"
- "00000000\n"
- "r20/23 00000000'006C8048 00000000'00000001 00000000'00000000 00000000'"
- "00000000\n"
- "r24/27 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
- "00744378\n"
- "r28/31 00000000'00000000 00000000'007DD628 00000000'0199F2B0 00000000'"
- "00000000\n"
- " CONTROL REGISTERS:\n"
- "sr0/3 00000000'0F3B4000 00000000'0C2A2000 00000000'016FF800 00000000'"
- "00000000\n"
- "sr4/7 00000000'00000000 00000000'016FF800 00000000'0DBF1400 00000000'"
- "00000000\n"
- "pcq = 00000000'00000000.00000000'00104950 00000000'00000000.00000000'"
- "00104A14\n"
- "isr = 00000000'10240006 ior = 00000000'67D9E220 iir = 08000240 rctr = "
- "7FF10BB6\n"
- "\n"
- "pid reg cr8/cr9 00007700'0000B3A9 00000000'0000C5D8\n"
- "pid reg cr12/cr13 00000000'00000000 00000000'00000000\n"
- "ipsw = 000000FF'080CFF1F iva = 00000000'0002C000 sar = 3A ccr = C0\n"
- "tr0/3 00000000'006C76C0 00000000'00000001 00000000'00000000 00000000'"
- "7F7CE000\n"
- "tr4/7 00000000'03790000 0000000C'4FB68340 00000000'C07EE13F 00000000'"
- "0199F2B0\n"
- "eiem = FFFFFFF0'FFFFFFFF eirr = 80000000'00000000 itmr = 0000000C'"
- "4FD8EDE1\n"
- "cr1/4 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
- "00000000\n"
- "cr5/7 00000000'00000000 00000000'00000000 00000000'"
- "00000000\n"
- " MACHINE CHECK PARAMETERS:\n"
- "Check Type = 00000000 CPU STATE = 9E000001 Cache Check = 00000000\n"
- "TLB Check = 00000000 Bus Check = 00000000 PIM State = ? SIU "
- "Status = ????????\n"
- "Assists = 00000000 Processor = 00000000\n"
- "Slave Addr = 00000000'00000000 Master Addr = 00000000'00000000\n"
- "\n"
- "\n"
- "TOC, pcsq.pcoq = 0'0.0'104950 , isr.ior = 0'10240006.0'67d9e220\n"
- "@(#)B2352B/9245XB HP-UX (B.11.00) #1: Wed Nov 5 22:38:19 PST 1997\n"
- "Transfer of control: (display==0xd904, flags==0x0)\n"
- "\n"
- "\n"
- "\n"
- "*** A system crash has occurred. (See the above messages for details.)\n"
- "*** The system is now preparing to dump physical memory to disk, for use\n"
- "*** in debugging the crash.\n"
- "\n"
- "*** The dump will be a SELECTIVE dump: 40 of 256 megabytes.\n"
- "*** To change this dump type, press any key within 10 seconds.\n"
- "*** Proceeding with selective dump.\n"
- "\n"
- "*** The dump may be aborted at any time by pressing ESC.\n");
-
- {
- int i;
- int steps = 11;
- int size = 40;
- for (i = 0; i <= steps; i++)
- {
- sprintf (buf,
- "*** Dumping: %3d%% complete (%d of 40 MB) (device 64:0x2)\r",
- i * 100 / steps,
- i * size / steps);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 1500000);
- }
- }
-
- BSOD_TEXT (bst, LEFT, "\n*** System rebooting.\n");
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* IBM OS/390 aka MVS aka z/OS.
- Text from Dan Espen <dane@mk.telcordia.com>.
- Apparently this isn't actually a crash, just a random session...
- But who can tell.
- */
-static struct bsod_state *
-os390 (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "os390", "OS390");
-
- bst->scroll_p = True;
- bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
- - bst->font->ascent;
-
- BSOD_LINE_DELAY (bst, 100000);
- BSOD_TEXT (bst, LEFT,
- "\n*** System rebooting.\n"
- "* ISPF Subtask abend *\n"
- "SPF ENDED DUE TO ERROR+\n"
- "READY\n"
- "\n"
- "IEA995I SYMPTOM DUMP OUTPUT\n"
- " USER COMPLETION CODE=0222\n"
- " TIME=23.00.51 SEQ=03210 CPU=0000 ASID=00AE\n"
- " PSW AT TIME OF ERROR 078D1000 859DAF18 ILC 2 INTC 0D\n"
- " NO ACTIVE MODULE FOUND\n"
- " NAME=UNKNOWN\n"
- " DATA AT PSW 059DAF12 - 00181610 0A0D9180 70644710\n"
- " AR/GR 0: 00000000/80000000 1: 00000000/800000DE\n"
- " 2: 00000000/196504DC 3: 00000000/00037A78\n"
- " 4: 00000000/00037B78 5: 00000000/0003351C\n"
- " 6: 00000000/0000F0AD 7: 00000000/00012000\n"
- " 8: 00000000/059DAF10 9: 00000000/0002D098\n"
- " A: 00000000/059D9F10 B: 00000000/059D8F10\n"
- " C: 00000000/859D7F10 D: 00000000/00032D60\n"
- " E: 00000000/00033005 F: 01000002/00000041\n"
- " END OF SYMPTOM DUMP\n"
- "ISPS014 - ** Logical screen request failed - abend 0000DE **\n"
- "ISPS015 - ** Contact your system programmer or dialog developer.**\n"
- "*** ISPF Main task abend ***\n"
- "IEA995I SYMPTOM DUMP OUTPUT\n"
- " USER COMPLETION CODE=0222\n"
- " TIME=23.00.52 SEQ=03211 CPU=0000 ASID=00AE\n"
- " PSW AT TIME OF ERROR 078D1000 8585713C ILC 2 INTC 0D\n"
- " ACTIVE LOAD MODULE ADDRESS=05855000 OFFSET=0000213C\n"
- " NAME=ISPMAIN\n"
- " DATA AT PSW 05857136 - 00181610 0A0D9180 D3304770\n"
- " GR 0: 80000000 1: 800000DE\n"
- " 2: 00015260 3: 00000038\n"
- " 4: 00012508 5: 00000000\n"
- " 6: 000173AC 7: FFFFFFF8\n"
- " 8: 05858000 9: 00012CA0\n"
- " A: 05857000 B: 05856000\n"
- " C: 85855000 D: 00017020\n"
- " E: 85857104 F: 00000000\n"
- " END OF SYMPTOM DUMP\n"
- "READY\n"
- "***");
- BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* Compaq Tru64 Unix panic, by jwz as described by
- Tobias Klausmann <klausman@schwarzvogel.de>
- */
-static struct bsod_state *
-tru64 (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "tru64", "Tru64");
- const char *sysname;
- char buf[2048];
-# ifdef HAVE_UNAME
- struct utsname uts;
-#endif /* UNAME */
-
- bst->scroll_p = True;
- bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
- - bst->font->ascent;
-
- sysname = "127.0.0.1";
-# ifdef HAVE_UNAME
- {
- if (uname (&uts) >= 0)
- sysname = uts.nodename;
- }
-# endif /* !HAVE_UNAME */
-
- sprintf (buf,
- "Compaq Tru64 UNIX V5.1B (Rev. 2650) (%.100s) console\n"
- "\n"
- "login: ",
- sysname);
- BSOD_TEXT (bst, LEFT, buf);
- BSOD_PAUSE (bst, 6000000);
-
- BSOD_TEXT (bst, LEFT,
- "panic (cpu 0): trap: illegal instruction\n"
- "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
- "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
- " \n"
- "DUMP: blocks available: 1571600\n"
- "DUMP: blocks wanted: 100802 (partial compressed dump) [OKAY]\n"
- "DUMP: Device Disk Blocks Available\n"
- "DUMP: ------ ---------------------\n"
- "DUMP: 0x1300023 1182795 - 1571597 (of 1571598) [primary swap]\n"
- "DUMP.prom: Open: dev 0x5100041, block 2102016: SCSI 0 11 0 2 200 0 0\n"
- "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
- "DUMP: Writing data");
-
- {
- int i;
- int steps = 4 + (random() % 8);
- BSOD_CHAR_DELAY (bst, 1000000);
- for (i = 0; i < steps; i++)
- BSOD_TEXT (bst, LEFT, ".");
- BSOD_CHAR_DELAY (bst, 0);
- sprintf (buf, "[%dMB]\n", steps);
- BSOD_TEXT (bst, LEFT, buf);
- }
-
- BSOD_TEXT (bst, LEFT,
- "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
- "DUMP: crash dump complete.\n"
- "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
- " \n"
- "DUMP: second crash dump skipped: 'dump_savecnt' enforced.\n");
- BSOD_PAUSE (bst, 4000000);
-
- BSOD_TEXT (bst, LEFT,
- "\n"
- "halted CPU 0\n"
- "\n"
- "halt code = 5\n"
- "HALT instruction executed\n"
- "PC = fffffc00005863b0\n");
- BSOD_PAUSE (bst, 3000000);
-
- BSOD_TEXT (bst, LEFT,
- "\n"
- "CPU 0 booting\n"
- "\n"
- "\n"
- "\n");
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* MS-DOS, by jwz
- */
-static struct bsod_state *
-msdos (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "msdos", "MSDOS");
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "C:\\WINDOWS>");
- BSOD_CURSOR (bst, CURSOR_LINE, 200000, 8);
-
- BSOD_CHAR_DELAY (bst, 200000);
- BSOD_TEXT (bst, LEFT, "dir a:");
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "\nNot ready reading drive A\nAbort, Retry, Fail?");
-
- BSOD_CURSOR (bst, CURSOR_LINE, 200000, 10);
- BSOD_CHAR_DELAY (bst, 200000);
- BSOD_TEXT (bst, LEFT, "f");
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT,
- "\n\n\nNot ready reading drive A\nAbort, Retry, Fail?");
-
- BSOD_CURSOR (bst, CURSOR_LINE, 200000, 10);
- BSOD_CHAR_DELAY (bst, 200000);
- BSOD_TEXT (bst, LEFT, "f");
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "\nVolume in drive A has no label\n\n"
- "Not ready reading drive A\nAbort, Retry, Fail?");
-
- BSOD_CURSOR (bst, CURSOR_LINE, 200000, 12);
- BSOD_CHAR_DELAY (bst, 200000);
- BSOD_TEXT (bst, LEFT, "a");
- BSOD_PAUSE (bst, 1000000);
-
- BSOD_CHAR_DELAY (bst, 10000);
- BSOD_TEXT (bst, LEFT, "\n\nC:\\WINDOWS>");
-
- BSOD_CURSOR (bst, CURSOR_LINE, 200000, 999999);
-
- XClearWindow(dpy, window);
- return bst;
-}
-
-
-/* nvidia, by jwz.
- *
- * This is what happens if an Nvidia card goes into some crazy text mode.
- * Most often seen on the second screen of a dual-head system when the
- * proper driver isn't loaded.
- */
-typedef struct { int fg; int bg; int bit; Bool blink; } nvcell;
-
-static void
-nvspatter (nvcell *grid, int rows, int cols, int ncolors, int nbits,
- Bool fill_p)
-{
- int max = rows * cols;
- int from = fill_p ? 0 : random() % (max - 1);
- int len = fill_p ? max : random() % (cols * 4);
- int to = from + len;
- int i;
- Bool noisy = ((random() % 4) == 0);
- Bool diag = (noisy || fill_p) ? 0 : ((random() % 4) == 0);
-
- int fg = random() % ncolors;
- int bg = random() % ncolors;
- int blink = ((random() % 4) == 0);
- int bit = (random() % nbits);
-
- if (to > max) to = max;
-
- if (diag)
- {
- int src = random() % (rows * cols);
- int len2 = (cols / 2) - (random() % 5);
- int j = src;
- for (i = from; i < to; i++, j++)
- {
- if (j > src + len2 || j >= max)
- j = src;
- if (i >= max) abort();
- if (j >= max) abort();
- grid[j] = grid[i];
- }
- }
- else
- for (i = from; i < to; i++)
- {
- nvcell *cell = &grid[i];
- cell->fg = fg;
- cell->bg = bg;
- cell->bit = bit;
- cell->blink = blink;
-
- if (noisy)
- {
- fg = random() % ncolors;
- bg = random() % ncolors;
- blink = ((random() % 8) == 0);
- }
- }
-}
-
-typedef struct {
- struct bsod_state *bst;
- GC gc1;
- Pixmap bits[5];
- int rows, cols;
- int cellw, cellh;
- nvcell *grid;
- int ncolors;
- unsigned long colors[256];
- int tick;
-} nvstate;
-
-
-static void
-nvidia_free (struct bsod_state *bst)
-{
- nvstate *nvs = (nvstate *) bst->closure;
- int i;
- XFreeColors (bst->dpy, bst->xgwa.colormap, nvs->colors, nvs->ncolors, 0);
- for (i = 0; i < countof(nvs->bits); i++)
- XFreePixmap (bst->dpy, nvs->bits[i]);
- XFreeGC (bst->dpy, nvs->gc1);
- free (nvs->grid);
- free (nvs);
-}
-
-static int
-nvidia_draw (struct bsod_state *bst)
-{
- nvstate *nvs = (nvstate *) bst->closure;
- int x, y;
-
- for (y = 0; y < nvs->rows; y++)
- for (x = 0; x < nvs->cols; x++)
- {
- nvcell *cell = &nvs->grid[y * nvs->cols + x];
- unsigned long fg = nvs->colors[cell->fg];
- unsigned long bg = nvs->colors[cell->bg];
- Bool flip = cell->blink && (nvs->tick & 1);
- XSetForeground (bst->dpy, bst->gc, flip ? fg : bg);
- XSetBackground (bst->dpy, bst->gc, flip ? bg : fg);
- XCopyPlane (bst->dpy, nvs->bits[cell->bit], bst->window, bst->gc,
- 0, 0, nvs->cellw, nvs->cellh,
- x * nvs->cellw, y * nvs->cellh, 1L);
- }
-
- nvs->tick++;
- if ((random() % 5) == 0) /* change the display */
- nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
- countof(nvs->bits), False);
-
- return 250000;
-}
-
-
-static struct bsod_state *
-nvidia (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "nvidia", "nVidia");
- nvstate *nvs = (nvstate *) calloc (1, sizeof (*nvs));
-
- XGCValues gcv;
- int i;
-
- nvs->bst = bst;
- bst->closure = nvs;
- bst->draw_cb = nvidia_draw;
- bst->free_cb = nvidia_free;
-
- nvs->cols = 80;
- nvs->rows = 25;
- nvs->cellw = bst->xgwa.width / nvs->cols;
- nvs->cellh = bst->xgwa.height / nvs->rows;
- if (nvs->cellw < 8 || nvs->cellh < 18)
- nvs->cellw = 8, nvs->cellh = 18;
- nvs->cols = (bst->xgwa.width / nvs->cellw) + 1;
- nvs->rows = (bst->xgwa.height / nvs->cellh) + 1;
-
- nvs->grid = (nvcell *) calloc (sizeof(*nvs->grid), nvs->rows * nvs->cols);
-
- /* Allocate colors
- */
- nvs->ncolors = 16;
- for (i = 0; i < nvs->ncolors; i++)
- {
- XColor c;
- c.red = random() & 0xFFFF;
- c.green = random() & 0xFFFF;
- c.blue = random() & 0xFFFF;
- c.flags = DoRed|DoGreen|DoBlue;
- XAllocColor (dpy, bst->xgwa.colormap, &c);
- nvs->colors[i] = c.pixel;
- }
-
- /* Construct corrupted character bitmaps
- */
- for (i = 0; i < countof(nvs->bits); i++)
- {
- int j;
-
- nvs->bits[i] = XCreatePixmap (dpy, window, nvs->cellw, nvs->cellh, 1);
- if (!nvs->gc1) nvs->gc1 = XCreateGC (dpy, nvs->bits[i], 0, &gcv);
-
- XSetForeground (dpy, nvs->gc1, 0);
- XFillRectangle (dpy, nvs->bits[i], nvs->gc1, 0, 0,
- nvs->cellw, nvs->cellh);
- XSetForeground (dpy, nvs->gc1, 1);
-
- if ((random() % 40) != 0)
- for (j = 0; j < ((nvs->cellw * nvs->cellh) / 16); j++)
- XFillRectangle (dpy, nvs->bits[i], nvs->gc1,
- (random() % (nvs->cellw-2)) & ~1,
- (random() % (nvs->cellh-2)) & ~1,
- 2, 2);
- }
-
- /* Randomize the grid
- */
- nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
- countof(nvs->bits), True);
- for (i = 0; i < 20; i++)
- nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
- countof(nvs->bits), False);
-
- return bst;
-}
-
-
-/*
- * Simulate various Apple ][ crashes. The memory map encouraged many programs
- * to use the primary hi-res video page for various storage, and the secondary
- * hi-res page for active display. When it crashed into Applesoft or the
- * monitor, it would revert to the primary page and you'd see memory garbage on
- * the screen. Also, it was common for copy-protected games to use the primary
- * text page for important code, because that made it really hard to
- * reverse-engineer them. The result often looked like what this generates.
- *
- * The Apple ][ logic and video hardware is in apple2.c. The TV is emulated by
- * analogtv.c for maximum realism
- *
- * Trevor Blackwell <tlb@tlb.org>
- */
-
-static const char * const apple2_basic_errors[]={
- "BREAK",
- "NEXT WITHOUT FOR",
- "SYNTAX ERROR",
- "RETURN WITHOUT GOSUB",
- "ILLEGAL QUANTITY",
- "OVERFLOW",
- "OUT OF MEMORY",
- "BAD SUBSCRIPT ERROR",
- "DIVISION BY ZERO",
- "STRING TOO LONG",
- "FORMULA TOO COMPLEX",
- "UNDEF'D FUNCTION",
- "OUT OF DATA"
-#if 0
- ,
- "DEFAULT ARGUMENTS ARE NOT ALLOWED IN DECLARATION OF FRIEND "
- "TEMPLATE SPECIALIZATION"
-#endif
-
-};
-static const char * const apple2_dos_errors[]={
- "VOLUME MISMATCH",
- "I/O ERROR",
- "DISK FULL",
- "NO BUFFERS AVAILABLE",
- "PROGRAM TOO LARGE",
-};
-
-static void a2controller_crash(apple2_sim_t *sim, int *stepno,
- double *next_actiontime)
-{
- apple2_state_t *st=sim->st;
- char *s;
- int i;
-
- struct mydata {
- int fillptr;
- int fillbyte;
- } *mine;
-
- if (!sim->controller_data)
- sim->controller_data = calloc(sizeof(struct mydata),1);
- mine=(struct mydata *) sim->controller_data;
-
- switch(*stepno) {
- case 0:
-
- a2_init_memory_active(sim);
- sim->dec->powerup = 1000.0;
-
- if (random()%3==0) {
- st->gr_mode=0;
- *next_actiontime+=0.4;
- *stepno=100;
- }
- else if (random()%4==0) {
- st->gr_mode=A2_GR_LORES;
- if (random()%3==0) st->gr_mode |= A2_GR_FULL;
- *next_actiontime+=0.4;
- *stepno=100;
- }
- else if (random()%2==0) {
- st->gr_mode=A2_GR_HIRES;
- *stepno=300;
- }
- else {
- st->gr_mode=A2_GR_HIRES;
- *next_actiontime+=0.4;
- *stepno=100;
- }
- break;
-
- case 100:
- /* An illegal instruction or a reset caused it to drop into the
- assembly language monitor, where you could disassemble code & view
- data in hex. */
- if (random()%3==0) {
- char ibytes[128];
- char itext[128];
- int addr=0xd000+random()%0x3000;
- sprintf(ibytes,
- "%02X",random()%0xff);
- sprintf(itext,
- "???");
- sprintf(sim->printing_buf,
- "\n\n"
- "%04X: %-15s %s\n"
- " A=%02X X=%02X Y=%02X S=%02X F=%02X\n"
- "*",
- addr,ibytes,itext,
- random()%0xff, random()%0xff,
- random()%0xff, random()%0xff,
- random()%0xff);
- sim->printing=sim->printing_buf;
- a2_goto(st,23,1);
- if (st->gr_mode) {
- *stepno=180;
- } else {
- *stepno=200;
- }
- sim->prompt='*';
- *next_actiontime += 2.0 + (random()%1000)*0.0002;
- }
- else {
- /* Lots of programs had at least their main functionality in
- Applesoft Basic, which had a lot of limits (memory, string
- length, etc) and would sometimes crash unexpectedly. */
- sprintf(sim->printing_buf,
- "\n"
- "\n"
- "\n"
- "?%s IN %d\n"
- "\001]",
- apple2_basic_errors[random() %
- (sizeof(apple2_basic_errors)
- /sizeof(char *))],
- (1000*(random()%(random()%59+1)) +
- 100*(random()%(random()%9+1)) +
- 5*(random()%(random()%199+1)) +
- 1*(random()%(random()%(random()%2+1)+1))));
- sim->printing=sim->printing_buf;
- a2_goto(st,23,1);
- *stepno=110;
- sim->prompt=']';
- *next_actiontime += 2.0 + (random()%1000)*0.0002;
- }
- break;
-
- case 110:
- if (random()%3==0) {
- /* This was how you reset the Basic interpreter. The sort of
- incantation you'd have on a little piece of paper taped to the
- side of your machine */
- sim->typing="CALL -1370";
- *stepno=120;
- }
- else if (random()%2==0) {
- sim->typing="CATALOG\n";
- *stepno=170;
- }
- else {
- *next_actiontime+=1.0;
- *stepno=999;
- }
- break;
-
- case 120:
- *stepno=130;
- *next_actiontime += 0.5;
- break;
-
- case 130:
- st->gr_mode=0;
- a2_cls(st);
- a2_goto(st,0,16);
- for (s="APPLE ]["; *s; s++) a2_printc(st,*s);
- a2_goto(st,23,0);
- a2_printc(st,']');
- *next_actiontime+=1.0;
- *stepno=999;
- break;
-
- case 170:
- if (random()%50==0) {
- sprintf(sim->printing_buf,
- "\nDISK VOLUME 254\n\n"
- " A 002 HELLO\n"
- "\n"
- "]");
- sim->printing=sim->printing_buf;
- }
- else {
- sprintf(sim->printing_buf,"\n?%s\n]",
- apple2_dos_errors[random()%
- (sizeof(apple2_dos_errors) /
- sizeof(char *))]);
- sim->printing=sim->printing_buf;
- }
- *stepno=999;
- *next_actiontime+=1.0;
- break;
-
- case 180:
- if (random()%2==0) {
- /* This was how you went back to text mode in the monitor */
- sim->typing="FB4BG";
- *stepno=190;
- } else {
- *next_actiontime+=1.0;
- *stepno=999;
- }
- break;
-
- case 190:
- st->gr_mode=0;
- a2_invalidate(st);
- a2_printc(st,'\n');
- a2_printc(st,'*');
- *stepno=200;
- *next_actiontime+=2.0;
- break;
-
- case 200:
- /* This reset things into Basic */
- if (random()%2==0) {
- sim->typing="FAA6G";
- *stepno=120;
- }
- else {
- *stepno=999;
- *next_actiontime+=sim->delay;
- }
- break;
-
- case 300:
- for (i=0; i<1500; i++) {
- a2_poke(st, mine->fillptr, mine->fillbyte);
- mine->fillptr++;
- mine->fillbyte = (mine->fillbyte+1)&0xff;
- }
- *next_actiontime += 0.08;
- /* When you hit c000, it changed video settings */
- if (mine->fillptr>=0xc000) {
- a2_invalidate(st);
- st->gr_mode=0;
- }
- /* And it seemed to reset around here, I dunno why */
- if (mine->fillptr>=0xcf00) *stepno=130;
- break;
-
- case 999:
- break;
-
- case A2CONTROLLER_FREE:
- free(mine);
- mine = 0;
- break;
- }
-}
-
-static int
-a2_draw (struct bsod_state *bst)
-{
- apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
- if (! sim) {
- sim = apple2_start (bst->dpy, bst->window, 9999999, a2controller_crash);
- bst->closure = sim;
- }
-
- if (! apple2_one_frame (sim)) {
- bst->closure = 0;
- }
-
- return 10000;
-}
-
-static void
-a2_free (struct bsod_state *bst)
-{
- apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
- if (sim) {
- sim->stepno = A2CONTROLLER_DONE;
- a2_draw (bst); /* finish up */
- if (bst->closure) abort(); /* should have been freed by now */
- }
-}
-
-
-static struct bsod_state *
-apple2crash (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "apple2", "Apple2");
- bst->draw_cb = a2_draw;
- bst->free_cb = a2_free;
- return bst;
-}
-
-
-static void
-a2controller_ransomware(apple2_sim_t *sim, int *stepno,
- double *next_actiontime)
-{
- apple2_state_t *st=sim->st;
-
- struct mydata {
- const char *str;
- Bool bold_p;
- } *mine;
-
- if (!sim->controller_data)
- sim->controller_data = calloc(sizeof(struct mydata),1);
- mine=(struct mydata *) sim->controller_data;
-
- switch(*stepno) {
- case 0:
-
- st->gr_mode |= A2_GR_FULL;
- a2_cls(st);
- a2_goto(st,0,16);
- a2_prints(st, "APPLE ][");
- a2_goto(st,2,0);
- *stepno = 10;
- *next_actiontime += 2;
- break;
-
- case 10:
- a2_prints(st, "READY\n\n");
- *stepno = 11;
- *next_actiontime += 1;
- break;
-
- case 11:
- a2_goto(st, 1, 0);
- *stepno = 12;
- mine->str =
- ("\n"
- " _____________________________________\n"
- "/ \\\n"
- "! OOPS YOUR FILES HAVE BEEN ENCRYPTED !\n"
- "! ________________________ !\n"
- "! ! ! !\n"
- "! [/--\\] ! [ WHAT HAPPENED TO MY ] ! !\n"
- "! [!] [!] ! [ COMPUTER? ] ! !\n"
- "! [!] [!] ! ! !\n"
- "! [######] ! [ CAN I RECOVER MY ] ! !\n"
- "! [######] ! [ FILES? ] ! !\n"
- "! [######] ! ! !\n"
- "! [######] ! [ HOW DO I PAY? ] ! !\n"
- "! ! ! !\n"
- "! !________________________! !\n"
- "! !\n"
- "! BITCOIN ACCEPTED HERE !\n"
- "\\_____________________________________/\n"
- "\n"
- "\n"
- "WAITING FOR BLOCKCHAIN..@\n"
- "\n"
- "PLEASE INSERT NEXT FLOPPY: "
- );
- break;
-
- case 12:
- {
- char c = *mine->str;
- mine->str++;
-
- if (c == 0)
- {
- *next_actiontime += 30;
- *stepno = 0;
- }
- else if (c == '[')
- mine->bold_p++;
- else if (c == ']')
- mine->bold_p--;
- else
- {
- if (c == '@')
- {
- c = '.';
- *next_actiontime += 2;
- }
-
- if (mine->bold_p)
- c |= 0xC0;
- a2_printc_noscroll(st, c);
- if (c == '.')
- *next_actiontime += 1;
- }
- }
- break;
-
- case A2CONTROLLER_FREE:
- return;
- }
-}
-
-
-static int
-a2_ransomware_draw (struct bsod_state *bst)
-{
- apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
- if (! sim) {
- sim = apple2_start (bst->dpy, bst->window, 9999999,
- a2controller_ransomware);
- bst->closure = sim;
- }
-
- if (! apple2_one_frame (sim)) {
- bst->closure = 0;
- }
-
- return 10000;
-}
-
-static struct bsod_state *
-apple2ransomware (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "apple2", "Apple2");
- bst->draw_cb = a2_ransomware_draw;
- bst->free_cb = a2_free;
- return bst;
-}
-
-
-
-static void
-a2controller_encom (apple2_sim_t *sim, int *stepno,
- double *next_actiontime)
-{
- apple2_state_t *st=sim->st;
-
- struct mydata {
- const char *str;
- Bool bold_p;
- } *mine;
-
- if (!sim->controller_data)
- sim->controller_data = calloc(sizeof(struct mydata),1);
- mine=(struct mydata *) sim->controller_data;
-
- switch(*stepno) {
- case 0:
-
- st->gr_mode |= A2_GR_FULL;
- a2_cls(st);
- a2_goto(st,0,35);
- a2_prints(st, "ENCOM");
- a2_goto(st,23,0);
- *stepno = 10;
- *next_actiontime += 6;
- break;
-
- case 10:
- a2_cls(st);
- a2_goto(st,0,0);
- *stepno = 11;
- *next_actiontime += 1;
- break;
-
- case 11:
- a2_goto(st, 1, 0);
- *stepno = 12;
- mine->str = ("\n"
- "\r\n"
- "\r\n"
- "\r\n"
- "\r\n"
- "\r\n"
- "\r\n"
- "\r\n"
- "\r\n"
- "SEPT 22, 18:32:21 PM\n"
- "\n"
- " YOUR ACCESS SUSPENDED\n"
- " PLEASE REPORT TO DILLINGER\n"
- " IMMEDIATELY\n"
- " AUTHORIZATION: MASTER CONTROL\n"
- " PROGRAM\n"
- "\n"
- "\r\r\r\r\r"
- " END OF LINE\n"
- "\n"
- "\n"
- "\n"
- "\n");
- break;
-
- case 12:
- {
- char c = *mine->str;
- mine->str++;
-
- if (c == 0)
- {
- *next_actiontime += 30;
- *stepno = 0;
- }
- else
- {
- if (c == '\r')
- *next_actiontime += 0.2;
- if (mine->bold_p)
- c |= 0xC0;
- a2_printc_noscroll(st, c);
- }
- }
- break;
-
- case A2CONTROLLER_FREE:
- return;
- }
-}
-
-
-static int
-a2_encom_draw (struct bsod_state *bst)
-{
- apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
- if (! sim) {
- sim = apple2_start (bst->dpy, bst->window, 9999999,
- a2controller_encom);
- bst->closure = sim;
- }
-
- if (! apple2_one_frame (sim)) {
- bst->closure = 0;
- }
-
- return 10000;
-}
-
-static struct bsod_state *
-encom (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "encom", "Encom");
- bst->draw_cb = a2_encom_draw;
- bst->free_cb = a2_free;
- return bst;
-}
-
-
-/* A crash spotted on a cash machine circa 2006, by jwz. I didn't note
- what model it was; probably a Tranax Mini-Bank 1000 or similar vintage.
- */
-static struct bsod_state *
-atm (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "atm", "ATM");
-
- int pix_w, pix_h;
- int x, y, i = 0;
- float scale = 0.48;
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- atm_png, sizeof(atm_png),
- &pix_w, &pix_h, &mask);
-
- XClearWindow (dpy, window);
-
- while (pix_w <= bst->xgwa.width * scale &&
- pix_h <= bst->xgwa.height * scale)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- i++;
- }
-
- x = (bst->xgwa.width - pix_w) / 2;
- y = (bst->xgwa.height - pix_h) / 2;
- if (y < 0) y = 0;
-
- if (i > 0)
- {
- int j;
- XSetForeground (dpy, bst->gc,
- get_pixel_resource (dpy, bst->xgwa.colormap,
- "atm.background",
- "ATM.Background"));
- for (j = -1; j < pix_w; j += i+1)
- XDrawLine (bst->dpy, pixmap, bst->gc, j, 0, j, pix_h);
- for (j = -1; j < pix_h; j += i+1)
- XDrawLine (bst->dpy, pixmap, bst->gc, 0, j, pix_w, j);
- }
-
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, x, y);
- XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
-
- XFreePixmap (dpy, pixmap);
- XFreePixmap (dpy, mask);
-
- return bst;
-}
-
-
-static struct bsod_state *
-dvd (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "dvd", "DVD");
- int pix_w, pix_h;
- float scale = 0.15;
- Pixmap mask = 0;
- Pixmap pixmap = image_data_to_pixmap (dpy, window,
- dvd_png, sizeof(dvd_png),
- &pix_w, &pix_h, &mask);
- int i = 0;
- int x, y, dx, dy;
- int steps = 10000;
-
- XClearWindow (dpy, window);
-
- while (pix_w <= bst->xgwa.width * scale &&
- pix_h <= bst->xgwa.height * scale)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- i++;
- }
-
- bst->pixmap = pixmap;
- bst->mask = mask;
- x = random() % (bst->xgwa.width - pix_w);
- y = random() % (bst->xgwa.height - pix_h);
- dx = random() & 1 ? 1 : -1;
- dy = random() & 1 ? 1 : -1;
-
- BSOD_INVERT(bst);
- for (i = 0; i < steps; i++)
- {
- BSOD_RECT (bst, True, x, y, pix_w, pix_h);
- if (x + dx < 0 || x + dx + pix_w > bst->xgwa.width) dx = -dx;
- if (y + dy < 0 || y + dy + pix_h > bst->xgwa.height) dy = -dy;
- x += dx;
- y += dy;
- BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
- BSOD_PAUSE (bst, 1000000 / 30.0);
- }
-
- return bst;
-}
-
-
-static struct bsod_state *
-tivo (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "tivo", "Tivo");
- XGlyphInfo ov;
- int line_height = bst->font->ascent + bst->font->descent;
- int char_width, left, top;
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- char_width = ov.xOff;
-
- left = (bst->xgwa.width - char_width * 44) / 2;
- top = (bst->xgwa.height - line_height * 15) / 2;
- if (left < 0) left = 0;
- if (top < 0) top = 0;
-
- XClearWindow (dpy, window);
-
- BSOD_MARGINS (bst, left, left);
- BSOD_MOVETO (bst, left, top);
-
- BSOD_FONT (bst, 1);
- BSOD_TEXT (bst, LEFT, "\nA severe error has occurred.\n\n");
- BSOD_FONT (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "Please leave the Receiver plugged in and connected\n"
- "to the phone line for the next three hours while the\n"
- "Receiver attempts to repair itself.");
- BSOD_FONT (bst, 1);
- BSOD_TEXT (bst, LEFT,
- "\n\n"
- "DO NOT UNPLUG OR RESTART\nTHE RECEIVER.\n\n");
- BSOD_FONT (bst, 0);
- BSOD_TEXT (bst, LEFT,
- "If, after three hours, the Receiver does not restart\n"
- "itself, call Customer Care.");
-
- BSOD_PAUSE (bst, 1000000 * 60);
- return bst;
-}
-
-
-/* Error message for corrupted (and therefore presumed bootleg) cartridges.
- */
-static struct bsod_state *
-nintendo (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window,
- "nintendo", "Nintendo");
- unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "nintendo.background",
- "Nintendo.Background");
- unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "nintendo.background2",
- "Nintendo.Background");
- unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "nintendo.foreground",
- "Nintendo.Foreground");
- int line_height = bst->font->ascent + bst->font->descent;
- XGlyphInfo ov;
- int char_width;
- int left, top, left2, top2;
-
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- char_width = ov.xOff;
- left = (bst->xgwa.width - char_width * 30) / 2;
- top = (bst->xgwa.height - line_height * 9) / 2;
- left2 = left - char_width * 4;
- top2 = top - line_height;
- if (left < 0) left = 0;
- if (top < 0) top = 0;
- if (left2 < 0) left2 = 0;
- if (top2 < 0) top2 = 0;
- if (left2 > char_width * 8) left2 = char_width * 8;
- if (top2 > line_height * 10) top2 = line_height * 10;
-
- XClearWindow (dpy, window);
-
- BSOD_COLOR (bst, bg2, bg);
- BSOD_RECT (bst, True, left2, top2 - line_height*2,
- bst->xgwa.width - left2*2,
- bst->xgwa.height - top2*2 + line_height*2);
-
- BSOD_MARGINS (bst, left, left);
- BSOD_MOVETO (bst, left, top - line_height/2);
-
- BSOD_FONT (bst, 1);
- BSOD_COLOR (bst, bg, bg2);
-
- /* a variant crash has a second box above the English text that says:
-
- 警告
- ビデオゲームのコピーは法律で禁じられています。
- 詳しくは取扱説明書をご覧になってください。
-
- but "PxPlus IBM VGA8" doesn't contain Japanese characters.
- */
-
- BSOD_TEXT (bst, CENTER, "WARNING");
- BSOD_FONT (bst, 0);
- BSOD_COLOR (bst, fg, bg2);
- BSOD_TEXT (bst, LEFT,
- "\n\n"
- "IT IS A SERIOUS CRIME\n"
- "TO COPY VIDEO GAMES\n"
- "ACCORDING TO COPYRIGHT LAW.\n"
- "PLEASE REFER TO\n"
- "YOUR NINTENDO GAME\n"
- "INSTRUCTION BOOKLET\n"
- "FOR FURTHER INFORMATION.");
-
- BSOD_PAUSE (bst, 1000000 * 60);
- return bst;
-}
-
-
-/* A 2013 Android phone boot loader, by jwz.
- */
-static struct bsod_state *
-android (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "android", "Android");
-
- unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.background",
- "Android.Background");
- unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.foreground",
- "Android.Foreground");
- unsigned long c1 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color1",
- "Android.Foreground");
- unsigned long c2 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color2",
- "Android.Foreground");
- unsigned long c3 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color3",
- "Android.Foreground");
- unsigned long c4 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color4",
- "Android.Foreground");
- unsigned long c5 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color5",
- "Android.Foreground");
- unsigned long c6 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color6",
- "Android.Foreground");
- unsigned long c7 = get_pixel_resource (dpy, bst->xgwa.colormap,
- "android.color7",
- "Android.Foreground");
-
- const char *lines0[] = {
- "Calculating... please wait\n",
- "osbl: 0x499DF907\n",
- "amss: 0x73162409\n",
- "hboot: 0xE46C3327\n",
- "boot: 0xBA570E7A\n",
- "recovery: 0xC8BBA213\n",
- "system: 0x87C3B1F0\n",
- "\n",
- "Press power key to go back.\n",
- };
-
- const char *lines1[] = {
- "Checking SD card update...\n",
- "",
- " SD Checking...\n",
- " Failed to open zipfile\n",
- " loading preload_content...\n",
- " [Caution] Preload Content Not Found\n",
- " loading HTCUpdateZipName image...\n",
- "",
- " Checking...[PG46IMG.zip]\n",
- "Please plug off USB\n",
- };
-
- const char *lines2[] = {
- " SD Checking...\n",
- " Loading...[PK76DIAG.zip]\n",
- " No image!\n",
- " Loading...[PK76DIAG.nbh]\n",
- " No image or wrong image!\n",
- " Loading...[PK76IMG.zip]\n",
- " No image!\n",
- " Loading...[PK76IMG.nbh]\n",
- " No image or wrong image!\n",
- " Loading...[PK76IMG.tar]\n",
- " No image!\n",
- " Loading...[PK76IMG.aes]\n",
- " No image!\n",
- " Loading...[PK76IMG.enc]\n",
- " No image!\n",
- };
-
- int line_height = bst->font->ascent + bst->font->descent;
- int cw;
- XGlyphInfo ov;
- int state = 0;
- Pixmap pixmap = 0, mask = 0;
- int pix_w = 0, pix_h = 0;
-
- XftTextExtentsUtf8 (bst->dpy, bst->font, (FcChar8 *) "n", 1, &ov);
- cw = ov.xOff;
-
- pixmap = image_data_to_pixmap (dpy, window,
- android_png, sizeof(android_png),
- &pix_w, &pix_h, &mask);
- if (! pixmap) abort();
- {
- int i, n = 0;
- if (bst->xgwa.width > 2560) n++; /* Retina displays */
- for (i = 0; i < n; i++)
- {
- pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
- pixmap, pix_w, pix_h);
- mask = double_pixmap (dpy, bst->xgwa.visual, 1,
- mask, pix_w, pix_h);
- pix_w *= 2;
- pix_h *= 2;
- }
- }
- bst->pixmap = pixmap;
- bst->mask = mask;
-
- bst->left_margin = (bst->xgwa.width - (cw * 40)) / 2;
- if (bst->left_margin < 0) bst->left_margin = 0;
-
- while (1) {
- unsigned long delay =
- ((state == 0 ||
- state == countof(lines0) ||
- state == countof(lines0) + countof(lines1) ||
- state == countof(lines0) + countof(lines1) + countof(lines2))
- ? 10000 : 0);
- BSOD_LINE_DELAY (bst, delay);
-
- if (state <= countof(lines0) + countof(lines1) + countof(lines2))
- {
- BSOD_COLOR (bst, bg, bg);
- BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
- BSOD_COLOR (bst, bg, c1);
- BSOD_MOVETO (bst, bst->left_margin + bst->xoff,
- bst->top_margin + bst->yoff + line_height);
- BSOD_TEXT (bst, LEFT, "*** UNLOCKED ***\n");
- BSOD_COLOR (bst, c2, bg);
- BSOD_TEXT (bst, LEFT,
- "PRIMOU PVT SHIP S-OFF RL\n"
- "HBOOT-1.17.0000\n"
- "CPLD-None\n"
- "MICROP-None\n"
- "RADIO-3831.17.00.23_2\n"
- "eMMC-bootmode: disabled\n"
- "CPU-bootmode : disabled\n"
- "HW Secure boot: enabled\n"
- "MODEM PATH : OFF\n"
- "May 15 2012, 10:28:15\n"
- "\n");
- BSOD_COLOR (bst, bg, c3);
-
- if (pixmap)
- {
- int x = (bst->xgwa.width - pix_w) / 2;
- int y = bst->xgwa.height - bst->yoff - pix_h;
- BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
- }
- }
-
- if (state == countof(lines0) ||
- state == countof(lines0) + countof(lines1) ||
- state == countof(lines0) + countof(lines1) + countof(lines2))
- {
- BSOD_TEXT (bst, LEFT, "HBOOT USB\n");
- BSOD_COLOR (bst, c4, bg);
- BSOD_TEXT (bst, LEFT,
- "\n"
- "<VOL UP> to previous item\n"
- "<VOL DOWN> to next item\n"
- "<POWER> to select item\n"
- "\n");
- BSOD_COLOR (bst, c5, bg); BSOD_TEXT (bst, LEFT, "FASTBOOT\n");
- BSOD_COLOR (bst, c6, bg); BSOD_TEXT (bst, LEFT, "RECOVERY\n");
- BSOD_COLOR (bst, c7, bg); BSOD_TEXT (bst, LEFT, "FACTORY RESET\n");
- BSOD_COLOR (bst, c3, bg); BSOD_TEXT (bst, LEFT, "SIMLOCK\n");
- BSOD_COLOR (bst, bg, c3); BSOD_TEXT (bst, LEFT, "HBOOT USB\n");
- BSOD_COLOR (bst, fg, bg); BSOD_TEXT (bst, LEFT, "IMAGE CRC\n");
- BSOD_COLOR (bst, c3, bg); BSOD_TEXT (bst, LEFT, "SHOW BARCODE\n");
- BSOD_PAUSE (bst, 3000000);
- }
- else if (state < countof(lines0))
- {
- BSOD_TEXT (bst, LEFT, "IMAGE CRC\n\n");
- BSOD_COLOR (bst, c5, bg);
- {
- int i;
- for (i = 0; i <= state; i++) {
- const char *s = lines0[i];
- BSOD_COLOR (bst, (strchr(s, ':') ? c7 : c3), bg);
- BSOD_TEXT (bst, LEFT, s);
- }
- }
- BSOD_PAUSE (bst, 500000);
- if (state == countof(lines0)-1)
- BSOD_PAUSE (bst, 2000000);
- }
- else if (state < countof(lines0) + countof(lines1))
- {
- BSOD_TEXT (bst, LEFT, "HBOOT\n\n");
- BSOD_COLOR (bst, c5, bg);
- {
- int i;
- for (i = countof(lines0); i <= state; i++) {
- const char *s = lines1[i - countof(lines0)];
- BSOD_COLOR (bst, (*s == ' ' ? c6 : c3), bg);
- BSOD_TEXT (bst, LEFT, s);
- }
- }
- BSOD_PAUSE (bst, 500000);
- if (state == countof(lines0) + countof(lines1) - 1)
- BSOD_PAUSE (bst, 2000000);
- }
- else if (state < countof(lines0) + countof(lines1) + countof(lines2))
- {
- BSOD_TEXT (bst, LEFT, "HBOOT USB\n\n");
- BSOD_COLOR (bst, c5, bg);
- {
- int i;
- for (i = countof(lines0) + countof(lines1); i <= state; i++) {
- const char *s = lines2[i - countof(lines0) - countof(lines1)];
- BSOD_COLOR (bst, (*s == ' ' ? c6 : c3), bg);
- BSOD_TEXT (bst, LEFT, s);
- }
- }
- BSOD_PAUSE (bst, 500000);
- if (state == countof(lines0) + countof(lines1) + countof(lines2)-1)
- BSOD_PAUSE (bst, 2000000);
- }
- else
- break;
-
- state++;
- }
-
- XClearWindow (dpy, window);
-
- return bst;
-}
-
-
-/* Gnome SOD. Truly 2020 will be the year of the Linux Desktop. */
-static struct bsod_state *
-gnome (Display *dpy, Window window)
-{
- struct bsod_state *bst = make_bsod_state (dpy, window, "gnome", "Gnome");
-
- int pix_w, pix_h;
- int x, y;
- int lh = bst->font->ascent + bst->font->descent;
- Pixmap mask = 0;
- Pixmap pixmap;
- unsigned long fg, bg;
- Bool which = random() & 1;
-
- if (which)
- {
- pixmap = image_data_to_pixmap (dpy, window,
- gnome2_png, sizeof(gnome2_png),
- &pix_w, &pix_h, &mask);
- fg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "gnome.foreground2", "Gnome.Foreground");
- bg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "gnome.background2", "Gnome.Background");
- }
- else
- {
- pixmap = image_data_to_pixmap (dpy, window,
- gnome1_png, sizeof(gnome1_png),
- &pix_w, &pix_h, &mask);
- fg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "gnome.foreground", "Gnome.Foreground");
- bg = get_pixel_resource (dpy, bst->xgwa.colormap,
- "gnome.background", "Gnome.Background");
- }
-
- x = (bst->xgwa.width - pix_w) / 2;
- y = (bst->xgwa.height - pix_h) / 2;
- if (y < 0) y = 0;
-
- XSetWindowBackground (dpy, window, bg);
- XClearWindow (dpy, window);
- XSetClipMask (dpy, bst->gc, mask);
- XSetClipOrigin (dpy, bst->gc, x, y);
- XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
- XSetClipMask (dpy, bst->gc, None);
- XFreePixmap (dpy, mask);
-
- BSOD_MOVETO (bst, 0, y + pix_h + lh * 2);
- BSOD_COLOR (bst, fg, bg);
- BSOD_FONT (bst, 0);
- BSOD_TEXT (bst, CENTER, "Oh no! Something has gone wrong!\n\n");
- BSOD_FONT (bst, 1);
- BSOD_TEXT (bst, CENTER,
- "A problem has occurred and the system can't recover.\n");
- BSOD_TEXT (bst, CENTER, "Please log out and try again.");
- BSOD_PAUSE (bst, 60 * 1000000);
-
- return bst;
-}
-
-
-/*****************************************************************************
- *****************************************************************************/
-
-
-static const struct {
- const char *name;
- struct bsod_state * (*fn) (Display *, Window);
-} all_modes[] = {
- { "Windows", windows_31 },
- { "NT", windows_nt },
- { "Win2K", windows_other },
- { "Win10", windows_10 },
- { "Ransomware", windows_ransomware },
- { "Amiga", amiga },
- { "Mac", mac },
- { "MacsBug", macsbug },
- { "Mac1", mac1 },
- { "MacX", macx },
- { "SCO", sco },
- { "HVX", hvx },
- { "HPPALinux", hppa_linux },
- { "SparcLinux", sparc_linux },
- { "BSD", bsd },
- { "Atari", atari },
-#ifndef HAVE_JWXYZ
- { "BlitDamage", blitdamage },
-#endif
- { "Solaris", sparc_solaris },
- { "Linux", linux_fsck },
- { "HPUX", hpux },
- { "OS390", os390 },
- { "Tru64", tru64 },
- { "VMS", vms },
- { "OS2", os2 },
- { "MSDOS", msdos },
- { "Nvidia", nvidia },
- { "Apple2", apple2crash },
- { "ATM", atm },
- { "GLaDOS", glados },
- { "Android", android },
- { "VMware", vmware },
- { "Encom", encom },
- { "DVD", dvd },
- { "Tivo", tivo },
- { "Nintendo", nintendo },
- { "Gnome", gnome },
-};
-
-
-struct driver_state {
- const char *name;
- int only, which, next_one;
- int mode_duration;
- int delay_remaining;
- time_t start;
- Bool debug_p, cycle_p;
- struct bsod_state *bst;
-};
-
-
-static void
-hack_title (struct driver_state *dst)
-{
-# ifndef HAVE_JWXYZ
- char *oname = 0;
- XFetchName (dst->bst->dpy, dst->bst->window, &oname);
- if (oname && !strncmp (oname, "BSOD: ", 6)) {
- char *tail = oname + 4;
- char *s = strchr (tail+1, ':');
- char *nname;
- if (s) tail = s;
- nname = malloc (strlen (tail) + strlen (dst->name) + 20);
- sprintf (nname, "BSOD: %s%s", dst->name, tail);
- XStoreName (dst->bst->dpy, dst->bst->window, nname);
- free (nname);
- }
- if (oname) free (oname);
-# endif /* !HAVE_JWXYZ */
-}
-
-static void *
-bsod_init (Display *dpy, Window window)
-{
- struct driver_state *dst = (struct driver_state *) calloc (1, sizeof(*dst));
- char *s;
-
- dst->mode_duration = get_integer_resource (dpy, "delay", "Integer");
- if (dst->mode_duration < 3) dst->mode_duration = 3;
-
- dst->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
-
- dst->only = -1;
- dst->next_one = -1;
- s = get_string_resource(dpy, "doOnly", "DoOnly");
- if (s && !strcasecmp (s, "cycle"))
- {
- dst->which = -1;
- dst->cycle_p = True;
- }
- else if (s && *s)
- {
- int count = countof(all_modes);
- for (dst->only = 0; dst->only < count; dst->only++)
- if (!strcasecmp (s, all_modes[dst->only].name))
- break;
- if (dst->only >= count)
- {
- fprintf (stderr, "%s: unknown -only mode: \"%s\"\n", progname, s);
- dst->only = -1;
- }
- }
- if (s) free (s);
-
- dst->name = "none";
- dst->which = -1;
- return dst;
-}
-
-
-static unsigned long
-bsod_draw (Display *dpy, Window window, void *closure)
-{
- struct driver_state *dst = (struct driver_state *) closure;
- time_t now;
- int time_left;
-
- AGAIN:
- now = time ((time_t *) 0);
- time_left = dst->start + dst->mode_duration - now;
-
- if (dst->bst && dst->bst->img_loader) /* still loading */
- {
- dst->bst->img_loader =
- load_image_async_simple (dst->bst->img_loader, 0, 0, 0, 0, 0);
- return 100000;
- }
-
- DELAY_NOW:
- /* Rather than returning a multi-second delay from the draw() routine,
- meaning "don't call us again for N seconds", we quantize that down
- to 1/10th second intervals so that it's more responsive to
- rotate/reshape events.
- */
- if (dst->delay_remaining)
- {
- int inc = 10000;
- int this_delay = MIN (dst->delay_remaining, inc);
- dst->delay_remaining = MAX (0, dst->delay_remaining - inc);
- return this_delay;
- }
-
- if (! dst->bst && time_left > 0) /* run completed; wait out the delay */
- {
- if (dst->debug_p)
- fprintf (stderr, "%s: %s: %d left\n", progname, dst->name, time_left);
- dst->start = 0;
- if (time_left > 5) time_left = 5; /* Boooored now */
- dst->delay_remaining = 1000000 * time_left;
- }
-
- else if (dst->bst) /* sub-mode currently running */
- {
- int this_delay = -1;
-
- if (time_left > 0)
- this_delay = bsod_pop (dst->bst);
-
- /* XSync (dpy, False); slows down char drawing too much on HAVE_JWXYZ */
-
- if (this_delay == 0){
- goto AGAIN; /* no delay, not expired: stay here */
-}
- else if (this_delay >= 0)
- {
- dst->delay_remaining = this_delay; /* return; time to sleep */
- goto DELAY_NOW;
- }
- else
- { /* sub-mode run completed or expired */
- if (dst->debug_p)
- fprintf (stderr, "%s: %s: done\n", progname, dst->name);
- free_bsod_state (dst->bst);
- dst->bst = 0;
- return 0;
- }
- }
- else /* launch a new sub-mode */
- {
- if (dst->next_one >= 0)
- dst->which = dst->next_one, dst->next_one = -1;
- else if (dst->cycle_p)
- dst->which = (dst->which + 1) % countof(all_modes);
- else if (dst->only >= 0)
- dst->which = dst->only;
- else
- {
- int count = countof(all_modes);
- int *enabled = (int *) calloc (sizeof(*enabled), count + 1);
- int nenabled = 0;
- int i;
-
- for (i = 0; i < count; i++)
- {
- char name[100], class[100];
- sprintf (name, "do%s", all_modes[i].name);
- sprintf (class, "Do%s", all_modes[i].name);
- if (get_boolean_resource (dpy, name, class))
- enabled[nenabled++] = i;
- }
-
- if (nenabled == 0)
- {
- fprintf (stderr, "%s: no display modes enabled?\n", progname);
- /* exit (-1); */
- dst->which = dst->only = 0;
- }
- else if (nenabled == 1)
- dst->which = enabled[0];
- else
- {
- i = dst->which;
- while (i == dst->which)
- i = enabled[random() % nenabled];
- dst->which = i;
- }
- free (enabled);
- }
-
- if (dst->debug_p)
- fprintf (stderr, "%s: %s: launch\n", progname,
- all_modes[dst->which].name);
-
- /* Run the mode setup routine...
- */
- if (dst->bst) abort();
- dst->name = all_modes[dst->which].name;
- dst->bst = all_modes[dst->which].fn (dpy, window);
- dst->start = (dst->bst ? time ((time_t *) 0) : 0);
-
- /* Reset the structure run state to the beginning,
- and do some sanitization of the cursor position
- before the first run.
- */
- if (dst->bst)
- {
- if (dst->debug_p)
- fprintf (stderr, "%s: %s: queue size: %d (%d)\n", progname,
- dst->name, dst->bst->pos, dst->bst->queue_size);
-
- hack_title (dst);
- dst->bst->pos = 0;
- dst->bst->x = dst->bst->current_left =
- dst->bst->left_margin + dst->bst->xoff;
-
- if (dst->bst->y <
- dst->bst->top_margin + dst->bst->yoff + dst->bst->font->ascent)
- dst->bst->y =
- dst->bst->top_margin + dst->bst->yoff + dst->bst->font->ascent;
- }
- }
-
- return 0;
-}
-
-
-static void
-bsod_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct driver_state *dst = (struct driver_state *) closure;
-
- if (dst->bst &&
- w == dst->bst->xgwa.width &&
- h == dst->bst->xgwa.height)
- return;
-
- if (dst->debug_p)
- fprintf (stderr, "%s: %s: reshape reset\n", progname, dst->name);
-
- /* just restart this mode and restart when the window is resized. */
- if (dst->bst)
- free_bsod_state (dst->bst);
- dst->bst = 0;
- dst->start = 0;
- dst->delay_remaining = 0;
- dst->next_one = dst->which;
- dst->name = "none";
- XClearWindow (dpy, window);
-}
-
-
-static Bool
-bsod_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct driver_state *dst = (struct driver_state *) closure;
- Bool reset_p = False;
-
- /* pick a new mode and restart when mouse clicked, or certain keys typed. */
-
- if (screenhack_event_helper (dpy, window, event))
- reset_p = True;
-
- if (reset_p)
- {
- if (dst->debug_p)
- fprintf (stderr, "%s: %s: manual reset\n", progname, dst->name);
- if (dst->bst)
- free_bsod_state (dst->bst);
- dst->bst = 0;
- dst->start = 0;
- dst->delay_remaining = 0;
- dst->name = "none";
- XClearWindow (dpy, window);
- return True;
- }
- else
- return False;
-}
-
-
-static void
-bsod_free (Display *dpy, Window window, void *closure)
-{
- struct driver_state *dst = (struct driver_state *) closure;
- if (dst->bst)
- free_bsod_state (dst->bst);
- free (dst);
-}
-
-
-static const char *bsod_defaults [] = {
- "*delay: 45",
- "*debug: False",
-
- "*doOnly: ",
- "*doWindows: True",
- "*doNT: True",
- "*doWin2K: True",
- "*doWin10: True",
- "*doRansomware: True",
- "*doAmiga: True",
- "*doMac: True",
- "*doMacsBug: True",
- "*doMac1: True",
- "*doMacX: True",
- "*doSCO: True",
- "*doAtari: False", /* boring */
- "*doBSD: False", /* boring */
- "*doLinux: True",
- "*doSparcLinux: False", /* boring */
- "*doHPPALinux: True",
- "*doBlitDamage: True",
- "*doSolaris: True",
- "*doHPUX: True",
- "*doTru64: True",
- "*doApple2: True",
- "*doOS390: True",
- "*doVMS: True",
- "*doHVX: True",
- "*doMSDOS: True",
- "*doOS2: True",
- "*doNvidia: True",
- "*doATM: True",
- "*doGLaDOS: True",
- "*doAndroid: False",
- "*doVMware: True",
- "*doEncom: True",
- "*doDVD: True",
- "*doTivo: True",
- "*doNintendo: True",
- "*doGnome: True",
-
- ".foreground: White",
- ".background: Black",
-
- ".windows.foreground: White",
- ".windows.background: #0000AA", /* EGA color 0x01. */
-
- ".nt.foreground: White",
- ".nt.background: #0000AA", /* EGA color 0x01. */
-
- ".windowslh.foreground: White",
- ".windowslh.background: #AA0000", /* EGA color 0x04. */
- ".windowslh.background2: #AAAAAA", /* EGA color 0x07. */
-
- ".win10.foreground: White",
- ".win10.background: #1070AA",
-
- ".ransomware.foreground: White",
- ".ransomware.background: #841212",
- ".ransomware.foreground2: Black", /* ransom note */
- ".ransomware.background2: White",
- ".ransomware.foreground3: Black", /* buttons */
- ".ransomware.background3: #AAAAAA",
- ".ransomware.link: #7BF9F6",
- ".ransomware.timerheader: #BDBE02",
-
-
- ".glaDOS.foreground: White",
- ".glaDOS.background: #0000AA", /* EGA color 0x01. */
-
- ".amiga.foreground: #FF0000",
- ".amiga.background: Black",
- ".amiga.background2: White",
-
- ".mac.foreground: #FFFFFF",
- ".mac.background: Black",
-
- ".atari.foreground: Black",
- ".atari.background: White",
-
- ".macsbug.foreground: Black",
- ".macsbug.background: White",
- ".macsbug.borderColor: #AAAAAA",
-
- ".mac1.foreground: Black",
- ".mac1.background: White",
-
- ".macx.foreground: White",
- ".macx.textForeground: White",
- ".macx.textBackground: Black",
- ".macx.background: #888888",
-
- ".macinstall.barForeground: #C0C0C0",
- ".macinstall.barBackground: #888888",
-
- ".sco.foreground: White",
- ".sco.background: Black",
-
- ".hvx.foreground: White",
- ".hvx.background: Black",
-
- ".linux.foreground: White",
- ".linux.background: Black",
-
- ".hppalinux.foreground: White",
- ".hppalinux.background: Black",
-
- ".sparclinux.foreground: White",
- ".sparclinux.background: Black",
-
- ".bsd.foreground: #c0c0c0",
- ".bsd.background: Black",
-
- ".solaris.foreground: Black",
- ".solaris.background: White",
-
- ".hpux.foreground: White",
- ".hpux.background: Black",
-
- ".os390.background: Black",
- ".os390.foreground: Red",
-
- ".tru64.foreground: White",
- ".tru64.background: #0000AA", /* EGA color 0x01. */
-
- ".vms.foreground: White",
- ".vms.background: Black",
-
- ".msdos.foreground: White",
- ".msdos.background: Black",
-
- ".os2.foreground: White",
- ".os2.background: Black",
-
- ".atm.foreground: Black",
- ".atm.background: #FF6600",
-
- ".android.foreground: Black",
- ".android.background: White",
- ".android.color1: #AA00AA", /* violet */
- ".android.color2: #336633", /* green1 */
- ".android.color3: #0000FF", /* blue */
- ".android.color4: #CC7744", /* orange */
- ".android.color5: #99AA55", /* green2 */
- ".android.color6: #66AA33", /* green3 */
- ".android.color7: #FF0000", /* red */
-
- ".vmware.foreground: White",
- ".vmware.foreground2: Yellow",
- ".vmware.background: #a700a8", /* purple */
-
- ".tivo.background: #339020",
- ".tivo.foreground: #B8E6BA",
-
- ".nintendo.background: #F76D0A",
- ".nintendo.background2: #085C89",
- ".nintendo.foreground: #EEAACF",
-
- ".gnome.background: #000000",
- ".gnome.foreground: #E2E2E2",
- ".gnome.background2: #F0F0F0",
- ".gnome.foreground2: #2E3436",
-
- "*dontClearRoot: True",
-
- ANALOGTV_DEFAULTS
-
-#ifdef HAVE_XSHM_EXTENSION
- "*useSHM: True",
-#endif
-
- ".lowrez: false", /* This is required on macOS */
-
-
- /* "bigFont" replaces "font" on desktop if window height >= 640. */
-
-
- /* Some of the following fonts can only display ASCII, but that's
- ok because this program only displays static ASCII text. */
-
-
- /* "Classic Console" is the MS-DOS 8x16 VGA font. */
- "*font: Classic Console 12, Courier Bold 12",
- "*bigFont: Classic Console 24, Courier Bold 24",
- "*fontB: ",
- "*fontC: ",
-
- ".win10.font: Arial 24, Helvetica 24",
- ".win10.bigFont: Arial 24, Helvetica 24",
- ".win10.fontB: Arial 36, Helvetica 36",
- ".win10.fontC: Arial 16, Helvetica 16",
-
- /* "Arial" loads "ArialMT" but "Arial Bold" does not load "Arial-BoldMT"? */
- ".ransomware.font: Arial 12, Helvetica 12",
- ".ransomware.bigFont: Arial 12, Helvetica 12",
- ".ransomware.fontB: Arial 8, Helvetica 8",
- ".ransomware.fontC: Arial Bold 16, Arial-BoldMT 16, Helvetica Bold 16",
-
- ".macsbug.font: Monaco 8, Courier Bold 8",
- ".macsbug.bigFont: Monaco 14, Courier Bold 14",
-
- ".macx.font: Courier Bold 10",
- ".macx.bigFont: Courier Bold 14",
-
- ".macdisk.font: Courier Bold 14",
- ".macdisk.bigFont: Courier Bold 14",
-
- ".macinstall.font: Helvetica 12, Arial 12",
- ".macinstall.bigFont: Helvetica 24, Arial 24",
-
- /* "Gallant" was the original Solaris 2.x console font. */
- ".solaris.font: Gallant12x22 12, Luxi Mono 12, Courier Bold 12",
- ".solaris.bigFont: Gallant12x22 24, Luxi Mono 24, Courier Bold 24",
-
- /* "Luxi Mono" was the Red Hat console font. */
- ".linux.font: Luxi Mono 12, Gallant12x22 12, Courier Bold 12",
- ".linux.bigFont: Luxi Mono 24, Gallant12x22 24, Courier Bold 24",
-
- ".android.font: Courier Bold 12",
- ".android.bigFont: Courier Bold 24",
-
- ".tivo.font: Helvetica Bold 16",
- ".tivo.bigFont: Helvetica Bold 28",
-
- ".nintendo.font: Classic Console 18, Courier Bold 18",
- ".nintendo.bigFont: Classic Console 40, Courier Bold 40",
-
- ".gnome.font: Helvetica Bold 13",
- ".gnome.bigFont: Helvetica Bold 13",
- ".gnome.fontB: Helvetica 13",
- 0
-};
-
-static const XrmOptionDescRec bsod_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-only", ".doOnly", XrmoptionSepArg, 0 },
- { "-debug", ".debug", XrmoptionNoArg, "True" },
- { "-windows", ".doWindows", XrmoptionNoArg, "True" },
- { "-no-windows", ".doWindows", XrmoptionNoArg, "False" },
- { "-nt", ".doNT", XrmoptionNoArg, "True" },
- { "-no-nt", ".doNT", XrmoptionNoArg, "False" },
- { "-2k", ".doWin2K", XrmoptionNoArg, "True" },
- { "-no-2k", ".doWin2K", XrmoptionNoArg, "False" },
- { "-win10", ".doWin10", XrmoptionNoArg, "True" },
- { "-no-win10", ".doWin10", XrmoptionNoArg, "False" },
- { "-ransomware", ".doRansomware", XrmoptionNoArg, "True" },
- { "-no-ransomware", ".doRansomware", XrmoptionNoArg, "False" },
- { "-amiga", ".doAmiga", XrmoptionNoArg, "True" },
- { "-no-amiga", ".doAmiga", XrmoptionNoArg, "False" },
- { "-mac", ".doMac", XrmoptionNoArg, "True" },
- { "-no-mac", ".doMac", XrmoptionNoArg, "False" },
- { "-mac1", ".doMac1", XrmoptionNoArg, "True" },
- { "-no-mac1", ".doMac1", XrmoptionNoArg, "False" },
- { "-macx", ".doMacX", XrmoptionNoArg, "True" },
- { "-no-macx", ".doMacX", XrmoptionNoArg, "False" },
- { "-atari", ".doAtari", XrmoptionNoArg, "True" },
- { "-no-atari", ".doAtari", XrmoptionNoArg, "False" },
- { "-macsbug", ".doMacsBug", XrmoptionNoArg, "True" },
- { "-no-macsbug", ".doMacsBug", XrmoptionNoArg, "False" },
- { "-apple2", ".doApple2", XrmoptionNoArg, "True" },
- { "-no-apple2", ".doApple2", XrmoptionNoArg, "False" },
- { "-sco", ".doSCO", XrmoptionNoArg, "True" },
- { "-no-sco", ".doSCO", XrmoptionNoArg, "False" },
- { "-hvx", ".doHVX", XrmoptionNoArg, "True" },
- { "-no-hvx", ".doHVX", XrmoptionNoArg, "False" },
- { "-bsd", ".doBSD", XrmoptionNoArg, "True" },
- { "-no-bsd", ".doBSD", XrmoptionNoArg, "False" },
- { "-linux", ".doLinux", XrmoptionNoArg, "True" },
- { "-no-linux", ".doLinux", XrmoptionNoArg, "False" },
- { "-hppalinux", ".doHPPALinux", XrmoptionNoArg, "True" },
- { "-no-hppalinux", ".doHPPALinux", XrmoptionNoArg, "False" },
- { "-sparclinux", ".doSparcLinux", XrmoptionNoArg, "True" },
- { "-no-sparclinux", ".doSparcLinux", XrmoptionNoArg, "False" },
- { "-blitdamage", ".doBlitDamage", XrmoptionNoArg, "True" },
- { "-no-blitdamage", ".doBlitDamage", XrmoptionNoArg, "False" },
- { "-nvidia", ".doNvidia", XrmoptionNoArg, "True" },
- { "-no-nvidia", ".doNvidia", XrmoptionNoArg, "False" },
- { "-solaris", ".doSolaris", XrmoptionNoArg, "True" },
- { "-no-solaris", ".doSolaris", XrmoptionNoArg, "False" },
- { "-hpux", ".doHPUX", XrmoptionNoArg, "True" },
- { "-no-hpux", ".doHPUX", XrmoptionNoArg, "False" },
- { "-os390", ".doOS390", XrmoptionNoArg, "True" },
- { "-no-os390", ".doOS390", XrmoptionNoArg, "False" },
- { "-tru64", ".doHPUX", XrmoptionNoArg, "True" },
- { "-no-tru64", ".doTru64", XrmoptionNoArg, "False" },
- { "-vms", ".doVMS", XrmoptionNoArg, "True" },
- { "-no-vms", ".doVMS", XrmoptionNoArg, "False" },
- { "-msdos", ".doMSDOS", XrmoptionNoArg, "True" },
- { "-no-msdos", ".doMSDOS", XrmoptionNoArg, "False" },
- { "-os2", ".doOS2", XrmoptionNoArg, "True" },
- { "-no-os2", ".doOS2", XrmoptionNoArg, "False" },
- { "-atm", ".doATM", XrmoptionNoArg, "True" },
- { "-no-atm", ".doATM", XrmoptionNoArg, "False" },
- { "-glados", ".doGLaDOS", XrmoptionNoArg, "True" },
- { "-no-glados", ".doGLaDOS", XrmoptionNoArg, "False" },
- { "-android", ".doAndroid", XrmoptionNoArg, "True" },
- { "-no-android", ".doAndroid", XrmoptionNoArg, "False" },
- { "-vmware", ".doVMware", XrmoptionNoArg, "True" },
- { "-no-vmware", ".doVMware", XrmoptionNoArg, "False" },
- { "-encom", ".doEncom", XrmoptionNoArg, "True" },
- { "-no-encom", ".doEncom", XrmoptionNoArg, "False" },
- { "-dvd", ".doDVD", XrmoptionNoArg, "True" },
- { "-no-dvd", ".doDVD", XrmoptionNoArg, "False" },
- { "-tivo", ".doTivo", XrmoptionNoArg, "True" },
- { "-no-tivo", ".doTivo", XrmoptionNoArg, "False" },
- { "-nintendo", ".doNintendo", XrmoptionNoArg, "True" },
- { "-no-nintendo", ".doNintendo", XrmoptionNoArg, "False" },
- { "-gnome", ".doGnome", XrmoptionNoArg, "True" },
- { "-no-gnome", ".doGnome", XrmoptionNoArg, "False" },
- ANALOGTV_OPTIONS
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("BSOD", bsod)
diff --git a/hacks/bsod.man b/hacks/bsod.man
deleted file mode 100644
index a722da9..0000000
--- a/hacks/bsod.man
+++ /dev/null
@@ -1,136 +0,0 @@
-.TH XScreenSaver 1 "5-May-2004" "X Version 11"
-.SH NAME
-bsod \- Blue Screen of Death emulator
-.SH SYNOPSIS
-.B bsod
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fIseconds\fP]
-[\-fps]
-.SH DESCRIPTION
-The
-.I bsod
-program is the finest in personal computer emulation.
-.PP
-.I bsod
-steps through a set of screens, each one a recreation of a different failure
-mode of an operating system. Systems depicted include
-Windows 3.1, Windows 95, Windows NT, MS-DOS, AmigaDOS 1.3, Linux,
-SCO UNIX, BSD UNIX, HPUX, Solaris, Tru64, VMS, HVX/GCOS6, IBM OS/390, OS/2,
-MacOS (MacsBug, Bomb, Sad Mac, and OSX), Atari ST, Apple ][+, VMware and
-NCD X Terminals.
-.PP
-.SH OPTIONS
-.I bsod
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIdelay\fP
-The duration each crash-mode is displayed before selecting another.
-.TP 8
-.B \-only \fIwhich\fP
-Tell it to run only one mode, e.g., \fI\-only HPUX\fP.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH X RESOURCES
-Notable X resources supported include the following, which control which
-hacks are displayed and which aren't.
-.BR doWindows ,
-.BR doNT ,
-.BR doWin2K ,
-.BR doWin10 ,
-.BR doRansomware ,
-.BR doAmiga ,
-.BR doMac ,
-.BR doMac1 ,
-.BR doMacsBug ,
-.BR doMacX ,
-.BR doSCO ,
-.BR doAtari ,
-.BR doBSD ,
-.BR doLinux ,
-.BR doSparcLinux ,
-.BR doHPPALinux ,
-.BR doBlitDamage ,
-.BR doSolaris ,
-.BR doHPUX ,
-.BR doApple2 ,
-.BR doOS390 ,
-.BR doTru64 ,
-.BR doVMS ,
-.BR doMSDOS ,
-.BR doOS2 ,
-.BR doHVX ,
-.BR doVMware ,
-and
-.BR doATM .
-Each of these is a Boolean resource, they all default to true, except
-for doAtari, doBSD, doSparcLinux, and doHPPALinux, which are turned off
-by default, because they're really not all that interesting looking
-unless you're a fan of those systems.
-
-There are command-line options for all of these:
-e.g., \fI\-bsd\fP, \fI\-no-bsd\fP. (Also note the \fI\-only\fP option.)
-.SH BUGS
-Unlike the systems being simulated, \fIbsod\fP does not require a
-reboot after running.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR http://www.microsoft.com/ ,
-.BR http://www.apple.com/ ,
-.BR http://www.sco.com/ ,
-.BR http://www.kernel.org/ ,
-and
-.BR http://www.amiga.de/ .
-.SH TRADEMARKS
-Microsoft Windows, Microsoft Windows 95, and Microsoft Windows NT are all
-registered trademarks of Microsoft Corporation. Apple Macintosh is a
-registered trademark of Apple Computer. Amiga is a registered trademark of
-Amiga International, Inc. Solaris is a trademark of Sun Microsystems. HP-UX
-is a trademark of HP Hewlett Packard Group LLC. Nvidia is a tradmark of
-Nvidia Corporation. VMS is probably a trademark of Digital Equipment
-Corporation. Atari ST is probably a trademark, too, but it's hard to tell who
-owns it. SCO is probably still a trademark of somebody these days, I guess.
-Linux is a registered trademark of Linus Torvalds, but it isn't his
-fault. OS/2 is a registered trademark of International Business Machines
-Corporation. VMware is a registered trademark of VMware, Inc. Android is a
-trademark of Google LLC. GladOS is a trademark of Aperture Science
-Incorporated.
-.SH COPYRIGHT
-Copyright \(co 1998-2018 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty. No animals were harmed during the testing of
-these simulations. Always mount a scratch monkey.
-.SH AUTHOR
-Concept cribbed from Stephen Martin <smartin@mks.com>. This version is by
-Jamie Zawinski <jwz@jwz.org>, with contributions from many others.
diff --git a/hacks/bubbles-default.c b/hacks/bubbles-default.c
deleted file mode 100644
index 0e729d5..0000000
--- a/hacks/bubbles-default.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* bubbles_default.c - pick images for bubbles.c
- * By Jamie Zawinski <jwz@jwz.org>, 20-Jan-98.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "bubbles.h"
-#include "yarandom.h"
-
-#ifndef NO_DEFAULT_BUBBLE
-
-# define BLOOD 0
-# include "images/gen/blood1_png.h"
-# include "images/gen/blood2_png.h"
-# include "images/gen/blood3_png.h"
-# include "images/gen/blood4_png.h"
-# include "images/gen/blood5_png.h"
-# include "images/gen/blood6_png.h"
-# include "images/gen/blood7_png.h"
-# include "images/gen/blood8_png.h"
-# include "images/gen/blood9_png.h"
-# include "images/gen/blood10_png.h"
-# include "images/gen/blood11_png.h"
-
-# define BLUE 1
-# include "images/gen/blue1_png.h"
-# include "images/gen/blue2_png.h"
-# include "images/gen/blue3_png.h"
-# include "images/gen/blue4_png.h"
-# include "images/gen/blue5_png.h"
-# include "images/gen/blue6_png.h"
-# include "images/gen/blue7_png.h"
-# include "images/gen/blue8_png.h"
-# include "images/gen/blue9_png.h"
-# include "images/gen/blue10_png.h"
-# include "images/gen/blue11_png.h"
-
-# define GLASS 2
-# include "images/gen/glass1_png.h"
-# include "images/gen/glass2_png.h"
-# include "images/gen/glass3_png.h"
-# include "images/gen/glass4_png.h"
-# include "images/gen/glass5_png.h"
-# include "images/gen/glass6_png.h"
-# include "images/gen/glass7_png.h"
-# include "images/gen/glass8_png.h"
-# include "images/gen/glass9_png.h"
-# include "images/gen/glass10_png.h"
-# include "images/gen/glass11_png.h"
-
-# define JADE 3
-# include "images/gen/jade1_png.h"
-# include "images/gen/jade2_png.h"
-# include "images/gen/jade3_png.h"
-# include "images/gen/jade4_png.h"
-# include "images/gen/jade5_png.h"
-# include "images/gen/jade6_png.h"
-# include "images/gen/jade7_png.h"
-# include "images/gen/jade8_png.h"
-# include "images/gen/jade9_png.h"
-# include "images/gen/jade10_png.h"
-# include "images/gen/jade11_png.h"
-
-# define END 4
-
-
-bubble_png default_bubbles[50];
-int num_default_bubbles;
-
-void init_default_bubbles(void)
-{
- int i = 0;
- switch (random() % END) {
-
-# define DEF(N,S) default_bubbles[i].png = N; default_bubbles[i].size = S; i++
-
- case BLOOD:
- DEF(blood1_png, sizeof(blood1_png));
- DEF(blood2_png, sizeof(blood2_png));
- DEF(blood3_png, sizeof(blood3_png));
- DEF(blood4_png, sizeof(blood4_png));
- DEF(blood5_png, sizeof(blood5_png));
- DEF(blood6_png, sizeof(blood6_png));
- DEF(blood7_png, sizeof(blood7_png));
- DEF(blood8_png, sizeof(blood8_png));
- DEF(blood9_png, sizeof(blood9_png));
- DEF(blood10_png, sizeof(blood10_png));
- DEF(blood11_png, sizeof(blood11_png));
- break;
-
- case BLUE:
- DEF(blue1_png, sizeof(blue1_png));
- DEF(blue2_png, sizeof(blue2_png));
- DEF(blue3_png, sizeof(blue3_png));
- DEF(blue4_png, sizeof(blue4_png));
- DEF(blue5_png, sizeof(blue5_png));
- DEF(blue6_png, sizeof(blue6_png));
- DEF(blue7_png, sizeof(blue7_png));
- DEF(blue8_png, sizeof(blue8_png));
- DEF(blue9_png, sizeof(blue9_png));
- DEF(blue10_png, sizeof(blue10_png));
- DEF(blue11_png, sizeof(blue11_png));
- break;
-
- case GLASS:
- DEF(glass1_png, sizeof(glass1_png));
- DEF(glass2_png, sizeof(glass2_png));
- DEF(glass3_png, sizeof(glass3_png));
- DEF(glass4_png, sizeof(glass4_png));
- DEF(glass5_png, sizeof(glass5_png));
- DEF(glass6_png, sizeof(glass6_png));
- DEF(glass7_png, sizeof(glass7_png));
- DEF(glass8_png, sizeof(glass8_png));
- DEF(glass9_png, sizeof(glass9_png));
- DEF(glass10_png, sizeof(glass10_png));
- DEF(glass11_png, sizeof(glass11_png));
- break;
-
- case JADE:
- DEF(jade1_png, sizeof(jade1_png));
- DEF(jade2_png, sizeof(jade2_png));
- DEF(jade3_png, sizeof(jade3_png));
- DEF(jade4_png, sizeof(jade4_png));
- DEF(jade5_png, sizeof(jade5_png));
- DEF(jade6_png, sizeof(jade6_png));
- DEF(jade7_png, sizeof(jade7_png));
- DEF(jade8_png, sizeof(jade8_png));
- DEF(jade9_png, sizeof(jade9_png));
- DEF(jade10_png, sizeof(jade10_png));
- DEF(jade11_png, sizeof(jade11_png));
- break;
-
- default:
- abort();
- break;
- }
-
- default_bubbles[i].png = 0;
- num_default_bubbles = i;
-}
-
-#endif /* NO_DEFAULT_BUBBLE */
diff --git a/hacks/bubbles.c b/hacks/bubbles.c
deleted file mode 100644
index 8116e36..0000000
--- a/hacks/bubbles.c
+++ /dev/null
@@ -1,1467 +0,0 @@
-/* bubbles.c - frying pan / soft drink in a glass simulation */
-
-/*$Id: bubbles.c,v 1.30 2008/07/31 19:27:48 jwz Exp $*/
-
-/*
- * Copyright (C) 1995-1996 James Macnicol
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/*
- * I got my original inspiration for this by looking at the bottom of a
- * frying pan while something was cooking and watching the little bubbles
- * coming off the bottom of the pan as the oil was boiling joining together
- * to form bigger bubbles and finally to *pop* and disappear. I had some
- * time on my hands so I wrote this little xscreensaver module to imitate
- * it. Now that it's done it reminds me more of the bubbles you get in
- * a glass of fizzy soft drink.....
- *
- * The problem seemed to be that the position/size etc. of all the bubbles
- * on the screen had to be remembered and searched through to find when
- * bubbles hit each other and combined. To do this more efficiently, the
- * window/screen is divided up into a square mesh of side length mesh_length
- * and separate lists of bubbles contained in each cell of the mesh are
- * kept. Only the cells in the immediate vicinity of the bubble in question
- * are searched. This should make things more efficient although the whole
- * thing seems to use up too much CPU, but then I'm using an ancient PC so
- * perhaps it's not surprising .
- * (Six months after I wrote the above I now have a Pentium with PCI graphics
- * and things are _much_ nicer.)
- *
- * Author: James Macnicol
- * Internet E-mail : j-macnicol@adfa.edu.au
- */
-
-#include "screenhack.h"
-#include "yarandom.h"
-#include "bubbles.h"
-#include "ximage-loader.h"
-
-#undef DEBUG /* doesn't compile */
-
-#include <math.h>
-#include <limits.h>
-
-#ifndef VMS
-# include <sys/wait.h>
-#else /* VMS */
-# if __DECC_VER >= 50200000
-# include <sys/wait.h>
-# endif
-#endif /* VMS */
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#define FANCY_BUBBLES
-
-/*
- * Public variables
- */
-
-static const char *bubbles_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*simple: false",
- "*broken: false",
- "*delay: 10000",
- "*quiet: false",
- "*mode: float",
- "*trails: false",
- "*3D: false",
- 0
-};
-
-static XrmOptionDescRec bubbles_options [] = {
- { "-simple", ".simple", XrmoptionNoArg, "true" },
-#ifdef FANCY_BUBBLES
- { "-broken", ".broken", XrmoptionNoArg, "true" },
-#endif
- { "-quiet", ".quiet", XrmoptionNoArg, "true" },
- { "-3D", ".3D", XrmoptionNoArg, "true" },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-drop", ".mode", XrmoptionNoArg, "drop" },
- { "-rise", ".mode", XrmoptionNoArg, "rise" },
- { "-trails", ".trails", XrmoptionNoArg, "true" },
- { 0, 0, 0, 0 }
-};
-
-/*
- * Private variables
- */
-
-struct state {
- Display *dpy;
- Window window;
-
- Bubble **mesh;
- int mesh_length;
- int mesh_width;
- int mesh_height;
- int mesh_cells;
-
- int **adjacent_list;
-
- int screen_width;
- int screen_height;
- int screen_depth;
- unsigned int default_fg_pixel, default_bg_pixel;
-
- int bubble_min_radius; /* For simple mode only */
- int bubble_max_radius;
- long *bubble_areas;
- int *bubble_droppages;
- GC draw_gc, erase_gc;
-
-#ifdef FANCY_BUBBLES
- int num_bubble_pixmaps;
- Bubble_Step **step_pixmaps, **def_list;
-#endif
-
- Bool simple;
- Bool broken;
- Bool quiet;
- Bool threed;
- Bool drop;
- Bool trails;
- int drop_dir;
- int delay;
-};
-
-static int drop_bubble( struct state *st, Bubble *bb );
-
-/*
- * To prevent forward references, some stuff is up here
- */
-
-static long
-calc_bubble_area(struct state *st, int r)
-/* Calculate the area of a bubble of radius r */
-{
-#ifdef DEBUG
- printf("%d %g\n", r,
- 10.0 * PI * (double)r * (double)r * (double)r);
-#endif /* DEBUG */
- if (st->threed)
- return (long)(10.0 * M_PI * (double)r * (double)r * (double)r);
- else
- return (long)(10.0 * M_PI * (double)r * (double)r);
-}
-
-static void *
-xmalloc(size_t size)
-/* Safe malloc */
-{
- void *ret;
-
- if ((ret = malloc(size)) == NULL) {
- fprintf(stderr, "%s: out of memory\n", progname);
- exit(1);
- }
- return ret;
-}
-
-#ifdef DEBUG
-static void
-die_bad_bubble(Bubble *bb)
-/* This is for use with GDB */
-{
- fprintf(stderr, "Bad bubble detected at 0x%x!\n", (int)bb);
- exit(1);
-}
-#endif
-
-static int
-null_bubble(Bubble *bb)
-/* Returns true if the pointer passed is NULL. If not then this checks to
-see if the bubble is valid (i.e. the (x,y) position is valid and the magic
-number is set correctly. This only a sanity check for debugging and is
-turned off if DEBUG isn't set. */
-{
- if (bb == (Bubble *)NULL)
- return 1;
-#ifdef DEBUG
- if ((bb->cell_index < 0) || (bb->cell_index > st->mesh_cells)) {
- fprintf(stderr, "cell_index = %d\n", bb->cell_index);
- die_bad_bubble(bb);
- }
- if (bb->magic != BUBBLE_MAGIC) {
- fprintf(stderr, "Magic = %d\n", bb->magic);
- die_bad_bubble(bb);
- }
- if (st->simple) {
- if ((bb->x < 0) || (bb->x > st->screen_width) ||
- (bb->y < 0) || (bb->y > st->screen_height) ||
- (bb->radius < st->bubble_min_radius) || (bb->radius >
- st->bubble_max_radius)) {
- fprintf(stderr,
- "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
- bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
- die_bad_bubble(bb);
- }
-#ifdef FANCY_BUBBLES
- } else {
- if ((bb->x < 0) || (bb->x > st->screen_width) ||
- (bb->y < 0) || (bb->y > st->screen_height) ||
- (bb->radius < st->step_pixmaps[0]->radius) ||
- (bb->radius > st->step_pixmaps[st->num_bubble_pixmaps-1]->radius)) {
- fprintf(stderr,
- "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
- bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
- die_bad_bubble(bb);
- }
-#endif
- }
-#endif /* DEBUG */
- return 0;
-}
-
-#ifdef DEBUG
-static void
-print_bubble_list(Bubble *bb)
-/* Print list of where all the bubbles are. For debugging purposes only. */
-{
- if (! null_bubble(bb)) {
- printf(" (%d, %d) %d\n", bb->x, bb->y, bb->radius);
- print_bubble_list(bb->next);
- }
-}
-#endif /* DEBUG */
-
-static void
-add_bubble_to_list(Bubble **list, Bubble *bb)
-/* Take a pointer to a list of bubbles and stick bb at the head of the
- list. */
-{
- Bubble *head = *list;
-
- if (null_bubble(head)) {
- bb->prev = (Bubble *)NULL;
- bb->next = (Bubble *)NULL;
- } else {
- bb->next = head;
- bb->prev = (Bubble *)NULL;
- head->prev = bb;
- }
- *list = bb;
-}
-
-
-/*
- * Mesh stuff
- */
-
-
-static void
-init_mesh (struct state *st)
-/* Setup the mesh of bubbles */
-{
- int i;
-
- st->mesh = (Bubble **)xmalloc(st->mesh_cells * sizeof(Bubble *));
- for (i = 0; i < st->mesh_cells; i++)
- st->mesh[i] = (Bubble *)NULL;
-}
-
-static int
-cell_to_mesh(struct state *st, int x, int y)
-/* convert cell coordinates to mesh index */
-{
-#ifdef DEBUG
- if ((x < 0) || (y < 0)) {
- fprintf(stderr, "cell_to_mesh: x = %d, y = %d\n", x, y);
- exit(1);
- }
-#endif
- return ((st->mesh_width * y) + x);
-}
-
-static void
-mesh_to_cell(struct state *st, int mi, int *cx, int *cy)
-/* convert mesh index into cell coordinates */
-{
- *cx = mi % st->mesh_width;
- *cy = mi / st->mesh_width;
-}
-
-static int
-pixel_to_mesh(struct state *st, int x, int y)
-/* convert screen coordinates into mesh index */
-{
- return cell_to_mesh(st, (x / st->mesh_length), (y / st->mesh_length));
-}
-
-static int
-verify_mesh_index(struct state *st, int x, int y)
-/* check to see if (x,y) is in the mesh */
-{
- if ((x < 0) || (y < 0) || (x >= st->mesh_width) || (y >= st->mesh_height))
- return (-1);
- return (cell_to_mesh(st, x, y));
-}
-
-#ifdef DEBUG
-static void
-print_adjacents(int *adj)
-/* Print a list of the cells calculated above. For debugging only. */
-{
- int i;
-
- printf("(");
- for (i = 0; i < 8; i++)
- printf("%d ", adj[i]);
- printf(")\n");
-}
-#endif /* DEBUG */
-
-static void
-add_to_mesh(struct state *st, Bubble *bb)
-/* Add the given bubble to the mesh by sticking it on the front of the
-list. bb is already allocated so no need to malloc() anything, just
-adjust pointers. */
-{
-#ifdef DEBUG
- if (null_bubble(bb)) {
- fprintf(stderr, "Bad bubble passed to add_to_mesh()!\n");
- exit(1);
- }
-#endif /* DEBUG */
-
- add_bubble_to_list(&st->mesh[bb->cell_index], bb);
-}
-
-#ifdef DEBUG
-static void
-print_mesh (struct state *st)
-/* Print the contents of the mesh */
-{
- int i;
-
- for (i = 0; i < st->mesh_cells; i++) {
- if (! null_bubble(st->mesh[i])) {
- printf("Mesh cell %d\n", i);
- print_bubble_list(st->mesh[i]);
- }
- }
-}
-
-static void
-valid_mesh (struct state *st)
-/* Check to see if the mesh is Okay. For debugging only. */
-{
- int i;
- Bubble *b;
-
- for (i = 0; i < st->mesh_cells; i++) {
- b = st->mesh[i];
- while (! null_bubble(b))
- b = b->next;
- }
-}
-
-static int
-total_bubbles (struct state *st)
-/* Count how many bubbles there are in total. For debugging only. */
-{
- int rv = 0;
- int i;
- Bubble *b;
-
- for (i = 0; i < st->mesh_cells; i++) {
- b = st->mesh[i];
- while (! null_bubble(b)) {
- rv++;
- b = b->next;
- }
- }
-
- return rv;
-}
-#endif /* DEBUG */
-
-static void
-calculate_adjacent_list (struct state *st)
-/* Calculate the list of cells adjacent to a particular cell for use
- later. */
-{
- int i;
- int ix, iy;
-
- st->adjacent_list = (int **)xmalloc(st->mesh_cells * sizeof(int *));
- for (i = 0; i < st->mesh_cells; i++) {
- st->adjacent_list[i] = (int *)xmalloc(9 * sizeof(int));
- mesh_to_cell(st, i, &ix, &iy);
- st->adjacent_list[i][0] = verify_mesh_index(st, --ix, --iy);
- st->adjacent_list[i][1] = verify_mesh_index(st, ++ix, iy);
- st->adjacent_list[i][2] = verify_mesh_index(st, ++ix, iy);
- st->adjacent_list[i][3] = verify_mesh_index(st, ix, ++iy);
- st->adjacent_list[i][4] = verify_mesh_index(st, ix, ++iy);
- st->adjacent_list[i][5] = verify_mesh_index(st, --ix, iy);
- st->adjacent_list[i][6] = verify_mesh_index(st, --ix, iy);
- st->adjacent_list[i][7] = verify_mesh_index(st, ix, --iy);
- st->adjacent_list[i][8] = i;
- }
-}
-
-static void
-adjust_areas (struct state *st)
-/* Adjust areas of bubbles so we don't get overflow in weighted_mean() */
-{
- double maxvalue;
- long maxarea;
- long factor;
- int i;
-
-#ifdef FANCY_BUBBLES
- if (st->simple)
- maxarea = st->bubble_areas[st->bubble_max_radius+1];
- else
- maxarea = st->step_pixmaps[st->num_bubble_pixmaps]->area;
-#else /* !FANCY_BUBBLES */
- maxarea = st->bubble_areas[st->bubble_max_radius+1];
-#endif /* !FANCY_BUBBLES */
- maxvalue = (double)st->screen_width * 2.0 * (double)maxarea;
- factor = (long)ceil(maxvalue / (double)LONG_MAX);
- if (factor > 1) {
- /* Overflow will occur in weighted_mean(). We must divide areas
- each by factor so it will never do so. */
-#ifdef FANCY_BUBBLES
- if (st->simple) {
- for (i = st->bubble_min_radius; i <= st->bubble_max_radius+1; i++) {
- st->bubble_areas[i] /= factor;
- if (st->bubble_areas[i] == 0)
- st->bubble_areas[i] = 1;
- }
- } else {
- for (i = 0; i <= st->num_bubble_pixmaps; i++) {
-#ifdef DEBUG
- printf("area = %ld", st->step_pixmaps[i]->area);
-#endif /* DEBUG */
- st->step_pixmaps[i]->area /= factor;
- if (st->step_pixmaps[i]->area == 0)
- st->step_pixmaps[i]->area = 1;
-#ifdef DEBUG
- printf("-> %ld\n", st->step_pixmaps[i]->area);
-#endif /* DEBUG */
- }
- }
-#else /* !FANCY_BUBBLES */
- for (i = st->bubble_min_radius; i <= st->bubble_max_radius+1; i++) {
- st->bubble_areas[i] /= factor;
- if (st->bubble_areas[i] == 0)
- st->bubble_areas[i] = 1;
- }
-#endif /* !FANCY_BUBBLES */
- }
-#ifdef DEBUG
- printf("maxarea = %ld\n", maxarea);
- printf("maxvalue = %g\n", maxvalue);
- printf("LONG_MAX = %ld\n", LONG_MAX);
- printf("factor = %ld\n", factor);
-#endif /* DEBUG */
-}
-
-/*
- * Bubbles stuff
- */
-
-static Bubble *
-new_bubble (struct state *st)
-/* Add a new bubble at some random position on the screen of the smallest
-size. */
-{
- Bubble *rv = (Bubble *)xmalloc(sizeof(Bubble));
-
- /* Can't use null_bubble() here since magic number hasn't been set */
- if (rv == (Bubble *)NULL) {
- fprintf(stderr, "Ran out of memory!\n");
- exit(1);
- }
-
- if (st->simple) {
- rv->radius = st->bubble_min_radius;
- rv->area = st->bubble_areas[st->bubble_min_radius];
-#ifdef FANCY_BUBBLES
- } else {
- rv->step = 0;
- rv->radius = st->step_pixmaps[0]->radius;
- rv->area = st->step_pixmaps[0]->area;
-#endif /* FANCY_BUBBLES */
- }
- rv->visible = 0;
- rv->magic = BUBBLE_MAGIC;
- rv->x = random() % st->screen_width;
- rv->y = random() % st->screen_height;
- rv->cell_index = pixel_to_mesh(st, rv->x, rv->y);
-
- return rv;
-}
-
-static void
-show_bubble(struct state *st, Bubble *bb)
-/* paint the bubble on the screen */
-{
- if (null_bubble(bb)) {
- fprintf(stderr, "NULL bubble passed to show_bubble\n");
- exit(1);
- }
-
- if (! bb->visible) {
- bb->visible = 1;
-
- if (st->simple) {
- XDrawArc(st->dpy, st->window, st->draw_gc, (bb->x - bb->radius),
- (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
- 360*64);
- } else {
-#ifdef FANCY_BUBBLES
- XSetClipOrigin(st->dpy, st->step_pixmaps[bb->step]->draw_gc,
- (bb->x - bb->radius),
- (bb->y - bb->radius));
-
- XCopyArea(st->dpy, st->step_pixmaps[bb->step]->ball, st->window,
- st->step_pixmaps[bb->step]->draw_gc,
- 0, 0, (bb->radius * 2),
- (bb->radius * 2),
- (bb->x - bb->radius),
- (bb->y - bb->radius));
-#endif /* FANCY_BUBBLES */
- }
- }
-}
-
-static void
-hide_bubble(struct state *st, Bubble *bb)
-/* erase the bubble */
-{
- if (null_bubble(bb)) {
- fprintf(stderr, "NULL bubble passed to hide_bubble\n");
- exit(1);
- }
-
- if (bb->visible) {
- bb->visible = 0;
-
- if (st->simple) {
- XDrawArc(st->dpy, st->window, st->erase_gc, (bb->x - bb->radius),
- (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
- 360*64);
- } else {
-#ifdef FANCY_BUBBLES
- if (! st->broken) {
- XSetClipOrigin(st->dpy, st->step_pixmaps[bb->step]->erase_gc,
- (bb->x - bb->radius), (bb->y - bb->radius));
-
- XFillRectangle(st->dpy, st->window, st->step_pixmaps[bb->step]->erase_gc,
- (bb->x - bb->radius),
- (bb->y - bb->radius),
- (bb->radius * 2),
- (bb->radius * 2));
- }
-#endif /* FANCY_BUBBLES */
- }
- }
-}
-
-static void
-delete_bubble_in_mesh(struct state *st, Bubble *bb, int keep_bubble)
-/* Delete an individual bubble, adjusting list of bubbles around it.
- If keep_bubble is true then the bubble isn't actually deleted. We
- use this to allow bubbles to change mesh cells without reallocating,
- (it needs this when two bubbles collide and the centre position is
- recalculated, and this may stray over a mesh boundary). */
-{
- if ((!null_bubble(bb->prev)) && (!null_bubble(bb->next))) {
- bb->prev->next = bb->next;
- bb->next->prev = bb->prev;
- } else if ((!null_bubble(bb->prev)) &&
- (null_bubble(bb->next))) {
- bb->prev->next = (Bubble *)NULL;
- bb->next = st->mesh[bb->cell_index];
- } else if ((null_bubble(bb->prev)) &&
- (!null_bubble(bb->next))) {
- bb->next->prev = (Bubble *)NULL;
- st->mesh[bb->cell_index] = bb->next;
- bb->next = st->mesh[bb->cell_index];
- } else {
- /* Only item on list */
- st->mesh[bb->cell_index] = (Bubble *)NULL;
- }
- if (! keep_bubble)
- free(bb);
-}
-
-static unsigned long
-ulongsqrint(int x)
-/* Saves ugly inline code */
-{
- return ((unsigned long)x * (unsigned long)x);
-}
-
-static Bubble *
-get_closest_bubble(struct state *st, Bubble *bb)
-/* Find the closest bubble touching the this bubble, NULL if none are
- touching. */
-{
- Bubble *rv = (Bubble *)NULL;
- Bubble *tmp;
- unsigned long separation2, touchdist2;
- int dx, dy;
- unsigned long closest2 = ULONG_MAX;
- int i;
-
-#ifdef DEBUG
- if (null_bubble(bb)) {
- fprintf(stderr, "NULL pointer 0x%x passed to get_closest_bubble()!",
- (int)bb);
- exit(1);
- }
-#endif /* DEBUG */
-
- for (i = 0; i < 9; i++) {
- /* There is a bug here where bb->cell_index is negaitve.. */
-#ifdef DEBUG
- if ((bb->cell_index < 0) || (bb->cell_index >= st->mesh_cells)) {
- fprintf(stderr, "bb->cell_index = %d\n", bb->cell_index);
- exit(1);
- }
-#endif /* DEBUG */
-/* printf("%d,", bb->cell_index); */
- if (st->adjacent_list[bb->cell_index][i] != -1) {
- tmp = st->mesh[st->adjacent_list[bb->cell_index][i]];
- while (! null_bubble(tmp)) {
- if (tmp != bb) {
- dx = tmp->x - bb->x;
- dy = tmp->y - bb->y;
- separation2 = ulongsqrint(dx) + ulongsqrint(dy);
- /* Add extra leeway so circles _never_ overlap */
- touchdist2 = ulongsqrint(tmp->radius + bb->radius + 2);
- if ((separation2 <= touchdist2) && (separation2 <
- closest2)) {
- rv = tmp;
- closest2 = separation2;
- }
- }
- tmp = tmp->next;
- }
- }
- }
-
- return rv;
-}
-
-#ifdef DEBUG
-static void
-ldr_barf (struct state *st)
-{
-}
-#endif /* DEBUG */
-
-static long
-long_div_round(long num, long dem)
-{
- long divvie, moddo;
-
-#ifdef DEBUG
- if ((num < 0) || (dem < 0)) {
- fprintf(stderr, "long_div_round: %ld, %ld\n", num, dem);
- ldr_barf();
- exit(1);
- }
-#endif /* DEBUG */
-
- divvie = num / dem;
- moddo = num % dem;
- if (moddo > (dem / 2))
- ++divvie;
-
-#ifdef DEBUG
- if ((divvie < 0) || (moddo < 0)) {
- fprintf(stderr, "long_div_round: %ld, %ld\n", divvie, moddo);
- ldr_barf();
- exit(1);
- }
-#endif /* DEBUG */
-
- return divvie;
-}
-
-static int
-weighted_mean(int n1, int n2, long w1, long w2)
-/* Mean of n1 and n2 respectively weighted by weights w1 and w2. */
-{
-#ifdef DEBUG
- if ((w1 <= 0) || (w2 <= 0)) {
- fprintf(stderr,
- "Bad weights passed to weighted_mean() - (%d, %d, %ld, %ld)!\n",
- n1, n2, w1, w2);
- exit(1);
- }
-#endif /* DEBUG */
- return ((int)long_div_round((long)n1 * w1 + (long)n2 * w2,
- w1 + w2));
-}
-
-static int
-bubble_eat(struct state *st, Bubble *diner, Bubble *food)
-/* The diner eats the food. Returns true (1) if the diner still exists */
-{
- int i;
- int newmi;
-
-#ifdef DEBUG
- if ((null_bubble(diner)) || (null_bubble(food))) {
- fprintf(stderr, "Bad bubbles passed to bubble_eat()!\n");
- exit(1);
- }
-#endif /* DEBUG */
-
- /* We hide the diner even in the case that it doesn't grow so that
- if the food overlaps its boundary it is replaced. This could
- probably be solved by letting bubbles eat others which are close
- but not quite touching. It's probably worth it, too, since we
- would then not have to redraw bubbles which don't change in
- size. */
-
- hide_bubble(st, diner);
- hide_bubble(st, food);
- diner->x = weighted_mean(diner->x, food->x, diner->area, food->area);
- diner->y = weighted_mean(diner->y, food->y, diner->area, food->area);
- newmi = pixel_to_mesh(st, diner->x, diner->y);
- diner->area += food->area;
- delete_bubble_in_mesh(st, food, DELETE_BUBBLE);
-
- if (st->drop) {
- if ((st->simple) && (diner->area > st->bubble_areas[st->bubble_max_radius])) {
- diner->area = st->bubble_areas[st->bubble_max_radius];
- }
-#ifdef FANCY_BUBBLES
- if ((! st->simple) && (diner->area > st->step_pixmaps[st->num_bubble_pixmaps]->area)) {
- diner->area = st->step_pixmaps[st->num_bubble_pixmaps]->area;
- }
-#endif /* FANCY_BUBBLES */
- }
- else {
- if ((st->simple) && (diner->area > st->bubble_areas[st->bubble_max_radius])) {
- delete_bubble_in_mesh(st, diner, DELETE_BUBBLE);
- return 0;
- }
-#ifdef FANCY_BUBBLES
- if ((! st->simple) && (diner->area >
- st->step_pixmaps[st->num_bubble_pixmaps]->area)) {
- delete_bubble_in_mesh(st, diner, DELETE_BUBBLE);
- return 0;
- }
-#endif /* FANCY_BUBBLES */
- }
-
- if (st->simple) {
- if (diner->area > st->bubble_areas[diner->radius + 1]) {
- /* Move the bubble to a new radius */
- i = diner->radius;
- while ((i < st->bubble_max_radius - 1) && (diner->area > st->bubble_areas[i+1]))
- ++i;
- diner->radius = i;
- }
- show_bubble(st, diner);
-#ifdef FANCY_BUBBLES
- } else {
- if (diner->area > st->step_pixmaps[diner->step+1]->area) {
- i = diner->step;
- while ((i < st->num_bubble_pixmaps - 1) && (diner->area > st->step_pixmaps[i+1]->area))
- ++i;
- diner->step = i;
- diner->radius = st->step_pixmaps[diner->step]->radius;
- }
- show_bubble(st, diner);
-#endif /* FANCY_BUBBLES */
- }
-
- /* Now adjust locations and cells if need be */
- if (newmi != diner->cell_index) {
- delete_bubble_in_mesh(st, diner, KEEP_BUBBLE);
- diner->cell_index = newmi;
- add_to_mesh(st, diner);
- }
-
- return 1;
-}
-
-static int
-merge_bubbles(struct state *st, Bubble *b1, Bubble *b2)
-/* These two bubbles merge into one. If the first one wins out return
-1 else return 2. If there is no winner (it explodes) then return 0 */
-{
- int b1size, b2size;
-
- b1size = b1->area;
- b2size = b2->area;
-
-#ifdef DEBUG
- if ((null_bubble(b1) || null_bubble(b2))) {
- fprintf(stderr, "NULL bubble passed to merge_bubbles()!\n");
- exit(1);
- }
-#endif /* DEBUG */
-
- if (b1 == b2) {
- hide_bubble(st, b1);
- delete_bubble_in_mesh(st, b1, DELETE_BUBBLE);
- return 0;
- }
-
- if (b1size > b2size) {
- switch (bubble_eat(st, b1, b2)) {
- case 0:
- return 0;
- break;
- case 1:
- return 1;
- break;
- default:
- break;
- }
- } else if (b1size < b2size) {
- switch (bubble_eat(st, b2, b1)) {
- case 0:
- return 0;
- break;
- case 1:
- return 2;
- break;
- default:
- break;
- }
- } else {
- if ((random() % 2) == 0) {
- switch (bubble_eat(st, b1, b2)) {
- case 0:
- return 0;
- break;
- case 1:
- return 1;
- break;
- default:
- break;
- }
- } else {
- switch (bubble_eat(st, b2, b1)) {
- case 0:
- return 0;
- break;
- case 1:
- return 2;
- break;
- default:
- break;
- }
- }
- }
- fprintf(stderr, "An error occurred in merge_bubbles()\n");
- exit(1);
-}
-
-static void
-insert_new_bubble(struct state *st, Bubble *tmp)
-/* Calculates which bubbles are eaten when a new bubble tmp is
- inserted. This is called recursively in case when a bubble grows
- it eats others. Careful to pick out disappearing bubbles. */
-{
- Bubble *nextbub;
- Bubble *touch;
-
-#ifdef DEBUG
- if (null_bubble(tmp)) {
- fprintf(stderr, "Bad bubble passed to insert_new_bubble()!\n");
- exit(1);
- }
-#endif /* DEBUG */
-
- nextbub = tmp;
- touch = get_closest_bubble(st, nextbub);
- if (null_bubble(touch))
- return;
-
- while (1) {
-
- /* Merge all touching bubbles */
- while (! null_bubble(touch)) {
- switch (merge_bubbles(st, nextbub, touch)) {
- case 2:
- /* touch ate nextbub and survived */
- nextbub = touch;
- break;
- case 1:
- /* nextbub ate touch and survived */
- break;
- case 0:
- /* somebody ate someone else but they exploded */
- nextbub = (Bubble *)NULL;
- break;
- default:
- /* something went wrong */
- fprintf(stderr, "Error occurred in insert_new_bubble()\n");
- exit(1);
- }
-
- /* Check to see if any bubble survived. */
- if (null_bubble(nextbub))
- break;
-
- /* Check to see if there are any other bubbles still in the area
- and if we need to do this all over again for them. */
- touch = get_closest_bubble(st, nextbub);
- }
-
- if (null_bubble(nextbub))
- break;
-
- /* Shift bubble down. Break if we run off the screen. */
- if (st->drop) {
- if (drop_bubble( st, nextbub ) == -1)
- break;
- }
-
- /* Check to see if there are any other bubbles still in the area
- and if we need to do this all over again for them. */
- touch = get_closest_bubble(st, nextbub);
- if (null_bubble(touch)) {
- /* We also continue every so often if we're dropping and the bubble is at max size */
- if (st->drop) {
- if (st->simple) {
- if ((nextbub->area >= st->bubble_areas[st->bubble_max_radius - 1]) && (random() % 2 == 0))
- continue;
- }
-#ifdef FANCY_BUBBLES
- else {
- if ((nextbub->step >= st->num_bubble_pixmaps - 1) && (random() % 2 == 0))
- continue;
- }
-#endif /* FANCY_BUBBLES */
- }
- break;
- }
-
- }
-}
-
-
-static void
-leave_trail(struct state *st, Bubble *bb )
-{
- Bubble *tmp;
-
- tmp = new_bubble(st);
- tmp->x = bb->x;
- tmp->y = bb->y - ((bb->radius + 10) * st->drop_dir);
- tmp->cell_index = pixel_to_mesh(st, tmp->x, tmp->y);
- add_to_mesh(st, tmp);
- insert_new_bubble(st, tmp);
- show_bubble( st, tmp );
-}
-
-
-static int
-drop_bubble( struct state *st, Bubble *bb )
-{
- int newmi;
-
- hide_bubble( st, bb );
-
- if (st->simple)
- (bb->y) += (st->bubble_droppages[bb->radius] * st->drop_dir);
-#ifdef FANCY_BUBBLES
- else
- (bb->y) += (st->step_pixmaps[bb->step]->droppage * st->drop_dir);
-#endif /* FANCY_BUBBLES */
- if ((bb->y < 0) || (bb->y > st->screen_height)) {
- delete_bubble_in_mesh( st, bb, DELETE_BUBBLE );
- return -1;
- }
-
- show_bubble( st, bb );
-
- /* Now adjust locations and cells if need be */
- newmi = pixel_to_mesh(st, bb->x, bb->y);
- if (newmi != bb->cell_index) {
- delete_bubble_in_mesh(st, bb, KEEP_BUBBLE);
- bb->cell_index = newmi;
- add_to_mesh(st, bb);
- }
-
- if (st->trails) {
- if (st->simple) {
- if ((bb->area >= st->bubble_areas[st->bubble_max_radius - 1]) && (random() % 2 == 0))
- leave_trail( st, bb );
- }
-#ifdef FANCY_BUBBLES
- else {
- if ((bb->step >= st->num_bubble_pixmaps - 1) && (random() % 2 == 0))
- leave_trail( st, bb );
- }
-#endif /* FANCY_BUBBLES */
- }
-
- return 0;
-}
-
-
-#ifdef DEBUG
-static int
-get_length_of_bubble_list(Bubble *bb)
-{
- Bubble *tmp = bb;
- int rv = 0;
-
- while (! null_bubble(tmp)) {
- rv++;
- tmp = tmp->next;
- }
-
- return rv;
-}
-#endif /* DEBUG */
-
-/*
- * Pixmap stuff used regardless of whether file I/O is available. Must
- * still check for XPM, though!
- */
-
-#ifdef FANCY_BUBBLES
-
-/*
- * Pixmaps without file I/O (but do have XPM)
- */
-
-static void
-pixmap_sort(Bubble_Step **head, int numelems)
-/* Couldn't get qsort to work right with this so I wrote my own. This puts
-the numelems length array with first element at head into order of radius.
-*/
-{
- Bubble_Step tmp;
- Bubble_Step *least = 0;
- int minradius = INT_MAX;
- int i;
-
- for (i = 0; i < numelems; i++) {
- if (head[i]->radius < minradius) {
- least = head[i];
- minradius = head[i]->radius;
- }
- }
- if (*head != least) {
- memcpy(&tmp, least, sizeof(Bubble_Step));
- memcpy(least, *head, sizeof(Bubble_Step));
- memcpy(*head, &tmp, sizeof(Bubble_Step));
- }
-
- if (numelems > 2)
- pixmap_sort(&head[1], numelems-1);
-}
-
-static int
-extrapolate(int i1, int i2)
-{
- return (i2 + (i2 - i1));
-}
-
-static void
-make_pixmap_array(struct state *st, Bubble_Step *list)
-/* From a linked list of bubbles construct the array step_pixmaps */
-{
- Bubble_Step *tmp = list;
- int ind;
-#ifdef DEBUG
- int prevrad = -1;
-#endif
-
- if (list == (Bubble_Step *)NULL) {
- fprintf(stderr, "NULL list passed to make_pixmap_array\n");
- exit(1);
- }
-
- st->num_bubble_pixmaps = 1;
- while(tmp->next != (Bubble_Step *)NULL) {
- tmp = tmp->next;
- ++st->num_bubble_pixmaps;
- }
-
- if (st->num_bubble_pixmaps < 2) {
- fprintf(stderr, "Must be at least two bubbles in file\n");
- exit(1);
- }
-
- st->step_pixmaps = (Bubble_Step **)xmalloc((st->num_bubble_pixmaps + 1) *
- sizeof(Bubble_Step *));
-
- /* Copy them blindly into the array for sorting. */
- ind = 0;
- tmp = list;
- do {
- st->step_pixmaps[ind++] = tmp;
- tmp = tmp->next;
- } while(tmp != (Bubble_Step *)NULL);
-
- /* We make another bubble beyond the ones with pixmaps so that the final
- bubble hangs around and doesn't pop immediately. It's radius and area
- are found by extrapolating from the largest two bubbles with pixmaps. */
-
- st->step_pixmaps[st->num_bubble_pixmaps] =
- (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
- st->step_pixmaps[st->num_bubble_pixmaps]->radius = INT_MAX;
-
- pixmap_sort(st->step_pixmaps, (st->num_bubble_pixmaps + 1));
-
-#ifdef DEBUG
- if (st->step_pixmaps[st->num_bubble_pixmaps]->radius != INT_MAX) {
- fprintf(stderr, "pixmap_sort() screwed up make_pixmap_array\n");
- }
-#endif /* DEBUG */
-
- st->step_pixmaps[st->num_bubble_pixmaps]->radius =
- extrapolate(st->step_pixmaps[st->num_bubble_pixmaps-2]->radius,
- st->step_pixmaps[st->num_bubble_pixmaps-1]->radius);
- st->step_pixmaps[st->num_bubble_pixmaps]->area =
- calc_bubble_area(st, st->step_pixmaps[st->num_bubble_pixmaps]->radius);
-
-
-#ifdef DEBUG
- /* Now check for correct order */
- for (ind = 0; ind < st->num_bubble_pixmaps; ind++) {
- if (prevrad > 0) {
- if (st->step_pixmaps[ind]->radius < prevrad) {
- fprintf(stderr, "Pixmaps not in ascending order of radius\n");
- exit(1);
- }
- }
- prevrad = st->step_pixmaps[ind]->radius;
- }
-#endif /* DEBUG */
-
- /* Now populate the droppage values */
- for (ind = 0; ind < st->num_bubble_pixmaps; ind++)
- st->step_pixmaps[ind]->droppage = MAX_DROPPAGE * ind / st->num_bubble_pixmaps;
-}
-
-static void
-make_pixmap_from_default(struct state *st,
- const unsigned char *png_data,
- unsigned long data_size,
- Bubble_Step *bl)
-/* Read pixmap data which has been compiled into the program and a pointer
- to which has been passed.
-
- This is virtually copied verbatim from make_pixmap_from_file() above and
-changes made to either should be propagated onwards! */
-{
- XGCValues gcv;
-
-#ifdef DEBUG
- if (pixmap_data == (char **)0) {
- fprintf(stderr, "make_pixmap_from_default(): NULL passed\n");
- exit(1);
- }
-#endif
-
- if (bl == (Bubble_Step *)NULL) {
- fprintf(stderr, "NULL pointer passed to make_pixmap()\n");
- exit(1);
- }
-
-#ifdef FANCY_BUBBLES
- {
- int w, h;
- bl->ball = image_data_to_pixmap (st->dpy, st->window, png_data, data_size,
- &w, &h, &bl->shape_mask);
- bl->radius = MAX(w, h) / 2;
- bl->area = calc_bubble_area(st, bl->radius);
- }
-#endif /* FANCY_BUBBLES */
-
- gcv.foreground = st->default_fg_pixel;
- gcv.function = GXcopy;
- bl->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
- XSetClipMask(st->dpy, bl->draw_gc, bl->shape_mask);
-
- gcv.foreground = st->default_bg_pixel;
- gcv.function = GXcopy;
- bl->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
- XSetClipMask(st->dpy, bl->erase_gc, bl->shape_mask);
-}
-
-static void
-default_to_pixmaps (struct state *st)
-/* Make pixmaps out of default ball data stored in bubbles_default.c */
-{
- int i;
- Bubble_Step *pixmap_list = (Bubble_Step *)NULL;
- Bubble_Step *newpix, *tmppix;
-
- init_default_bubbles();
-
- st->def_list = (Bubble_Step **)xmalloc((num_default_bubbles + 1) *
- sizeof(Bubble_Step *));
- for (i = 0; i < num_default_bubbles; i++) {
- newpix = (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
- make_pixmap_from_default(st,
- default_bubbles[i].png,
- default_bubbles[i].size,
- newpix);
- /* Now add to list */
- st->def_list[i] = newpix;
- if (pixmap_list == (Bubble_Step *)NULL) {
- pixmap_list = newpix;
- } else {
- tmppix = pixmap_list;
- while (tmppix->next != (Bubble_Step *)NULL)
- tmppix = tmppix->next;
- tmppix->next = newpix;
- }
- newpix->next = (Bubble_Step *)NULL;
- }
-
- /* Finally construct step_pixmaps[] */
- make_pixmap_array(st, pixmap_list);
-}
-
-#endif /* FANCY_BUBBLES */
-
-
-/*
- * Main stuff
- */
-
-
-static void
-get_resources(struct state *st)
-/* Get the appropriate X resources and warn about any inconsistencies. */
-{
- Bool rise;
- XWindowAttributes xgwa;
- Colormap cmap;
- char *s;
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- cmap = xgwa.colormap;
-
- st->threed = get_boolean_resource(st->dpy, "3D", "Boolean");
- st->quiet = get_boolean_resource(st->dpy, "quiet", "Boolean");
- st->simple = get_boolean_resource(st->dpy, "simple", "Boolean");
- /* Forbid rendered bubbles on monochrome displays */
- if ((mono_p) && (! st->simple)) {
- if (! st->quiet)
- fprintf(stderr,
- "Rendered bubbles not supported on monochrome displays\n");
- st->simple = True;
- }
- st->delay = get_integer_resource(st->dpy, "delay", "Integer");
-
- s = get_string_resource (st->dpy, "mode", "Mode");
- rise = False;
- if (!s || !*s || !strcasecmp (s, "float"))
- ;
- else if (!strcasecmp (s, "rise"))
- rise = True;
- else if (!strcasecmp (s, "drop"))
- st->drop = True;
- else
- fprintf (stderr, "%s: bogus mode: \"%s\"\n", progname, s);
-
- if (s) free (s);
-
- st->trails = get_boolean_resource(st->dpy, "trails", "Boolean");
- st->drop_dir = (st->drop ? 1 : -1);
- if (st->drop || rise)
- st->drop = 1;
-
- st->default_fg_pixel = get_pixel_resource (st->dpy,
- cmap, "foreground", "Foreground");
- st->default_bg_pixel = get_pixel_resource (st->dpy,
- cmap, "background", "Background");
-
- if (st->simple) {
- /* This is easy */
- st->broken = get_boolean_resource(st->dpy, "broken", "Boolean");
- if (st->broken)
- if (! st->quiet)
- fprintf(stderr, "-broken not available in simple mode\n");
- } else {
-#ifndef FANCY_BUBBLES
- st->simple = 1;
-#else /* FANCY_BUBBLES */
- st->broken = get_boolean_resource(st->dpy, "broken", "Boolean");
-#endif /* FANCY_BUBBLES */
- }
-}
-
-static void *
-bubbles_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- XWindowAttributes xgwa;
- int i;
-
- st->dpy = dpy;
- st->window = window;
-
- get_resources(st);
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
-
-#ifdef DEBUG
- printf("sizof(int) on this platform is %d\n", sizeof(int));
- printf("sizof(long) on this platform is %d\n", sizeof(long));
-#endif /* DEBUG */
-
- st->screen_width = xgwa.width;
- st->screen_height = xgwa.height;
- st->screen_depth = xgwa.depth;
-
- if (st->simple) {
- /* These are pretty much plucked out of the air */
- st->bubble_min_radius = (int)(0.006*(double)(MIN(st->screen_width,
- st->screen_height)));
- st->bubble_max_radius = (int)(0.045*(double)(MIN(st->screen_width,
- st->screen_height)));
- /* Some trivial values */
- if (st->bubble_min_radius < 1)
- st->bubble_min_radius = 1;
- if (st->bubble_max_radius <= st->bubble_min_radius)
- st->bubble_max_radius = st->bubble_min_radius + 1;
-
- st->mesh_length = (2 * st->bubble_max_radius) + 3;
-
- /* store area of each bubble of certain radius as number of 1/10s of
- a pixel area. PI is defined in <math.h> */
- st->bubble_areas = (long *)xmalloc((st->bubble_max_radius + 2) * sizeof(int));
- for (i = 0; i < st->bubble_min_radius; i++)
- st->bubble_areas[i] = 0;
- for (i = st->bubble_min_radius; i <= (st->bubble_max_radius+1); i++)
- st->bubble_areas[i] = calc_bubble_area(st, i);
-
- /* Now populate the droppage values */
- st->bubble_droppages = (int *)xmalloc((st->bubble_max_radius + 2) * sizeof(int));
- for (i = 0; i < st->bubble_min_radius; i++)
- st->bubble_droppages[i] = 0;
- for (i = st->bubble_min_radius; i <= (st->bubble_max_radius+1); i++)
- st->bubble_droppages[i] = MAX_DROPPAGE * (i - st->bubble_min_radius) / (st->bubble_max_radius - st->bubble_min_radius);
-
- st->mesh_length = (2 * st->bubble_max_radius) + 3;
- } else {
-#ifndef FANCY_BUBBLES
- fprintf(stderr,
- "Bug: simple mode code not set but FANCY_BUBBLES not defined\n");
- exit(1);
-#else /* FANCY_BUBBLES */
- /* Make sure all #ifdef sort of things have been taken care of in
- get_resources(). */
- default_to_pixmaps(st);
-
- /* Set mesh length */
- st->mesh_length = (2 * st->step_pixmaps[st->num_bubble_pixmaps-1]->radius) + 3;
-#endif /* FANCY_BUBBLES */
-
- /* Am I missing something in here??? */
- }
-
- st->mesh_width = (st->screen_width / st->mesh_length) + 1;
- st->mesh_height = (st->screen_height / st->mesh_length) + 1;
- st->mesh_cells = st->mesh_width * st->mesh_height;
- init_mesh(st);
-
- calculate_adjacent_list(st);
-
- adjust_areas(st);
-
- /* Graphics contexts for simple mode */
- if (st->simple) {
- gcv.foreground = st->default_fg_pixel;
- st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
- gcv.foreground = st->default_bg_pixel;
- st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
- }
-
- XClearWindow (st->dpy, st->window);
-
-# ifndef FANCY_BUBBLES
- st->simple = True;
-# endif
-
- return st;
-}
-
-static unsigned long
-bubbles_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
- for (i = 0; i < 5; i++)
- {
- Bubble *tmp = new_bubble(st);
- add_to_mesh(st, tmp);
- insert_new_bubble(st, tmp);
- }
- return st->delay;
-}
-
-
-static void
-bubbles_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static Bool
-bubbles_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-free_bubble (Display *dpy, Bubble_Step *b)
-{
- if (b->ball) XFreePixmap (dpy, b->ball);
- if (b->shape_mask) XFreePixmap (dpy, b->shape_mask);
- if (b->draw_gc) XFreeGC (dpy, b->draw_gc);
- if (b->erase_gc) XFreeGC (dpy, b->erase_gc);
- free (b);
-}
-
-static void
-bubbles_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
-
- /* #### The lifetime of objects in this program is fucking incomprehensible.
- I give up. */
-
- /* for (i = 0; i < num_default_bubbles; i++)
- free_bubble (dpy, st->def_list[i]); */
- for (i = 0; i < st->num_bubble_pixmaps; i++)
- free_bubble (dpy, st->step_pixmaps[i]);
- for (i = 0; i < st->mesh_cells; i++)
- free (st->adjacent_list[i]);
- /* for (i = 0; i < st->mesh_cells; i++)
- free_bubble (dpy, st->mesh[i]); */
- if (st->draw_gc) XFreeGC (dpy, st->draw_gc);
- if (st->erase_gc) XFreeGC (dpy, st->erase_gc);
- free (st->adjacent_list);
- free (st->def_list);
- free (st->step_pixmaps);
- free (st->mesh);
- free (st);
-}
-
-XSCREENSAVER_MODULE ("Bubbles", bubbles)
diff --git a/hacks/bubbles.h b/hacks/bubbles.h
deleted file mode 100644
index 08e81d5..0000000
--- a/hacks/bubbles.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/* bubbles.h - definitions for bubbles screensaver */
-
-/* $Id: bubbles.h,v 1.6 2006/02/25 20:11:57 jwz Exp $ */
-
-#ifndef _BUBBLES_H_
-#define _BUBBLES_H_
-
-#ifdef HAVE_JWXYZ
-# include "jwxyz.h"
-#else
-# include <X11/Xlib.h>
-#endif
-
-/***************************************************************************
- * Options you might like to change to affect the program's behaviour *
- ***************************************************************************/
-
-/*
- * Uncommenting the following will enable support for reading bubbles from
- * files (using the -file and -directory options to bubbles). This is
- * disabled by default since such operations are inherently non-portable
- * and we want the program to compile on as many systems as possible.
- *
- * If you uncomment this and you figure out how to get it working, please
- * let me (J.Macnicol@student.anu.edu.au) know. Diffs against the standard
- * distribution would be appreciated. Possible sources of problems are
- * dirent and possibly the use of tmpnam().
- */
-
-/* #define BUBBLES_IO */
-
-/*
- * The following only makes sense if BUBBLES_IO above is defined.
- *
- * Uncomment the following if you always want to use the -file or
- * -directory options on the command line and never to use a default bubble
- * compiled into the program. This way you would save memory and disk space
- * since if you do use -file or -directory only one bubble will be loaded
- * into memory at any one time (and remember the default bubble is really
- * uncompressed, unlike bubbles in files which can be compressed). This
- * is disabled by default only so people running the program for the first
- * time with no knowldege of the command line options don't get error
- * messages ;)
- *
- * NOTE: You will still need to have a bubbles_default.c file, else the
- * build sequence will fail. Well constructed bubbles_default.c files
- * have #ifdef's which simply exclude everything else in the file at
- * compile time. The bubblestodefault script does this.
- */
-
-/* #define NO_DEFAULT_BUBBLE */
-
-/*
- * This turns on any debugging messages and sanity checks. Hopefully you
- * won't need this :) It slows things down a bit, too.
- *
- * NOTE: If you uncomment this you will get some messages about unused
- * functions when you compile. You can ignore these - they refer to
- * convenient checking routines which simply aren't called but are left
- * in case someone wants to use them.
- */
-
-/* #define DEBUG */
-
-/***************************************************************************
- * Things you might need to change to get things working right *
- ***************************************************************************/
-
-/*
- * Name of the gzip binary. You shouldn't need to change this unless it's
- * not in your PATH when the program is run, in which case you will need to
- * substitute the full path here. Keep the double quotes else things won't
- * compile!
- */
-
-#define GZIP "gzip"
-
-/*
- * Likewise for the Bourne shell.
- */
-
-#define BOURNESH "sh"
-
-/*
- * The name of the directory entry structure is different under Linux
- * (under which this code is being developed) than other systems. The case
- * alternate form here is that given in Kernighan & Ritchie's C book (which
- * must be authoratitive, no?)
- *
- * 04/07/96 : People will have to hack this to get it working on some
- * systems. I believe it doesn't work on SGI, for example.
- */
-
-#ifdef _POSIX_SOURCE
-#define STRUCT_DIRENT struct dirent
-#else
-#define STRUCT_DIRENT Dirent
-#endif
-
-/*
- * The naming of fields in struct dirent also seems to differ from system to
- * system. This may have to be extended to make things truly portable.
- * What we want here is the name field from a dirent struct pointed to
- * by "dp".
- *
- * 04/07/96 : See above. This may need to be changed too.
- */
-
-#ifdef _POSIX_SOURCE
-#define DIRENT_NAME dp->d_name
-#else
-#define DIRENT_NAME dp->name
-#endif
-
-/* I don't know why this isn't defined. */
-#ifdef linux
-/* apparently it is defined in recent linuxes. who knows. */
-/*extern char *tempnam(char *, char *);*/
-#endif
-
-/****************************************************************************
- * Buffer lengths and things you probably won't need to touch *
- ****************************************************************************/
-
-/* Maximum length of a full path name we can deal with */
-#define PATH_BUF_SIZE 1024
-
-/* Size of string passed to shell as command */
-#define COMMAND_BUF_SIZE 2500
-
-/* Size increments for read_line() buffers */
-#define READ_LINE_BUF_SIZE 24
-
-/* Maximum amount to drop a bubble */
-#define MAX_DROPPAGE 20
-
-/****************************************************************************
- * End of options *
- ****************************************************************************/
-
-/* for delete_bubble_in_mesh() */
-#define DELETE_BUBBLE 0
-#define KEEP_BUBBLE 1
-
-/* Status codes for read_line */
-#define LINE_READ 0
-#define EOF_REACHED 1
-#define IO_ERROR 2
-
-/*
- * Magic number for Bubble struct, in case it's trashed when debugging code
- * (which happened to me often.... :(
- */
-
-#define BUBBLE_MAGIC 5674
-
-/* Useful macros */
-#define MAX(A, B) ((A) > (B) ? (A) : (B))
-#define MIN(A, B) ((A) < (B) ? (A) : (B))
-
-/* How we represent bubbles */
-struct bub {
- int radius;
- int step; /* for rendered bubbles */
- long area;
- int x;
- int y;
- int magic;
- int cell_index;
- int visible;
- struct bub *next;
- struct bub *prev;
-};
-
-typedef struct bub Bubble;
-
-/*
- * How we represent pixmaps of rendered bubbles. Because the range of radii
- * available may not be continuous, we call each a step (for the lack of a
- * better name...)
- */
-
-struct bub_step {
- int radius;
- long area;
- int droppage;
- Pixmap ball, shape_mask;
- GC draw_gc, erase_gc;
- struct bub_step *next;
-};
-
-typedef struct bub_step Bubble_Step;
-
-extern void init_default_bubbles(void);
-extern int num_default_bubbles;
-typedef struct { const unsigned char *png; unsigned long size; } bubble_png;
-extern bubble_png default_bubbles[];
-
-#endif /* _BUBBLES_H_ */
diff --git a/hacks/bubbles.man b/hacks/bubbles.man
deleted file mode 100644
index 25d77f6..0000000
--- a/hacks/bubbles.man
+++ /dev/null
@@ -1,127 +0,0 @@
-.TH XScreenSaver 1 "14-Dec-95" "X Version 11"
-.SH NAME
-bubbles \- frying pan / soft drink simulation
-.SH SYNOPSIS
-.B bubbles
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-rise|\-drop] [-trails]
-[\-fps]
-.SH DESCRIPTION
-\fIBubbles\fP sprays lots of little random bubbles all over the window which
-then grow until they reach their maximum size and go pop. The inspiration
-for this was watching little globules of oil on the bottom of a frying pan
-and it also looks a little like bubbles in fizzy soft drink. The default
-mode uses fancy ray-traced bubbles but there is also a mode which just draws
-circles in case the default mode is too taxing on your hardware.
-.SH OPTIONS
-Depending on how your
-.I bubbles
-was compiled, it accepts the following options:
-.TP 8
-.B \-foreground
-Colour of circles if \fI\-simple\fP mode is selected.
-.TP 8
-.B \-background
-Colour of window background.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay microseconds
-How much of a delay should be introduced between steps of the animation.
-Default 800, or about 800 microsecond. Actually, this is the delay between each
-group of 15 new bubbles since such a delay between each step results in a
-very slow animation rate.
-.TP 8
-.B \-nodelay
-Same as \fI\-delay 0\fP.
-.TP 8
-.B \-simple
-Don't use the default fancy pixmap bubbles. Just draw circles instead.
-This may give more bearable performance if your hardware wasn't made for
-this sort of thing.
-.TP 8
-.B \-broken
-Don't hide bubbles when they pop. This was a bug during development
-but the results were actually quite attractive.
-.TP 8
-.B \-3D
-Normally, the simulation is done completely in two dimensions. When a
-bubble swallows up another bubble, the areas of each are added to get
-the area of the resulting bubble. This option changes the algorithm
-to instead add volume (imagining each to be a sphere in 3D space). The
-whole thing looks more realistic but I find it attracts attention to
-the flickering of each bubble as they are move and are redrawn. Your
-mileage may vary.
-.TP 8
-.B \-quiet
-Don't print messages explaining why one or several command line options
-were ignored. This is disabled by default.
-.TP 8
-.B \-rise | \-drop
-.TP 8
-.B \-trails
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH NOTES
-If you find the pace of things too slow, remember that there is a delay
-even though you specify no \fI\-delay\fP option. Try using \fI\-nodelay\fP
-although beware of the effects of irritation of other users if you're on a
-shared system as you bleed their CPU time away.
-
-Some tools to assist in creation of new bubbles are included in the source
-distribution. These can either be loaded with the \fI\-file\fP or
-\fI\-directory\fP options (if available) or they can be used in place
-of the distributed default bubble (bubble_default.c).
-You might like to copy these scripts to a permanent location and
-use them. Read bubbles.README.
-
-Rendered bubbles are not supported on monochrome displays. I'm not
-convinced that small bubbles, even dithered properly are going to look
-like anything more than a jumble of random dots.
-.SH BUGS
-There is a delay before something appears on the screen when using
-rendered bubbles. The XPM library seems to take a \fBlong\fP time to make
-pixmaps out of raw data. This can be irritating on slower systems.
-
-The movement of the bubbles looks jerky if an incomplete set of bubbles
-is used.
-
-The hide/display algorithm could do with some work to avoid flickering
-when \fI\-nodelay\fP is set.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH DISTRIBUTION POLICY
-This work is Copyright \(co 1995, 1996 by James Macnicol. Permission
-to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided
-that the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation. No representations are made about the suitability of
-this software for any purpose. It is provided "as is" without express
-or implied warranty.
-.SH AUTHOR
-James Macnicol <james.macnicol@mailexcite.com>
diff --git a/hacks/bumps.c b/hacks/bumps.c
deleted file mode 100644
index d24ce00..0000000
--- a/hacks/bumps.c
+++ /dev/null
@@ -1,706 +0,0 @@
-/* -*- mode: C; tab-width: 4 -*-
- * Bumps, Copyright (c) 2002, 2006 Shane Smit <CodeWeaver@DigitalLoom.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Module: "bumps.c"
- * Tab Size: 4
- *
- * Description:
- * This is typical bump-mapping. The actual bump map is generated by a screen
- * grab. The light source is represented by a spotlight of random color. This
- * spotlight randomly traverses the bump map in a sinus pattern.
- *
- * Essentially, it 3D-izes your desktop, based on color intensity.
- *
- * Modification History:
- * [10/01/1999] - Shane Smit: Creation
- * [10/08/1999] - Shane Smit: Port to C. (Ick)
- * [03/08/2002] - Shane Smit: New movement code.
- * [09/12/2002] - Shane Smit: MIT-SHM XImages.
- * Thanks to Kennett Galbraith <http://www.Alpha-II.com/>
- * for code optimization.
- * [10/09/2016] - Dave Odell: Updated for new xshm.c.
- * Y2K compliance.
- */
-
-
-#include <math.h>
-#include <time.h>
-#include <inttypes.h>
-#include "screenhack.h"
-#include "xshm.h"
-
-
-/* Defines: */
-/* #define VERBOSE */
-#define RANDOM() ((int) (random() & 0X7FFFFFFFL))
-
-typedef unsigned char BOOL;
-
-
-/* Globals: */
-
-static const char *bumps_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*color: random",
- "*colorcount: 64",
- "*delay: 30000",
- "*duration: 120",
- "*soften: 1",
- "*invert: FALSE",
-#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
- "*visualID: Best",
-#endif
-#ifdef HAVE_XSHM_EXTENSION
- "*useSHM: True",
-#endif /* HAVE_XSHM_EXTENSION */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
- "*rotateImages: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec bumps_options [] = {
- { "-color", ".color", XrmoptionSepArg, 0 },
- { "-colorcount", ".colorcount", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-soften", ".soften", XrmoptionSepArg, 0 },
- { "-invert", ".invert", XrmoptionNoArg, "TRUE" },
-#ifdef HAVE_XSHM_EXTENSION
- { "-shm", ".useSHM", XrmoptionNoArg, "True" },
- { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
-#endif /* HAVE_XSHM_EXTENSION */
-
- { 0, 0, 0, 0 }
-};
-
-
-/* This structure handles everything to do with the spotlight, and is designed to be
- * a member of TBumps. */
-typedef struct
-{
- uint8_t *aLightMap;
- uint16_t nFalloffDiameter, nFalloffRadius;
- uint16_t nLightDiameter, nLightRadius;
- float nAccelX, nAccelY;
- float nAccelMax;
- float nVelocityX, nVelocityY;
- float nVelocityMax;
- float nXPos, nYPos;
-} SSpotLight;
-
-
-/* The entire program's operation is contained within this structure. */
-typedef struct
-{
- /* XWindows specific variables. */
- Display *dpy;
- Window Win;
- Screen *screen;
- Pixmap source;
- GC GraphicsContext;
- XColor *xColors;
- unsigned long *aColors;
- XImage *pXImage;
- XShmSegmentInfo XShmInfo;
-
- uint8_t nColorCount; /* Number of colors used. */
- uint8_t bytesPerPixel;
- uint16_t iWinWidth, iWinHeight;
- uint16_t *aBumpMap; /* The actual bump map. */
- SSpotLight SpotLight;
-
- int delay;
- int duration;
- time_t start_time;
-
- async_load_state *img_loader;
-} SBumps;
-
-
-static void SetPalette(Display *, SBumps *, XWindowAttributes * );
-static void InitBumpMap(Display *, SBumps *, XWindowAttributes * );
-static void InitBumpMap_2(Display *, SBumps *);
-static void SoftenBumpMap( SBumps * );
-
-
-
-
-/* This function pointer will point to the appropriate PutPixel*() function below. */
-static void (*MyPutPixel)( int8_t *, uint32_t );
-
-static void PutPixel32( int8_t *pData, uint32_t pixel )
-{
- *(uint32_t *)pData = pixel;
-}
-
-static void PutPixel24( int8_t *pData, uint32_t pixel )
-{
- pData[ 2 ] = ( pixel & 0x00FF0000 ) >> 16;
- pData[ 1 ] = ( pixel & 0x0000FF00 ) >> 8;
- pData[ 0 ] = ( pixel & 0x000000FF );
-}
-
-static void PutPixel16( int8_t *pData, uint32_t pixel )
-{
- *(uint16_t *)pData = (uint16_t)pixel;
-}
-
-static void PutPixel8( int8_t *pData, uint32_t pixel )
-{
- *(uint8_t *)pData = (uint8_t)pixel;
-}
-
-/* Creates the light map, which is a circular image... going from black around the edges
- * to white in the center. */
-static void CreateSpotLight( SSpotLight *pSpotLight, uint16_t iDiameter, uint16_t nColorCount )
-{
- double nDist;
- int16_t iDistX, iDistY;
- uint8_t *pLOffset;
-
- pSpotLight->nFalloffDiameter = iDiameter;
- pSpotLight->nFalloffRadius = pSpotLight->nFalloffDiameter / 2;
- pSpotLight->nLightDiameter = iDiameter / 2;
- pSpotLight->nLightRadius = pSpotLight->nLightDiameter / 2;
-#ifdef VERBOSE
- printf( "%s: Falloff Diameter: %d\n", progclass, pSpotLight->nFalloffDiameter );
- printf( "%s: Spot Light Diameter: %d\n", progclass, pSpotLight->nLightDiameter );
-#endif
-
- pSpotLight->aLightMap = malloc( pSpotLight->nLightDiameter * pSpotLight->nLightDiameter * sizeof(uint8_t) );
-
- pLOffset = pSpotLight->aLightMap;
- for( iDistY=-pSpotLight->nLightRadius; iDistY<pSpotLight->nLightRadius; ++iDistY )
- {
- for( iDistX=-pSpotLight->nLightRadius; iDistX<pSpotLight->nLightRadius; ++iDistX )
- {
- nDist = sqrt( pow( iDistX+0.5F, 2 ) + pow( iDistY+0.5F, 2 ) );
- if( nDist / pSpotLight->nLightRadius <= 1.0f )
- *pLOffset = (uint8_t)(nColorCount - ( ( nDist / pSpotLight->nLightRadius ) * ( nColorCount - 1 ) ));
- else
- *pLOffset = 0;
-
- ++pLOffset;
- }
- }
-
- /* Initialize movement variables. */
- pSpotLight->nAccelX = 0;
- pSpotLight->nAccelY = 0;
- pSpotLight->nVelocityX = ( RANDOM() % 2 ) ? pSpotLight->nVelocityMax : -pSpotLight->nVelocityMax;
- pSpotLight->nVelocityY = ( RANDOM() % 2 ) ? pSpotLight->nVelocityMax : -pSpotLight->nVelocityMax;
-}
-
-
-/* Calculates the position of the spot light on the screen. */
-static void CalcLightPos( SBumps *pBumps )
-{
- SSpotLight *pSpotLight = &pBumps->SpotLight;
- float nGravity;
-
- /* X */
- if( pSpotLight->nXPos < pSpotLight->nFalloffRadius ) nGravity = 1.0f;
- else if( pSpotLight->nXPos > pBumps->iWinWidth - pSpotLight->nFalloffRadius ) nGravity = -1.0f;
- else nGravity = ( ( RANDOM() % 201 ) / 100.0f ) - 1.0f;
-
- pSpotLight->nAccelX += nGravity * ( pSpotLight->nAccelMax / 5.0f );
- if( pSpotLight->nAccelX < -pSpotLight->nAccelMax ) pSpotLight->nAccelX = -pSpotLight->nAccelMax;
- else if( pSpotLight->nAccelX > pSpotLight->nAccelMax ) pSpotLight->nAccelX = pSpotLight->nAccelMax;
-
- pSpotLight->nVelocityX += pSpotLight->nAccelX;
- if( pSpotLight->nVelocityX < -pSpotLight->nVelocityMax ) pSpotLight->nVelocityX = -pSpotLight->nVelocityMax;
- else if( pSpotLight->nVelocityX > pSpotLight->nVelocityMax ) pSpotLight->nVelocityX = pSpotLight->nVelocityMax;
-
- pSpotLight->nXPos += pSpotLight->nVelocityX;
-
- /* Y */
- if( pSpotLight->nYPos < pSpotLight->nFalloffRadius ) nGravity = 1.0f;
- else if( pSpotLight->nYPos > pBumps->iWinHeight - pSpotLight->nFalloffRadius ) nGravity = -1.0f;
- else nGravity = ( ( RANDOM() % 201 ) / 100.0f ) - 1.0f;
-
- pSpotLight->nAccelY += nGravity * ( pSpotLight->nAccelMax / 5.0f );
- if( pSpotLight->nAccelY < -pSpotLight->nAccelMax ) pSpotLight->nAccelY = -pSpotLight->nAccelMax;
- else if( pSpotLight->nAccelY > pSpotLight->nAccelMax ) pSpotLight->nAccelY = pSpotLight->nAccelMax;
-
- pSpotLight->nVelocityY += pSpotLight->nAccelY;
- if( pSpotLight->nVelocityY < -pSpotLight->nVelocityMax ) pSpotLight->nVelocityY = -pSpotLight->nVelocityMax;
- else if( pSpotLight->nVelocityY > pSpotLight->nVelocityMax ) pSpotLight->nVelocityY = pSpotLight->nVelocityMax;
-
- pSpotLight->nYPos += pSpotLight->nVelocityY;
-}
-
-
-/* Main initialization function. */
-static void CreateBumps( SBumps *pBumps, Display *dpy, Window NewWin )
-{
- XWindowAttributes XWinAttribs;
- XGCValues GCValues;
- int32_t nGCFlags;
- uint16_t iDiameter;
-
- /* Make size and velocity a function of window size, so it appears the same at 100x60 as it does in 3200x1200. */
- XGetWindowAttributes( dpy, NewWin, &XWinAttribs );
- pBumps->iWinWidth = XWinAttribs.width;
- pBumps->iWinHeight = XWinAttribs.height;
- pBumps->SpotLight.nXPos = XWinAttribs.width / 2.0f;
- pBumps->SpotLight.nYPos = XWinAttribs.height / 2.0f;
- pBumps->SpotLight.nVelocityMax = ( ( XWinAttribs.width < XWinAttribs.height ) ? XWinAttribs.width : XWinAttribs.height ) / 140.0f;
- pBumps->SpotLight.nAccelMax = pBumps->SpotLight.nVelocityMax / 10.0f;
- pBumps->dpy = dpy;
- pBumps->Win = NewWin;
- pBumps->screen = XWinAttribs.screen;
-
- iDiameter = ( ( pBumps->iWinWidth < pBumps->iWinHeight ) ? pBumps->iWinWidth : pBumps->iWinHeight ) / 2;
-
- /* jwz: sometimes we get tearing if this lands on the wrong bounaary;
- constraining it to be a multiple of 8 seems to fix it. */
- iDiameter = ((iDiameter+7)/8)*8;
-
- pBumps->pXImage = create_xshm_image( pBumps->dpy, XWinAttribs.visual, XWinAttribs.depth,
- ZPixmap, &pBumps->XShmInfo, iDiameter, iDiameter );
-
- /* For speed, access the XImage data directly using my own PutPixel routine. */
- switch( pBumps->pXImage->bits_per_pixel )
- {
- case 32:
- pBumps->bytesPerPixel = 4;
- MyPutPixel = PutPixel32;
- break;
-
- case 24:
- pBumps->bytesPerPixel = 3;
- MyPutPixel = PutPixel24;
- break;
-
- case 16:
- pBumps->bytesPerPixel = 2;
- MyPutPixel = PutPixel16;
- break;
-
- case 8:
- pBumps->bytesPerPixel = 1;
- MyPutPixel = PutPixel8;
- break;
-
- default:
- fprintf( stderr, "%s: Unknown XImage depth.", progname );
- destroy_xshm_image( pBumps->dpy, pBumps->pXImage, &pBumps->XShmInfo );
- exit( 1 );
- }
-
- GCValues.function = GXcopy;
- GCValues.subwindow_mode = IncludeInferiors;
- nGCFlags = GCFunction;
- if( use_subwindow_mode_p( XWinAttribs.screen, pBumps->Win ) ) /* See grabscreen.c */
- nGCFlags |= GCSubwindowMode;
- pBumps->GraphicsContext = XCreateGC( pBumps->dpy, pBumps->Win, nGCFlags, &GCValues );
-
- SetPalette(dpy, pBumps, &XWinAttribs );
- CreateSpotLight( &pBumps->SpotLight, iDiameter, pBumps->nColorCount );
- InitBumpMap(dpy, pBumps, &XWinAttribs );
-}
-
-
-/* Creates a specialized phong shade palette. */
-static void SetPalette(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAttribs )
-{
- XColor BaseColor;
- XColor Color;
- char *sColor; /* Spotlight Color */
- int16_t iColor;
-
- sColor = get_string_resource(dpy, "color", "Color" );
-
- BaseColor.red = RANDOM() % 0xFFFF;
- BaseColor.green = RANDOM() % 0xFFFF;
- BaseColor.blue = RANDOM() % 0xFFFF;
-
- /* Make one color full intesity to avoid dark spotlights. */
- switch( RANDOM() % 3 )
- {
- case 0: BaseColor.red = 0xFFFF; break;
- case 1: BaseColor.green = 0xFFFF; break;
- case 2: BaseColor.blue = 0xFFFF; break;
- }
-
- if( strcasecmp( sColor, "random" ) && !XParseColor( pBumps->dpy, pXWinAttribs->colormap, sColor, &BaseColor ) )
- fprintf( stderr, "%s: color %s not found in database. Choosing random...\n", progname, sColor );
-
-#ifdef VERBOSE
- printf( "%s: Spotlight color is <%d,%d,%d> RGB.\n", progclass, BaseColor.red, BaseColor.green, BaseColor.blue );
-#endif /* VERBOSE */
-
- pBumps->nColorCount = get_integer_resource(dpy, "colorcount", "Integer" );
- if( pBumps->nColorCount < 2 ) pBumps->nColorCount = 2;
- if( pBumps->nColorCount > 128 ) pBumps->nColorCount = 128;
-
- pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
-
- /* Creates a phong shade: / BaseColor \ Index/ColorCount
- * PhongShade = | ------------ | Index + ( 65535 - BaseColor )^
- * \ ColorCount / */
- pBumps->nColorCount--;
- for( iColor=0; iColor<=pBumps->nColorCount; iColor++ )
- {
- Color.red = (uint16_t)( ( ( BaseColor.red / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.red, iColor/(double)pBumps->nColorCount ) );
- Color.green = (uint16_t)( ( ( BaseColor.green / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.green, iColor/(double)pBumps->nColorCount ) );
- Color.blue = (uint16_t)( ( ( BaseColor.blue / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.blue, iColor/(double)pBumps->nColorCount ) );
-
- if( !XAllocColor( pBumps->dpy, pXWinAttribs->colormap, &Color ) )
- {
- XFreeColors( pBumps->dpy, pXWinAttribs->colormap, pBumps->aColors, iColor, 0 );
- free( pBumps->aColors );
- pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
- pBumps->nColorCount--;
- iColor = -1;
- }
- else
- pBumps->aColors[ iColor ] = Color.pixel;
- }
- pBumps->nColorCount++;
-
-#ifdef VERBOSE
- printf( "%s: Allocated %d colors.\n", progclass, pBumps->nColorCount );
-#endif /* VERBOSE */
-
- XSetWindowBackground( pBumps->dpy, pBumps->Win, pBumps->aColors[ 0 ] );
-
- if (sColor) free (sColor);
-}
-
-
-/* Grabs the current contents of the window to use an intensity-based bump map. */
-static void InitBumpMap(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAttribs )
-{
- pBumps->xColors = (XColor*)malloc( pBumps->iWinWidth * sizeof(XColor) );
-
- if (pBumps->source) abort();
- pBumps->source = XCreatePixmap(pBumps->dpy, pBumps->Win,
- pXWinAttribs->width, pXWinAttribs->height,
- pXWinAttribs->depth);
- pBumps->img_loader = load_image_async_simple (0, pXWinAttribs->screen,
- pBumps->Win, pBumps->source, 0, 0);
-}
-
-static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
-{
- XImage *pScreenImage;
- XColor *pColor;
- uint8_t nSoften;
- uint16_t iWidth, iHeight;
- uint32_t nAverager;
- uint16_t *pBump;
- uint16_t maxHeight;
- double softenMultiplier = 1.0f;
- BOOL bInvert = (BOOL)get_boolean_resource(dpy, "invert", "Boolean" );
- XWindowAttributes XWinAttribs;
- XGetWindowAttributes( pBumps->dpy, pBumps->Win, &XWinAttribs );
-
- pBumps->start_time = time ((time_t *) 0);
-
- pScreenImage = XGetImage( pBumps->dpy, pBumps->source, 0, 0,
- pBumps->iWinWidth, pBumps->iWinHeight,
- ~0L, ZPixmap );
-/* XFreePixmap (pBumps->dpy, pBumps->source);
- pBumps->source = 0;*/
-
- XSetWindowBackground( pBumps->dpy, pBumps->Win, pBumps->aColors[ 0 ] );
- XClearWindow (pBumps->dpy, pBumps->Win);
- XSync (pBumps->dpy, 0);
-
- if (pBumps->aBumpMap) free (pBumps->aBumpMap);
- pBumps->aBumpMap = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
-
- nSoften = get_integer_resource(dpy, "soften", "Integer" );
- while( nSoften-- )
- softenMultiplier *= 1.0f + ( 1.0f / 3.0f ); /* Softening takes the max height down, so scale up to compensate. */
- maxHeight = pBumps->SpotLight.nLightRadius * softenMultiplier;
- nAverager = maxHeight ? ( 3 * 0xFFFF ) / maxHeight : 0;
-
- pBump = pBumps->aBumpMap;
- if( bInvert ) /* Funny, it's actually the 'else' that inverts the bump map... */
- {
- for( iHeight=0; iHeight<pBumps->iWinHeight; iHeight++ )
- {
- pColor = pBumps->xColors;
- for( iWidth=0; iWidth<pBumps->iWinWidth; iWidth++ )
- (pColor++)->pixel = XGetPixel( pScreenImage, iWidth, iHeight );
-
- XQueryColors( pBumps->dpy, XWinAttribs.colormap, pBumps->xColors, pBumps->iWinWidth );
-
- pColor = pBumps->xColors;
- for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pColor, ++pBump )
- *pBump = ( nAverager ? ( pColor->red + pColor->green + pColor->blue ) / nAverager : 0 );
- }
- }
- else
- {
- for( iHeight=0; iHeight<pBumps->iWinHeight; iHeight++ )
- {
- pColor = pBumps->xColors;
- for( iWidth=0; iWidth<pBumps->iWinWidth; iWidth++ )
- (pColor++)->pixel = XGetPixel( pScreenImage, iWidth, iHeight );
-
- XQueryColors( pBumps->dpy, XWinAttribs.colormap, pBumps->xColors, pBumps->iWinWidth );
-
- pColor = pBumps->xColors;
- for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pColor, ++pBump )
- *pBump = ( maxHeight - ( nAverager ? ( pColor->red + pColor->green + pColor->blue ) / nAverager : 0 ) );
- }
- }
-
- XDestroyImage( pScreenImage );
-
- nSoften = get_integer_resource(dpy, "soften", "Integer" );
-#ifdef VERBOSE
- if( nSoften ) printf( "%s: Softening Bump Map %d time(s)...\n", progclass, nSoften );
-#endif
- while( nSoften-- )
- SoftenBumpMap( pBumps );
-
-/* free( pBumps->xColors );
- pBumps->xColors = 0;*/
-}
-
-/* Soften the bump map. This is to avoid pixelated-looking ridges.
- * |-----|-----|-----|
- * | 0% |12.5%| 0% | The adjacent pixels are averaged together
- * |-----|-----|-----| first. Then than value is averaged with
- * |12.5%| 50% |12.5%| the pixel is question. This essentially weights
- * |-----|-----|-----| each pixel as shown on the left.
- * | 0% |12.5%| 0% |
- * |-----|-----|-----|
- */
-static void SoftenBumpMap( SBumps *pBumps )
-{
- uint16_t *pOffset, *pTOffset;
- uint32_t nHeight;
- uint32_t iWidth, iHeight;
- uint16_t *aTempBuffer = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
-
- pOffset = pBumps->aBumpMap;
- pTOffset = aTempBuffer;
- for( iHeight=pBumps->iWinHeight; iHeight; --iHeight )
- {
- for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pOffset, ++pTOffset )
- {
- if( iHeight==pBumps->iWinHeight || iHeight==1 ||
- iWidth==pBumps->iWinWidth || iWidth==1 )
- {
- *pTOffset = 0;
- continue;
- }
-
- nHeight = pOffset[ -pBumps->iWinWidth ];
- nHeight += pOffset[ 1 ];
- nHeight += pOffset[ pBumps->iWinWidth ];
- nHeight += pOffset[ -1 ];
- nHeight >>= 2;
- nHeight += pOffset[ 0 ];
- nHeight >>= 1;
- *pTOffset = nHeight;
- }
- }
-
- memcpy( pBumps->aBumpMap, aTempBuffer, pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
- free( aTempBuffer );
-}
-
-
-/* This is where we slap down some pixels... */
-static void Execute( SBumps *pBumps )
-{
- int32_t nLightXPos, nLightYPos;
- int32_t iScreenX, iScreenY;
- int32_t iLightX, iLightY;
- uint16_t *pBOffset;
- int8_t *pDOffset;
- int32_t nX, nY;
- uint16_t nColor;
- int32_t nLightOffsetFar = pBumps->SpotLight.nFalloffDiameter - pBumps->SpotLight.nLightRadius;
-
- CalcLightPos( pBumps );
-
- /* Offset to upper left hand corner. */
- nLightXPos = pBumps->SpotLight.nXPos - pBumps->SpotLight.nFalloffRadius;
- nLightYPos = pBumps->SpotLight.nYPos - pBumps->SpotLight.nFalloffRadius;
-
- for( iScreenY=nLightYPos, iLightY=-pBumps->SpotLight.nLightRadius; iLightY<nLightOffsetFar; ++iScreenY, ++iLightY )
- {
- if( iScreenY < 0 ) continue;
- else if( iScreenY >= pBumps->iWinHeight ) break;
-
- /* warning: pointer targets in assignment differ in signedness
- Should pDOffset be a int8? I can't tell. -jwz, 22-Jul-2003 */
- pDOffset = (int8_t *) &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
- pBOffset = pBumps->aBumpMap + ( iScreenY * pBumps->iWinWidth ) + nLightXPos;
- for( iScreenX=nLightXPos, iLightX=-pBumps->SpotLight.nLightRadius; iLightX<nLightOffsetFar; ++iScreenX, ++iLightX, ++pBOffset, pDOffset+=pBumps->bytesPerPixel )
- {
- if( iScreenX < 0 ) continue;
- else if( iScreenX >= pBumps->iWinWidth ) break;
- else if( iScreenY == 0 || iScreenY >= pBumps->iWinHeight-2 ||
- iScreenX == 0 || iScreenX >= pBumps->iWinWidth-2 )
- {
- MyPutPixel( pDOffset, pBumps->aColors[ 0 ] );
- continue;
- }
-
- /* That's right folks, all the magic of bump mapping occurs in these two lines. (kinda disappointing, isn't it?) */
- nX = ( pBOffset[ 1 ] - pBOffset[ 0 ] ) + iLightX;
- nY = ( pBOffset[ pBumps->iWinWidth ] - pBOffset[ 0 ] ) + iLightY;
-
- if( nX<0 || nX>=pBumps->SpotLight.nLightDiameter
- || nY<0 || nY>=pBumps->SpotLight.nLightDiameter )
- {
- MyPutPixel( pDOffset, pBumps->aColors[ 0 ] );
- continue;
- }
-
- nColor = pBumps->SpotLight.aLightMap[ ( nY * pBumps->SpotLight.nLightDiameter ) + nX ];
- MyPutPixel( pDOffset, pBumps->aColors[ nColor ] );
- }
- }
-
- /* Allow the spotlight to go *slightly* off the screen by clipping the XImage. */
- iLightX = iLightY = 0; /* Use these for XImages X and Y now. */
- nX = nY = pBumps->SpotLight.nFalloffDiameter; /* Use these for XImage width and height now. */
- if( nLightXPos < 0 )
- {
- iLightX = -nLightXPos;
- nX -= iLightX;
- nLightXPos = 0;
- }
- else if( nLightXPos + nX >= pBumps->iWinWidth )
- {
- nX -= ( nLightXPos + nX ) - pBumps->iWinWidth;
- }
-
- if( nLightYPos < 0 )
- {
- iLightY = -nLightYPos;
- nY -= iLightY;
- nLightYPos = 0;
- }
- else if( nLightYPos + nY >= pBumps->iWinHeight )
- {
- nY -= ( nLightYPos + nY ) - pBumps->iWinHeight;
- }
-
- put_xshm_image( pBumps->dpy, pBumps->Win, pBumps->GraphicsContext, pBumps->pXImage, iLightX, iLightY, nLightXPos, nLightYPos,
- nX, nY, &pBumps->XShmInfo);
-}
-
-
-static void DestroySpotLight( SSpotLight *pSpotLight ) { free( pSpotLight->aLightMap ); }
-
-/* Clean up */
-static void DestroyBumps( SBumps *pBumps )
-{
- DestroySpotLight( &pBumps->SpotLight );
- free (pBumps->xColors);
- free( pBumps->aColors );
- free( pBumps->aBumpMap );
- destroy_xshm_image( pBumps->dpy, pBumps->pXImage, &pBumps->XShmInfo );
- XFreeGC (pBumps->dpy, pBumps->GraphicsContext);
- free(pBumps);
-}
-
-
-/* All messages to the screensaver are processed here. */
-static void *
-bumps_init (Display *dpy, Window Win)
-{
- SBumps *Bumps = (SBumps *) calloc (1, sizeof(SBumps));
-
-#ifdef VERBOSE
- time_t Time = time( NULL );
- uint16_t iFrame = 0;
-#endif /* VERBOSE */
-
- CreateBumps( Bumps, dpy, Win );
- Bumps->delay = get_integer_resource(dpy, "delay", "Integer" );
- Bumps->duration = get_integer_resource (dpy, "duration", "Seconds");
- if (Bumps->delay < 0) Bumps->delay = 0;
- if (Bumps->duration < 1) Bumps->duration = 1;
- Bumps->start_time = time ((time_t *) 0);
- return Bumps;
-}
-
-static unsigned long
-bumps_draw (Display *dpy, Window window, void *closure)
-{
- SBumps *Bumps = (SBumps *) closure;
-
- if (Bumps->img_loader) /* still loading */
- {
- Bumps->img_loader = load_image_async_simple (Bumps->img_loader, 0, 0, 0, 0, 0);
- if (! Bumps->img_loader) /* just finished */
- InitBumpMap_2(dpy, Bumps);
- return Bumps->delay;
- }
-
- if (!Bumps->img_loader &&
- Bumps->start_time + Bumps->duration < time ((time_t *) 0)) {
- Bumps->img_loader = load_image_async_simple (0, Bumps->screen,
- Bumps->Win, Bumps->source,
- 0, 0);
- }
-
- Execute( Bumps );
-
-#ifdef VERBOSE
- iFrame++;
- if( Time - time( NULL ) )
- {
- printf( "FPS: %d\n", iFrame );
- Time = time( NULL );
- iFrame = 0;
- }
-#endif /* VERBOSE */
-
- return Bumps->delay;
-}
-
-static void
-bumps_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static Bool
-bumps_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- SBumps *Bumps = (SBumps *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- Bumps->start_time = 0;
- return True;
- }
-
- return False;
-}
-
-static void
-bumps_free (Display *dpy, Window window, void *closure)
-{
- SBumps *Bumps = (SBumps *) closure;
- DestroyBumps( Bumps );
-}
-
-
-XSCREENSAVER_MODULE ("Bumps", bumps)
-
-/* vim: ts=4
- */
diff --git a/hacks/bumps.man b/hacks/bumps.man
deleted file mode 100644
index 717c1c3..0000000
--- a/hacks/bumps.man
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
-.SH NAME
-bumps \- move distorting spotlight around desktop
-.SH SYNOPSIS
-.B bumps
-[\-display \fIhost:display.screen\fP]
-[\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP]
-[\-window]
-[\-root]
-[\-mono]
-[\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-duration \fIsecs\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIbumps\fP program takes an image and exposes small, distorted
-sections of it as if through an odd wandering spotlight beam.
-
-The image that it manipulates will be grabbed from the portion of
-the screen underlying the window, or from the system's video input,
-or from a random file on disk, as indicated by
-the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
-and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
-file; see
-.BR xscreensaver\-settings (1)
-for more details.
-.SH OPTIONS
-.I bumps
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Slow it down.
-.TP 8
-.B \-duration \fIseconds\fP
-How long to run before loading a new image. Default 120 seconds.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 1999 by Shane Smit. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH CREDITS
-Shane Smit <blackend@inconnect.com>, 8-Oct-1999.
diff --git a/hacks/ccurve.c b/hacks/ccurve.c
deleted file mode 100644
index 874ada8..0000000
--- a/hacks/ccurve.c
+++ /dev/null
@@ -1,871 +0,0 @@
-/* ccurve, Copyright (c) 1998, 1999
- * Rick Campbell <rick@campbellcentral.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- */
-
-/* Draw self-similar linear fractals including the classic ``C Curve''
- *
- * 16 Aug 1999 Rick Campbell <rick@campbellcentral.org>
- * Eliminated sub-windows-with-backing-store-double-buffering crap in
- * favor of drawing the new image in a pixmap and then splatting that on
- * the window.
- *
- * 19 Dec 1998 Rick Campbell <rick@campbellcentral.org>
- * Original version.
- */
-
-#include <assert.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "screenhack.h"
-#include "colors.h"
-#include "erase.h"
-
-#define SQRT3 (1.73205080756887729353)
-#define MAXIMUM_COLOR_COUNT (256)
-#define EPSILON (1e-5)
-
-typedef struct Position_struct
-{
- double x;
- double y;
-}
-Position;
-
-typedef struct Segment_struct
-{
- double angle;
- double length;
-}
-Segment;
-
-struct state {
- Display *dpy;
- Window window;
-
- int color_count;
- int color_index;
- Colormap color_map;
- XColor colors [MAXIMUM_COLOR_COUNT];
- int line_count;
- int maximum_lines;
- double plot_maximum_x;
- double plot_maximum_y;
- double plot_minimum_x;
- double plot_minimum_y;
- int total_lines;
-
- unsigned long int background;
- GC context;
- Pixmap pixmap;
- int width;
- int height;
- float delay;
- float delay2;
-
- int draw_index;
-
- int draw_iterations;
- double draw_maximum_x;
- double draw_maximum_y;
- double draw_minimum_x;
- double draw_minimum_y;
- int draw_segment_count;
- Segment* draw_segments;
- double draw_x1;
- double draw_y1;
- double draw_x2;
- double draw_y2;
-};
-
-
-
-
-/* normalize alters the sequence to go from (0,0) to (1,0) */
-static void
-normalized_plot (int segment_count,
- Segment* segments,
- Position* points)
-{
- double angle = 0.0;
- double cosine = 0.0;
- int index = 0;
- double length = 0.0;
- double sine = 0.0;
- double x = 0.0;
- double y = 0.0;
-
- for (index = 0; index < segment_count; ++index)
- {
- Segment* segment = segments + index;
- double length = segment->length;
- double angle = segment->angle;
-
- x += length * cos (angle);
- y += length * sin (angle);
- points [index].x = x;
- points [index].y = y;
- }
- angle = -(atan2 (y, x));
- cosine = cos (angle);
- sine = sin (angle);
- length = sqrt ((x * x) + (y * y));
- /* rotate and scale */
- for (index = 0; index < segment_count; ++index)
- {
- double temp_x = points [index].x;
- double temp_y = points [index].y;
- points [index].x = ((temp_x * cosine) + (temp_y * (-sine))) / length;
- points [index].y = ((temp_x * sine) + (temp_y * cosine)) / length;
- }
-}
-
-static void
-copy_points (int segment_count,
- Position* source,
- Position* target)
-{
- int index = 0;
-
- for (index = 0; index < segment_count; ++index)
- {
- target [index] = source [index];
- }
-}
-
-static void
-realign (double x1,
- double y1,
- double x2,
- double y2,
- int segment_count,
- Position* points)
-{
- double angle = 0.0;
- double cosine = 0.0;
- double delta_x = 0.0;
- double delta_y = 0.0;
- int index = 0;
- double length = 0.0;
- double sine = 0.0;
-
- delta_x = x2 - x1;
- delta_y = y2 - y1;
- angle = atan2 (delta_y, delta_x);
- cosine = cos (angle);
- sine = sin (angle);
- length = sqrt ((delta_x * delta_x) + (delta_y * delta_y));
- /* rotate, scale, then shift */
- for (index = 0; index < segment_count; ++index)
- {
- double temp_x = points [index].x;
- double temp_y = points [index].y;
- points [index].x
- = (length * ((temp_x * cosine) + (temp_y * (-sine)))) + x1;
- points [index].y
- = (length * ((temp_x * sine) + (temp_y * cosine))) + y1;
- }
-}
-
-static Bool
-self_similar_normalized (struct state *st,
- int iterations,
- double x1,
- double y1,
- double x2,
- double y2,
- double maximum_x,
- double maximum_y,
- double minimum_x,
- double minimum_y,
- int segment_count,
- Position* points)
-{
- if (iterations == 0)
- {
- double delta_x = maximum_x - minimum_x;
- double delta_y = maximum_y - minimum_y;
- st->color_index = (int)(((double)(st->line_count * st->color_count))
- / ((double)st->total_lines));
- ++st->line_count;
- XSetForeground (st->dpy, st->context, st->colors [st->color_index].pixel);
- if (st->plot_maximum_x < x1) st->plot_maximum_x = x1;
- if (st->plot_maximum_x < x2) st->plot_maximum_x = x2;
- if (st->plot_maximum_y < y1) st->plot_maximum_y = y1;
- if (st->plot_maximum_y < y2) st->plot_maximum_y = y2;
- if (st->plot_minimum_x > x1) st->plot_minimum_x = x1;
- if (st->plot_minimum_x > x2) st->plot_minimum_x = x2;
- if (st->plot_minimum_y > y1) st->plot_minimum_y = y1;
- if (st->plot_minimum_y > y2) st->plot_minimum_y = y2;
- XDrawLine (st->dpy, st->pixmap, st->context,
- (int)(((x1 - minimum_x) / delta_x) * st->width),
- (int)(((maximum_y - y1) / delta_y) * st->height),
- (int)(((x2 - minimum_x) / delta_x) * st->width),
- (int)(((maximum_y - y2) / delta_y) * st->height));
- }
- else
- {
- int index = 0;
- double next_x = 0.0;
- double next_y = 0.0;
- Position* replacement = (Position*)NULL;
- double x = 0.0;
- double y = 0.0;
-
- replacement = (Position*)(malloc (segment_count * sizeof (*replacement)));
- copy_points (segment_count, points, replacement);
- assert (fabs ((replacement [segment_count - 1].x) - 1.0) < EPSILON);
- assert (fabs (replacement [segment_count - 1].y) < EPSILON);
- realign (x1, y1, x2, y2, segment_count, replacement);
- /* jwz: I don't understand what these assertions are supposed to
- be detecting, but let's just bail on the fractal instead of
- crashing. */
-/* assert (fabs (x2 - (replacement [segment_count - 1].x)) < EPSILON);
- assert (fabs (y2 - (replacement [segment_count - 1].y)) < EPSILON);*/
- if (fabs (x2 - (replacement [segment_count - 1].x)) >= EPSILON ||
- fabs (y2 - (replacement [segment_count - 1].y)) >= EPSILON) {
- free (replacement);
- return False;
- }
- x = x1;
- y = y1;
- for (index = 0; index < segment_count; ++index)
- {
- next_x = replacement [index].x;
- next_y = replacement [index].y;
- if (!self_similar_normalized (st,
- iterations - 1, x, y, next_x, next_y,
- maximum_x, maximum_y,
- minimum_x, minimum_y,
- segment_count, points)) {
- free(replacement);
- return False;
- }
- x = next_x;
- y = next_y;
- }
- free(replacement);
- }
- return True;
-}
-
-static void
-self_similar (struct state *st,
- Pixmap pixmap,
- GC context,
- int width,
- int height,
- int iterations,
- double x1,
- double y1,
- double x2,
- double y2,
- double maximum_x,
- double maximum_y,
- double minimum_x,
- double minimum_y,
- int segment_count,
- Segment* segments)
-{
- Position* points = (Position*)NULL;
-
- points = (Position*)(malloc (segment_count * sizeof (Position)));
- normalized_plot (segment_count, segments, points);
- assert (fabs ((points [segment_count - 1].x) - 1.0) < EPSILON);
- assert (fabs (points [segment_count - 1].y) < EPSILON);
- self_similar_normalized (st, iterations,
- x1, y1, x2, y2,
- maximum_x, maximum_y,
- minimum_x, minimum_y,
- segment_count, points);
- free((void*)points);
-}
-
-static
-double
-random_double (double base,
- double limit,
- double epsilon)
-{
- double range = 0.0;
- unsigned int steps = 0;
-
- assert (base < limit);
- assert (epsilon > 0.0);
- range = limit - base;
- steps = (unsigned int)(floor (range / epsilon));
- return base + ((random () % steps) * epsilon);
-}
-
-static void
-select_2_pattern (Segment* segments)
-{
- if ((random () % 2) == 0)
- {
- if ((random () % 2) == 0)
- {
- segments [0].angle = -M_PI_4;
- segments [0].length = M_SQRT2;
- segments [1].angle = M_PI_4;
- segments [1].length = M_SQRT2;
- }
- else
- {
- segments [0].angle = M_PI_4;
- segments [0].length = M_SQRT2;
- segments [1].angle = -M_PI_4;
- segments [1].length = M_SQRT2;
- }
- }
- else
- {
- segments [0].angle
- = random_double (M_PI / 6.0, M_PI / 3.0, M_PI / 180.0);
- segments [0].length = random_double (0.25, 0.67, 0.001);
- if ((random () % 2) == 0)
- {
- segments [1].angle = -(segments [0].angle);
- segments [1].length = segments [0].length;
- }
- else
- {
- segments [1].angle = random_double ((-M_PI) / 3.0,
- (-M_PI) / 6.0,
- M_PI / 180.0);
- segments [1].length = random_double (0.25, 0.67, 0.001);
- }
- }
-}
-
-static void
-select_3_pattern (Segment* segments)
-{
- switch (random () % 5)
- {
- case 0:
- if ((random () % 2) == 0)
- {
- segments [0].angle = M_PI_4;
- segments [0].length = M_SQRT2 / 4.0;
- segments [1].angle = -M_PI_4;
- segments [1].length = M_SQRT2 / 2.0;
- segments [2].angle = M_PI_4;
- segments [2].length = M_SQRT2 / 4.0;
- }
- else
- {
- segments [0].angle = -M_PI_4;
- segments [0].length = M_SQRT2 / 4.0;
- segments [1].angle = M_PI_4;
- segments [1].length = M_SQRT2 / 2.0;
- segments [2].angle = -M_PI_4;
- segments [2].length = M_SQRT2 / 4.0;
- }
- break;
- case 1:
- if ((random () % 2) == 0)
- {
- segments [0].angle = M_PI / 6.0;
- segments [0].length = 1.0;
- segments [1].angle = -M_PI_2;
- segments [1].length = 1.0;
- segments [2].angle = M_PI / 6.0;
- segments [2].length = 1.0;
- }
- else
- {
- segments [0].angle = -M_PI / 6.0;
- segments [0].length = 1.0;
- segments [1].angle = M_PI_2;
- segments [1].length = 1.0;
- segments [2].angle = -M_PI / 6.0;
- segments [2].length = 1.0;
- }
- break;
- case 2:
- case 3:
- case 4:
- segments [0].angle
- = random_double (M_PI / 6.0, M_PI / 3.0, M_PI / 180.0);
- segments [0].length = random_double (0.25, 0.67, 0.001);
- segments [1].angle
- = random_double (-M_PI / 3.0, -M_PI / 6.0, M_PI / 180.0);
- segments [1].length = random_double (0.25, 0.67, 0.001);
- if ((random () % 3) == 0)
- {
- if ((random () % 2) == 0)
- {
- segments [2].angle = segments [0].angle;
- }
- else
- {
- segments [2].angle = -(segments [0].angle);
- }
- segments [2].length = segments [0].length;
- }
- else
- {
- segments [2].angle
- = random_double (-M_PI / 3.0, -M_PI / 6.0, M_PI / 180.0);
- segments [2].length = random_double (0.25, 0.67, 0.001);
- }
- break;
- }
-}
-
-static void
-select_4_pattern (Segment* segments)
-{
- switch (random () % 9)
- {
- case 0:
- if ((random () % 2) == 0)
- {
- double length = random_double (0.25, 0.50, 0.001);
-
- segments [0].angle = 0.0;
- segments [0].length = 0.5;
- segments [1].angle = M_PI_2;
- segments [1].length = length;
- segments [2].angle = -M_PI_2;
- segments [2].length = length;
- segments [3].angle = 0.0;
- segments [3].length = 0.5;
- }
- else
- {
- double length = random_double (0.25, 0.50, 0.001);
-
- segments [0].angle = 0.0;
- segments [0].length = 0.5;
- segments [1].angle = -M_PI_2;
- segments [1].length = length;
- segments [2].angle = M_PI_2;
- segments [2].length = length;
- segments [3].angle = 0.0;
- segments [3].length = 0.5;
- }
- break;
- case 1:
- if ((random () % 2) == 0)
- {
- segments [0].angle = 0.0;
- segments [0].length = 0.5;
- segments [1].angle = M_PI_2;
- segments [1].length = 0.45;
- segments [2].angle = -M_PI_2;
- segments [2].length = 0.45;
- segments [3].angle = 0.0;
- segments [3].length = 0.5;
- }
- else
- {
- segments [0].angle = 0.0;
- segments [0].length = 0.5;
- segments [1].angle = -M_PI_2;
- segments [1].length = 0.45;
- segments [2].angle = M_PI_2;
- segments [2].length = 0.45;
- segments [3].angle = 0.0;
- segments [3].length = 0.5;
- }
- break;
- case 2:
- if ((random () % 2) == 0)
- {
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = (5.0 * M_PI) / 12.0;
- segments [1].length = 1.2;
- segments [2].angle = (-5.0 * M_PI) / 12.0;
- segments [2].length = 1.2;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- else
- {
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = (-5.0 * M_PI) / 12.0;
- segments [1].length = 1.2;
- segments [2].angle = (5.0 * M_PI) / 12.0;
- segments [2].length = 1.2;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- break;
- case 3:
- if ((random () % 2) == 0)
- {
- double angle
- = random_double (M_PI / 4.0,
- M_PI_2,
- M_PI / 180.0);
-
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = angle;
- segments [1].length = 1.2;
- segments [2].angle = (-angle);
- segments [2].length = 1.2;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- else
- {
- double angle
- = random_double (M_PI / 4.0,
- M_PI_2,
- M_PI / 180.0);
-
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = (-angle);
- segments [1].length = 1.2;
- segments [2].angle = angle;
- segments [2].length = 1.2;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- break;
- case 4:
- if ((random () % 2) == 0)
- {
- double angle
- = random_double (M_PI / 4.0,
- M_PI_2,
- M_PI / 180.0);
-
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = angle;
- segments [1].length = 1.2;
- segments [2].angle = (-angle);
- segments [2].length = 1.2;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- else
- {
- double angle
- = random_double (M_PI / 4.0,
- M_PI_2,
- M_PI / 180.0);
-
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = (-angle);
- segments [1].length = 1.2;
- segments [2].angle = angle;
- segments [2].length = 1.2;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- break;
- case 5:
- if ((random () % 2) == 0)
- {
- double angle
- = random_double (M_PI / 4.0,
- M_PI_2,
- M_PI / 180.0);
- double length = random_double (0.25, 0.50, 0.001);
-
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = angle;
- segments [1].length = length;
- segments [2].angle = (-angle);
- segments [2].length = length;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- else
- {
- double angle
- = random_double (M_PI / 4.0,
- M_PI_2,
- M_PI / 180.0);
- double length = random_double (0.25, 0.50, 0.001);
-
- segments [0].angle = 0.0;
- segments [0].length = 1.0;
- segments [1].angle = (-angle);
- segments [1].length = length;
- segments [2].angle = angle;
- segments [2].length = length;
- segments [3].angle = 0.0;
- segments [3].length = 1.0;
- }
- break;
- case 6:
- case 7:
- case 8:
- segments [0].angle
- = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
- segments [0].length = random_double (0.25, 0.50, 0.001);
- segments [1].angle
- = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
- segments [1].length = random_double (0.25, 0.50, 0.001);
- if ((random () % 3) == 0)
- {
- segments [2].angle
- = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
- segments [2].length = random_double (0.25, 0.50, 0.001);
- segments [3].angle
- = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
- segments [3].length = random_double (0.25, 0.50, 0.001);
- }
- else
- {
- if ((random () % 2) == 0)
- {
- segments [2].angle = -(segments [1].angle);
- segments [2].length = segments [1].length;
- segments [3].angle = -(segments [0].angle);
- segments [3].length = segments [0].length;
- }
- else
- {
- segments [2].angle = segments [1].angle;
- segments [2].length = segments [1].length;
- segments [3].angle = segments [0].angle;
- segments [3].length = segments [0].length;
- }
- }
- break;
- }
-}
-
-static void
-select_pattern (int segment_count,
- Segment* segments)
-{
- switch (segment_count)
- {
- case 2:
- select_2_pattern (segments);
- break;
- case 3:
- select_3_pattern (segments);
- break;
- case 4:
- select_4_pattern (segments);
- break;
- default:
- fprintf (stderr, "\nBad segment count, must be 2, 3, or 4.\n");
- exit (1);
- }
-}
-
-#define Y_START (0.5)
-
-static void *
-ccurve_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- unsigned long int black = 0;
- int depth = 0;
- XWindowAttributes hack_attributes;
- XGCValues values;
- unsigned long int white = 0;
-
- st->dpy = dpy;
- st->window = window;
-
- st->delay = get_float_resource (st->dpy, "delay", "Integer");
- st->delay2 = get_float_resource (st->dpy, "pause", "Integer");
- st->maximum_lines = get_integer_resource (st->dpy, "limit", "Integer");
- black = BlackPixel (st->dpy, DefaultScreen (st->dpy));
- white = WhitePixel (st->dpy, DefaultScreen (st->dpy));
- st->background = black;
- XGetWindowAttributes (st->dpy, st->window, &hack_attributes);
- st->width = hack_attributes.width;
- st->height = hack_attributes.height;
- depth = hack_attributes.depth;
- st->color_map = hack_attributes.colormap;
- st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height, depth);
- values.foreground = white;
- values.background = black;
- st->context = XCreateGC (st->dpy, st->window, GCForeground | GCBackground,
- &values);
- st->color_count = MAXIMUM_COLOR_COUNT;
- make_color_loop (hack_attributes.screen, hack_attributes.visual,
- st->color_map,
- 0, 1, 1,
- 120, 1, 1,
- 240, 1, 1,
- st->colors, &st->color_count, True, False);
- if (st->color_count <= 0)
- {
- st->color_count = 1;
- st->colors [0].red = st->colors [0].green = st->colors [0].blue = 0xFFFF;
- XAllocColor (st->dpy, st->color_map, &st->colors [0]);
- }
-
- st->draw_maximum_x = 1.20;
- st->draw_maximum_y = 0.525;
- st->draw_minimum_x = -0.20;
- st->draw_minimum_y = -0.525;
- st->draw_x2 = 1.0;
-
- return st;
-}
-
-static unsigned long
-ccurve_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- static const int lengths [] = { 4, 4, 4, 4, 4, 3, 3, 3, 2 };
-
- if (st->draw_index == 0)
- {
- st->draw_segment_count
- = lengths [random () % (sizeof (lengths) / sizeof (int))];
- if (st->draw_segments) free (st->draw_segments);
- st->draw_segments
- = (Segment*)(malloc ((st->draw_segment_count) * sizeof (Segment)));
- select_pattern (st->draw_segment_count, st->draw_segments);
- st->draw_iterations = floor (log (st->maximum_lines)
- / log (((double)(st->draw_segment_count))));
- if ((random () % 3) != 0)
- {
- double factor = 0.45;
- st->draw_x1 += random_double (-factor, factor, 0.001);
- st->draw_y1 += random_double (-factor, factor, 0.001);
- st->draw_x2 += random_double (-factor, factor, 0.001);
- st->draw_y2 += random_double (-factor, factor, 0.001);
- }
-/* background = (random () % 2) ? black : white; */
-
- }
-
- /* for (st->draw_index = 0; st->draw_index < st->draw_iterations; ++st->draw_index) */
- {
- double delta_x = 0.0;
- double delta_y = 0.0;
-
- XSetForeground (st->dpy, st->context, st->background);
- XFillRectangle (st->dpy, st->pixmap, st->context, 0, 0, st->width, st->height);
- st->line_count = 0;
- st->total_lines = (int)(pow ((double)(st->draw_segment_count),
- (double)st->draw_index));
- st->plot_maximum_x = -1000.00;
- st->plot_maximum_y = -1000.00;
- st->plot_minimum_x = 1000.00;
- st->plot_minimum_y = 1000.00;
- self_similar (st, st->pixmap, st->context, st->width, st->height, st->draw_index,
- st->draw_x1, st->draw_y1, st->draw_x2, st->draw_y2,
- st->draw_maximum_x,
- st->draw_maximum_y,
- st->draw_minimum_x,
- st->draw_minimum_y,
- st->draw_segment_count, st->draw_segments);
- delta_x = st->plot_maximum_x - st->plot_minimum_x;
- delta_y = st->plot_maximum_y - st->plot_minimum_y;
- st->draw_maximum_x = st->plot_maximum_x + (delta_x * 0.2);
- st->draw_maximum_y = st->plot_maximum_y + (delta_y * 0.2);
- st->draw_minimum_x = st->plot_minimum_x - (delta_x * 0.2);
- st->draw_minimum_y = st->plot_minimum_y - (delta_y * 0.2);
- delta_x = st->draw_maximum_x - st->draw_minimum_x;
- delta_y = st->draw_maximum_y - st->draw_minimum_y;
- if ((delta_y / delta_x) > (((double)st->height) / ((double)st->width)))
- {
- double new_delta_x
- = (delta_y * ((double)st->width)) / ((double)st->height);
- st->draw_minimum_x -= (new_delta_x - delta_x) / 2.0;
- st->draw_maximum_x += (new_delta_x - delta_x) / 2.0;
- }
- else
- {
- double new_delta_y
- = (delta_x * ((double)st->height)) / ((double)st->width);
- st->draw_minimum_y -= (new_delta_y - delta_y) / 2.0;
- st->draw_maximum_y += (new_delta_y - delta_y) / 2.0;
- }
- XCopyArea (st->dpy, st->pixmap, st->window, st->context, 0, 0, st->width, st->height,
- 0, 0);
- }
- st->draw_index++;
- /* #### mi->recursion_depth = st->draw_index; */
-
- if (st->draw_index >= st->draw_iterations)
- {
- st->draw_index = 0;
- free((void*)st->draw_segments);
- st->draw_segments = 0;
- return (int) (1000000 * st->delay);
- }
- else
- return (int) (1000000 * st->delay2);
-}
-
-static void
-ccurve_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XWindowAttributes xgwa;
- st->width = w;
- st->height = h;
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- XFreePixmap (dpy, st->pixmap);
- st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height,
- xgwa.depth);
-}
-
-static Bool
-ccurve_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->draw_index = 0;
- return True;
- }
- return False;
-}
-
-static void
-ccurve_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->context);
- if (st->draw_segments) free (st->draw_segments);
- free (st);
-}
-
-
-static const char *ccurve_defaults [] =
-{
- ".background: black",
- ".foreground: white",
- ".delay: 3",
- ".pause: 0.4",
- ".limit: 200000",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec ccurve_options [] =
-{
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-pause", ".pause", XrmoptionSepArg, 0 },
- { "-limit", ".limit", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("CCurve", ccurve)
diff --git a/hacks/ccurve.man b/hacks/ccurve.man
deleted file mode 100644
index d2b8ae8..0000000
--- a/hacks/ccurve.man
+++ /dev/null
@@ -1,60 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-ccurve \- self-similar linear fractals.
-.SH SYNOPSIS
-.B ccurve
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-pause \fInumber\fP]
-[\-limit \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Generates self-similar linear fractals, including the classic ``C Curve.''
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Delay. 0 - 60. Default: 1.
-.TP 8
-.B \-pause \fInumber\fP
-Duration. 1 - 60. Default: 3.
-.TP 8
-.B \-limit \fInumber\fP
-Density. 3 - 300000. Default: 200000.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Rick Campbell. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Rick Campbell.
diff --git a/hacks/celtic.c b/hacks/celtic.c
deleted file mode 100644
index 232adb6..0000000
--- a/hacks/celtic.c
+++ /dev/null
@@ -1,1140 +0,0 @@
-/* celtic, Copyright (c) 2006 Max Froumentin <max@lapin-bleu.net>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * A celtic pattern programme inspired by "Les Entrelacs Celtes", by
- * Christian Mercat, Dossier Pour La Science, no. 47, april/june 2005.
- * See <http://www.entrelacs.net/>
- */
-
-#include <math.h>
-#include "screenhack.h"
-#include "erase.h"
-
-#define SQRT_3 1.73205080756887729352
-#undef assert
-#define assert(EXP) do { if (!((EXP))) abort(); } while(0)
-
-/*-----------------------------------------*/
-
-struct params {
- unsigned long curve_width, shadow_width;
- double shape1, shape2;
- unsigned long margin;
-
- enum graph_type { polar, tgrid, kennicott, triangle } type;
- unsigned long edge_size;
- unsigned long cluster_size; /* only used if type is kennicott */
- unsigned long delay; /* controls curve drawing speed (step delay
- * in microsecs) */
- unsigned long nsteps; /* only if triangle: number of subdivisions along the side */
- unsigned long nb_orbits; /* only used if type is polar */
- unsigned long nb_nodes_per_orbit; /* only used if type is polar */
-
- double angle; /* angle of rotation of the graph around the centre */
-};
-
-/*-----------------------------------------*/
-typedef enum direction {
- CLOCKWISE=0, ANTICLOCKWISE=1
-} Direction;
-
-
-/*-----------------------------------------*/
-typedef struct array {
- int nb_elements;
- int nb_allocated_elements;
- int increment;
- void **elements;
-} *Array;
-
-typedef struct graph {
- Array nodes;
- Array edges;
-} *Graph;
-
-typedef struct edge_couple {
- int **array;
- int size;
-} *EdgeCouple;
-
-typedef struct pattern {
- double shape1, shape2;
- EdgeCouple ec;
- Graph graph;
- Array splines;
- int ncolors;
-} *Pattern;
-
-struct state {
- Display *dpy;
- Window window;
- eraser_state *eraser;
-
- int ncolors;
- XColor *colors;
- GC gc,shadow_gc,gc_graph;
-
- Bool showGraph;
- Pattern pattern;
- Graph graph;
- XWindowAttributes xgwa;
- int delay2;
- int reset, force_reset;
- double t;
-
- struct params params;
-};
-
-
-
-
-static Array array_new(int increment)
-{
- Array new;
- assert(new=(Array)calloc(1,sizeof(struct array)));
- new->nb_elements=0;
- new->nb_allocated_elements=0;
- new->increment=increment;
- return new;
-}
-
-static void array_del(Array a, void (*free_element)(void*))
-{
- int i;
- if (free_element)
- for (i=0;i<a->nb_elements;i++)
- free_element(a->elements[i]);
- free(a->elements);
- free(a);
-}
-
-static void array_add_element(Array a, void *element)
-{
- if (a->nb_elements == a->nb_allocated_elements) {
- /* we must allocate more */
- a->nb_allocated_elements+=a->increment;
- a->elements=realloc(a->elements,a->nb_allocated_elements*sizeof(void *));
- }
- a->elements[a->nb_elements++]=element;
-}
-/*-----------------------------------------*/
-
-typedef struct node {
- double x,y;
- Array edges;
-} *Node;
-
-typedef struct edge {
- Node node1, node2;
- double angle1, angle2;
-} *Edge;
-
-/*-----------------------------------------*/
-/* Node functions */
-
-static Node node_new(double x, double y)
-{
- Node new;
- assert(new = (Node)calloc(1,sizeof(struct node)));
- new->x=x;
- new->y=y;
- new->edges = array_new(10);
- return new;
-}
-
-static void node_del(void *n)
-{ /* not Node * because the function is passed to array_del */
- array_del(((Node)n)->edges,NULL);
- free(n);
-}
-
-#if 0
-static void node_to_s(Node n, FILE *f)
-{
- fprintf(f,"Node: %g %g\n",n->x,n->y);
-}
-#endif
-
-static void node_draw(struct state *st, Node n)
-{
- XDrawArc(st->dpy,st->window,st->gc_graph,(int)rint(n->x)-5,(int)rint(n->y)-5,10,10,0,360*64);
-}
-
-static void node_add_edge(Node n, Edge e)
-{
- array_add_element(n->edges,e);
-}
-
-
-/*-----------------------------------------*/
-/* Edge functions */
-
-static Edge edge_new(Node n1, Node n2)
-{
- Edge new;
- assert(new = (Edge)calloc(1,sizeof(struct edge)));
- new->node1=n1;
- new->node2=n2;
- new->angle1=atan2(new->node2->y - new->node1->y, new->node2->x - new->node1->x);
- if (new->angle1 < 0) new->angle1+=6.28;
-
- new->angle2=atan2(new->node1->y - new->node2->y, new->node1->x - new->node2->x);
- if (new->angle2 < 0) new->angle2+=6.28;
- return new;
-}
-
-static void edge_del(void *e) /* not Edge * because the function is passed to array_del */
-{
- free(e);
-}
-
-#if 0
-static void edge_to_s(Edge e, FILE *f)
-{
- fprintf(f,"Edge: (%g, %g), (%g, %g) angles: %g, %g\n",
- e->node1->x, e->node1->y, e->node2->x, e->node2->y,
- e->angle1, e->angle2);
-}
-#endif
-
-static void edge_draw(struct state *st, Edge e)
-{
- XDrawLine(st->dpy,st->window,st->gc_graph, e->node1->x, e->node1->y, e->node2->x, e->node2->y);
-}
-
-static double edge_angle(Edge e, Node n)
-{
- /* returns the angle of the edge at Node n */
- assert(n==e->node1 || n==e->node2);
- if (n==e->node1) return e->angle1; else return e->angle2;
-}
-
-static Node edge_other_node(Edge e, Node n)
-{
- assert(n==e->node1 || n==e->node2);
- if (n==e->node1) return e->node2; else return e->node1;
-}
-
-static double edge_angle_to(Edge e, Edge e2, Node node, Direction direction)
-{
- /* returns the absolute angle from this edge to "edge2" around
- "node" following "direction" */
- double a;
-
- if (direction==CLOCKWISE)
- a=edge_angle(e,node) - edge_angle(e2,node);
- else
- a=edge_angle(e2,node) - edge_angle(e,node);
-
- if (a<0) return a+2*M_PI; else return a;
-}
-
-/*-----------------------------------------*/
-
-static Graph graph_new(struct state *st)
-{
- Graph new;
- assert(new = (Graph)calloc(1,sizeof(struct graph)));
- new->nodes = array_new(100);
- new->edges = array_new(100);
- return new;
-}
-
-static void graph_del(Graph g)
-{
- array_del(g->nodes, &node_del);
- array_del(g->edges, &edge_del);
- free(g);
-}
-
-
-static void graph_add_node(Graph g, Node n)
-{
- array_add_element(g->nodes, n);
-}
-
-static void graph_add_edge(Graph g, Edge e)
-{
- array_add_element(g->edges, e);
-
- /* for each node n of e, add n to pointer e */
- node_add_edge(e->node1, e);
- node_add_edge(e->node2, e);
-}
-
-static Edge graph_next_edge_around(Graph g, Node n, Edge e, Direction direction)
-{
- /* return the next edge after e around node n clockwise */
- double angle, minangle=20;
- Edge next_edge = e, edge;
- int i;
-
- for (i=0;i<n->edges->nb_elements;i++) {
- edge=n->edges->elements[i];
- if (edge != e) {
- angle = edge_angle_to(e,edge,n,direction);
- if (angle < minangle) {
- next_edge=edge;
- minangle=angle;
- }
- }
- }
- return next_edge;
-}
-
-#if 0
-static void graph_to_s(Graph g, FILE *f)
-{
- int i;
- for (i=0;i<g->nodes->nb_elements;i++)
- node_to_s(g->nodes->elements[i],f);
- for (i=0;i<g->edges->nb_elements;i++)
- edge_to_s(g->edges->elements[i],f);
-}
-#endif
-
-static void graph_draw(struct state *st, Graph g)
-{
- int i;
-
- for (i=0;i<g->nodes->nb_elements;i++)
- node_draw(st, g->nodes->elements[i]);
- for (i=0;i<g->edges->nb_elements;i++)
- edge_draw(st, g->edges->elements[i]);
-}
-
-static void graph_rotate(Graph g, double angle, int cx, int cy)
-{
- /* rotate all the nodes of the graph around the centre */
- int i;
- float c=cos(angle),s=sin(angle),x,y;
- Node n;
- for (i=0;i<g->nodes->nb_elements;i++) {
- n=g->nodes->elements[i];
- x=n->x; y=n->y;
- n->x = (x-cx)*c-(y-cy)*s + cx;
- n->y = (x-cx)*s+(y-cy)*c + cy;
- }
-}
-
-
-/*---------------------------*/
-
-static Graph make_polar_graph(struct state *st,
- int xmin, int ymin, int width, int height,
- int nbp, /* number of points on each orbit */
- int nbo /* number of orbits */)
- /* make a simple grid graph, with edges present or absent randomly */
-{
- int cx = width/2+xmin, cy=height/2+ymin; /* centre */
- int os = (width<height?width:height)/(2*nbo); /* orbit height */
- Graph g;
- Node *grid;
- int o,p;
-
- /* generate nodes */
- assert(grid=(Node*)calloc(1+nbp*nbo,sizeof(Node)));
- assert(g=graph_new(st));
-
- graph_add_node(g, grid[0]=node_new((double)cx,(double)cy));
-
- for (o=0;o<nbo;o++)
- for (p=0;p<nbp;p++)
- graph_add_node(g,
- grid[1+o*nbp+p]=node_new(cx+(o+1)*os*sin(p*2*M_PI/nbp),
- cy+(o+1)*os*cos(p*2*M_PI/nbp)));
-
-
- /* generate edges */
- for (o=0;o<nbo;o++)
- for (p=0;p<nbp;p++) {
- if (o==0) /* link first orbit nodes with centre */
- graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[0]));
- else /* liink orbit nodes with lower orbit */
- graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[1+(o-1)*nbp+p]));
- /* link along orbit */
- graph_add_edge(g,edge_new(grid[1+o*nbp+p],
- grid[1+o*nbp+(p+1)%nbp]));
- }
-
- free(grid);
- return g;
-}
-
-
-static Graph make_grid_graph(struct state *st,
- int xmin, int ymin, int width, int height, int step)
- /* make a simple grid graph */
-{
- Graph g;
- int row,col,x,y;
- int size=(width<height?height:width);
-
- /* empirically, it seems there are 2 curves only if both
- nbcol and nbrow are even, so we round them to even */
- int nbcol=(2+size/step)/2*2, nbrow=(2+size/step)/2*2;
-
- Node *grid;
- assert(grid=(Node*)calloc(nbrow*nbcol,sizeof(Node)));
- assert(g=graph_new(st));
-
-
- /* adjust xmin and xmax so that the grid is centered */
- xmin+=(width-(nbcol-1)*step)/2;
- ymin+=(height-(nbrow-1)*step)/2;
-
- /* create node grid */
- for (row=0;row<nbrow;row++)
- for (col=0;col<nbcol;col++) {
- x=col*step+xmin;
- y=row*step+ymin;
- grid[row+col*nbrow]=node_new((double)x, (double)y);
- graph_add_node(g, grid[row+col*nbrow]);
- }
-
- /* create edges */
- for (row=0;row<nbrow;row++)
- for (col=0;col<nbcol;col++) {
- if (col!=nbcol-1)
- graph_add_edge(g,edge_new(grid[row+col*nbrow],
- grid[row+(col+1)*nbrow]));
- if (row!=nbrow-1)
- graph_add_edge(g,edge_new(grid[row+col*nbrow],grid[row+1+col*nbrow]));
- if (col!=nbcol-1 && row!=nbrow-1) {
- graph_add_edge(g,edge_new(grid[row+col*nbrow],
- grid[row+1+(col+1)*nbrow]));
- graph_add_edge(g,edge_new(grid[row+1+col*nbrow],
- grid[row+(col+1)*nbrow]));
- }
- }
-
- free(grid);
-
- return g;
-}
-
-
-static Graph make_triangle_graph(struct state *st,
- int xmin, int ymin, int width, int height, int edge_size)
-{
- Graph g;
- Node *grid;
- int row,col;
- double L=(width<height?width:height)/2.0; /* circumradius of the triangle */
- double cx=xmin+width/2.0, cy=ymin+height/2.0; /* centre of the triangle */
- double p2x=cx-L*SQRT_3/2.0, p2y=cy+L/2.0; /* p2 is the bottom left vertex */
- double x,y;
- int nsteps=3*L/(SQRT_3*edge_size);
-
- assert(grid=(Node*)calloc((nsteps+1)*(nsteps+1),sizeof(Node)));
- assert(g=graph_new(st));
-
- /* create node grid */
- for (row=0;row<=nsteps;row++)
- for (col=0;col<=nsteps;col++)
- if (row+col<=nsteps) {
- x=p2x+col*L*SQRT_3/nsteps + row*L*SQRT_3/(2*nsteps);
- y=p2y-row*3*L/(2*nsteps);
- grid[col+row*(nsteps+1)]=node_new((double)x, (double)y);
- graph_add_node(g, grid[col+row*(nsteps+1)]);
- }
-
- /* create edges */
- for (row=0;row<nsteps;row++)
- for (col=0;col<nsteps;col++)
- if (row+col<nsteps) {
- /* horizontal edges */
- graph_add_edge(g,edge_new(grid[row+col*(nsteps+1)],grid[row+(col+1)*(nsteps+1)]));
- /* vertical edges */
- graph_add_edge(g,edge_new(grid[row+col*(nsteps+1)],grid[row+1+col*(nsteps+1)]));
- /* diagonal edges */
- graph_add_edge(g,edge_new(grid[row+1+col*(nsteps+1)],grid[row+(col+1)*(nsteps+1)]));
- }
-
- free(grid);
- return g;
-
-}
-
-
-static Graph make_kennicott_graph(struct state *st,
- int xmin, int ymin, int width, int height, int step,
- int cluster_size)
- /* make a graph inspired by one of the motifs from the Kennicott bible */
- /* square grid of clusters of the shape /|\
- * ---
- * \|/
- * cluster_size is the length of an edge of a cluster
- */
-{
- Graph g;
- int row,col,x,y;
- int size=width<height?height:width;
- int nbcol=(1+size/step)/2*2, nbrow=(1+size/step)/2*2;
- Node *grid;
-
- /* there are 5 nodes by for each cluster */
- assert(grid=(Node*)calloc(5*nbrow*nbcol,sizeof(Node)));
- assert(g=graph_new(st));
-
- /* adjust xmin and xmax so that the grid is centered */
- xmin+=(width-(nbcol-1)*step)/2;
- ymin+=(height-(nbrow-1)*step)/2;
-
- /* create node grid */
- for (row=0;row<nbrow;row++)
- for (col=0;col<nbcol;col++) {
- int ci=5*(row+col*nbrow);
- x=col*step+xmin;
- y=row*step+ymin;
-
- /* create a cluster centred on x,y */
- grid[ci ]=node_new((double)x, (double)y);
- grid[ci+1]=node_new((double)(x+cluster_size), (double)y);
- grid[ci+2]=node_new((double)x, (double)(y-cluster_size));
- grid[ci+3]=node_new((double)(x-cluster_size), (double)y);
- grid[ci+4]=node_new((double)x, (double)(y+cluster_size));
-
- graph_add_node(g, grid[ci]);
- graph_add_node(g, grid[ci+1]);
- graph_add_node(g, grid[ci+2]);
- graph_add_node(g, grid[ci+3]);
- graph_add_node(g, grid[ci+4]);
-
- /* internal edges */
- graph_add_edge(g,edge_new(grid[ci], grid[ci+1]));
- graph_add_edge(g,edge_new(grid[ci], grid[ci+2]));
- graph_add_edge(g,edge_new(grid[ci], grid[ci+3]));
- graph_add_edge(g,edge_new(grid[ci], grid[ci+4]));
- graph_add_edge(g,edge_new(grid[ci+1], grid[ci+2]));
- graph_add_edge(g,edge_new(grid[ci+2], grid[ci+3]));
- graph_add_edge(g,edge_new(grid[ci+3], grid[ci+4]));
- graph_add_edge(g,edge_new(grid[ci+4], grid[ci+1]));
-
- }
-
- /* create inter-cluster edges */
- for (row=0;row<nbrow;row++)
- for (col=0;col<nbcol;col++) {
- if (col!=nbcol-1)
- /* horizontal edge from edge 1 of cluster (row, col) to edge 3
- * of cluster (row,col+1) */
- graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+1],grid[5*(row+(col+1)*nbrow)+3]));
- if (row!=nbrow-1)
- /* vertical edge from edge 4 of cluster (row, col) to edge 2
- * of cluster (row+1,col) */
- graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+4],
- grid[5*(row+1+col*nbrow)+2]));
- }
- free(grid);
- return g;
-}
-
-/*---------------------------*/
-typedef struct spline_segment {
- double x1,y1,x2,y2,x3,y3,x4,y4;
-} *SplineSegment;
-
-typedef struct spline {
- Array segments; /* array of SplineSegment */
- int color;
-} *Spline;
-
-static Spline spline_new(int color)
-{
- Spline new=(Spline)calloc(1,sizeof(struct spline));
- new->segments=array_new(30);
- new->color=color;
- return new;
-}
-
-static void spline_del(void *s)
-{
- array_del(((Spline)s)->segments,&free);
- free(s);
-}
-
-static void spline_add_segment(Spline s,
- double x1, double y1, double x2, double y2,
- double x3, double y3, double x4, double y4)
-{
- SplineSegment ss=(SplineSegment)calloc(1,sizeof(struct spline_segment));
- ss->x1=x1; ss->x2=x2; ss->x3=x3; ss->x4=x4;
- ss->y1=y1; ss->y2=y2; ss->y3=y3; ss->y4=y4;
- array_add_element(s->segments,ss);
-}
-
-#if 0
-static void spline_to_s(Spline s, FILE *f)
-{
- int i;
- SplineSegment ss;
- fprintf(f,"Spline: \n");
- for (i=0;i<s->segments->nb_elements;i++) {
- ss=s->segments->elements[i];
- fprintf(f," - segment %d: (%g, %g),(%g, %g),(%g, %g),(%g, %g)\n",
- i,ss->x1,ss->y1,ss->x2,ss->y2,ss->x3,ss->y3,ss->x4,ss->y4);
- }
-}
-#endif
-
-static void spline_value_at(Spline s, double *x, double *y, double t, int *segment)
-{
- int si;
- double tt;
- SplineSegment ss;
- si = floor(t*s->segments->nb_elements);
- tt = t*s->segments->nb_elements - si;
- assert(tt>=0 && tt<1);
- ss=s->segments->elements[si];
-
- *x = ss->x1*(1-tt)*(1-tt)*(1-tt)+3*ss->x2*tt*(1-tt)*(1-tt)+3*ss->x3*tt*tt*(1-tt)+ss->x4*tt*tt*tt;
- *y = ss->y1*(1-tt)*(1-tt)*(1-tt)+3*ss->y2*tt*(1-tt)*(1-tt)+3*ss->y3*tt*tt*(1-tt)+ss->y4*tt*tt*tt;
-
- *segment=si;
-}
-
-/*---------------------------*/
-
-static EdgeCouple edge_couple_new(int nb_edges) {
- int i;
- EdgeCouple new = (EdgeCouple)calloc(1,sizeof(struct edge_couple));
- new->array = (int **)calloc(nb_edges, sizeof(int*));
- new->size = nb_edges;
-
- for (i=0;i<nb_edges;i++) {
- new->array[i]=(int *)calloc(2,sizeof(int));
- new->array[i][CLOCKWISE]=0;
- new->array[i][ANTICLOCKWISE]=0;
- }
- return new;
-}
-
-static void edge_couple_del(EdgeCouple e)
-{
- int i;
- for (i=0;i<e->size;i++) free(e->array[i]);
- free(e->array);
- free(e);
-}
-
-/*---------------------------*/
-
-static Pattern pattern_new(struct state *st, Graph g, double shape1, double shape2)
-{
- Pattern new;
- assert(new=(Pattern)calloc(1,sizeof(struct pattern)));
- new->shape1=shape1;
- new->shape2=shape2;
- new->graph=g;
- new->ec=edge_couple_new(g->edges->nb_elements);
- new->splines=array_new(10);
- new->ncolors=st->ncolors;
- return new;
-}
-
-static void pattern_del(Pattern p)
-{
- edge_couple_del(p->ec);
- array_del(p->splines,&spline_del);
- free(p);
-}
-
-static void pattern_edge_couple_set(Pattern p, Edge e, Direction d, int value)
-{
- int i;
- for (i=0;i<p->graph->edges->nb_elements;i++)
- if (p->graph->edges->elements[i]==e) {
- p->ec->array[i][d]=value;
- return;
- }
-}
-
-static void pattern_draw_spline_direction(Pattern p, Spline s,
- Node node, Edge edge1, Edge edge2,
- Direction direction)
-{
- double x1=(edge1->node1->x+edge1->node2->x)/2.0;
- double y1=(edge1->node1->y+edge1->node2->y)/2.0;
-
- /* P2 (x2,y2) is the middle point of edge1 */
- double x4=(edge2->node1->x+edge2->node2->x)/2.0;
- double y4=(edge2->node1->y+edge2->node2->y)/2.0;
-
- double alpha=edge_angle_to(edge1,edge2,node,direction)*p->shape1;
- double beta=p->shape2;
-
- double i1x,i1y,i2x,i2y,x2,y2,x3,y3;
-
- if (direction == ANTICLOCKWISE) {
- /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
- i1x = alpha*(node->y-y1)+x1;
- i1y = -alpha*(node->x-x1)+y1;
- i2x = -alpha*(node->y-y4)+x4;
- i2y = alpha*(node->x-x4)+y4;
- x2 = beta*(y1-i1y) + i1x;
- y2 = -beta*(x1-i1x) + i1y;
- x3 = -beta*(y4-i2y) + i2x;
- y3 = beta*(x4-i2x) + i2y;
- }
- else {
- /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
- i1x = -alpha*(node->y-y1)+x1;
- i1y = alpha*(node->x-x1)+y1;
- i2x = alpha*(node->y-y4)+x4;
- i2y = -alpha*(node->x-x4)+y4;
- x2 = -beta*(y1-i1y) + i1x;
- y2 = beta*(x1-i1x) + i1y;
- x3 = beta*(y4-i2y) + i2x;
- y3 = -beta*(x4-i2x) + i2y;
- }
-
- spline_add_segment(s,x1,y1,x2,y2,x3,y3,x4,y4);
-}
-
-static int pattern_next_unfilled_couple(Pattern p, Edge *e, Direction *d)
-{
- int i;
- for (i=0;i<p->ec->size;i++) {
- if (p->ec->array[i][CLOCKWISE]==0) {
- *e=p->graph->edges->elements[i];
- *d=CLOCKWISE;
- return 1;
- }
- else if (p->ec->array[i][ANTICLOCKWISE]==0) {
- *e=p->graph->edges->elements[i];
- *d=ANTICLOCKWISE;
- return 1;
- }
- }
- return 0;
-}
-
-static void pattern_make_curves(Pattern p)
-{
- Edge current_edge, first_edge, next_edge;
- Node current_node, first_node;
- Direction current_direction, first_direction;
- Spline s;
-
- while (pattern_next_unfilled_couple(p, &first_edge, &first_direction)) {
- /* start a new loop */
- s=spline_new(random()%(p->ncolors-2)+2);
- array_add_element(p->splines, s);
-
- current_edge=first_edge;
- current_node=first_node=current_edge->node1;
- current_direction=first_direction;
-
- do {
- pattern_edge_couple_set(p, current_edge, current_direction, 1);
- next_edge = graph_next_edge_around(p->graph,current_node,current_edge,current_direction);
-
- /* add the spline segment to the spline */
- pattern_draw_spline_direction(p,s,current_node,
- current_edge,next_edge,current_direction);
-
- /* cross the edge */
- current_edge = next_edge;
- current_node = edge_other_node(next_edge, current_node);
- current_direction=1-current_direction;
-
- } while (current_node!=first_node || current_edge!=first_edge || current_direction!=first_direction);
-
- if (s->segments->nb_elements==2) /* spline is just one point: remove it */
- p->splines->elements[p->splines->nb_elements-1]=NULL;
-
- }
-}
-
-static void pattern_animate(struct state *st)
-{
- Pattern p = st->pattern;
- double t = st->t;
- double t2;
- double x,y,x2,y2,x3,y3,x4,y4;
- int i,segment,unused;
- int ticks;
- double step=0.0001; /* TODO: set the step (or the delay) as a
- * function of the spline length, so that
- * drawing speed is constant
- */
- Spline s;
-
- XSetLineAttributes(st->dpy,st->gc,st->params.curve_width,LineSolid,CapRound,JoinRound);
- XSetLineAttributes(st->dpy,st->shadow_gc,st->params.shadow_width,LineSolid,CapRound,JoinRound);
-
- for (ticks=0;ticks<100 && t<1;ticks++) {
- for (i=0;i<p->splines->nb_elements;i++)
- if ((s=p->splines->elements[i])) { /* skip if one-point spline */
- spline_value_at(s, &x, &y, fmod(t,1.0),&segment);
- spline_value_at(s, &x2, &y2, fmod(t+step,1.0),&unused);
-
- /* look ahead for the shadow segment */
- t2=t+step;
- if (t2<=1.0) {
- spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
- while (t2+step<1.0 && (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2) < st->params.shadow_width*st->params.shadow_width) {
- t2+=step;
- spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
- }
-
- spline_value_at(s, &x4, &y4, fmod(t2+step,1.0),&unused);
-
- /* draw shadow line */
- XDrawLine(st->dpy,st->window,st->shadow_gc,
- (int)rint(x3),(int)rint(y3),
- (int)rint(x4),(int)rint(y4));
- }
- /* draw line segment */
- if (p->splines->nb_elements==1)
- XSetForeground(st->dpy, st->gc, st->colors[segment%(p->ncolors-3)+2].pixel);
- else
- XSetForeground(st->dpy, st->gc, st->colors[s->color].pixel);
- XDrawLine(st->dpy,st->window,st->gc,
- (int)rint(x),(int)rint(y),
- (int)rint(x2),(int)rint(y2));
- }
- t+=step;
- }
- st->t=t;
-
- if (t>=1) {
- st->reset=1;
-
- /* at the end we redraw back to remove shadow spillage */
- for (i=0;i<p->splines->nb_elements;i++) {
- if ((s=p->splines->elements[i])) {
- double offset=step;
- XSetForeground(st->dpy, st->gc, st->colors[s->color].pixel);
- spline_value_at(s, &x, &y, fmod(t,1.0),&unused);
-
- spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
-
- while ((x2-x)*(x2-x)+(y2-y)*(y2-y) < st->params.shadow_width*st->params.shadow_width) {
- offset+=step;
- spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
- }
-
- XDrawLine(st->dpy,st->window,st->gc, (int)rint(x),(int)rint(y), (int)rint(x2),(int)rint(y2));
- }
- }
- }
-}
-
-/*======================================================================*/
-
-static const char *celtic_defaults[] = {
- ".background: black",
- ".foreground: #333333",
- "*fpsSolid: true",
- "*ncolors: 20",
- "*delay: 10000",
- "*delay2: 5",
- "*showGraph: False",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec celtic_options[] = {
- {"-background", ".background", XrmoptionSepArg, 0},
- {"-foreground", ".foreground", XrmoptionSepArg, 0},
- {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
- {"-delay", ".delay", XrmoptionSepArg, 0},
- {"-delay2", ".delay2", XrmoptionSepArg, 0},
- {"-graph", ".showGraph", XrmoptionNoArg, "True"},
- {0, 0, 0, 0}
-};
-
-#if 0
-static void params_to_s(FILE *f)
-{
- switch (st->params.type) {
- case polar: fprintf(f,"type: polar\n");
- fprintf(f,"nb_orbits: %ld\n",st->params.nb_orbits);
- fprintf(f,"nb_nodes_per_orbit: %ld\n",st->params.nb_nodes_per_orbit);
- break;
- case tgrid: fprintf(f,"type: grid\n");
- fprintf(f,"edge_size: %ld\n",st->params.edge_size);
- break;
- case triangle: fprintf(f,"type: triangle\n");
- fprintf(f,"edge_size: %ld\n",st->params.edge_size);
- break;
- case kennicott:
- fprintf(f,"type: kennicott\n");
- fprintf(f,"edge_size: %ld\n",st->params.edge_size);
- fprintf(f,"cluster_size: %ld\n",st->params.cluster_size);
- break;
- }
-
- fprintf(f,"curve width: %ld\n",st->params.curve_width);
- fprintf(f,"shadow width: %ld\n",st->params.shadow_width);
- fprintf(f,"shape1: %g\n",st->params.shape1);
- fprintf(f,"shape2: %g\n",st->params.shape2);
- fprintf(f,"margin: %ld\n",st->params.margin);
- fprintf(f,"angle: %g\n",st->params.angle);
- fprintf(f,"delay: %ld\n",st->params.delay);
-}
-#endif
-
-#if 0
-static void colormap_to_s(int ncolors, XColor *colors)
-{
- int i;
- printf("-- colormap (%d colors):\n",st->ncolors);
- for (i=0;i<st->ncolors;i++)
- printf("%d: %d %d %d\n", i, st->colors[i].red, st->colors[i].green, st->colors[i].blue);
- printf("----\n");
-}
-#endif
-
-
-static void *
-celtic_init (Display *d_arg, Window w_arg)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
-
- st->dpy=d_arg; st->window=w_arg;
- st->showGraph=get_boolean_resource (st->dpy, "showGraph", "Boolean");
-
- st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
-
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
- if (st->colors) free (st->colors);
- assert(st->colors = (XColor *) calloc (st->ncolors,sizeof(XColor)));
-
- if (get_boolean_resource(st->dpy, "mono", "Boolean"))
- {
- MONO:
- st->ncolors = 1;
- st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- }
- else
- {
-#if 0
- make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors, True, True, 0, True);
-#else
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors, True, 0, True);
-#endif
- if (st->ncolors < 2)
- goto MONO;
- else {
- st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- st->colors[1].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
- "background", "Background");
- }
- }
-
-
- /* graphic context for curves */
- gcv.foreground = st->colors[0].pixel;
- gcv.background = st->colors[1].pixel;
- gcv.line_width = st->params.curve_width;
- gcv.cap_style=CapRound;
- st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground|GCLineWidth|GCCapStyle, &gcv);
-
- /* graphic context for graphs */
- gcv.foreground = st->colors[0].pixel;
- gcv.background = st->colors[1].pixel;
- st->gc_graph = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
-
- /* graphic context for shadows */
- gcv.foreground = st->colors[1].pixel;
- gcv.line_width = st->params.shadow_width;
- gcv.cap_style=CapRound;
- st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
-
- st->delay2 = 1000000 * get_integer_resource(st->dpy, "delay2", "Delay2");
-
- return st;
-}
-
-static unsigned long
-celtic_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if (st->eraser) {
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- return 10000;
- }
-
- if (st->reset || st->force_reset) {
- int delay = (st->force_reset ? 0 : st->delay2);
- st->reset = 0;
- st->force_reset = 0;
- st->t = 1;
-
- if (st->pattern != NULL) {
- pattern_del(st->pattern);
- }
- st->pattern = NULL;
- if (st->graph) graph_del(st->graph);
- st->graph = NULL;
-
- /* recolor each time */
- st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
- if (st->ncolors > 2)
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors, True, 0, True);
-
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- return (delay);
- }
-
- if (st->pattern == NULL) {
- st->params.curve_width=random()%5+4;
- st->params.shadow_width=st->params.curve_width+4;
- st->params.shape1=(15+random()%15)/10.0 -1.0;
- st->params.shape2=(15+random()%15)/10.0 -1.0;
- st->params.edge_size=10*(random()%5)+20;
- st->params.delay=get_integer_resource(st->dpy, "delay", "Delay");
- st->params.angle=random()%360*2*M_PI/360;
- st->params.margin=(random()%8)*100-600;
-
- switch (random()%4) {
- case 0:
- st->params.type=tgrid;
- st->params.shape1=(random()%1*2-1.0)*(random()%10+3)/10.0;
- st->params.shape2=(random()%1*2-1.0)*(random()%10+3)/10.0;
- st->params.edge_size=10*(random()%5)+50;
- break;
- case 1:
- st->params.type=kennicott;
- st->params.shape1=(random()%20)/10.0 -1.0;
- st->params.shape2=(random()%20)/10.0 -1.0;
- st->params.edge_size=10*(random()%3)+70;
- st->params.cluster_size=st->params.edge_size/(3.0+random()%10)-1;
- break;
- case 2:
- st->params.type=triangle;
- st->params.edge_size=10*(random()%5)+60;
- st->params.margin=(random()%10)*100-900;
- break;
- case 3:
- st->params.type=polar;
- st->params.nb_orbits=2+random()%10;
- st->params.nb_nodes_per_orbit=4+random()%10;
- break;
- }
-
-
-/* st->params.type= polar; */
-/* st->params.nb_orbits= 5; */
-/* st->params.nb_nodes_per_orbit= 19; */
-/* st->params.curve_width= 4; */
-/* st->params.shadow_width= 8; */
-/* st->params.shape1= 0.5; */
-/* st->params.shape2= 1.3; */
-/* st->params.margin= 30; */
-/* st->params.angle= 5.21853; */
-/* st->params.delay= 10000; */
-
-
-/* params_to_s(stdout); */
-
- /*=======================================================*/
-
-
- switch (st->params.type) {
- case tgrid:
- st->graph=make_grid_graph(st, st->params.margin,st->params.margin,
- st->xgwa.width-2*st->params.margin,
- st->xgwa.height-2*st->params.margin,
- st->params.edge_size);
- break;
- case kennicott:
- st->graph=make_kennicott_graph(st, st->params.margin,st->params.margin,
- st->xgwa.width-2*st->params.margin,
- st->xgwa.height-2*st->params.margin,
- st->params.edge_size,
- st->params.cluster_size);
- break;
- case triangle:
- st->graph=make_triangle_graph(st, st->params.margin,st->params.margin,
- st->xgwa.width-2*st->params.margin,
- st->xgwa.height-2*st->params.margin,
- st->params.edge_size);
- break;
- case polar:
- st->graph=make_polar_graph(st, st->params.margin,st->params.margin,
- st->xgwa.width-2*st->params.margin,
- st->xgwa.height-2*st->params.margin,
- st->params.nb_nodes_per_orbit,
- st->params.nb_orbits);
- break;
- default:
- st->graph=make_grid_graph(st, st->params.margin,st->params.margin,
- st->xgwa.width-2*st->params.margin,
- st->xgwa.height-2*st->params.margin,
- st->params.edge_size);
- break;
- }
-
- graph_rotate(st->graph,st->params.angle,st->xgwa.width/2,st->xgwa.height/2);
-
- if (st->showGraph)
- graph_draw(st, st->graph);
-
- st->pattern=pattern_new(st, st->graph, st->params.shape1, st->params.shape2);
- pattern_make_curves(st->pattern);
- st->t = 0.0;
- }
-
- pattern_animate(st);
-
- return st->params.delay;
-}
-
-
-static void
-celtic_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-}
-
-static Bool
-celtic_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->force_reset = 1;
- return True;
- }
- return False;
-}
-
-static void
-celtic_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->gc);
- XFreeGC (dpy, st->shadow_gc);
- XFreeGC (dpy, st->gc_graph);
- if (st->pattern) pattern_del (st->pattern);
- st->pattern = 0;
- if (st->graph) graph_del (st->graph);
- if (st->eraser) eraser_free (st->eraser);
- free (st);
-}
-
-
-XSCREENSAVER_MODULE ("Celtic", celtic)
diff --git a/hacks/celtic.man b/hacks/celtic.man
deleted file mode 100644
index 06b81d7..0000000
--- a/hacks/celtic.man
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-celtic \- draws celtic cross-stich patterns
-.SH SYNOPSIS
-.B ifs
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-delay2 \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-graph \fImode\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIceltic\fP program repeatedly draws random cross-stitch patterns.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000.
-.TP 8
-.B \-delay2 \fInumber\fP
-Delay between patterns, in seconds. Default: 5.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of colours to use. Default: 20.
-.TP 8
-.B \-graph
-Whether to render the underlying graph. Default: no.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2005 by Max Froumentin. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Max Froumentin <max@lapin-bleu.net>
diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl
deleted file mode 100755
index 0922e7d..0000000
--- a/hacks/check-configs.pl
+++ /dev/null
@@ -1,1262 +0,0 @@
-#!/usr/bin/perl -w
-# Copyright © 2008-2021 Jamie Zawinski <jwz@jwz.org>
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation. No representations are made about the suitability of this
-# software for any purpose. It is provided "as is" without express or
-# implied warranty.
-#
-# This parses the .c and .xml files and makes sure they are in sync: that
-# options are spelled the same, and that all the numbers are in sync.
-#
-# It also converts the hacks/config/ XML files into the Android XML files.
-#
-# Created: 1-Aug-2008.
-
-require 5;
-use diagnostics;
-use strict;
-
-my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.36 $' =~ m/\s(\d[.\d]+)\s/s);
-
-my $verbose = 0;
-my $debug_p = 0;
-
-
-my $text_default_opts = '';
-foreach (qw(text-mode text-literal text-file text-url text-program)) {
- my $s = $_; $s =~ s/-(.)/\U$1/g; $s =~ s/url/URL/si;
- $text_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n";
-}
-my $image_default_opts = '';
-foreach (qw(choose-random-images grab-desktop-images)) {
- my $s = $_; $s =~ s/-(.)/\U$1/g;
- $image_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n";
-}
-my $xlockmore_default_opts = '';
-foreach (qw(count cycles delay ncolors size font)) {
- $xlockmore_default_opts .= "{\"-$_\", \".$_\", XrmoptionSepArg, 0},\n";
-}
-$xlockmore_default_opts .=
- "{\"-wireframe\", \".wireframe\", XrmoptionNoArg, \"true\"},\n" .
- "{\"-3d\", \".use3d\", XrmoptionNoArg, \"true\"},\n" .
- "{\"-no-3d\", \".use3d\", XrmoptionNoArg, \"false\"},\n";
-
-my $thread_default_opts =
- "{\"-threads\", \".useThreads\", XrmoptionNoArg, \"True\"},\n" .
- "{\"-no-threads\", \".useThreads\", XrmoptionNoArg, \"False\"},\n";
-
-my $analogtv_default_opts = '';
-foreach (qw(color tint brightness contrast)) {
- $analogtv_default_opts .= "{\"-tv-$_\", \".TV$_\", XrmoptionSepArg, 0},\n";
-}
-
-$analogtv_default_opts .= $thread_default_opts;
-
-
-
-# Returns two tables:
-# - A table of the default resource values.
-# - A table of "-switch" => "resource: value", or "-switch" => "resource: %"
-#
-sub parse_src($) {
- my ($saver) = @_;
- my $file = lc($saver) . ".c";
-
- # kludge...
- $file = 'apple2-main.c' if ($file eq 'apple2.c');
- $file = 'sproingiewrap.c' if ($file eq 'sproingies.c');
- $file = 'b_lockglue.c' if ($file eq 'bubble3d.c');
- $file = 'polyhedra-gl.c' if ($file eq 'polyhedra.c');
- $file = 'companion.c' if ($file eq 'companioncube.c');
- $file = 'rd-bomb.c' if ($file eq 'rdbomb.c');
-
- my $ofile = $file;
- $file = "glx/$ofile" unless (-f $file);
- $file = "../hacks/$ofile" unless (-f $file);
- $file = "../hacks/glx/$ofile" unless (-f $file);
- my $body = '';
- open (my $in, '<:utf8', $file) || error ("$ofile: $!");
- while (<$in>) { $body .= $_; }
- close $in;
- $file =~ s@^.*/@@;
-
- my $xlockmore_p = 0;
- my $thread_p = ($body =~ m/THREAD_DEFAULTS/);
- my $analogtv_p = ($body =~ m/ANALOGTV_DEFAULTS/);
- my $text_p = ($body =~ m/"textclient\.h"/);
- my $grab_p = ($body =~ m/load_image_async/);
-
- $body =~ s@/\*.*?\*/@@gs;
- $body =~ s@^#\s*(if|ifdef|ifndef|elif|else|endif).*$@@gm;
- $body =~ s/(THREAD|ANALOGTV)_(DEFAULTS|OPTIONS)(_XLOCK)?//gs;
- $body =~ s/__extension__//gs;
-
- print STDERR "$progname: $file: defaults:\n" if ($verbose > 2);
- my %res_to_val;
- if ($body =~ m/_defaults\s*\[\]\s*=\s*{(.*?)}\s*;/s) {
- foreach (split (/,\s*\n/, $1)) {
- s/^\s*//s;
- s/\s*$//s;
- next if m/^0?$/s;
- s/"[ \t]*\n\s*"//s; # string-append continuation lines
- my ($key, $val) = m@^\"([^:\s]+)\s*:\s*(.*?)\s*\"$@;
- print STDERR "$progname: $file: unparsable: $_\n" unless $key;
- $key =~ s/^[.*]//s;
- $res_to_val{$key} = $val;
- print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2);
- }
- } elsif ($body =~ m/\#\s*define\s*DEFAULTS\s*\\?\s*(.*?)\n[\n#]/s) {
- $xlockmore_p = 1;
- my $str = $1;
- $str =~ s/\"\s*\\\n\s*\"//gs;
- $str =~ m/^\s*\"(.*?)\"\s*\\?\s*$/ ||
- error ("$file: unparsable defaults: $str");
- $str = $1;
- $str =~ s/\s*\\n\s*/\n/gs;
- foreach (split (/\n/, $str)) {
- my ($key, $val) = m@^([^:\s]+)\s*:\s*(.*?)\s*$@;
- print STDERR "$progname: $file: unparsable: $_\n" unless $key;
- $key =~ s/^[.*]//s;
- $val =~ s/"\s*"\s*$//s;
- $res_to_val{$key} = $val;
- print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2);
- }
-
- while ($body =~ s/^#\s*define\s+(DEF_([A-Z\d_]+))\s+\"([^\"]+)\"//m) {
- my ($key1, $key2, $val) = ($1, lc($2), $3);
- $key2 =~ s/_(.)/\U$1/gs; # "foo_bar" -> "fooBar"
- $key2 =~ s/Rpm/RPM/; # kludge
- $res_to_val{$key2} = $val;
- print STDERR "$progname: $file: $key1 ($key2) = $val\n"
- if ($verbose > 2);
- }
-
- } else {
- error ("$file: no defaults");
- }
-
- $body =~ m/XSCREENSAVER_MODULE(_2)?\s*\(\s*\"([^\"]+)\"/ ||
- error ("$file: no module name");
- $res_to_val{progclass} = $2;
- $res_to_val{doFPS} = 'false';
- $res_to_val{textMode} = 'date';
- $res_to_val{textLiteral} = '';
- $res_to_val{textURL} =
- 'https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss';
- $res_to_val{grabDesktopImages} = 'true';
- $res_to_val{chooseRandomImages} = 'true';
-
- print STDERR "$progname: $file: progclass = $2\n" if ($verbose > 2);
-
- print STDERR "$progname: $file: switches to resources:\n"
- if ($verbose > 2);
- my %switch_to_res;
- $switch_to_res{'-fps'} = 'doFPS: true';
- $switch_to_res{'-fg'} = 'foreground: %';
- $switch_to_res{'-bg'} = 'background: %';
- $switch_to_res{'-no-grab-desktop-images'} = 'grabDesktopImages: false';
- $switch_to_res{'-no-choose-random-images'} = 'chooseRandomImages: false';
-
- my ($ign, $opts) = ($body =~ m/(_options|\bopts)\s*\[\]\s*=\s*{(.*?)}\s*;/s);
- if ($xlockmore_p || $thread_p || $analogtv_p || $opts) {
- $opts = '' unless $opts;
- $opts .= ",\n$text_default_opts" if ($text_p);
- $opts .= ",\n$image_default_opts" if ($grab_p);
- $opts .= ",\n$xlockmore_default_opts" if ($xlockmore_p);
- $opts .= ",\n$thread_default_opts" if ($thread_p);
- $opts .= ",\n$analogtv_default_opts" if ($analogtv_p);
-
- foreach (split (/,\s*\n/, $opts)) {
- s/^\s*//s;
- s/\s*$//s;
- next if m/^$/s;
- next if m/^\{\s*0\s*,/s;
- my ($switch, $res, $type, $v0, $v1, $v2) =
- m@^ \s* { \s * \"([^\"]+)\" \s* ,
- \s * \"([^\"]+)\" \s* ,
- \s * ([^\s]+) \s* ,
- \s * (\"([^\"]*)\"|([a-zA-Z\d_]+)) \s* }@xi;
- print STDERR "$progname: $file: unparsable: $_\n" unless $switch;
- my $val = defined($v1) ? $v1 : $v2;
- $val = '%' if ($type eq 'XrmoptionSepArg');
- $res =~ s/^[.*]//s;
- $res =~ s/^[a-z\d]+\.//si;
- $switch =~ s/^\+/-no-/s;
-
- $val = "$res: $val";
- if (defined ($switch_to_res{$switch})) {
- print STDERR "$progname: $file: DUP! $switch = \"$val\"\n"
- if ($verbose > 2);
- } else {
- $switch_to_res{$switch} = $val;
- print STDERR "$progname: $file: $switch = \"$val\"\n"
- if ($verbose > 2);
- }
- }
- } else {
- error ("$file: no options");
- }
-
- return (\%res_to_val, \%switch_to_res);
-}
-
-my %video_dups;
-
-# Returns a list of:
-# "resource = default value"
-# or "resource != non-default value"
-#
-# Also a hash of the simplified XML contents.
-#
-sub parse_xml($$$) {
- my ($saver, $switch_to_res, $src_opts) = @_;
-
- my $saver_title = undef;
- my $gl_p = 0;
- my $file = "config/" . lc($saver) . ".xml";
- my $ofile = $file;
- $file = "../hacks/$ofile" unless (-f $file);
- my $body = '';
- open (my $in, '<:utf8', $file) || error ("$ofile: $!");
- while (<$in>) { $body .= $_; }
- close $in;
- $file =~ s@^.*/@@;
-
- my @result = ();
-
- $body =~ s@<xscreensaver-text\s*/?>@
- <select id="textMode">
- <option id="date" _label="Display the date and time"/>
- <option id="text" _label="Display static text"
- arg-set="-text-mode literal"/>
- <option id="url" _label="Display the contents of a URL"
- arg-set="-text-mode url"/>
- </select>
- <string id="textLiteral" _label="Text to display" arg="-text-literal %"/>
- <string id="textURL" _label="URL to display" arg="-text-url %"/>
- @gs;
-
- $body =~ s@<xscreensaver-image\s*/?>@
- <boolean id="grabDesktopImages" _label="Grab screenshots"
- arg-unset="-no-grab-desktop-images"/>
- <boolean id="chooseRandomImages" _label="Use photo library"
- arg-unset="-no-choose-random-images"/>
- @gs;
-
- $body =~ s/<!--.*?-->/ /gsi;
-
- $body =~ s@(<(_description)>.*?</\2>)@{ $_ = $1; s/\n/\002/gs; $_; }@gsexi;
-
- $body =~ s/\s+/ /gs;
- $body =~ s/</\001</gs;
- $body =~ s/\001(<option)/$1/gs;
-
- my $video = undef;
-
- my @widgets = ();
-
- print STDERR "$progname: $file: options:\n" if ($verbose > 2);
- foreach (split (m/\001/, $body)) {
- next if (m/^\s*$/s);
- my ($type, $args) = m@^<([?/]?[-_a-z]+)\b\s*(.*)$@si;
- error ("$progname: $file: unparsable: $_") unless $type;
- next if ($type =~ m@^/@);
-
- my $ctrl = { type => $type };
-
- if ($type =~ m/^( [hv]group |
- \?xml |
- command |
- file |
- xscreensaver-image |
- xscreensaver-updater
- )/sx) {
- $ctrl = undef;
-
- } elsif ($type eq '_description') {
- $args =~ s/\002/\n/gs;
- $args =~ s@^>\s*@@s;
- $args =~ s/^\n*|\s*$//gs;
- $ctrl->{text} = $args;
-
- } elsif ($type eq 'screensaver') {
- ($saver_title) = ($args =~ m/\b_label\s*=\s*\"([^\"]+)\"/s);
- ($gl_p) = ($args =~ m/\bgl="?yes/s);
- my $s = $saver_title;
- $s =~ s/\s+//gs;
- my $val = "progclass = $s";
- push @result, $val;
- print STDERR "$progname: $file: name: $saver_title\n"
- if ($verbose > 2);
- $ctrl = undef;
-
- } elsif ($type eq 'video') {
- error ("$file: multiple videos") if $video;
- ($video) = ($args =~ m/\bhref="(.*?)"/);
- error ("$file: unparsable video") unless $video;
- error ("$file: unparsable video URL")
- unless ($video =~ m@^https?://www\.youtube\.com/watch\?v=[^?&]+$@s);
- $ctrl = undef;
-
- } elsif ($type eq 'select') {
- $args =~ s/</\001</gs;
- my @opts = split (/\001/, $args);
- shift @opts;
- my $unset_p = 0;
- my $this_res = undef;
- my @menu = ();
- foreach (@opts) {
- error ("$file: unparsable option: $_") unless (m/^<option\s/);
-
- my %item;
- my $opt = $_;
- $opt =~ s@^<option\s+@@s;
- $opt =~ s@[?/]>\s*$@@s;
- while ($opt =~ s/^\s*([^\s]+)\s*=\s*"(.*?)"\s*(.*)/$3/s) {
- my ($k, $v) = ($1, $2);
- $item{$k} = $v;
- }
-
- error ("unparsable XML option line: $_ [$opt]") if ($opt);
- push @menu, \%item;
-
- my ($set) = $item{'arg-set'};
- if ($set) {
- my ($set2, $val) = ($set =~ m/^(.*?) (.*)$/s);
- $set = $set2 if ($set2);
- my ($res) = $switch_to_res->{$set};
- error ("$file: no resource for select switch \"$set\"") unless $res;
-
- my ($res2, $val2) = ($res =~ m/^(.*?): (.*)$/s);
- error ("$file: unparsable select resource: $res") unless $res2;
- $res = $res2;
- $val = $val2 unless ($val2 eq '%');
- $item{value} = $val;
-
- error ("$file: mismatched resources: $res vs $this_res")
- if (defined($this_res) && $this_res ne $res);
- $this_res = $res;
-
- $val = "$res != $val";
- push @result, $val;
- print STDERR "$progname: $file: select: $val\n" if ($verbose > 2);
-
- } else {
- error ("$file: multiple default options: $set") if ($unset_p);
- $unset_p++;
- }
- }
- $ctrl->{resource} = $this_res;
- $ctrl->{default} = $src_opts->{$this_res};
- $ctrl->{menu} = \@menu;
-
- } else {
-
- my $rest = $args;
- $rest =~ s@[/?]*>\s*$@@s;
- while ($rest =~ s/^\s*([^\s]+)\s*=\s*"(.*?)"\s*(.*)/$3/s) {
- my ($k, $v) = ($1, $2);
- $ctrl->{$k} = $v;
- }
- error ("unparsable XML line: $args [$rest]") if ($rest);
-
- if ($type eq 'number') {
- my ($arg) = $ctrl->{arg};
- my ($val) = $ctrl->{default};
- $val = '' unless defined($val);
-
- my $switch = $arg;
- $switch =~ s/\s+.*$//;
- my ($res) = $switch_to_res->{$switch};
- error ("$file: no resource for $type switch \"$arg\"") unless $res;
-
- $res =~ s/: \%$//;
- error ("$file: unparsable value: $res") if ($res =~ m/:/);
- $ctrl->{resource} = $res;
-
- $val = "$res = $val";
- push @result, $val;
- print STDERR "$progname: $file: number: $val\n" if ($verbose > 2);
-
- } elsif ($type eq 'boolean') {
- my ($set) = $ctrl->{'arg-set'};
- my ($unset) = $ctrl->{'arg-unset'};
- my ($arg) = $set || $unset || error ("$file: unparsable: $args");
- my ($res) = $switch_to_res->{$arg};
- error ("$file: no resource for boolean switch \"$arg\"") unless $res;
-
- my ($res2, $val) = ($res =~ m/^(.*?): (.*)$/s);
- error ("$file: unparsable boolean resource: $res") unless $res2;
- $res = $res2;
-
- $ctrl->{resource} = $res;
- $ctrl->{convert} = 'invert' if ($val =~ m/off|false|no/i);
- $ctrl->{default} = ($ctrl->{convert} ? 'true' : 'false');
-
-# $val = ($set ? "$res != $val" : "$res = $val");
- $val = "$res != $val";
- push @result, $val;
- print STDERR "$progname: $file: boolean: $val\n" if ($verbose > 2);
-
- } elsif ($type eq 'string') {
- my ($arg) = $ctrl->{arg};
-
- my $switch = $arg;
- $switch =~ s/\s+.*$//;
- my ($res) = $switch_to_res->{$switch};
- error ("$file: no resource for $type switch \"$arg\"") unless $res;
-
- $res =~ s/: \%$//;
- error ("$file: unparsable value: $res") if ($res =~ m/:/);
- $ctrl->{resource} = $res;
- $ctrl->{default} = $src_opts->{$res};
- my $val = "$res = %";
- push @result, $val;
- print STDERR "$progname: $file: string: $val\n" if ($verbose > 2);
-
- } else {
- error ("$file: unknown type \"$type\" for no arg");
- }
- }
-
- push @widgets, $ctrl if $ctrl;
- }
-
-# error ("$file: no video") unless $video;
- print STDERR "\n$file: WARNING: no video\n\n" unless $video;
-
- if ($video && $video_dups{$video} &&
- $video_dups{$video} ne $saver_title) {
- print STDERR "\n$file: WARNING: $saver_title: dup video with " .
- $video_dups{$video} . "\n";
- }
- $video_dups{$video} = $saver_title if ($video);
-
- return ($saver_title, $gl_p, \@result, \@widgets);
-}
-
-
-sub check_config($$) {
- my ($saver, $android_p) = @_;
-
- # kludge
- return 0 if ($saver =~ m/(-helper)$/);
- return 0 if ($saver =~ m/(xscreensaver-)/);
-
- my ($src_opts, $switchmap) = parse_src ($saver);
- my ($saver_title, $gl_p, $xml_opts, $widgets) =
- parse_xml ($saver, $switchmap, $src_opts);
-
- my $failures = 0;
- foreach my $claim (@$xml_opts) {
- my ($res, $compare, $xval) = ($claim =~ m/^(.*) (=|!=) (.*)$/s);
- error ("$saver: unparsable xml claim: $claim") unless $compare;
-
- my $sval = $src_opts->{$res};
- if ($res =~ m/^TV|^text-mode/) {
- print STDERR "$progname: $saver: OK: skipping \"$res\"\n"
- if ($verbose > 1);
- } elsif (!defined($sval)) {
- print STDERR "$progname: $saver: $res: not in source\n";
- } elsif ($res eq 'progclass') {
- # Ignore this one
- } elsif ($claim !~ m/ = %$/s &&
- ($compare eq '!='
- ? $sval eq $xval
- : $sval ne $xval)) {
- print STDERR "$progname: $saver: " .
- "src has \"$res = $sval\", xml has \"$claim\"\n";
- $failures++;
- } elsif ($verbose > 1) {
- print STDERR "$progname: $saver: OK: \"$res = $sval\" vs \"$claim\"\n";
- }
- }
-
- # Now make sure the progclass in the source and XML also matches
- # the XCode target name.
- #
- my $obd = "../OSX/build/Debug";
- if (!$android_p && -d $obd) {
- my $progclass = $src_opts->{progclass};
- $progclass = 'DNAlogo' if ($progclass eq 'DNALogo');
- my $f = (glob("$obd/$progclass.saver*"))[0];
- if (!$f && $progclass ne 'Flurry') {
- print STDERR "$progname: $progclass.saver does not exist\n";
- $failures++;
- }
- }
-
- print STDERR "$progname: $saver: OK\n"
- if ($verbose == 1 && $failures == 0);
-
- return $failures;
-}
-
-
-# Returns true if the two files differ (by running "cmp")
-#
-sub cmp_files($$) {
- my ($file1, $file2) = @_;
-
- my @cmd = ("cmp", "-s", "$file1", "$file2");
- print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
- if ($verbose > 3);
-
- system (@cmd);
- my $exit_value = $? >> 8;
- my $signal_num = $? & 127;
- my $dumped_core = $? & 128;
-
- error ("$cmd[0]: core dumped!") if ($dumped_core);
- error ("$cmd[0]: signal $signal_num!") if ($signal_num);
- return $exit_value;
-}
-
-
-sub diff_files($$) {
- my ($file1, $file2) = @_;
-
- my @cmd = ("diff",
- "-U1",
-# "-w",
- "--unidirectional-new-file", "$file1", "$file2");
- print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
- if ($verbose > 3);
-
- system (@cmd);
- my $exit_value = $? >> 8;
- my $signal_num = $? & 127;
- my $dumped_core = $? & 128;
-
- error ("$cmd[0]: core dumped!") if ($dumped_core);
- error ("$cmd[0]: signal $signal_num!") if ($signal_num);
- return $exit_value;
-}
-
-
-# If the two files differ:
-# mv file2 file1
-# else
-# rm file2
-#
-sub rename_or_delete($$;$) {
- my ($file, $file_tmp, $suffix_msg) = @_;
-
- my $changed_p = cmp_files ($file, $file_tmp);
-
- if ($changed_p && $debug_p) {
- print STDOUT "\n" . ('#' x 79) . "\n";
- diff_files ("$file", "$file_tmp");
- $changed_p = 0;
- }
-
- if ($changed_p) {
-
- if (!rename ("$file_tmp", "$file")) {
- unlink "$file_tmp";
- error ("mv $file_tmp $file: $!");
- }
- print STDERR "$progname: wrote $file" .
- ($suffix_msg ? " $suffix_msg" : "") . "\n";
-
- } else {
- unlink "$file_tmp" || error ("rm $file_tmp: $!\n");
- print STDERR "$file unchanged" .
- ($suffix_msg ? " $suffix_msg" : "") . "\n"
- if ($verbose);
- print STDERR "$progname: rm $file_tmp\n" if ($verbose > 2);
- }
-}
-
-
-# Write the given body to the file, but don't alter the file's
-# date if the new content is the same as the existing content.
-#
-sub write_file_if_changed($$;$) {
- my ($outfile, $body, $suffix_msg) = @_;
-
- my $file_tmp = "$outfile.tmp";
- open (my $out, '>:utf8', $file_tmp) || error ("$file_tmp: $!");
- (print $out $body) || error ("$file_tmp: $!");
- close $out || error ("$file_tmp: $!");
- rename_or_delete ($outfile, $file_tmp, $suffix_msg);
-}
-
-
-# Read the template file and splice in the @KEYWORDS@ in the hash.
-#
-sub read_template($$) {
- my ($file, $subs) = @_;
- my $body = '';
- open (my $in, '<:utf8', $file) || error ("$file: $!");
- while (<$in>) { $body .= $_; }
- close $in;
-
- $body =~ s@/\*.*?\*/@@gs; # omit comments
- $body =~ s@//.*$@@gm;
-
- foreach my $key (keys %$subs) {
- my $val = $subs->{$key};
- $body =~ s/@\Q$key\E@/$val/gs;
- }
-
- if ($body =~ m/(@[-_A-Z\d]+@)/s) {
- error ("$file: unmatched: $1 [$body]");
- }
-
- $body =~ s/[ \t]+$//gm;
- $body =~ s/(\n\n)\n+/$1/gs;
- return $body;
-}
-
-
-# This is duplicated in OSX/update-info-plist.pl
-#
-sub munge_blurb($$$$) {
- my ($filename, $name, $vers, $desc) = @_;
-
- $desc =~ s/^([ \t]*\n)+//s;
- $desc =~ s/\s*$//s;
-
- # in case it's done already...
- $desc =~ s@<!--.*?-->@@gs;
- $desc =~ s/^.* version \d[^\n]*\n//s;
- $desc =~ s/^From the XScreenSaver.*\n//m;
- $desc =~ s@^https://www\.jwz\.org/xscreensaver.*\n@@m;
- $desc =~
- s/\nCopyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/\nWritten $3; $1./s;
- $desc =~ s/^\n+//s;
-
- error ("$filename: description contains markup: $1")
- if ($desc =~ m/([<>&][^<>&\s]*)/s);
- error ("$filename: description contains ctl chars: $1")
- if ($desc =~ m/([\000-\010\013-\037])/s);
-
- error ("$filename: can't extract authors")
- unless ($desc =~ m@^(.*)\nWritten by[ \t]+(.+)$@s);
- $desc = $1;
- my $authors = $2;
- $desc =~ s/\s*$//s;
-
- my $year = undef;
- if ($authors =~ m@^(.*?)\s*[,;]\s+(\d\d\d\d)([-\s,;]+\d\d\d\d)*[.]?$@s) {
- $authors = $1;
- $year = $2;
- }
-
- error ("$filename: can't extract year") unless $year;
- my $cyear = 1900 + ((localtime())[5]);
- $year = "$cyear" unless $year;
- if ($year && ! ($year =~ m/$cyear/)) {
- $year = "$year-$cyear";
- }
-
- $authors =~ s/[.,;\s]+$//s;
-
- # List me as a co-author on all of them, since I'm the one who
- # did the OSX port, packaged it up, and built the executables.
- #
- my $curator = "Jamie Zawinski";
- if (! ($authors =~ m/$curator/si)) {
- if ($authors =~ m@^(.*?),? and (.*)$@s) {
- $authors = "$1, $2, and $curator";
- } else {
- $authors .= " and $curator";
- }
- }
-
- my $desc1 = ("$name, version $vers.\n\n" . # savername.xml
- $desc . "\n" .
- "\n" .
- "From the XScreenSaver collection: " .
- "https://www.jwz.org/xscreensaver/\n" .
- "Copyright \302\251 $year by $authors.\n");
-
- my $desc2 = ("$name $vers,\n" . # Info.plist
- "\302\251 $year $authors.\n" .
- #"From the XScreenSaver collection:\n" .
- #"https://www.jwz.org/xscreensaver/\n" .
- "\n" .
- $desc .
- "\n");
- utf8::decode($desc1); # Pack UTF-8 into wide chars.
- utf8::decode($desc2);
-
- # unwrap lines, but only when it's obviously ok: leave blank lines,
- # and don't unwrap if that would compress leading whitespace on a line.
- #
- $desc2 =~ s/^(From |https?:)/\n$1/gm;
- 1 while ($desc2 =~ s/([^\s])[ \t]*\n([^\s])/$1 $2/gs);
- $desc2 =~ s/\n\n(From |https?:)/\n$1/gs;
-
- return ($desc1, $desc2);
-}
-
-
-sub build_android(@) {
- my (@savers) = @_;
-
- my $package = "org.jwz.xscreensaver";
- my $project_dir = "xscreensaver";
- my $xml_dir = "$project_dir/res/xml";
- my $values_dir = "$project_dir/res/values";
- my $java_dir = "$project_dir/src/org/jwz/xscreensaver/gen";
- my $gen_dir = "gen";
-
- my $xml_header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
-
- my $manifest = '';
- my $daydream_java = '';
- my $settings_java = '';
- my $wallpaper_java = '';
- my $fntable_h2 = '';
- my $fntable_h3 = '';
- my $arrays = '';
- my $strings = '';
- my %write_files;
- my %string_dups;
-
- my $vers;
- {
- my $file = "../utils/version.h";
- my $body = '';
- open (my $in, '<:utf8', $file) || error ("$file: $!");
- while (<$in>) { $body .= $_; }
- close $in;
- ($vers) = ($body =~ m@ (\d+\.[0-9a-z]+) @s);
- error ("$file: no version number") unless $vers;
- }
-
-
- foreach my $saver (@savers) {
- next if ($saver =~ m/(-helper)$/);
- $saver = 'rdbomb' if ($saver eq 'rd-bomb');
-
- my ($src_opts, $switchmap) = parse_src ($saver);
- my ($saver_title, $gl_p, $xml_opts, $widgets) =
- parse_xml ($saver, $switchmap, $src_opts);
-
- # The Android daydream list sorts the $saver_title strings with strcmp,
- # meaning capitals come before lower case, and "ö" comes after "z".
- # It doesn't matter how we order them in the XML files.
- $saver_title =~ s/^([a-z])/\U$1/gs; # upcase first letter
-
- # This is a Java class name, so it could just be $saver, but it turns
- # out that unicrud is allowed in class names, so why not.
- my $saver_class = $saver_title;
- $saver_class =~ s/\]\[/2/gs;
- $saver_class =~ s/[-_\s]//gs;
-
- my $settings = '';
-
- my $localize0 = sub($$) {
- my ($key, $string) = @_;
- $string =~ s@([\\\"\'])@\\$1@gs; # backslashify
- $string =~ s@\n@\\n@gs; # quote newlines
- $key =~ s@[^a-z\d_]+@_@gsi; # illegal characters
-
- my $old = $string_dups{$key};
- error ("dup string: $key: \"$old\" != \"$string\"")
- if (defined($old) && $old ne $string);
- $string_dups{$key} = $string;
-
- my $fmt = ($string =~ m/%/ ? ' formatted="false"' : '');
- $strings .= "<string name=\"${key}\"$fmt>$string</string>\n"
- unless defined($old);
- return "\@string/$key";
- };
-
- $localize0->('app_name', 'XScreenSaver');
-
- $settings .= ("<Preference\n" .
- " android:key=\"${saver}_reset\"\n" .
- " android:title=\"" .
- $localize0->('reset_to_defaults', 'Reset to defaults') .
- "\"\n" .
- " />\n");
-
- my $daydream_desc = '';
- foreach my $widget (@$widgets) {
- my $type = $widget->{type};
- my $rsrc = $widget->{resource};
- my $label = $widget->{_label};
- my $def = $widget->{default};
- my $invert_p = (($widget->{convert} || '') eq 'invert');
-
- my $key = "${saver}_$rsrc" if $rsrc;
-
- #### The menus don't actually have titles on X11 or Cocoa...
- $label = $widget->{resource} unless $label;
-
- my $localize = sub($;$) {
- my ($string, $suf) = @_;
- $suf = 'title' unless $suf;
- return $localize0->("${saver}_${rsrc}_${suf}", $string);
- };
-
- if ($type eq 'slider' || $type eq 'spinbutton') {
-
- my $low = $widget->{low};
- my $high = $widget->{high};
- my $float_p = $low =~ m/[.]/;
- my $low_label = $widget->{'_low-label'};
- my $high_label = $widget->{'_high-label'};
-
- $low_label = $low unless defined($low_label);
- $high_label = $high unless defined($high_label);
-
- ($low, $high) = ($high, $low)
- if (($widget->{convert} || '') eq 'invert');
-
- $settings .=
- ("<$package.SliderPreference\n" .
- " android:layout=\"\@layout/slider_preference\"\n" .
- " android:key=\"${key}\"\n" .
- " android:title=\"" . $localize->($label) . "\"\n" .
- " android:defaultValue=\"$def\"\n" .
- " low=\"$low\"\n" .
- " high=\"$high\"\n" .
- " lowLabel=\"" . $localize->($low_label, 'low_label') . "\"\n" .
- " highLabel=\"" . $localize->($high_label, 'high_label') . "\"\n" .
- " integral=\"" .($float_p ? 'false' : 'true'). "\" />\n");
-
- } elsif ($type eq 'boolean') {
-
- my $def = ($invert_p ? 'true' : 'false');
- $settings .=
- ("<CheckBoxPreference\n" .
- " android:key=\"${key}\"\n" .
- " android:title=\"" . $localize->($label) . "\"\n" .
- " android:defaultValue=\"$def\" />\n");
-
- } elsif ($type eq 'select') {
-
- $label =~ s/^(.)/\U$1/s; # upcase first letter of menu title
- $label =~ s/[-_]/ /gs;
- $label =~ s/([a-z])([A-Z])/$1 $2/gs;
- $def = '' unless defined ($def);
- $settings .=
- ("<ListPreference\n" .
- " android:key=\"${key}\"\n" .
- " android:title=\"" . $localize->($label, 'menu') . "\"\n" .
- " android:entries=\"\@array/${key}_entries\"\n" .
- " android:defaultValue=\"$def\"\n" .
- " android:entryValues=\"\@array/${key}_values\" />\n");
-
- my $a1 = '';
- foreach my $item (@{$widget->{menu}}) {
- my $val = $item->{value};
- if (! defined($val)) {
- $val = $src_opts->{$widget->{resource}};
- error ("$saver: no default resource in option menu " .
- $item->{_label})
- unless defined($val);
- }
- $val =~ s@([\\\"\'])@\\$1@gs; # backslashify
- $a1 .= " <item>$val</item>\n";
- }
-
- my $a2 = '';
- foreach my $item (@{$widget->{menu}}) {
- my $val = $item->{value};
- $val = $src_opts->{$widget->{resource}} unless defined($val);
- $a2 .= (" <item>" . $localize->($item->{_label}, $val) .
- "</item>\n");
- }
-
- my $fmt1 = ($a1 =~ m/%/ ? ' formatted="false"' : '');
- my $fmt2 = ($a2 =~ m/%/ ? ' formatted="false"' : '');
- $arrays .= ("<string-array name=\"${key}_values\"$fmt1>\n" .
- $a1 .
- "</string-array>\n" .
- "<string-array name=\"${key}_entries\"$fmt2>\n" .
- $a2 .
- "</string-array>\n");
-
- } elsif ($type eq 'string') {
-
- $def =~ s/&/&amp;/gs;
- $settings .=
- ("<EditTextPreference\n" .
- " android:key=\"${key}\"\n" .
- " android:title=\"" . $localize->($label) . "\"\n" .
- " android:defaultValue=\"$def\" />\n");
-
- } elsif ($type eq 'file') {
-
- } elsif ($type eq '_description') {
-
- $type = 'description';
- $rsrc = $type;
- my $desc = $widget->{text};
- (undef, $desc) = munge_blurb ($saver, $saver_title, $vers, $desc);
-
- # Lose the Wikipedia URLs.
- $desc =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm;
- $desc =~ s/(\n\n)\n+/$1/s;
- $desc =~ s/\s*$/\n\n\n/s;
-
- $daydream_desc = $desc;
-
- my ($year) = ($daydream_desc =~ m/\b((19|20)\d\d)\b/s);
- error ("$saver: no year") unless $year;
- $daydream_desc =~ s/^.*?\n\n//gs;
- $daydream_desc =~ s/\n.*$//gs;
- $daydream_desc = "$year: $daydream_desc";
- $daydream_desc =~ s/^(.{72}).+$/$1.../s;
-
- $settings .=
- ("<Preference\n" .
- " android:icon=\"\@drawable/thumbnail\"\n" .
- " android:key=\"${saver}_${type}\"\n" .
-# " android:selectable=\"false\"\n" .
- " android:persistent=\"false\"\n" .
- " android:layout=\"\@layout/preference_blurb\"\n" .
- " android:summary=\"" . $localize->($desc) . "\">\n" .
- " <intent android:action=\"android.intent.action.VIEW\"\n" .
- " android:data=\"https://www.jwz.org/xscreensaver/\" />\n" .
- "</Preference>\n");
-
- } else {
- error ("unhandled type: $type");
- }
- }
-
- my $heading = "XScreenSaver: $saver_title";
-
- $settings =~ s/^/ /gm;
- $settings = ($xml_header .
- "<PreferenceScreen xmlns:android=\"" .
- "http://schemas.android.com/apk/res/android\"\n" .
- " android:title=\"" .
- $localize0->("${saver}_settings_title", $heading) . "\">\n" .
- $settings .
- "</PreferenceScreen>\n");
-
- my $saver_underscore = $saver;
- $saver_underscore =~ s/-/_/g;
- $write_files{"$xml_dir/${saver_underscore}_settings.xml"} = $settings;
-
- $manifest .= ("<service android:label=\"" .
- $localize0->("${saver_underscore}_saver_title",
- $saver_title) .
- "\"\n" .
- " android:summary=\"" .
- $localize0->("${saver_underscore}_saver_desc",
- $daydream_desc) . "\"\n" .
- " android:name=\".gen.Daydream\$$saver_class\"\n" .
- " android:permission=\"android.permission" .
- ".BIND_DREAM_SERVICE\"\n" .
- " android:exported=\"true\"\n" .
- " android:icon=\"\@drawable/${saver_underscore}\">\n" .
- " <intent-filter>\n" .
- " <action android:name=\"android.service.dreams" .
- ".DreamService\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".DEFAULT\" />\n" .
- " </intent-filter>\n" .
- " <meta-data android:name=\"android.service.dream\"\n" .
- " android:resource=\"\@xml/${saver}_dream\" />\n" .
- "</service>\n" .
- "<service android:label=\"" .
- $localize0->("${saver_underscore}_saver_title",
- $saver_title) .
- "\"\n" .
- " android:summary=\"" .
- $localize0->("${saver_underscore}_saver_desc",
- $daydream_desc) . "\"\n" .
- " android:name=\".gen.Wallpaper\$$saver_class\"\n" .
- " android:permission=\"android.permission" .
- ".BIND_WALLPAPER\">\n" .
- " <intent-filter>\n" .
- " <action android:name=\"android.service.wallpaper" .
- ".WallpaperService\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".DEFAULT\" />\n" . # TODO: Is the DEFAULT category needed?
- " </intent-filter>\n" .
- " <meta-data android:name=\"android.service.wallpaper\"\n" .
- " android:resource=\"\@xml/${saver}_wallpaper\" />\n" .
- "</service>\n" .
- "<activity android:label=\"" .
- $localize0->("${saver}_settings_title", $heading) . "\"\n" .
- " android:name=\"$package.gen.Settings\$$saver_class\"\n" .
- " android:exported=\"true\">\n" .
- "</activity>\n"
- );
-
- my $dream = ("<dream xmlns:android=\"" .
- "http://schemas.android.com/apk/res/android\"\n" .
- " android:settingsActivity=\"" .
- "$package.gen.Settings\$$saver_class\" />\n");
- $write_files{"$xml_dir/${saver_underscore}_dream.xml"} = $dream;
-
- my $wallpaper = ("<wallpaper xmlns:android=\"" .
- "http://schemas.android.com/apk/res/android\"\n" .
- " android:settingsActivity=\"" .
- "$package.gen.Settings\$$saver_class\"\n" .
- " android:thumbnail=\"\@drawable/${saver_underscore}\" />\n");
- $write_files{"$xml_dir/${saver_underscore}_wallpaper.xml"} = $wallpaper;
-
- $daydream_java .=
- (" public static class $saver_class extends $package.Daydream {\n" .
- " }\n" .
- "\n");
-
- $wallpaper_java .=
- (" public static class $saver_class extends $package.Wallpaper {\n" .
- " }\n" .
- "\n");
-
- $settings_java .=
- (" public static class $saver_class extends $package.Settings\n" .
- " implements SharedPreferences.OnSharedPreferenceChangeListener {\n" .
- " }\n" .
- "\n");
-
- $fntable_h2 .= ",\n " if $fntable_h2 ne '';
- $fntable_h3 .= ",\n " if $fntable_h3 ne '';
-
- $fntable_h2 .= "${saver}_xscreensaver_function_table";
- $fntable_h3 .= "{\"${saver}\", &${saver}_xscreensaver_function_table}";
- }
-
- $arrays =~ s/^/ /gm;
- $arrays = ($xml_header .
- "<resources xmlns:xliff=\"" .
- "urn:oasis:names:tc:xliff:document:1.2\">\n" .
- $arrays .
- "</resources>\n");
-
- $strings =~ s/^/ /gm;
- $strings = ($xml_header .
- "<resources>\n" .
- $strings .
- "</resources>\n");
-
- $manifest .= "<activity android:name=\"$package.Settings\" />\n";
-
- $manifest .= ("<activity android:name=\"" .
- "$package.Activity\"\n" .
- " android:theme=\"\@android:style/Theme.Holo\"\n" .
- " android:label=\"\@string/app_name\">\n" .
- " <intent-filter>\n" .
- " <action android:name=\"android.intent.action" .
- ".MAIN\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".LAUNCHER\" />\n" .
- " </intent-filter>\n" .
- " <intent-filter>\n" .
- " <action android:name=\"android.intent.action" .
- ".VIEW\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".DEFAULT\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".BROWSABLE\" />\n" .
- " </intent-filter>\n" .
- "</activity>\n");
-
-
- $manifest .= ("<activity android:name=\"" .
- "$package.TVActivity\"\n" .
- " android:theme=\"\@android:style/Theme.Holo\"\n" .
- " android:label=\"\@string/app_name\">\n" .
- " <intent-filter>\n" .
- " <action android:name=\"android.intent.action" .
- ".MAIN\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".LEANBACK_LAUNCHER\" />\n" .
- " </intent-filter>\n" .
- " <intent-filter>\n" .
- " <action android:name=\"android.intent.action" .
- ".VIEW\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".DEFAULT\" />\n" .
- " <category android:name=\"android.intent.category" .
- ".BROWSABLE\" />\n" .
- " </intent-filter>\n" .
- "</activity>\n");
-
-
-
-
- # Android wants this to be an int
- my $versb = $vers;
- $versb =~ s/^(\d+)\.(\d+).*$/{ $1 * 10000 + $2 * 100 }/sex;
- $versb++ if ($versb == 53500); # Herp derp
-
- $manifest =~ s/^/ /gm;
- $manifest = ($xml_header .
- "<manifest xmlns:android=\"" .
- "http://schemas.android.com/apk/res/android\"\n" .
- " package=\"$package\"\n" .
- " android:versionCode=\"$versb\"\n" .
- " android:versionName=\"$vers\">\n" .
-
- # Without this shit we get "APP_PLATFORM android-18 is higher
- # than android:minSdkVersion 1 in AndroidManifest.xml"
- #
- # But with it "lintVitalRelease" complains with:
- # "The minSdk version should not be declared in the android
- # manifest file. You can move the version from the manifest to
- # the defaultConfig in the build.gradle file."
- #
- # That crap is already in android/xscreensaver/build.gradle.
- #
- # " <uses-sdk android:minSdkVersion=\"18\"" .
- # " android:targetSdkVersion=\"30\" />\n" .
-
- " <uses-feature android:glEsVersion=\"0x00010001\"\n" .
- " android:required=\"true\" />\n" .
-
- " <uses-feature android:name=\"android.software.leanback\"\n" .
- " android:required=\"false\" />\n" .
-
- " <uses-feature" .
- " android:name=\"android.hardware.touchscreen\"\n" .
- " android:required=\"false\" />\n" .
-
- " <uses-permission android:name=\"" .
- "android.permission.INTERNET\" />\n" .
- " <uses-permission android:name=\"" .
- "android.permission.READ_EXTERNAL_STORAGE\" />\n" .
-
- " <application android:icon=\"\@drawable/thumbnail\"\n" .
- " android:banner=\"\@drawable/thumbnail\"\n" .
- " android:label=\"\@string/app_name\"\n" .
- " android:name=\".App\">\n" .
- $manifest .
- " </application>\n" .
- "</manifest>\n");
-
- $daydream_java = ("package $package.gen;\n" .
- "\n" .
- "import $package.jwxyz;\n" .
- "\n" .
- "public class Daydream {\n" .
- $daydream_java .
- "}\n");
-
- $wallpaper_java = ("package $package.gen;\n" .
- "\n" .
- "import $package.jwxyz;\n" .
- "\n" .
- "public class Wallpaper {\n" .
- $wallpaper_java .
- "}\n");
-
- $settings_java = ("package $package.gen;\n" .
- "\n" .
- "import android.content.SharedPreferences;\n" .
- "\n" .
- "public class Settings {\n" .
- $settings_java .
- "}\n");
-
- $write_files{"$project_dir/AndroidManifest.xml"} = $manifest;
- $write_files{"$values_dir/settings.xml"} = $arrays;
- $write_files{"$values_dir/strings.xml"} = $strings;
- $write_files{"$java_dir/Daydream.java"} = $daydream_java;
- $write_files{"$java_dir/Wallpaper.java"} = $wallpaper_java;
- $write_files{"$java_dir/Settings.java"} = $settings_java;
-
- my $fntable_h = ("extern struct xscreensaver_function_table\n" .
- " " . $fntable_h2 . ";\n" .
- "\n" .
- "static const struct function_table_entry" .
- " function_table[] = {\n" .
- " " . $fntable_h3 . "\n" .
- "};\n");
- $write_files{"$gen_dir/function-table.h"} = $fntable_h;
-
-
- $write_files{"$values_dir/attrs.xml"} =
- # This file doesn't actually have any substitutions in it, so it could
- # just be static, somewhere...
- # SliderPreference.java refers to this via "R.styleable.SliderPreference".
- ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" .
- "<resources>\n" .
- " <declare-styleable name=\"SliderPreference\">\n" .
- " <attr name=\"android:summary\" />\n" .
- " </declare-styleable>\n" .
- "</resources>\n");
-
-
- foreach my $file (sort keys %write_files) {
- my ($dir) = ($file =~ m@^(.*)/[^/]*$@s);
- system ("mkdir", "-p", $dir) if (! -d $dir && !$debug_p);
- my $body = $write_files{$file};
- $body = "// Generated by $progname\n$body"
- if ($file =~ m/\.(java|[chm])$/s);
- write_file_if_changed ($file, $body);
- }
-
- # Unlink any .xml files from a previous run that shouldn't be there:
- # if a hack is removed from $ANDROID_HACKS in android/Makefile but
- # the old XML files remain behind, the build blows up.
- #
- foreach my $dd ($xml_dir, $gen_dir, $java_dir) {
- opendir (my $dirp, $dd) || error ("$dd: $!");
- my @files = readdir ($dirp);
- closedir $dirp;
- foreach my $f (sort @files) {
- next if ($f eq '.' || $f eq '..');
- $f = "$dd/$f";
- next if (defined ($write_files{$f}));
- if ($f =~ m/_(settings|wallpaper|dream)\.xml$/s ||
- $f =~ m/(Settings|Daydream)\.java$/s) {
- print STDERR "$progname: rm $f\n";
- unlink ($f) unless ($debug_p);
- } else {
- print STDERR "$progname: warning: unrecognised file: $f\n";
- }
- }
- }
-}
-
-
-sub error($) {
- my ($err) = @_;
- print STDERR "$progname: $err\n";
- exit 1;
-}
-
-sub usage() {
- print STDERR "usage: $progname [--verbose] [--debug]" .
- " [--build-android] files ...\n";
- exit 1;
-}
-
-sub main() {
- binmode (STDOUT, ':utf8');
- binmode (STDERR, ':utf8');
-
- my $android_p = 0;
- my @files = ();
- while ($#ARGV >= 0) {
- $_ = shift @ARGV;
- if (m/^--?verbose$/) { $verbose++; }
- elsif (m/^-v+$/) { $verbose += length($_)-1; }
- elsif (m/^--?debug$/s) { $debug_p++; }
- elsif (m/^--?build-android$/s) { $android_p++; }
- elsif (m/^-./) { usage; }
- else { push @files, $_; }
-# else { usage; }
- }
-
- usage unless ($#files >= 0);
- my $failures = 0;
- foreach my $file (@files) {
- $failures += check_config ($file, $android_p);
- }
-
- build_android (@files) if ($android_p);
-
- exit ($failures);
-}
-
-main();
diff --git a/hacks/cloudlife.c b/hacks/cloudlife.c
deleted file mode 100644
index 123dd13..0000000
--- a/hacks/cloudlife.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/* cloudlife by Don Marti <dmarti@zgp.org>
- *
- * Based on Conway's Life, but with one rule change to make it a better
- * screensaver: cells have a max age.
- *
- * When a cell exceeds the max age, it counts as 3 for populating the next
- * generation. This makes long-lived formations explode instead of just
- * sitting there burning a hole in your screen.
- *
- * Cloudlife only draws one pixel of each cell per tick, whether the cell is
- * alive or dead. So gliders look like little comets.
-
- * 20 May 2003 -- now includes color cycling and a man page.
-
- * Based on several examples from the hacks directory of:
-
- * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhack.h"
-
-#ifndef MAX_WIDTH
-#include <limits.h>
-#define MAX_WIDTH SHRT_MAX
-#endif
-
-#ifdef TIME_ME
-#include <time.h>
-#endif
-
-/* this program goes faster if some functions are inline. The following is
- * borrowed from ifs.c */
-#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
-#undef inline
-#define inline /* */
-#endif
-
-struct field {
- unsigned int height;
- unsigned int width;
- unsigned int max_age;
- unsigned int cell_size;
- unsigned char *cells;
- unsigned char *new_cells;
-};
-
-struct state {
- Display *dpy;
- Window window;
-
-#ifdef TIME_ME
- time_t start_time;
-#endif
-
- unsigned int cycles;
- unsigned int colorindex; /* which color in the colormap are we on */
- unsigned int colortimer; /* when this reaches 0, cycle to next color */
-
- int cycle_delay;
- int cycle_colors;
- int ncolors;
- int density;
-
- GC fgc, bgc;
- XGCValues gcv;
- XWindowAttributes xgwa;
- XColor *colors;
-
- struct field *field;
-
- XPoint fg_points[MAX_WIDTH];
- XPoint bg_points[MAX_WIDTH];
-};
-
-
-static void
-*xrealloc(void *p, size_t size)
-{
- void *ret;
- if ((ret = realloc(p, size)) == NULL) {
- fprintf(stderr, "%s: out of memory\n", progname);
- exit(1);
- }
- return ret;
-}
-
-static struct field *
-init_field(struct state *st)
-{
- struct field *f = xrealloc(NULL, sizeof(struct field));
- f->height = 0;
- f->width = 0;
- f->cell_size = get_integer_resource(st->dpy, "cellSize", "Integer");
- f->max_age = get_integer_resource(st->dpy, "maxAge", "Integer");
-
- if (f->max_age > 255) {
- fprintf (stderr, "%s: max-age must be < 256 (not %d)\n", progname,
- f->max_age);
- exit (1);
- }
-
- f->cells = NULL;
- f->new_cells = NULL;
- return f;
-}
-
-static void
-resize_field(struct field * f, unsigned int w, unsigned int h)
-{
- int s = w * h * sizeof(unsigned char);
- f->width = w;
- f->height = h;
-
- f->cells = xrealloc(f->cells, s);
- f->new_cells = xrealloc(f->new_cells, s);
- memset(f->cells, 0, s);
- memset(f->new_cells, 0, s);
-}
-
-static inline unsigned char
-*cell_at(struct field * f, unsigned int x, unsigned int y)
-{
- return (f->cells + x * sizeof(unsigned char) +
- y * f->width * sizeof(unsigned char));
-}
-
-static inline unsigned char
-*new_cell_at(struct field * f, unsigned int x, unsigned int y)
-{
- return (f->new_cells + x * sizeof(unsigned char) +
- y * f->width * sizeof(unsigned char));
-}
-
-static void
-draw_field(struct state *st, struct field * f)
-{
- unsigned int x, y;
- unsigned int rx, ry = 0; /* random amount to offset the dot */
- unsigned int size = 1 << f->cell_size;
- unsigned int mask = size - 1;
- unsigned int fg_count, bg_count;
-
- /* columns 0 and width-1 are off screen and not drawn. */
- for (y = 1; y < f->height - 1; y++) {
- fg_count = 0;
- bg_count = 0;
-
- /* rows 0 and height-1 are off screen and not drawn. */
- for (x = 1; x < f->width - 1; x++) {
- rx = random();
- ry = rx >> f->cell_size;
- rx &= mask;
- ry &= mask;
-
- if (*cell_at(f, x, y)) {
- st->fg_points[fg_count].x = (short) x *size - rx - 1;
- st->fg_points[fg_count].y = (short) y *size - ry - 1;
- fg_count++;
- } else {
- st->bg_points[bg_count].x = (short) x *size - rx - 1;
- st->bg_points[bg_count].y = (short) y *size - ry - 1;
- bg_count++;
- }
- }
- XDrawPoints(st->dpy, st->window, st->fgc, st->fg_points, fg_count,
- CoordModeOrigin);
- XDrawPoints(st->dpy, st->window, st->bgc, st->bg_points, bg_count,
- CoordModeOrigin);
- }
-}
-
-static inline unsigned int
-cell_value(unsigned char c, unsigned int age)
-{
- if (!c) {
- return 0;
- } else if (c > age) {
- return (3);
- } else {
- return (1);
- }
-}
-
-static inline unsigned int
-is_alive(struct field * f, unsigned int x, unsigned int y)
-{
- unsigned int count;
- unsigned int i, j;
- unsigned char *p;
-
- count = 0;
-
- for (i = x - 1; i <= x + 1; i++) {
- for (j = y - 1; j <= y + 1; j++) {
- if (y != j || x != i) {
- count += cell_value(*cell_at(f, i, j), f->max_age);
- }
- }
- }
-
- p = cell_at(f, x, y);
- if (*p) {
- if (count == 2 || count == 3) {
- return ((*p) + 1);
- } else {
- return (0);
- }
- } else {
- if (count == 3) {
- return (1);
- } else {
- return (0);
- }
- }
-}
-
-static unsigned int
-do_tick(struct field * f)
-{
- unsigned int x, y;
- unsigned int count = 0;
- for (x = 1; x < f->width - 1; x++) {
- for (y = 1; y < f->height - 1; y++) {
- count += *new_cell_at(f, x, y) = is_alive(f, x, y);
- }
- }
- memcpy(f->cells, f->new_cells, f->width * f->height *
- sizeof(unsigned char));
- return count;
-}
-
-
-static unsigned int
-random_cell(unsigned int p)
-{
- int r = random() & 0xff;
-
- if (r < p) {
- return (1);
- } else {
- return (0);
- }
-}
-
-static void
-populate_field(struct field * f, unsigned int p)
-{
- unsigned int x, y;
-
- for (x = 0; x < f->width; x++) {
- for (y = 0; y < f->height; y++) {
- *cell_at(f, x, y) = random_cell(p);
- }
- }
-}
-
-static void
-populate_edges(struct field * f, unsigned int p)
-{
- unsigned int i;
-
- for (i = f->width; i--;) {
- *cell_at(f, i, 0) = random_cell(p);
- *cell_at(f, i, f->height - 1) = random_cell(p);
- }
-
- for (i = f->height; i--;) {
- *cell_at(f, f->width - 1, i) = random_cell(p);
- *cell_at(f, 0, i) = random_cell(p);
- }
-}
-
-static void *
-cloudlife_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- Bool tmp = True;
-
- st->dpy = dpy;
- st->window = window;
- st->field = init_field(st);
-
-#ifdef TIME_ME
- st->start_time = time(NULL);
-#endif
-
- st->cycle_delay = get_integer_resource(st->dpy, "cycleDelay", "Integer");
- st->cycle_colors = get_integer_resource(st->dpy, "cycleColors", "Integer");
- st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
- st->density = (get_integer_resource(st->dpy, "initialDensity", "Integer")
- % 100 * 256)/100;
-
- XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
-
- if (st->cycle_colors) {
- st->colors = (XColor *) xrealloc(st->colors, sizeof(XColor) * (st->ncolors+1));
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap, st->colors, &st->ncolors,
- True, &tmp, True);
- }
-
- st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- st->fgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
-
- st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
- "background", "Background");
- st->bgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
-
- return st;
-}
-
-static unsigned long
-cloudlife_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if (st->cycle_colors) {
- if (st->colortimer == 0) {
- st->colortimer = st->cycle_colors;
- if( st->colorindex == 0 )
- st->colorindex = st->ncolors;
- st->colorindex--;
- XSetForeground(st->dpy, st->fgc, st->colors[st->colorindex].pixel);
- }
- st->colortimer--;
- }
-
- XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
- if (st->field->height != st->xgwa.height / (1 << st->field->cell_size) + 2 ||
- st->field->width != st->xgwa.width / (1 << st->field->cell_size) + 2) {
-
- resize_field(st->field, st->xgwa.width / (1 << st->field->cell_size) + 2,
- st->xgwa.height / (1 << st->field->cell_size) + 2);
- populate_field(st->field, st->density);
- }
-
- draw_field(st, st->field);
-
- if (do_tick(st->field) < (st->field->height + st->field->width) / 4) {
- populate_field(st->field, st->density);
- }
-
- if (st->cycles % (st->field->max_age /2) == 0) {
- populate_edges(st->field, st->density);
- do_tick(st->field);
- populate_edges(st->field, 0);
- }
-
- st->cycles++;
-
-#ifdef TIME_ME
- if (st->cycles % st->field->max_age == 0) {
- printf("%g s.\n",
- ((time(NULL) - st->start_time) * 1000.0) / st->cycles);
- }
-#endif
-
- return (st->cycle_delay);
-}
-
-
-static void
-cloudlife_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static Bool
-cloudlife_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- XClearWindow (dpy, window);
- st->cycles = 0;
- if (st->field) {
- free (st->field->cells);
- free (st->field->new_cells);
- free (st->field);
- }
- st->field = init_field(st);
- return True;
- }
- return False;
-}
-
-static void
-cloudlife_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- free (st->field->cells);
- free (st->field->new_cells);
- free (st->field);
- free (st->colors);
- XFreeGC (dpy, st->fgc);
- XFreeGC (dpy, st->bgc);
- free (st);
-}
-
-
-static const char *cloudlife_defaults[] = {
- ".background: black",
- ".foreground: blue",
- "*fpsSolid: true",
- "*cycleDelay: 25000",
- "*cycleColors: 2",
- "*ncolors: 64",
- "*maxAge: 64",
- "*initialDensity: 30",
- "*cellSize: 3",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec cloudlife_options[] = {
- {"-background", ".background", XrmoptionSepArg, 0},
- {"-foreground", ".foreground", XrmoptionSepArg, 0},
- {"-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0},
- {"-cycle-colors", ".cycleColors", XrmoptionSepArg, 0},
- {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
- {"-cell-size", ".cellSize", XrmoptionSepArg, 0},
- {"-initial-density", ".initialDensity", XrmoptionSepArg, 0},
- {"-max-age", ".maxAge", XrmoptionSepArg, 0},
- {0, 0, 0, 0}
-};
-
-
-XSCREENSAVER_MODULE ("CloudLife", cloudlife)
diff --git a/hacks/cloudlife.man b/hacks/cloudlife.man
deleted file mode 100644
index c94d77b..0000000
--- a/hacks/cloudlife.man
+++ /dev/null
@@ -1,87 +0,0 @@
-.TH XScreenSaver 6 "20-May-2003" "X Version 11"
-.SH NAME
-cloudlife \- a cellular automaton based on Conway's Life
-.SH SYNOPSIS
-.B cloudlife
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-cycle-delay \fImicroseconds\fP] [\-cycle-colors \fIinteger\fP][\-cell-size \fIinteger\fP] [\-initial-density \fIinteger\fP] [\-max-age \fIinteger\fP]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIcloudlife\fP program draws a cellular
-automaton based on Conway's Life, except that
-cells have a maximum age, and only one pixel per
-cell is drawn every tick.
-.SH OPTIONS
-.I cloudlife
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-cycle-delay \fIinteger\fP
-Time in microseconds to sleep between ticks. Default 25000.
-.TP 8
-.B \-cycle-colors \fIinteger\fP
-How many ticks should elapse between cycling colors. 0 to disable
-color cycling. Default 2.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 64.
-The colors are chosen randomly.
-.TP 8
-.B \-cell-size \fIinteger\fP
-Size of each cell, in powers of 2. Default 3 (8-pixel cells).
-.TP 8
-.B \-initial-density \fIinteger\fP
-Percentage of cells that are alive at start and when the
-field is repopulated. Default 30.
-.TP 8
-.B \-max-age \fIinteger\fP
-Maximum age for a cell. Default 64.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-
-Copyright \(co 2003 by Don Marti. Based on
-examples from the hacks directory of xscreensaver,
-Copyright (c) 1997, 1998, 2002 Jamie Zawinski
-<jwz@jwz.org>
-
-This man page based on the man page of sierpinski,
-Copyright \(co 1996 by Desmond Daignault.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-Don Marti <dmarti@zgp.org> 20 May 2003.
-
diff --git a/hacks/compass.c b/hacks/compass.c
deleted file mode 100644
index e321d70..0000000
--- a/hacks/compass.c
+++ /dev/null
@@ -1,997 +0,0 @@
-/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <math.h>
-#include "screenhack.h"
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-# include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-#define ABS(x) ((x)<0?-(x):(x))
-#define MAX(x,y) ((x)<(y)?(y):(x))
-#define MIN(x,y) ((x)>(y)?(y):(x))
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-struct state {
- Display *dpy;
- Window window;
-
- int delay;
- Bool dbuf;
- struct disc *discs[4];
- int x, y, size, size2;
- GC ptr_gc;
- GC erase_gc;
- XWindowAttributes xgwa;
- Pixmap b, ba, bb; /* double-buffer to reduce flicker */
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- XdbeBackBuffer backb;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-};
-
-
-
-struct disc {
- int theta; /* 0 - 360*64 */
- int velocity;
- int acceleration;
- int limit;
- GC gc;
- void (*draw) (struct state *, Drawable, struct disc *,
- int x, int y, int radius);
-};
-
-
-static void
-draw_letters (struct state *st, Drawable d, struct disc *disc,
- int x, int y, int radius)
-{
- XPoint points[50];
- double th2 = 2 * M_PI * (disc->theta / ((double) 360*64));
- double th;
-
- /* W */
-
- th = th2;
-
- points[0].x = x + radius * 0.8 * cos(th - 0.07);
- points[0].y = y + radius * 0.8 * sin(th - 0.07);
-
- points[1].x = x + radius * 0.7 * cos(th - 0.05);
- points[1].y = y + radius * 0.7 * sin(th - 0.05);
-
- points[2].x = x + radius * 0.78 * cos(th);
- points[2].y = y + radius * 0.78 * sin(th);
-
- points[3].x = x + radius * 0.7 * cos(th + 0.05);
- points[3].y = y + radius * 0.7 * sin(th + 0.05);
-
- points[4].x = x + radius * 0.8 * cos(th + 0.07);
- points[4].y = y + radius * 0.8 * sin(th + 0.07);
-
- XDrawLines (st->dpy, d, disc->gc, points, 5, CoordModeOrigin);
-
- /* 30 (1) */
-
- th = th2 + (2 * M_PI * 0.08333);
-
- points[0].x = x + radius * 0.78 * cos(th - 0.13);
- points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.08);
- points[1].y = y + radius * 0.8 * sin(th - 0.08);
-
- points[2].x = x + radius * 0.78 * cos(th - 0.03);
- points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
- points[3].x = x + radius * 0.76 * cos(th - 0.03);
- points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
- points[4].x = x + radius * 0.75 * cos(th - 0.08);
- points[4].y = y + radius * 0.75 * sin(th - 0.08);
-
- points[5].x = x + radius * 0.74 * cos(th - 0.03);
- points[5].y = y + radius * 0.74 * sin(th - 0.03);
-
- points[6].x = x + radius * 0.72 * cos(th - 0.03);
- points[6].y = y + radius * 0.72 * sin(th - 0.03);
-
- points[7].x = x + radius * 0.7 * cos(th - 0.08);
- points[7].y = y + radius * 0.7 * sin(th - 0.08);
-
- points[8].x = x + radius * 0.72 * cos(th - 0.13);
- points[8].y = y + radius * 0.72 * sin(th - 0.13);
-
- XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
- /* 30 (2) */
-
- points[0].x = x + radius * 0.78 * cos(th + 0.03);
- points[0].y = y + radius * 0.78 * sin(th + 0.03);
-
- points[1].x = x + radius * 0.8 * cos(th + 0.08);
- points[1].y = y + radius * 0.8 * sin(th + 0.08);
-
- points[2].x = x + radius * 0.78 * cos(th + 0.13);
- points[2].y = y + radius * 0.78 * sin(th + 0.13);
-
- points[3].x = x + radius * 0.72 * cos(th + 0.13);
- points[3].y = y + radius * 0.72 * sin(th + 0.13);
-
- points[4].x = x + radius * 0.7 * cos(th + 0.08);
- points[4].y = y + radius * 0.7 * sin(th + 0.08);
-
- points[5].x = x + radius * 0.72 * cos(th + 0.03);
- points[5].y = y + radius * 0.72 * sin(th + 0.03);
-
- points[6] = points[0];
-
- XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
-
- /* 33 (1) */
-
- th = th2 + (2 * M_PI * 0.16666);
-
- points[0].x = x + radius * 0.78 * cos(th - 0.13);
- points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.08);
- points[1].y = y + radius * 0.8 * sin(th - 0.08);
-
- points[2].x = x + radius * 0.78 * cos(th - 0.03);
- points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
- points[3].x = x + radius * 0.76 * cos(th - 0.03);
- points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
- points[4].x = x + radius * 0.75 * cos(th - 0.08);
- points[4].y = y + radius * 0.75 * sin(th - 0.08);
-
- points[5].x = x + radius * 0.74 * cos(th - 0.03);
- points[5].y = y + radius * 0.74 * sin(th - 0.03);
-
- points[6].x = x + radius * 0.72 * cos(th - 0.03);
- points[6].y = y + radius * 0.72 * sin(th - 0.03);
-
- points[7].x = x + radius * 0.7 * cos(th - 0.08);
- points[7].y = y + radius * 0.7 * sin(th - 0.08);
-
- points[8].x = x + radius * 0.72 * cos(th - 0.13);
- points[8].y = y + radius * 0.72 * sin(th - 0.13);
-
- XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
- /* 33 (2) */
-
- points[0].x = x + radius * 0.78 * cos(th + 0.03);
- points[0].y = y + radius * 0.78 * sin(th + 0.03);
-
- points[1].x = x + radius * 0.8 * cos(th + 0.08);
- points[1].y = y + radius * 0.8 * sin(th + 0.08);
-
- points[2].x = x + radius * 0.78 * cos(th + 0.13);
- points[2].y = y + radius * 0.78 * sin(th + 0.13);
-
- points[3].x = x + radius * 0.76 * cos(th + 0.13);
- points[3].y = y + radius * 0.76 * sin(th + 0.13);
-
- points[4].x = x + radius * 0.75 * cos(th + 0.08);
- points[4].y = y + radius * 0.75 * sin(th + 0.08);
-
- points[5].x = x + radius * 0.74 * cos(th + 0.13);
- points[5].y = y + radius * 0.74 * sin(th + 0.13);
-
- points[6].x = x + radius * 0.72 * cos(th + 0.13);
- points[6].y = y + radius * 0.72 * sin(th + 0.13);
-
- points[7].x = x + radius * 0.7 * cos(th + 0.08);
- points[7].y = y + radius * 0.7 * sin(th + 0.08);
-
- points[8].x = x + radius * 0.72 * cos(th + 0.03);
- points[8].y = y + radius * 0.72 * sin(th + 0.03);
-
- XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
- /* N */
-
- th = th2 + (2 * M_PI * 0.25);
-
- points[0].x = x + radius * 0.7 * cos(th - 0.05);
- points[0].y = y + radius * 0.7 * sin(th - 0.05);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.05);
- points[1].y = y + radius * 0.8 * sin(th - 0.05);
-
- points[2].x = x + radius * 0.7 * cos(th + 0.05);
- points[2].y = y + radius * 0.7 * sin(th + 0.05);
-
- points[3].x = x + radius * 0.8 * cos(th + 0.05);
- points[3].y = y + radius * 0.8 * sin(th + 0.05);
-
- XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
-
- /* 3 */
-
- th = th2 + (2 * M_PI * 0.33333);
-
- points[0].x = x + radius * 0.78 * cos(th - 0.05);
- points[0].y = y + radius * 0.78 * sin(th - 0.05);
-
- points[1].x = x + radius * 0.8 * cos(th);
- points[1].y = y + radius * 0.8 * sin(th);
-
- points[2].x = x + radius * 0.78 * cos(th + 0.05);
- points[2].y = y + radius * 0.78 * sin(th + 0.05);
-
- points[3].x = x + radius * 0.76 * cos(th + 0.05);
- points[3].y = y + radius * 0.76 * sin(th + 0.05);
-
- points[4].x = x + radius * 0.75 * cos(th);
- points[4].y = y + radius * 0.75 * sin(th);
-
- points[5].x = x + radius * 0.74 * cos(th + 0.05);
- points[5].y = y + radius * 0.74 * sin(th + 0.05);
-
- points[6].x = x + radius * 0.72 * cos(th + 0.05);
- points[6].y = y + radius * 0.72 * sin(th + 0.05);
-
- points[7].x = x + radius * 0.7 * cos(th);
- points[7].y = y + radius * 0.7 * sin(th);
-
- points[8].x = x + radius * 0.72 * cos(th - 0.05);
- points[8].y = y + radius * 0.72 * sin(th - 0.05);
-
- XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
- /* 6 */
-
- th = th2 + (2 * M_PI * 0.41666);
-
- points[0].x = x + radius * 0.78 * cos(th + 0.05);
- points[0].y = y + radius * 0.78 * sin(th + 0.05);
-
- points[1].x = x + radius * 0.8 * cos(th);
- points[1].y = y + radius * 0.8 * sin(th);
-
- points[2].x = x + radius * 0.78 * cos(th - 0.05);
- points[2].y = y + radius * 0.78 * sin(th - 0.05);
-
- points[3].x = x + radius * 0.72 * cos(th - 0.05);
- points[3].y = y + radius * 0.72 * sin(th - 0.05);
-
- points[4].x = x + radius * 0.7 * cos(th);
- points[4].y = y + radius * 0.7 * sin(th);
-
- points[5].x = x + radius * 0.72 * cos(th + 0.05);
- points[5].y = y + radius * 0.72 * sin(th + 0.05);
-
- points[6].x = x + radius * 0.74 * cos(th + 0.05);
- points[6].y = y + radius * 0.74 * sin(th + 0.05);
-
- points[7].x = x + radius * 0.76 * cos(th);
- points[7].y = y + radius * 0.76 * sin(th);
-
- points[8].x = x + radius * 0.74 * cos(th - 0.05);
- points[8].y = y + radius * 0.74 * sin(th - 0.05);
-
- XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
-
- /* E */
-
- th = th2 + (2 * M_PI * 0.5);
-
- points[0].x = x + radius * 0.8 * cos(th + 0.05);
- points[0].y = y + radius * 0.8 * sin(th + 0.05);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.05);
- points[1].y = y + radius * 0.8 * sin(th - 0.05);
-
- points[2].x = x + radius * 0.75 * cos(th - 0.05);
- points[2].y = y + radius * 0.75 * sin(th - 0.05);
-
- points[3].x = x + radius * 0.75 * cos(th + 0.025);
- points[3].y = y + radius * 0.75 * sin(th + 0.025);
-
- points[4].x = x + radius * 0.75 * cos(th - 0.05);
- points[4].y = y + radius * 0.75 * sin(th - 0.05);
-
- points[5].x = x + radius * 0.7 * cos(th - 0.05);
- points[5].y = y + radius * 0.7 * sin(th - 0.05);
-
- points[6].x = x + radius * 0.7 * cos(th + 0.05);
- points[6].y = y + radius * 0.7 * sin(th + 0.05);
-
- XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
-
- /* 12 (1) */
-
- th = th2 + (2 * M_PI * 0.58333);
-
- points[0].x = x + radius * 0.77 * cos(th - 0.06);
- points[0].y = y + radius * 0.77 * sin(th - 0.06);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.03);
- points[1].y = y + radius * 0.8 * sin(th - 0.03);
-
- points[2].x = x + radius * 0.7 * cos(th - 0.03);
- points[2].y = y + radius * 0.7 * sin(th - 0.03);
-
- XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
-
- /* 12 (2) */
-
- points[0].x = x + radius * 0.78 * cos(th + 0.02);
- points[0].y = y + radius * 0.78 * sin(th + 0.02);
-
- points[1].x = x + radius * 0.8 * cos(th + 0.07);
- points[1].y = y + radius * 0.8 * sin(th + 0.07);
-
- points[2].x = x + radius * 0.78 * cos(th + 0.11);
- points[2].y = y + radius * 0.78 * sin(th + 0.11);
-
- points[3].x = x + radius * 0.76 * cos(th + 0.11);
- points[3].y = y + radius * 0.76 * sin(th + 0.11);
-
- points[4].x = x + radius * 0.74 * cos(th + 0.02);
- points[4].y = y + radius * 0.74 * sin(th + 0.02);
-
- points[5].x = x + radius * 0.71 * cos(th + 0.03);
- points[5].y = y + radius * 0.71 * sin(th + 0.03);
-
- points[6].x = x + radius * 0.7 * cos(th + 0.03);
- points[6].y = y + radius * 0.7 * sin(th + 0.03);
-
- points[7].x = x + radius * 0.7 * cos(th + 0.13);
- points[7].y = y + radius * 0.7 * sin(th + 0.13);
-
- XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
- /* 15 (1) */
-
- th = th2 + (2 * M_PI * 0.66666);
-
- points[0].x = x + radius * 0.77 * cos(th - 0.06);
- points[0].y = y + radius * 0.77 * sin(th - 0.06);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.03);
- points[1].y = y + radius * 0.8 * sin(th - 0.03);
-
- points[2].x = x + radius * 0.7 * cos(th - 0.03);
- points[2].y = y + radius * 0.7 * sin(th - 0.03);
-
- XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
-
- /* 15 (2) */
-
- points[0].x = x + radius * 0.8 * cos(th + 0.11);
- points[0].y = y + radius * 0.8 * sin(th + 0.11);
-
- points[1].x = x + radius * 0.8 * cos(th + 0.02);
- points[1].y = y + radius * 0.8 * sin(th + 0.02);
-
- points[2].x = x + radius * 0.76 * cos(th + 0.02);
- points[2].y = y + radius * 0.76 * sin(th + 0.02);
-
- points[3].x = x + radius * 0.77 * cos(th + 0.06);
- points[3].y = y + radius * 0.77 * sin(th + 0.06);
-
- points[4].x = x + radius * 0.76 * cos(th + 0.10);
- points[4].y = y + radius * 0.76 * sin(th + 0.10);
-
- points[5].x = x + radius * 0.73 * cos(th + 0.11);
- points[5].y = y + radius * 0.73 * sin(th + 0.11);
-
- points[6].x = x + radius * 0.72 * cos(th + 0.10);
- points[6].y = y + radius * 0.72 * sin(th + 0.10);
-
- points[7].x = x + radius * 0.7 * cos(th + 0.06);
- points[7].y = y + radius * 0.7 * sin(th + 0.06);
-
- points[8].x = x + radius * 0.72 * cos(th + 0.02);
- points[8].y = y + radius * 0.72 * sin(th + 0.02);
-
- XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
-
- /* S */
-
- th = th2 + (2 * M_PI * 0.75);
-
- points[0].x = x + radius * 0.78 * cos(th + 0.05);
- points[0].y = y + radius * 0.78 * sin(th + 0.05);
-
- points[1].x = x + radius * 0.8 * cos(th);
- points[1].y = y + radius * 0.8 * sin(th);
-
- points[2].x = x + radius * 0.78 * cos(th - 0.05);
- points[2].y = y + radius * 0.78 * sin(th - 0.05);
-
- points[3].x = x + radius * 0.76 * cos(th - 0.05);
- points[3].y = y + radius * 0.76 * sin(th - 0.05);
-
- points[4].x = x + radius * 0.74 * cos(th + 0.05);
- points[4].y = y + radius * 0.74 * sin(th + 0.05);
-
- points[5].x = x + radius * 0.72 * cos(th + 0.05);
- points[5].y = y + radius * 0.72 * sin(th + 0.05);
-
- points[6].x = x + radius * 0.7 * cos(th);
- points[6].y = y + radius * 0.7 * sin(th);
-
- points[7].x = x + radius * 0.72 * cos(th - 0.05);
- points[7].y = y + radius * 0.72 * sin(th - 0.05);
-
- XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
- /* 21 (1) */
-
- th = th2 + (2 * M_PI * 0.83333);
-
- points[0].x = x + radius * 0.78 * cos(th - 0.13);
- points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.08);
- points[1].y = y + radius * 0.8 * sin(th - 0.08);
-
- points[2].x = x + radius * 0.78 * cos(th - 0.03);
- points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
- points[3].x = x + radius * 0.76 * cos(th - 0.03);
- points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
- points[4].x = x + radius * 0.74 * cos(th - 0.12);
- points[4].y = y + radius * 0.74 * sin(th - 0.12);
-
- points[5].x = x + radius * 0.71 * cos(th - 0.13);
- points[5].y = y + radius * 0.71 * sin(th - 0.13);
-
- points[6].x = x + radius * 0.7 * cos(th - 0.13);
- points[6].y = y + radius * 0.7 * sin(th - 0.13);
-
- points[7].x = x + radius * 0.7 * cos(th - 0.02);
- points[7].y = y + radius * 0.7 * sin(th - 0.02);
-
- XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
- /* 21 (2) */
-
- points[0].x = x + radius * 0.77 * cos(th + 0.03);
- points[0].y = y + radius * 0.77 * sin(th + 0.03);
-
- points[1].x = x + radius * 0.8 * cos(th + 0.06);
- points[1].y = y + radius * 0.8 * sin(th + 0.06);
-
- points[2].x = x + radius * 0.7 * cos(th + 0.06);
- points[2].y = y + radius * 0.7 * sin(th + 0.06);
-
- XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
-
- /* 24 (1) */
-
- th = th2 + (2 * M_PI * 0.91666);
-
- points[0].x = x + radius * 0.78 * cos(th - 0.13);
- points[0].y = y + radius * 0.78 * sin(th - 0.13);
-
- points[1].x = x + radius * 0.8 * cos(th - 0.08);
- points[1].y = y + radius * 0.8 * sin(th - 0.08);
-
- points[2].x = x + radius * 0.78 * cos(th - 0.03);
- points[2].y = y + radius * 0.78 * sin(th - 0.03);
-
- points[3].x = x + radius * 0.76 * cos(th - 0.03);
- points[3].y = y + radius * 0.76 * sin(th - 0.03);
-
- points[4].x = x + radius * 0.74 * cos(th - 0.12);
- points[4].y = y + radius * 0.74 * sin(th - 0.12);
-
- points[5].x = x + radius * 0.71 * cos(th - 0.13);
- points[5].y = y + radius * 0.71 * sin(th - 0.13);
-
- points[6].x = x + radius * 0.7 * cos(th - 0.13);
- points[6].y = y + radius * 0.7 * sin(th - 0.13);
-
- points[7].x = x + radius * 0.7 * cos(th - 0.02);
- points[7].y = y + radius * 0.7 * sin(th - 0.02);
-
- XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
-
- /* 24 (2) */
-
- points[0].x = x + radius * 0.69 * cos(th + 0.09);
- points[0].y = y + radius * 0.69 * sin(th + 0.09);
-
- points[1].x = x + radius * 0.8 * cos(th + 0.09);
- points[1].y = y + radius * 0.8 * sin(th + 0.09);
-
- points[2].x = x + radius * 0.72 * cos(th + 0.01);
- points[2].y = y + radius * 0.72 * sin(th + 0.01);
-
- points[3].x = x + radius * 0.72 * cos(th + 0.13);
- points[3].y = y + radius * 0.72 * sin(th + 0.13);
-
- XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
-}
-
-
-static void
-draw_ticks (struct state *st, Drawable d, struct disc *disc,
- int x, int y, int radius)
-{
- XSegment segs[72];
- int i;
- double tick = (M_PI * 2) / 72;
-
- for (i = 0; i < 72; i++)
- {
- int radius2 = radius;
- double th = (i * tick) + (2 * M_PI * (disc->theta / ((double) 360*64)));
-
- if (i % 6)
- radius2 -= radius / 16;
- else
- radius2 -= radius / 8;
-
- segs[i].x1 = x + radius * cos(th);
- segs[i].y1 = y + radius * sin(th);
- segs[i].x2 = x + radius2 * cos(th);
- segs[i].y2 = y + radius2 * sin(th);
- }
- XDrawSegments (st->dpy, d, disc->gc, segs, countof(segs));
-
- draw_letters (st, d, disc, x, y, radius);
-}
-
-
-static void
-draw_thin_arrow (struct state *st, Drawable d, struct disc *disc,
- int x, int y, int radius)
-{
- XPoint points[3];
- double th;
- int radius2;
- double tick = ((M_PI * 2) / 72) * 2;
-
- radius *= 0.9;
- radius2 = radius - (radius / 8) * 3;
-
- th = 2 * M_PI * (disc->theta / ((double) 360*64));
-
- points[0].x = x + radius * cos(th); /* tip */
- points[0].y = y + radius * sin(th);
-
- points[1].x = x + radius2 * cos(th - tick); /* tip left */
- points[1].y = y + radius2 * sin(th - tick);
-
- points[2].x = x + radius2 * cos(th + tick); /* tip right */
- points[2].y = y + radius2 * sin(th + tick);
-
- XDrawLine (st->dpy, d, disc->gc,
- (int) (x + radius2 * cos(th)),
- (int) (y + radius2 * sin(th)),
- (int) (x + -radius * cos(th)),
- (int) (y + -radius * sin(th)));
-
- XFillPolygon (st->dpy, d, disc->gc, points, 3, Convex, CoordModeOrigin);
-}
-
-
-static void
-draw_thick_arrow (struct state *st, Drawable d, struct disc *disc,
- int x, int y, int radius)
-{
- XPoint points[10];
- double th;
- int radius2, radius3;
- double tick = ((M_PI * 2) / 72) * 2;
-
- radius *= 0.9;
- radius2 = radius - (radius / 8) * 3;
- radius3 = radius - (radius / 8) * 2;
- th = 2 * M_PI * (disc->theta / ((double) 360*64));
-
- points[0].x = x + radius * cos(th); /* tip */
- points[0].y = y + radius * sin(th);
-
- points[1].x = x + radius2 * cos(th - tick); /* tip left */
- points[1].y = y + radius2 * sin(th - tick);
-
- points[2].x = x + radius2 * cos(th + tick); /* tip right */
- points[2].y = y + radius2 * sin(th + tick);
-
- points[3] = points[0];
-
- XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
-
- points[0].x = x + radius2 * cos(th - tick/2); /* top left */
- points[0].y = y + radius2 * sin(th - tick/2);
-
- points[1].x = x + -radius2 * cos(th + tick/2); /* bottom left */
- points[1].y = y + -radius2 * sin(th + tick/2);
-
- points[2].x = x + -radius3 * cos(th); /* bottom */
- points[2].y = y + -radius3 * sin(th);
-
- points[3].x = x + -radius * cos(th); /* bottom spike */
- points[3].y = y + -radius * sin(th);
-
- points[4] = points[2]; /* return */
-
- points[5].x = x + -radius2 * cos(th - tick/2); /* bottom right */
- points[5].y = y + -radius2 * sin(th - tick/2);
-
- points[6].x = x + radius2 * cos(th + tick/2); /* top right */
- points[6].y = y + radius2 * sin(th + tick/2);
-
- XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
-}
-
-
-
-static void
-roll_disc (struct disc *disc)
-{
- double th = disc->theta;
- if (th < 0)
- th = -(th + disc->velocity);
- else
- th = (th + disc->velocity);
-
- if (th > (360*64))
- th -= (360*64);
- else if (th < 0)
- th += (360*64);
-
- disc->theta = (disc->theta > 0 ? th : -th);
-
- disc->velocity += disc->acceleration;
-
- if (disc->velocity > disc->limit ||
- disc->velocity < -disc->limit)
- disc->acceleration = -disc->acceleration;
-
- /* Alter direction of rotational acceleration randomly. */
- if (! (random() % 120))
- disc->acceleration = -disc->acceleration;
-
- /* Change acceleration very occasionally. */
- if (! (random() % 200))
- {
- if (random() & 1)
- disc->acceleration *= 1.2;
- else
- disc->acceleration *= 0.8;
- }
-}
-
-
-static void
-init_spin (struct disc *disc)
-{
- disc->limit = 5*64;
- disc->theta = RAND(360*64);
- disc->velocity = RAND(16) * RANDSIGN();
- disc->acceleration = RAND(16) * RANDSIGN();
-}
-
-
-static void
-draw_compass (struct state *st)
-{
- int i = 0;
- while (st->discs[i])
- {
- st->discs[i]->draw (st, st->b, st->discs[i], st->x, st->y, st->size);
- roll_disc (st->discs[i]);
- i++;
- }
-}
-
-static void
-draw_pointer (struct state *st)
-{
- int radius = st->size;
- GC dot_gc = st->discs[0]->gc;
- XPoint points[3];
- int size = radius * 0.1;
-
- /* top */
-
- points[0].x = st->x - size;
- points[0].y = st->y - radius - size;
-
- points[1].x = st->x + size;
- points[1].y = st->y - radius - size;
-
- points[2].x = st->x;
- points[2].y = st->y - radius;
-
- XFillPolygon (st->dpy, st->b, st->ptr_gc, points, 3, Convex, CoordModeOrigin);
-
- /* top right */
-
- points[0].x = st->x - (radius * 0.85);
- points[0].y = st->y - (radius * 0.8);
-
- points[1].x = st->x - (radius * 1.1);
- points[1].y = st->y - (radius * 0.55);
-
- points[2].x = st->x - (radius * 0.6);
- points[2].y = st->y - (radius * 0.65);
-
- XFillPolygon (st->dpy, st->b, st->ptr_gc, points, 3, Convex, CoordModeOrigin);
-
- /* left */
-
- points[0].x = st->x - (radius * 1.05);
- points[0].y = st->y;
-
- points[1].x = st->x - (radius * 1.1);
- points[1].y = st->y - (radius * 0.025);
-
- points[2].x = st->x - (radius * 1.1);
- points[2].y = st->y + (radius * 0.025);
-
- XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
-
- /* right */
-
- points[0].x = st->x + (radius * 1.05);
- points[0].y = st->y;
-
- points[1].x = st->x + (radius * 1.1);
- points[1].y = st->y - (radius * 0.025);
-
- points[2].x = st->x + (radius * 1.1);
- points[2].y = st->y + (radius * 0.025);
-
- XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
-
- /* bottom */
-
- points[0].x = st->x;
- points[0].y = st->y + (radius * 1.05);
-
- points[1].x = st->x - (radius * 0.025);
- points[1].y = st->y + (radius * 1.1);
-
- points[2].x = st->x + (radius * 0.025);
- points[2].y = st->y + (radius * 1.1);
-
- XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
-
- /* bottom left */
-
- points[0].x = st->x + (radius * 0.74);
- points[0].y = st->y + (radius * 0.74);
-
- points[1].x = st->x + (radius * 0.78);
- points[1].y = st->y + (radius * 0.75);
-
- points[2].x = st->x + (radius * 0.75);
- points[2].y = st->y + (radius * 0.78);
-
- XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
-
- /* top left */
-
- points[0].x = st->x + (radius * 0.74);
- points[0].y = st->y - (radius * 0.74);
-
- points[1].x = st->x + (radius * 0.78);
- points[1].y = st->y - (radius * 0.75);
-
- points[2].x = st->x + (radius * 0.75);
- points[2].y = st->y - (radius * 0.78);
-
- XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
-
- /* bottom right */
-
- points[0].x = st->x - (radius * 0.74);
- points[0].y = st->y + (radius * 0.74);
-
- points[1].x = st->x - (radius * 0.78);
- points[1].y = st->y + (radius * 0.75);
-
- points[2].x = st->x - (radius * 0.75);
- points[2].y = st->y + (radius * 0.78);
-
- XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
-}
-
-
-static void *
-compass_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- st->dpy = dpy;
- st->window = window;
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- st->dbuf = False;
-# endif
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
- st->size2 = MIN(st->xgwa.width, st->xgwa.height);
-
- if (st->xgwa.width > st->xgwa.height * 5 || /* goofy aspect ratio */
- st->xgwa.height > st->xgwa.width * 5)
- st->size2 = MAX(st->xgwa.width, st->xgwa.height);
-
- {
- int max = 600;
- if (st->xgwa.width > 2560) max *= 2; /* Retina displays */
- if (st->size2 > max) st->size2 = max;
- }
-
- st->size = (st->size2 / 2) * 0.8;
-
- st->x = st->xgwa.width/2;
- st->y = st->xgwa.height/2;
-
- if (st->dbuf)
- {
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- st->b = st->backb = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- if (!st->b)
- {
- st->x = st->size2/2;
- st->y = st->size2/2;
- st->ba = XCreatePixmap (st->dpy, st->window, st->size2, st->size2, st->xgwa.depth);
- st->bb = XCreatePixmap (st->dpy, st->window, st->size2, st->size2, st->xgwa.depth);
- st->b = st->ba;
- }
- }
- else
- {
- st->b = st->window;
- }
-
- st->discs[0] = (struct disc *) calloc (1, sizeof (struct disc));
- st->discs[1] = (struct disc *) calloc (1, sizeof (struct disc));
- st->discs[2] = (struct disc *) calloc (1, sizeof (struct disc));
- st->discs[3] = 0;
-
- gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- gcv.line_width = MAX(2, (st->size/60));
- gcv.join_style = JoinBevel;
- st->discs[0]->draw = draw_ticks;
- st->discs[0]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth|GCJoinStyle,
- &gcv);
- init_spin (st->discs[0]);
-
- gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "arrow2Foreground", "Foreground");
- gcv.line_width = MAX(4, (st->size / 30));
- st->discs[1]->draw = draw_thick_arrow;
- st->discs[1]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
- init_spin (st->discs[1]);
-
- gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "arrow1Foreground", "Foreground");
- gcv.line_width = MAX(4, (st->size / 30));
- st->discs[2]->draw = draw_thin_arrow;
- st->discs[2]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
- init_spin (st->discs[2]);
-
- gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "pointerForeground", "Foreground");
- st->ptr_gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
-
- gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "background", "Background");
- st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &gcv);
-
- if (st->ba) XFillRectangle (st->dpy, st->ba, st->erase_gc, 0, 0, st->size2, st->size2);
- if (st->bb) XFillRectangle (st->dpy, st->bb, st->erase_gc, 0, 0, st->size2, st->size2);
-
- return st;
-}
-
-static unsigned long
-compass_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
-
- draw_compass (st);
- draw_pointer (st);
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (st->backb)
- {
- XdbeSwapInfo info[1];
- info[0].swap_window = st->window;
- info[0].swap_action = XdbeUndefined;
- XdbeSwapBuffers (st->dpy, info, 1);
- }
- else
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- if (st->dbuf)
- {
- XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0,
- st->size2, st->size2,
- st->xgwa.width/2 - st->x,
- st->xgwa.height/2 - st->y);
- st->b = (st->b == st->ba ? st->bb : st->ba);
- }
-
- return st->delay;
-}
-
-static void
-compass_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
- st->size2 = MIN(st->xgwa.width, st->xgwa.height);
- st->x = st->xgwa.width/2;
- st->y = st->xgwa.height/2;
-}
-
-static Bool
-compass_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-compass_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
- XFreeGC (dpy, st->ptr_gc);
- XFreeGC (dpy, st->erase_gc);
- for (i = 0; i < 4; i++)
- if (st->discs[i]) {
- XFreeGC (dpy, st->discs[i]->gc);
- free (st->discs[i]);
- }
- if (st->ba) XFreePixmap (dpy, st->ba);
- if (st->bb) XFreePixmap (dpy, st->bb);
- free (st);
-}
-
-
-
-static const char *compass_defaults [] = {
- ".background: #000000",
- ".foreground: #DDFFFF",
- "*arrow1Foreground: #FFF66A",
- "*arrow2Foreground: #F7D64A",
- "*pointerForeground: #FF0000",
- "*delay: 20000",
- "*doubleBuffer: True",
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- "*useDBE: True",
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- 0
-};
-
-static XrmOptionDescRec compass_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
- { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Compass", compass)
diff --git a/hacks/compass.man b/hacks/compass.man
deleted file mode 100644
index 13ffde4..0000000
--- a/hacks/compass.man
+++ /dev/null
@@ -1,57 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-compass \- draws a spinning compass.
-.SH SYNOPSIS
-.B compass
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-no-db]
-[\-fps]
-.SH DESCRIPTION
-This draws a compass, with all elements spinning about randomly, for that
-``lost and nauseous'' feeling.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-db | \-no-db
-Double Buffer. Boolean.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com
deleted file mode 100644
index caf116c..0000000
--- a/hacks/compile_axp.com
+++ /dev/null
@@ -1,158 +0,0 @@
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ABSTRACTILE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV-CLI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMOTAXIS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2-MAIN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CWAVES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELAUNAY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FILMLEADER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GLITCHPEG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERAGGREGATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERMOMENTARY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JUGGLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LCDSCRUB.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) M6502.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MEMSCROLLER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_AI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_LEVEL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PONG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTZOOMER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCOOTER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPEEDMINE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SUBSTRATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESSELLIMAGE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESTX11.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) THORNBIRD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TWANG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VERMICULATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VFEEDBACK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-COCOA.M
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER-COCOA.M
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLWINDWARP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XIMAGE-LOADER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XRAYSWARM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSPIROGRAPH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSUBLIM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ZOOM.C
diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com
deleted file mode 100644
index caf116c..0000000
--- a/hacks/compile_decc.com
+++ /dev/null
@@ -1,158 +0,0 @@
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ABSTRACTILE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV-CLI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMOTAXIS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2-MAIN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CWAVES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELAUNAY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FILMLEADER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GLITCHPEG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERAGGREGATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERMOMENTARY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JUGGLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LCDSCRUB.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) M6502.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MEMSCROLLER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_AI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_LEVEL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PONG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTZOOMER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCOOTER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPEEDMINE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SUBSTRATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESSELLIMAGE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESTX11.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) THORNBIRD.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TWANG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VERMICULATE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VFEEDBACK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-COCOA.M
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER-COCOA.M
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLWINDWARP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XIMAGE-LOADER.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XRAYSWARM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSPIROGRAPH.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSUBLIM.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ZOOM.C
diff --git a/hacks/config/README b/hacks/config/README
deleted file mode 100644
index b031323..0000000
--- a/hacks/config/README
+++ /dev/null
@@ -1,265 +0,0 @@
-
- XScreenSaver
-
- a screen saver and locker for the X window system
- by Jamie Zawinski
-
- version 6.00
- 01-Apr-2021
-
- https://www.jwz.org/xscreensaver/
-
------------------------------------------------------------------------
-
-This directory contains XML files that describe each of the screenhacks;
-the per-hack user interface is constructed based on the things in these
-files. The files are loaded at run-time by "xscreensaver-settings".
-
-The tags and parameters used here are:
-
------------------------------------------------------------------------
-
- <screensaver name="PROGRAM-NAME" _label="PRETTY NAME">
- ...
- </screensaver>
-
- This encloses the whole file: all of the tags described below
- are inside this one.
-
------------------------------------------------------------------------
-
- <command arg="-SWITCH"/>
-
- specifies that "-SWITCH" always appears on the command line.
- You'll most often see this with "-root".
-
------------------------------------------------------------------------
-
- <boolean id="SYMBOLIC NAME"
- _label="USER VISIBLE STRING"
- arg-set="-SWITCH-A"
- arg-unset="-SWITCH-B"
- />
-
- This creates a checkbox.
-
- "id" is currently unused, but may eventually be used for
- letting other widgets refer to this one.
-
- "_label" is the string printed next to the checkbox.
-
- "arg-set" is what to insert into the command line if the
- box is checked.
-
- "arg-unset" is what to insert into the command line if the
- box is unchecked.
-
- You will probably never specify both "arg-set" and "arg-unset",
- because the setting that is the default should insert nothing
- into the command line (that's what makes it the default.)
- For example:
-
- <boolean _label="foo" arg-set="-foo" />
-
- or if "foo" is the default, and must be explicity turned off,
-
- <boolean _label="foo" arg-unset="-no-foo" />
-
------------------------------------------------------------------------
-
- <number id="SYMBOLIC NAME"
- type="slider"
- arg="-SWITCH %"
- _label="HEADING LABEL"
- _low-label="LEFT LABEL"
- _high-label="RIGHT LABEL"
- low="MIN VALUE"
- high="MAX VALUE"
- step="MODULUS"
- default="DEFAULT VALUE"
- [ convert="invert" ]
- />
-
- This creates a slider.
-
- The _label is printed above the slider. The _low-label and
- _high-label are printed to the left and right, respectively.
-
- If any of the numbers you type has a decimal point, then
- the range is assumed to be a floating-point value; otherwise,
- only integral values will be used. So be careful about "1"
- versus "1.0".
-
- If convert="invert" is specified, then the value that the
- user tweaks goes the other way from the value the command
- line expects: e.g., if the slider goes from 10-20 and the
- user picks 13, the converted value goes from 20-10 (and
- would be 17.) This is useful for converting between the
- concepts of "delay" and "speed".
-
- In the "arg" string, the first occurence of "%" is replaced
- with the numeric value, when creating the command line.
-
------------------------------------------------------------------------
-
- <number id="SYMBOLIC NAME"
- type="spinbutton"
- arg="-SWITCH %"
- _label="HEADING LABEL"
- low="MIN VALUE"
- high="MAX VALUE"
- default="DEFAULT VALUE"
- [ convert="invert" ]
- />
-
- This creates a spinbox (a text field with a number in it,
- and up/down arrows next to it.)
-
- Arguments are exactly like type="slider", except that
- _low-label and _high-label are not used. Also, _label
- appears to the left of the box, instead of above it.
-
------------------------------------------------------------------------
-
- <select id="SYMBOLIC NAME">
- <option id="SYMBOLIC NAME"
- _label="USER VISIBLE STRING"
- arg-set="-SWITCH"
- />
- [ ... more <options> ... ]
- </select>
-
- This creates a selection popup menu.
-
- Options should have arg-set (arg-unset is not used here.)
-
- One of the menu items (the default) should have no arg-set.
-
- Each arg-set should begin with the same switch: that is,
- all the args in a given menu should look like:
-
- -mode one
- -mode two
- -mode three
-
- and not
-
- -this
- -that
- -the other
-
------------------------------------------------------------------------
-
- <string id="SYMBOLIC NAME"
- _label="USER VISIBLE STRING"
- arg="-SWITCH %"
- />
-
- This creates a text entry field.
-
------------------------------------------------------------------------
-
- <file id="SYMBOLIC NAME"
- _label="USER VISIBLE STRING"
- arg="-SWITCH %"
- />
-
- This creates a file entry field (a text field with a "Browse"
- button next to it.)
-
------------------------------------------------------------------------
-
- <xscreensaver-text />
-
- This indicates that this screen saver displays text via the
- "xscreensaver-text" program.
-
- In the X11 version, this tag does nothing: the text-related
- preferences are in the main Screen Saver Preferences window,
- not in the per-display-mode preferences.
-
- In the MacOS version, the text-related preferences appear
- in this pane, and this tag emits those several controls.
-
------------------------------------------------------------------------
-
- <xscreensaver-image />
-
- This indicates that this screen saver displays images via the
- "xscreensaver-getimage" program.
-
- In the X11 version, this tag does nothing: the image-loading
- and screen-grabbing-related preferences are in the main
- Screen Saver Preferences window, not in the per-display-mode
- preferences.
-
- In the MacOS version, the image-related preferences appear
- in this pane, and this tag emits those several controls.
-
------------------------------------------------------------------------
-
- <xscreensaver-updater />
-
- Where to position the "Check for Updates" options.
- This is used on MacOS and ignored on X11.
-
------------------------------------------------------------------------
-
- <video href="URL" />
-
- A link to a Youtube preview of this screen saver.
-
------------------------------------------------------------------------
-
- <hgroup>
- [ ... <boolean>s ... ]
- [ ... <number>s ... ]
- [ ... <select>s ... ]
- [ ... <string>s ... ]
- [ ... <file>s ... ]
- [ ... <vgroup>s ... ]
- </hgroup>
-
- A horizontal group of widgets/groups. No more than 4 widgets
- or groups should be used in a row.
-
------------------------------------------------------------------------
-
- <vgroup>
- [ ... <boolean>s ... ]
- [ ... <number>s ... ]
- [ ... <select>s ... ]
- [ ... <string>s ... ]
- [ ... <file>s ... ]
- [ ... <hgroup>s ... ]
- </vgroup>
-
- A vertical group of widgets/groups. No more than 10 widgets
- or groups should be used in a column.
-
- Since the default alignment of widgets is a column, the
- <vgroup> element is only of use inside an <hgroup> element.
-
------------------------------------------------------------------------
-
- <_description>
- FREE TEXT
- </_description>
-
- This is the description of the hack that appears in the right
- part of the window. Lines are wrapped; paragraphs are separated
- by blank lines. Lines that begin with whitespace will not be
- wrapped (see "munch.xml" for an example of why.)
-
- Make sure you use "&lt;" instead of "<", etc. Character
- entities are allowed; HTML (and other markup) is not.
-
------------------------------------------------------------------------
-
-Those tags and parameters whose names begin with an underscore contain
-strings that are translatable via the ../../po/ directory.
-
-If you are DTD-minded, you may also find the included files "xss.dtd"
-and "xss.xsd" useful.
-
------------------------------------------------------------------------
diff --git a/hacks/config/abstractile.xml b/hacks/config/abstractile.xml
deleted file mode 100644
index c706330..0000000
--- a/hacks/config/abstractile.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="abstractile" _label="Abstractile">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=NgSetBY6VP4"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0" high="5" default="3"/>
-
- <number id="sleep" type="slider" arg="-sleep %"
- _label="Linger" _low-label="0 seconds" _high-label="60 seconds"
- low="0" high="60" default="3"/>
-
- <select id="tile">
- <option id="random" _label="Random tile layout"/>
- <option id="random" _label="Flat tiles" arg-set="-tile flat"/>
- <option id="random" _label="Thin tiles" arg-set="-tile thin"/>
- <option id="random" _label="Outline tiles" arg-set="-tile outline"/>
- <option id="random" _label="Block tiles" arg-set="-tile block"/>
- <option id="random" _label="Neon tiles" arg-set="-tile neon"/>
- <option id="random" _label="Tiled tiles" arg-set="-tile tiled"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Mosaic patterns of interlocking tiles.
-
-Written by Steve Sundstrom; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/anemone.xml b/hacks/config/anemone.xml
deleted file mode 100644
index 90dff7a..0000000
--- a/hacks/config/anemone.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="anemone" _label="Anemone">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=usITxM2YJZs"/>
-
-<!--
- -withdraw 1200
- -turnspeed 50
--->
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0" high="80000" default="40000"
- convert="invert"/>
-
- <number id="arms" type="slider" arg="-arms %"
- _label="Arms" _low-label="Few" _high-label="Many"
- low="2" high="500" default="128"/>
-
- <number id="finpoints" type="slider" arg="-finpoints %"
- _label="Tentacles" _low-label="Few" _high-label="Many"
- low="3" high="200" default="64"/>
- </vgroup>
-
- <vgroup>
- <number id="width" type="slider" arg="-width %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="1" high="10" default="2"/>
-
- <number id="withdraw" type="slider" arg="-withdraw %"
- _label="Withdraw freqency" _low-label="Often" _high-label="Rarely"
- low="12" high="10000" default="1200"/>
-
- <number id="turnspeed" type="slider" arg="-turnspeed %"
- _label="Turn speed" _low-label="Slow" _high-label="Fast"
- low="0" high="1000" default="50"/>
-
- <!--
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="255" default="64"/>
- -->
-
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Wiggling tentacles.
-
-Written by Gabriel Finch; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/anemotaxis.xml b/hacks/config/anemotaxis.xml
deleted file mode 100644
index 6c3785f..0000000
--- a/hacks/config/anemotaxis.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="anemotaxis" _label="Anemotaxis">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=hIqmIQbQkW8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="distance" type="slider" arg="-distance %"
- _label="Distance" _low-label="Near" _high-label="Far"
- low="10" high="250" default="40"/>
-
- <number id="sources" type="slider" arg="-sources %"
- _label="Sources" _low-label="Few" _high-label="Many"
- low="1" high="100" default="25"/>
-
- <number id="searchers" type="slider" arg="-searchers %"
- _label="Searchers" _low-label="Few" _high-label="Many"
- low="1" high="100" default="25"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Searches for a source of odor in a turbulent atmosphere. The searcher
-is able to sense the odor and determine local instantaneous wind
-direction. The goal is to find the source in the shortest mean time.
-
-https://en.wikipedia.org/wiki/Anemotaxis
-
-Written by Eugene Balkovsky; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/ant.xml b/hacks/config/ant.xml
deleted file mode 100644
index 8bb7423..0000000
--- a/hacks/config/ant.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="ant" _label="Ant">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=PaG7RCO4ezs"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="800000" default="40000"/>
-
- <hgroup>
- <boolean id="sharpturn" _label="Sharp turns" arg-set="-sharpturn"/>
- <boolean id="truchet" _label="Truchet lines" arg-set="-truchet"/>
- <boolean id="eyes" _label="Draw eyes" arg-set="-eyes"/>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Three" _high-label="Many"
- low="3" high="255" default="64"/>
-
-
- <hgroup>
- <number id="count" type="spinbutton" arg="-count %"
- _label="Ants count" low="-20" high="20" default="-3"/>
- <number id="size" type="spinbutton" arg="-size %"
- _label="Ant size" low="-18" high="18" default="-12"/>
- </hgroup>
-
- <select id="neighbors">
- <option id="rand" _label="Random cell shape"/>
- <option id="three" _label="Three sided cells"
- arg-set="-neighbors 3"/>
- <option id="four" _label="Four sided cells"
- arg-set="-neighbors 4"/>
- <option id="six" _label="Six sided cells"
- arg-set="-neighbors 6"/>
- <option id="nine" _label="Nine sided cells"
- arg-set="-neighbors 9"/>
- <option id="twelve" _label="Twelve sided cells"
- arg-set="-neighbors 12"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 4.22.
-
-A cellular automaton that is really a two-dimensional Turing machine:
-as the heads ("ants") walk along the screen, they change pixel
-values in their path. Then, as they pass over changed pixels, their
-behavior is influenced.
-
-https://en.wikipedia.org/wiki/Langton%27s_ant
-https://en.wikipedia.org/wiki/Turing_machine
-
-Written by David Bagley; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/antinspect.xml b/hacks/config/antinspect.xml
deleted file mode 100644
index 9878e6b..0000000
--- a/hacks/config/antinspect.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="antinspect" _label="Ant Inspect" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Ecw9dDc0db0"/>
-
- <number id="speed" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <boolean id="shadows" _label="Draw shadows" arg-set="-shadows"/>
-
- <xscreensaver-updater />
-
- <_description>
-Ants move spheres around a circle.
-
-Written by Blair Tennessy; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/antmaze.xml b/hacks/config/antmaze.xml
deleted file mode 100644
index 3344c24..0000000
--- a/hacks/config/antmaze.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="antmaze" _label="Ant Maze" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Bwa5-n6UUj8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Ants walk around a simple maze.
-
-Written by Blair Tennessy; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/antspotlight.xml b/hacks/config/antspotlight.xml
deleted file mode 100644
index 3df385c..0000000
--- a/hacks/config/antspotlight.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="antspotlight" _label="Ant Spotlight" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=NYisFYtODTA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <xscreensaver-image />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-An ant walks over an image.
-
-Written by Blair Tennessy; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/apollonian.xml b/hacks/config/apollonian.xml
deleted file mode 100644
index 72d0e41..0000000
--- a/hacks/config/apollonian.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="apollonian" _label="Apollonian">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=aeWnjSROR8U"/>
-
- <boolean id="label" _label="Draw labels" arg-unset="-no-label"/>
-
- <boolean id="altgeom" _label="Include alternate geometries"
- arg-unset="-no-altgeom"/>
-
-<!-- don't know what -count does -->
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Depth" _low-label="Shallow" _high-label="Deep"
- low="1" high="20" default="20"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="255" default="64"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0" high="1000000" default="1000000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A fractal packing of circles with smaller circles, demonstrating
-Descartes's theorem.
-
-https://en.wikipedia.org/wiki/Apollonian_gasket
-https://en.wikipedia.org/wiki/Descartes%27_theorem
-
-Written by Allan R. Wilks and David Bagley; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/apple2.xml b/hacks/config/apple2.xml
deleted file mode 100644
index dcfa241..0000000
--- a/hacks/config/apple2.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="apple2" _label="Apple ][">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=p3QZqhp67l8"/>
-
- <hgroup>
- <vgroup>
- <select id="mode">
- <option id="random" _label="Choose display mode randomly"/>
- <option id="text" _label="Display scrolling text" arg-set="-mode text"/>
- <option id="slideshow" _label="Display images" arg-set="-mode slideshow"/>
- <option id="basic" _label="Run basic programs" arg-set="-mode basic"/>
- </select>
-
- <xscreensaver-text />
- </vgroup>
- <vgroup>
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="60"/>
-
- <xscreensaver-image />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <xscreensaver-updater />
- </vgroup>
-
- <vgroup>
- <number id="tvcolor" type="slider" arg="-tv-color %"
- _label="Color Knob" _low-label="Low" _high-label="High"
- low="0" high="400" default="70"/>
- <number id="tvtint" type="slider" arg="-tv-tint %"
- _label="Tint Knob" _low-label="Low" _high-label="High"
- low="0" high="360" default="5"/>
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="3.0"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="500" default="150"/>
- </vgroup>
- </hgroup>
-
- <_description>
-An Apple ][+ computer simulation, in all its 1979 glory. It also
-reproduces the appearance of display on a color television set of the
-period.
-
-In "Basic Programming Mode", a simulated user types in a BASIC program
-and runs it. In "Text Mode", it displays the output of a program, or
-the contents of a file or URL. In "Slideshow Mode", it chooses random
-images and displays them within the limitations of the Apple ][
-display hardware. (Six available colors in hi-res mode!)
-
-On MacOS and Linux, this program is also a fully-functional VT100
-emulator! Run it as an application instead of as a screen saver and
-you can use it as a terminal.
-
-https://en.wikipedia.org/wiki/Apple_II_series
-
-Written by Trevor Blackwell and Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/atlantis.xml b/hacks/config/atlantis.xml
deleted file mode 100644
index 2e06b85..0000000
--- a/hacks/config/atlantis.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="atlantis" _label="Atlantis" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=U78xPez5UGg"/>
-
- <number id="sharkspeed" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
-
- <number id="whalespeed" type="slider" arg="-whalespeed %"
- _label="Whale speed" _low-label="Slow" _high-label="Fast"
- low="0" high="1000" default="250"/>
-
- <number id="sharkproximity" type="slider" arg="-size %"
- _label="Shark proximity" _low-label="Shy" _high-label="Agressive"
- low="100" high="10000" default="6000"/>
-
- <number id="sharkcount" type="slider" arg="-count %"
- _label="Number of sharks" _low-label="None" _high-label="20"
- low="0" high="20" default="4"/>
-
- <hgroup>
- <select id="water">
- <option id="shimmer" _label="Shimmering water"/>
- <option id="clear" _label="Clear water" arg-set="-no-texture"/>
- </select>
-
- <select id="bg">
- <option id="flat" _label="Flat background" arg-set="-no-gradient"/>
- <option id="gradient" _label="Gradient background"/>
- </select>
- </hgroup>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Sharks, dolphins and whales.
-
-Written by Mark Kilgard; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/attraction.xml b/hacks/config/attraction.xml
deleted file mode 100644
index b0ca4ae..0000000
--- a/hacks/config/attraction.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="attraction" _label="Attraction">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=KAT9nkXCdms"/>
-
- <hgroup>
- <select id="mode">
- <option id="balls" _label="Balls"/>
- <option id="lines" _label="Lines" arg-set="-mode lines"/>
- <option id="tails" _label="Tails" arg-set="-mode tails"/>
- <option id="polygons" _label="Polygons" arg-set="-mode polygons"/>
- <option id="splines" _label="Splines" arg-set="-mode splines"/>
- <option id="fsplines" _label="Filled splines"
- arg-set="-mode filled-splines"/>
- </select>
-
- <select id="wallmode">
- <option id="walls" _label="Bounce off walls"/>
- <option id="nowalls" _label="Ignore screen edges" arg-set="-nowalls"/>
- </select>
-
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="points" type="spinbutton" arg="-points %"
- _label="Ball count" low="0" high="200" default="0"/>
- <number id="viscosity" type="slider" arg="-viscosity %"
- _label="Environmental viscosity"
- _low-label="Low" _high-label="High"
- low="0.0" high="1.0" default="1.0"
- convert="invert"/>
- <number id="segments" type="slider" arg="-segments %"
- _label="Trail length" _low-label="Short" _high-label="Long"
- low="2" high="1000" default="500"/>
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
- </vgroup>
- <vgroup>
- <number id="size" type="slider" arg="-size %"
- _low-label="Ball mass" _high-label="High"
- low="0" high="100" default="0"/>
- <number id="threshold" type="slider" arg="-threshold %"
- _label="Repulsion threshold"
- _low-label="Small" _high-label="Large"
- low="0" high="600" default="200"/>
- <number id="delay" type="slider" arg="-delay %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0" high="40000" default="10000"
- convert="invert"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="orbit" _label="Orbital mode" arg-set="-orbit"/>
- <number id="radius" type="spinbutton" arg="-radius %"
- _label="Radius" low="0" high="1000" default="0"/>
- <number id="vmult" type="slider" arg="-vmult %"
- _low-label="Outward" _high-label="Inward"
- low="-5.0" high="5.0" default="0.9"/>
- </hgroup>
-
- <!-- #### -vx [?] -->
- <!-- #### -vy [?] -->
- <!-- #### -glow -->
- <!-- #### -nomaxspeed -->
- <!-- #### -correct-bounce -->
- <!-- #### -graphmode [none] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-
-Points attract each other up to a certain distance, and then begin to
-repel each other. The attraction/repulsion is proportional to the
-distance between any two particles, similar to the strong and weak
-nuclear forces.
-
-Written by Jamie Zawinski and John Pezaris; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/atunnel.xml b/hacks/config/atunnel.xml
deleted file mode 100644
index eea3b96..0000000
--- a/hacks/config/atunnel.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="atunnel" _label="Atunnel" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=mpCRbi3jkuc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="light" _label="Lighting" arg-set="-light"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Zooming through a textured tunnel.
-
-Written by Eric Lassauge and Roman Podobedov; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/barcode.xml b/hacks/config/barcode.xml
deleted file mode 100644
index 76fca28..0000000
--- a/hacks/config/barcode.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="barcode" _label="Barcode">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=gmtAySJdsfg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <select id="mode">
- <option id="scroll" _label="Scrolling barcodes"/>
- <option id="scroll" _label="Barcode grid" arg-set="-mode grid"/>
- <option id="clock12" _label="Barcode clock (AM/PM)" arg-set="-mode clock12"/>
- <option id="clock24" _label="Barcode clock (24 hour)" arg-set="-mode clock24"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Colorful scrolling barcodes. CONSUME!
-
-The barcodes follow the UPC-A, UPC-E, EAN-8 or EAN-13 standards.
-
-https://en.wikipedia.org/wiki/Universal_Product_Code
-https://en.wikipedia.org/wiki/European_Article_Number
-
-Written by Dan Bornstein and Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/beats.xml b/hacks/config/beats.xml
deleted file mode 100644
index 581ebf9..0000000
--- a/hacks/config/beats.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="beats" _label="Beats" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=u7N5l0LXryg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of balls" _low-label="Few" _high-label="Many"
- low="1" high="100" default="30"/>
-
- <select id="cycle">
- <option id="random" _label="Random cycle style"/>
- <option _label="Clockwise cycle" arg-set="-cycle 0"/>
- <option _label="Rain dance cycle" arg-set="-cycle 1"/>
- <option _label="Metronome cycle" arg-set="-cycle 2"/>
- <option _label="Galaxy cycle" arg-set="-cycle 3"/>
- </select>
-
- <hgroup>
- <boolean id="tick" _label="Tick" arg-unset="-no-tick"/>
- <boolean id="blur" _label="Motion Blur" arg-unset="-no-blur"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Draws figures that move around at a slightly different rate from
-each other, creating interesting chaotic and ordered patterns.
-
-Written by David Eccles; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/binaryring.xml b/hacks/config/binaryring.xml
deleted file mode 100644
index 479d40e..0000000
--- a/hacks/config/binaryring.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="binaryring" _label="Binary Ring">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=KPiJb0Qm1SE"/>
-
- <number id="growth-delay" type="slider" arg="-growth-delay %"
- _label="Growth delay" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000" />
-
- <number id="ring-radius" type="slider" arg="-ring-radius %"
- _label="Ring Radius" _low-label="Short" _high-label="Long"
- low="0" high="400" default="40" />
-
- <number id="particles-number" type="slider" arg="-particles-number %"
- _label="Number of particles" _low-label="Few" _high-label="Lots"
- low="500" high="20000" default="5000" />
-
- <boolean id="color" _label="Fade with colors" arg-unset="-no-color"/>
-
- <xscreensaver-updater />
-
- <_description>
-A system of path tracing particles evolves continuously from an
-initial creation, alternating dark and light colors.
-
-Written by J. Tarbell and Emilio Del Tessandoro; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/blaster.xml b/hacks/config/blaster.xml
deleted file mode 100644
index d7cb42d..0000000
--- a/hacks/config/blaster.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="blaster" _label="Blaster">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=bp3J3si2Hr0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="num_robots" type="spinbutton" arg="-num_robots %"
- _label="Robots" low="2" high="50" default="5"/>
-
- <number id="num_lasers" type="spinbutton" arg="-num_lasers %"
- _label="Lasers" low="1" high="100" default="3"/>
-
- <number id="num_stars" type="slider" arg="-num_stars %"
- _label="Stars" _low-label="Few" _high-label="Many"
- low="5" high="200" default="50"/>
-
- <!-- #### -move_stars_x [2] -->
- <!-- #### -move_stars_y [1] -->
- <!-- #### -move_stars_random [0] -->
- <!-- #### -star_color [white] -->
-
- <!-- #### -explode_size_1 [27] -->
- <!-- #### -explode_size_2 [19] -->
- <!-- #### -explode_size_3 [7] -->
- <!-- #### -explode_color_1 [yellow] -->
- <!-- #### -explode_color_2 [orange] -->
-
- <!-- #### -r_color0 [magenta] -->
- <!-- #### -r_color1 [orange] -->
- <!-- #### -r_color2 [yellow] -->
- <!-- #### -r_color3 [white] -->
- <!-- #### -r_color4 [blue] -->
- <!-- #### -r_color5 [cyan] -->
- <!-- #### -l_color0 [green] -->
- <!-- #### -l_color1 [red] -->
-
- <!-- #### -mother_ship -->
- <!-- #### -mother_ship_width [25] -->
- <!-- #### -mother_ship_height [7] -->
- <!-- #### -mother_ship_laser [15] -->
- <!-- #### -mother_ship_period [150] -->
- <!-- #### -mother_ship_hits [10] -->
- <!-- #### -mother_ship_color0 [darkblue] -->
- <!-- #### -mother_ship_color1 [white] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Flying space-combat robots (cleverly disguised as colored circles)
-do battle in front of a moving star field.
-
-Written by Jonathan Lin; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/blinkbox.xml b/hacks/config/blinkbox.xml
deleted file mode 100644
index 0f84baf..0000000
--- a/hacks/config/blinkbox.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="blinkbox" _label="Blink Box" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=lgjbHMcSd8U"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="boxsize" type="slider" arg="-boxsize %"
- _label="Box size" _low-label="Small" _high-label="Large"
- low="1" high="8" default="2"/>
-
- <hgroup>
- <boolean id="fade" _label="Fade" arg-unset="-no-fade"/>
- <boolean id="blur" _label="Motion blur" arg-unset="-no-blur"/>
- <boolean id="dissolve" _label="Dissolve" arg-set="-dissolve"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A motion-blurred ball bounces inside a box whose tiles only become
-visible upon impact.
-
-Written by Jeremy English; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/blitspin.xml b/hacks/config/blitspin.xml
deleted file mode 100644
index 34b182f..0000000
--- a/hacks/config/blitspin.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="blitspin" _label="Blit Spin">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=UTtcwb-UWW8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Fuzzy rotation speed" _low-label="Slow" _high-label="Fast"
- low="1" high="800000" default="500000"
- convert="invert"/>
-
- <number id="delay2" type="slider" arg="-delay2 %"
- _label="90 degree rotation speed" _low-label="Slow" _high-label="Fast"
- low="1" high="800000" default="500000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
- </vgroup>
-
- <vgroup>
- <!-- <file id="bitmap" _label="Bitmap to rotate" arg="-bitmap %"/> -->
- <xscreensaver-image />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-
-Repeatedly rotates a bitmap by 90 degrees by using logical operations:
-the bitmap is divided into quadrants, and the quadrants are shifted
-clockwise. Then the same thing is done again with progressively
-smaller quadrants, except that all sub-quadrants of a given size are
-rotated in parallel. As you watch it, the image appears to dissolve
-into static and then reconstitute itself, but rotated.
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/blocktube.xml b/hacks/config/blocktube.xml
deleted file mode 100644
index 87d91c1..0000000
--- a/hacks/config/blocktube.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="blocktube" _label="Block Tube" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=L0JUBhpZlMw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="40000"
- convert="invert"/>
-
- <number id="holdtime" type="slider" arg="-holdtime %"
- _label="Color hold time" _low-label="Short" _high-label="Long"
- low="10" high="2000" default="1000"/>
-
- <number id="changetime" type="slider" arg="-changetime %"
- _label="Color change time" _low-label="Short" _high-label="Long"
- low="10" high="1000" default="200"/>
-
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A swirling, falling tunnel of reflective slabs. They fade from hue to hue.
-
-Written by Lars R. Damerow; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/boing.xml b/hacks/config/boing.xml
deleted file mode 100644
index a36d1e2..0000000
--- a/hacks/config/boing.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="boing" _label="Boing" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=J3KAsV31d6M"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Size" _low-label="Tiny" _high-label="Huge"
- low="0.02" high="0.9" default="0.5"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10.0" default="1.0"/>
-
- <vgroup>
- <hgroup>
- <number id="meridians" type="spinbutton" arg="-meridians %"
- _label="Meridians" low="1" high="90" default="16"/>
- <number id="parallels" type="spinbutton" arg="-parallels %"
- _label="Parallels" low="1" high="90" default="8"/>
- </hgroup>
- <hgroup>
- <boolean id="smoothing" _label="Smoothing" arg-set="-smooth"/>
- <boolean id="lighting" _label="Lighting" arg-set="-lighting"/>
- <boolean id="scanlines" _label="Scanlines" arg-unset="-no-scanlines"/>
- </hgroup>
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
- </vgroup>
-
- <xscreensaver-updater />
-
- <_description>
-
-A clone of the first graphics demo for the Amiga 1000, which was
-written by Dale Luck and RJ Mical during a break at the 1984 Consumer
-Electronics Show (or so the legend goes.)
-
-This looks like the original Amiga demo if you turn off "smoothing"
-and "lighting" and turn on "scanlines", and is somewhat more modern
-otherwise.
-
-https://en.wikipedia.org/wiki/Amiga#Boing_Ball
-
-Written by Jamie Zawinski; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/bouboule.xml b/hacks/config/bouboule.xml
deleted file mode 100644
index b28912e..0000000
--- a/hacks/config/bouboule.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="bouboule" _label="Bouboule">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=MdmIBmlkyFw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of spots" _low-label="Few" _high-label="Many"
- low="1" high="400" default="100"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="3d" _label="Do Red/Blue 3D separation" arg-unset="-no-3d"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A deforming balloon with varying-sized spots painted on its invisible surface.
-
-Written by Jeremie Petit; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/bouncingcow.xml b/hacks/config/bouncingcow.xml
deleted file mode 100644
index 48a1aed..0000000
--- a/hacks/config/bouncingcow.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="bouncingcow" _label="Bouncing Cow" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=O_b5UWhv49w"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Bounce speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="2.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of cows" _low-label="Moo" _high-label="Herd"
- low="1" high="9" default="1"/>
-
- <boolean id="mathematical"
- _label="Mathematically ideal cows (spherical, frictionless)"
- arg-set="-mathematical"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A Cow. A Trampoline. Together, they fight crime.
-
-Written by Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/boxed.xml b/hacks/config/boxed.xml
deleted file mode 100644
index b2926f0..0000000
--- a/hacks/config/boxed.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="boxed" _label="Boxed" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=CU4QFtZm9So"/>
-
- <hgroup>
- <vgroup>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="15000"
- convert="invert"/>
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.001" high="4.0" default="0.5"/>
-
- <number id="balls" type="slider" arg="-balls %"
- _label="Number of balls" _low-label="Few" _high-label="Lots"
- low="3" high="40" default="20"/>
-
- <number id="ballsize" type="slider" arg="-ballsize %"
- _label="Ball size" _low-label="Tiny" _high-label="Huge"
- low="1.0" high="5.0" default="3.0"/>
-
- </vgroup>
-
- <vgroup>
-
- <number id="explosion" type="slider" arg="-explosion %"
- _label="Explosion force" _low-label="Popcorn" _high-label="Nuke"
- low="1.0" high="50.0" default="15.0"/>
-
- <number id="decay" type="slider" arg="-decay %"
- _label="Explosion decay" _low-label="Linger" _high-label="Pop!"
- low="0.0" high="1.0" default="0.07"/>
-
- <number id="momentum" type="slider" arg="-momentum %"
- _label="Explosion momentum" _low-label="None" _high-label="Full"
- low="0.0" high="1.0" default="0.6"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
-
- </vgroup>
- </hgroup>
-
-
- <xscreensaver-updater />
-
- <_description>
-A box full of 3D bouncing balls that explode.
-
-Written by Sander van Grieken; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/boxfit.xml b/hacks/config/boxfit.xml
deleted file mode 100644
index b978a5d..0000000
--- a/hacks/config/boxfit.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="boxfit" _label="Box Fit">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=8GkcbBbcwBk"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <hgroup>
- <number id="count" type="spinbutton" arg="-count %"
- _label="Boxes" low="1" high="1000" default="50"/>
-
- <number id="growby" type="spinbutton" arg="-growby %"
- _label="Grow by" low="1" high="10" default="1"/>
- </hgroup>
-
- <hgroup>
- <number id="spacing" type="spinbutton" arg="-spacing %"
- _label="Spacing" low="1" high="10" default="1"/>
-
- <number id="border" type="spinbutton" arg="-border %"
- _label="Border" low="1" high="10" default="1"/>
- </hgroup>
-
- <hgroup>
- <select id="mode">
- <option id="random" _label="Boxes or circles"/>
- <option id="boxes" _label="Boxes only" arg-set="-mode squares"/>
- <option id="circles" _label="Circles only" arg-set="-mode circles"/>
- </select>
-
- <select id="mode2">
- <option id="gradient" _label="Color gradient"/>
- <option id="image" _label="Grab images" arg-set="-grab"/>
- </select>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <xscreensaver-image />
-
- <boolean id="peek" _label="Peek at underlying images" arg-set="-peek"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Packs the screen with growing squares or circles, colored according to
-a horizontal or vertical gradient, or according to the colors of a
-loaded image. The objects grow until they touch, then stop. When the
-screen is full, they shrink away and the process restarts.
-
-Written by Jamie Zawinski; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/braid.xml b/hacks/config/braid.xml
deleted file mode 100644
index b49fa22..0000000
--- a/hacks/config/braid.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="braid" _label="Braid">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=PUhJq56ViGM"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="1000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="0" high="500" default="100"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <hgroup>
- <number id="count" type="spinbutton" arg="-count %"
- _label="Number of rings" low="3" high="15" default="15"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Line thickness" low="-20" high="20" default="-7"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Inter-braided concentric circles.
-
-Written by John Neil; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/bsod.xml b/hacks/config/bsod.xml
deleted file mode 100644
index aa3dca1..0000000
--- a/hacks/config/bsod.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="bsod" _label="BSOD">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=YIqbMCfR3r0"/>
-
- <hgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
- low="5" high="120" default="45"/>
-<!-- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/> -->
- </hgroup>
-
- <hgroup>
- <vgroup>
- <boolean id="windows" _label="Windows 3.1" arg-unset="-no-windows"/>
- <boolean id="nt" _label="Windows NT" arg-unset="-no-nt"/>
- <boolean id="2k" _label="Windows 2000 " arg-unset="-no-2k"/>
- <boolean id="win10" _label="Windows 10 " arg-unset="-no-win10"/>
- </vgroup>
- <vgroup>
- <boolean id="msdos" _label="MS-DOS" arg-unset="-no-msdos"/>
- <boolean id="glados" _label="GLaDOS" arg-unset="-no-glados"/>
- <boolean id="amiga" _label="AmigaDOS" arg-unset="-no-amiga"/>
- <boolean id="android" _label="Android" arg-set="-android"/>
- </vgroup>
- <vgroup>
- <boolean id="apple2" _label="Apple ][" arg-unset="-no-apple2"/>
- <boolean id="ransomware" _label="Ransomware" arg-unset="-no-ransomware"/>
- <boolean id="nvidia" _label="NVidia" arg-unset="-no-nvidia"/>
- <boolean id="os2" _label="OS/2" arg-unset="-no-os2"/>
- </vgroup>
- <vgroup>
- <boolean id="mac" _label="Sad Mac" arg-unset="-no-mac"/>
- <boolean id="mac1" _label="Mac bomb" arg-unset="-no-mac1"/>
- <boolean id="macsbug" _label="MacsBug" arg-unset="-no-macsbug"/>
- <boolean id="macx" _label="MacOS X" arg-unset="-no-macx"/>
- </vgroup>
- <vgroup>
- <boolean id="vmware" _label="VMware" arg-unset="-no-vmware"/>
- <boolean id="atari" _label="Atari" arg-set="-atari"/>
- <boolean id="os390" _label="OS/390" arg-unset="-no-os390"/>
- <boolean id="hvx" _label="HVX/GCOS" arg-unset="-no-hvx"/>
- </vgroup>
- <vgroup>
- <boolean id="encom" _label="Encom" arg-unset="-no-encom"/>
- <boolean id="blitdamage" _label="NCD XTerm" arg-unset="-no-blitdamage"/>
- <boolean id="atm" _label="ATM" arg-unset="-no-atm"/>
- <boolean id="dvd" _label="DVD" arg-unset="-no-dvd"/>
- </vgroup>
- <vgroup>
- <boolean id="nintendo" _label="Nintendo" arg-unset="-no-nintendo"/>
- <boolean id="tivo" _label="Tivo" arg-unset="-no-tivo"/>
- <boolean id="vms" _label="VMS" arg-unset="-no-vms"/>
- <boolean id="bsd" _label="BSD" arg-set="-bsd"/>
- </vgroup>
- <vgroup>
- <boolean id="linux" _label="Linux (fsck)" arg-unset="-no-linux"/>
- <boolean id="sparclinux" _label="Linux (sparc)" arg-set="-sparclinux"/>
- <boolean id="hppalinux" _label="Linux (hppa)" arg-unset="-no-hppalinux"/>
- <boolean id="solaris" _label="Solaris" arg-unset="-no-solaris"/>
- </vgroup>
- <vgroup>
- <boolean id="sco" _label="SCO" arg-unset="-no-sco"/>
- <boolean id="hpux" _label="HPUX" arg-unset="-no-hpux"/>
- <boolean id="tru64" _label="Tru64" arg-unset="-no-tru64"/>
- <boolean id="gnome" _label="GNOME" arg-unset="-no-gnome"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <xscreensaver-image />
- </vgroup>
- <xscreensaver-updater />
- </hgroup>
-
-<!--
- <hgroup>
- <vgroup>
- <number id="tvcolor" type="slider" arg="-tv-color %"
- _label="Color Knob" _low-label="Low" _high-label="High"
- low="0" high="400" default="70"/>
- <number id="tvtint" type="slider" arg="-tv-tint %"
- _label="Tint Knob" _low-label="Low" _high-label="High"
- low="0" high="360" default="5"/>
- </vgroup>
- <vgroup>
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="3.0"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="500" default="150"/>
- </vgroup>
- </hgroup>
--->
-
- <_description>
-BSOD stands for "Blue Screen of Death". The finest in personal
-computer emulation, BSOD simulates popular screen savers from a
-number of less robust operating systems.
-
-https://en.wikipedia.org/wiki/Blue_Screen_of_Death
-https://en.wikipedia.org/wiki/Screen_of_death
-https://en.wikipedia.org/wiki/Guru_Meditation
-https://en.wikipedia.org/wiki/Row_of_Bombs
-https://en.wikipedia.org/wiki/Bomb_%28symbol%29
-
-Written by Jamie Zawinski; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/bubble3d.xml b/hacks/config/bubble3d.xml
deleted file mode 100644
index bcc0f4b..0000000
--- a/hacks/config/bubble3d.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="bubble3d" _label="Bubble 3D" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=4vcj8sq9FO8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <boolean id="transp" _label="Transparent bubbles" arg-unset="-no-transparent"/>
- <select id="bubblecolor">
- <option id="random" _label="Random" />
- <option id="Red" _label="Amber" arg-set="-color #FF0000" />
- <option id="Green" _label="Green" arg-set="-color #00FF00" />
- <option id="Blue" _label="Blue" arg-set="-color #0000FF" />
- <option id="white" _label="White" arg-set="-color #FFFFFF" />
- </select>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <xscreensaver-updater />
-
- <_description>
-Rising, undulating 3D bubbles, with transparency and specular reflections.
-
-Written by Richard Jones; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/bubbles.xml b/hacks/config/bubbles.xml
deleted file mode 100644
index 86cb132..0000000
--- a/hacks/config/bubbles.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="bubbles" _label="Bubbles">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Mli1TjZY1YA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <boolean id="simple" _label="Draw circles instead of bubble images"
- arg-set="-simple"/>
-
- <boolean id="broken" _label="Don't hide bubbles when they pop"
- arg-set="-broken"/>
-
- <boolean id="trails" _label="Leave trails" arg-set="-trails"/>
-
- <select id="gravity">
- <option id="rise" _label="Bubbles rise" arg-set="-mode rise"/>
- <option id="float" _label="Bubbles float"/>
- <option id="drop" _label="Bubbles fall" arg-set="-mode drop"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-This simulates the kind of bubble formation that happens when water
-boils: small bubbles appear, and as they get closer to each other,
-they combine to form larger bubbles, which eventually pop.
-
-Written by James Macnicol; 1996.
- </_description>
-</screensaver>
diff --git a/hacks/config/bumps.xml b/hacks/config/bumps.xml
deleted file mode 100644
index 78ee969..0000000
--- a/hacks/config/bumps.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="bumps" _label="Bumps">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=IV7D-NYRCiU"/>
-
- <!-- #### -degrees [360] -->
- <!-- #### -color [random] -->
- <!-- #### -colorcount [64] -->
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <!-- #### -soften [1] -->
- <!-- #### -invert -->
-
- <xscreensaver-image />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A spotlight roams across an embossed version of a loaded image.
-
-Written by Shane Smit; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/cage.xml b/hacks/config/cage.xml
deleted file mode 100644
index 6fedb3c..0000000
--- a/hacks/config/cage.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="cage" _label="Cage" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=BxGHUFvI2Zo"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Escher's "Impossible Cage", a 3d analog of a möbius
-strip, and rotates it in three dimensions.
-
-https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
-
-Written by Marcelo Vianna; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/carousel.xml b/hacks/config/carousel.xml
deleted file mode 100644
index 6f9a79f..0000000
--- a/hacks/config/carousel.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="carousel" _label="Carousel" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=IyqWkGVrFIY"/>
-
- <hgroup>
- <vgroup>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Time until loading a new image"
- _low-label="5 seconds" _high-label="1 minute"
- low="5" high="60" default="20"/>
-
- </vgroup>
- <vgroup>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Number of images" low="1" high="20" default="7"/>
-
- <select id="mode">
- <option id="tiltxy" _label="Tilt in/out and left/right"/>
- <option id="tiltx" _label="Tilt in/out only" arg-set="-tilt x"/>
- <option id="tilty" _label="Tilt left/right only" arg-set="-tilt y"/>
- <option id="notilt" _label="No tilting" arg-set="-tilt 0"/>
- </select>
-
- <boolean id="zoom" _label="Zoom in/out" arg-unset="-no-zoom"/>
- <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-Loads several random images, and displays them flying in a circular
-formation. The formation changes speed and direction randomly, and
-images periodically drop out to be replaced by new ones.
-
-Written by Jamie Zawinski; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/ccurve.xml b/hacks/config/ccurve.xml
deleted file mode 100644
index 84a6121..0000000
--- a/hacks/config/ccurve.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="ccurve" _label="C Curve">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=zqIlWzUHOz8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Change image every" _low-label="0 seconds" _high-label="30 seconds"
- low="0" high="30" default="3"/>
-
- <number id="pause" type="slider" arg="-pause %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.0" high="5.0" default="0.4" convert="invert"/>
-
- <number id="limit" type="slider" arg="-limit %"
- _label="Density" _low-label="Low" _high-label="High"
- low="3" high="300000" default="200000"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Generates self-similar linear fractals, including the classic "C Curve".
-
-https://en.wikipedia.org/wiki/Levy_C_curve
-
-Written by Rick Campbell; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml
deleted file mode 100644
index f84d12b..0000000
--- a/hacks/config/celtic.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="celtic" _label="Celtic">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=PnX60AAoTdw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="delay2" type="slider" arg="-delay2 %"
- _label="Linger" _low-label="Short" _high-label="Long"
- low="0" high="10" default="5"/>
-
- <boolean id="graph" _label="Draw graph" arg-set="-graph"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Repeatedly draws random Celtic cross-stitch patterns.
-
-https://en.wikipedia.org/wiki/Celtic_knot
-https://en.wikipedia.org/wiki/Knots_and_graphs
-
-Written by Max Froumentin; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/circuit.xml b/hacks/config/circuit.xml
deleted file mode 100644
index 0605002..0000000
--- a/hacks/config/circuit.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="circuit" _label="Circuit" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=tfqR1j1OQs8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-parts %"
- _label="Parts" _low-label="One" _high-label="Lots"
- low="1" high="30" default="10"/>
-
- <number id="speed" type="slider" arg="-rotate-speed %"
- _label="Rotation speed" _low-label="Slow" _high-label="Fast"
- low="0" high="100" default="1"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
-
- <select id="render">
- <option id="flat" _label="Flat coloring" arg-set="-no-light"/>
- <option id="light" _label="Directional lighting"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Electronic components float around.
-
-Written by Ben Buxton; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/cityflow.xml b/hacks/config/cityflow.xml
deleted file mode 100644
index 4a94c35..0000000
--- a/hacks/config/cityflow.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cityflow" _label="City Flow" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=LJMtu-9T3U0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Boxes" _low-label="Few" _high-label="Many"
- low="50" high="4000" default="800"/>
-
- <number id="skew" type="slider" arg="-skew %"
- _label="Skew"
- _low-label="Low" _high-label="High"
- low="0" high="45" default="12"/>
- </vgroup>
-
- <vgroup>
- <number id="wave-speed" type="slider" arg="-wave-speed %"
- _label="Wave speed" _low-label="Slow" _high-label="Fast"
- low="5" high="150" default="25"/>
-
- <number id="wave-radius" type="slider" arg="-wave-radius %"
- _label="Wave overlap"
- _low-label="Small" _high-label="Large"
- low="5" high="512" default="256"/>
-
- <number id="waves" type="slider" arg="-waves %"
- _label="Wave complexity"
- _low-label="Low" _high-label="High"
- low="1" high="20" default="6"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
- </hgroup>
-
- <_description>
-Waves move across a sea of boxes. The city swells. The walls are closing in.
-
-Written by Jamie Zawinski; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/cloudlife.xml b/hacks/config/cloudlife.xml
deleted file mode 100644
index 92ea6c3..0000000
--- a/hacks/config/cloudlife.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cloudlife" _label="Cloud Life">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=TkVDO3nTTsE"/>
-
- <number id="delay" type="slider" arg="-cycle-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
-
- <number id="maxage" type="slider" arg="-max-age %"
- _label="Max age" _low-label="Young" _high-label="Old"
- low="2" high="255" default="64"/>
-
- <number id="density" type="slider" arg="-initial-density %"
- _label="Initial density" _low-label="Low" _high-label="High"
- low="1" high="99" default="30"/>
-
- <number id="cellsize" type="slider" arg="-cell-size %"
- _label="Cell size" _low-label="Small" _high-label="Large"
- low="1" high="20" default="3"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-
-Generates cloud-like formations based on a variant of Conway's Life. The
-difference is that cells have a maximum age, after which they count as
-3 for populating the next generation. This makes long-lived formations
-explode instead of just sitting there.
-
-https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
-
-Written by Don Marti; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/co____9.xml b/hacks/config/co____9.xml
deleted file mode 100644
index f1dc4bb..0000000
--- a/hacks/config/co____9.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="co____9" _label="Co____9" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=xJDxZXbO8mY"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="4.0" default="1"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="How many pretty pretty balls"
- _low-label="Not so many" _high-label="A bunch"
- low="1" high="400" default="60"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This is fine.
-
-Written by Jamie Zawinski; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/companioncube.xml b/hacks/config/companioncube.xml
deleted file mode 100644
index 2a59f3a..0000000
--- a/hacks/config/companioncube.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="companioncube" _label="Companion Cube" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Q54NVuxhGso"/>
-
- <hgroup>
- <vgroup>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Bounce" _low-label="Slow" _high-label="Fast"
- low="0.05" high="2.0" default="1.0"/>
-
- </vgroup>
- <vgroup>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of cubes" _low-label="1" _high-label="20"
- low="1" high="20" default="3"/>
-
- <hgroup>
- <vgroup>
- <boolean id="spin" _label="Spin" arg-set="-spin"/>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- </vgroup>
- <vgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The symptoms most commonly produced by Enrichment Center testing are
-superstition, perceiving inanimate objects as alive, and hallucinations.
-The Enrichment Center reminds you that the weighted companion cube will
-never threaten to stab you and, in fact, cannot speak. In the event that
-the Weighted Companion Cube does speak, the Enrichment Center urges you to
-disregard its advice.
-
-https://en.wikipedia.org/wiki/Portal_%28video_game%29
-
-Written by Jamie Zawinski; 2011.
- </_description>
-</screensaver>
diff --git a/hacks/config/compass.xml b/hacks/config/compass.xml
deleted file mode 100644
index 83e0c83..0000000
--- a/hacks/config/compass.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="compass" _label="Compass">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=IssDEcgB550"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A compass, with all elements spinning about randomly, for
-that "lost and nauseous" feeling.
-
-Written by Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/coral.xml b/hacks/config/coral.xml
deleted file mode 100644
index c722ea5..0000000
--- a/hacks/config/coral.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="coral" _label="Coral">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=3WTSvzJcQhw"/>
-
- <number id="delay2" type="slider" arg="-delay2 %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="1" high="500000" default="20000"
- convert="invert"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Linger" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <number id="density" type="slider" arg="-density %"
- _label="Density" _low-label="Sparse" _high-label="Dense"
- low="1" high="90" default="25"
- convert="invert"/>
-
- <number id="seeds" type="slider" arg="-seeds %"
- _label="Seeds" _low-label="Few" _high-label="Many"
- low="1" high="100" default="20"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Simulates coral growth, albeit somewhat slowly.
-
-Written by Frederick Roeber; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/covid19.xml b/hacks/config/covid19.xml
deleted file mode 100644
index 96f395b..0000000
--- a/hacks/config/covid19.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="covid19" _label="COVID19" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=xJDxZXbO8mY"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="4.0" default="1"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Government Response"
- _low-label="Taiwan" _high-label="United States"
- low="1" high="400" default="60"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-SARS-CoV-2. Stay the fuck home. Wear a fucking mask.
-
-Written by Jamie Zawinski; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/crackberg.xml b/hacks/config/crackberg.xml
deleted file mode 100644
index dacf279..0000000
--- a/hacks/config/crackberg.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="crackberg" _label="Crackberg" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ej1No4EK8Rc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="visibility" type="slider" arg="-visibility %"
- _label="Visibility" _low-label="Mouse hole" _high-label="Eagle nest"
- low="0.2" high="1.0" default="0.6" />
- <number id="nsubdivs" type="slider" arg="-nsubdivs %"
- _label="Subdivisions" _low-label="Few" _high-label="Hurt me"
- low="2" high="9" default="4" />
-
- <hgroup>
- <vgroup>
- <boolean id="flat" _label="Flat shading" arg-unset="-no-flat"/>
- <boolean id="lit" _label="Lighting" arg-unset="-no-lit"/>
- <boolean id="water" _label="Water" arg-unset="-no-water"/>
- <boolean id="crack" _label="Confused" arg-unset="-no-crack"/>
- </vgroup>
- <vgroup>
- <boolean id="boring" _label="Immediate" arg-set="-boring"/>
- <boolean id="letter" _label="Letterbox" arg-set="-letterbox"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <select id="color">
- <option id="random" _label="Random coloration"/>
- <option id="plain" _label="Earthy coloration" arg-set="-color plain"/>
- <option id="ice" _label="Icy coloration" arg-set="-color ice"/>
- <option id="magma" _label="Swampy coloration" arg-set="-color magma"/>
- <option id="vomit" _label="Vomitous coloration" arg-set="-color vomit"/>
- </select>
-
- <xscreensaver-updater />
-
- <_description>
-Flies through height maps, optionally animating the creation and
-destruction of generated tiles; tiles `grow' into place.
-
-Written by Matus Telgarsky; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/critical.xml b/hacks/config/critical.xml
deleted file mode 100644
index 399c569..0000000
--- a/hacks/config/critical.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="critical" _label="Critical">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=HN2ykbM2cTk"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="3" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Draws a system of self-organizing lines. It starts out as random
-squiggles, but after a few iterations, order begins to appear.
-
-Written by Martin Pool; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/crumbler.xml b/hacks/config/crumbler.xml
deleted file mode 100644
index 57b1bd6..0000000
--- a/hacks/config/crumbler.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="crumbler" _label="Crumbler" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=oERz1IPluYQ"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="2.0" default="1.0"/>
-
- <number id="density" type="slider" arg="-density %"
- _label="Polygons" _low-label="Few" _high-label="Many"
- low="0.2" high="5.0" default="1.0"/>
-
- <number id="fracture" type="slider" arg="-fracture %"
- _label="Fractures" _low-label="Few" _high-label="Many"
- low="0" high="20" default="0"/>
- </vgroup>
-
- <vgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
- </vgroup>
- </hgroup>
-
- <_description>
-Randomly subdivides a ball into voronoi chunks, then further subdivides
-one of the remaining pieces.
-
-https://en.wikipedia.org/wiki/Voronoi_diagram
-https://en.wikipedia.org/wiki/Convex_hull
-https://en.wikipedia.org/wiki/Quickhull
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/crystal.xml b/hacks/config/crystal.xml
deleted file mode 100644
index ab1f1dd..0000000
--- a/hacks/config/crystal.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="crystal" _label="Crystal">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=M27wWKGXIvw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="60000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="100"/>
-
- <!-- #### -maxsize -->
- <!-- #### -shift (color cycling) -->
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Number of crystals" low="-5000" high="5000" default="-500"/>
-
- <number id="nx" type="spinbutton" arg="-nx %"
- _label="Horizontal symmetries" low="-10" high="10" default="-3"/>
-
- <number id="ny" type="spinbutton" arg="-ny %"
- _label="Vertical symmetries" low="-10" high="10" default="-3"/>
-
- <hgroup>
- <boolean id="grid" _label="Draw grid" arg-set="-grid"/>
- <boolean id="cells" _label="Draw cell" arg-unset="-no-cell"/>
- <boolean id="centre" _label="Center on screen" arg-set="-centre"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Moving polygons, similar to a kaleidoscope. See also the
-"Kaleidescope" and "GLeidescope" screen savers.
-
-https://en.wikipedia.org/wiki/Kaleidoscope
-
-Written by Jouk Jansen; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml
deleted file mode 100644
index 17082db..0000000
--- a/hacks/config/cube21.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cube21" _label="Cube 21" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=AFtxL6--lTQ"/>
-
- <hgroup>
- <vgroup>
-
- <number id="speed" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000" convert="invert"/>
-
- <number id="cubesize" type="slider" arg="-cubesize %"
- _label="Cube size" _low-label="Small" _high-label="Large"
- low="0.4" high="1.0" default="0.7"/>
-
- <number id="rotspeed" type="slider" arg="-rotspeed %"
- _label="Rotation" _low-label="Slow" _high-label="Fast"
- low="1.0" high="10.0" default="3.0"/>
-
- <select id="start">
- <option id="cube" _label="Start as cube" arg-set="-no-randomize"/>
- <option id="shuffle" _label="Start as random shape"/>
- </select>
-
- <select id="colors">
- <option id="white" _label="White" arg-set="-colormode white"/>
- <option id="one" _label="Random color" arg-set="-colormode rnd"/>
- <option id="se" _label="Silver edition" arg-set="-colormode se"/>
- <option id="two" _label="Two random colors" arg-set="-colormode two"/>
- <option id="ce" _label="Classic edition" arg-set="-colormode ce"/>
- <option id="six" _label="Six random colors"/>
- </select>
-
- </vgroup>
- <vgroup>
-
- <number id="spinspeed" type="slider" arg="-spinspeed %"
- _label="Spin" _low-label="Slow" _high-label="Fast"
- low="0.01" high="4.0" default="1.0"/>
-
- <number id="wanderspeed" type="slider" arg="-wanderspeed %"
- _label="Wander" _low-label="Slow" _high-label="Fast"
- low="0.001" high="0.1" default="0.02"/>
-
- <number id="wait" type="slider" arg="-wait %"
- _label="Linger" _low-label="Short" _high-label="Long"
- low="10.0" high="100.0" default="40.0"/>
-
- <hgroup>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="tex" _label="Outlines" arg-unset="-no-texture"/>
- </hgroup>
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The "Cube 21" Rubik-like puzzle, also known as "Square-1".
-The rotations are chosen randomly. See also the "Rubik",
-"RubikBlocks" and "GLSnake" screen savers.
-
-https://en.wikipedia.org/wiki/Square_One_%28puzzle%29
-
-Written by Vasek Potocek; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/cubenetic.xml b/hacks/config/cubenetic.xml
deleted file mode 100644
index 3907214..0000000
--- a/hacks/config/cubenetic.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cubenetic" _label="Cubenetic" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=aElbM0rZZNg"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Boxes" _low-label="Few" _high-label="Many"
- low="1" high="20" default="5"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <number id="wave-speed" type="slider" arg="-wave-speed %"
- _label="Surface pattern speed" _low-label="Slow" _high-label="Fast"
- low="5" high="150" default="80"/>
-
- <number id="wave-radius" type="slider" arg="-wave-radius %"
- _label="Surface pattern overlap"
- _low-label="Small" _high-label="Large"
- low="5" high="600" default="512"/>
-
- <number id="waves" type="slider" arg="-waves %"
- _label="Surface pattern complexity"
- _low-label="Low" _high-label="High"
- low="1" high="20" default="3"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A cubist Lavalite, sort of. A pulsating set of overlapping boxes with
-ever-changing blobby patterns undulating across their surfaces.
-
-Written by Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/cubestack.xml b/hacks/config/cubestack.xml
deleted file mode 100644
index 9dcc3aa..0000000
--- a/hacks/config/cubestack.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cubestack" _label="Cube Stack" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=rZi5yav6sRo"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10" default="1.0"/>
- </vgroup>
- <vgroup>
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="0.0" high="0.5" default="0.13"/>
-
- <number id="opacity" type="slider" arg="-opacity %"
- _label="Opacity" _low-label="Transparent" _high-label="Opaque"
- low="0.01" high="1.0" default="0.7"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-An endless stack of unfolding, translucent cubes.
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/cubestorm.xml b/hacks/config/cubestorm.xml
deleted file mode 100644
index 366bb89..0000000
--- a/hacks/config/cubestorm.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cubestorm" _label="Cube Storm" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=enuZbkMiqCE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="5.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Cubes" _low-label="Few" _high-label="Many"
- low="1" high="20" default="4"/>
-
- </vgroup>
- <vgroup>
-
- <number id="length" type="slider" arg="-length %"
- _label="Length" _low-label="Short" _high-label="Long"
- low="20" high="1000" default="200"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Struts" _low-label="Thin" _high-label="Thick"
- low="0.01" high="1.0" default="0.06"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Boxes change shape and intersect each other, filling space.
-
-Written by Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/cubetwist.xml b/hacks/config/cubetwist.xml
deleted file mode 100644
index ced60ec..0000000
--- a/hacks/config/cubetwist.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cubetwist" _label="Cube Twist" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=RjrtUtMEa_4"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10" default="1.0"/>
- </vgroup>
- <vgroup>
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="0.0" high="0.5" default="0.0"/>
-
- <number id="displacement" type="slider" arg="-displacement %"
- _label="Displacement" _low-label="Tight" _high-label="Wide"
- low="0.0" high="0.5" default="0.0"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="flat" _label="Flat shading" arg-unset="-no-flat"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A series of nested cubes rotate and slide recursively.
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/cubicgrid.xml b/hacks/config/cubicgrid.xml
deleted file mode 100644
index 10bdf80..0000000
--- a/hacks/config/cubicgrid.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cubicgrid" _label="Cubic Grid" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=nOTi7gy9l-I"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000" convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.2" high="10.0" default="1.0"/>
-
- <number id="zoom" type="slider" arg="-zoom %"
- _label="Dot spacing" _low-label="Close" _high-label="Far"
- low="15" high="100" default="20"/>
-
- <boolean id="bigdots" _label="Big dots" arg-unset="-no-bigdots"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <select id="symmetry">
- <option id="random" _label="Random symmetry"/>
- <option id="cubic" _label="Cubic symmetry" arg-set="-symmetry cubic"/>
- <option id="hexagonal" _label="Hexagonal symmetry" arg-set="-symmetry hexagonal"/>
- </select>
-
- <xscreensaver-updater />
-
- <_description>
-A rotating lattice of colored points.
-
-Written by Vasek Potocek; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/cwaves.xml b/hacks/config/cwaves.xml
deleted file mode 100644
index 3e77b42..0000000
--- a/hacks/config/cwaves.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cwaves" _label="C Waves">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=yOuJqiDUrpY"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="waves" type="slider" arg="-waves %"
- _label="Complexity" _low-label="Low" _high-label="High"
- low="1" high="100" default="15"/>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Color transitions" _low-label="Rough" _high-label="Smooth"
- low="2" high="1000" default="600"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A field of sinusoidal colors languidly scrolls. It's relaxing.
-
-Written by Jamie Zawinski; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/cynosure.xml b/hacks/config/cynosure.xml
deleted file mode 100644
index c81130d..0000000
--- a/hacks/config/cynosure.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="cynosure" _label="Cynosure">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=If7FOc8UnYs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="1000000" default="500000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="255" default="128"/>
-
- <number id="iterations" type="slider" arg="-iterations %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="2" high="200" default="100"/>
-
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Random dropshadowed rectangles pop onto the screen in lockstep.
-
-Written by Ozymandias G. Desiderata, Jamie Zawinski, and Stephen Linhart; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/dangerball.xml b/hacks/config/dangerball.xml
deleted file mode 100644
index 51d9fe1..0000000
--- a/hacks/config/dangerball.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="dangerball" _label="Danger Ball" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=QU0aPwWwHbg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="spikespeed" type="slider" arg="-speed %"
- _label="Spike growth" _low-label="Slow" _high-label="Fast"
- low="0.001" high="0.25" default="0.05"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of spikes" _low-label="Few" _high-label="Ouch"
- low="1" high="100" default="30"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A spiky ball. Ouch!
-
-Written by Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/decayscreen.xml b/hacks/config/decayscreen.xml
deleted file mode 100644
index 266d8d6..0000000
--- a/hacks/config/decayscreen.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="decayscreen" _label="Decay Screen">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=dFlyRTObuDo"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <select id="mode">
- <option id="random" _label="Random melt style"/>
- <option id="random" _label="Shuffle melt" arg-set="-mode shuffle"/>
- <option id="random" _label="Melt up" arg-set="-mode up"/>
- <option id="random" _label="Melt down" arg-set="-mode down"/>
- <option id="random" _label="Melt left" arg-set="-mode left"/>
- <option id="random" _label="Melt right" arg-set="-mode right"/>
- <option id="random" _label="Melt up, left" arg-set="-mode upleft"/>
- <option id="random" _label="Melt up, right" arg-set="-mode upright"/>
- <option id="random" _label="Melt down, left" arg-set="-mode downleft"/>
- <option id="random" _label="Melt down, right" arg-set="-mode downright"/>
- <option id="random" _label="Melt towards center" arg-set="-mode in"/>
- <option id="random" _label="Melt away from center" arg-set="-mode out"/>
- <option id="random" _label="Melty melt" arg-set="-mode melt"/>
- <option id="random" _label="Stretchy melt" arg-set="-mode stretch"/>
- <option id="random" _label="Fuzzy melt" arg-set="-mode fuzz"/>
- </select>
-
- <xscreensaver-image />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Melts an image in various ways. Warning, if the effect continues after
-the screen saver is off, seek medical attention.
-
-Written by David Wald, Vivek Khera, Jamie Zawinski, and Vince Levey; 1993.
- </_description>
-</screensaver>
diff --git a/hacks/config/deco.xml b/hacks/config/deco.xml
deleted file mode 100644
index b5347cf..0000000
--- a/hacks/config/deco.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="deco" _label="Deco">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=kfdDTv07Nhw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Duration" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <hgroup>
- <vgroup>
- <number id="minwidth" type="spinbutton" arg="-min-width %"
- _label="Minimum width" low="1" high="100" default="20"/>
-
- <number id="minheight" type="spinbutton" arg="-min-height %"
- _label="Minimum height" low="1" high="100" default="20"/>
-
- <number id="maxdepth" type="spinbutton" arg="-max-depth %"
- _label="Maximum depth" low="1" high="40" default="12"/>
- </vgroup>
- <vgroup>
- <boolean id="smooth-colors" _label="Smooth colors" arg-set="-smooth-colors"/>
- <boolean id="golden-ratio" _label="Golden ratio" arg-set="-golden-ratio"/>
- <boolean id="mondrian" _label="Mondrian" arg-set="-mondrian"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Subdivides and colors rectangles randomly, for a Mondrian-esque effect.
-
-https://en.wikipedia.org/wiki/Piet_Mondrian#Paris_1919.E2.80.931938
-
-Written by Jamie Zawinski and Michael Bayne; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/deepstars.xml b/hacks/config/deepstars.xml
deleted file mode 100644
index 3186376..0000000
--- a/hacks/config/deepstars.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="deepstars" _label="Deep Stars" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=_FhYeKXGpxs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="8.0" default="1.0"/>
-
- <number id="smear" type="slider" arg="-smear %"
- _label="Smear" _low-label="Low" _high-label="High"
- low="0.1" high="5.0" default="1.0"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A long exposure of the night sky, showing star paths as vapor trails.
-
-Written by Jamie Zawinski; 2019.
- </_description>
-</screensaver>
diff --git a/hacks/config/deluxe.xml b/hacks/config/deluxe.xml
deleted file mode 100644
index 0cd4746..0000000
--- a/hacks/config/deluxe.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="deluxe" _label="Deluxe">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=2CsKEVR3ecs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="50000" default="10000"
- convert="invert"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Lines" _low-label="Thin" _high-label="Thick"
- low="1" high="150" default="50"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Shapes" _low-label="1" _high-label="20"
- low="1" high="20" default="5"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="20"/>
-
- <!-- #### -speed [15] -->
-
- <boolean id="transparent" _label="Transparency" arg-unset="-no-transparent"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Pulsing stars, circles, and lines.
-
-Written by Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/demon.xml b/hacks/config/demon.xml
deleted file mode 100644
index bd78bf1..0000000
--- a/hacks/config/demon.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="demon" _label="Demon">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=OhHI-pIHddA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="States" _low-label="0" _high-label="20"
- low="0" high="20" default="0"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="800000" default="1000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Cell size" low="-40" high="40" default="-30"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A cellular automaton that starts with a random field, and organizes
-it into stripes and spirals.
-
-https://en.wikipedia.org/wiki/Maxwell%27s_demon
-
-Written by David Bagley; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/discoball.xml b/hacks/config/discoball.xml
deleted file mode 100644
index 61ed94c..0000000
--- a/hacks/config/discoball.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="discoball" _label="Discoball" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=8yd4PYJQrMw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="5" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Size" _low-label="Small" _high-label="Large"
- low="10" high="100" default="30"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-set="-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A dusty, dented disco ball. Woop woop.
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/discrete.xml b/hacks/config/discrete.xml
deleted file mode 100644
index 01c7d4f..0000000
--- a/hacks/config/discrete.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="discrete" _label="Discrete">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=l-yIY8vRlHA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="100" high="10000" default="2500"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="100"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Discrete map fractal systems, including variants of Hopalong, Julia,
-and others.
-
-Written by Tim Auckland; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/distort.xml b/hacks/config/distort.xml
deleted file mode 100644
index ab06ae1..0000000
--- a/hacks/config/distort.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="distort" _label="Distort">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ENaG3gwtukM"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="200000" default="20000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <!-- #### -speed [0] -->
- <!-- #### -slow -->
-
- <number id="radius" type="slider" arg="-radius %"
- _label="Lens size" _low-label="Small" _high-label="Large"
- low="0" high="1000" default="0"/>
-
- <hgroup>
- <number id="count" type="spinbutton" arg="-number %"
- _label="Lens count" low="0" high="10" default="0"/>
-
- <select id="effect">
- <option id="normal" _label="Normal"/>
- <option id="swamp" _label="Swamp thing" arg-set="-effect swamp"/>
- <option id="bounce" _label="Bounce" arg-set="-effect bounce"/>
- </select>
- </hgroup>
-
- <hgroup>
- <boolean id="reflect" _label="Reflect" arg-set="-reflect"/>
- <boolean id="magnify" _label="Magnify" arg-set="-magnify"/>
- <boolean id="blackhole" _label="Black hole" arg-set="-blackhole"/>
- <boolean id="vortex" _label="Vortex" arg-set="-vortex"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-Wandering lenses distort the screen image in various ways.
-
-Written by Jonas Munsin; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/dnalogo.xml b/hacks/config/dnalogo.xml
deleted file mode 100644
index 48cd2ee..0000000
--- a/hacks/config/dnalogo.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="dnalogo" _label="DNA Logo" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=B7I5A7E3SP0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame Rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
-
- <select id="mode">
- <option id="glyph" _label="DNA Lounge logo" arg-set="-mode helix"/>
- <option id="pizza" _label="DNA Pizza logo" arg-set="-mode pizza"/>
- <option id="both" _label="DNA Lounge and DNA Pizza logos"/>
-<!--<option id="codeword" _label="Codeword logo" arg-set="-mode codeword"/>-->
- </select>
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-DNA Lounge
-
- Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985.
-
- 375 Eleventh Street
- San Francisco, CA
- 94103
-
-Written by Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/drift.xml b/hacks/config/drift.xml
deleted file mode 100644
index 9eda2b4..0000000
--- a/hacks/config/drift.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="drift" _label="Drift">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=cppZgCh6U7I"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="1" high="200" default="30"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Drifting recursive fractal cosmic flames.
-
-Written by Scott Draves; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/dymaxionmap.xml b/hacks/config/dymaxionmap.xml
deleted file mode 100644
index 1cc027a..0000000
--- a/hacks/config/dymaxionmap.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="dymaxionmap" _label="Dymaxion Map" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=4LnO0UiccGs"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="10.0" default="1.0"/>
- </vgroup>
- <vgroup>
-
- <hgroup>
- <select id="map">
- <option id="flat" _label="Flat map"/>
- <option id="day" _label="Satellite map" arg-set="-image BUILTIN_SAT"/>
- </select>
-
- <!-- <file id="image" _label="Image file" arg="-image %"/> -->
- </hgroup>
-
- <number id="frames" type="slider" arg="-frames %"
- _label="Day / night smoothness" _low-label="Low" _high-label="High"
- low="24" high="1440" default="720"/>
- </vgroup>
- </hgroup>
- <hgroup>
-
- <vgroup>
- <hgroup>
- <boolean id="stars" _label="Stars" arg-unset="-no-stars"/>
- <boolean id="grid" _label="Lat / Long" arg-unset="-no-grid"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
-Buckminster Fuller's map of the Earth projected onto the surface of
-an unfolded icosahedron. It depicts the Earth's continents as one
-island, or nearly contiguous land masses.
-
-This screen saver animates the progression of the dusk terminator across
-the flattened globe. It includes both satellite and flat-colored map
-imagery, and can load and convert other Equirectangular-projected maps.
-
-"Dymaxion Map" and "The Fuller Projection Map" are trademarks of
-The Buckminster Fuller Institute.
-
-The original Dymaxion Map image is copyright 1982 by
-The Buckminster Fuller Institute. (This program does not use their
-imagery, only similar trigonometry.)
-
-The Dymaxion Map was covered by now-expired US Patent 2,393,676
-(Richard Buckminster Fuller, 1946).
-
-https://en.wikipedia.org/wiki/Dymaxion_map
-https://en.wikipedia.org/wiki/Buckminster_Fuller
-https://en.wikipedia.org/wiki/List_of_map_projections
-https://en.wikipedia.org/wiki/Cahill%E2%80%93Keyes_projection
-https://en.wikipedia.org/wiki/Waterman_butterfly_projection
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/endgame.xml b/hacks/config/endgame.xml
deleted file mode 100644
index 88eac22..0000000
--- a/hacks/config/endgame.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="endgame" _label="Endgame" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=QfglC_lvUTA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="classic" _label="Low resolution chess pieces" arg-set="-classic"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Black slips out of three mating nets, but the fourth one holds him tight!
-A brilliant composition!
-
-See also the "Queens" screen saver.
-
-https://en.wikipedia.org/wiki/Chess_endgame
-
-Written by Blair Tennessy and Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/energystream.xml b/hacks/config/energystream.xml
deleted file mode 100644
index c9f8966..0000000
--- a/hacks/config/energystream.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="energystream" _label="Energy Stream" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=TbWZ6v5Zzk8"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="5.0" default="1.0"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-wander" />
- <boolean id="spin" _label="Spin" arg-unset="-spin" />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A flow of particles which form an energy stream.
-
-Written by Eugene Sandulenko and Konrad "Yoghurt" Zagorowicz; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/engine.xml b/hacks/config/engine.xml
deleted file mode 100644
index 5c91d28..0000000
--- a/hacks/config/engine.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="engine" _label="Engine" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=8BL2o8QJmiA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <select id="engine">
- <option id="random" _label="Random engine"/>
- <option id="1" _label="Honda Insight (3 cylinders)" arg-set="-engine honda_insight"/>
- <option id="2" _label="BMW M3 (4 cylinders)" arg-set="-engine bmw_m3"/>
- <option id="3" _label="VW Beetle (4 cylinders, flat)" arg-set="-engine vw_beetle"/>
- <option id="4" _label="Audi Quattro (5 cylinders)" arg-set="-engine audi_quattro"/>
- <option id="5" _label="BMW M5 (6 cylinders)" arg-set="-engine bmw_m5"/>
- <option id="6" _label="Subaru XT (6 cylinders, V)" arg-set="-engine subaru_xt"/>
- <option id="7" _label="Porsche 911 (6 cylinders, flat)" arg-set="-engine porsche_911"/>
- <option id="8" _label="Corvette Z06 (8 cylinders, V)" arg-set="-engine corvette_z06"/>
- <option id="9" _label="Dodge Viper (10 cylinders, V)" arg-set="-engine dodge_viper"/>
- <option id="10" _label="Jaguar XKE (12 cylinders, V)" arg-set="-engine jaguar_xke"/>
- </select>
-
- <boolean id="titles" _label="Show engine name" arg-set="-titles"/>
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-move"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- </hgroup>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Internal combusion engines.
-
-https://en.wikipedia.org/wiki/Internal_combustion_engine#Operation
-
-Written by Ben Buxton, Ed Beroset and Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/epicycle.xml b/hacks/config/epicycle.xml
deleted file mode 100644
index 18b23df..0000000
--- a/hacks/config/epicycle.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="epicycle" _label="Epicycle">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=rpk3zxQxaR8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="100"/>
-
- <number id="holdtime" type="slider" arg="-holdtime %"
- _label="Linger" _low-label="1 second" _high-label="30 seconds"
- low="1" high="30" default="2"/>
-
- <hgroup>
- <number id="linewidth" type="spinbutton" arg="-linewidth %"
- _label="Line thickness" low="1" high="50" default="4"/>
-
- <number id="harmonics" type="spinbutton" arg="-harmonics %"
- _label="Harmonics" low="1" high="20" default="8"/>
- </hgroup>
-
- <!-- #### -color0 [red] -->
- <!-- #### -colours [100] -->
- <!-- #### -foreground [white] -->
- <!-- #### -min_circles [2] -->
- <!-- #### -max_circles [10] -->
- <!-- #### -min_speed [0.003] -->
- <!-- #### -max_speed [0.005] -->
- <!-- #### -timestep [1.0] -->
- <!-- #### -divisor_poisson [0.4] -->
- <!-- #### -size_factor_min [1.05] -->
- <!-- #### -size_factor_max [2.05] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A pre-heliocentric model of planetary motion.
-
-This draws the path traced out by a point on the edge of a
-circle. That circle rotates around a point on the rim of another
-circle, and so on, several times.
-
-The geometry of epicycles was perfected by Hipparchus of Rhodes at some time
-around 125 B.C., 185 years after the birth of Aristarchus of Samos, the
-inventor of the heliocentric universe model. Hipparchus applied epicycles to
-the Sun and the Moon. Ptolemy of Alexandria went on to apply them to what was
-then the known universe, at around 150 A.D. Copernicus went on to apply them
-to the heliocentric model at the beginning of the sixteenth century. Johannes
-Kepler discovered that the planets actually move in elliptical orbits in about
-1602. The inverse-square law of gravity was suggested by Boulliau in 1645.
-Isaac Newton's Principia Mathematica was published in 1687, and proved that
-Kepler's laws derived from Newtonian gravitation.
-
-https://en.wikipedia.org/wiki/Deferent_and_epicycle
-
-Written by James Youngman; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/eruption.xml b/hacks/config/eruption.xml
deleted file mode 100644
index da778fe..0000000
--- a/hacks/config/eruption.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="eruption" _label="Eruption">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=CQ6jDBnumT8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Few" _high-label="Many"
- low="16" high="256" default="256"/>
-
- <number id="nparticles" type="slider" arg="-particles %"
- _label="Number of particles" _low-label="Little" _high-label="Many"
- low="100" high="2000" default="300"/>
-
- <number id="cooloff" type="slider" arg="-cooloff %"
- _label="Cooling factor" _low-label="Slow" _high-label="Fast"
- low="0" high="10" default="2"/>
- </vgroup>
- <vgroup>
- <number id="heat" type="slider" arg="-heat %"
- _label="Heat" _low-label="Pleasant" _high-label="Inferno"
- low="64" high="256" default="256"/>
-
- <number id="gravity" type="slider" arg="-gravity %"
- _label="Gravity" _low-label="Negative" _high-label="Positive"
- low="-5" high="5" default="1"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="10" high="3000" default="80"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Exploding fireworks. See also the "Fireworkx", "XFlame" and "Pyro"
-screen savers.
-
-Written by W.P. van Paassen; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/esper.xml b/hacks/config/esper.xml
deleted file mode 100644
index e91bb51..0000000
--- a/hacks/config/esper.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="esper" _label="Esper" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=_er7xZd7zUU"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.2" high="20" default="1.0"/>
-
- </vgroup>
- <vgroup>
-
- <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
-"Enhance 224 to 176. Pull out track right. Center in pull back. Pull
-back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
-Gimme a hardcopy right there."
-
-The Esper Machine was a voice-controlled forensic device used by LAPD
-in 2019, as documented in the 1982 film, Blade Runner. It was capable
-of enhancing photographs to an extreme degree, including reconstructing
-different viewpoints within the space from the reflections on various
-objects in the photograph.
-
-Written by Jamie Zawinski; 2017.
- </_description>
-</screensaver>
diff --git a/hacks/config/etruscanvenus.xml b/hacks/config/etruscanvenus.xml
deleted file mode 100644
index d4bff27..0000000
--- a/hacks/config/etruscanvenus.xml
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="etruscanvenus" _label="Etruscan Venus" gl="yes">
-
- <video href="https://www.youtube.com/watch?v=p3MgGyie6-I"/>
-
- <command arg="-root"/>
-
- <hgroup>
- <select id="view-mode">
- <option id="walk" _label="Random motion"/>
- <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
- <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
- </select>
-
- <boolean id="orientation-marks" _label="Show orientation marks"
- arg-set="-orientation-marks"/>
- </hgroup>
-
- <hgroup>
- <boolean id="deform" _label="Deform the surface"
- arg-unset="-no-deform"/>
-
- <number id="deform-speed" type="slider" arg="-deformation-speed %"
- _label="Deformation speed"
- _low-label="1.0" _high-label="100.0"
- low="1.0" high="100.0" default="10.0"/>
-
- <number id="init-deform" type="slider" arg="-initial-deformation %"
- _label="Initial deformation"
- _low-label="0.0" _high-label="3999.0"
- low="0.0" high="3999.0" default="0.0"/>
- </hgroup>
-
-
- <hgroup>
-
- <vgroup>
- <select id="display-mode">
- <option id="random" _label="Random surface"/>
- <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
- <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
- <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
- </select>
-
- <select id="appearance">
- <option id="random" _label="Random pattern"/>
- <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
- <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
- <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
- </select>
-
- <select id="colors">
- <option id="random" _label="Random coloration"/>
- <option id="twosided" _label="One-sided" arg-set="-colors one-sided"/>
- <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
- <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
- <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
- </select>
-
- <boolean id="change-colors" _label="Change colors"
- arg-unset="-no-change-colors"/>
-
- <select id="projection">
- <option id="random" _label="Random Projection"/>
- <option id="perspective" _label="Perspective" arg-set="-projection perspective"/>
- <option id="orthographic" _label="Orthographic" arg-set="-projection orthographic"/>
- </select>
- </vgroup>
-
- <vgroup>
- <number id="speed-x" type="slider" arg="-speed-x %"
- _label="X rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.1"/>
-
- <number id="speed-y" type="slider" arg="-speed-y %"
- _label="Y rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.3"/>
-
- <number id="speed-z" type="slider" arg="-speed-z %"
- _label="Z rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.5"/>
- </vgroup>
-
- <vgroup>
- <number id="walk-direction" type="slider" arg="-walk-direction %"
- _label="Walking direction"
- _low-label="-180.0" _high-label="180.0"
- low="-180.0" high="180.0" default="83.0"/>
-
- <number id="walk-speed" type="slider" arg="-walk-speed %"
- _label="Walking speed"
- _low-label="1.0" _high-label="100.0"
- low="1.0" high="100.0" default="20.0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
- </vgroup>
-
- <vgroup>
- <xscreensaver-updater />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- </hgroup>
-
- <_description>
-A 3D immersion of of a Klein bottle that smoothly deforms between the
-Etruscan Venus surface, the Roman surface, the Boy surface, and the
-Ida surface. Topologically, all surfaces are Klein bottles, even the
-Roman and Boy surfaces, which are doubly covered and therefore appear
-to be an immersed real projective plane.
-
-You can walk on the Klein bottle or rotate it in 3D. Since all the
-surfaces except the Ida surfaces have points where the surface normal
-is not well defined for some points, walking is performed on the Ida
-surface. Furthermore, it is possible to smoothly deform the surface
-between the Etruscan Venus surface, the Roman surface, the Boy
-surface, and the Ida surface surface while turning it.
-
-Inspired by George K. Francis's book "A Topological Picturebook",
-Springer, 1987, George K. Francis's paper "The Etruscan Venus" in
-P. Concus, R. Finn, and D. A. Hoffman: "Geometric Analysis and
-Computer Graphics", Springer, 1991, and a video entitled "The Etruscan
-Venus" by Donna J. Cox, George K. Francis, and Raymond L. Idaszak,
-presented at SIGGRAPH 1989.
-
-https://en.wikipedia.org/wiki/Boy%27s_surface
-https://en.wikipedia.org/wiki/Roman_surface
-https://en.wikipedia.org/wiki/Klein_bottle
-http://mathworld.wolfram.com/BoySurface.html
-http://mathworld.wolfram.com/RomanSurface.html
-http://mathworld.wolfram.com/EtruscanVenusSurface.html
-http://mathworld.wolfram.com/IdaSurface.html
-
-Written by Carsten Steger; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/euler2d.xml b/hacks/config/euler2d.xml
deleted file mode 100644
index 125ae27..0000000
--- a/hacks/config/euler2d.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="euler2d" _label="Euler 2D">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ZH1ZtfId0iA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Particles" _low-label="Few" _high-label="Many"
- low="2" high="5000" default="1024"/>
-
- <number id="eulertail" type="slider" arg="-eulertail %"
- _label="Trail length" _low-label="Short" _high-label="Long"
- low="2" high="500" default="10"/>
- </vgroup>
-
- <vgroup>
- <!--
- <number id="eulerpower" type="slider" arg="-eulerpower %"
- _label="Power" _low-label="Low" _high-label="High"
- low="0.5" high="3.0" default="1.0"/>
- -->
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="100" high="5000" default="3000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="255" default="64"/>
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <xscreensaver-updater />
-
- <_description>
-Simulates two dimensional incompressible inviscid fluid flow.
-
-https://en.wikipedia.org/wiki/Euler_equations_%28fluid_dynamics%29
-https://en.wikipedia.org/wiki/Inviscid_flow
-
-Written by Stephen Montgomery-Smith; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/extrusion.xml b/hacks/config/extrusion.xml
deleted file mode 100644
index 97c26a8..0000000
--- a/hacks/config/extrusion.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="extrusion" _label="Extrusion" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=eKYmqL7ndGs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <select id="mode">
- <option id="random" _label="Random object"/>
- <option id="helix2" _label="Helix 2" arg-set="-name helix2"/>
- <option id="helix3" _label="Helix 3" arg-set="-name helix3"/>
- <option id="helix4" _label="Helix 4" arg-set="-name helix4"/>
- <option id="joinoffset" _label="Join offset" arg-set="-name joinoffset"/>
- <option id="screw" _label="Screw" arg-set="-name screw"/>
- <option id="taper" _label="Taper" arg-set="-name taper"/>
- <option id="twist" _label="Twistoid" arg-set="-name twistoid"/>
- </select>
-
- <select id="render">
- <option id="flat" _label="Use flat coloring" arg-set="-no-light"/>
- <option id="light" _label="Use lighting"/>
- </select>
-
- <!-- #### -texture -->
- <!-- #### -texture_quality -->
- <!-- #### -mipmap -->
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Various extruded shapes twist and turn inside out.
-
-Written by Linas Vepstas, David Konerding, and Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/fadeplot.xml b/hacks/config/fadeplot.xml
deleted file mode 100644
index ddca5e8..0000000
--- a/hacks/config/fadeplot.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fadeplot" _label="Fade Plot">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Cev034v37JM"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="0" high="30" default="10"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Cycles" _low-label="Small" _high-label="Large"
- low="0" high="10000" default="1500"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A waving ribbon follows a sinusoidal path.
-
-Written by Bas van Gaalen and Charles Vidal; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/fiberlamp.xml b/hacks/config/fiberlamp.xml
deleted file mode 100644
index 13787f5..0000000
--- a/hacks/config/fiberlamp.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fiberlamp" _label="Fiber Lamp">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=PvYKJ-vkxE0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Fibers" _low-label="Few" _high-label="Many"
- low="10" high="500" default="500"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Time between knocks" _low-label="Short" _high-label="Long"
- low="100" high="10000" default="10000"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A fiber-optic lamp. Groovy.
-
-Written by Tim Auckland; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/filmleader.xml b/hacks/config/filmleader.xml
deleted file mode 100644
index 45afd2e..0000000
--- a/hacks/config/filmleader.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="filmleader" _label="Film Leader">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Cng7hmsuLo0"/>
-
- <hgroup>
- <vgroup>
- <number id="tvcolor" type="slider" arg="-tv-color %"
- _label="Color Knob" _low-label="Low" _high-label="High"
- low="0" high="400" default="70"/>
- <number id="tvtint" type="slider" arg="-tv-tint %"
- _label="Tint Knob" _low-label="Low" _high-label="High"
- low="0" high="360" default="5"/>
- <number id="noise" type="slider" arg="-noise %"
- _label="Noise" _low-label="Low" _high-label="High"
- low="0.0" high="0.2" default="0.04"/>
- </vgroup>
- <vgroup>
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="3.0"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="500" default="150"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Displays a looping countdown based on the SMPTE Universal Film leader
-on a simulation of an old analog television.
-
-https://en.wikipedia.org/wiki/Film_leader
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/fireworkx.xml b/hacks/config/fireworkx.xml
deleted file mode 100644
index 2c8d096..0000000
--- a/hacks/config/fireworkx.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fireworkx" _label="Fireworkx">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=-l9BfvnFIPM"/>
-
- <number id="Delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="maxlife" type="slider" arg="-maxlife %"
- _label="Activity" _low-label="Dense" _high-label="Sparse"
- low="0" high="100" default="32"/>
-
- <boolean id="flash" _label="Light flash" arg-unset="-no-flash"/>
- <boolean id="shoot" _label="Shells upward" arg-set="-shoot"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Exploding fireworks. See also the "Eruption", "XFlame" and "Pyro"
-screen savers.
-
-Written by Rony B Chandran; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/flag.xml b/hacks/config/flag.xml
deleted file mode 100644
index 1e6cfb3..0000000
--- a/hacks/config/flag.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flag" _label="Flag">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=LuEC3EONzjc"/>
-
- <string id="text" _label="Text for flag" arg="-text %"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="200000" default="50000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="800000" default="1000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <!-- #### -size [-7] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-This draws a waving colored flag, that undulates its way around the
-screen. The flag can contain arbitrary text and images. By default,
-it displays either the current system name and OS type, or a picture
-of "Bob".
-
-Written by Charles Vidal and Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/flame.xml b/hacks/config/flame.xml
deleted file mode 100644
index 8e341c6..0000000
--- a/hacks/config/flame.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flame" _label="Flame">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=6Pu8JKNT_Jk"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="delay2" type="slider" arg="-delay2 %"
- _label="Linger" _low-label="0 seconds" _high-label="10 seconds"
- low="1000" high="10000000" default="2000000"/>
-
- <number id="iterations" type="slider" arg="-iterations %"
- _label="Number of fractals" _low-label="Few" _high-label="Many"
- low="1" high="250" default="25"/>
-
- <number id="points" type="slider" arg="-points %"
- _label="Complexity" _low-label="Low" _high-label="High"
- low="100" high="80000" default="10000"/>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Iterative fractals.
-
-Written by Scott Draves; 1993.
- </_description>
-</screensaver>
diff --git a/hacks/config/flipflop.xml b/hacks/config/flipflop.xml
deleted file mode 100644
index 398a4fd..0000000
--- a/hacks/config/flipflop.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flipflop" _label="Flip Flop" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=RzWRoAMFtnw"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="spin" type="slider" arg="-spin %"
- _label="Spin" _low-label="Stopped" _high-label="Whirlwind"
- low="0" high="3.0" default="0.1"/>
- </vgroup>
- <vgroup>
-
- <select id="mode">
- <option id="tiles" _label="Draw Tiles"/>
- <option id="sticks" _label="Draw Sticks" arg-set="-mode sticks"/>
- </select>
-
- <number id="size-x" type="spinbutton" arg="-size-x %"
- _label="Width" low="3" high="20" default="9"/>
- <number id="size-y" type="spinbutton" arg="-size-y %"
- _label="Depth" low="3" high="20" default="9"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <boolean id="texture" _label="Load image" arg-set="-texture" />
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- <vgroup>
- <xscreensaver-image />
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Colored tiles swap with each other.
-
-Written by Kevin Ogden and Sergio Gutierrez; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/flipscreen3d.xml b/hacks/config/flipscreen3d.xml
deleted file mode 100644
index 9143de0..0000000
--- a/hacks/config/flipscreen3d.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flipscreen3d" _label="Flip Screen 3D" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=mu3iN_BSpt4"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-Spins and deforms an image.
-
-Written by Ben Buxton and Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/fliptext.xml b/hacks/config/fliptext.xml
deleted file mode 100644
index 0128c64..0000000
--- a/hacks/config/fliptext.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fliptext" _label="Flip Text" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=vcB-6S7Hfuk"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
- </vgroup>
- <vgroup>
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10.0" default="1.0"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <select id="align">
- <option id="left" _label="Random text alignment"/>
- <option id="left" _label="Flush left text" arg-set="-alignment left"/>
- <option id="center" _label="Centered text" arg-set="-alignment center"/>
- <option id="right" _label="Flush right text" arg-set="-alignment right"/>
- </select>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Font point size" low="1" high="100" default="20"/>
-
- <number id="columns" type="spinbutton" arg="-columns %"
- _label="Text columns" low="1" high="200" default="80"/>
-
- <number id="lines" type="spinbutton" arg="-lines %"
- _label="Text lines" low="1" high="99" default="8"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- <vgroup>
- <xscreensaver-text />
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Successive pages of text flip in and out in a soothing 3D pattern.
-
-Written by Jamie Zawinski; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/flow.xml b/hacks/config/flow.xml
deleted file mode 100644
index 804080a..0000000
--- a/hacks/config/flow.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flow" _label="Flow">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=RJjbRV0FC_A"/>
-
- <hgroup>
- <vgroup>
- <number id="speed" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Many"
- low="10" high="5000" default="3000"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="800000" default="10000"/>
- </vgroup>
- <vgroup>
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Length of trails" _low-label="Short" _high-label="Long"
- low="-20" high="-2" default="-10" convert="invert"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <boolean id="rotate" _label="Rotating around attractor" arg-unset="-no-rotate"/>
- <boolean id="ride" _label="Ride in the flow" arg-unset="-no-ride"/>
- <boolean id="box" _label="Draw bounding box" arg-unset="-no-box"/>
- </vgroup>
- <vgroup>
- <boolean id="periodic" _label="Periodic attractors" arg-unset="-no-periodic"/>
- <boolean id="search" _label="Search for new attractors" arg-unset="-no-search"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Strange attractors formed of flows in a 3D differential equation phase
-space. Features the popular attractors described by Lorentz,
-Roessler, Birkhoff and Duffing, and can discover entirely new
-attractors by itself.
-
-https://en.wikipedia.org/wiki/Attractor#Strange_attractor
-
-Written by Tim Auckland; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml
deleted file mode 100644
index 36335fa..0000000
--- a/hacks/config/fluidballs.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fluidballs" _label="Fluid Balls">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=5Iz9V-vOrxA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of balls" _low-label="Few" _high-label="Many"
- low="1" high="3000" default="300"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Ball size" _low-label="Small" _high-label="Large"
- low="3" high="200" default="25"/>
- </vgroup>
- <vgroup>
- <number id="gravity" type="slider" arg="-gravity %"
- _label="Gravity" _low-label=" Freefall" _high-label="Jupiter"
- low="0.0" high="0.1" default="0.01"/>
-
- <number id="wind" type="slider" arg="-wind %"
- _label="Wind" _low-label="Still" _high-label="Hurricane"
- low="0.0" high="0.1" default="0.00"/>
-
- <number id="elasticity" type="slider" arg="-elasticity %"
- _label="Friction" _low-label="Clay" _high-label="Rubber"
- low="0.2" high="1.0" default="0.97"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="random" _label="Various ball sizes" arg-unset="-no-random"/>
- <boolean id="shake" _label="Shake box" arg-unset="-no-shake"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Models the physics of bouncing balls, or of particles in a gas or
-fluid, depending on the settings. If "Shake Box" is selected, then
-every now and then, the box will be rotated, changing which direction
-is down (in order to keep the settled balls in motion.)
-
-Written by Peter Birtles and Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/flurry.xml b/hacks/config/flurry.xml
deleted file mode 100644
index 5917e32..0000000
--- a/hacks/config/flurry.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flurry" _label="Flurry" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=0beqUyN5ZsI"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <select id="preset">
- <option id="classic" _label="Classic" arg-set="-preset classic"/>
- <option id="rgb" _label="RGB" arg-set="-preset rgb"/>
- <option id="fire" _label="Fire" arg-set="-preset fire"/>
- <option id="water" _label="Water" arg-set="-preset water"/>
- <option id="binary" _label="Binary" arg-set="-preset binary"/>
- <option id="psych" _label="Psychedelic" arg-set="-preset psychedelic"/>
- <option id="insane" _label="Insane" arg-set="-preset insane"/>
- <option id="random" _label="Random"/>
- </select>
-
- <xscreensaver-updater />
-
- <_description>
-A colourful star(fish)like flurry of particles.
-
-Written by Calum Robinson and Tobias Sargeant; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/flyingtoasters.xml b/hacks/config/flyingtoasters.xml
deleted file mode 100644
index 37b6c1c..0000000
--- a/hacks/config/flyingtoasters.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="flyingtoasters" _label="Flying Toasters" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=mLGDvtbFvfg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Air speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="8.0" default="1.0"/>
-
- <number id="ntoasters" type="slider" arg="-ntoasters %"
- _label="Number of toasters" _low-label="None" _high-label="Swarm"
- low="0" high="50" default="20"/>
-
- <number id="nslices" type="slider" arg="-nslices %"
- _label="Number of slices" _low-label="None" _high-label="Swarm"
- low="0" high="50" default="25"/>
-
- <hgroup>
- <boolean id="tex" _label="Chrome" arg-unset="-no-texture"/>
- <boolean id="fog" _label="Fog" arg-unset="-no-fog"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A fleet of 3d space-age jet-powered flying toasters (and toast!)
-Inspired by the ancient Berkeley Systems After Dark flying toasters.
-
-https://en.wikipedia.org/wiki/After_Dark_%28software%29#Flying_Toasters
-
-Written by Jamie Zawinski and Devon Dossett; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/fontglide.xml b/hacks/config/fontglide.xml
deleted file mode 100644
index fa818a2..0000000
--- a/hacks/config/fontglide.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fontglide" _label="Font Glide">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=2KCXD19FHk0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10.0" default="1.0"/>
-
- <number id="linger" type="slider" arg="-linger %"
- _label="Page linger" _low-label="Brief" _high-label="Long"
- low="0.1" high="10.0" default="1.0"/>
-
- <select id="mode">
- <option id="page" _label="Pages of text" arg-set="-mode page"/>
- <option id="scroll" _label="Horizontally scrolling text" arg-set="-mode scroll"/>
- <option id="random" _label="Random display style"/>
- </select>
-
- <hgroup>
- <number id="bw" type="spinbutton" arg="-bw %"
- _label="Font border thickness" low="0" high="8" default="2"/>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <xscreensaver-text />
- <hgroup>
- <boolean id="trails" _label="Vapor trails" arg-set="-trails"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Puts text on the screen using large characters that glide in from the
-edges, assemble, then disperse. Alternately, it can simply scroll whole
-sentences from right to left.
-
-Written by Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/forest.xml b/hacks/config/forest.xml
deleted file mode 100644
index 2e0bd41..0000000
--- a/hacks/config/forest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="forest" _label="Forest">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=EEK2qbAmKWs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="3000000" default="500000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="20" default="20"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Fractal trees.
-
-Written by Peter Baumung; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/fuzzyflakes.xml b/hacks/config/fuzzyflakes.xml
deleted file mode 100644
index 96f8389..0000000
--- a/hacks/config/fuzzyflakes.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="fuzzyflakes" _label="Fuzzy Flakes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=NrGe3xcqAns"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="1" high="50" default="10"/>
-
- <number id="layers" type="slider" arg="-layers %"
- _label="Layers" _low-label="Few" _high-label="Many"
- low="1" high="10" default="3"/>
-
- <hgroup>
- <boolean id="rc" _label="Random colors" arg-set="-random-colors"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <select id="color">
- <option id="lred" _label="Red" arg-set="-color #FF0000"/>
- <option id="pink" _label="Pink"/>
- <option id="lyellow" _label="Yellow" arg-set="-color #FFFF00"/>
- <option id="lgreen" _label="Green" arg-set="-color #00FF00"/>
- <option id="lcyan" _label="Cyan" arg-set="-color #00FFFF"/>
- <option id="lblue" _label="Blue" arg-set="-color #0000FF"/>
- <option id="lmagenta" _label="Magenta" arg-set="-color #FF00FF"/>
- </select>
-
- </vgroup>
- <vgroup>
- <number id="arms" type="slider" arg="-arms %"
- _label="Arms" _low-label="Few" _high-label="Many"
- low="1" high="10" default="5"/>
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="1" high="50" default="10"/>
- <number id="bthickness" type="slider" arg="-bthickness %"
- _label="Border thickness" _low-label="Thin" _high-label="Thick"
- low="0" high="50" default="3"/>
- <number id="radius" type="slider" arg="-radius %"
- _label="Radius" _low-label="Small" _high-label="Large"
- low="1" high="100" default="20"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Falling colored snowflake/flower shapes.
-
-https://en.wikipedia.org/wiki/Snowflake
-
-Written by Barry Dmytro; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/galaxy.xml b/hacks/config/galaxy.xml
deleted file mode 100644
index b12d62f..0000000
--- a/hacks/config/galaxy.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="galaxy" _label="Galaxy">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=xBprAm9w-Fo"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Count" low="-20" high="20" default="-5"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="10" high="1000" default="250"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="10" high="255" default="64"/>
-
- <boolean id="spin" _label="Rotate viewpoint" arg-unset="-no-spin"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Spinning galaxies collide.
-
-Written by Uli Siegmund, Harald Backert, and Hubert Feyrer; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/gears.xml b/hacks/config/gears.xml
deleted file mode 100644
index a1cbaeb..0000000
--- a/hacks/config/gears.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="gears" _label="Gears" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=OHamiC1tcdg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="5.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Gear count" _low-label="0" _high-label="20"
- low="0" high="20" default="0"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Interlocking gears. See also the "Pinion" and "Möbius Gears" screen savers.
-
-https://en.wikipedia.org/wiki/Involute_gear
-https://en.wikipedia.org/wiki/Epicyclic_gearing
-
-Written by Jamie Zawinski; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/geodesic.xml b/hacks/config/geodesic.xml
deleted file mode 100644
index 0bc52ff..0000000
--- a/hacks/config/geodesic.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="geodesic" _label="Geodesic" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=qulzooBLIcU"/>
-
- <hgroup>
- <vgroup>
- <select id="object">
- <option id="mesh" _label="Mesh faces"/>
- <option id="solid" _label="Solid faces" arg-set="-mode solid"/>
- <option id="stellated" _label="Stellated faces" arg-set="-mode stellated"/>
- <option id="stellated2" _label="Inverse Stellated" arg-set="-mode stellated2"/>
- <option id="wire" _label="Wireframe" arg-set="-mode wire"/>
- <option id="random" _label="Random face style" arg-set="-mode random"/>
- </select>
-
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
-
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="10.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Depth" _low-label="1" _high-label="8"
- low="1" high="8" default="4"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A mesh geodesic sphere of increasing and decreasing complexity.
-
-A geodesic sphere is an icosohedron whose equilateral faces are
-sub-divided into non-equilateral triangles to more closely approximate
-a sphere.
-
-The animation shows the equilateral triangles subdivided into four
-coplanar equilateral triangles; and then inflated outward, causing the
-sub-triangles to no longer be equilateral, but to more closely
-approximate the surface of a sphere.
-
-https://en.wikipedia.org/wiki/Geodesic_dome
-https://en.wikipedia.org/wiki/Buckminster_Fuller
-
-Written by Jamie Zawinski; 2013.
- </_description>
-</screensaver>
diff --git a/hacks/config/geodesicgears.xml b/hacks/config/geodesicgears.xml
deleted file mode 100644
index 3922f70..0000000
--- a/hacks/config/geodesicgears.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="geodesicgears" _label="Geodesic Gears" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=gd_nTnJQ4Ps"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="timeout" type="slider" arg="-timeout %"
- _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
- low="5" high="120" default="20"/>
-
- <hgroup>
- <boolean id="labels" _label="Describe gears" arg-set="-labels"/>
- <boolean id="numbers" _label="Number gears" arg-set="-numbers"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A set of meshed gears arranged on the surface of a sphere.
-
-https://en.wikipedia.org/wiki/Geodesic_dome
-https://en.wikipedia.org/wiki/Involute_gear
-https://en.wikipedia.org/wiki/Buckminster_Fuller
-
-Written by Jamie Zawinski; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/gflux.xml b/hacks/config/gflux.xml
deleted file mode 100644
index baced13..0000000
--- a/hacks/config/gflux.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="gflux" _label="GFlux" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=vbRFlKH-LpA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="wave" type="slider" arg="-speed %"
- _label="Wave speed" _low-label="Slow" _high-label="Fast"
- low="0" high="0.50" default="0.05"
- convert="invert"/>
- </vgroup>
- <vgroup>
- <number id="squares" type="slider" arg="-squares %"
- _label="Mesh density" _low-label="Sparse" _high-label="Dense"
- low="2" high="40" default="19"/>
-
- <number id="waves" type="slider" arg="-waves %"
- _label="Waves" _low-label="1" _high-label="10"
- low="1" high="10" default="3"/>
- </vgroup>
- </hgroup>
-
- <select id="mode">
- <option id="wire" _label="Wire mesh" arg-set="-mode wire"/>
- <option id="solid" _label="Flat lighting" arg-set="-mode solid"/>
- <option id="light" _label="Directional lighting" arg-set="-mode light"/>
- <option id="checker" _label="Checkerboard" arg-set="-mode checker"/>
- <option id="grab" _label="Picture" />
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <!-- #### -resolution [4] -->
- <!-- #### -flat [0] -->
- <!-- #### -rotationx [0.01] -->
- <!-- #### -rotationy [0.0] -->
- <!-- #### -rotationz [0.1] -->
- <!-- #### -waveChange [50] -->
- <!-- #### -waveHeight [1.0] -->
- <!-- #### -waveFreq [3.0] -->
- <!-- #### -zoom [1.0] -->
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-Undulating waves on a rotating grid.
-
-Written by Josiah Pease; 2000.
- </_description>
-</screensaver>
diff --git a/hacks/config/gibson.xml b/hacks/config/gibson.xml
deleted file mode 100644
index 3e69a9c..0000000
--- a/hacks/config/gibson.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="gibson" _label="Gibson" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=_gOhMR3TrHA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Glyph speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
- </vgroup>
- <vgroup>
- <number id="grid-width" type="spinbutton" arg="-grid-width %"
- _label="Grid width" low="1" high="20" default="6"/>
-
- <number id="grid-depth" type="spinbutton" arg="-grid-depth %"
- _label="Grid depth" low="1" high="20" default="6"/>
- </vgroup>
- <vgroup>
- <number id="grid-height" type="spinbutton" arg="-grid-height %"
- _label="Tower depth" low="1" high="20" default="7"/>
-
- <number id="spacing" type="spinbutton" arg="-spacing %"
- _label="Tower spacing" low="1" high="5" default="2.0"/>
-
- <number id="columns" type="spinbutton" arg="-columns %"
- _label="Text columns" low="1" high="20" default="5"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <xscreensaver-updater />
- </hgroup>
-
- <_description>
-Hacking the Gibson, as per the 1995 classic film, HACKERS.
-
-Cereal Killer: "Oh yeah, you want a seriously righteous hack, you score
-one of those Gibsons, man. You know, supercomputers they use to like,
-do physics, and look for oil and stuff?"
-
-Phantom Phreak: "Ain't no way, man, security's too tight. The big iron?"
-
-Zero Cool: "Maybe. But, if I were gonna hack some heavy metal, I'd, uh,
-work my way back through some low security, and try the back door."
-
-Cereal Killer: "Yeah but oh man, wouldn't you just love to get one of
-those Gibsons, baby? Ooooh!"
-
-Phantom Phreak: "Yo, who ate all of my fries?"
-
-Written by Jamie Zawinski; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/glblur.xml b/hacks/config/glblur.xml
deleted file mode 100644
index 7aa6c52..0000000
--- a/hacks/config/glblur.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glblur" _label="GL Blur" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=wUWwQXRp8lE"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="blursize" type="slider" arg="-blursize %"
- _label="Blur smoothness" _low-label="Sparse" _high-label="Dense"
- low="1" high="100" default="15"/>
-
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Flowing field effects from the vapor trails around a moving object.
-
-This is done by rendering the scene into a small texture, then
-repeatedly rendering increasingly-enlarged and increasingly-transparent
-versions of that texture onto the frame buffer. As such, it's quite
-GPU-intensive: if you don't have a very good graphics card, it
-will hurt your machine bad.
-
-Written by Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/glcells.xml b/hacks/config/glcells.xml
deleted file mode 100644
index 6d6cdca..0000000
--- a/hacks/config/glcells.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glcells" _label="GL Cells" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=94ac7nEQyBI"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
- <number id="pause" type="slider" arg="-pause %"
- _label="Linger" _low-label="Short" _high-label="Long"
- low="0" high="400" default="50"/>
- <number id="maxcells" type="slider" arg="-maxcells %"
- _label="Max cells" _low-label="Few" _high-label="Many"
- low="50" high="5000" default="800"/>
- <number id="radius" type="slider" arg="-radius %"
- _label="Cell radius" _low-label="Small" _high-label="Huge"
- low="5" high="80" default="40"/>
- <select id="quality">
- <option id="q0" _label="Lowest sphere detail" arg-set="-quality 0"/>
- <option id="q1" _label="Medium sphere detail" arg-set="-quality 1"/>
- <option id="q2" _label="Normal sphere detail" arg-set="-quality 2"/>
- <option id="q3" _label="More sphere detail"/>
- <option id="q4" _label="Highest sphere detail" arg-set="-quality 4"/>
- </select>
- </vgroup>
- <vgroup>
- <number id="minfood" type="slider" arg="-minfood %"
- _label="Min food" _low-label="Starve" _high-label="Gorge"
- low="0" high="100" default="5"/>
- <number id="maxfood" type="slider" arg="-maxfood %"
- _label="Max food" _low-label="Starve" _high-label="Gorge"
- low="10" high="100" default="20"/>
- <number id="divideage" type="slider" arg="-divideage %"
- _label="Cell division" _low-label="Quick" _high-label="Slow"
- low="1" high="100" default="20"/>
- <number id="mindist" type="slider" arg="-mindist %"
- _label="Min distance" _low-label="Small" _high-label="Large"
- low="1.0" high="3.0" default="1.4"/>
- <number id="seeds" type="slider" arg="-seeds %"
- _label="Seeds" _low-label="1" _high-label="15"
- low="1" high="15" default="1"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="keepold" _label="Keep dead cells" arg-set="-keepold"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Cells growing, dividing and dying on your screen. Microscopic pathos.
-
-Written by Matthias Toussaint; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/gleidescope.xml b/hacks/config/gleidescope.xml
deleted file mode 100644
index b75bc11..0000000
--- a/hacks/config/gleidescope.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="gleidescope" _label="Gleidescope" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=q6F-CDX6-tU"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="size" _label="Size of tube" arg="-size %"
- type="slider" _low-label="Small" _high-label="Large"
- low="0" high="10" default="0" />
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Image duration"
- _low-label="10 seconds" _high-label="5 minutes"
- low="10" high="300" default="30"/>
-
- <hgroup>
- <boolean id="move" _label="Move" arg-unset="-no-move"/>
- <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
- <boolean id="zoom" _label="Zoom" arg-set="-zoom"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-A kaleidoscope that operates on a loaded image.
-
-https://en.wikipedia.org/wiki/Kaleidoscope
-
-Written by Andrew Dean; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/glforestfire.xml b/hacks/config/glforestfire.xml
deleted file mode 100644
index a479f7f..0000000
--- a/hacks/config/glforestfire.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glforestfire" _label="GL Forest Fire" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=_0Ff3qHUfsA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Rain" _high-label="Huge fire"
- low="0" high="8000" default="800"/>
-
- <number id="trees" type="slider" arg="-trees %"
- _label="Number of trees" _low-label="Desert" _high-label="Forest"
- low="0" high="20" default="5"/>
-
- <hgroup>
- <vgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="tex" _label="Textures" arg-unset="-no-texture"/>
- <boolean id="shadow" _label="Shadows" arg-unset="-no-shadows"/>
- </vgroup>
- <vgroup>
- <boolean id="fog" _label="Fog" arg-set="-fog"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Draws an animation of sprinkling fire-like 3D triangles in a landscape
-filled with trees.
-
-Written by Eric Lassauge; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml
deleted file mode 100644
index 825be84..0000000
--- a/hacks/config/glhanoi.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glhanoi" _label="GL Hanoi" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=1qRCviRmsTY"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="15000" convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of disks" _low-label="0" _high-label="31"
- default="0" low="0" high="31"/>
-
- <number id="poles" type="slider" arg="-poles %"
- _label="Number of poles" _low-label="0" _high-label="31"
- default="0" low="3" high="31"/>
- </vgroup>
-
- <vgroup>
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed (of smallest disks)" _low-label="1" _high-label="20"
- default="1" low="1" high="20"/>
-
- <number id="trails" type="slider" arg="-trails %"
- _label="Length of disk trails" _low-label="0" _high-label="10"
- default="2" low="0" high="10"/>
-
- <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <boolean id="lighting" _label="Enable lighting" arg-unset="-no-light"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Solves the Towers of Hanoi puzzle. Move N disks from one pole to
-another, one disk at a time, with no disk ever resting on a disk
-smaller than itself.
-
-https://en.wikipedia.org/wiki/Tower_of_Hanoi
-
-Written by Dave Atkinson; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/glitchpeg.xml b/hacks/config/glitchpeg.xml
deleted file mode 100644
index f53777c..0000000
--- a/hacks/config/glitchpeg.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glitchpeg" _label="GlitchPEG">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Xl5vKJ65_xM"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="1 second" _high-label="10 minutes"
- low="1" high="600" default="120"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Glitchiness" _low-label="Low" _high-label="High"
- low="1" high="1024" default="100"/>
-
- </vgroup>
-
- <vgroup>
- <xscreensaver-image />
- <xscreensaver-updater />
- </vgroup>
- </hgroup>
-
- <_description>
-Loads an image, corrupts it, and then displays the corrupted version,
-several times a second. After a while, finds a new image to corrupt.
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/glknots.xml b/hacks/config/glknots.xml
deleted file mode 100644
index ec50ae9..0000000
--- a/hacks/config/glknots.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glknots" _label="GL Knots" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ILiYNkeEb_k"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="5.0" default="1.0"/>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
-
- </vgroup>
- <vgroup>
-
- <number id="segments" type="slider" arg="-segments %"
- _label="Resolution" _low-label="Segmented" _high-label="Smooth"
- low="100" high="2000" default="800"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="0.05" high="1.0" default="0.3"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <hgroup>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Generates some twisting 3d knot patterns. Spins 'em around.
-
-https://en.wikipedia.org/wiki/Knot_theory
-
-Written by Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml
deleted file mode 100644
index b4cfd9a..0000000
--- a/hacks/config/glmatrix.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glmatrix" _label="GL Matrix" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=_dktSpsaCPg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="density" type="slider" arg="-density %"
- _label="Glyph density" _low-label="Sparse" _high-label="Dense"
- low="0" high="100" default="20"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Glyph speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
-
- <select id="mode">
- <option id="matrix" _label="Matrix encoding"/>
- <option id="binary" _label="Binary encoding" arg-set="-mode binary"/>
- <option id="hex" _label="Hexadecimal encoding" arg-set="-mode hex"/>
- <option id="dna" _label="Genetic encoding" arg-set="-mode dna"/>
- </select>
-
- <hgroup>
- <boolean id="fog" _label="Fog" arg-unset="-no-fog"/>
- <boolean id="waves" _label="Waves" arg-unset="-no-waves"/>
- <boolean id="rotate" _label="Panning" arg-unset="-no-rotate"/>
- </hgroup>
-
- <hgroup>
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The 3D "digital rain" effect, as seen in the title sequence of "The Matrix".
-
-See also "xmatrix" for a 2D rendering of the similar effect that
-appeared on the computer monitors actually *in* the movie.
-
-https://en.wikipedia.org/wiki/Matrix_digital_rain
-
-Written by Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/glplanet.xml b/hacks/config/glplanet.xml
deleted file mode 100644
index 2958d42..0000000
--- a/hacks/config/glplanet.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glplanet" _label="GL Planet" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ohcJ1bVkLZ4"/>
-<!--<video href="https://www.youtube.com/watch?v=OZ6zRLLFLk4"/>-->
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <!-- #### -no-texture -->
-
- <file id="image" _label="Day image" arg="-image %" />
- <file id="image2" _label="Night image" arg="-image2 %" />
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
- <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
- <boolean id="stars" _label="Stars" arg-unset="-no-stars"/>
- <select id="mode">
- <option id="globe" _label="Globe"/>
- <option id="mercator" _label="Mercator"
- arg-set="-mode mercator"/>
- <option id="equirectangular" _label="Equirectangular"
- arg-set="-mode equirectangular"/>
- </select>
-
- </hgroup>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The Earth, bouncing around in space, rendered with satellite imagery
-of the planet in both sunlight and darkness.
-
-If you would like it to display a different planet, any pair of
-Equirectangular-projected maps will work. The maps that come with
-"ssystem" work well.
-
-Written by David Konerding and Jamie Zawinski; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/glschool.xml b/hacks/config/glschool.xml
deleted file mode 100644
index ca5bb1d..0000000
--- a/hacks/config/glschool.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glschool" _label="GL School" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=SuMIatcSPdU"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000" convert="invert"/>
-
- <number id="NFish" type="slider" arg="-nfish %"
- _label="Fish count" _low-label="Few" _high-label="Lots"
- low="5" high="500" default="100"/>
-
- <number id="AvoidFact" type="slider" arg="-avoidfact %" _label="Avoidance" _low-label="None" _high-label="High" low="0" high="10" default="1.5"/>
- </vgroup>
- <vgroup>
- <number id="MatchFact" type="slider" arg="-matchfact %" _label="Velocity matching" _low-label="None" _high-label="High" low="0" high="3" default="0.15"/>
- <number id="CenterFact" type="slider" arg="-centerfact %" _label="Centering" _low-label="None" _high-label="High" low="0" high="1.0" default="0.1"/>
- <number id="TargetFact" type="slider" arg="-targetfact %" _label="Goal following" _low-label="None" _high-label="High" low="0" high="400" default="80"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="fog" _label="Fog" arg-set="-fog"/>
- <boolean id="drawgoal" _label="Draw goal" arg-set="-drawgoal"/>
- <boolean id="drawbbox" _label="Draw bounding box" arg-unset="-no-drawbbox"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A school of fish, using the classic "Boids" algorithm by Craig Reynolds.
-
-https://en.wikipedia.org/wiki/Boids
-
-Written by David C. Lambert and Jamie Zawinski; 2006.
- </_description>
-</screensaver>
diff --git a/hacks/config/glslideshow.xml b/hacks/config/glslideshow.xml
deleted file mode 100644
index 74f67b2..0000000
--- a/hacks/config/glslideshow.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glslideshow" _label="GL Slideshow" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Hi0xUWnqBhQ"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Time until loading a new image"
- _low-label="10 seconds" _high-label="5 minutes"
- low="10" high="300" default="30"/>
-
- <number id="zoom" type="slider" arg="-zoom %"
- _label="Always show at least this much of the image"
- _low-label="50%" _high-label="100%"
- low="50" high="100" default="75"/>
-
- <number id="pan" type="slider" arg="-pan %"
- _label="Pan/zoom duration"
- _low-label="1 second" _high-label="30 seconds"
- low="1" high="30" default="6"/>
-
- <number id="fade" type="slider" arg="-fade %"
- _label="Crossfade duration"
- _low-label="None" _high-label="30 seconds"
- low="0" high="30" default="2"/>
- </vgroup>
- <vgroup>
-
- <boolean id="letterbox" _label="Letterbox" arg-unset="-no-letterbox"/>
- <boolean id="titles" _label="Show file names" arg-set="-titles"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
-Loads a random sequence of images and smoothly scans and zooms around
-in each, fading from pan to pan.
-
-Written by Jamie Zawinski and Mike Oliphant; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/glsnake.xml b/hacks/config/glsnake.xml
deleted file mode 100644
index 36c1821..0000000
--- a/hacks/config/glsnake.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="glsnake" _label="GL Snake" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=AIqz-G0n1JU"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-statictime %"
- _label="Duration" _low-label="1" _high-label="30 seconds"
- low="1000" high="30000" default="5000"/>
-
- <number id="packing" type="slider" arg="-explode %"
- _label="Packing" _low-label="Tight" _high-label="Loose"
- low="0.0" high="0.5" default="0.03"/>
- </vgroup>
- <vgroup>
-
- <number id="angvel" type="slider" arg="-angvel %"
- _label="Angular velocity" _low-label="Slow" _high-label="Fast"
- low="0.05" high="5.0" default="1.0"/>
- <number id="yangvel" type="slider" arg="-yangvel %"
- _label="Y angular velocity" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.10"/>
-
- <number id="zangvel" type="slider" arg="-zangvel %"
- _label="Z angular velocity" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.14"/>
-
- </vgroup>
- </hgroup>
-
-
- <hgroup>
- <boolean id="labels" _label="Show titles" arg-set="-titles"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The "Rubik's Snake" puzzle. See also the "Rubik" and "Cube21" screen savers.
-
-https://en.wikipedia.org/wiki/Rubik%27s_Snake
-
-Written by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/gltext.xml b/hacks/config/gltext.xml
deleted file mode 100644
index 48b5076..0000000
--- a/hacks/config/gltext.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="gltext" _label="GL Text" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=jrXa-QtY6MU"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <select id="text">
- <option id="uname" _label="Display system information" />
- <option id="clock" _label="Display date and time"
- arg-set="-text '%A%n%d %b %Y%n%r'"/>
- </select>
-
- <hgroup>
- <select id="facing">
- <option id="front" _label="Always face front"/>
- <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
- </select>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- </hgroup>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Displays a few lines of text spinning around in a solid 3D font.
-The text can use strftime() escape codes to display the current
-date and time.
-
-Written by Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/goop.xml b/hacks/config/goop.xml
deleted file mode 100644
index 53222f8..0000000
--- a/hacks/config/goop.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="goop" _label="Goop">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=bLMAF4Q-mGA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="12000"
- convert="invert"/>
-
- <number id="torque" type="slider" arg="-torque %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.0002" high="0.0500" default="0.0075"/>
-
- <number id="count" type="slider" arg="-planes %"
- _label="Blobs" _low-label="Few" _high-label="Many"
- low="1" high="50" default="12"/>
-
- </vgroup>
- <vgroup>
- <number id="elasticity" type="slider" arg="-elasticity %"
- _label="Elasticity" _low-label="Low" _high-label="High"
- low="0.1" high="5.0" default="0.9"/>
-
- <number id="maxv" type="slider" arg="-max-velocity %"
- _label="Speed limit" _low-label="Low" _high-label="High"
- low="0.1" high="3.0" default="0.5"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <hgroup>
- <select id="mode">
- <option id="transparent" _label="Transparent blobs"/>
- <option id="opaque" _label="Opaque blobs" arg-set="-mode opaque"/>
- <option id="xor" _label="XOR blobs" arg-set="-mode xor"/>
- </select>
-
- <select id="color-mode">
- <option id="additive" _label="Additive colors (transmitted light)"/>
- <option id="subtractive" _label="Subtractive colors (reflected light)"
- arg-set="-subtractive"/>
- </select>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Amoeba-like blobs change shape as they wander around the screen.
-They are translucent, so you can see the lower blobs through the
-higher ones, and when one passes over another, their colors merge. I
-got the idea for this from a mouse pad I had once, which achieved the
-same kind of effect in real life by having several layers of plastic
-with colored oil between them.
-
-Written by Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/grav.xml b/hacks/config/grav.xml
deleted file mode 100644
index 807f37d..0000000
--- a/hacks/config/grav.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="grav" _label="Grav">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=spQRFDmDMeg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of objects" _low-label="Few" _high-label="Many"
- low="1" high="40" default="12"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <hgroup>
- <boolean id="decay" _label="Orbital decay" arg-unset="-no-decay"/>
- <boolean id="trail" _label="Object trails" arg-unset="-no-trail"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-An orbital simulation. With trails enabled, it looks kind of like a
-cloud-chamber photograph.
-
-Written by Greg Bowering; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/gravitywell.xml b/hacks/config/gravitywell.xml
deleted file mode 100644
index eb8d190..0000000
--- a/hacks/config/gravitywell.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="gravitywell" _label="Gravity Well" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=yhsw0QhIjjs"/>
-
- <hgroup>
- <vgroup>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="8.0" default="1.0"/>
-
- <number id="resolution" type="slider" arg="-resolution %"
- _label="Resolution" _low-label="Low" _high-label="High"
- low="1.0" high="5.0" default="1.0"/>
- </vgroup>
- <vgroup>
-
- <number id="grid-size" type="slider" arg="-grid-size %"
- _label="Grid Size" _low-label="Dense" _high-label="Sparse"
- low="0.1" high="5.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of stars" _low-label="One" _high-label="Lots"
- low="1" high="40" default="15"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Massive objects distort space in a two dimensional universe.
-
-Written by Jamie Zawinski; 2019.
- </_description>
-</screensaver>
diff --git a/hacks/config/greynetic.xml b/hacks/config/greynetic.xml
deleted file mode 100644
index cbc11a9..0000000
--- a/hacks/config/greynetic.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="greynetic" _label="Greynetic">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=lVEi089s1_c"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="250000" default="10000"
- convert="invert"/>
-
- <boolean id="grey" _label="Grey" arg-set="-grey"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Colored, stippled and transparent rectangles.
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/halftone.xml b/hacks/config/halftone.xml
deleted file mode 100644
index be65660..0000000
--- a/hacks/config/halftone.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="halftone" _label="Halftone">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=K2lqgBPde4o"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000" convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Gravity points" _low-label="Few" _high-label="Many"
- low="1" high="50" default="10"/>
-
- <number id="size" type="slider" arg="-spacing %"
- _label="Dot size" _low-label="Small" _high-label="Big"
- low="2" high="50" default="14"/>
-
- <number id="dotfill" type="slider" arg="-sizefactor %"
- _label="Dot fill factor" _low-label="Small" _high-label="Large"
- low="0.1" high="3" default="1.5"/>
- </vgroup>
- <vgroup>
- <number id="minspeed" type="slider" arg="-minspeed %"
- _label="Minimum speed" _low-label="Low" _high-label="High"
- low="0.001" high="0.09" default="0.001"/>
-
- <number id="maxspeed" type="slider" arg="-maxspeed %"
- _label="Maximum speed" _low-label="Low" _high-label="High"
- low="0.001" high="0.09" default="0.02"/>
-
- <number id="minmass" type="slider" arg="-minmass %"
- _label="Minimum mass" _low-label="Small" _high-label="Large"
- low="0.001" high="0.09" default="0.001"/>
-
- <number id="maxmass" type="slider" arg="-maxmass %"
- _label="Maximum mass" _low-label="Small" _high-label="Large"
- low="0.001" high="0.09" default="0.02"/>
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A halftone dot pattern in motion.
-
-Draws the gravity force in each point on the screen seen through a
-halftone dot pattern. The gravity force is calculated from a set of
-moving mass points. View it from a distance for best effect.
-
-https://en.wikipedia.org/wiki/Halftone
-
-Written by Peter Jaric; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/halo.xml b/hacks/config/halo.xml
deleted file mode 100644
index ef947e2..0000000
--- a/hacks/config/halo.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="halo" _label="Halo">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=K7LbfXh3LTc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="200000" default="100000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of circles" _low-label="Few" _high-label="Many"
- low="0" high="20" default="0"/>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="100"/>
-
- <select id="mode">
- <option id="random" _label="Random mode"/>
- <option id="seuss" _label="Seuss mode" arg-set="-mode seuss"/>
- <option id="ramp" _label="Ramp mode" arg-set="-mode ramp"/>
- </select>
-
- <hgroup>
- <boolean id="animate" _label="Animate circles" arg-set="-animate"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Circular interference patterns.
-
-https://en.wikipedia.org/wiki/Moire_pattern
-
-Written by Jamie Zawinski; 1993.
- </_description>
-</screensaver>
diff --git a/hacks/config/handsy.xml b/hacks/config/handsy.xml
deleted file mode 100644
index 2ff9608..0000000
--- a/hacks/config/handsy.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="handsy" _label="Handsy" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=awI8EawYTdE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="2.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of hands" _low-label="Two" _high-label="Many"
- low="2" high="32" default="2"/>
- </vgroup>
-
- <vgroup>
-
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
- </select>
-
- <select id="facing">
- <option id="front" _label="Always face front"/>
- <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
- </select>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
- </vgroup>
- </hgroup>
-
- <_description>
-A set of robotic hands communicate non-verbally.
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/headroom.xml b/hacks/config/headroom.xml
deleted file mode 100644
index b176a33..0000000
--- a/hacks/config/headroom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="headroom" _label="Headroom" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=kuS_HK4bIFI"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="spikespeed" type="slider" arg="-speed %"
- _label="Spike growth" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10.0" default="1.0"/>
-
- <select id="rotation">
- <option id="no" _label="Don't wobble" arg-set="-spin 0"/>
- <option id="x" _label="Wobble around X axis" arg-set="-spin X"/>
- <option id="y" _label="Wobble around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Wobble around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Wobble around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Wobble around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Wobble around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Wobble around all three axes"/>
- </select>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-"Back in my day, we used to say 'No future'. Well. This is it."
--- Blank Reg
-
-"I can dump down all the information in the mind. Then I can eliminate any
-information I don't want. My parrot squawks in much the same way. For the
-moment, the computer power is only enough to generate a human head."
--- Bryce Lynch
-
-Written by Jamie Zawinski; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/helix.xml b/hacks/config/helix.xml
deleted file mode 100644
index 00d4525..0000000
--- a/hacks/config/helix.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="helix" _label="Helix">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=H-mMnadnPSs"/>
-
- <number id="delay" type="slider" arg="-subdelay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Linger" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Spirally string-art-ish patterns.
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/hexadrop.xml b/hacks/config/hexadrop.xml
deleted file mode 100644
index b845963..0000000
--- a/hacks/config/hexadrop.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hexadrop" _label="Hexadrop">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=HMPVzQUGW-Q"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="50000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="4.0" default="1.0"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Tile size" _low-label="Small" _high-label="Large"
- low="5" high="50" default="15"
- convert="invert"/>
- </vgroup>
-
- <vgroup>
- <select id="sides">
- <option id="0" _label="Random shape"/>
- <option id="3" _label="Triangles" arg-set="-sides 3"/>
- <option id="4" _label="Squares" arg-set="-sides 4"/>
- <option id="6" _label="Hexagons" arg-set="-sides 6"/>
- <option id="5" _label="Octagons" arg-set="-sides 8"/>
- </select>
-
- <select id="uniform">
- <option id="r-uniform" _label="Random speed"/>
- <option id="uniform" _label="Uniform speed" arg-set="-uniform-speed"/>
- <option id="no-uniform" _label="Non-uniform speed" arg-set="-nonuniform-speed"/>
- </select>
-
- <select id="lockstep">
- <option id="r-lockstep" _label="Random sync"/>
- <option id="lockstep" _label="Synchronized" arg-set="-lockstep"/>
- <option id="no-lockstep" _label="Non-synchronized" arg-set="-no-lockstep"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A grid of hexagons or other shapes, with tiles dropping out.
-
-https://en.wikipedia.org/wiki/Tiling_by_regular_polygons
-
-Written by Jamie Zawinski; 2013.
- </_description>
-</screensaver>
diff --git a/hacks/config/hexstrut.xml b/hacks/config/hexstrut.xml
deleted file mode 100644
index 679a672..0000000
--- a/hacks/config/hexstrut.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hexstrut" _label="Hex Strut" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=iOCffj3ZmgE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="5" default="1.0"/>
- </vgroup>
-
- <vgroup>
- <number id="count" type="slider" arg="-count %"
- _label="Hexagon Size" _low-label="Small" _high-label="Large"
- low="2" high="80" default="20"
- convert="invert"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Line Thickness" _low-label="Thin" _high-label="Thick"
- low="0.01" high="1.7" default="0.2"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A grid of hexagons composed of rotating Y-shaped struts.
-Waves of rotation and color changes randomly propagate across the plane.
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/hilbert.xml b/hacks/config/hilbert.xml
deleted file mode 100644
index 7f44aed..0000000
--- a/hacks/config/hilbert.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hilbert" _label="Hilbert" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=NhKmipo_Ek4"/>
-
- <hgroup>
- <vgroup>
-
- <hgroup>
- <select id="twodee">
- <option id="random" _label="2D or 3D"/>
- <option id="2D" _label="2D" arg-set="-mode 2d"/>
- <option id="3D" _label="3D" arg-set="-mode 3d"/>
- </select>
-
- <select id="closed">
- <option id="random" _label="Open or closed paths"/>
- <option id="closed" _label="Closed" arg-set="-ends closed"/>
- <option id="open" _label="Open" arg-set="-ends open"/>
- </select>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Slow" _high-label="Fast"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.02" high="10.0" default="1.0"/>
- </vgroup>
-
- <vgroup>
- <number id="depth" type="slider" arg="-max-depth %"
- _label="Recursion levels" _low-label="2" _high-label="10"
- low="2" high="10" default="5"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Line thickness" _low-label="Thin" _high-label="Thick"
- low="0.01" high="1.0" default="0.25"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The recursive Hilbert space-filling curve, both 2D and 3D variants.
-It incrementally animates the growth and recursion to the maximum
-depth, then unwinds it back.
-
-The Hilbert path is a single contiguous line that can fill a volume
-without crossing itself. As a data structure, Hilbert paths are
-useful because ordering along the curve preserves locality: points
-that are close together along the curve are also close together in space.
-The converse is often, but not always, true. The coloration
-reflects this.
-
-https://en.wikipedia.org/wiki/Hilbert_curve
-
-Written by Jamie Zawinski; 2011.
- </_description>
-</screensaver>
diff --git a/hacks/config/hopalong.xml b/hacks/config/hopalong.xml
deleted file mode 100644
index c3c5aad..0000000
--- a/hacks/config/hopalong.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hopalong" _label="Hopalong">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Ck0pKMflau0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Small" _high-label="Large"
- low="0" high="800000" default="2500"/>
- </vgroup>
-
- <vgroup>
- <number id="count" type="slider" arg="-count %"
- _label="Color contrast" _low-label="Low" _high-label="High"
- low="100" high="10000" default="1000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <boolean id="sine" _label="Sine" arg-set="-sine"/>
- <boolean id="martin" _label="Martin" arg-set="-martin"/>
- <boolean id="popcorn" _label="Popcorn" arg-set="-popcorn"/>
- </vgroup>
- <vgroup>
- <boolean id="jong" _label="Jong" arg-set="-jong"/>
- <boolean id="rr" _label="RR" arg-set="-rr"/>
- <boolean id="ejk1" _label="EJK1" arg-set="-ejk1"/>
- </vgroup>
- <vgroup>
- <boolean id="ejk2" _label="EJK2" arg-set="-ejk2"/>
- <boolean id="ejk3" _label="EJK3" arg-set="-ejk3"/>
- <boolean id="ejk4" _label="EJK4" arg-set="-ejk4"/>
- </vgroup>
- <vgroup>
- <boolean id="ejk5" _label="EJK5" arg-set="-ejk5"/>
- <boolean id="ejk6" _label="EJK6" arg-set="-ejk6"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Lacy fractal patterns based on iteration in the imaginary
-plane, from a 1986 Scientific American article. See also the
-"Discrete" screen saver.
-
-Written by Patrick Naughton; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/hydrostat.xml b/hacks/config/hydrostat.xml
deleted file mode 100644
index b8b8bbe..0000000
--- a/hacks/config/hydrostat.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hydrostat" _label="Hydrostat" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=nn-nA18hFt0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="4.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of squid" _low-label="One" _high-label="Many"
- low="1" high="100" default="3" />
-
- <number id="head_radius" type="slider" arg="-head-radius %"
- _label="Head size" _low-label="Small" _high-label="Large"
- low="10" high="100" default="60" />
-
- <number id="tentacles" type="slider" arg="-tentacles %"
- _label="Number of tentacles" _low-label="Few" _high-label="Many"
- low="3" high="100" default="35" />
-
- </vgroup>
- <vgroup>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="3" high="40" default="18" />
-
- <number id="length" type="slider" arg="-length %"
- _label="Length of tentacles" _low-label="Short" _high-label="Long"
- low="10" high="150" default="55" />
-
- <number id="gravity" type="slider" arg="-gravity %"
- _label="Gravity" _low-label="Weak" _high-label="Strong"
- low="0" high="10.0" default="0.5" />
-
- <number id="current" type="slider" arg="-current %"
- _label="Current" _low-label="Weak" _high-label="Strong"
- low="0.0" high="10.0" default="0.25" />
-
- <number id="friction" type="slider" arg="-friction %"
- _label="Viscosity" _low-label="Low" _high-label="High"
- low="0.0" high="0.1" default="0.02" />
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="pulse" _label="Pulse" arg-unset="-no-pulse" />
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <xscreensaver-updater />
- </hgroup>
-
- <_description>
-Wiggly squid or jellyfish with many tentacles.
-
-A muscular hydrostat is a biological structure used to move its host
-about, consisting of muscles with no skeletal support. It performs
-its hydraulic movement without fluid in a separate compartment, as in
-a hydrostatic skeleton.
-
-https://en.wikipedia.org/wiki/Muscular_hydrostat
-
-Written by Justin Windle and Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/hyperball.xml b/hacks/config/hyperball.xml
deleted file mode 100644
index 75c679c..0000000
--- a/hacks/config/hyperball.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hyperball" _label="Hyperball">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=BqOHgn0BQOc"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
-
- <number id="z" type="slider" arg="-observer-z %"
- _label="Zoom" _low-label="Near" _high-label="Far"
- low="1.125" high="10.0" default="3.0"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- <vgroup>
- <number id="xw" type="slider" arg="-xw %"
- _label="XW rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="0"/>
- <number id="xy" type="slider" arg="-xy %"
- _label="XY rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="3"/>
- <number id="xz" type="slider" arg="-xz %"
- _label="XZ rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="5"/>
- </vgroup>
- <vgroup>
- <number id="yw" type="slider" arg="-yw %"
- _label="YW rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="10"/>
- <number id="yz" type="slider" arg="-yz %"
- _label="YZ rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="0"/>
- <number id="zw" type="slider" arg="-zw %"
- _label="ZW rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="0"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.10. It has been replaced by the more general "Polytopes"
-screen saver, which can display this object as well as others. The
-Polytopes "120-cell" object corresponds to this one.
-
-Hyperball is to hypercube as dodecahedron is to cube: this displays
-a 2D projection of the sequence of 3D objects which are the projections
-of the 4D analog to the dodecahedron. Technically, it is a "120 cell
-polytope".
-
-https://en.wikipedia.org/wiki/Hypercube
-https://en.wikipedia.org/wiki/Regular_polytope
-
-Written by Joe Keane; 2000.
- </_description>
-</screensaver>
diff --git a/hacks/config/hypercube.xml b/hacks/config/hypercube.xml
deleted file mode 100644
index 857d3a6..0000000
--- a/hacks/config/hypercube.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hypercube" _label="Hypercube">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=tOLzz_D4-0E"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="z" type="slider" arg="-observer-z %"
- _label="Zoom" _low-label="Near" _high-label="Far"
- low="1.125" high="10.0" default="3.0"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- <vgroup>
- <number id="xw" type="slider" arg="-xw %"
- _label="XW rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="0"/>
- <number id="xy" type="slider" arg="-xy %"
- _label="XY rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="3"/>
- <number id="xz" type="slider" arg="-xz %"
- _label="XZ rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="5"/>
- </vgroup>
- <vgroup>
- <number id="yw" type="slider" arg="-yw %"
- _label="YW rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="10"/>
- <number id="yz" type="slider" arg="-yz %"
- _label="YZ rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="0"/>
- <number id="zw" type="slider" arg="-zw %"
- _label="ZW rotation" _low-label="Slow" _high-label="Fast"
- low="0" high="20" default="0"/>
- </vgroup>
- </hgroup>
-
- <!-- #### -color0 [magenta] -->
- <!-- #### -color1 [yellow] -->
- <!-- #### -color2 [#FF9300] -->
- <!-- #### -color3 [#FF0093] -->
- <!-- #### -color4 [green] -->
- <!-- #### -color5 [#8080FF] -->
- <!-- #### -color6 [#00D0FF] -->
- <!-- #### -color7 [#00FFD0] -->
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.10. It has been replaced by the more general "Polytopes"
-screen saver, which can display this object as well as others.
-
-This displays 2D projections of the sequence of 3D objects which are
-the projections of the 4D analog to the cube: as a square is composed
-of four lines, each touching two others; and a cube is composed of
-six squares, each touching four others; a hypercube is composed of
-eight cubes, each touching six others. To make it easier to
-visualize the rotation, it uses a different color for the edges of
-each face. Don't think about it too long, or your brain will melt.
-
-https://en.wikipedia.org/wiki/Hypercube
-https://en.wikipedia.org/wiki/Tesseract
-https://en.wikipedia.org/wiki/Regular_polytope
-
-Written by Joe Keane, Fritz Mueller, and Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/hypertorus.xml b/hacks/config/hypertorus.xml
deleted file mode 100644
index 899d0cb..0000000
--- a/hacks/config/hypertorus.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hypertorus" _label="Hypertorus" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=KJWe4G4Qa1Q"/>
-
- <hgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <hgroup>
- <select id="display-mode">
- <option id="wire" _label="Wireframe"
- arg-set="-mode wireframe"/>
- <option id="surface" _label="Solid"/>
- <option id="transparent" _label="Transparent"
- arg-set="-mode transparent"/>
- </select>
-
- <select id="appearance">
- <option id="solid" _label="Solid object"
- arg-set="-appearance solid"/>
- <option id="bands" _label="Transparent bands"/>
- <option id="bands" _label="1 transparent spiral"
- arg-set="-appearance spirals-1"/>
- <option id="bands" _label="2 transparent spirals"
- arg-set="-appearance spirals-2"/>
- <option id="bands" _label="4 transparent spirals"
- arg-set="-appearance spirals-4"/>
- <option id="bands" _label="8 transparent spirals"
- arg-set="-appearance spirals-8"/>
- <option id="bands" _label="16 Transparent spirals"
- arg-set="-appearance spirals-16"/>
- </select>
-
- <select id="colors">
- <option id="onesided" _label="One-sided" arg-set="-onesided"/>
- <option id="twosided" _label="Two-sided" arg-set="-twosided"/>
- <option id="colorwheel" _label="Color wheel"/>
- </select>
-
- <boolean id="change-colors" _label="Change colors"
- arg-set="-change-colors"/>
-
- <select id="projection3d">
- <option id="perspective-3d" _label="Perspective 3D"/>
- <option id="orthographic-3d" _label="Orthographic 3D"
- arg-set="-orthographic-3d"/>
- </select>
-
- <select id="projection4d">
- <option id="perspective-4d" _label="Perspective 4D"/>
- <option id="orthographic-4d" _label="Orthographic 4D"
- arg-set="-orthographic-4d"/>
- </select>
- </hgroup>
-
- <hgroup>
-
- <vgroup>
-
- <number id="speed-wx" type="slider" arg="-speed-wx %"
- _label="WX rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.1"/>
-
- <number id="speed-wy" type="slider" arg="-speed-wy %"
- _label="WY rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.3"/>
-
- <number id="speed-wz" type="slider" arg="-speed-wz %"
- _label="WZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.5"/>
-
- </vgroup>
-
- <vgroup>
-
- <number id="speed-xy" type="slider" arg="-speed-xy %"
- _label="XY rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.7"/>
-
- <number id="speed-xz" type="slider" arg="-speed-xz %"
- _label="XZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.9"/>
-
- <number id="speed-yz" type="slider" arg="-speed-yz %"
- _label="YZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="2.1"/>
-
- </vgroup>
-
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A Clifford Torus: a torus lying on the "surface" of a 4D hypersphere.
-Inspired by Thomas Banchoff's book "Beyond the Third Dimension:
-Geometry, Computer Graphics, and Higher Dimensions", Scientific
-American Library, 1990.
-
-https://en.wikipedia.org/wiki/N-sphere
-https://en.wikipedia.org/wiki/Clifford_torus
-https://en.wikipedia.org/wiki/Regular_polytope
-
-Written by Carsten Steger; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/hypnowheel.xml b/hacks/config/hypnowheel.xml
deleted file mode 100644
index 27a45a6..0000000
--- a/hacks/config/hypnowheel.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="hypnowheel" _label="Hypnowheel" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=QcJnc9EKJrI"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Slow" _high-label="Fast"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="20.0" default="1.0"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- <boolean id="symmetric" _label="Symmetric twisting" arg-set="-symmetric"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- <vgroup>
-
- <number id="layers" type="slider" arg="-layers %"
- _label="Layers" _low-label="1" _high-label="50"
- low="1" high="50" default="4"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Arms" _low-label="2" _high-label="50"
- low="2" high="50" default="13"/>
-
- <number id="twistiness" type="slider" arg="-twistiness %"
- _label="Twistiness" _low-label="Low" _high-label="High"
- low="0.2" high="10.0" default="4.0"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Overlapping, translucent spiral patterns.
-The tightness of their spirals fluctuates in and out.
-
-https://en.wikipedia.org/wiki/Moire_pattern
-
-Written by Jamie Zawinski; 2008.
- </_description>
-</screensaver>
diff --git a/hacks/config/ifs.xml b/hacks/config/ifs.xml
deleted file mode 100644
index 14999f4..0000000
--- a/hacks/config/ifs.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="ifs" _label="IFS">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=0uOIrVFsECM"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="functions" type="slider" arg="-functions %"
- _label="Number of functions" _low-label="2" _high-label="6"
- low="2" high="6" default="3"/>
-
- <number id="detail" type="slider" arg="-detail %"
- _label="Detail" _low-label="Low" _high-label="High"
- low="4" high="14" default="9"/>
-
-<!--
- On a 2.93 gHz iMac i7, I get these rates with -delay 0:
-
- detail 3: invisible
- detail 4: barely visible
- detail 5: 1000+ fps, looks like noise at -delay 0, ok at -delay 20000
- detail 8: ~700+ fps
- detail 9: ~400 fps
- detail 10: ~300 fps
- detail 11: ~100 fps
- detail 12: ~50 fps
- detail 13: ~17 fps
- detail 14: ~8 fps
- detail 15: ~2 fps
-
- With the default -delay, CPU load only starts causing the frame rate
- to drop below 30 fps detail 12 or higher.
--->
-
- <number id="colors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="2" _high-label="Many"
- low="2" high="255" default="200" />
-
- <hgroup>
- <boolean id="translate" _label="Translate" arg-unset="-no-translate"/>
- <boolean id="scale" _label="Scale" arg-unset="-no-scale"/>
- <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-
-Clouds of iterated function systems spin and collide.
-
-Note that the "Detail" parameter is exponential. Number of points
-drawn is functions^detail.
-
-https://en.wikipedia.org/wiki/Iterated_function_system
-
-Written by Chris Le Sueur and Robby Griffin; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/imsmap.xml b/hacks/config/imsmap.xml
deleted file mode 100644
index ea92c08..0000000
--- a/hacks/config/imsmap.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="imsmap" _label="IMS Map">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=FP8YJzFkdoQ"/>
-
- <number id="delay2" type="slider" arg="-delay2 %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Linger" _low-label="1 Second" _high-label="1 Minute"
- low="1" high="60" default="5"/>
-
- <number id="iterations" type="slider" arg="-iterations %"
- _label="Density" _low-label="Sparse" _high-label="Dense"
- low="1" high="7" default="7"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="3" high="255" default="50"/>
-
- <select id="mode">
- <option id="random" _label="Random coloration"/>
- <option id="h" _label="Hue gradients" arg-set="-mode h"/>
- <option id="s" _label="Saturation gradients" arg-set="-mode s"/>
- <option id="v" _label="Brightness gradients" arg-set="-mode v"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Cloud-like patterns. The idea is to take four points on the edge of
-the image, and assign each a random "elevation". Then find the point
-between them, and give it a value which is the average of the other
-four, plus some small random offset. Coloration is done based on
-elevation.
-
-Written by Juergen Nickelsen and Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/interaggregate.xml b/hacks/config/interaggregate.xml
deleted file mode 100644
index c1ce7f3..0000000
--- a/hacks/config/interaggregate.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="interaggregate" _label="Interaggregate">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=wqPOZiuj4RI"/>
-
- <number id="speed" type="slider" arg="-growth-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="18000" convert="invert"/>
-
- <number id="init" type="slider" arg="-num-circles %"
- _label="Number of discs" _low-label="Few" _high-label="Many"
- low="50" high="400" default="100"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Pale pencil-like scribbles slowly fill the screen.
-
-A surface is filled with a hundred medium to small sized circles.
-Each circle has a different size and direction, but moves at the same
-slow rate. Displays the instantaneous intersections of the circles as
-well as the aggregate intersections of the circles.
-
-Though actually it doesn't look like circles at all!
-
-Written by Casey Reas, William Ngan, Robert Hodgin, and Jamie Zawinski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/interference.xml b/hacks/config/interference.xml
deleted file mode 100644
index 969d10c..0000000
--- a/hacks/config/interference.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="interference" _label="Interference">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=nEmvx4l1sHI"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="wspeed" type="slider" arg="-speed %"
- _label="Wave speed" _low-label="Slow" _high-label="Fast"
- low="1" high="100" default="30"/>
-
- <number id="radius" type="slider" arg="-radius %"
- _label="Wave size" _low-label="Small" _high-label="Large"
- low="50" high="1500" default="800"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of waves" _low-label="Few" _high-label="Many"
- low="0" high="20" default="3"/>
-
- </vgroup>
- <vgroup>
- <number id="gridsize" type="slider" arg="-gridsize %"
- _label="Magnification" _low-label="Low" _high-label="High"
- low="1" high="20" default="2"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="192"/>
-
- <number id="color_contrast" type="slider" arg="-color-shift %"
- _label="Color contrast" _low-label="Low" _high-label="High"
- low="0" high="100" default="60"/>
-
- <number id="hue" type="slider" arg="-hue %"
- _label="Hue" _low-label="0" _high-label="360"
- low="0" high="360" default="0"/>
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Color field based on computing decaying sinusoidal waves.
-
-Written by Hannu Mallat; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/intermomentary.xml b/hacks/config/intermomentary.xml
deleted file mode 100644
index 6db1424..0000000
--- a/hacks/config/intermomentary.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="intermomentary" _label="Intermomentary">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=pH-ykepPopw"/>
-
- <number id="speed" type="slider" arg="-draw-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000" convert="invert"/>
-
- <number id="init" type="slider" arg="-num-discs %"
- _label="Number of discs" _low-label="50" _high-label="400"
- low="50" high="400" default="85"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Blinking dots interact with each other circularly.
-
-A surface is filled with a hundred medium to small sized circles.
-Each circle has a different size and direction, but moves at the same
-slow rate. Displays the instantaneous intersections of the circles as
-well as the aggregate intersections of the circles.
-
-The circles begin with a radius of 1 pixel and slowly increase to some
-arbitrary size. Circles are drawn with small moving points along the
-perimeter. The intersections are rendered as glowing orbs. Glowing
-orbs are rendered only when a perimeter point moves past the
-intersection point.
-
-Written by Casey Reas, William Ngan, Robert Hodgin, and Jamie Zawinski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/jigglypuff.xml b/hacks/config/jigglypuff.xml
deleted file mode 100644
index f2d63c0..0000000
--- a/hacks/config/jigglypuff.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="jigglypuff" _label="Jiggly Puff" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=60vfs2WcDtE"/>
-
- <hgroup>
- <boolean id="random" _label="Randomize almost everything" arg-unset="-no-random"/>
-
- <select id="color">
- <option id="cycle" _label="Cycle" />
- <option id="flowerbox" _label="Flower box" arg-set="-color flowerbox"/>
- <option id="clownbarf" _label="Clown barf" arg-set="-color clownbarf"/>
- <option id="chrome" _label="Chrome" arg-set="-color chrome"/>
- </select>
-
- <select id="start">
- <option id="sphere" _label="Sphere" />
- <option id="tetrahedron" _label="Tetrahedron" arg-set="-tetra"/>
- </select>
-
- <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Rotation speed" _low-label="Slow" _high-label="Fast"
- low="50" high="1000" default="500"/>
-
- <number id="damping" type="slider" arg="-damping %"
- _label="Inertial damping" _low-label="Low" _high-label="High"
- low="10" high="1000" default="500" convert="invert"/>
- </vgroup>
-
- <vgroup>
- <number id="hold" type="slider" arg="-hold %"
- _label="Vertex-vertex force" _low-label="None" _high-label="Strong"
- low="0" high="1000" default="800"/>
-
- <number id="complexity" type="slider" arg="-complexity %"
- _label="Complexity" _low-label="Low" _high-label="High"
- low="1" high="3" default="2"/>
-
- <number id="spherism" type="slider" arg="-spherism %"
- _label="Sphere strength" _low-label="None" _high-label="Strong"
- low="0" high="1000" default="75"/>
- </vgroup>
-
- <vgroup>
- <number id="distance" type="slider" arg="-distance %"
- _label="Vertex-vertex behavior" _low-label="Expand"
- _high-label="Collapse" low="0" high="1000" default="100"/>
-
- <number id="spooky" type="slider" arg="-spooky %"
- _label="Spookiness" _low-label="None" _high-label="Spoooooky"
- low="0" high="12" default="0"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Quasi-spherical objects are distorted.
-
-You have a tetrahedron with tesselated faces. The vertices on these
-faces have forces on them: one proportional to the distance from the
-surface of a sphere; and one proportional to the distance from the
-neighbors. They also have inertia. The resulting effect can range
-from a shape that does nothing, to a frenetic polygon storm.
-Somewhere in between there it usually manifests as a blob that jiggles
-in a kind of disturbing manner.
-
-Written by Keith Macleod; 2003.
- </_description>
-
-</screensaver>
-
-
-
-
-
-
-
-
diff --git a/hacks/config/jigsaw.xml b/hacks/config/jigsaw.xml
deleted file mode 100644
index 219a534..0000000
--- a/hacks/config/jigsaw.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="jigsaw" _label="Jigsaw" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=T5_hiY2eEeo"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
- </vgroup>
- <vgroup>
- <number id="density" type="slider" arg="-complexity %"
- _label="Puzzle pieces" _low-label="Few" _high-label="Many"
- low="1.0" high="4.0" default="1.0"/>
-
- <number id="resolution" type="slider" arg="-resolution %"
- _label="Resolution" _low-label="Chunky" _high-label="Smooth"
- low="50" high="300" default="100"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <xscreensaver-image />
- </vgroup>
- <vgroup>
- <boolean id="wobble" _label="Tilt" arg-unset="-no-wobble"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Carves an image up into a jigsaw puzzle, shuffles it, and solves it.
-
-https://en.wikipedia.org/wiki/Jigsaw_puzzle
-https://en.wikipedia.org/wiki/Tessellation
-
-Written by Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/juggle.xml b/hacks/config/juggle.xml
deleted file mode 100644
index 8c8c05a..0000000
--- a/hacks/config/juggle.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="juggle" _label="Juggle">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=E3Ae7uQtWP0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="50" high="1000" default="200"
- convert="invert"/>
- </vgroup>
- <vgroup>
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Performance length" _low-label="Short" _high-label="Long"
- low="50" high="1000" default="1000"/>
-
- <number id="tail" type="slider" arg="-tail %"
- _label="Trail length" _low-label="None" _high-label="Long"
- low="0" high="100" default="1"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <boolean id="balls" _label="Balls" arg-unset="-no-balls"/>
- <boolean id="clubs" _label="Clubs" arg-unset="-no-clubs"/>
- </vgroup>
- <vgroup>
- <boolean id="rings" _label="Rings" arg-unset="-no-rings"/>
- <boolean id="knives" _label="Knives" arg-unset="-no-knives"/>
- </vgroup>
- <vgroup>
- <boolean id="torches" _label="Flaming torches" arg-unset="-no-torches"/>
- <boolean id="bballs" _label="Bowling balls" arg-unset="-no-bballs"/>
- </vgroup>
- </hgroup>
-
- <boolean id="describe" _label="Print Cambridge juggling pattern descriptions" arg-unset="-no-describe"/>
- <string id="pattern" _label="Juggle this pattern" arg="-pattern %" />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.09. It has been replaced by the "Juggler3D" screen saver.
-
-Written by Tim Auckland; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml
deleted file mode 100644
index 80d0c02..0000000
--- a/hacks/config/juggler3d.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="juggler3d" _label="Juggler 3D" gl="yes">
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=TJkKaXBOvCA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="50" high="1000" default="200"
- convert="invert"/>
- </vgroup>
- <vgroup>
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Performance length" _low-label="Short" _high-label="Long"
- low="50" high="1000" default="1000"/>
-
- <number id="tail" type="slider" arg="-tail %"
- _label="Trail length" _low-label="None" _high-label="Long"
- low="0" high="100" default="1"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="balls" _label="Balls" arg-unset="-no-balls"/>
- <boolean id="clubs" _label="Clubs" arg-unset="-no-clubs"/>
- <boolean id="rings" _label="Rings" arg-unset="-no-rings"/>
- <boolean id="knives" _label="Knives" arg-unset="-no-knives"/>
-<!--<boolean id="torches" _label="Flaming torches" arg-unset="-no-torches"/>-->
- <boolean id="bballs" _label="Bowling balls" arg-unset="-no-bballs"/>
- </hgroup>
-
- <boolean id="describe" _label="Print Cambridge juggling pattern descriptions" arg-unset="-no-describe"/>
- <string id="pattern" _label="Juggle this pattern" arg="-pattern %" />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A 3D juggling stick-man, with Cambridge juggling pattern
-notation used to describe the patterns he juggles.
-
-https://en.wikipedia.org/wiki/Siteswap
-
-Written by Tim Auckland and Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/julia.xml b/hacks/config/julia.xml
deleted file mode 100644
index f648197..0000000
--- a/hacks/config/julia.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="julia" _label="Julia">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=cA4Rgq-rmy8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Lots"
- low="10" high="20000" default="1000"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Iterations" _low-label="Small" _high-label="Large"
- low="1" high="100" default="20"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-The Julia set is a close relative of the Mandelbrot set. The
-small moving dot indicates the control point from which the rest of
-the image was generated. See also the "Discrete" screen saver.
-
-https://en.wikipedia.org/wiki/Julia_set
-
-Written by Sean McCullough; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/kaleidescope.xml b/hacks/config/kaleidescope.xml
deleted file mode 100644
index ccfc18f..0000000
--- a/hacks/config/kaleidescope.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="kaleidescope" _label="Kaleidescope">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=mGplFlx1y3M"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="nsegments" type="slider" arg="-nsegments %"
- _label="Segments" _low-label="Few" _high-label="Many"
- low="1" high="100" default="7"/>
-
- <number id="symmetry" type="slider" arg="-symmetry %"
- _label="Symmetry" _low-label="3" _high-label="32"
- low="3" high="32" default="11"/>
-
- <number id="ntrails" type="slider" arg="-ntrails %"
- _label="Trails" _low-label="Few" _high-label="Many"
- low="1" high="1000" default="100"/>
-
- <!-- #### -local_rotation [-59] -->
- <!-- #### -global_rotation [1] -->
- <!-- #### -spring_constant [5] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A simple kaleidoscope made of line segments. See "GLeidescope"
-for a more sophisticated take.
-
-https://en.wikipedia.org/wiki/Kaleidoscope
-
-Written by Ron Tapia; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/kaleidocycle.xml b/hacks/config/kaleidocycle.xml
deleted file mode 100644
index 06228d2..0000000
--- a/hacks/config/kaleidocycle.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="kaleidocycle" _label="Kaleidocycle" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=SJqRaCCy_vo"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="8" _high-label="64"
- low="8" high="64" default="16"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
- </vgroup>
-
- <vgroup>
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
- </select>
-
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Draw a ring composed of tetrahedra connected at the edges that twists
-and rotates toroidally.
-
-When a series of tetrahedra are joined at the edges in a loop, it is
-possible for them to rotate continously through the center without
-deforming. This only works with an even number of tetrahedra, and
-there must be eight or more, or they don't fit.
-
-Written by Jamie Zawinski; 2013.
- </_description>
-</screensaver>
diff --git a/hacks/config/klein.xml b/hacks/config/klein.xml
deleted file mode 100644
index e0e3b36..0000000
--- a/hacks/config/klein.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="klein" _label="Klein" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=c2gvyGVNG80"/>
-
- <hgroup>
- <select id="kleinbottle">
- <option id="random" _label="Random shape"/>
- <option id="figure-8" _label="Figure 8" arg-set="-klein-bottle figure-8"/>
- <option id="pinched-torus" _label="Pinched torus" arg-set="-klein-bottle pinched-torus"/>
- <option id="lawson" _label="Lawson" arg-set="-klein-bottle lawson"/>
- </select>
-
- <select id="view-mode">
- <option id="walk" _label="Random motion"/>
- <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
- <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
- <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
- </select>
-
- <boolean id="orientation-marks" _label="Show orientation marks"
- arg-set="-orientation-marks"/>
- </hgroup>
-
- <hgroup>
- <select id="display-mode">
- <option id="random" _label="Random surface"/>
- <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
- <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
- <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
- </select>
-
- <select id="appearance">
- <option id="random" _label="Random pattern"/>
- <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
- <option id="bands" _label="See-through bands" arg-set="-appearance bands"/>
- </select>
-
- <select id="colors">
- <option id="random" _label="Random coloration"/>
- <option id="twosided" _label="One-sided" arg-set="-colors one-sided"/>
- <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
- <option id="rainbow" _label="Rainbow colors" arg-set="-colors rainbow"/>
- <option id="depth" _label="4d depth colors" arg-set="-colors depth"/>
- </select>
-
- <boolean id="change-colors" _label="Change colors"
- arg-set="-change-colors"/>
-
- <select id="projection3d">
- <option id="random" _label="Random 3D"/>
- <option id="perspective-3d" _label="Perspective 3D" arg-set="-projection-3d perspective"/>
- <option id="orthographic-3d" _label="Orthographic 3D" arg-set="-projection-3d orthographic"/>
- </select>
-
- <select id="projection4d">
- <option id="random" _label="Random 4D"/>
- <option id="perspective-4d" _label="Perspective 4D" arg-set="-projection-4d perspective"/>
- <option id="orthographic-4d" _label="Orthographic 4D" arg-set="-projection-4d orthographic"/>
- </select>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="speed-wx" type="slider" arg="-speed-wx %"
- _label="WX rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.1"/>
-
- <number id="speed-wy" type="slider" arg="-speed-wy %"
- _label="WY rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.3"/>
-
- <number id="speed-wz" type="slider" arg="-speed-wz %"
- _label="WZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.5"/>
- </vgroup>
-
- <vgroup>
- <number id="speed-xy" type="slider" arg="-speed-xy %"
- _label="XY rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.7"/>
-
- <number id="speed-xz" type="slider" arg="-speed-xz %"
- _label="XZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.9"/>
-
- <number id="speed-yz" type="slider" arg="-speed-yz %"
- _label="YZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="2.1"/>
- </vgroup>
-
- <vgroup>
- <number id="walk-direction" type="slider" arg="-walk-direction %"
- _label="Walking direction"
- _low-label="-180.0" _high-label="180.0"
- low="-180.0" high="180.0" default="7.0"/>
-
- <number id="walk-speed" type="slider" arg="-walk-speed %"
- _label="Walking speed"
- _low-label="1.0" _high-label="100.0"
- low="1.0" high="100.0" default="20.0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A Klein bottle is the 4D analog of a möbius strip.
-
-You can walk on the surface of the bottle or rotate it in 4D or walk
-on it while it rotates in 4D. Inspired by Thomas Banchoff's book
-"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher
-Dimensions", Scientific American Library, 1990.
-
-https://en.wikipedia.org/wiki/Klein_bottle
-
-Written by Carsten Steger; 2008.
- </_description>
-</screensaver>
diff --git a/hacks/config/kumppa.xml b/hacks/config/kumppa.xml
deleted file mode 100644
index 85f7ee2..0000000
--- a/hacks/config/kumppa.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="kumppa" _label="Kumppa">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=64ULSfxhkDY"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="density" type="slider" arg="-speed %"
- _label="Density" _low-label="Low" _high-label="High"
- low="0.0001" high="0.2" default="0.1"/>
-
- <boolean id="random" _label="Randomize" arg-unset="-no-random"/>
-<!-- <boolean id="db" _label="Double buffer" arg-set="-db"/> -->
-
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Spiraling, spinning, and very, very fast splashes of color rush
-toward the screen.
-
-Written by Teemu Suutari; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/lament.xml b/hacks/config/lament.xml
deleted file mode 100644
index 7f0de9d..0000000
--- a/hacks/config/lament.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lament" _label="Lament" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=-TBqI4YKOKI"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Lemarchand's Box, the Lament Configuration.
-
-Warning: occasionally opens doors.
-
-https://en.wikipedia.org/wiki/Lemarchand%27s_box
-
-Written by Jamie Zawinski; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/laser.xml b/hacks/config/laser.xml
deleted file mode 100644
index 4694cca..0000000
--- a/hacks/config/laser.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="laser" _label="Laser">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=QjPEa3KDlsw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="40000"
- convert="invert"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Count" low="0" high="20" default="10"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="0" high="2000" default="200"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Moving radiating lines, that look vaguely like scanning laser beams.
-(Frankie say relax.)
-
-Written by Pascal Pensa; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/lavalite.xml b/hacks/config/lavalite.xml
deleted file mode 100644
index 5e7d4f7..0000000
--- a/hacks/config/lavalite.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lavalite" _label="Lavalite" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=XKbtdHL35u0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Activity" _low-label="Sparse" _high-label="Dense"
- low="0.001" high="0.01" default="0.003"/>
- </vgroup>
- <vgroup>
- <number id="count" type="slider" arg="-count %"
- _label="Max blobs" _low-label="1" _high-label="10"
- low="1" high="10" default="3"/>
-
- <number id="resolution" type="slider" arg="-resolution %"
- _label="Resolution" _low-label="Low" _high-label="High"
- low="10" high="120" default="40"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
-
- <hgroup>
- <boolean id="impatient" _label="Impatient" arg-set="-impatient"/>
- <boolean id="smooth" _label="Smooth" arg-unset="-no-smooth"/>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- </hgroup>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
- <vgroup>
-
- <select id="style">
- <option id="classic" _label="Classic Lavalite" arg-set="-style classic"/>
- <option id="giant" _label="Giant Lavalite" arg-set="-style giant"/>
- <option id="cone" _label="Cone Lavalite" arg-set="-style cone"/>
- <option id="rocket" _label="Rocket Lavalite" arg-set="-style rocket"/>
- <option id="random" _label="Random Lamp Style"/>
- </select>
-
- <select id="rotation">
- <option id="no" _label="Don't Rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
- </select>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A Simulation a Lava Lite(r). Odd-shaped blobs of a mysterious
-substance are heated, slowly rise to the top of the bottle, and then
-drop back down as they cool. This simulation requires a fairly fast
-machine (both CPU and 3D performance.)
-
-"LAVA LITE(r) and the configuration of the LAVA(r) brand motion lamp are
-registered trademarks of Haggerty Enterprises, Inc. The configuration
-of the globe and base of the motion lamp are registered trademarks of
-Haggerty Enterprises, Inc. in the U.S.A. and in other countries around
-the world."
-
-https://en.wikipedia.org/wiki/Lava_lamp
-https://en.wikipedia.org/wiki/Metaballs
-https://en.wikipedia.org/wiki/Lavarand
-
-Written by Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/lcdscrub.xml b/hacks/config/lcdscrub.xml
deleted file mode 100644
index 7cfd3d1..0000000
--- a/hacks/config/lcdscrub.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lcdscrub" _label="LCD Scrub">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=aWtHHBOkO4w"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="5000000" default="100000"
- convert="invert"/>
-
- <hgroup>
- <vgroup>
- <number id="spread" type="spinbutton" arg="-spread %"
- _label="Line spread" low="2" high="8192" default="8"/>
- <number id="cycles" type="spinbutton" arg="-cycles %"
- _label="Cycles" low="1" high="600" default="60"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- <vgroup>
- <boolean id="hw" _label="Horizontal white" arg-unset="-no-hw"/>
- <boolean id="vw" _label="Vertical white" arg-unset="-no-vw"/>
- <boolean id="dw" _label="Diagonal white" arg-unset="-no-dw"/>
- </vgroup>
- <vgroup>
- <boolean id="w" _label="Solid white" arg-unset="-no-w"/>
- <boolean id="rgb" _label="Primary colors" arg-unset="-no-rgb"/>
- <boolean id="hb" _label="Horizontal black" arg-unset="-no-hb"/>
- </vgroup>
- <vgroup>
- <boolean id="vb" _label="Vertical black" arg-unset="-no-vb"/>
- <boolean id="db" _label="Diagonal black" arg-unset="-no-db"/>
- <boolean id="b" _label="Solid black" arg-unset="-no-b"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-repairs burn-in on LCD monitors. This saver is functional,
-rather than pretty.
-
-Believe it or not, screen burn is not a thing of the past.
-It can happen to LCD screens pretty easily, even in this modern age.
-However, leaving the screen on and displaying high contrast images
-can often repair the damage. That's what this screen saver does.
-
-See also:
-http://docs.info.apple.com/article.html?artnum=88343
-http://toastycode.com/blog/2008/02/05/lcd-scrub/
-
-Inspired by the like-named program by Daniel Sandler.
-
-Written by Jamie Zawinski; 2008.
- </_description>
-</screensaver>
diff --git a/hacks/config/lightning.xml b/hacks/config/lightning.xml
deleted file mode 100644
index 8e602fe..0000000
--- a/hacks/config/lightning.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lightning" _label="Lightning">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=lUUdHtPvp5Y"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Crackling fractal lightning bolts.
-
-Written by Keith Romberg; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/lisa.xml b/hacks/config/lisa.xml
deleted file mode 100644
index d142fad..0000000
--- a/hacks/config/lisa.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lisa" _label="Lisa">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=AUbAuARmlnE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="50000" default="17000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Steps" _low-label="Few" _high-label="Many"
- low="1" high="1000" default="768"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
- </vgroup>
-
- <vgroup>
- <number id="size" type="slider" arg="-size %"
- _label="Size" _low-label="Small" _high-label="Large"
- low="10" high="500" default="500"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="1" _high-label="20"
- low="0" high="20" default="1"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Lissajous loops.
-
-https://en.wikipedia.org/wiki/Lissajous_curve
-
-Written by Caleb Cullen; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/lissie.xml b/hacks/config/lissie.xml
deleted file mode 100644
index ca165a4..0000000
--- a/hacks/config/lissie.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lissie" _label="Lissie">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=6EBNCXcD9f0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="80000" default="20000"/>
- </vgroup>
-
- <vgroup>
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="1" _high-label="20"
- low="0" high="20" default="1"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="size" type="spinbutton" arg="-size %"
- _label="Size" low="-500" high="500" default="-200"/>
- </vgroup>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Lissajous loops. This one draws the progress of circular shapes along a path.
-
-https://en.wikipedia.org/wiki/Lissajous_curve
-
-Written by Alexander Jolk; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/lmorph.xml b/hacks/config/lmorph.xml
deleted file mode 100644
index f0920b3..0000000
--- a/hacks/config/lmorph.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lmorph" _label="LMorph">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=yMbMB7xQMkA"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="70000"
- convert="invert"/>
-
- <number id="points" type="slider" arg="-points %"
- _label="Control points" _low-label="Few" _high-label="Many"
- low="10" high="1000" default="200"/>
- </vgroup>
-
- <vgroup>
- <number id="steps" type="slider" arg="-steps %"
- _label="Interpolation steps" _low-label="Less" _high-label="More"
- low="100" high="500" default="150"/>
-
- <number id="thickness" type="slider" arg="-linewidth %"
- _label="Lines" _low-label="Thin" _high-label="Thick"
- low="1" high="50" default="5"/>
- </vgroup>
- </hgroup>
-
- <select id="type">
- <option id="random" _label="Open and closed figures"/>
- <option id="open" _label="Open figures" arg-set="-figtype open"/>
- <option id="closed" _label="Closed figures" arg-set="-figtype closed"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-This generates random spline-ish line drawings and morphs between
-them.
-
-Written by Sverre H. Huseby and Glenn T. Lines; 1995.
- </_description>
-</screensaver>
diff --git a/hacks/config/lockward.xml b/hacks/config/lockward.xml
deleted file mode 100644
index 1a44ddd..0000000
--- a/hacks/config/lockward.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="lockward" _label="Lockward" gl="yes">
-
- <command arg="-root" />
-
- <video href="https://www.youtube.com/watch?v=MGwySGVQZ2M"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <hgroup>
- <vgroup>
- <number id="rotateidle-min" type="slider"
- _label="Miniumum rotator idle time"
- _low-label="Low" _high-label="High"
- low="500" high="10000" default="1000" arg="-rotateidle-min %" />
-
- <number id="blinkidle-min" type="slider"
- _label="Minimum blink idle time"
- _low-label="Low" _high-label="High"
- low="500" high="20000" default="1000" arg="-blinkidle-min %" />
-
- <number id="blinkdwell-min" type="slider"
- _label="Minimum blink dwell time"
- _low-label="Low" _high-label="High"
- low="50" high="1500" default="100" arg="-blinkdwell-min %" />
-
- <hgroup>
- <boolean id="blink"
- _label="Blinking effects"
- arg-unset="-no-blink" />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
- <vgroup>
-
- <number id="rotateidle-max" type="slider"
- _label="Maximum rotator idle time"
- _low-label="Low" _high-label="High"
- low="500" high="10000" default="6000" arg="-rotateidle-max %" />
-
- <number id="blinkidle-max" type="slider"
- _label="Maximum blink idle time"
- _low-label="Low" _high-label="High"
- low="500" high="20000" default="9000" arg="-blinkidle-max %" />
-
- <number id="blinkdwell-max" type="slider"
- _label="Maximum blink dwell time"
- _low-label="Low" _high-label="High"
- low="50" high="1500" default="600" arg="-blinkdwell-max %" />
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A translucent spinning, blinking thing. Sort of a cross between the wards
-in an old combination lock and those old backlit information displays that
-animated and changed color via polarized light.
-
-Written by Leo L. Schwab; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/loop.xml b/hacks/config/loop.xml
deleted file mode 100644
index 65571c0..0000000
--- a/hacks/config/loop.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="loop" _label="Loop">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=_kTMO7oEN8U"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="200000" default="100000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="8000" default="1600"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="15"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Size" low="-50" high="50" default="-12"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A cellular automaton that generates loop-shaped colonies that spawn,
-age, and eventually die.
-
-https://en.wikipedia.org/wiki/Langton%27s_loops
-
-Written by David Bagley; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/m6502.xml b/hacks/config/m6502.xml
deleted file mode 100644
index 5738921..0000000
--- a/hacks/config/m6502.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="m6502" _label="m6502">
-
- <command arg="-root" />
-
- <video href="https://www.youtube.com/watch?v=KlDw0nYwUe4"/>
-
- <file id="file" _label="Assembly file" arg="-file %"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <hgroup>
- <vgroup>
- <number id="displaytime" type="slider" arg="-displaytime %"
- _label="Display time for each program"
- _low-label="5 seconds" _high-label="2 minutes"
- low="5.0" high="120.0" default="30.0" />
- <number id="tvcolor" type="slider" arg="-tv-color %"
- _label="Color Knob" _low-label="Low" _high-label="High"
- low="0" high="400" default="70"/>
- <number id="tvtint" type="slider" arg="-tv-tint %"
- _label="Tint Knob" _low-label="Low" _high-label="High"
- low="0" high="360" default="5"/>
- </vgroup>
- <vgroup>
- <number id="ips" type="slider" arg="-ips %"
- _label="Instructions per second"
- _low-label="500" _high-label="120000"
- low="500" high="120000" default="15000" />
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="3.0"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="500" default="150"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Emulates a 6502 microprocessor, and runs some example programs on it.
-
-The family of 6502 chips were used throughout the 70's and 80's in
-machines such as the Atari 2600, Commodore PET, VIC20 and C64, Apple
-][, and the NES. Some example programs are included, and it can also
-read in an assembly file as input.
-
-Original JavaScript Version by Stian Soreng: http://www.6502asm.com/.
-Ported to XScreenSaver by Jeremy English.
-
-Written by Stian Soreng and Jeremy English; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/maze.xml b/hacks/config/maze.xml
deleted file mode 100644
index 83b5b92..0000000
--- a/hacks/config/maze.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="maze" _label="Maze">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=-u4neMXIRA8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-solve-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <select id="generator">
- <option id="mrandom" _label="Random maze generator"/>
- <option id="m0" _label="Depth-first backtracking maze generator"
- arg-set="-generator 0"/>
- <option id="m1" _label="Wall-building maze generator (Prim)"
- arg-set="-generator 1"/>
- <option id="m2" _label="Set-joining maze generator (Kruskal)"
- arg-set="-generator 2"/>
- </select>
-
- <hgroup>
- <select id="ignorance">
- <option id="smart" _label="Head toward exit"/>
- <option id="dumb" _label="Ignorant of exit direction"
- arg-set="-ignorant"/>
- </select>
-
- </hgroup>
-
- <hgroup>
- <number id="grid-size" type="spinbutton" arg="-grid-size %"
- _label="Grid size" low="0" high="100" default="0"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
-
- <vgroup>
- <number id="pre-delay" type="slider" arg="-pre-delay %"
- _label="Linger before solving"
- _low-label="0 seconds" _high-label="10 seconds"
- low="0" high="10000000" default="2000000"/>
-
- <number id="post-delay" type="slider" arg="-post-delay %"
- _label="Linger after solving"
- _low-label="0 seconds" _high-label="10 seconds"
- low="0" high="10000000" default="4000000"/>
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
-
- <_description>
-Generates random mazes, with three different algorithms: Kruskal,
-Prim, and a depth-first recursive backtracker. It also solves them.
-Backtracking and look-ahead paths are displayed in different colors.
-
-https://en.wikipedia.org/wiki/Maze_generation_algorithm
-https://en.wikipedia.org/wiki/Maze_solving_algorithm
-
-Written by Martin Weiss, Dave Lemke, Jim Randell, Jamie Zawinski,
-Johannes Keukelaar, and Zack Weinberg; 1985.
- </_description>
-</screensaver>
diff --git a/hacks/config/maze3d.xml b/hacks/config/maze3d.xml
deleted file mode 100755
index 332c433..0000000
--- a/hacks/config/maze3d.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="maze3d" _label="Maze 3D" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=VTAwxTVdyLc"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.02" high="4.0" default="1.0"/>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
- <hgroup>
- <boolean id="showOverlay" _label="Show Overlay" arg-set="-overlay"/>
- <boolean id="acid" _label="Acid" arg-set="-drop-acid"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <hgroup>
- <number id="numRows" type="spinbutton" arg="-rows %"
- _label="Rows" low="2" high="24" default="12"/>
- <number id="numColumns" type="spinbutton" arg="-columns %"
- _label="Columns" low="2" high="24" default="12"/>
- </hgroup>
-
-<!--
- <hgroup>
- <file id="wallTextureFile" _label="Wall Texture" arg="-wall-texture %"/>
- <select id="wallTextureSelect">
- <option id="wallTextureBrickWall" _label="Brick Wall"/>
- <option id="wallTextureWoodFloor" _label="Wood Floor"
- arg-set="-wall-texture wood-floor"/>
- <option id="wallTextureCeilingTiles" _label="Ceiling Tiles"
- arg-set="-wall-texture ceiling-tiles"/>
- <option id="wallTextureFractal1" _label="Fractal 1"
- arg-set="-wall-texture fractal-1"/>
- <option id="wallTextureFractal2" _label="Fractal 2"
- arg-set="-wall-texture fractal-2"/>
- <option id="wallTextureFractal3" _label="Fractal 3"
- arg-set="-wall-texture fractal-3"/>
- <option id="wallTextureFractal4" _label="Fractal 4"
- arg-set="-wall-texture fractal-4"/>
- </select>
- <boolean id="dropAcidWalls" _label="Drop acid"
- arg-set="-drop-acid-walls"/>
- </hgroup>
-
- <hgroup>
- <file id="floorTextureFile" _label="Floor Texture"
- arg="-floor-texture %"/>
- <select id="floorTextureSelect">
- <option id="floorTextureWoodFloor" _label="Wood Floor"/>
- <option id="floorTextureBrickWall" _label="Brick Wall"
- arg-set="-floor-texture brick-wall"/>
- <option id="floorTextureCeilingTiles" _label="Ceiling Tiles"
- arg-set="-floor-texture ceiling-tiles"/>
- <option id="floorTextureFractal1" _label="Fractal 1"
- arg-set="-floor-texture fractal-1"/>
- <option id="floorTextureFractal2" _label="Fractal 2"
- arg-set="-floor-texture fractal-2"/>
- <option id="floorTextureFractal3" _label="Fractal 3"
- arg-set="-floor-texture fractal-3"/>
- <option id="floorTextureFractal4" _label="Fractal 4"
- arg-set="-floor-texture fractal-4"/>
- </select>
- <boolean id="dropAcidFloor" _label="Drop acid"
- arg-set="-drop-acid-floor"/>
- </hgroup>
-
- <hgroup>
- <file id="ceilingTextureFile" _label="Ceiling Texture"
- arg="-ceiling-texture %"/>
- <select id="ceilingTextureSelect">
- <option id="ceilingTextureCeilingTiles" _label="Ceiling Tiles"/>
- <option id="ceilingTextureBrickWall" _label="Brick Wall"
- arg-set="-ceiling-texture brick-wall"/>
- <option id="ceilingTextureWoodFloor" _label="Wood Floor"
- arg-set="-ceiling-texture wood-floor"/>
- <option id="ceilingTextureFractal1" _label="Fractal 1"
- arg-set="-ceiling-texture fractal-1"/>
- <option id="ceilingTextureFractal2" _label="Fractal 2"
- arg-set="-ceiling-texture fractal-2"/>
- <option id="ceilingTextureFractal3" _label="Fractal 3"
- arg-set="-ceiling-texture fractal-3"/>
- <option id="ceilingTextureFractal4" _label="Fractal 4"
- arg-set="-ceiling-texture fractal-4"/>
- </select>
- <boolean id="dropAcidCeiling" _label="Drop acid"
- arg-set="-drop-acid-ceiling"/>
- </hgroup>
--->
-
- <hgroup>
- <number id="numInverters" type="spinbutton"
- arg="-inverters %" _label="Inverters" low="0"
- high="100" default="10"/>
- <number id="numRats" type="spinbutton"
- arg="-rats %" _label="Rats" low="0" high="100"
- default="1"/>
-
-<!--
- <vgroup>
- <number id="numGl3dTexts" type="spinbutton"
- arg="-gl-3d-texts %" _label="OpenGL"
- low="0" high="100" default="3"/>
- <number id="numGlRedbooks" type="spinbutton"
- arg="-gl-redbooks %" _label="Redbooks"
- low="0" high="100" default="3"/>
- </vgroup>
--->
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A re-creation of the 3D Maze screensaver from Windows 95.
-Written by Sudoer; 2018.
-</_description>
-</screensaver>
diff --git a/hacks/config/memscroller.xml b/hacks/config/memscroller.xml
deleted file mode 100644
index ef70552..0000000
--- a/hacks/config/memscroller.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="memscroller" _label="Mem Scroller">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=DQJRNlTKCdA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <hgroup>
- <select id="seedMode">
- <option id="ram" _label="Dump memory"/>
- <option id="random" _label="Draw random numbers" arg-set="-random"/>
- </select>
-
- <select id="drawMode">
- <option id="color" _label="Draw in RGB"/>
- <option id="mono" _label="Draw green" arg-set="-mono"/>
- </select>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Scrolls a dump of its own memory in three windows at three different rates.
-
-Written by Jamie Zawinski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/menger.xml b/hacks/config/menger.xml
deleted file mode 100644
index b3bfba0..0000000
--- a/hacks/config/menger.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="menger" _label="Menger" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=qpnuNJH9cLw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="descent" type="slider" arg="-speed %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="2" high="500" default="150"
- convert="invert"/>
-
- <number id="depth" type="spinbutton" arg="-depth %"
- _label="Max depth" low="1" high="6" default="3"/>
-
- <!-- #### -no-optimize -->
-
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-The Menger Gasket is a cube-based recursive fractal object
-analogous to the Sierpinski Tetrahedron.
-
-https://en.wikipedia.org/wiki/Menger_sponge
-https://en.wikipedia.org/wiki/Sierpinski_carpet
-
-Written by Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/metaballs.xml b/hacks/config/metaballs.xml
deleted file mode 100644
index 5b73beb..0000000
--- a/hacks/config/metaballs.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="metaballs" _label="Meta Balls">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=wcdKHCp9foY"/>
-
- <!-- #### -color [random] -->
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="100" high="3000" default="1000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="256" default="256"/>
-
- </vgroup>
- <vgroup>
-
- <number id="count" type="slider" arg="-count %"
- _label="Ball count" _low-label="Two" _high-label="Many"
- low="2" high="255" default="10"/>
-
- <number id="radius" type="slider" arg="-radius %"
- _label="Ball Radius" _low-label="Small" _high-label="Big" low="2" high="100" default="100"/>
-
- <number id="delta" type="slider" arg="-delta %"
- _label="Ball Movement" _low-label="Small" _high-label="Big" low="1" high="20" default="3"/>
-
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-2D meta-balls: overlapping and merging balls with fuzzy edges.
-
-https://en.wikipedia.org/wiki/Metaballs
-
-Written by W.P. van Paassen; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/mirrorblob.xml b/hacks/config/mirrorblob.xml
deleted file mode 100644
index 2d920e3..0000000
--- a/hacks/config/mirrorblob.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="mirrorblob" _label="Mirror Blob" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=o4GTO18KHe8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="zoom" type="slider" arg="-zoom %"
- _label="Zoom"
- _low-label="0.1x" _high-label="3.0x"
- low="0.1" high="3.0" default="1.0"/>
-
- <number id="hold_time" type="slider" arg="-hold-time %"
- _label="Time until loading a new image"
- _low-label="5 sec" _high-label="5 min"
- low="5.0" high="300.0" default="30.0"/>
-
- <number id="fade_speed" type="slider" arg="-fade-time %"
- _label="Transition duration"
- _low-label="None" _high-label="30 sec"
- low="0.0" high="30.0" default="5.0"/>
- </vgroup>
- <vgroup>
- <number id="resolution" type="slider" arg="-resolution %"
- _low-label="Low" _high-label="High"
- _label="Resolution" low="4" high="50" default="30"/>
-
- <number id="bumps" type="slider" arg="-bumps %"
- _low-label="None" _high-label="50 bumps"
- _label="Bumps" low="0" high="50" default="10"/>
-
- <number id="blend" type="slider" arg="-blend %"
- _low-label="Clear" _high-label="Opaque"
- _label="Transparency" low="0.1" high="1.0" default="1.0"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <boolean id="walls" _label="Enable walls" arg-set="-walls"/>
- <boolean id="colour" _label="Enable colouring" arg-set="-colour"/>
- <boolean id="texture" _label="Enable reflected image" arg-unset="-no-texture"/>
- </vgroup>
- <vgroup>
- <boolean id="backgound" _label="Show image on background" arg-unset="-no-paint-background"/>
- <boolean id="offset_texture" _label="Offset texture coordinates" arg-set="-offset-texture"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- <vgroup>
- <select id="render">
- <option id="wire" _label="Wireframe" arg-set="-wire"/>
- <option id="solid" _label="Solid surface"/>
- </select>
- </vgroup>
-
- </hgroup>
-
- <xscreensaver-image />
- <xscreensaver-updater />
-
- <_description>
-A wobbly blob distorts images behind it.
-
-Written by Jon Dowdall; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/mismunch.xml b/hacks/config/mismunch.xml
deleted file mode 100644
index 02a258f..0000000
--- a/hacks/config/mismunch.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="mismunch" _label="Mismunch">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-clear %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="1" high="200" default="65"/>
-
- <number id="simultaneous" type="slider" arg="-simul %"
- _label="Simultaneous squares" _low-label="One" _high-label="Many"
- low="1" high="20" default="5"/>
-
- <select id="mode">
- <option id="xor" _label="XOR"/>
- <option id="solid" _label="Solid" arg-set="-no-xor"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08. It was merged with the "Munch" screen saver.
-
-Munching errors! This is a creatively broken misimplementation of the
-classic munching squares graphics hack. See the "Munch" screen saver
-for the original.
-
-https://en.wikipedia.org/wiki/HAKMEM
-https://en.wikipedia.org/wiki/Munching_square
-
-Written by Steven Hazel; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/moebius.xml b/hacks/config/moebius.xml
deleted file mode 100644
index 1df5a76..0000000
--- a/hacks/config/moebius.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="moebius" _label="Möbius" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=77Nib6jQrXc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="solid" _label="Solid floor" arg-set="-solidmoebius"/>
- <boolean id="ants" _label="Draw ants" arg-unset="-no-ants"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-M. C. Escher's "Möbius Strip II", an image of ants walking along the
-surface of a möbius strip.
-
-https://en.wikipedia.org/wiki/Moebius_strip
-https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
-
-Written by Marcelo F. Vianna; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/moebiusgears.xml b/hacks/config/moebiusgears.xml
deleted file mode 100644
index b46ba59..0000000
--- a/hacks/config/moebiusgears.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="moebiusgears" _label="Möbius Gears" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=kpT6j2-9b40"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="5.0" default="1.0"/>
-
- <hgroup>
- <number id="count" type="spinbutton" arg="-count %"
- _label="Number of gears" low="13" high="99" default="17"/>
-
- <number id="teeth" type="spinbutton" arg="-teeth %"
- _label="Number of teeth" low="7" high="49" default="15"/>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-An interlinked loop of rotating gears. The layout of the gears
-follows the path of a möbius strip. See also the "Pinion" and
-"Gears" screen savers.
-
-https://en.wikipedia.org/wiki/Involute_gear
-https://en.wikipedia.org/wiki/Moebius_strip
-
-Written by Jamie Zawinski; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/moire.xml b/hacks/config/moire.xml
deleted file mode 100644
index 4970832..0000000
--- a/hacks/config/moire.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="moire" _label="Moiré">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=S50zFVcUe4s"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Duration" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <number id="offset" type="slider" arg="-offset %"
- _label="Offset" _low-label="Small" _high-label="Large"
- low="1" high="200" default="50"/>
-
- <!-- #### -no-random -->
-
-<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
- When the lines on the screen
- Make more lines in between,
- That's a moiré!
-
-https://en.wikipedia.org/wiki/Moire_pattern
-
-Written by Jamie Zawinski and Michael Bayne; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/moire2.xml b/hacks/config/moire2.xml
deleted file mode 100644
index 8b244eb..0000000
--- a/hacks/config/moire2.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="moire2" _label="Moiré 2">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=7iBNbYCo8so"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="150"/>
-
- <number id="thickness" type="spinbutton" arg="-thickness %"
- _label="Thickness" low="0" high="100" default="0"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Generates fields of concentric circles or ovals, and combines the
-planes with various operations. The planes are moving independently
-of one another, causing the interference lines to spray.
-
-https://en.wikipedia.org/wiki/Moire_pattern
-
-Written by Jamie Zawinski; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/molecule.xml b/hacks/config/molecule.xml
deleted file mode 100644
index fe1129b..0000000
--- a/hacks/config/molecule.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="molecule" _label="Molecule" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=D1A0tNcPL4M"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="timeout" type="slider" arg="-timeout %"
- _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
- low="5" high="120" default="20"/>
-
- <hgroup>
- <vgroup>
- <boolean id="labels" _label="Label atoms" arg-unset="-no-labels"/>
- <boolean id="titles" _label="Describe molecule" arg-unset="-no-titles"/>
- <boolean id="bbox" _label="Draw bounding box" arg-set="-bbox"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </vgroup>
- <vgroup>
- <boolean id="atoms" _label="Draw atomic nuclei" arg-unset="-no-atoms"/>
- <boolean id="bonds" _label="Draw atomic bonds" arg-unset="-no-bonds"/>
- <boolean id="shells" _label="Draw electron shells" arg-unset="-no-shells"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
- </hgroup>
-
- <file id="molecule" _label="PDB file or directory" arg="-molecule %"/>
-
- <xscreensaver-updater />
-
- <_description>
-Some interesting molecules. Several molecules are built in, and it can
-also read PDB (Protein Data Bank) files as input.
-
-https://en.wikipedia.org/wiki/Protein_Data_Bank_%28file_format%29
-
-Written by Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/morph3d.xml b/hacks/config/morph3d.xml
deleted file mode 100644
index 31e138d..0000000
--- a/hacks/config/morph3d.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="morph3d" _label="Morph 3D" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=lNtDppjOli4"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="40000"
- convert="invert"/>
-
- <select id="object">
- <option id="random" _label="Random object"/>
- <option id="tetra" _label="Tetrahedron" arg-set="-count 1"/>
- <option id="cube" _label="Cube" arg-set="-count 2"/>
- <option id="octa" _label="Octahedron" arg-set="-count 3"/>
- <option id="dodeca" _label="Dodecahedron" arg-set="-count 4"/>
- <option id="icosa" _label="Icosahedron" arg-set="-count 5"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Platonic solids that turn inside out and get spikey.
-
-https://en.wikipedia.org/wiki/Platonic_solid
-
-Written by Marcelo Vianna; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/mountain.xml b/hacks/config/mountain.xml
deleted file mode 100644
index de0eb4d..0000000
--- a/hacks/config/mountain.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="mountain" _label="Mountain">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=knqnPcZGqkA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Peaks" _low-label="One" _high-label="Lots"
- low="1" high="100" default="30"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Generates random 3D plots that look vaguely mountainous.
-
-Written by Pascal Pensa; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/munch.xml b/hacks/config/munch.xml
deleted file mode 100644
index 9875838..0000000
--- a/hacks/config/munch.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="munch" _label="Munch">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-clear %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="1" high="200" default="65"/>
-
- <number id="simultaneous" type="slider" arg="-simul %"
- _label="Simultaneous squares" _low-label="One" _high-label="Many"
- low="1" high="20" default="5"/>
- </vgroup>
- <vgroup>
- <select id="mismunch">
- <option id="random" _label="Munch or mismunch"/>
- <option id="munch" _label="Munch only" arg-set="-classic"/>
- <option id="mismunch" _label="Mismunch only" arg-set="-mismunch"/>
- </select>
-
- <select id="mode">
- <option id="xor" _label="XOR"/>
- <option id="solid" _label="Solid" arg-set="-no-xor"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
- DATAI 2
- ADDB 1,2
- ROTC 2,-22
- XOR 1,2
- JRST .-4
-
-As reported by HAKMEM (MIT AI Memo 239, 1972), Jackson Wright wrote
-the above PDP-1 code in 1962. That code still lives on here, some 46
-years later.
-
-In "mismunch" mode, it displays a creatively broken misimplementation
-of the classic munching squares algorithm instead.
-
-https://en.wikipedia.org/wiki/HAKMEM
-https://en.wikipedia.org/wiki/Munching_square
-
-Written by Jackson Wright, Tim Showalter, Jamie Zawinski and
-Steven Hazel; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/nerverot.xml b/hacks/config/nerverot.xml
deleted file mode 100644
index 8a123bc..0000000
--- a/hacks/config/nerverot.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="nerverot" _label="Nerve Rot">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=oUfgDnyGqHM"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="iters" type="slider" arg="-max-iters %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="100" high="8000" default="1200"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Blot count" _low-label="Few" _high-label="Many"
- low="1" high="1000" default="250"/>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="4"/>
- </vgroup>
- <vgroup>
- <number id="event" type="slider" arg="-event-chance %"
- _label="Changes" _low-label="Seldom" _high-label="Frequent"
- low="0.0" high="1.0" default="0.2"/>
-
- <number id="nervous" type="slider" arg="-nervousness %"
- _label="Nervousness" _low-label="Calm" _high-label="Spastic"
- low="0.0" high="1.0" default="0.3"/>
-
- <number id="mnr" type="slider" arg="-max-nerve-radius %"
- _label="Crunchiness" _low-label="Low" _high-label="High"
- low="0.0" high="1.0" default="0.7"/>
-
- <number id="linewidth" type="spinbutton" arg="-line-width %"
- _label="Line thickness" low="0" high="100" default="0"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <!-- #### -iter-amt [0.01] -->
- <!-- #### -min-scale [0.6] -->
- <!-- #### -max-scale [1.75] -->
- <!-- #### -min-radius [3] -->
- <!-- #### -max-radius [25] -->
-
- <xscreensaver-updater />
-
- <_description>
-Nervously vibrating squiggles.
-
-Written by Dan Bornstein; 2000.
- </_description>
-</screensaver>
diff --git a/hacks/config/noof.xml b/hacks/config/noof.xml
deleted file mode 100644
index 3e2b0fc..0000000
--- a/hacks/config/noof.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="noof" _label="Noof" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=x5DQjgYqmn0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Flowery, rotatey patterns.
-
-Written by Bill Torzewski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/noseguy.xml b/hacks/config/noseguy.xml
deleted file mode 100644
index c2e82e5..0000000
--- a/hacks/config/noseguy.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="noseguy" _label="Nose Guy">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ONJlg9Y_TLI"/>
-
- <xscreensaver-text />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A little man with a big nose wanders around your screen saying things.
-
-Written by Dan Heller and Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/pacman.xml b/hacks/config/pacman.xml
deleted file mode 100644
index 77e63e4..0000000
--- a/hacks/config/pacman.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="pacman" _label="Pac-Man">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=G-pdjis0ECw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Player size" low="0" high="200" default="0"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Simulates a game of Pac-Man on a randomly-created level.
-
-https://en.wikipedia.org/wiki/Pac-Man
-
-Written by Edwin de Jong and Jamie Zawinski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/pedal.xml b/hacks/config/pedal.xml
deleted file mode 100644
index 5ddb6e1..0000000
--- a/hacks/config/pedal.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="pedal" _label="Pedal">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=VFibXcP1JH0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Duration" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <number id="lines" type="slider" arg="-maxlines %"
- _label="Lines" _low-label="Few" _high-label="Many"
- low="100" high="5000" default="1000"/>
-
- <!-- #### -fadedelay [200000] -->
- <!-- #### -foreground [white] -->
- <!-- #### -background [black] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-The even-odd winding rule.
-
-https://en.wikipedia.org/wiki/Even-odd_rule
-https://en.wikipedia.org/wiki/Nonzero-rule
-
-Written by Dale Moore; 1995.
- </_description>
-</screensaver>
diff --git a/hacks/config/peepers.xml b/hacks/config/peepers.xml
deleted file mode 100644
index 300c389..0000000
--- a/hacks/config/peepers.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="peepers" _label="Peepers" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=9xwPoLRKff8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="2.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of eyes" _low-label="Few" _high-label="Many"
- low="0" high="50" default="0"/>
- </vgroup>
-
- <vgroup>
-
- <select id="mode">
- <option id="bounce" _label="Bounce" arg-set="-mode bounce"/>
- <option id="scroll" _label="Scroll" arg-set="-mode scroll"/>
- <option id="random" _label="Bounce or scroll"/>
- <option id="xeyes" _label="Grid" arg-set="-mode xeyes"/>
- <option id="beholder" _label="Beholder" arg-set="-mode beholder"/>
- </select>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
- </vgroup>
- </hgroup>
-
- <_description>
-Floating eyeballs. Anatomically correct, and they also track the pointer.
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/penetrate.xml b/hacks/config/penetrate.xml
deleted file mode 100644
index a7f6de9..0000000
--- a/hacks/config/penetrate.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="penetrate" _label="Penetrate">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=iuutzMOVYgI"/>
-
- <number id="bgrowth" type="slider" arg="-bgrowth %"
- _label="Explosions" _low-label="Slow" _high-label="Fast"
- low="1" high="20" default="5"/>
-
- <number id="lrate" type="slider" arg="-lrate %"
- _label="Lasers" _low-label="Slow" _high-label="Fast"
- low="10" high="200" default="80"
- convert="invert"/>
-
- <select id="mode">
- <option id="dumb" _label="Start badly, but learn"/>
- <option id="smart" _label="Always play well" arg-set="-smart"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Simulates (something like) the classic arcade game Missile Command.
-
-https://en.wikipedia.org/wiki/Missile_Command
-
-Written by Adam Miller; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/penrose.xml b/hacks/config/penrose.xml
deleted file mode 100644
index aa70323..0000000
--- a/hacks/config/penrose.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="penrose" _label="Penrose">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=atlkrWkbYHk"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
- </vgroup>
- <vgroup>
- <number id="size" type="slider" arg="-size %"
- _label="Tile size" _low-label="Small" _high-label="Large"
- low="1" high="100" default="40"/>
-
- <boolean id="ammann" _label="Draw ammann lines" arg-set="-ammann"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
-
- <xscreensaver-updater />
-
- <_description>
-Quasiperiodic tilings.
-
-In April 1997, Sir Roger Penrose, a British math professor who has
-worked with Stephen Hawking on such topics as relativity, black
-holes, and whether time has a beginning, filed a
-copyright-infringement lawsuit against the Kimberly-Clark
-Corporation, which Penrose said copied a pattern he created (a
-pattern demonstrating that "a nonrepeating pattern could exist in
-nature") for its Kleenex quilted toilet paper. Penrose said he
-doesn't like litigation but, "When it comes to the population of
-Great Britain being invited by a multinational to wipe their bottoms
-on what appears to be the work of a Knight of the Realm, then a last
-stand must be taken."
-
-As reported by News of the Weird #491, 4-Jul-1997.
-
-https://en.wikipedia.org/wiki/Penrose_tiling
-https://en.wikipedia.org/wiki/Tessellation
-
-Written by Timo Korvola; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/petri.xml b/hacks/config/petri.xml
deleted file mode 100644
index eff9373..0000000
--- a/hacks/config/petri.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="petri" _label="Petri">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=QkJ9cN0QQd8"/>
-
- <hgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="diaglim" type="slider" arg="-diaglim %"
- _label="Colony shape" _low-label="Square" _high-label="Diamond"
- low="1.0" high="2.0" default="1.414"
- convert="invert"/>
-
- <number id="anychan" type="slider" arg="-anychan %"
- _label="Fertility" _low-label="Low" _high-label="High"
- low="0.0" high="0.25" default="0.0015"/>
-
- <number id="minorchan" type="slider" arg="-minorchan %"
- _label="Offspring" _low-label="Few" _high-label="Many"
- low="0.0" high="1.0" default="0.5"/>
-
- <number id="instantdeathchan" type="slider" arg="-instantdeathchan %"
- _label="Death comes" _low-label="Slowly" _high-label="Quickly"
- low="0.0" high="1.0" default="0.2"/>
- </vgroup>
-
- <vgroup>
- <number id="minlifespeed" type="slider" arg="-minlifespeed %"
- _label="Minimum rate of growth" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.04"/>
-
- <number id="maxlifespeed" type="slider" arg="-maxlifespeed %"
- _label="Maximum rate of growth" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.13"/>
-
- <number id="mindeathspeed" type="slider" arg="-mindeathspeed %"
- _label="Minimum rate of death" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.42"/>
-
- <number id="maxdeathspeed" type="slider" arg="-maxdeathspeed %"
- _label="Maximum rate of death" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.46"/>
- </vgroup>
-
- <vgroup>
- <number id="minlifespan" type="slider" arg="-minlifespan %"
- _label="Minimum lifespan" _low-label="Short" _high-label="Long"
- low="0" high="3000" default="500"/>
-
- <number id="maxlifespan" type="slider" arg="-maxlifespan %"
- _label="Maximum lifespan" _low-label="Short" _high-label="Long"
- low="0" high="3000" default="1500"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Cell size" low="0" high="100" default="2"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Mold varieties" low="0" high="20" default="20"/>
-
- </vgroup>
- </hgroup>
-
- <!-- #### -mem-throttle [22M] -->
-
- <xscreensaver-updater />
-
- <_description>
-Colonies of mold grow in a petri dish. Growing colored circles
-overlap and leave spiral interference in their wake.
-
-Written by Dan Bornstein; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/phosphor.xml b/hacks/config/phosphor.xml
deleted file mode 100644
index 484cf88..0000000
--- a/hacks/config/phosphor.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="phosphor" _label="Phosphor">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=G6ZWTrl7pV0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="scale" type="spinbutton" arg="-scale %"
- _label="Font scale" low="1" high="20" default="6"/>
-
- <number id="fade" type="slider" arg="-ticks %"
- _label="Fade" _low-label="Slow" _high-label="Fast"
- low="1" high="100" default="20"
- convert="invert"/>
-
- <select id="fg">
- <option id="green" _label="Green" />
- <!-- DarkOrange is probably the closest named color. -->
- <option id="DarkOrange" _label="Amber" arg-set="-fg #ff7900" />
- <option id="white" _label="White" arg-set="-fg white" />
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- <vgroup>
- <xscreensaver-text />
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-An old terminal with large pixels and long-sustain phosphor.
-
-On MacOS and Linux, this program is also a fully-functional VT100
-emulator! Run it as an application instead of as a screen saver and
-you can use it as a terminal.
-
-Written by Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/photopile.xml b/hacks/config/photopile.xml
deleted file mode 100644
index 5b888e3..0000000
--- a/hacks/config/photopile.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="photopile" _label="Photo Pile" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=snm7o95AR8E"/>
-
- <hgroup>
- <vgroup>
-
- <number id="scale" type="slider" arg="-scale %"
- _label="Image size"
- _low-label="Small" _high-label="Large"
- low="0.1" high="0.9" default="0.4"/>
-
- <number id="tilt" type="slider" arg="-maxTilt %"
- _label="Maximum angle from vertical"
- _low-label="0 deg" _high-label="90 deg"
- low="0" high="90" default="50"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Number of images" low="1" high="20" default="7"/>
-
- <boolean id="polaroid" _label="Simulate instant film" arg-unset="-no-polaroid"/>
-
- <boolean id="clip" _label="Instant film theme" arg-unset="-no-clip"/>
-
- <boolean id="shadows" _label="Draw drop shadows" arg-unset="-no-shadows"/>
-
- </vgroup>
- <vgroup>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Time until loading a new image"
- _low-label="Short" _high-label="Long"
- low="1" high="60" default="5"/>
-
- <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-image />
- <xscreensaver-updater />
-
- <_description>
-Loads several random images, and displays them as if lying in a random pile.
-The pile is periodically reshuffled, with new images coming in and old ones
-being thrown out.
-
-Written by Jens Kilian and Jamie Zawinski; 2008.
- </_description>
-</screensaver>
diff --git a/hacks/config/piecewise.xml b/hacks/config/piecewise.xml
deleted file mode 100644
index fb6990a..0000000
--- a/hacks/config/piecewise.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="piecewise" _label="Piecewise">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=3gQr1FxFSe0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Many"
- low="4" high="100" default="32"/>
-
- <number id="colorspeed" type="slider" arg="-colorspeed %"
- _label="Color shift" _low-label="Slow" _high-label="Fast"
- low="0" high="100" default="10"/>
- </vgroup>
- <vgroup>
-
- <number id="minradius" type="slider" arg="-minradius %"
- _label="Minimum radius" _low-label="Small" _high-label="Large"
- low="0.01" high="0.5" default="0.05"/>
-
- <number id="maxradius" type="slider" arg="-maxradius %"
- _label="Maximum radius" _low-label="Small" _high-label="Large"
- low="0.01" high="0.5" default="0.2"/>
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Moving circles switch from visibility to invisibility at intersection points.
-
-Written by Geoffrey Irving; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/pinion.xml b/hacks/config/pinion.xml
deleted file mode 100644
index 31aa52d..0000000
--- a/hacks/config/pinion.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="pinion" _label="Pinion" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=rHY8dR1urQk"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="15000"
- convert="invert"/>
-
- <number id="spin" type="slider" arg="-spin %"
- _label="Rotation speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="7.0" default="1.0"/>
-
- <number id="scroll" type="slider" arg="-scroll %"
- _label="Scrolling speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
-
- </vgroup>
- <vgroup>
- <number id="size" type="slider" arg="-size %"
- _label="Gear size" _low-label="Tiny" _high-label="Huge"
- low="0.1" high="3.0" default="1.0"/>
-
- <number id="max-rpm" type="slider" arg="-max-rpm %"
- _label="Max RPM" _low-label="100" _high-label="2000"
- low="100" high="2000" default="900"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A gear system marches across the screen.
-See also the "Gears" and "Möbius Gears" screen savers.
-
-https://en.wikipedia.org/wiki/Involute_gear
-
-Written by Jamie Zawinski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/pipes.xml b/hacks/config/pipes.xml
deleted file mode 100644
index ba2deff..0000000
--- a/hacks/config/pipes.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="pipes" _label="Pipes" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=UsUGENa7jvE"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Number of pipes" _low-label="One" _high-label="A hundred"
- low="1" high="100" default="5"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Pipe length" _low-label="Short" _high-label="Long"
- low="0" high="3000" default="500"/>
-
- <number id="factory" type="slider" arg="-factory %"
- _label="Gadgetry" _low-label="None" _high-label="Lots"
- low="0" high="10" default="2"/>
-
- <hgroup>
- <boolean id="fisheye" _label="Fisheye lens" arg-unset="-no-fisheye"/>
- <boolean id="tight" _label="Allow tight turns" arg-set="-tightturns"/>
- <select id="style">
- <option id="curves" _label="Curved pipes" arg-set="-count 3"/>
- <option id="balls" _label="Ball joints" arg-set="-count 1"/>
- <option id="fit" _label="Bolted fittings"/>
- <option id="random" _label="Random style" arg-set="-count 0"/>
- </select>
- </hgroup>
-
- <hgroup>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A growing plumbing system, with bolts and valves.
-
-Written by Marcelo Vianna and Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/polyhedra.xml b/hacks/config/polyhedra.xml
deleted file mode 100644
index 0780999..0000000
--- a/hacks/config/polyhedra.xml
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="polyhedra" _label="Polyhedra" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=gYb-3EErLJE"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="5.0" default="1.0"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="1 second" _high-label="30 seconds"
- low="1" high="30" default="12"/>
-
- <select id="object">
-<option id="random" _label="Display random polyhedron"/>
-<option _label="Pentagonal prism" arg-set="-which pentagonal_prism"/>
-<option _label="Pentagonal dipyramid" arg-set="-which pentagonal_dipyramid"/>
-<option _label="Pentagonal antiprism" arg-set="-which pentagonal_antiprism"/>
-<option _label="Pentagonal deltohedron" arg-set="-which pentagonal_deltohedron"/>
-<option _label="Pentagrammic prism" arg-set="-which pentagrammic_prism"/>
-<option _label="Pentagrammic dipyramid" arg-set="-which pentagrammic_dipyramid"/>
-<option _label="Pentagrammic antiprism" arg-set="-which pentagrammic_antiprism"/>
-<option _label="Pentagrammic deltohedron" arg-set="-which pentagrammic_deltohedron"/>
-<option _label="Pentagrammic crossed antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
-<option _label="Pentagrammic concave deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
-<option _label="Tetrahedron" arg-set="-which tetrahedron"/>
-<option _label="Truncated tetrahedron" arg-set="-which truncated_tetrahedron"/>
-<option _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
-<option _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
-<option _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
-<option _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
-<option _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
-<option _label="Octahedron" arg-set="-which octahedron"/>
-<option _label="Cube" arg-set="-which cube"/>
-<option _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
-<option _label="Rhombic dodecahedron" arg-set="-which rhombic_dodecahedron"/>
-<option _label="Truncated octahedron" arg-set="-which truncated_octahedron"/>
-<option _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
-<option _label="Truncated cube" arg-set="-which truncated_cube"/>
-<option _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
-<option _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
-<option _label="Deltoidal icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
-<option _label="Truncated cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
-<option _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
-<option _label="Snub cube" arg-set="-which snub_cube"/>
-<option _label="Pentagonal icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
-<option _label="Small cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
-<option _label="Small hexacronic icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
-<option _label="Great cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
-<option _label="Great hexacronic icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
-<option _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
-<option _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
-<option _label="Cubitruncated cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
-<option _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
-<option _label="Great rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
-<option _label="Great deltoidal icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
-<option _label="Small rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
-<option _label="Small rhombihexacron" arg-set="-which small_rhombihexacron"/>
-<option _label="Stellated truncated hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
-<option _label="Great triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
-<option _label="Great truncated cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
-<option _label="Great disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
-<option _label="Great rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
-<option _label="Great rhombihexacron" arg-set="-which great_rhombihexacron"/>
-<option _label="Icosahedron" arg-set="-which icosahedron"/>
-<option _label="Dodecahedron" arg-set="-which dodecahedron"/>
-<option _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
-<option _label="Rhombic triacontahedron" arg-set="-which rhombic_triacontahedron"/>
-<option _label="Truncated icosahedron" arg-set="-which truncated_icosahedron"/>
-<option _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
-<option _label="Truncated dodecahedron" arg-set="-which truncated_dodecahedron"/>
-<option _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
-<option _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
-<option _label="Deltoidal hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
-<option _label="Truncated icosidodecahedron" arg-set="-which truncated_icosidodecahedron"/>
-<option _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
-<option _label="Snub dodecahedron" arg-set="-which snub_dodecahedron"/>
-<option _label="Pentagonal hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
-<option _label="Small ditrigonal icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
-<option _label="Small triambic icosahedron" arg-set="-which small_triambic_icosahedron"/>
-<option _label="Small icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
-<option _label="Small icosacronic hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
-<option _label="Small snub icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
-<option _label="Small hexagonal hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
-<option _label="Small dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
-<option _label="Small dodecacronic hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
-<option _label="Small stellated dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
-<option _label="Great dodecahedron" arg-set="-which great_dodecahedron"/>
-<option _label="Great dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
-<option _label="Medial rhombic triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
-<option _label="Truncated great dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
-<option _label="Small stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
-<option _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
-<option _label="Medial deltoidal hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
-<option _label="Small rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
-<option _label="Small rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
-<option _label="Snub dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
-<option _label="Medial pentagonal hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
-<option _label="Ditrigonal dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
-<option _label="Medial triambic icosahedron" arg-set="-which medial_triambic_icosahedron"/>
-<option _label="Great ditrigonal dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
-<option _label="Great ditrigonal dodecacronic hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
-<option _label="Small ditrigonal dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
-<option _label="Small ditrigonal dodecacronic hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
-<option _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
-<option _label="Medial icosacronic hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
-<option _label="Icositruncated dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
-<option _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
-<option _label="Snub icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
-<option _label="Medial hexagonal hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
-<option _label="Great ditrigonal icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
-<option _label="Great triambic icosahedron" arg-set="-which great_triambic_icosahedron"/>
-<option _label="Great icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
-<option _label="Great icosacronic hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
-<option _label="Small icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
-<option _label="Small icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
-<option _label="Small dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
-<option _label="Small dodecicosacron" arg-set="-which small_dodecicosacron"/>
-<option _label="Small dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
-<option _label="Small dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
-<option _label="Great stellated dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
-<option _label="Great icosahedron" arg-set="-which great_icosahedron"/>
-<option _label="Great icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
-<option _label="Great rhombic triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
-<option _label="Great truncated icosahedron" arg-set="-which great_truncated_icosahedron"/>
-<option _label="Great stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
-<option _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
-<option _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
-<option _label="Great snub icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
-<option _label="Great pentagonal hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
-<option _label="Small stellated truncated dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
-<option _label="Great pentakisdodecahedron" arg-set="-which great_pentakisdodecahedron"/>
-<option _label="Truncated dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
-<option _label="Medial disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
-<option _label="Inverted snub dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
-<option _label="Medial inverted pentagonal hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
-<option _label="Great dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
-<option _label="Great dodecacronic hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
-<option _label="Small dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
-<option _label="Small dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
-<option _label="Great dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
-<option _label="Great dodecicosacron" arg-set="-which great_dodecicosacron"/>
-<option _label="Great snub dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
-<option _label="Great hexagonal hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
-<option _label="Great dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
-<option _label="Great dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
-<option _label="Great stellated truncated dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
-<option _label="Great triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
-<option _label="Great rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
-<option _label="Great deltoidal hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
-<option _label="Great truncated icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
-<option _label="Great disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
-<option _label="Great inverted snub icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
-<option _label="Great inverted pentagonal hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
-<option _label="Great dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
-<option _label="Great dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
-<option _label="Great icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
-<option _label="Great icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
-<option _label="Small retrosnub icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
-<option _label="Small hexagrammic hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
-<option _label="Great rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
-<option _label="Great rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
-<option _label="Great retrosnub icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
-<option _label="Great pentagrammic hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
-<option _label="Great dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
-<option _label="Great dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
-<option _label="Utah teapotahedron" arg-set="-which utah_teapotahedron"/>
- </select>
-
- <hgroup>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- </hgroup>
- <hgroup>
- <boolean id="titles" _label="Show description" arg-unset="-no-titles"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The 75 uniform polyhedra and their duals, plus 5 prisms
-and antiprisms, and some information about each.
-
-https://en.wikipedia.org/wiki/Uniform_polyhedra
-https://en.wikipedia.org/wiki/Stellation
-https://en.wikipedia.org/wiki/Dual_polyhedron
-https://en.wikipedia.org/wiki/Antiprism
-
-Written by Dr. Zvi Har'El and Jamie Zawinski; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/polyominoes.xml b/hacks/config/polyominoes.xml
deleted file mode 100644
index 74b05f2..0000000
--- a/hacks/config/polyominoes.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="polyominoes" _label="Polyominoes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=6j2H2gL8cws"/>
-
- <boolean id="identical" _label="Identical pieces" arg-set="-identical"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="500" high="5000" default="2000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Repeatedly attempts to completely fill a rectangle with
-irregularly-shaped puzzle pieces.
-
-https://en.wikipedia.org/wiki/Polyomino
-
-Written by Stephen Montgomery-Smith; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/polytopes.xml b/hacks/config/polytopes.xml
deleted file mode 100644
index 1e6f1f3..0000000
--- a/hacks/config/polytopes.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="polytopes" _label="Polytopes" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=MKZQ5Q7QINM"/>
-
- <hgroup>
- <vgroup>
- <select id="display-mode">
- <option id="wire" _label="Wireframe mesh"
- arg-set="-mode wireframe"/>
- <option id="surface" _label="Solid surface"
- arg-set="-mode surface"/>
- <option id="transparent" _label="Transparent surface"/>
- </select>
-
- <select id="polytope">
- <option id="random" _label="Random object"/>
- <option id="cell-5" _label="5-cell (hyper-tetrahedron)"
- arg-set="-polytope 5-cell"/>
- <option id="cell-8" _label="8-cell (hypercube / tesseract)"
- arg-set="-polytope 8-cell"/>
- <option id="cell-16" _label="16-cell (hyper-octahedron)"
- arg-set="-polytope 16-cell"/>
- <option id="cell-24" _label="24-cell"
- arg-set="-polytope 24-cell"/>
- <option id="cell-120" _label="120-cell"
- arg-set="-polytope 120-cell"/>
- <option id="cell-600" _label="600-cell"
- arg-set="-polytope 600-cell"/>
- </select>
-
- <select id="colors">
- <option id="single" _label="Single color" arg-set="-single-color"/>
- <option id="depth" _label="Colors By 4D Depth"/>
- </select>
-
- <select id="projection3d">
- <option id="perspective-3d" _label="Perspective 3D"/>
- <option id="orthographic-3d" _label="Orthographic 3D"
- arg-set="-orthographic-3d"/>
- </select>
-
- <select id="projection4d">
- <option id="perspective-4d" _label="Perspective 4D"/>
- <option id="orthographic-4d" _label="Orthographic 4D"
- arg-set="-orthographic-4d"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
-
- <vgroup>
- <number id="speed-wx" type="slider" arg="-speed-wx %"
- _label="WX rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.1"/>
-
- <number id="speed-wy" type="slider" arg="-speed-wy %"
- _label="WY rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.3"/>
-
- <number id="speed-wz" type="slider" arg="-speed-wz %"
- _label="WZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.5"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
- </vgroup>
-
- <vgroup>
- <number id="speed-xy" type="slider" arg="-speed-xy %"
- _label="XY rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.7"/>
-
- <number id="speed-xz" type="slider" arg="-speed-xz %"
- _label="XZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.9"/>
-
- <number id="speed-yz" type="slider" arg="-speed-yz %"
- _label="YZ rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="2.1"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The six regular 4D polytopes rotating in 4D.
-
-Inspired by H.S.M Coxeter's book "Regular Polytopes", 3rd Edition,
-Dover Publications, Inc., 1973, and Thomas Banchoff's book "Beyond the
-Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
-Scientific American Library, 1990.
-
-https://en.wikipedia.org/wiki/Hypercube
-https://en.wikipedia.org/wiki/Tesseract
-https://en.wikipedia.org/wiki/Regular_polytope
-
-Written by Carsten Steger; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/pong.xml b/hacks/config/pong.xml
deleted file mode 100644
index 6ae353a..0000000
--- a/hacks/config/pong.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="pong" _label="Pong">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=2jPmisDwwi0"/>
-
- <hgroup>
- <vgroup>
- <number id="speed" type="slider" arg="-speed %"
- _label="Game speed" _low-label="Slow" _high-label="Fast"
- low="1" high="20" default="6"/>
-
- <number id="noise" type="slider" arg="-noise %"
- _label="Noise" _low-label="Crisp" _high-label="Noisy"
- low="0.00" high="5.00" default="0.04"/>
-
- <hgroup>
- <boolean id="clock" _label="Clock mode" arg-set="-clock"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="3.0"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="500" default="150"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The 1971 Pong home video game, including artifacts of an old color TV set.
-
-In clock mode, the score keeps track of the current time.
-
-https://en.wikipedia.org/wiki/Pong
-
-Written by Jeremy English, Trevor Blackwell and Jamie Zawinski; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/popsquares.xml b/hacks/config/popsquares.xml
deleted file mode 100644
index 6528b69..0000000
--- a/hacks/config/popsquares.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="popsquares" _label="Pop Squares">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=99Aweq7Nypc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
-
- <number id="subdivision" type="spinbutton" arg="-subdivision %"
- _label="Subdivision"
- low="1" high="64" default="5"/>
-
- <number id="border" type="spinbutton" arg="-border %"
- _label="Border"
- low="0" high="5" default="1"/>
-
- <number id="ncolors" type="spinbutton" arg="-ncolors %"
- _label="Number of colors" low="1" high="512" default="128"/>
-
- <hgroup>
- <select id="bg">
- <option id="lred" _label="Light red" arg-set="-bg #FF0000"/>
- <option id="lyellow" _label="Light yellow" arg-set="-bg #FFFF00"/>
- <option id="lgreen" _label="Light green" arg-set="-bg #00FF00"/>
- <option id="lcyan" _label="Light cyan" arg-set="-bg #00FFFF"/>
- <option id="lblue" _label="Light blue"/>
- <option id="lmagenta" _label="Light magenta" arg-set="-bg #FF00FF"/>
- </select>
-
- <select id="fg">
- <option id="dred" _label="Dark red" arg-set="-fg #8C0000"/>
- <option id="dyellow" _label="Dark yellow" arg-set="-fg #8C8C00"/>
- <option id="dgreen" _label="Dark green" arg-set="-fg #008C00"/>
- <option id="dcyan" _label="Dark cyan" arg-set="-fg #008C8C"/>
- <option id="dblue" _label="Dark blue"/>
- <option id="dmagenta" _label="Dark magenta" arg-set="-fg #8C008C"/>
- </select>
- </hgroup>
-
- <boolean id="twitch" _label="Twitch" arg-set="-twitch"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A pop-art-ish looking grid of pulsing colors.
-
-Written by Levi Burton; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/projectiveplane.xml b/hacks/config/projectiveplane.xml
deleted file mode 100644
index 1c58c1d..0000000
--- a/hacks/config/projectiveplane.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="projectiveplane" _label="Projective Plane" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Zg6ONPUTwUQ"/>
-
- <hgroup>
- <select id="display-mode">
- <option id="random" _label="Random surface"/>
- <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
- <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
- <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
- </select>
-
- <select id="appearance">
- <option id="random" _label="Random pattern"/>
- <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
- <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
- <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
- </select>
-
- <select id="colors">
- <option id="random" _label="Random coloration"/>
- <option id="twosided" _label="One-sided" arg-set="-colors one-sided"/>
- <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
- <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
- <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
- <option id="depth" _label="4d depth colors" arg-set="-colors depth"/>
- </select>
-
- <boolean id="change-colors" _label="Change colors"
- arg-set="-change-colors"/>
-
- <select id="projection3d">
- <option id="random" _label="Random 3D"/>
- <option id="perspective-3d" _label="Perspective 3D" arg-set="-projection-3d perspective"/>
- <option id="orthographic-3d" _label="Orthographic 3D" arg-set="-projection-3d orthographic"/>
- </select>
-
- <select id="projection4d">
- <option id="random" _label="Random 4D"/>
- <option id="perspective-4d" _label="Perspective 4D" arg-set="-projection-4d perspective"/>
- <option id="orthographic-4d" _label="Orthographic 4D" arg-set="-projection-4d orthographic"/>
- </select>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <hgroup>
- <number id="speed-wx" type="slider" arg="-speed-wx %"
- _label="WX speed"
- _low-label="-4" _high-label="4"
- low="-4.0" high="4.0" default="1.1"/>
- </hgroup>
-
- <hgroup>
- <number id="speed-wy" type="slider" arg="-speed-wy %"
- _label="WY speed"
- _low-label="-4" _high-label="4"
- low="-4.0" high="4.0" default="1.3"/>
- </hgroup>
-
- <hgroup>
- <number id="speed-wz" type="slider" arg="-speed-wz %"
- _label="WZ speed"
- _low-label="-4" _high-label="4"
- low="-4.0" high="4.0" default="1.5"/>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <hgroup>
- <number id="speed-xy" type="slider" arg="-speed-xy %"
- _label="XY speed"
- _low-label="-4" _high-label="4"
- low="-4.0" high="4.0" default="1.7"/>
- </hgroup>
-
- <hgroup>
- <number id="speed-xz" type="slider" arg="-speed-xz %"
- _label="XZ speed"
- _low-label="-4" _high-label="4"
- low="-4.0" high="4.0" default="1.9"/>
- </hgroup>
-
- <hgroup>
- <number id="speed-yz" type="slider" arg="-speed-yz %"
- _label="YZ speed"
- _low-label="-4" _high-label="4"
- low="-4.0" high="4.0" default="2.1"/>
- </hgroup>
- </vgroup>
-
- <vgroup>
- <hgroup>
- <number id="walk-direction" type="slider" arg="-walk-direction %"
- _label="Walk dir "
- _low-label="-180" _high-label="180"
- low="-180.0" high="180.0" default="83.0"/>
- </hgroup>
-
- <hgroup>
- <number id="walk-speed" type="slider" arg="-walk-speed %"
- _label="Walk speed"
- _low-label="1" _high-label="100"
- low="1.0" high="100.0" default="20.0"/>
- </hgroup>
-
- <hgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
- </hgroup>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <select id="view-mode">
- <option id="walk" _label="Random motion"/>
- <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
- <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
- <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
- </select>
-
- <boolean id="orientation-marks" _label="Show orientation marks"
- arg-set="-orientation-marks"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
- </hgroup>
-
-
-
- <_description>
-A 4D embedding of the real projective plane.
-
-You can walk on the surface of the real projective plane or rotate it
-in 4D or walk on it while it rotates in 4D. Inspired by Thomas
-Banchoff's book "Beyond the Third Dimension: Geometry, Computer
-Graphics, and Higher Dimensions", Scientific American Library, 1990.
-
-https://en.wikipedia.org/wiki/Real_projective_plane
-https://en.wikipedia.org/wiki/Roman_surface
-https://en.wikipedia.org/wiki/Cross_cap
-https://en.wikipedia.org/wiki/Moebius_strip
-http://mathworld.wolfram.com/RealProjectivePlane.html
-http://mathworld.wolfram.com/RomanSurface.html
-http://mathworld.wolfram.com/Cross-Cap.html
-http://mathworld.wolfram.com/MoebiusStrip.html
-
-Written by Carsten Steger; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/providence.xml b/hacks/config/providence.xml
deleted file mode 100644
index 0156dc0..0000000
--- a/hacks/config/providence.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="providence" _label="Providence" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=bnwRPPMopWc"/>
-
- <number id="speed" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="eye" _label="Draw eye" arg-unset="-no-eye"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-"A pyramid unfinished. In the zenith an eye in a triangle, surrounded
-by a glory, proper."
-
-https://en.wikipedia.org/wiki/Eye_of_Providence
-
-Written by Blair Tennessy; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/pulsar.xml b/hacks/config/pulsar.xml
deleted file mode 100644
index 64be3bf..0000000
--- a/hacks/config/pulsar.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="pulsar" _label="Pulsar" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=pR0lpvOAbUo"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="quads" type="spinbutton" arg="-quads %"
- _label="Quad count" low="1" high="50" default="5"/>
-
- <hgroup>
- <vgroup>
- <boolean id="light" _label="Enable lighting" arg-set="-light"/>
- <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
- <boolean id="texture" _label="Enable texturing" arg-set="-texture"/>
- <boolean id="mipmap" _label="Enable texture mipmaps" arg-set="-mipmap"/>
- </vgroup>
- <vgroup>
- <boolean id="no-blend" _label="Enable blending" arg-unset="-no-blend"/>
- <boolean id="antialias" _label="Anti-alias lines" arg-set="-antialias"/>
- <boolean id="texture_quality" _label="Enable texture filtering"
- arg-set="-texture_quality"/>
- <boolean id="do_depth" _label="Enable depth buffer" arg-set="-do_depth"/>
- </vgroup>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Intersecting planes, with alpha blending, fog, textures, and mipmaps.
-
-Written by David Konerding; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/pyro.xml b/hacks/config/pyro.xml
deleted file mode 100644
index ca81c3d..0000000
--- a/hacks/config/pyro.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="pyro" _label="Pyro">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=JJqVfnMstuw"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Slow" _high-label="Fast"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Particle density" _low-label="Sparse" _high-label="Dense"
- low="10" high="2000" default="600"/>
-
- <number id="launch" type="slider" arg="-frequency %"
- _label="Launch frequency" _low-label="Seldom" _high-label="Often"
- low="1" high="100" default="30"
- convert="invert"/>
-
- <number id="scatter" type="slider" arg="-scatter %"
- _label="Explosive yield" _low-label="Low" _high-label="High"
- low="1" high="400" default="100"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Exploding fireworks. See also the "Fireworkx", "Eruption", and
-"XFlame" screen savers.
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/qix.xml b/hacks/config/qix.xml
deleted file mode 100644
index a2a4ea2..0000000
--- a/hacks/config/qix.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="qix" _label="Qix">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=GPqDtJ0vF8U"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="segments" type="slider" arg="-segments %"
- _label="Segments" _low-label="Few" _high-label="Many"
- low="10" high="500" default="250"/>
-
- <number id="spread" type="slider" arg="-spread %"
- _label="Density" _low-label="Sparse" _high-label="Dense"
- low="1" high="50" default="8"
- convert="invert"/>
-
- <number id="color_contrast" type="slider" arg="-color-shift %"
- _label="Color contrast" _low-label="Low" _high-label="High"
- low="0" high="25" default="3"/>
- </vgroup>
- <vgroup>
- <select id="fill">
- <option id="lines" _label="Line segments" arg-set="-hollow"/>
- <option id="solid" _label="Solid objects"/>
- </select>
-
- <select id="motion">
- <option id="linear" _label="Linear motion"/>
- <option id="random" _label="Random motion" arg-set="-random"/>
- </select>
-
- <select id="color-mode">
- <option id="additive" _label="Additive colors"/>
- <option id="subtractive" _label="Subtractive colors"
- arg-set="-subtractive"/>
- </select>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Count" low="0" high="20" default="4"/>
- <number id="size" type="spinbutton" arg="-size %"
- _label="Max size" low="200" high="1000" default="200"/>
- <number id="poly" type="spinbutton" arg="-poly %"
- _label="Poly corners" low="2" high="100" default="2"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="transparent" _label="Transparent" arg-unset="-non-transparent"/>
- <boolean id="xor" _label="XOR" arg-set="-xor"/>
- <boolean id="gravity" _label="Gravity" arg-set="-gravity"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Bounces a series of line segments around the screen, and uses
-variations on this basic motion pattern to produce all sorts of
-different presentations: line segments, filled polygons, and
-overlapping translucent areas.
-
-https://en.wikipedia.org/wiki/Qix
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/quasicrystal.xml b/hacks/config/quasicrystal.xml
deleted file mode 100644
index 0496d79..0000000
--- a/hacks/config/quasicrystal.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="quasicrystal" _label="Quasi-Crystal" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=JsGf65d5TfM"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="5.0" default="1.0"/>
- </vgroup>
- <vgroup>
- <number id="count" type="slider" arg="-count %"
- _label="Density" _low-label="Low" _high-label="High"
- low="7" high="37" default="17"
- convert="invert"/>
-
- <number id="contrast" type="slider" arg="-contrast %"
- _label="Contrast" _low-label="Low" _high-label="High"
- low="0" high="100" default="30"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Displacement" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Rotation" arg-unset="-no-spin"/>
- <boolean id="symmetric" _label="Symmetry" arg-unset="-no-symmetry"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A quasicrystal is a structure that is ordered but aperiodic.
-Two-dimensional quasicrystals can be generated by adding a set of
-planes where x is the sine of y. Different complex aperiodic plane
-tilings are produced depending on the period, position, and rotation
-of the component planes, and whether the rotation of the planes is
-evenly distributed around the circle (the "symmetry" option, above)
-or random.
-
-See also the "RD-Bomb", "CWaves" and "Penrose" screen savers.
-
-https://en.wikipedia.org/wiki/Quasicrystal
-
-Written by Jamie Zawinski; 2013.
- </_description>
-</screensaver>
diff --git a/hacks/config/queens.xml b/hacks/config/queens.xml
deleted file mode 100644
index aa949fd..0000000
--- a/hacks/config/queens.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="queens" _label="Queens" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Ssy0ldFDeAs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The N-Queens problem: how to place N queens on an NxN chessboard
-such that no queen can attack a sister?
-
-See also the "Endgame" screen saver.
-
-https://en.wikipedia.org/wiki/Eight_queens_puzzle
-
-Written by Blair Tennessy and Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/raverhoop.xml b/hacks/config/raverhoop.xml
deleted file mode 100644
index 89936e6..0000000
--- a/hacks/config/raverhoop.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="raverhoop" _label="Raver Hoop" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=0k2sP_Imb80" />
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Colors" _low-label="1" _high-label="64"
- low="1" high="64" default="12"/>
-
- <number id="lights" type="slider" arg="-lights %"
- _label="Lights" _low-label="Sparse" _high-label="Dense"
- low="3" high="512" default="200"/>
-
- </vgroup>
- <vgroup>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed, motion" _low-label="Slow" _high-label="Fast"
- low="0.1" high="5.0" default="1.0"/>
-
- <number id="light-speed" type="slider" arg="-light-speed %"
- _label="Speed, lights" _low-label="Slow" _high-label="Fast"
- low="0.1" high="5.0" default="1.0"/>
-
- <number id="sustain" type="slider" arg="-sustain %"
- _label="Sustain" _low-label="Brief" _high-label="Long"
- low="0.1" high="5.0" default="1.0"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- <boolean id="spin" _label="Spin" arg-set="-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Simulates an LED hula hoop in a dark room. Oontz oontz oontz.
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/razzledazzle.xml b/hacks/config/razzledazzle.xml
deleted file mode 100644
index 20bd489..0000000
--- a/hacks/config/razzledazzle.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="razzledazzle" _label="Razzle Dazzle" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=tV_70VxJFfs" />
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10" default="1.0"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Colors" _low-label="Mono" _high-label="Many"
- low="2" high="200" default="2"/>
-
- </vgroup>
- <vgroup>
-
- <number id="density" type="slider" arg="-density %"
- _label="Density" _low-label="Sparse" _high-label="Dense"
- low="1.0" high="10.0" default="5.0"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Lines" _low-label="Thin" _high-label="Thick"
- low="0.05" high="1.0" default="0.1"/>
-
- <select id="object">
- <option _label="Ship Outlines" arg-set="-mode ships"/>
- <option _label="Flat Pattern" arg-set="-mode flat"/>
- <option id="random" _label="Ships or flat pattern"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Generates an infinitely-scrolling sequence of dazzle camouflage patterns.
-
-Dazzle Ships, in addition to being the best album by Orchestral
-Manoeuvres in the Dark, were military vessels during World War I and
-early in World War II that were painted not to conceal but to confuse:
-with these Cubist overlapping stripes, it was very hard to estimate
-their size, range and heading. This was a big deal before the
-invention of Radar.
-
-https://en.wikipedia.org/wiki/Dazzle_camouflage
-https://en.wikipedia.org/wiki/Cubism
-https://en.wikipedia.org/wiki/Dazzle_Ships_%28album%29
-https://en.wikipedia.org/wiki/Acoustic_mirror
-https://en.wikipedia.org/wiki/Radar
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/rd-bomb.xml b/hacks/config/rd-bomb.xml
deleted file mode 100644
index a6cc47d..0000000
--- a/hacks/config/rd-bomb.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rd-bomb" _label="RD-Bomb">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=xiooDyrZSsY"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Slow" _high-label="Fast"
- low="0" high="250000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Wander speed" _low-label="Slow" _high-label="Fast"
- low="0.0" high="10.0" default="0.0"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Fill screen" _low-label="1%" _high-label="100%"
- low="0.01" high="1.0" default="1.0"/>
- </vgroup>
- <vgroup>
- <number id="epoch" type="slider" arg="-epoch %"
- _label="Epoch" _low-label="Small" _high-label="Large"
- low="1000" high="300000" default="40000"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="255"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="width" type="spinbutton" arg="-width %"
- _label="X tile size" low="0" high="500" default="0"/>
- <number id="pixheight" type="spinbutton" arg="-height %"
- _label="Y tile size" low="0" high="500" default="0"/>
- </vgroup>
- <vgroup>
- <number id="reaction" type="spinbutton" arg="-reaction %"
- _label="Reaction" low="-1" high="2" default="-1"/>
- <number id="diffusion" type="spinbutton" arg="-diffusion %"
- _label="Diffusion" low="-1" high="2" default="-1"/>
-
- <!-- #### default is wrong -->
- <number id="radius" type="spinbutton" arg="-radius %"
- _label="Seed radius" low="-1" high="60" default="-1"/>
-
- </vgroup>
-
- </hgroup>
-
- <_description>
-Reaction-diffusion: draws a grid of growing square-like shapes that,
-once they overtake each other, react in unpredictable ways.
-
-Written by Scott Draves; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/rdbomb.xml b/hacks/config/rdbomb.xml
deleted file mode 120000
index b70f7a7..0000000
--- a/hacks/config/rdbomb.xml
+++ /dev/null
@@ -1 +0,0 @@
-rd-bomb.xml \ No newline at end of file
diff --git a/hacks/config/ripples.xml b/hacks/config/ripples.xml
deleted file mode 100644
index 8a2e1be..0000000
--- a/hacks/config/ripples.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="ripples" _label="Ripples">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=w8YXAalnRzc"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <number id="rate" type="slider" arg="-rate %"
- _label="Drippiness" _low-label="Drizzle" _high-label="Storm"
- low="1" high="100" default="5"
- convert="invert"/>
-
- <number id="fluidity" type="slider" arg="-fluidity %"
- _label="Fluidity" _low-label="Small drops" _high-label="Big drops"
- low="0" high="16" default="6"/>
- </vgroup>
- <vgroup>
-
- <hgroup>
- <boolean id="stir" _label="Moving splashes" arg-set="-stir"/>
- <boolean id="oily" _label="Psychedelic colors" arg-set="-oily"/>
- <boolean id="gray" _label="Grayscale" arg-set="-grayscale"/>
- </hgroup>
-
- <xscreensaver-image />
-
- <number id="light" type="spinbutton" arg="-light %"
- _label="Magic lighting effect" low="0" high="8" default="4"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
-Rippling interference patterns reminiscent of splashing water
-distort a loaded image.
-
-Written by Tom Hammersley; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/rocks.xml b/hacks/config/rocks.xml
deleted file mode 100644
index 964de82..0000000
--- a/hacks/config/rocks.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rocks" _label="Rocks">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=7x7PMI7LFK0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Many"
- low="0" high="200" default="100"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Velocity" _low-label="Slow" _high-label="Fast"
- low="1" high="100" default="100"/>
-
- <hgroup>
- <boolean id="rotate" _label="Rotation" arg-unset="-no-rotate"/>
- <boolean id="steer" _label="Steering" arg-unset="-no-move"/>
- <boolean id="3d" _label="Do Red/Blue 3D separation" arg-set="-3d"/>
- </hgroup>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="5"/>
-
- <!-- #### -delta3d [1.5] -->
- <!-- #### -left3d [Blue] -->
- <!-- #### -right3d [Red] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-An asteroid field zooms by.
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/romanboy.xml b/hacks/config/romanboy.xml
deleted file mode 100644
index 4cd6259..0000000
--- a/hacks/config/romanboy.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="romanboy" _label="Roman Boy" gl="yes">
-
- <video href="https://www.youtube.com/watch?v=KEW5TuPbWyg"/>
-
- <command arg="-root"/>
-
- <hgroup>
- <select id="view-mode">
- <option id="walk" _label="Random motion"/>
- <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
- <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
- </select>
-
- <number id="surface-order" type="spinbutton" arg="-surface-order %"
- _label="Order of the surface" low="2" high="9" default="3"/>
-
- <boolean id="orientation-marks" _label="Show orientation marks"
- arg-set="-orientation-marks"/>
- </hgroup>
-
- <hgroup>
- <boolean id="deform" _label="Deform the projective plane"
- arg-unset="-no-deform"/>
-
- <number id="deform-speed" type="slider" arg="-deformation-speed %"
- _label="Deformation speed"
- _low-label="1.0" _high-label="100.0"
- low="1.0" high="100.0" default="10.0"/>
-
- <number id="init-deform" type="slider" arg="-initial-deformation %"
- _label="Initial deformation"
- _low-label="0.0" _high-label="1000.0"
- low="0.0" high="1000.0" default="1000.0"/>
- </hgroup>
-
-
- <hgroup>
-
- <vgroup>
- <select id="display-mode">
- <option id="random" _label="Random surface"/>
- <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
- <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
- <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
- </select>
-
- <select id="appearance">
- <option id="random" _label="Random pattern"/>
- <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
- <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
- <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
- </select>
-
- <select id="colors">
- <option id="random" _label="Random coloration"/>
- <option id="twosided" _label="One-sided" arg-set="-colors one-sided"/>
- <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
- <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
- <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
- </select>
-
- <boolean id="change-colors" _label="Change colors"
- arg-set="-change-colors"/>
-
- <select id="projection">
- <option id="random" _label="Random Projection"/>
- <option id="perspective" _label="Perspective" arg-set="-projection perspective"/>
- <option id="orthographic" _label="Orthographic" arg-set="-projection orthographic"/>
- </select>
- </vgroup>
-
- <vgroup>
- <number id="speed-x" type="slider" arg="-speed-x %"
- _label="X rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.1"/>
-
- <number id="speed-y" type="slider" arg="-speed-y %"
- _label="Y rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.3"/>
-
- <number id="speed-z" type="slider" arg="-speed-z %"
- _label="Z rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="1.5"/>
- </vgroup>
-
- <vgroup>
- <number id="walk-direction" type="slider" arg="-walk-direction %"
- _label="Walking direction"
- _low-label="-180.0" _high-label="180.0"
- low="-180.0" high="180.0" default="83.0"/>
-
- <number id="walk-speed" type="slider" arg="-walk-speed %"
- _label="Walking speed"
- _low-label="1.0" _high-label="100.0"
- low="1.0" high="100.0" default="20.0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="25000"
- convert="invert"/>
- </vgroup>
-
- <vgroup>
- <xscreensaver-updater />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- </hgroup>
-
- <_description>
-A 3D immersion of the real projective plane that smoothly deforms
-between the Roman surface and the Boy surface.
-
-You can walk on the surface of the real projective plane or rotate it
-in 3D. Furthermore, it is possible to smoothly deform the real
-projective plane between the Roman surface and the Boy surface while
-turning it or walking on it. Inspired by François Apéry's book
-"Models of the Real Projective Plane", Vieweg, 1987.
-
-https://en.wikipedia.org/wiki/Boy%27s_surface
-https://en.wikipedia.org/wiki/Roman_surface
-http://mathworld.wolfram.com/BoySurface.html
-http://mathworld.wolfram.com/RomanSurface.html
-
-Written by Carsten Steger; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/rorschach.xml b/hacks/config/rorschach.xml
deleted file mode 100644
index e4f0207..0000000
--- a/hacks/config/rorschach.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rorschach" _label="Rorschach">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=G1OLn4Mdk5Y"/>
-
- <number id="iterations" type="slider" arg="-iterations %"
- _label="Iterations" _low-label="Small" _high-label="Large"
- low="0" high="10000" default="4000"/>
-
- <number id="offset" type="slider" arg="-offset %"
- _label="Offset" _low-label="Small" _high-label="Large"
- low="0" high="50" default="7"/>
-
- <boolean id="xsymmetry" _label="With X symmetry" arg-unset="-no-xsymmetry"/>
- <boolean id="ysymmetry" _label="With Y symmetry" arg-set="-ysymmetry"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Linger" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Inkblot patterns via a reflected random walk.
-
-https://en.wikipedia.org/wiki/Rorschach_inkblot_test
-https://en.wikipedia.org/wiki/Random_walk
-
-Written by Jamie Zawinski; 1992.
- </_description>
-</screensaver>
diff --git a/hacks/config/rotor.xml b/hacks/config/rotor.xml
deleted file mode 100644
index 2ffddf1..0000000
--- a/hacks/config/rotor.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rotor" _label="Rotor">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=HWcEvT1keDA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Length" _low-label="Short" _high-label="Long"
- low="2" high="100" default="20"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Count" low="0" high="20" default="4"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Size" low="-50" high="50" default="-6"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Draws a line segment moving along a complex spiraling curve.
-
-Written by Tom Lawrence; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/rotzoomer.xml b/hacks/config/rotzoomer.xml
deleted file mode 100644
index c333d95..0000000
--- a/hacks/config/rotzoomer.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rotzoomer" _label="Rot Zoomer">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=ecl8ykLswX8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000" convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <number id="n" type="spinbutton" arg="-n %"
- _label="Rectangle count" low="1" high="20" default="2"/>
-
- <select id="mode">
- <option id="random" _label="Random"/>
- <option id="stationary" _label="Stationary rectangles" arg-set="-mode stationary"/>
- <option id="move" _label="Wandering rectangles" arg-set="-mode move"/>
- <option id="sweep" _label="Sweeping arcs" arg-set="-mode sweep"/>
- <option id="circle" _label="Rotating discs" arg-set="-mode circle"/>
- </select>
-
- <boolean id="anim" _label="Animate" arg-unset="-no-anim"/>
-
-<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
-
- <xscreensaver-image />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Distorts an image by rotating and scaling random sections of it.
-
-Written by Claudio Matsuoka and Jamie Zawinski; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/rubik.xml b/hacks/config/rubik.xml
deleted file mode 100644
index f48668b..0000000
--- a/hacks/config/rubik.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rubik" _label="Rubik" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=AQdJgvyVkXU"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Count" low="-100" high="100" default="-30"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Rotation" _low-label="Slow" _high-label="Fast"
- low="3" high="200" default="20"
- convert="invert"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Size" low="-20" high="20" default="-6"/>
-
- <boolean id="shuffle" _label="Hide shuffling" arg-set="-hideshuffling"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A Rubik's Cube that repeatedly shuffles and solves itself.
-See also the "GLSnake" and "Cube21" screen savers.
-
-https://en.wikipedia.org/wiki/Rubik%27s_Cube
-
-Written by Marcelo Vianna; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/rubikblocks.xml b/hacks/config/rubikblocks.xml
deleted file mode 100644
index 50ab78b..0000000
--- a/hacks/config/rubikblocks.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="rubikblocks" _label="Rubik Blocks" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=B2sGaRLWz-A"/>
-
- <hgroup>
- <vgroup>
-
- <number id="speed" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000" convert="invert"/>
-
- <number id="cubesize" type="slider" arg="-cubesize %"
- _label="Cube size" _low-label="Small" _high-label="Large"
- low="0.4" high="2.0" default="1.0"/>
-
- <number id="rotspeed" type="slider" arg="-rotspeed %"
- _label="Rotation" _low-label="Slow" _high-label="Fast"
- low="1.0" high="10.0" default="3.0"/>
-
- <select id="start">
- <option id="cube" _label="Start as cube"/>
- <option id="shuffle" _label="Start as random shape" arg-set="-randomize"/>
- </select>
-
- </vgroup>
- <vgroup>
-
- <number id="spinspeed" type="slider" arg="-spinspeed %"
- _label="Spin" _low-label="Slow" _high-label="Fast"
- low="0.01" high="4.0" default="0.1"/>
-
- <number id="wanderspeed" type="slider" arg="-wanderspeed %"
- _label="Wander" _low-label="Slow" _high-label="Fast"
- low="0.001" high="0.1" default="0.005"/>
-
- <number id="wait" type="slider" arg="-wait %"
- _label="Linger" _low-label="Short" _high-label="Long"
- low="10.0" high="100.0" default="40.0"/>
-
- <hgroup>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="tex" _label="Outlines" arg-unset="-no-texture"/>
- </hgroup>
- <hgroup>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The "Rubik's Mirror Blocks" puzzle.
-See also the "Rubik", "Cube21", and "GLSnake" screen savers.
-
-https://en.wikipedia.org/wiki/Combination_puzzles#Irregular_cuboids
-
-Written by Vasek Potocek; 2009.
- </_description>
-</screensaver>
diff --git a/hacks/config/sballs.xml b/hacks/config/sballs.xml
deleted file mode 100644
index 6a72def..0000000
--- a/hacks/config/sballs.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="sballs" _label="SBalls" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=pcfqdvvPG8k"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <select id="object">
- <option id="random" _label="Random"/>
- <option id="tetra" _label="Tetrahedron" arg-set="-object 1"/>
- <option id="cube" _label="Cube" arg-set="-object 2"/>
- <option id="octa" _label="Octahedron" arg-set="-object 3"/>
- <option id="dodeca" _label="Dodecahedron" arg-set="-object 4"/>
- <option id="icosa" _label="Icosahedron" arg-set="-object 5"/>
- <option id="plane" _label="Plane" arg-set="-object 6"/>
- <option id="pyramid" _label="Pyramid" arg-set="-object 7"/>
- <option id="star" _label="Star" arg-set="-object 8"/>
- </select>
-
- <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Textured balls spinning like crazy.
-
-Written by Eric Lassauge; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/scooter.xml b/hacks/config/scooter.xml
deleted file mode 100644
index 72fe9b3..0000000
--- a/hacks/config/scooter.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="scooter" _label="Scooter" gl="no">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Qqzk1BldlXg"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Boat Speed" _low-label="Very slow" _high-label="Very fast"
- low="0" high="1000" default="5"/>
- <number id="count" type="slider" arg="-count %"
- _label="Number of doors" _low-label="4" _high-label="40"
- low="4" high="40" default="24"/>
- </vgroup>
- <vgroup>
- <number id="size" type="slider" arg="-size %"
- _label="Number of stars" _low-label="1" _high-label="200"
- low="0" high="200" default="100"/>
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Mono" _high-label="Colorful"
- low="0" high="200" default="200"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
- </vgroup>
- </hgroup>
-
- <_description>
-Zooming down a tunnel in a star field. Originally an Amiga hack.
-
-Written by Sven Thoennissen; 2001.
-Ported by EoflaOE; 2019.
- </_description>
-</screensaver>
diff --git a/hacks/config/shadebobs.xml b/hacks/config/shadebobs.xml
deleted file mode 100644
index 7ea34a0..0000000
--- a/hacks/config/shadebobs.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="shadebobs" _label="Shade Bobs">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=gJtxnQ5_8Zk"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="20000" default="10000"
- convert="invert"/>
-
- <!-- #### -degrees [0] -->
- <!-- #### -color [random] -->
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="One" _high-label="Many"
- low="1" high="20" default="4"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="0" high="100" default="10"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Oscillating oval patterns that look something like vapor trails or neon tubes.
-
-Written by Shane Smit; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/sierpinski.xml b/hacks/config/sierpinski.xml
deleted file mode 100644
index 3aec43d..0000000
--- a/hacks/config/sierpinski.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="sierpinski" _label="Sierpinski">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=m0zdPWuFhjA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="1000000" default="400000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Points" _low-label="Few" _high-label="Many"
- low="10" high="10000" default="2000"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="1000" default="100"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-The 2D Sierpinski triangle fractal. See also the "Sierpinski3D" screen saver.
-
-https://en.wikipedia.org/wiki/Sierpinski_triangle
-
-Written by Desmond Daignault; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/sierpinski3d.xml b/hacks/config/sierpinski3d.xml
deleted file mode 100644
index c7dcd3b..0000000
--- a/hacks/config/sierpinski3d.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="sierpinski3d" _label="Sierpinski 3D" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=TGQRLAhDLv0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="descent" type="slider" arg="-speed %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="2" high="500" default="150"
- convert="invert"/>
-
- <number id="depth" type="spinbutton" arg="-depth %"
- _label="Max depth" low="1" high="6" default="5"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-The recursive Sierpinski tetrahedron fractal.
-
-https://en.wikipedia.org/wiki/Sierpinski_triangle#Analogs_in_higher_dimension
-
-Written by Jamie Zawinski and Tim Robinson; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/skytentacles.xml b/hacks/config/skytentacles.xml
deleted file mode 100644
index 9436760..0000000
--- a/hacks/config/skytentacles.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="skytentacles" _label="Sky Tentacles" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=iCjtXUSQv1A"/>
-
- <hgroup>
- <vgroup>
- <number id="count" type="slider" arg="-count %"
- _label="Tentacles" _low-label="1" _high-label="20"
- low="1" high="20" default="9"/>
-
- <number id="length" type="slider" arg="-length %"
- _label="Length" _low-label="Short" _high-label="Long"
- low="1.0" high="20.0" default="9.0"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="0.1" high="5.0" default="1.0"/>
-
- <number id="flexibility" type="slider" arg="-flexibility %"
- _label="Flexibility" _low-label="Low" _high-label="High"
- low="0.1" high="1.0" default="0.35"/>
-
- <number id="wiggliness" type="slider" arg="-wiggliness %"
- _label="Wiggliness" _low-label="Low" _high-label="High"
- low="0.1" high="1.0" default="0.35"/>
-
- </vgroup>
-
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Slow" _high-label="Fast"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
-
- <number id="slices" type="slider" arg="-slices %"
- _label="X resolution" _low-label="Low" _high-label="High"
- low="3" high="50" default="16"/>
- <number id="segments" type="slider" arg="-segments %"
- _label="Y resolution" _low-label="Low" _high-label="High"
- low="2" high="50" default="24"/>
-
- <hgroup>
- <boolean id="skin" _label="Draw skin" arg-unset="-no-texture"/>
- <boolean id="cel" _label="Cartoony" arg-set="-cel"/>
- <boolean id="intersect" _label="Tentacles can intersect" arg-set="-intersect"/>
- </hgroup>
- <hgroup>
- <boolean id="smooth" _label="Smooth" arg-unset="-no-smooth"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
- </hgroup>
-
-
- <xscreensaver-updater />
-
- <_description>
-There is a tentacled abomination in the sky. From above you it devours.
-
-Written by Jamie Zawinski; 2008.
- </_description>
-</screensaver>
diff --git a/hacks/config/slidescreen.xml b/hacks/config/slidescreen.xml
deleted file mode 100644
index ec76d77..0000000
--- a/hacks/config/slidescreen.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="slidescreen" _label="Slide Screen">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=uKNE4xCdlno"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="delay2" type="slider" arg="-delay2 %"
- _label="Pause" _low-label="Short" _high-label="Long"
- low="0" high="2000000" default="1000000"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <xscreensaver-image />
-
- </vgroup>
- <vgroup>
- <number id="increment" type="slider" arg="-increment %"
- _label="Slide speed" _low-label="Slow" _high-label="Fast"
- low="1" high="30" default="10"/>
-
- <number id="grid-size" type="slider" arg="-grid-size %"
- _label="Cell size" _low-label="Small" _high-label="Large"
- low="12" high="500" default="70"/>
-
- <number id="ibw" type="spinbutton" arg="-ibw %"
- _label="Gutter size" low="0" high="50" default="4"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
-A variant on a "fifteen puzzle", operating on the screen or an image.
-It divides the image into a grid and randomly shuffles the squares.
-
-https://en.wikipedia.org/wiki/Fifteen_puzzle
-
-Written by Jamie Zawinski; 1994.
- </_description>
-</screensaver>
diff --git a/hacks/config/slip.xml b/hacks/config/slip.xml
deleted file mode 100644
index 5a656f3..0000000
--- a/hacks/config/slip.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="slip" _label="Slip">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=BgzNvBm4MuE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Many"
- low="0" high="100" default="35"/>
- </vgroup>
-
- <vgroup>
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Timeout" _low-label="Small" _high-label="Large"
- low="0" high="100" default="50"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-image />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A jet engine consumes the screen, then puts it through a spin cycle.
-
-Written by Scott Draves and Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/sonar.xml b/hacks/config/sonar.xml
deleted file mode 100644
index e459c51..0000000
--- a/hacks/config/sonar.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="sonar" _label="Sonar" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=XEL8g3qbthE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="8.0" default="1.0"/>
-
- <select id="ping">
- <option id="sn" _label="Ping local subnet"/>
-<!--
- <option id="24" _label="Ping subnet/24 (254 hosts)" arg-set="-ping subnet/24"/>
- <option id="25" _label="Ping subnet/25 (126 hosts)" arg-set="-ping subnet/25"/>
- <option id="26" _label="Ping subnet/26 (62 hosts)" arg-set="-ping subnet/26"/>
- <option id="27" _label="Ping subnet/27 (31 hosts)" arg-set="-ping subnet/27"/>
- <option id="28" _label="Ping subnet/28 (14 hosts)"/>
- <option id="29" _label="Ping subnet/29 (6 hosts)" arg-set="-ping subnet/29"/>
- <option id="30" _label="Ping subnet/30 (2 hosts)" arg-set="-ping subnet/30"/>
--->
-
- <option id="ssh" _label="Ping known SSH hosts" arg-set="-ping /etc/hosts,$HOME/.ssh/known_hosts,$HOME/.ssh/known_hosts2"/>
-
- <option id="popular" _label="Ping Google, Facebook, etc." arg-set="-ping google.com,facebook.com,twitter.com,yahoo.com,flickr.com,www.apple.com,wikipedia.org,linux.org,youtube.com,disqus.com,blogger.com,wordpress.com,tumblr.com,whitehouse.gov"/>
-
- <option id="sim" _label="Simulation (don't ping)" arg-set="-ping simulation"/>
- </select>
- </vgroup>
-
- <vgroup>
- <number id="font" type="slider" arg="-font-size %"
- _label="Font size" _low-label="Tiny" _high-label="Huge"
- low="6.0" high="24.0" default="12"/>
-
- <number id="sweep" type="slider" arg="-sweep-size %"
- _label="Trail length" _low-label="Short" _high-label="Long"
- low="0.02" high="0.7" default="0.3"/>
- </vgroup>
- </hgroup>
-
-
- <hgroup>
- <string id="aname" _label="Simulation team A name" arg="-team-a-name %"/>
- <number id="acount" type="spinbutton" arg="-team-a-count %"
- _label="A count" low="1" high="100" default="4"/>
- </hgroup>
-
- <hgroup>
- <string id="bname" _label="Simulation team B name" arg="-team-b-name %"/>
- <number id="bcount" type="spinbutton" arg="-team-b-count %"
- _label="B count" low="1" high="100" default="4"/>
- </hgroup>
-
- <hgroup>
- <boolean id="dns" _label="Resolve host names" arg-unset="-no-dns"/>
- <boolean id="times" _label="Show ping times" arg-unset="-no-times"/>
- <boolean id="wobble" _label="Tilt" arg-unset="-no-wobble"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A sonar display pings (get it?) the hosts on your local network, and
-plots their distance (response time) from you. The three rings
-represent ping times of approximately 2.5, 70 and 2,000 milliseconds
-respectively.
-
-Alternately, it can run a simulation that doesn't involve hosts.
-
-https://en.wikipedia.org/wiki/Ping#History
-
-Written by Jamie Zawinski and Stephen Martin; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/speedmine.xml b/hacks/config/speedmine.xml
deleted file mode 100644
index 90ee0bb..0000000
--- a/hacks/config/speedmine.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="speedmine" _label="Speed Mine">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=awOnhCxRD_c"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="velocity" type="slider" arg="-maxspeed %"
- _label="Max velocity" _low-label="Slow" _high-label="Fast"
- low="1" high="1000" default="700"/>
-
- <number id="thrust" type="slider" arg="-thrust %"
- _label="Thrust" _low-label="Slow" _high-label="Fast"
- low="0.0" high="4.0" default="1.0"/>
-
- <number id="gravity" type="slider" arg="-gravity %"
- _label="Gravity" _low-label="Low" _high-label="High"
- low="0.0" high="25.0" default="9.8"/>
- </vgroup>
- <vgroup>
-
- <select id="mode">
- <option id="speedmine" _label="Tunnel"/>
- <option id="speedworm" _label="Worm" arg-set="-worm"/>
- </select>
-
- <boolean id="terrain" _label="Rocky walls" arg-unset="-no-terrain"/>
- <boolean id="bump" _label="Allow wall collisions" arg-unset="-no-bumps"/>
- <boolean id="bonus" _label="Present bonuses" arg-unset="-no-bonuses"/>
- <boolean id="xhair" _label="Display crosshair" arg-unset="-no-crosshair"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <!-- #### -vertigo [1.0] -->
- <!-- #### -darkground [#101010] -->
- <!-- #### -lightground [#a0a0a0] -->
- <!-- #### -tunnelend [#000000] -->
- <!-- #### -smoothness [6] -->
- <!-- #### -curviness [1.0] -->
- <!-- #### -twistiness [1.0] -->
- <!-- #### -no-widening -->
- <!-- #### -psychedelic -->
-
- <xscreensaver-updater />
-
- <_description>
-Simulates speeding down a rocky mineshaft, or a funky dancing worm.
-
-Written by Conrad Parker; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/sphere.xml b/hacks/config/sphere.xml
deleted file mode 100644
index 55a5d79..0000000
--- a/hacks/config/sphere.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="sphere" _label="Sphere">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=FswhxIVXdt8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Draws shaded spheres in multiple colors.
-
-Written by Tom Duff and Jamie Zawinski; 1982, 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/sphereeversion.xml b/hacks/config/sphereeversion.xml
deleted file mode 100644
index 365db9b..0000000
--- a/hacks/config/sphereeversion.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="sphereeversion" _label="Sphere Eversion" gl="yes">
-
- <video href="https://www.youtube.com/watch?v=CbmIggJ5GdA"/>
-
- <command arg="-root"/>
-
- <hgroup>
-
- <vgroup>
- <number id="deform-speed" type="slider" arg="-deformation-speed %"
- _label="Deformation speed"
- _low-label="1.0" _high-label="100.0"
- low="1.0" high="100.0" default="10.0"/>
-
- <select id="surface-order">
- <option id="random" _label="Random surface order"/>
- <option id="2" _label="2" arg-set="-surface-order 2"/>
- <option id="3" _label="3" arg-set="-surface-order 3"/>
- <option id="4" _label="4" arg-set="-surface-order 4"/>
- <option id="5" _label="5" arg-set="-surface-order 5"/>
- </select>
- </vgroup>
-
- <vgroup>
- <select id="display-mode">
- <option id="random" _label="Random surface"/>
- <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
- <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
- </select>
-
- <select id="appearance">
- <option id="random" _label="Random pattern"/>
- <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
- <option id="bands" _label="Parallel bands" arg-set="-appearance parallel-bands"/>
- <option id="bands" _label="Meridian bands" arg-set="-appearance meridian-bands"/>
- </select>
-
- <select id="graticule">
- <option id="random" _label="Random graticule"/>
- <option id="bands" _label="With graticule" arg-set="-graticule on"/>
- <option id="bands" _label="Without graticule" arg-set="-graticule off"/>
- </select>
-
- <select id="colors">
- <option id="random" _label="Random coloration"/>
- <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
- <option id="rainbow" _label="Parallel colors" arg-set="-colors parallel"/>
- <option id="rainbow" _label="Meridian colors" arg-set="-colors meridian"/>
- </select>
-
- <select id="projection">
- <option id="random" _label="Random Projection"/>
- <option id="perspective" _label="Perspective" arg-set="-projection perspective"/>
- <option id="orthographic" _label="Orthographic" arg-set="-projection orthographic"/>
- </select>
- </vgroup>
-
- <vgroup>
- <number id="speed-x" type="slider" arg="-speed-x %"
- _label="X rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="0.0"/>
-
- <number id="speed-y" type="slider" arg="-speed-y %"
- _label="Y rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="0.0"/>
-
- <number id="speed-z" type="slider" arg="-speed-z %"
- _label="Z rotation speed"
- _low-label="-4.0" _high-label="4.0"
- low="-4.0" high="4.0" default="0.0"/>
- </vgroup>
-
- <vgroup>
- <xscreensaver-updater />
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- </hgroup>
-
- <_description>
-Turns a sphere inside out: a smooth deformation (homotopy). During the
-eversion, the deformed sphere is allowed to intersect itself transversally,
-however, no creases or pinch points occur.
-
-Inspired by the following paper: Adam Bednorz, Witold Bednorz:
-"Analytic sphere eversion using ruled surfaces", Differential Geometry
-and its Applications 64:59-79, 2019.
-
-https://en.wikipedia.org/wiki/Sphere_eversion
-https://mathworld.wolfram.com/SphereEversion.html
-
-Written by Carsten Steger; 2020.
- </_description>
-</screensaver>
diff --git a/hacks/config/spheremonics.xml b/hacks/config/spheremonics.xml
deleted file mode 100644
index e88a5f9..0000000
--- a/hacks/config/spheremonics.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="spheremonics" _label="Spheremonics" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=KrNVwyWi0io"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="5" high="1000" default="200"/>
-
- <number id="resolution" type="slider" arg="-resolution %"
- _label="Resolution" _low-label="Low" _high-label="High"
- low="5" high="100" default="64"/>
-
- </vgroup>
- <vgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
-
- <boolean id="smooth" _label="Smoothed lines" arg-unset="-no-smooth"/>
- <boolean id="grid" _label="Draw grid" arg-unset="-no-grid"/>
- <boolean id="bbox" _label="Draw bounding box" arg-set="-bbox"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-These closed objects are commonly called spherical harmonics,
-although they are only remotely related to the mathematical
-definition found in the solution to certain wave functions, most
-notably the eigenfunctions of angular momentum operators.
-
-https://en.wikipedia.org/wiki/Spherical_harmonics#Visualization_of_the_spherical_harmonics
-
-Written by Paul Bourke and Jamie Zawinski; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/spiral.xml b/hacks/config/spiral.xml
deleted file mode 100644
index 14d3e75..0000000
--- a/hacks/config/spiral.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="spiral" _label="Spiral">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=8Ov2SxnO_Kg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="50000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Many"
- low="0" high="100" default="40"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Cycles" _low-label="Low" _high-label="High"
- low="10" high="800" default="350"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Moving circular moiré patterns.
-
-Written by Peter Schmitzberger; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/splitflap.xml b/hacks/config/splitflap.xml
deleted file mode 100644
index 713a126..0000000
--- a/hacks/config/splitflap.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="splitflap" _label="Split-Flap" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=rZOL2jyDey0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="8.0" default="1.0"/>
-
- <number id="width" type="spinbutton" arg="-width %"
- _label="Columns" low="1" high="120" default="22"/>
- <number id="height" type="spinbutton" arg="-height %"
- _label="Rows" low="1" high="40" default="8"/>
-
- <select id="text">
- <option id="text" _label="Display text" />
- <option id="c12" _label="Display 12-hour clock" arg-set="-mode clock12" />
- <option id="c24" _label="Display 24-hour clock" arg-set="-mode clock24" />
- </select>
-
- <select id="facing">
- <option id="front" _label="Always face front"/>
- <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
- </select>
-
- <select id="rotation">
- <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
- <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
- <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
- <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
- <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
- <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
- <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
- <option id="xyz" _label="Rotate around all three axes"/>
- </select>
-
- </vgroup>
-
- <vgroup>
- <xscreensaver-text />
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
- <xscreensaver-updater />
-
- </vgroup>
- </hgroup>
-
- <_description>
-Simulates a split-flap display, an old style of electromechanical
-sign as seen in airports and train stations, and commonly used in
-alarm clocks in the 1960s and 1970s.
-
-https://en.wikipedia.org/wiki/Split-flap_display
-https://en.wikipedia.org/wiki/Flip_clock
-
-Written by Jamie Zawinski; 2015.
- </_description>
-</screensaver>
diff --git a/hacks/config/splodesic.xml b/hacks/config/splodesic.xml
deleted file mode 100644
index 0970fd3..0000000
--- a/hacks/config/splodesic.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="splodesic" _label="Splodesic" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=pwpTs1pEQmM"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
- <number id="speed" type="slider" arg="-speed %"
- _label="Eruption frequency" _low-label="Seldom" _high-label="Often"
- low="0.01" high="5.0" default="1.0"/>
-
- <hgroup>
- <number id="freq" type="spinbutton" arg="-depth %"
- _label="Depth" low="0" high="5" default="4"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A geodesic sphere experiences a series of eruptions.
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/spotlight.xml b/hacks/config/spotlight.xml
deleted file mode 100644
index 24bfb9a..0000000
--- a/hacks/config/spotlight.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="spotlight" _label="Spotlight">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=av29CVh2UeM"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <number id="radius" type="slider" arg="-radius %"
- _label="Spotlight size" _low-label="Small" _high-label="Large"
- low="5" high="350" default="125"/>
-
- <xscreensaver-image />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-A spotlight scanning across a black screen, illuminating a loaded
-image when it passes.
-
-Written by Rick Schultz and Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/sproingies.xml b/hacks/config/sproingies.xml
deleted file mode 100644
index 1d16ff0..0000000
--- a/hacks/config/sproingies.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="sproingies" _label="Sproingies" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=fmHl17ppgc0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Sproingies" _low-label="One" _high-label="Lots"
- low="1" high="30" default="8"/>
-
- <hgroup>
- <boolean id="nofall" _label="Fall off edge" arg-set="-fall"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Slinky-like creatures walk down an infinite staircase and
-occasionally explode!
-
-https://en.wikipedia.org/wiki/Slinky
-https://en.wikipedia.org/wiki/Q%2Abert
-https://en.wikipedia.org/wiki/Marble_Madness
-
-Written by Ed Mackey; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/squiral.xml b/hacks/config/squiral.xml
deleted file mode 100644
index 1cc7e44..0000000
--- a/hacks/config/squiral.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="squiral" _label="Squiral">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=WPhqyM9Bb4o"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="disorder" type="slider" arg="-disorder %"
- _label="Randomness" _low-label="Low" _high-label="High"
- low="0.0" high="0.5" default="0.005"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Seeds" low="0" high="200" default="0"/>
-
- </vgroup>
- <vgroup>
- <number id="handedness" type="slider" arg="-handedness %"
- _label="Handedness" _low-label="Left" _high-label="Right"
- low="0.0" high="1.0" default="0.5"/>
-
- <number id="fill" type="slider" arg="-fill %"
- _label="Density" _low-label="Sparse" _high-label="Dense"
- low="0" high="100" default="75"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="100"/>
- </vgroup>
- </hgroup>
-
- <!-- #### -cycle -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Square-spiral-producing automata. The spirals grow outward until they
-hit something, then they go around it.
-
-Written by Jeff Epler; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/stairs.xml b/hacks/config/stairs.xml
deleted file mode 100644
index 099f963..0000000
--- a/hacks/config/stairs.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="stairs" _label="Stairs" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Y1ceRT30qr0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Escher's infinite staircase.
-
-https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
-
-Written by Marcelo Vianna and Jamie Zawinski; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/starfish.xml b/hacks/config/starfish.xml
deleted file mode 100644
index 006bc00..0000000
--- a/hacks/config/starfish.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="starfish" _label="Starfish">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=atwc7IJHuLo"/>
-
- <select id="mode">
- <option id="random" _label="Random"/>
- <option id="zoom" _label="Color gradients" arg-set="-mode zoom"/>
- <option id="blob" _label="Pulsating blob" arg-set="-mode blob"/>
- </select>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="1 second" _high-label="30 seconds"
- low="1" high="60" default="30"/>
-
- <number id="thickness" type="slider" arg="-thickness %"
- _label="Lines" _low-label="Thin" _high-label="Thick"
- low="0" high="150" default="0"/>
-
- <number id="ncolors" type="slider" arg="-colors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Undulating, throbbing, star-like patterns pulsate, rotate, and turn
-inside out. Another display mode uses these shapes to lay down a
-field of colors, which are then cycled. The motion is very organic.
-
-Written by Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/starwars.xml b/hacks/config/starwars.xml
deleted file mode 100644
index 2f4e90e..0000000
--- a/hacks/config/starwars.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="starwars" _label="Star Wars" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=UUjC-6e7y_U"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _low-label=" Frame rate Low" _high-label="High"
- low="0" high="100000" default="40000"
- convert="invert"/>
- <number id="steps" type="slider" arg="-steps %"
- _low-label="Scroll speed Slow" _high-label="Fast"
- low="1" high="100" default="35"
- convert="invert"/>
- <number id="spin" type="slider" arg="-spin %"
- _low-label=" Stars speed Slow" _high-label="Fast"
- low="0.0" high="0.2" default="0.03"/>
-
- <xscreensaver-text />
- </vgroup>
-
- <vgroup>
- <select id="align">
- <option id="left" _label="Flush left text" arg-set="-alignment left"/>
- <option id="center" _label="Centered text"/>
- <option id="right" _label="Flush right text" arg-set="-alignment right"/>
- </select>
-
- <boolean id="wrap" _label="Wrap long lines" arg-unset="-no-wrap"/>
- <boolean id="texture" _label="Texture-mapped font" arg-unset="-no-textures"/>
- <boolean id="smooth" _label="Anti-aliased lines" arg-unset="-no-smooth"/>
- <hgroup>
- <boolean id="thick" _label="Thick lines" arg-unset="-no-thick"/>
- <boolean id="fade" _label="Fade out" arg-unset="-no-fade"/>
- </hgroup>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <number id="lines" type="spinbutton" arg="-lines %"
- _label="Text lines" low="4" high="1000" default="125"/>
- <number id="size" type="spinbutton" arg="-size %"
- _label="Font point size" low="-1" high="10" default="-1"/>
- <number id="columns" type="spinbutton" arg="-columns %"
- _label="or, Text columns" low="-1" high="200" default="-1"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A stream of text slowly scrolling into the distance at an
-angle, over a star field, like at the beginning of the movie of the
-same name.
-
-https://en.wikipedia.org/wiki/Star_Wars_opening_crawl
-
-Written by Jamie Zawinski and Claudio Matsuoka; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/stonerview.xml b/hacks/config/stonerview.xml
deleted file mode 100644
index 72daad1..0000000
--- a/hacks/config/stonerview.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="stonerview" _label="Stoner View" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=xvDK_wwnXWs"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="trans" _label="Translucent" arg-unset="-no-transparent"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Chains of colorful squares dance around each other in complex spiral
-patterns. Inspired by David Tristram's `electropaint' screen saver,
-originally written for SGI computers in the late 1980s or early 1990s.
-
-Written by Andrew Plotkin; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/strange.xml b/hacks/config/strange.xml
deleted file mode 100644
index fcaeb63..0000000
--- a/hacks/config/strange.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="strange" _label="Strange">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=F1qna7UAxC0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="curve" type="slider" arg="-curve %"
- _label="Curviness" _low-label="Low" _high-label="High"
- low="1" high="50" default="10"/>
-
- <number id="points" type="slider" arg="-points %"
- _label="Number of points" _low-label="1k" _high-label="500k"
- low="1000" high="500000" default="5500"/>
-
- <number id="pointSize" type="slider" arg="-point-size %"
- _label="Point size" _low-label="1" _high-label="8"
- low="1" high="8" default="1"/>
- </vgroup>
- <vgroup>
- <number id="zoom" type="slider" arg="-zoom %"
- _label="Zoom" _low-label="10%" _high-label="400%"
- low="0.1" high="4.0" default="0.9"/>
-
- <number id="brightness" type="slider" arg="-brightness %"
- _label="Brightness" _low-label="10%" _high-label="400%"
- low="0.1" high="4.0" default="1.0"/>
-
- <number id="motionBlur" type="slider" arg="-motion-blur %"
- _label="Motion blur" _low-label="1" _high-label="10"
- low="1.0" high="10.0" default="3.0"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="100"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Strange attractors: a swarm of dots swoops and twists around.
-
-https://en.wikipedia.org/wiki/Attractor#Strange_attractor
-
-Written by Massimino Pascal; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/substrate.xml b/hacks/config/substrate.xml
deleted file mode 100644
index 11e8ccc..0000000
--- a/hacks/config/substrate.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="substrate" _label="Substrate">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=dCCVgBOVD0E"/>
-
- <hgroup>
- <vgroup>
- <number id="speed" type="slider" arg="-growth-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="18000" convert="invert"/>
-
- <number id="maxcyc" type="slider" arg="-max-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="2000" high="25000" default="10000" />
-
- <number id="sandg" type="slider" arg="-sand-grains %"
- _label="Sand grains" _low-label="Few" _high-label="Lots"
- low="16" high="128" default="64" />
-
- <number id="curve" type="slider" arg="-circle-percent %"
- _label="Circle percentage" _low-label="0%" _high-label="100%"
- low="0" high="100" default="33" />
- </vgroup>
- <vgroup>
- <number id="init" type="spinbutton" arg="-initial-cracks %"
- _label="Initial cracks" low="3" high="15" default="3"/>
-
- <boolean id="wire" _label="Wireframe only" arg-set="-wireframe" />
-
- <boolean id="seamless" _label="Seamless mode" arg-set="-seamless" />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Crystalline lines grow on a computational substrate. A simple
-perpendicular growth rule creates intricate city-like structures.
-
-Written by J. Tarbell and Mike Kershaw; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/superquadrics.xml b/hacks/config/superquadrics.xml
deleted file mode 100644
index 642125c..0000000
--- a/hacks/config/superquadrics.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="superquadrics" _label="Superquadrics" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Mjlc7iPA1N4"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="40000"
- convert="invert"/>
-
- <number id="spinspeed" type="slider" arg="-spinspeed %"
- _label="Spin speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="15.0" default="5.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Density" _low-label="Low" _high-label="High"
- low="0" high="100" default="25"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="0" high="100" default="40"/>
-
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Morphing 3D shapes.
-
-Written by Ed Mackey; 1987, 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/surfaces.xml b/hacks/config/surfaces.xml
deleted file mode 100644
index b5508ae..0000000
--- a/hacks/config/surfaces.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="surfaces" _label="Surfaces" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Q412lxz3fTg"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="descent" type="slider" arg="-speed %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="2" high="2000" default="300"
- convert="invert"/>
- </vgroup>
-
- <vgroup>
- <select id="surface">
- <option id="random" _label="Random Surface"/>
- <option id="dini" _label="Dini's Surface" arg-set="-surface dini"/>
- <option id="enneper" _label="Enneper's Surface" arg-set="-surface enneper"/>
- <option id="kuen" _label="Kuen Surface" arg-set="-surface kuen"/>
- <option id="moebius" _label="Möbius Strip" arg-set="-surface moebius"/>
- <option id="seashell" _label="Seashell" arg-set="-surface seashell"/>
- <option id="swallow" _label="Swallowtail" arg-set="-surface swallowtail"/>
- <option id="bohemian" _label="Bohemian Dome" arg-set="-surface bohemian"/>
- <option id="whitney" _label="Whitney Umbrella" arg-set="-surface whitney"/>
- <option id="pluecker" _label="Pluecker's Conoid" arg-set="-surface pluecker"/>
- <option id="henneberg" _label="Henneberg's Surface" arg-set="-surface henneberg"/>
- <option id="catalan" _label="Catalan's Surface" arg-set="-surface catalan"/>
- <option id="corkscrew" _label="Corkscrew Surface" arg-set="-surface corkscrew"/>
- </select>
-
- <select id="mode">
- <option id="random" _label="Random Display Mode"/>
- <option id="points" _label="Points" arg-set="-mode points"/>
- <option id="lines" _label="Lines" arg-set="-mode lines"/>
- <option id="line_loop" _label="Line Loops" arg-set="-mode line-loops"/>
- </select>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-set="-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Parametric surfaces.
-
-http://mathworld.wolfram.com/DinisSurface.html
-https://en.wikipedia.org/wiki/Enneper_surface
-http://mathworld.wolfram.com/EnnepersMinimalSurface.html
-http://mathworld.wolfram.com/KuenSurface.html
-https://en.wikipedia.org/wiki/Moebius_strip
-http://mathworld.wolfram.com/Seashell.html
-http://mathworld.wolfram.com/SwallowtailCatastrophe.html
-http://mathworld.wolfram.com/BohemianDome.html
-https://en.wikipedia.org/wiki/Whitney_umbrella
-http://mathworld.wolfram.com/PlueckersConoid.html
-http://mathworld.wolfram.com/HennebergsMinimalSurface.html
-http://mathworld.wolfram.com/CatalansSurface.html
-http://mathworld.wolfram.com/CorkscrewSurface.html
-
-Written by Andrey Mirtchovski and Carsten Steger; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/swirl.xml b/hacks/config/swirl.xml
deleted file mode 100644
index 199bdb7..0000000
--- a/hacks/config/swirl.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="swirl" _label="Swirl">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=o_VRQxPCB7w"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Count" _low-label="Few" _high-label="Many"
- low="0" high="20" default="5"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="200"/>
-
-<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Flowing, swirly patterns.
-
-Written by M. Dobie and R. Taylor; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/t3d.xml b/hacks/config/t3d.xml
deleted file mode 100644
index d1fd19b..0000000
--- a/hacks/config/t3d.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="t3d" _label="T3D">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=5UohH7U2CAI"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="40000"
- convert="invert"/>
-
- <number id="move" type="slider" arg="-move %"
- _label="Turn side-to-side" _low-label="0 deg" _high-label="90 deg"
- low="0.0" high="3.0" default="0.5"/>
-
- <number id="wobble" type="slider" arg="-wobble %"
- _label="Wobbliness" _low-label="Low" _high-label="High"
- low="0.0" high="3.0" default="2.0"/>
- </vgroup>
-
- <vgroup>
- <number id="cycle" type="slider" arg="-cycle %"
- _label="Cycle seconds" _low-label="Low" _high-label="High"
- low="0.0" high="60.0" default="10.0"/>
-
- <number id="mag" type="slider" arg="-mag %"
- _label="Magnification" _low-label="Smaller" _high-label="Bigger"
- low="0.1" high="4.0" default="1.0"/>
-
- <select id="mins">
- <option id="min2" _label="Minute tick marks" arg-set="-minutes"/>
- <option id="min5" _label="5 minute tick marks"/>
- </select>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <!-- #### -fast [50] -->
- <!-- #### -colcycle [?] -->
- <!-- #### -hsvcycle [0.0] -->
- <!-- #### -rgb [?] -->
- <!-- #### -hsv [?] -->
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Draws a working analog clock composed of floating, throbbing bubbles.
-
-Written by Bernd Paysan; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/tangram.xml b/hacks/config/tangram.xml
deleted file mode 100644
index 11b8f71..0000000
--- a/hacks/config/tangram.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="tangram" _label="Tangram" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=JgJ-OsgCCJ4"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"/>
-
- <number id="viewing_time" type="slider" arg="-viewing_time %"
- _label="Linger" _low-label="Brief" _high-label="Long"
- low="0" high="30" default="5" />
-
- <number id="x_camera_rotate" type="slider" arg="-x_camera_rotate %"
- _label="X rotation" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.2" />
-
- <number id="y_camera_rotate" type="slider" arg="-y_camera_rotate %"
- _label="Y rotation" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0.5" />
-
- <number id="z_camera_rotate" type="slider" arg="-z_camera_rotate %"
- _label="Z rotation" _low-label="Slow" _high-label="Fast"
- low="0.0" high="1.0" default="0" />
-
- <hgroup>
- <boolean id="labels" _label="Draw labels" arg-unset="-no-labels"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Solves tangram puzzles.
-
-https://en.wikipedia.org/wiki/Tangram
-
-Written by Jeremy English; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/tessellimage.xml b/hacks/config/tessellimage.xml
deleted file mode 100644
index f6e1a3c..0000000
--- a/hacks/config/tessellimage.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="tessellimage" _label="Tessellimage">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=JNgybysnYU8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="duration2" type="slider" arg="-duration2 %"
- _label="Speed" _low-label="0.1 second" _high-label="4 seconds"
- low="0.1" high="4.0" default="0.4"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <number id="depth" type="slider" arg="-max-depth %"
- _label="Complexity" _low-label="Shallow" _high-label="Deep"
- low="1000" high="100000" default="30000"/>
- </vgroup>
-
- <vgroup>
-
- <select id="mode">
- <option id="random" _label="Delaunay or voronoi"/>
- <option _label="Delaunay" arg-set="-mode delaunay"/>
- <option _label="Voronoi" arg-set="-mode voronoi"/>
- </select>
-
- <xscreensaver-image />
-
- <boolean id="fill" _label="Fill screen" arg-unset="-no-fill-screen"/>
- <boolean id="outline" _label="Outline triangles" arg-unset="-no-outline"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
- </vgroup>
- </hgroup>
-
- <_description>
-Converts an image to triangles using Delaunay tessellation, or to
-polygons using Voronoi tesselation, and animates the result at
-various depths.
-
-More polygons are allocated to visually complex parts of the image.
-This is accomplished by first computing the first derivative of the
-image: the distance between each pixel and its neighbors (which is
-essentially edge detection or embossing). Then the Delaunay or
-Voronoi control points are chosen by selecting those pixels whose
-distance value is above a certain threshold: those are the pixels that
-have the largest change in color/brightness.
-
-https://en.wikipedia.org/wiki/Delaunay_triangulation
-https://en.wikipedia.org/wiki/Voronoi_diagram
-https://en.wikipedia.org/wiki/Tessellation
-
-Written by Jamie Zawinski; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/testx11.xml b/hacks/config/testx11.xml
deleted file mode 100644
index bbc678b..0000000
--- a/hacks/config/testx11.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<screensaver name="testx11" _label="Test X11">
-
- <command arg="-root"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Test platform for JWXYZ - the X11 compatibility shim for OS X and iOS.
-End users shouldn't normally see this one.
-
-Written by Dave Odell; 2015.
- </_description>
-</screensaver>
diff --git a/hacks/config/thornbird.xml b/hacks/config/thornbird.xml
deleted file mode 100644
index 8bbd1ab..0000000
--- a/hacks/config/thornbird.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="thornbird" _label="Thornbird">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=rfGfPezVnac"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Points" _low-label="Few" _high-label="Many"
- low="10" high="1000" default="100"/>
-
- <number id="cycles" type="slider" arg="-cycles %"
- _label="Thickness" _low-label="Thin" _high-label="Thick"
- low="2" high="1000" default="400"/>
-
-<!--
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="2" high="255" default="64"/>
--->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Displays a view of the "Bird in a Thornbush" fractal.
-
-Written by Tim Auckland; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/timetunnel.xml b/hacks/config/timetunnel.xml
deleted file mode 100644
index f543150..0000000
--- a/hacks/config/timetunnel.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="timetunnel" _label="Time Tunnel" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=GZe5rk_7TnA"/>
-
- <number id="start" type="slider" arg="-start %"
- _label="Start sequence time" _low-label="0 sec" _high-label="30 sec"
- low="0.00" high="27.79" default="0.00"/>
-
- <number id="end" type="slider" arg="-end %"
- _label="End sequence time" _low-label="0 sec" _high-label="30 sec"
- low="0.00" high="27.79" default="27.79"/>
-
- <hgroup>
- <vgroup>
- <boolean id="logo" _label="Draw logo" arg-unset="-no-logo"/>
- <boolean id="reverse" _label="Run backward" arg-set="-reverse"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- <vgroup>
-<!--
- <string id="tardis" _label="Tardis image " arg="-tardis %"/>
- <string id="head" _label="Head image " arg="-head %"/>
- <string id="marquee" _label="Marquee image " arg="-marquee %"/>
- <string id="tun1" _label="Tardis tunnel image " arg="-tun1 %"/>
- <string id="tun2" _label="Middle tunnel image" arg="-tun2 %"/>
- <string id="tun3" _label="Final tunnel image " arg="-tun3 %"/>
--->
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-An animation similar to the title sequence of Dr. Who in the 70s.
-
-Written by Sean P. Brennan; 2005.
- </_description>
-</screensaver>
diff --git a/hacks/config/topblock.xml b/hacks/config/topblock.xml
deleted file mode 100644
index 39dff21..0000000
--- a/hacks/config/topblock.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="topblock" _label="Top Block" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=zj0FHFJgQJ8"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="dropspeed" type="slider" arg="-dropSpeed %"
- _label="Drop speed" _low-label="Slow" _high-label="Fast"
- low="1" high="9" default="4"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Carpet size" _low-label="Small" _high-label="Large"
- low="1" high="10" default="2"/>
-
- <number id="spawn" type="slider" arg="-spawn %"
- _label="Spawn likelyhood" _low-label="Low" _high-label="High"
- low="4" high="1000" default="50"
- convert="invert"/>
-
- </vgroup>
- <vgroup>
- <number id="resolution" type="slider" arg="-resolution %"
- _label="Polygon count" _low-label="Low" _high-label="High"
- low="4" high="20" default="4"/>
-
- <number id="maxColors" type="slider" arg="-maxColors %"
- _label="Colors" _low-label="Few" _high-label="Many"
- low="1" high="32" default="7"/>
-
- <number id="rotatespeed" type="slider" arg="-rotateSpeed %"
- _label="Rotation" _low-label="Slow" _high-label="Fast"
- low="1" high="1000" default="10"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
- <boolean id="follow" _label="Follow" arg-set="-follow"/>
- <boolean id="blob" _label="Blob mode" arg-set="-blob"/>
- <boolean id="override" _label="Tunnel mode" arg-set="-override"/>
- <boolean id="carpet" _label="Carpet" arg-unset="-no-carpet"/>
- </hgroup>
- <hgroup>
- <boolean id="nipples" _label="Nipples" arg-unset="-no-nipples"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Creates a 3D world with dropping blocks that build up and up.
-Written by rednuht; 2006.
- </_description>
-</screensaver>
diff --git a/hacks/config/triangle.xml b/hacks/config/triangle.xml
deleted file mode 100644
index 70d9949..0000000
--- a/hacks/config/triangle.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="triangle" _label="Triangle">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=GXrzjY-Flro"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="128"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Generates random mountain ranges using iterative subdivision of
-triangles.
-
-Written by Tobias Gloth; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/tronbit.xml b/hacks/config/tronbit.xml
deleted file mode 100644
index c7cc3a5..0000000
--- a/hacks/config/tronbit.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="tronbit" _label="Tron Bit" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=dIF4fodt-L8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="10.0" default="1.0"/>
-
- <hgroup>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-The character "Bit" from the film, "Tron".
-
-The "yes" state is a tetrahedron; the "no" state is the second
-stellation of an icosahedron; and the idle state oscillates between
-a small triambic icosahedron and the compound of an icosahedron and
-a dodecahedron.
-
-https://en.wikipedia.org/wiki/List_of_Tron_characters#Bit
-https://en.wikipedia.org/wiki/Uniform_polyhedra
-https://en.wikipedia.org/wiki/Stellation
-
-Written by Jamie Zawinski; 2011.
- </_description>
-</screensaver>
diff --git a/hacks/config/truchet.xml b/hacks/config/truchet.xml
deleted file mode 100644
index c20a3f8..0000000
--- a/hacks/config/truchet.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="truchet" _label="Truchet">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=hoJ23JSsUD8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="1000000" default="400000"
- convert="invert"/>
-
- <!-- #### -min-width [40] -->
- <!-- #### -max-height [150] -->
- <!-- #### -max-width [150] -->
- <!-- #### -min-height [40] -->
- <!-- #### -max-linewidth [25] -->
- <!-- #### -min-linewidth [2] -->
- <!-- #### -no-erase -->
- <!-- #### -erase-count [25] -->
- <!-- #### -not-square -->
- <!-- #### -no-angles -->
- <!-- #### -no-curves -->
- <!-- #### -scroll -->
- <!-- #### -scroll-overlap [400] -->
- <!-- #### -anim-delay [100] -->
- <!-- #### -anim-step-size [3] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Line- and arc-based truchet patterns that tile the screen.
-
-https://en.wikipedia.org/wiki/Tessellation
-
-Written by Adrian Likins; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/twang.xml b/hacks/config/twang.xml
deleted file mode 100644
index 3eefded..0000000
--- a/hacks/config/twang.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="twang" _label="Twang">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=7pxDMSduQoU"/>
-
- <hgroup>
- <vgroup>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <number id="event-chance" type="slider" arg="-event-chance %"
- _label="Randomness" _low-label="Slow" _high-label="Jumpy"
- low="0.0" high="0.1" default="0.01"/>
-
- <number id="friction" type="slider" arg="-friction %"
- _label="Friction" _low-label="Low" _high-label="High"
- low="0.0" high="0.2" default="0.05"/>
-
- </vgroup>
- <vgroup>
-
- <number id="springiness" type="slider" arg="-springiness %"
- _label="Springiness" _low-label="Low" _high-label="High"
- low="0.0" high="1.0" default="0.1"/>
-
- <number id="transference" type="slider" arg="-transference %"
- _label="Transference" _low-label="Low" _high-label="High"
- low="0.0" high="0.1" default="0.025"/>
-
- <number id="tile-size" type="slider" arg="-tile-size %"
- _label="Tile size" _low-label="Small" _high-label="Large"
- low="10" high="512" default="120"/>
-
- <number id="border-width" type="spinbutton" arg="-border-width %"
- _label="Border width" low="0" high="20" default="3"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-Divides the screen into a grid, and plucks them.
-
-Written by Dan Bornstein; 2002.
- </_description>
-</screensaver>
diff --git a/hacks/config/unicrud.xml b/hacks/config/unicrud.xml
deleted file mode 100644
index 327e033..0000000
--- a/hacks/config/unicrud.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="unicrud" _label="Unicrud" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=prEzdYMZ7xA"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Animation speed" _low-label="Slow" _high-label="Fast"
- low="0.05" high="10.0" default="1.0"/>
-
- <hgroup>
- <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
- <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <boolean id="titles" _label="Show titles" arg-unset="-no-titles"/>
- </hgroup>
-
- <select id="block">
- <option _label="Display everything"/>
- <option _label="Display Latin1" arg-set="-block Latin1,Latin_Extended-A,Latin_Extended-B,Spacing_Modifier_Letters"/>
- <option _label="Display simple characters" arg-set="-block Latin1,Latin_Extended-A,Latin_Extended-B,Spacing_Modifier_Letters,Phonetic_Extensions,Latin_Extended_Additional,Greek_Extended,General_Punctuation,Superscripts_and_Subscripts,Currency_Symbols,Letterlike_Symbols,Number_Forms"/>
- <option _label="Display mathematical symbols" arg-set="-block Greek_and_Coptic,Mathematical_Operators,Miscellaneous_Mathematical_Symbols-A,Supplemental_Arrows-A,Supplemental_Arrows-B,Miscellaneous_Mathematical_Symbols-B,Supplemental_Mathematical_Operators,Miscellaneous_Symbols_and_Arrows"/>
- <option _label="Display emoticons" arg-set="-block Currency_Symbols,Miscellaneous_Technical,Box_Drawing,Geometric_Shapes,Miscellaneous_Symbols,Dingbats,Mahjong_Tiles,Domino_Tiles,Playing_Cards,Miscellaneous_Symbols_and_Pictographs,Emoticons,Ornamental_Dingbats,Transport_and_Map_Symbols,Alchemical_Symbols,Geometric_Shapes_Extended,Supplemental_Symbols_and_Pictographs,Egyptian_Hieroglyphs"/>
- <option _label="Display hieroglyphs" arg-set="-block Egyptian_Hieroglyphs"/>
- </select>
-
- <xscreensaver-updater />
-
- <_description>
-Chooses a random Unicode character and displays it full screen,
-along with some information about it.
-
-https://en.wikipedia.org/wiki/Unicode
-
-Written by Jamie Zawinski; 2016.
- </_description>
-</screensaver>
diff --git a/hacks/config/unknownpleasures.xml b/hacks/config/unknownpleasures.xml
deleted file mode 100644
index 956c3f3..0000000
--- a/hacks/config/unknownpleasures.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="unknownpleasures" _label="Unknown Pleasures" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=DEWPiUbwnt0"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="30000"
- convert="invert"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Scanlines" _low-label="Few" _high-label="Many"
- low="3" high="200" default="80"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="20.0" default="1.0"/>
- </vgroup>
-
- <vgroup>
- <number id="resolution" type="slider" arg="-resolution %"
- _label="Resolution" _low-label="Low" _high-label="High"
- low="5" high="300" default="100"/>
-
- <number id="amplitude" type="slider" arg="-amplitude %"
- _label="Amplitude" _low-label="Low" _high-label="High"
- low="0.01" high="0.25" default="0.13"/>
-
- <number id="noise" type="slider" arg="-noise %"
- _label="Noise" _low-label="Low" _high-label="High"
- low="0.0" high="3.0" default="1.0"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <boolean id="ortho" _label="Orthographic Projection" arg-unset="-no-ortho"/>
- <boolean id="buzz" _label="Buzz" arg-set="-buzz"/>
- <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <file id="mask" _label="Mask image" arg="-mask %"/>
-
- <xscreensaver-updater />
-
- <_description>
-PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered:
-a spinning neutron star emitting a periodic lighthouse-like beacon.
-An illustration of the signal received from it was published in
-Scientific American in 1971, and later in The Cambridge Encyclopedia
-of Astronomy in 1977, where it was seen by Stephen Morris, the
-drummer of Joy Division, and was consequently appropriated by
-Peter Saville for the cover of the band's album "Unknown Pleasures".
-
-https://en.wikipedia.org/wiki/Pulsar
-https://en.wikipedia.org/wiki/PSR_B1919%2B21
-https://en.wikipedia.org/wiki/Unknown_Pleasures
-https://en.wikipedia.org/wiki/Peter_Saville_%28graphic_designer%29
-https://en.wikipedia.org/wiki/Joy_Division
-
-Written by Jamie Zawinski; 2013.
- </_description>
-</screensaver>
diff --git a/hacks/config/vermiculate.xml b/hacks/config/vermiculate.xml
deleted file mode 100644
index 7d82ab0..0000000
--- a/hacks/config/vermiculate.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="vermiculate" _label="Vermiculate">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=YSg9KY-qw5o"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="1" high="1000" default="1" />
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Squiggly worm-like paths.
-
-Written by Tyler Pierce; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/vfeedback.xml b/hacks/config/vfeedback.xml
deleted file mode 100644
index 2accd19..0000000
--- a/hacks/config/vfeedback.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="vfeedback" _label="VFeedback">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=I_MkW0CW4QM"/>
-
- <hgroup>
- <vgroup>
- <number id="tvcolor" type="slider" arg="-tv-color %"
- _label="Color Knob" _low-label="Low" _high-label="High"
- low="0" high="400" default="70"/>
- <number id="tvtint" type="slider" arg="-tv-tint %"
- _label="Tint Knob" _low-label="Low" _high-label="High"
- low="0" high="360" default="5"/>
- <number id="noise" type="slider" arg="-noise %"
- _label="Noise" _low-label="Low" _high-label="High"
- low="0.0" high="0.2" default="0.02"/>
- </vgroup>
- <vgroup>
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="1.5"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="500" default="150"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-Simulates video feedback: pointing a video camera at an NTSC television.
-
-Written by Jamie Zawinski; 2018.
- </_description>
-</screensaver>
diff --git a/hacks/config/vidwhacker.xml b/hacks/config/vidwhacker.xml
deleted file mode 100644
index 9884541..0000000
--- a/hacks/config/vidwhacker.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="vidwhacker" _label="Vid Whacker">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Duration" _low-label="2 seconds" _high-label="2 minutes"
- low="2" high="120" default="5"/>
-
- <file id="directory" _label="Image directory" arg="-directory %"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Displays a distorted frame video.
-
-This is a shell script that grabs a frame of video from the system's
-video input, and then uses some PBM filters (chosen at random) to
-manipulate and recombine the video frame in various ways (edge
-detection, subtracting the image from a rotated version of itself,
-etc.) Then it displays that image for a few seconds, and does it
-again. This works really well if you just feed broadcast television
-into it.
-
-Written by Jamie Zawinski; 1998.
- </_description>
-</screensaver>
diff --git a/hacks/config/vigilance.xml b/hacks/config/vigilance.xml
deleted file mode 100644
index ea9962e..0000000
--- a/hacks/config/vigilance.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="vigilance" _label="Vigilance" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=b7y35gr3WZ0"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="8.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of cameras" _low-label="One" _high-label="Lots"
- low="1" high="30" default="5"/>
-
- <xscreensaver-updater />
-
- <_description>
-Security cameras keep careful track of their surroundings.
-You can trust them. Everything is completely under control.
-
-Written by Jamie Zawinski; 2017.
- </_description>
-</screensaver>
diff --git a/hacks/config/vines.xml b/hacks/config/vines.xml
deleted file mode 100644
index 0299d77..0000000
--- a/hacks/config/vines.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="vines" _label="Vines">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=IaVfFCIAUn8"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="250000" default="200000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="64"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Generates a continuous sequence of small, curvy geometric patterns.
-
-Written by Tracy Camp and David Hansen; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/voronoi.xml b/hacks/config/voronoi.xml
deleted file mode 100644
index 9e0ef2e..0000000
--- a/hacks/config/voronoi.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="voronoi" _label="Voronoi" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=hD_8cBvknUM"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Slow" _high-label="Fast"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="points" type="slider" arg="-points %"
- _label="Points" _low-label="Few" _high-label="Many"
- low="1" high="100" default="25"/>
-
- <number id="pointSize" type="slider" arg="-point-size %"
- _label="Point size" _low-label="0" _high-label="50 pixels"
- low="0" high="50" default="9"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- <vgroup>
- <number id="pointSpeed" type="slider" arg="-point-speed %"
- _label="Wander speed" _low-label="Slow" _high-label="Fast"
- low="0.0" high="10.0" default="1.0"/>
-
- <number id="pointDelay" type="slider" arg="-point-delay %"
- _label="Insertion speed" _low-label="Slow" _high-label="Fast"
- low="0.0" high="3.0" default="0.05"
- convert="invert"/>
-
- <number id="zoomSpeed" type="slider" arg="-zoom-speed %"
- _label="Zoom speed" _low-label="Slow" _high-label="Fast"
- low="0.1" high="10.0" default="1.0"/>
-
- <number id="zoomDelay" type="slider" arg="-zoom-delay %"
- _label="Zoom frequency" _low-label="0" _high-label="60 seconds"
- low="0" high="60" default="15"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A Voronoi tessellation. Periodically zooms in and adds new points.
-The existing points also wander around.
-
-There are a set of control points on the plane, each at the center of
-a colored cell. Every pixel within that cell is closer to that cell's
-control point than to any other control point. That is what
-determines the cell's shapes.
-
-https://en.wikipedia.org/wiki/Voronoi_diagram
-https://en.wikipedia.org/wiki/Tessellation
-
-Written by Jamie Zawinski; 2007.
- </_description>
-</screensaver>
diff --git a/hacks/config/wander.xml b/hacks/config/wander.xml
deleted file mode 100644
index ad72fe8..0000000
--- a/hacks/config/wander.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="wander" _label="Wander">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=2ZZC46Z9wJE"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="density" type="slider" arg="-density %"
- _label="Density" _low-label="Low" _high-label="High"
- low="1" high="30" default="2"
- convert="invert"/>
-
- <number id="reset" type="slider" arg="-reset %"
- _label="Duration" _low-label="Short" _high-label="Long"
- low="10000" high="3000000" default="2500000"/>
- </vgroup>
-
- <vgroup>
- <number id="length" type="slider" arg="-length %"
- _label="Length" _low-label="Short" _high-label="Long"
- low="100" high="100000" default="25000"/>
-
- <number id="advance" type="slider" arg="-advance %"
- _label="Color contrast" _low-label="Low" _high-label="High"
- low="1" high="100" default="1"/>
-
- <hgroup>
- <boolean id="circles" _label="Draw spots" arg-set="-circles"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Size" low="0" high="100" default="1"/>
- </hgroup>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A colorful random-walk.
-
-https://en.wikipedia.org/wiki/Random_walk
-
-Written by Rick Campbell; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/webcollage.xml b/hacks/config/webcollage.xml
deleted file mode 100644
index 9c76910..0000000
--- a/hacks/config/webcollage.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="webcollage" _label="Web Collage">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Delay between images" _low-label="None" _high-label="30 secs"
- low="0" high="30" default="2"/>
-
- <number id="timeout" type="slider" arg="-timeout %"
- _label="Network timeout" _low-label="2 secs" _high-label="2 min"
- low="2" high="120" default="30"/>
- </vgroup>
- <vgroup>
- <number id="opacity" type="slider" arg="-opacity %"
- _label="Image opacity" _low-label="Transparent" _high-label="Opaque"
- low="0.1" high="1.0" default="0.85"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- </vgroup>
- </hgroup>
-
-<!--
- <string id="filter" _label="Per-image filter program" arg="-filter %"/>
- <string id="filter2" _label="Overall filter program" arg="-filter2 %"/>
- <file id="dictionary" _label="Dictionary file" arg="-dictionary %"/>
- <file id="dir" _label="Image directory" arg="-directory %"/>
- -->
-
- <xscreensaver-updater />
-
- <_description>
-This is what the Internet looks like.
-
-This creates collages out of random images from the World Wide Web.
-It finds the images by feeding random words into various search
-engines, and pulling images (or sections of images) out of the pages
-returned.
-
-WARNING: THE INTERNET SOMETIMES CONTAINS PORNOGRAPHY.
-
-The Internet being what it is, absolutely anything might show up in the
-collage including -- quite possibly -- pornography, or even nudity.
-Please act accordingly.
-
-See also https://www.jwz.org/webcollage/
-
-Written by Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/whirlwindwarp.xml b/hacks/config/whirlwindwarp.xml
deleted file mode 100644
index c92b6fe..0000000
--- a/hacks/config/whirlwindwarp.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="whirlwindwarp" _label="Whirlwind Warp">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=eWrRhSYzimY"/>
-
- <number id="points" type="slider" arg="-points %"
- _label="Particles" _low-label="Few" _high-label="Many"
- low="10" high="1000" default="400"/>
-
- <number id="tails" type="slider" arg="-tails %"
- _label="Trail size" _low-label="Short" _high-label="Long"
- low="1" high="50" default="8"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Floating stars are acted upon by a mixture of simple 2D
-force fields. The strength of each force field changes
-continuously, and it is also switched on and off at random.
-
-Written by Paul 'Joey' Clark; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/whirlygig.xml b/hacks/config/whirlygig.xml
deleted file mode 100644
index d7842db..0000000
--- a/hacks/config/whirlygig.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="whirlygig" _label="Whirlygig">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=Y2JTY7bssPM"/>
-
- <hgroup>
- <number id="whirlies" type="spinbutton" arg="-whirlies %"
- _label="Whirlies" low="-1" high="50" default="-1"/>
-
- <number id="lines" type="spinbutton" arg="-nlines %"
- _label="Lines" low="-1" high="50" default="-1"/>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="xspeed" type="slider" arg="-xspeed %"
- _label="X speed" _low-label="Low" _high-label="High"
- low="0.0" high="10.0" default="1.0"/>
- <number id="yspeed" type="slider" arg="-yspeed %"
- _label="Y speed" _low-label="Low" _high-label="High"
- low="0.0" high="10.0" default="1.0"/>
- </vgroup>
-
- <vgroup>
- <number id="xamplitude" type="slider" arg="-xamplitude %"
- _label="X amplitude" _low-label="Low" _high-label="High"
- low="0.0" high="10.0" default="1.0"/>
- <number id="yamplitude" type="slider" arg="-yamplitude %"
- _label="Y amplitude" _low-label="Low" _high-label="High"
- low="0.0" high="10.0" default="1.0"/>
- </vgroup>
- </hgroup>
-
-
- <!-- #### -xmode [change] -->
-
- <hgroup>
- <select id="xmode">
- <option id="randomx" _label="X random" />
- <option id="spinx" _label="X spin" arg-set="-xmode spin"/>
- <option id="funkyx" _label="X funky" arg-set="-xmode funky"/>
- <option id="circlex" _label="X circle" arg-set="-xmode circle"/>
- <option id="linearx" _label="X linear" arg-set="-xmode linear"/>
- <option id="testx" _label="X test" arg-set="-xmode test"/>
- <option id="funx" _label="X fun" arg-set="-xmode fun"/>
- <option id="inniex" _label="X innie" arg-set="-xmode innie"/>
- <option id="lissajousx" _label="X lissajous" arg-set="-xmode lissajous"/>
- </select>
-
- <select id="ymode">
- <option id="randomy" _label="Y random" />
- <option id="spiny" _label="Y spin" arg-set="-ymode spin"/>
- <option id="funkyy" _label="Y funky" arg-set="-ymode funky"/>
- <option id="circley" _label="Y circle" arg-set="-ymode circle"/>
- <option id="lineary" _label="Y linear" arg-set="-ymode linear"/>
- <option id="testy" _label="Y test" arg-set="-ymode test"/>
- <option id="funy" _label="Y fun" arg-set="-ymode fun"/>
- <option id="inniey" _label="Y innie" arg-set="-ymode innie"/>
- <option id="lissajousy" _label="Y lissajous" arg-set="-ymode lissajous"/>
- </select>
- </hgroup>
-
- <!-- #### -speed [1] -->
- <!-- #### -color_modifier [-1] -->
- <!-- #### -start_time [-1] -->
- <!-- #### -xoffset [1.0] -->
- <!-- #### -yoffset [1.0] -->
- <!-- #### -offset_period [1] -->
-
- <hgroup>
- <boolean id="trail" _label="Leave a trail" arg-set="-trail"/>
- <boolean id="explain" _label="Explain modes" arg-set="-explain"/>
- <boolean id="wrap" _label="Wrap the screen" arg-set="-wrap"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Zooming chains of sinusoidal spots.
-
-Written by Ashton Trey Belew; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/config/winduprobot.xml b/hacks/config/winduprobot.xml
deleted file mode 100644
index 1312743..0000000
--- a/hacks/config/winduprobot.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="winduprobot" _label="Windup Robot" gl="yes">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=RmpsDx9MuUM"/>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="speed" type="slider" arg="-speed %"
- _label="Robot speed" _low-label="Slow" _high-label="Fast"
- low="0.01" high="8.0" default="1.0"/>
-
- <number id="count" type="slider" arg="-count %"
- _label="Number of robots" _low-label="One" _high-label="Lots"
- low="1" high="100" default="25"/>
-
- <number id="size" type="slider" arg="-size %"
- _label="Robot size" _low-label="Tiny" _high-label="Huge"
- low="0.1" high="10.0" default="1.0"/>
-
- <number id="opacity" type="slider" arg="-opacity %"
- _label="Robot skin transparency" _low-label="Invisible" _high-label="Solid"
- low="0.0" high="1.0" default="1.0"/>
-
- </vgroup>
-
- <vgroup>
- <number id="talk" type="slider" arg="-talk %"
- _label="Word bubbles" _low-label="Never" _high-label="Often"
- low="0.0" high="1.0" default="0.2"/>
-
- <xscreensaver-text />
-
- <hgroup>
- <boolean id="texture" _label="Chrome" arg-unset="-no-texture"/>
- <boolean id="fade" _label="Fade opacity" arg-unset="-no-fade"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </hgroup>
-
- </vgroup>
-
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-A swarm of wind-up toy robots wander around the table-top, bumping
-into each other. Each robot contains a mechanically accurate gear
-system inside, which you can see when the robot's shell occasionally
-fades to transparency. Also, sometimes a cartoony word bubble pops up
-above a robot, full of random text.
-
-Written by Jamie Zawinski; 2014.
- </_description>
-</screensaver>
diff --git a/hacks/config/worm.xml b/hacks/config/worm.xml
deleted file mode 100644
index 9678f29..0000000
--- a/hacks/config/worm.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="worm" _label="Worm">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=-S26J2Ja11g"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="17000"
- convert="invert"/>
-
- <number id="ncolors" type="slider" arg="-ncolors %"
- _label="Number of colors" _low-label="Two" _high-label="Many"
- low="1" high="255" default="150"/>
-
- <number id="count" type="spinbutton" arg="-count %"
- _label="Count" low="-100" high="100" default="-20"/>
-
- <number id="size" type="spinbutton" arg="-size %"
- _label="Size" low="-20" high="20" default="-3"/>
-
- <!-- #### -cycles [10] -->
- <!-- #### -3d -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This screen saver was removed from the XScreenSaver distribution as of
-version 5.08.
-
-Draws multicolored worms that crawl around the screen.
-
-Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik Theiling; 1991.
- </_description>
-</screensaver>
diff --git a/hacks/config/wormhole.xml b/hacks/config/wormhole.xml
deleted file mode 100644
index 387afa1..0000000
--- a/hacks/config/wormhole.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="wormhole" _label="Wormhole">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=jGuJU8JKxlI"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="zspeed" type="slider" arg="-zspeed %"
- _label="Star speed" _low-label="Slow" _high-label="Fast"
- low="1" high="30" default="10"/>
-
- <number id="stars" type="slider" arg="-stars %"
- _label="Stars created" _low-label="Few" _high-label="Lots"
- low="1" high="100" default="20"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Flying through a colored wormhole in space.
-
-Written by Jon Rafkind; 2004.
- </_description>
-</screensaver>
diff --git a/hacks/config/xanalogtv.xml b/hacks/config/xanalogtv.xml
deleted file mode 100644
index 5064ca1..0000000
--- a/hacks/config/xanalogtv.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xanalogtv" _label="XAnalogTV">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=VmM1KkFsry0"/>
-
- <hgroup>
- <vgroup>
- <xscreensaver-image />
- </vgroup>
- <vgroup>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- <boolean id="colorbars" _label="Colorbars only" arg-set="-colorbars-only"/>
- </vgroup>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="tvcolor" type="slider" arg="-tv-color %"
- _label="Color Knob" _low-label="Low" _high-label="High"
- low="0" high="400" default="70"/>
- <number id="tvtint" type="slider" arg="-tv-tint %"
- _label="Tint Knob" _low-label="Low" _high-label="High"
- low="0" high="360" default="5"/>
- </vgroup>
- <vgroup>
- <number id="tvbrightness" type="slider" arg="-tv-brightness %"
- _label="Brightness Knob" _low-label="Low" _high-label="High"
- low="-75.0" high="100.0" default="3.0"/>
- <number id="tvcontrast" type="slider" arg="-tv-contrast %"
- _label="Contrast Knob" _low-label="Low" _high-label="High"
- low="0" high="1500" default="1000"/>
- </vgroup>
- </hgroup>
-
- <xscreensaver-updater />
-
- <_description>
-An old TV set, including artifacts like snow, bloom, distortion,
-ghosting, and hash noise. It also simulates the TV warming up. It
-will cycle through 12 channels, some with images you give it, and some
-with color bars or nothing but static.
-
-Written by Trevor Blackwell; 2003.
- </_description>
-</screensaver>
diff --git a/hacks/config/xflame.xml b/hacks/config/xflame.xml
deleted file mode 100644
index 783dcab..0000000
--- a/hacks/config/xflame.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xflame" _label="XFlame">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=jUJiULU4i0k"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
-<!-- <file id="bitmap" _label="Bitmap file" arg="-bitmap %"/> -->
-
- <!-- #### -baseline [20] -->
- <!-- #### -hspread [30] -->
- <!-- #### -vspread [97] -->
- <!-- #### -residual [99] -->
- <!-- #### -variance [50] -->
- <!-- #### -vartrend [20] -->
-
- <boolean id="bloom" _label="Enable blooming" arg-unset="-no-bloom"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Pulsing fire. It can also take an arbitrary image and set it on fire too.
-
-Written by Carsten Haitzler and many others; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/xjack.xml b/hacks/config/xjack.xml
deleted file mode 100644
index 542d19f..0000000
--- a/hacks/config/xjack.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xjack" _label="XJack">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=wSOiSrEbxu4"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Speed" _low-label="Slow" _high-label="Fast"
- low="0" high="200000" default="50000"
- convert="invert"/>
-
- <!-- #### -font [] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-This behaves schizophrenically and makes a lot of typos.
-
-Written by Jamie Zawinski; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/xlyap.xml b/hacks/config/xlyap.xml
deleted file mode 100644
index 1d2e176..0000000
--- a/hacks/config/xlyap.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xlyap" _label="XLyap">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=5MrEaXnhEPg"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="linger" type="slider" arg="-linger %"
- _label="Linger" _low-label="Brief" _high-label="Long"
- low="0" high="10" default="5" />
-
- <!-- #### -builtin [-1] -->
- <!-- #### -C [1] -->
- <!-- #### -D [50] -->
- <!-- #### -L -->
- <!-- #### -M [1.0] -->
- <!-- #### -O [0] -->
- <!-- #### -R [] -->
- <!-- #### -S [50] -->
- <!-- #### -a [2.0] -->
- <!-- #### -b [2.0] -->
- <!-- #### -c [7] -->
- <!-- #### -F [10101010] -->
- <!-- #### -f [abbabaab] -->
- <!-- #### -h [] -->
- <!-- #### -i [0.65] -->
- <!-- #### -m [] -->
- <!-- #### -o [] -->
- <!-- #### -p -->
- <!-- #### -r [65000] -->
- <!-- #### -s [256] -->
- <!-- #### -v -->
- <!-- #### -w [] -->
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-The Lyapunov exponent makes pretty fractal pictures.
-
-https://en.wikipedia.org/wiki/Lyapunov_exponent
-
-Written by Ron Record; 1997.
- </_description>
-</screensaver>
diff --git a/hacks/config/xmatrix.xml b/hacks/config/xmatrix.xml
deleted file mode 100644
index b1afe9c..0000000
--- a/hacks/config/xmatrix.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xmatrix" _label="XMatrix">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=dSJQHm-YoWc"/>
-
- <hgroup>
- <select id="size">
- <option id="font1" _label="Small font" arg-set="-small"/>
- <option id="font2" _label="Large font"/>
- </select>
-
- <select id="mode">
- <option id="matrix" _label="Matrix encoding"/>
- <option id="binary" _label="Binary encoding" arg-set="-mode binary"/>
- <option id="hex" _label="Hexadecimal encoding" arg-set="-mode hex"/>
- <option id="dna" _label="Genetic encoding" arg-set="-mode dna"/>
- <option id="pipe" _label="Piped ASCII text" arg-set="-mode pipe"/>
- </select>
-
- <select id="fill">
- <option id="both" _label="Synergistic algorithm"/>
- <option id="top" _label="Slider algorithm" arg-set="-insert top"/>
- <option id="bottom" _label="Expansion algorithm" arg-set="-insert bottom"/>
- </select>
- </hgroup>
-
- <hgroup>
- <boolean id="trace" _label="Run trace program" arg-unset="-no-trace"/>
- <boolean id="knock" _label="Knock knock" arg-unset="-no-knock-knock"/>
- <string id="phone" _label="Phone number" arg="-phone %"/>
- </hgroup>
-
- <hgroup>
- <vgroup>
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="density" type="slider" arg="-density %"
- _label="Density" _low-label="Sparse" _high-label="Full"
- low="1" high="100" default="75"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- </vgroup>
- <vgroup>
- <xscreensaver-text />
- </vgroup>
- </hgroup>
-
- <_description>
-The "digital rain" effect, as seen on the computer monitors in
-"The Matrix".
-
-See also "GLMatrix" for a 3D rendering of the similar effect that
-appeared in the movie's title sequence.
-
-https://en.wikipedia.org/wiki/Matrix_digital_rain
-
-Written by Jamie Zawinski; 1999.
- </_description>
-</screensaver>
diff --git a/hacks/config/xrayswarm.xml b/hacks/config/xrayswarm.xml
deleted file mode 100644
index 5aaf815..0000000
--- a/hacks/config/xrayswarm.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xrayswarm" _label="XRaySwarm">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=e_E-k37b4Vc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Worm-like swarms of particles with vapor trails.
-
-Written by Chris Leger; 2000.
- </_description>
-</screensaver>
diff --git a/hacks/config/xspirograph.xml b/hacks/config/xspirograph.xml
deleted file mode 100644
index 6be28f0..0000000
--- a/hacks/config/xspirograph.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="xspirograph" _label="XSpirograph">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=XWCeQqzNavY"/>
-
- <number id="delay" type="slider" arg="-subdelay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="20000"
- convert="invert"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Linger" _low-label="1 second" _high-label="1 minute"
- low="1" high="60" default="5"/>
-
- <number id="layers" type="spinbutton" arg="-layers %"
- _label="Layers" low="1" high="10" default="2"/>
-
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
-
- <xscreensaver-updater />
-
- <_description>
-Simulates that pen-in-nested-plastic-gears toy from your childhood.
-
-https://en.wikipedia.org/wiki/Spirograph
-
-Written by Rohit Singh; 2000.
- </_description>
-</screensaver>
diff --git a/hacks/config/xss.dtd b/hacks/config/xss.dtd
deleted file mode 100644
index 212d53d..0000000
--- a/hacks/config/xss.dtd
+++ /dev/null
@@ -1,109 +0,0 @@
-<!-- xscreensaver, Copyright (c) 2001-2012 Jamie Zawinski <jwz@jwz.org> -->
-<!--
- Permission to use, copy, modify, distribute, and sell this software and its
- documentation for any purpose is hereby granted without fee, provided that
- the above copyright notice appear in all copies and that both that
- copyright notice and this permission notice appear in supporting
- documentation. No representations are made about the suitability of this
- software for any purpose. It is provided "as is" without express or
- implied warranty.
--->
-<!--
-This DTD validates the format of the XScreenSaver configuration files.
-
-The DTD will not be devloped further, as the .XSD style validation
-can already check more of the details of the config files.
-
-DTD written by Andrew Thompson <andrewthommo@gmail.com>
--->
-<!-- XScreenSaver settings config file. - DTD version 1.0 -->
-<!ELEMENT screensaver
- ((command|fullcommand)*,
- (boolean|number|select|string|file|hgroup|vgroup|xscreensaver-text|xscreensaver-image)*,
- _description)>
-<!ATTLIST screensaver
- name CDATA #REQUIRED
- _label CDATA #REQUIRED
- gl CDATA #IMPLIED
- >
-
-<!-- Every XScreenSaver hack has exactly one of either command or fullcommand -->
-<!ELEMENT command EMPTY>
-<!ATTLIST command
- arg CDATA #IMPLIED
- >
-
-<!-- Checkbox -->
-<!-- One of either arg-set or arg-unset is required -->
-<!ELEMENT boolean EMPTY>
-<!ATTLIST boolean
- id ID #IMPLIED
- _label CDATA #REQUIRED
- arg-set CDATA #IMPLIED
- arg-unset CDATA #IMPLIED
- >
-
-<!-- Slider and Spin Button -->
-<!-- _low/high-label not required for type spinbutton -->
-<!-- arg must end with ' %' -->
-<!ELEMENT number EMPTY>
-<!ATTLIST number
- id ID #IMPLIED
- type (slider|spinbutton) #REQUIRED
- _label CDATA #REQUIRED
- _low-label CDATA #IMPLIED
- _high-label CDATA #IMPLIED
- arg CDATA #REQUIRED
- low CDATA #REQUIRED
- high CDATA #REQUIRED
- default CDATA #REQUIRED
- convert (invert) #IMPLIED
- >
-
-<!-- Drop-down list -->
-<!ELEMENT select (option+)>
-<!ATTLIST select
- id ID #IMPLIED
- >
-
-<!-- List item -->
-<!ELEMENT option EMPTY>
-<!ATTLIST option
- id ID #IMPLIED
- _label CDATA #REQUIRED
- arg-set CDATA #IMPLIED
- >
-
-<!-- String or Textual input -->
-<!-- arg must end with ' %' -->
-<!ELEMENT string EMPTY>
-<!ATTLIST string
- id ID #IMPLIED
- _label CDATA #REQUIRED
- arg CDATA #REQUIRED
- >
-
-<!-- File browser. -->
-<!-- arg must end with ' %' -->
-<!ELEMENT file EMPTY>
-<!ATTLIST file
- id ID #IMPLIED
- _label CDATA #REQUIRED
- arg CDATA #REQUIRED
- >
-
-<!ELEMENT xscreensaver-text EMPTY>
-<!ELEMENT xscreensaver-image EMPTY>
-
-<!-- Free Text. The description of the Screen Saver. -->
-<!ELEMENT _description (#PCDATA)>
-
-<!-- Horizontal grouping element, a row of widgets.
-Unimplemented in SaverBeans as of API 0.2. -->
-<!ELEMENT hgroup ((boolean|number|select|string|file|vgroup)*)> <!-- Undocumented -->
-
-<!-- Vertical grouping element, a column of widgets.
-Since the widgets are normally arranged in a column,
-this is only of use within an hgroup.
-Unimplemented in SaverBeans as of API 0.2. -->
-<!ELEMENT vgroup ((boolean|number|select|string|file|hgroup)*)> <!-- Undocumented --> \ No newline at end of file
diff --git a/hacks/config/xss.xsd b/hacks/config/xss.xsd
deleted file mode 100644
index fac1fe3..0000000
--- a/hacks/config/xss.xsd
+++ /dev/null
@@ -1,375 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- xscreensaver, Copyright (c) 2001-2005 Jamie Zawinski <jwz@jwz.org> -->
-<!--
- Permission to use, copy, modify, distribute, and sell this software and its
- documentation for any purpose is hereby granted without fee, provided that
- the above copyright notice appear in all copies and that both that
- copyright notice and this permission notice appear in supporting
- documentation. No representations are made about the suitability of this
- software for any purpose. It is provided "as is" without express or
- implied warranty.
--->
-<!-- XScreenSaver schema version 0.5
-
-This schema validates the format of the XScreenSaver configuration files.
-
-The notices shown above, appear at the top of the source of 'demo-Gtk-conf.c'.
-Since this schema (attempts to) describe the format of the existing
-XScreenSaver configuration files, it seems appropriate to reproduce them here.
-If it is not appropriate, please ignore/remove them rather than sue me.
-
-To check a savername.xml, reference this XSD from the file and validate it at
- http://www.w3.org/2001/03/webdata/xsv
-
-** Background
-Andrew Thompson defined a DTD based on his understanding of the
-XScreenSaver configuration files after examining the files..
-xscreensaver-4.22
- |- hacks
- | |- config
- | README
- | *.xml
- |- driver
- demo-Gtk-conf.c
-
-Paul Dennis generated an XSD file (xscreensaver.xsd) from the DTD.
-This is a stricter version of that XSD, with more comments and
-documentation by Andrew Thompson.
-
-Note that Andrew does not program in c, and has not had the
-opportunity to see XScreenSaver in action (he runs Windows),
-so some of the details of the schema may be incorrect. It aims
-to be cautious, and thus might be more strict than is actually
-required.
-
-** .XSD started as version 0.1
-- generated from the DTD.
-- checked parameter types
- - mostly as xs:string, except for..
- - ID's - checked as xs:ID.
-- provided grouping parse logic, but specified elements
- with maxOccurs 'unbounded'
-
-** Tightened parsing in 0.2
-- The only field still defined as xs:string is the _description.
-- A substitutionArgumentType has been introduced to lock the form of
- the arg to '-lettersandnumbers %'
-- An argumentType has been introduced to ensure other
- arg/arg-set/arg-unset attributes begin with '-' and
- are followed by at least one letter or number.
-- Float and integer numeric values (low/high/default) are checked as xs:decimal
-- Remaining attributes were tightened from xs:string to xs:token.
-
-** Tightened parsing in 0.3
- * Note that no maximums at all are stated in the XScreenSaver README!
-- maxOccurs lowered from 'unbounded' to
- - screensaver: '200' components/groups
- - screensaver: '40' commands/fullcommands
- - select: '100' options
- - hgroup: '6' components/groups per row
- - vgroup: '40' components/groups per column
-- maxLength of _description set to '2000' chars.
-
-** Changes in version 0.4 - Strict
- After testing against the configuration files of the XScreenSaver
- hacks, the following changes were made..
-- Added (+ _ / $) to allowable characters for substitutionArgumentType
- & argumentType, but tightened baseType to xs:token
-- maxOccurs changed to
- - screensaver: '200' -> '30' components/groups
- (xmountains.xml has 24)
- - screensaver: '40' -> '10' commands/fullcommands
- - select: '100' -> '200' options
- (to account for polyhedra.xml, which has 152 options!)
- - hgroup: '6' -> '4' components/groups per row
- (glplanet.xml has 4)
- - vgroup: '40' -> '10' components/groups per column
- (bsod.xml has 9)
-- maxLength of _description changed from '2000' to '3000' chars,
- (covers the largest _description, 'jigglypuff.xml', at 852 chars,
- 'magicrainbow.xml', at 2837 chars.)
-- introduced idType to facilitate maintenance between the
- strict and loose schemas.
-
-** Changes in version 0.4 - Loose
-- made _label of number element optional (when using sliders, some
- developers put what would normally appear in the _label, as a
- prefix to _low-label instead)
-- widens the idType base type from xs:ID to xs:token. Since the ID is
- unimplemented and will most likely remain so, it makes little
- sense to ensure they are unique & valid ID's.
-
-** Changes in 0.5 - Strict
-- Minor typos. to 0.4 docs fixed.
-- Since both the XScreenSaver code and Saverbeans SettingsDialog
-seem tolerant to the _label of the number element missing, it is
-marked as 'optional' now, even in the strict version.
-
-** Limits: This version
-- specifies the 'arg-set'/'arg-unset' of 'boolean' as optional, whereas it
- requires exactly one of either 'arg-set' or 'arg-unset'.
-- cannot properly distinguish between the 'slider' and 'spinbutton' types
- of the 'number' element. As a result of that, '_low-label'/'_high-label'
- are specified as not required, whereas they are actually undefined for
- 'spinbutton' and required for 'slider'.
-- has no checks to ensure that 'default' values of ranges in the
- number element fall between 'low' & 'high' values.
-- Selects can have no more than one option missing an arg-set attribute.
-- Arguments must be unique, but this schema does not check that.
-- _label is effectively optional for the slider type of the number element,
- since this info can be preprended to the _low-label, but no checks are
- done to ensure that the spinbutton type has the _label.
-
-** Undocumented.
-'undocumented' means that the element/feature was not mentioned in the
-official documentation of the format available in the -
-xscreensaver-4.22/hacks/config/README.
--->
-<xs:schema
- xmlns:xs="http://www.w3.org/2001/XMLSchema"
- elementFormDefault="qualified">
-
- <!-- The root element of any XScreenSaver configuration file. -->
- <xs:element name="screensaver">
- <xs:complexType>
- <xs:sequence>
- <!-- Every XScreenSaver hack has exactly one of either
- command or fullcommand, but my understanding is that
- demo-Gtk-conf.c chains them together.
- This specifies a maximum numner of commands. -->
- <xs:choice minOccurs="0" maxOccurs="10">
- <xs:element ref="command"/>
- <xs:element ref="fullcommand"/>
- </xs:choice>
- <!-- A maximum number of components/groups is specified. -->
- <xs:choice minOccurs="0" maxOccurs="30">
- <xs:element ref="boolean"/>
- <xs:element ref="number"/>
- <xs:element ref="select"/>
- <xs:element ref="string"/>
- <xs:element ref="file"/>
- <xs:element ref="hgroup"/>
- <xs:element ref="vgroup"/>
- </xs:choice>
- <xs:element ref="_description"/>
- </xs:sequence>
- <xs:attribute name="name" type="xs:token" use="required"/>
- <xs:attribute name="_label" type="xs:token" use="required"/>
- </xs:complexType>
- </xs:element>
-
- <!-- Added to the command line when invoked. -->
- <xs:element name="command">
- <xs:complexType>
- <xs:attribute name="arg" type="argumentType"/>
- </xs:complexType>
- </xs:element>
-
- <!-- Unimplemented in SaverBeans as of API 0.2.
- Used only by cosmos.xml. Undocumented. -->
- <xs:element name="fullcommand">
- <xs:complexType>
- <xs:attribute name="arg" type="argumentType"/>
- </xs:complexType>
- </xs:element>
-
- <!-- Checkbox -->
- <xs:element name="boolean">
- <xs:complexType>
- <xs:attribute name="id" type="idType"/>
- <xs:attribute name="_label" type="xs:token" use="required"/>
- <!-- Exactly one of either arg-set or arg-unset is required -->
- <xs:attribute name="arg-set" type="argumentType"/>
- <xs:attribute name="arg-unset" type="argumentType"/>
- </xs:complexType>
- </xs:element>
-
- <!-- Slider and Spinbutton -->
- <xs:element name="number">
- <xs:complexType>
- <xs:attribute name="id" type="idType"/>
- <xs:attribute name="type" use="required">
- <xs:simpleType>
- <xs:restriction base="xs:NMTOKEN">
- <xs:enumeration value="slider"/>
- <xs:enumeration value="spinbutton"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:attribute>
- <!-- Listed as 'required' in the documentation, though XScreenSaver is
- tolerant to it being left out. A number of hacks deliberately exclude it
- for formatting purposes, and put the _label as prefix to _low-label -->
- <xs:attribute name="_label" type="xs:token" />
- <!-- _low/_high-label not defined for type spinbutton,
- but required for slider -->
- <xs:attribute name="_low-label" type="xs:token"/>
- <xs:attribute name="_high-label" type="xs:token"/>
- <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
- <xs:attribute name="low" type="xs:decimal" use="required"/>
- <xs:attribute name="high" type="xs:decimal" use="required"/>
- <!-- Must logically fall between low and high, but not checked. -->
- <xs:attribute name="default" type="xs:decimal" use="required"/>
- <xs:attribute name="convert">
- <xs:simpleType>
- <xs:restriction base="xs:NMTOKEN">
- <xs:enumeration value="invert"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:attribute>
- </xs:complexType>
- </xs:element>
-
- <!-- Drop-down list -->
- <xs:element name="select">
- <xs:complexType>
- <xs:sequence>
- <!-- A maximum number of options is specified, as a longer
- drop down becomes kludgy and difficult to use. -->
- <xs:element ref="option" maxOccurs="200"/>
- </xs:sequence>
- <xs:attribute name="id" type="idType"/>
- </xs:complexType>
- </xs:element>
-
- <!-- List item -->
- <xs:element name="option">
- <xs:complexType>
- <xs:attribute name="id" type="idType"/>
- <xs:attribute name="_label" type="xs:token" use="required"/>
- <xs:attribute name="arg-set" type="argumentType"/>
- </xs:complexType>
- </xs:element>
-
- <!-- String or textual input -->
- <xs:element name="string">
- <xs:complexType>
- <xs:attribute name="id" type="idType"/>
- <xs:attribute name="_label" type="xs:token" use="required"/>
- <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
- </xs:complexType>
- </xs:element>
-
- <!-- File browser. -->
- <xs:element name="file">
- <xs:complexType>
- <xs:attribute name="id" type="idType"/>
- <xs:attribute name="_label" type="xs:token" use="required"/>
- <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
- </xs:complexType>
- </xs:element>
-
- <!-- Free Text. The description of the Screen Saver. -->
- <xs:element name="_description">
- <!-- The _description must contain text only, with no HTML formatting.
-
- Character entities are also valid, which suggests that..
- http://www.w3.org/TR/REC-html40/sgml/entities.html
- ..are valid entities, though this, ..
- http://www.w3.org/TR/1998/REC-html40-19980424/sgml/entities.html#h-24.4.1
- ..may represent a safer sub-set.
-
- The main entities you might require (none of which are allowed
- in textual content in an XML file) are..
- &lt; (= <)
- &gt; (= >)
- &amp; (= &)
-
- XScreenSaver itself will probably* turn any URL enclosed in
- &lt; / &gt; into a clickable link.
-
- Conversion to an URL is unimplemented in SaverBeans as of API 0.2.
-
- It might be possible to implement this in SaverBeans with the help of
- BrowserLauncher, though that would require about 20Kb (AFAIR) of extra
- classes in the core API distributable.
-
- * This is based solely on the use of the delimiters in many of the
- XScreenSaver hacks, but has not been investigated in any depth.
- -->
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:maxLength value="3000"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <!-- Horizontal grouping element, a row of components or groups.
- Unimplemented in SaverBeans as of API 0.2,
- components inside groups do not appear. -->
- <xs:element name="hgroup">
- <xs:complexType>
- <!-- A maximum number of components/groups per row is specified. -->
- <xs:choice minOccurs="0" maxOccurs="4">
- <xs:element ref="boolean"/>
- <xs:element ref="number"/>
- <xs:element ref="select"/>
- <xs:element ref="string"/>
- <xs:element ref="file"/>
- <xs:element ref="vgroup"/>
- </xs:choice>
- </xs:complexType>
- </xs:element>
-
- <!-- Vertical grouping element, a column of components or groups.
- Since the components are normally arranged in a column,
- this is only of use within an hgroup.
- Unimplemented in SaverBeans as of API 0.2,
- components inside groups do not appear. -->
- <xs:element name="vgroup">
- <xs:complexType>
- <!-- A maximum number of components/groups per column is specified. -->
- <xs:choice minOccurs="0" maxOccurs="10">
- <xs:element ref="boolean"/>
- <xs:element ref="number"/>
- <xs:element ref="select"/>
- <xs:element ref="string"/>
- <xs:element ref="file"/>
- <xs:element ref="hgroup"/>
- </xs:choice>
- </xs:complexType>
- </xs:element>
-
- <!-- Checks that the command arguments (non substitution arg, as
- well as arg-set/arg-unset) are of a logical (and restricted) form.
- This determines that the type must start with '-', and contain at
- least one letter, number or the other characters shown in the RegEx.
- It is stricter than the XScreenSaver documentation suggests. -->
- <xs:simpleType name="argumentType">
- <xs:restriction base="xs:token">
- <xs:minLength value="2"/>
- <xs:pattern value="-([a-zA-Z0-9 .,;:+_$#%?/\\\-])*"/>
- </xs:restriction>
- </xs:simpleType>
-
- <!-- Checks that the command arguments that use substitution are of
- a logical (and quite restricted) form. This determines that the
- type must start with '-', contain at least one letter, number
- or the other characters shown in the RegEx.
- It is stricter than the XScreenSaver documentation suggests. -->
- <xs:simpleType name="substitutionArgumentType">
- <xs:restriction base="xs:token">
- <xs:minLength value="4"/>
- <xs:pattern value="-([a-zA-Z0-9.,;:+_$#%?/\\\-])* %"/>
- </xs:restriction>
- </xs:simpleType>
-
- <!-- idType is used to validate the ID's
- Many ID's do not parse as type xs:ID, so this type was created to
- allow easy maintenance between the strict and loose versions of the schema.
- The base type should be
- - xs:ID in the strict schema, and
- - xs:token in the loose schema.
- Note that the base type of xs:ID overrides the minLength value of '0'
- -->
- <xs:simpleType name="idType">
- <!-- strict -->
- <xs:restriction base="xs:ID">
- <!-- loose -->
- <!--
- <xs:restriction base="xs:token">
- -->
- <xs:minLength value="0"/>
- </xs:restriction>
- </xs:simpleType>
-
-</xs:schema>
diff --git a/hacks/config/zoom.xml b/hacks/config/zoom.xml
deleted file mode 100644
index c538bb8..0000000
--- a/hacks/config/zoom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<screensaver name="zoom" _label="Zoom">
-
- <command arg="-root"/>
-
- <video href="https://www.youtube.com/watch?v=LeQa9inGEKc"/>
-
- <number id="delay" type="slider" arg="-delay %"
- _label="Frame rate" _low-label="Low" _high-label="High"
- low="0" high="100000" default="10000"
- convert="invert"/>
-
- <number id="duration" type="slider" arg="-duration %"
- _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
- low="10" high="600" default="120"/>
-
- <hgroup>
- <vgroup>
- <number id="pixwidth" type="spinbutton" arg="-pixwidth %"
- _label="X mag" low="2" high="100" default="40" />
- <number id="pixspacex" type="spinbutton" arg="-pixspacex %"
- _label=" X border" low="0" high="10" default="2" />
- <number id="lensoffsetx" type="spinbutton" arg="-lensoffsetx %"
- _label=" X lens" low="1" high="100" default="5" />
- </vgroup>
- <vgroup>
- <number id="pixheight" type="spinbutton" arg="-pixheight %"
- _label="Y mag" low="2" high="100" default="40" />
- <number id="pixspacey" type="spinbutton" arg="-pixspacey %"
- _label=" Y border" low="0" high="10" default="2" />
- <number id="lensoffsety" type="spinbutton" arg="-lensoffsety %"
- _label=" Y lens" low="1" high="100" default="5" />
- </vgroup>
-
- <vgroup>
- <boolean id="lenses" _label="Lenses" arg-unset="-no-lenses"/>
- <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
- </vgroup>
-
- </hgroup>
-
- <xscreensaver-image />
-
- <xscreensaver-updater />
-
- <_description>
-Fatbits! Zooms in on a part of the screen and then moves around.
-With the "Lenses" option, the result is like looking through many
-overlapping lenses rather than just a simple zoom.
-
-Written by James Macnicol; 2001.
- </_description>
-</screensaver>
diff --git a/hacks/coral.c b/hacks/coral.c
deleted file mode 100644
index f82f9ed..0000000
--- a/hacks/coral.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/* coral, by "Frederick G.M. Roeber" <roeber@netscape.com>, 15-jul-97.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhack.h"
-#include "colors.h"
-#include "erase.h"
-
-#define NCOLORSMAX 200
-
-struct state {
- Display *dpy;
- Window window;
-
- GC draw_gc, erase_gc;
- unsigned int default_fg_pixel;
- XColor colors[NCOLORSMAX];
- int ncolors;
- int colorindex;
- int colorsloth;
-
- XPoint *walkers;
- int nwalkers;
- int width, widthb;
- int height;
- int delay, delay2;
- int max_points;
- XPoint *pointbuf;
-
- unsigned int *board;
-
- int done, reset;
- int npoints;
- eraser_state *eraser;
-};
-
-
-#define getdot(x,y) (st->board[(y*st->widthb)+(x>>5)] & (1<<(x & 31)))
-#define setdot(x,y) (st->board[(y*st->widthb)+(x>>5)] |= (1<<(x & 31)))
-
-
-static void
-init_coral(struct state *st)
-{
- XGCValues gcv;
- Colormap cmap;
- XWindowAttributes xgwa;
- Bool writeable = False;
- int seeds;
- int density;
- int i;
-
- XClearWindow(st->dpy, st->window);
- XGetWindowAttributes(st->dpy, st->window, &xgwa);
- st->width = xgwa.width;
- st->widthb = ((xgwa.width + 31) >> 5);
- st->height = xgwa.height;
- if (st->board) free(st->board);
- st->board = (unsigned int *)calloc(st->widthb * xgwa.height, sizeof(unsigned int));
- if(!st->board) exit(1);
- cmap = xgwa.colormap;
- if( st->ncolors ) {
- free_colors(xgwa.screen, cmap, st->colors, st->ncolors);
- st->ncolors = 0;
- }
- gcv.foreground = st->default_fg_pixel = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
- if (st->draw_gc) XFreeGC (st->dpy, st->draw_gc);
- st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
- gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
- if (st->erase_gc) XFreeGC (st->dpy, st->erase_gc);
- st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
- st->ncolors = NCOLORSMAX;
- make_uniform_colormap(xgwa.screen, xgwa.visual, cmap,
- st->colors, &st->ncolors, True, &writeable, False);
- if (st->ncolors <= 0) {
- st->ncolors = 2;
- st->colors[0].red = st->colors[0].green = st->colors[0].blue = 0;
- st->colors[1].red = st->colors[1].green = st->colors[1].blue = 0xFFFF;
- XAllocColor(st->dpy, cmap, &st->colors[0]);
- XAllocColor(st->dpy, cmap, &st->colors[1]);
- }
- st->colorindex = random()%st->ncolors;
-
- density = get_integer_resource(st->dpy, "density", "Integer");
- if( density < 1 ) density = 1;
- if( density > 100 ) density = 90; /* more like mold than coral */
- st->nwalkers = (st->width*st->height*density)/100;
- if (st->walkers) free(st->walkers);
- st->walkers = (XPoint *)calloc(st->nwalkers, sizeof(XPoint));
- if( (XPoint *)0 == st->walkers ) exit(1);
-
- seeds = get_integer_resource(st->dpy, "seeds", "Integer");
- if( seeds < 1 ) seeds = 1;
- if( seeds > 1000 ) seeds = 1000;
-
- st->colorsloth = st->nwalkers*2/st->ncolors;
- XSetForeground(st->dpy, st->draw_gc, st->colors[st->colorindex].pixel);
-
- if ((st->width <= 2) || (st->height <= 2)) return;
-
- for( i = 0; i < seeds; i++ ) {
- int x, y;
- int max_repeat = 10;
- do {
- x = 1 + random() % (st->width - 2);
- y = 1 + random() % (st->height - 2);
- } while( getdot(x, y) && max_repeat--);
-
- setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
- setdot((x-1), y ); setdot(x, y ); setdot((x+1), y );
- setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
- XDrawPoint(st->dpy, st->window, st->draw_gc, x, y);
- }
-
- for( i = 0; i < st->nwalkers; i++ ) {
- st->walkers[i].x = (random() % (st->width-2)) + 1;
- st->walkers[i].y = (random() % (st->height-2)) + 1;
- }
-}
-
-
-/* returns 2 bits of randomness (conserving calls to random()).
- This speeds things up a little, but not a lot (5-10% or so.)
- */
-static int
-rand_2(void)
-{
- static int i = 0;
- static int r = 0;
- if (i != 0) {
- i--;
- } else {
- i = 15;
- r = random();
- }
-
- {
- register int j = (r & 3);
- r = r >> 2;
- return j;
- }
-}
-
-
-static int
-coral(struct state *st)
-{
- int i = 0;
-
- for( i = 0; i < st->nwalkers; i++ ) {
- int x = st->walkers[i].x;
- int y = st->walkers[i].y;
-
- if( getdot(x, y) ) {
-
- Bool flush = False;
- Bool color = False;
-
- /* XDrawPoint(dpy, window, draw_gc, x, y); */
- st->pointbuf[st->npoints].x = x;
- st->pointbuf[st->npoints].y = y;
- st->npoints++;
-
- /* Mark the surrounding area as "sticky" */
- setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
- setdot((x-1), y ); setdot((x+1), y );
- setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
- st->nwalkers--;
- st->walkers[i].x = st->walkers[st->nwalkers].x;
- st->walkers[i].y = st->walkers[st->nwalkers].y;
- if( 0 ==
- ((st->colorsloth ? st->nwalkers%st->colorsloth : 0)) ) {
- color = True;
- }
-
- if (flush || color || 0 == st->nwalkers || st->npoints >= st->max_points) {
- XDrawPoints(st->dpy, st->window, st->draw_gc, st->pointbuf, st->npoints,
- CoordModeOrigin);
- st->npoints = 0;
- }
-
- if (color) {
- st->colorindex++;
- if( st->colorindex == st->ncolors )
- st->colorindex = 0;
- XSetForeground(st->dpy, st->draw_gc, st->colors[st->colorindex].pixel);
- }
- } else {
- /* move it a notch */
- do {
- switch(rand_2()) {
- case 0:
- if( 1 == x ) continue;
- st->walkers[i].x--;
- break;
- case 1:
- if( st->width-2 == x ) continue;
- st->walkers[i].x++;
- break;
- case 2:
- if( 1 == y ) continue;
- st->walkers[i].y--;
- break;
- default: /* case 3: */
- if( st->height-2 == y ) continue;
- st->walkers[i].y++;
- break;
- /* default:
- abort(); */
- }
- } while(0);
- }
- }
-
- return (0 == st->nwalkers);
-}
-
-static void *
-coral_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- st->dpy = dpy;
- st->window = window;
- st->max_points = 200;
- st->pointbuf = (XPoint *) calloc(sizeof(XPoint), st->max_points+2);
- if (!st->pointbuf) exit(-1);
-
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
- st->reset = 1;
- return st;
-}
-
-
-static unsigned long
-coral_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if (st->eraser || st->done)
- {
- st->done = 0;
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- return st->delay2;
- }
-
- if (st->reset)
- init_coral(st);
- st->reset = st->done = coral(st);
-
- return (st->reset
- ? (st->delay * 1000000)
- : st->delay2);
-}
-
-static void
-coral_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- init_coral(st);
-}
-
-static Bool
-coral_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->reset = 1;
- return True;
- }
- return False;
-}
-
-static void
-coral_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- free (st->pointbuf);
- XFreeGC (dpy, st->draw_gc);
- XFreeGC (dpy, st->erase_gc);
- if (st->walkers) free (st->walkers);
- if (st->board) free (st->board);
- free (st);
-}
-
-static const char *coral_defaults[] = {
- ".lowrez: true",
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*density: 25",
- "*seeds: 20", /* too many for 640x480, too few for 1280x1024 */
- "*delay: 5",
- "*delay2: 20000",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec coral_options[] = {
- { "-density", ".density", XrmoptionSepArg, 0 },
- { "-seeds", ".seeds", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-delay2", ".delay2", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("Coral", coral)
diff --git a/hacks/coral.man b/hacks/coral.man
deleted file mode 100644
index 9ad124e..0000000
--- a/hacks/coral.man
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-coral \- simulates coral growth, albeit somewhat slowly.
-.SH SYNOPSIS
-.B coral
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay2 \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-density \fInumber\fP]
-[\-seeds \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Simulates coral growth, albeit somewhat slowly.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay2 \fInumber\fP
-Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
-.TP 8
-.B \-delay \fInumber\fP
-Duration. 1 - 60. Default: 5.
-.TP 8
-.B \-density \fInumber\fP
-Density. 1 - 90. Default: 25.
-.TP 8
-.B \-seeds \fInumber\fP
-Seeds. 1 - 100. Default: 20.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Frederick Roeber. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Frederick Roeber.
diff --git a/hacks/critical.c b/hacks/critical.c
deleted file mode 100644
index d716fc6..0000000
--- a/hacks/critical.c
+++ /dev/null
@@ -1,461 +0,0 @@
-/* critical -- Self-organizing-criticality display hack for XScreenSaver
- * Copyright (C) 1998, 1999, 2000 Martin Pool <mbp@humbug.org.au>
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation. No representations are made
- * about the suitability of this software for any purpose. It is
- * provided "as is" without express or implied warranty.
- *
- * See `critical.man' for more information.
- *
- * Revision history:
- * 13 Nov 1998: Initial version, Martin Pool <mbp@humbug.org.au>
- * 08 Feb 2000: Change to keeping and erasing a trail, <mbp>
- *
- * It would be nice to draw curvy shapes rather than just straight
- * lines, but X11 doesn't have spline primitives (?) so we'd have to
- * do all the work ourselves */
-
-#include "screenhack.h"
-#include "erase.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-
-typedef struct {
- int width, height; /* in cells */
- unsigned short *cells;
-} CriticalModel;
-
-typedef struct {
- int trail; /* length of trail */
- int cell_size;
-} CriticalSettings;
-
-
-/* Number of screens that should be drawn before reinitializing the
- model, and count of the number of screens done so far. */
-
-struct state {
- Display *dpy;
- Window window;
-
- int n_restart, i_restart;
- XWindowAttributes wattr;
- CriticalModel *model;
- int batchcount;
- XPoint *history; /* in cell coords */
- long delay_usecs;
- GC fgc, bgc;
- XGCValues gcv;
- CriticalSettings settings;
-
- int d_n_colors;
- XColor *d_colors;
- int lines_per_color;
- int d_i_color;
- int d_pos;
- int d_wrapped;
-
- int d_i_batch;
- eraser_state *eraser;
-
-};
-
-
-static CriticalModel * model_allocate (int w, int h);
-static void model_initialize (CriticalModel *);
-
-
-static int
-clip (int low, int val, int high)
-{
- if (val < low)
- return low;
- else if (val > high)
- return high;
- else
- return val;
-}
-
-
-/* Allocate an return a new simulation model datastructure.
- */
-
-static CriticalModel *
-model_allocate (int model_w, int model_h)
-{
- CriticalModel *mm;
-
- mm = malloc (sizeof (CriticalModel));
- if (!mm)
- return 0;
-
- mm->width = model_w;
- mm->height = model_h;
-
- mm->cells = malloc (sizeof (unsigned short) * model_w * model_h);
- if (!mm->cells) {
- free (mm);
- return 0;
- }
-
- return mm;
-}
-
-
-
-/* Initialize the data model underlying the hack.
-
- For the self-organizing criticality hack, this consists of a 2d
- array full of random integers.
-
- I've considered storing the data as (say) a binary tree within a 2d
- array, to make finding the highest value faster at the expense of
- storage space: searching the whole array on each iteration seems a
- little inefficient. However, the screensaver doesn't seem to take
- up many cycles as it is: presumably the search is pretty quick
- compared to the sleeps. The current version uses less than 1% of
- the CPU time of an AMD K6-233. Many machines running X11 at this
- point in time seem to be memory-limited, not CPU-limited.
-
- The root of all evil, and all that.
-*/
-
-
-static void
-model_initialize (CriticalModel *mm)
-{
- int i;
-
- for (i = mm->width * mm->height - 1; i >= 0; i--)
- {
- mm->cells[i] = (unsigned short) random ();
- }
-}
-
-
-/* Move one step forward in the criticality simulation.
-
- This function locates and returns in (TOP_X, TOP_Y) the location of
- the highest-valued cell in the model. It also replaces that cell
- and it's eight nearest neighbours with new random values.
- Neighbours that fall off the edge of the model are simply
- ignored. */
-static void
-model_step (CriticalModel *mm, XPoint *ptop)
-{
- int x, y, i;
- int dx, dy;
- unsigned short top_value = 0;
- int top_x = 0, top_y = 0;
-
- /* Find the top cell */
- top_value = 0;
- i = 0;
- for (y = 0; y < mm->height; y++)
- for (x = 0; x < mm->width; x++)
- {
- if (mm->cells[i] >= top_value)
- {
- top_value = mm->cells[i];
- top_x = x;
- top_y = y;
- }
- i++;
- }
-
- /* Replace it and its neighbours with new random values */
- for (dy = -1; dy <= 1; dy++)
- {
- int yy = top_y + dy;
- if (yy < 0 || yy >= mm->height)
- continue;
-
- for (dx = -1; dx <= 1; dx++)
- {
- int xx = top_x + dx;
- if (xx < 0 || xx >= mm->width)
- continue;
-
- mm->cells[yy * mm->width + xx] = (unsigned short) random();
- }
- }
-
- ptop->x = top_x;
- ptop->y = top_y;
-}
-
-
-/* Construct and return in COLORS and N_COLORS a new set of colors,
- depending on the resource settings. */
-static void
-setup_colormap (struct state *st, XColor **colors, int *n_colors)
-{
- Bool writable;
- char * color_scheme;
-
- /* Make a colormap */
- *n_colors = get_integer_resource (st->dpy, "ncolors", "Integer");
- if (*n_colors < 3)
- *n_colors = 3;
-
- *colors = (XColor *) calloc (sizeof(XColor), *n_colors);
- if (!*colors)
- {
- fprintf (stderr, "%s:%d: can't allocate memory for colors\n",
- __FILE__, __LINE__);
- return;
- }
-
- writable = False;
- color_scheme = get_string_resource (st->dpy, "colorscheme", "ColorScheme");
-
- if (!strcmp (color_scheme, "random"))
- {
- make_random_colormap (st->wattr.screen, st->wattr.visual,
- st->wattr.colormap,
- *colors, n_colors,
- True, True, &writable, True);
- }
- else if (!strcmp (color_scheme, "smooth"))
- {
- make_smooth_colormap (st->wattr.screen, st->wattr.visual,
- st->wattr.colormap,
- *colors, n_colors,
- True, &writable, True);
- }
- else
- {
- make_uniform_colormap (st->wattr.screen, st->wattr.visual,
- st->wattr.colormap,
- *colors, n_colors, True,
- &writable, True);
- }
- if (color_scheme) free (color_scheme);
-}
-
-
-/* Free allocated colormap created by setup_colormap. */
-static void
-free_colormap (struct state *st, XColor **colors, int n_colors)
-{
- free_colors (st->wattr.screen, st->wattr.colormap, *colors, n_colors);
- free (*colors);
-}
-
-
-
-/* Draw one step of the hack. Positions are cell coordinates. */
-static void
-draw_step (struct state *st, GC gc, int pos)
-{
- int cell_size = st->settings.cell_size;
- int half = cell_size/2;
- int old_pos = (pos + st->settings.trail - 1) % st->settings.trail;
-
- pos = pos % st->settings.trail;
-
- XDrawLine (st->dpy, st->window, gc,
- st->history[pos].x * cell_size + half,
- st->history[pos].y * cell_size + half,
- st->history[old_pos].x * cell_size + half,
- st->history[old_pos].y * cell_size + half);
-}
-
-
-
-static void *
-critical_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- int model_w, model_h;
- st->dpy = dpy;
- st->window = window;
-
- /* Find window attributes */
- XGetWindowAttributes (st->dpy, st->window, &st->wattr);
-
- st->batchcount = get_integer_resource (st->dpy, "batchcount", "Integer");
- if (st->batchcount < 5)
- st->batchcount = 5;
-
- st->lines_per_color = 10;
-
- /* For the moment the model size is just fixed -- making it vary
- with the screen size just makes the hack boring on large
- screens. */
- model_w = 80;
- st->settings.cell_size = st->wattr.width / model_w;
- model_h = st->settings.cell_size ?
- st->wattr.height / st->settings.cell_size : 1;
-
- /* Construct the initial model state. */
-
- st->settings.trail = clip(2, get_integer_resource (st->dpy, "trail", "Integer"), 1000);
-
- st->history = calloc (st->settings.trail, sizeof (st->history[0]));
- if (!st->history)
- {
- fprintf (stderr, "critical: "
- "couldn't allocate trail history of %d cells\n",
- st->settings.trail);
- abort();
- }
-
- st->model = model_allocate (model_w, model_h);
- if (!st->model)
- {
- fprintf (stderr, "critical: error preparing the model\n");
- abort();
- }
-
- /* make a black gc for the background */
- st->gcv.foreground = get_pixel_resource (st->dpy, st->wattr.colormap,
- "background", "Background");
- st->bgc = XCreateGC (st->dpy, st->window, GCForeground, &st->gcv);
-
- st->fgc = XCreateGC (st->dpy, st->window, 0, &st->gcv);
-
-#ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (dpy, st->fgc, False);
- jwxyz_XSetAntiAliasing (dpy, st->bgc, False);
-#endif
-
- st->delay_usecs = get_integer_resource (st->dpy, "delay", "Integer");
- st->n_restart = get_integer_resource (st->dpy, "restart", "Integer");
-
- setup_colormap (st, &st->d_colors, &st->d_n_colors);
- model_initialize (st->model);
- model_step (st->model, &st->history[0]);
- st->d_pos = 1;
- st->d_wrapped = 0;
- st->i_restart = 0;
- st->d_i_batch = st->batchcount;
-
- return st;
-}
-
-static unsigned long
-critical_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if (st->eraser) {
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- return st->delay_usecs;
- }
-
- /* for (d_i_batch = batchcount; d_i_batch; d_i_batch--) */
- {
- /* Set color */
- if ((st->d_i_batch % st->lines_per_color) == 0)
- {
- st->d_i_color = (st->d_i_color + 1) % st->d_n_colors;
- st->gcv.foreground = st->d_colors[st->d_i_color].pixel;
- XChangeGC (st->dpy, st->fgc, GCForeground, &st->gcv);
- }
-
- assert(st->d_pos >= 0 && st->d_pos < st->settings.trail);
- model_step (st->model, &st->history[st->d_pos]);
-
- draw_step (st, st->fgc, st->d_pos);
-
- /* we use the history as a ring buffer, but don't start erasing until
- we've d_wrapped around once. */
- if (++st->d_pos >= st->settings.trail)
- {
- st->d_pos -= st->settings.trail;
- st->d_wrapped = 1;
- }
-
- if (st->d_wrapped)
- {
- draw_step (st, st->bgc, st->d_pos+1);
- }
-
- }
-
- st->d_i_batch--;
- if (st->d_i_batch < 0)
- st->d_i_batch = st->batchcount;
- else
- return st->delay_usecs;
-
- st->i_restart = (st->i_restart + 1) % st->n_restart;
-
- if (st->i_restart == 0)
- {
- /* Time to start a new simulation, this one has probably got
- to be a bit boring. */
- free_colormap (st, &st->d_colors, st->d_n_colors);
- setup_colormap (st, &st->d_colors, &st->d_n_colors);
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- model_initialize (st->model);
- model_step (st->model, &st->history[0]);
- st->d_pos = 1;
- st->d_wrapped = 0;
- st->d_i_batch = st->batchcount;
- }
-
- return st->delay_usecs;
-}
-
-static void
-critical_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static Bool
-critical_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-critical_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->fgc);
- XFreeGC (dpy, st->bgc);
- free (st->model->cells);
- free (st->model);
- free (st->history);
- free (st->d_colors);
- free (st);
-}
-
-
-/* Options this module understands. */
-static XrmOptionDescRec critical_options[] = {
- { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-colorscheme", ".colorscheme", XrmoptionSepArg, 0 },
- { "-restart", ".restart", XrmoptionSepArg, 0 },
- { "-batchcount", ".batchcount", XrmoptionSepArg, 0 },
- { "-trail", ".trail", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 } /* end */
-};
-
-
-/* Default xrm resources. */
-static const char *critical_defaults[] = {
- ".background: black",
- "*fpsSolid: true",
- "*colorscheme: smooth",
- "*delay: 10000",
- "*ncolors: 64",
- "*restart: 8",
- "*batchcount: 1500",
- "*trail: 50",
- 0 /* end */
-};
-
-
-XSCREENSAVER_MODULE ("Critical", critical)
diff --git a/hacks/critical.man b/hacks/critical.man
deleted file mode 100644
index 5993fed..0000000
--- a/hacks/critical.man
+++ /dev/null
@@ -1,94 +0,0 @@
-.TH XScreenSaver 1 "08 Feb 2000" "X Version 11"
-.SH NAME
-critical \- Draw a system showing self-organizing criticality
-.SH SYNOPSIS
-.B critical
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIcritical\fP program displays a self-organizing critical system
-that gradually emerges from chaos.
-
-\fIcritical\fP performs a simulation on a two-dimensional array of
-integers. The array is initialized to random values. On each
-iteration, it draws a line to the array position with the greatest
-value. It then replaces that location and the eight neighboring
-locations with randomly-selected values.
-
-The lines are initially random, but over time a chaotic
-self-organizing system evolves: areas of the screen which happen to
-have lower values are less likely to be updated to new values, and so
-the line tends to avoid those areas. Eventually, the histogram of
-changes approaches the power-law curve typical of such systems.
-
-The simplest documented self-organizing system is the one-dimensional
-equivalent of \fIcritical\fP.
-
-I heard about this algorithm second-hand: apparently there was an
-article in \fIScientific American\fP describing it sometime in 1997.
-.SH OPTIONS
-.I critical
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-Number of microseconds to wait after drawing each line.
-.TP 8
-.B \-random \fIboolean\fP
-Whether to use randomly selected colours rather than a cycle around
-the colour wheel.
-.TP 8
-.B \-offset \fIinteger\fP
-The maximum random radius increment to use.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be allocated in the color ramp (note that this
-value interacts with \fIoffset\fP.)
-.TP 8
-.B \-trail \fIinteger\fP
-Length of the trail: between 5 and 100 is nice.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-command (1)
-.BR xscreensaver\-settings (1)
-.SH COPYRIGHT
-Copyright \(co 1998 by Martin Pool.
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Martin Pool <mbp@humbug.org.au>, 1998-2000. Based in part on the
-XScreenSaver code by Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/crystal.c b/hacks/crystal.c
deleted file mode 100644
index e82492c..0000000
--- a/hacks/crystal.c
+++ /dev/null
@@ -1,1285 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* crystal --- polygons moving according to plane group rules */
-
-#if 0
-static const char sccsid[] = "@(#)crystal.c 4.12 98/09/10 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1997 by Jouk Jansen <joukj@crys.chem.uva.nl>
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The author should like to be notified if changes have been made to the
- * routine. Response will only be guaranteed when a VMS version of the
- * program is available.
- *
- * A moving polygon-mode. The polygons obey 2D-planegroup symmetry.
- *
- * The groupings of the cells fall in 3 categories:
- * oblique groups 1 and 2 where the angle gamma ranges from 60 to 120 degrees
- * square groups 3 through 11 where the angle gamma is 90 degrees
- * hexagonal groups 12 through 17 where the angle gamma is 120 degrees
- *
- * Revision History:
- * 03-Dec-98: Random inversion of y-axis included to simulate hexagonal groups
- * with an angle of 60 degrees.
- * 10-Sep-98: new colour scheme
- * 24-Feb-98: added option centre which turns on/off forcing the centre of
- * the screen to be used
- * added option maxsize which forces the dimensions to be chasen
- * in such ua way that the largest possible part of the screen is
- * used
- * When only one unit cell is drawn, it is chosen at random
- * 18-Feb-98: added support for negative numbers with -nx and -ny meaning
- * "random" choice with given maximum
- * added +/-grid option. If -cell is specified this option
- * determines if one or all unit cells are drawn.
- * -batchcount is now a parameter for all the objects on the screen
- * instead of the number of "unique" objects
- * The maximum size of the objects now scales with the part
- * of the screen used.
- * fixed "size" problem. Now very small non-vissable objects
- * are not allowed
- * 13-Feb-98: randomized the unit cell size
- * runtime options -/+cell (turn on/off unit cell drawing)
- * -nx num (number of translational symmetries in x-direction
- * -ny num (idem y-direction but ignored for square and
- * hexagonal space groups
- * i.e. try xlock -mode crystal -nx 3 -ny 2
- * Fullrandom overrules the -/+cell option.
- * 05-Feb-98: Revision + bug repairs
- * shows unit cell
- * use part of the screen for unit cell
- * in hexagonal and square groups a&b axis forced to be equal
- * cell angle for oblique groups randomly chosen between 60 and 120
- * bugs solved: planegroups with cell angles <> 90.0 now work properly
- * 19-Sep-97: Added remaining hexagonal groups
- * 12-Jun-97: Created
- */
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 60000 \n" \
- "*count: -500 \n" \
- "*cycles: 200 \n" \
- "*size: -15 \n" \
- "*ncolors: 100 \n" \
- "*fpsSolid: True \n" \
- "*ignoreRotation: True \n" \
-
-# define release_crystal 0
-# define reshape_crystal 0
-# define crystal_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-# include "color.h"
-#endif /* STANDALONE */
-
-#define DEF_CELL "True" /* Draw unit cell */
-#define DEF_GRID "False" /* Draw unit all cell if DEF_CELL is True */
-#define DEF_NX "-3" /* number of unit cells in x-direction */
-#define DEF_NX1 1 /* number of unit cells in x-direction */
-#define DEF_NY "-3" /* number of unit cells in y-direction */
-#define DEF_NY1 1 /* number of unit cells in y-direction */
-#define DEF_CENTRE "False"
-#define DEF_MAXSIZE "False"
-#define DEF_CYCLE "True"
-
-#undef NRAND
-#define NRAND(n) ( (n) ? (int) (LRAND() % (n)) : 0)
-
-#define min(a,b) ((a) <= (b) ? (a) : (b))
-
-static int nx, ny;
-
-static Bool unit_cell, grid_cell, centre, maxsize, cycle_p;
-
-static XrmOptionDescRec opts[] =
-{
- {"-nx", "crystal.nx", XrmoptionSepArg, 0},
- {"-ny", "crystal.ny", XrmoptionSepArg, 0},
- {"-centre", ".crystal.centre", XrmoptionNoArg, "on"},
- {"+centre", ".crystal.centre", XrmoptionNoArg, "off"},
- {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, "on"},
- {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, "off"},
- {"-cell", ".crystal.cell", XrmoptionNoArg, "on"},
- {"+cell", ".crystal.cell", XrmoptionNoArg, "off"},
- {"-grid", ".crystal.grid", XrmoptionNoArg, "on"},
- {"+grid", ".crystal.grid", XrmoptionNoArg, "off"},
- {"-shift", ".crystal.shift", XrmoptionNoArg, "on"},
- {"+shift", ".crystal.shift", XrmoptionNoArg, "off"}
-};
-
-static argtype vars[] =
-{
- {&nx, "nx", "nx", DEF_NX, t_Int},
- {&ny, "ny", "ny", DEF_NY, t_Int},
- {&centre, "centre", "Centre", DEF_CENTRE, t_Bool},
- {&maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
- {&unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
- {&grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
- {&cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
-};
-static OptionStruct desc[] =
-{
- {"-nx num", "Number of unit cells in x-direction"},
- {"-ny num", "Number of unit cells in y-direction"},
- {"-/+centre", "turn on/off centering on screen"},
- {"-/+maxsize", "turn on/off use of maximum part of screen"},
- {"-/+cell", "turn on/off drawing of unit cell"},
- {"-/+grid", "turn on/off drawing of grid of unit cells (if -cell is on)"},
- {"-/+shift", "turn on/off colour cycling"}
-};
-
-ENTRYPOINT ModeSpecOpt crystal_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct crystal_description =
-{"crystal", "init_crystal", "draw_crystal", NULL,
- "refresh_crystal", "init_crystal", "free_crystal", &crystal_opts,
- 60000, -40, 200, -15, 64, 1.0, "",
- "Shows polygons in 2D plane groups", 0, NULL};
-
-#endif
-
-#define DEF_NUM_ATOM 10
-
-#define DEF_SIZ_ATOM 10
-
-#define PI_RAD (M_PI / 180.0)
-
-static Bool centro[17] =
-{
- False,
- True,
- False,
- False,
- False,
- True,
- True,
- True,
- True,
- True,
- True,
- True,
- False,
- False,
- False,
- True,
- True
-};
-
-static Bool primitive[17] =
-{
- True,
- True,
- True,
- True,
- False,
- True,
- True,
- True,
- False,
- True,
- True,
- True,
- True,
- True,
- True,
- True,
- True
-};
-
-static short numops[34] =
-{
- 1, 0,
- 1, 0,
- 9, 7,
- 2, 0,
- 9, 7,
- 9, 7,
- 4, 2,
- 5, 3,
- 9, 7,
- 8, 6,
- 10, 6,
- 8, 4,
- 16, 13,
- 19, 13,
- 16, 10,
- 19, 13,
- 19, 13
-};
-
-static short operation[114] =
-{
- 1, 0, 0, 1, 0, 0,
- -1, 0, 0, 1, 0, 1,
- -1, 0, 0, 1, 1, 0,
- 1, 0, 0, 1, 0, 0,
- -1, 0, 0, 1, 1, 1,
- 1, 0, 0, 1, 1, 1,
- 0, -1, 1, 0, 0, 0,
- 1, 0, 0, 1, 0, 0,
- -1, 0, 0, 1, 0, 0,
- 0, 1, 1, 0, 0, 0,
- -1, 0, -1, 1, 0, 0,
- 1, -1, 0, -1, 0, 0,
- 0, 1, 1, 0, 0, 0,
- 0, -1, 1, -1, 0, 0,
- -1, 1, -1, 0, 0, 0,
- 1, 0, 0, 1, 0, 0,
- 0, -1, -1, 0, 0, 0,
- -1, 1, 0, 1, 0, 0,
- 1, 0, 1, -1, 0, 0
-};
-
-typedef struct {
- unsigned long colour;
- int x0, y0, velocity[2];
- float angle, velocity_a;
- int num_point, at_type, size_at;
- XPoint xy[5];
-} crystalatom;
-
-typedef struct {
- Bool painted;
- int win_width, win_height, num_atom;
- int planegroup, a, b, offset_w, offset_h, nx, ny;
- float gamma;
- crystalatom *atom;
- GC gc;
- Bool unit_cell, grid_cell;
- Colormap cmap;
- XColor *colors;
- int ncolors;
- Bool cycle_p, mono_p, no_colors;
- unsigned long blackpixel, whitepixel, fg, bg;
- int direction, invert;
- unsigned long grid_pixel;
- int inx, iny;
-} crystalstruct;
-
-static crystalstruct *crystals = NULL;
-
-static void
-trans_coor(XPoint * xyp, XPoint * new_xyp, int num_points,
- float gamma)
-{
- int i;
-
- for (i = 0; i <= num_points; i++) {
- new_xyp[i].x = xyp[i].x +
- (int) (xyp[i].y * sin((gamma - 90.0) * PI_RAD));
- new_xyp[i].y = (int) (xyp[i].y / cos((gamma - 90.0) * PI_RAD));
- }
-}
-
-static void
-trans_coor_back(XPoint * xyp, XPoint * new_xyp,
- int num_points, float gamma, int offset_w, int offset_h ,
- int winheight , int invert )
-{
- int i;
-
- for (i = 0; i <= num_points; i++) {
- new_xyp[i].y = (int) (xyp[i].y * cos((gamma - 90) * PI_RAD)) +
- offset_h;
- new_xyp[i].x = xyp[i].x - (int) (xyp[i].y * sin((gamma - 90.0)
- * PI_RAD)) + offset_w;
- if ( invert ) new_xyp[i].y = winheight - new_xyp[i].y;
- }
-}
-
-static void
-crystal_setupatom(crystalatom * atom0, float gamma)
-{
- XPoint xy[5];
- int x0, y0;
-
- y0 = (int) (atom0->y0 * cos((gamma - 90) * PI_RAD));
- x0 = atom0->x0 - (int) (atom0->y0 * sin((gamma - 90.0) * PI_RAD));
- switch (atom0->at_type) {
- case 0: /* rectangles */
- xy[0].x = x0 + (int) (2 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (atom0->size_at * sin(atom0->angle));
- xy[0].y = y0 + (int) (atom0->size_at *
- cos(atom0->angle)) -
- (int) (2 * atom0->size_at * sin(atom0->angle));
- xy[1].x = x0 + (int) (2 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (atom0->size_at * sin(atom0->angle));
- xy[1].y = y0 - (int) (atom0->size_at *
- cos(atom0->angle)) -
- (int) (2 * atom0->size_at * sin(atom0->angle));
- xy[2].x = x0 - (int) (2 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (atom0->size_at * sin(atom0->angle));
- xy[2].y = y0 - (int) (atom0->size_at *
- cos(atom0->angle)) +
- (int) (2 * atom0->size_at * sin(atom0->angle));
- xy[3].x = x0 - (int) (2 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (atom0->size_at * sin(atom0->angle));
- xy[3].y = y0 + (int) (atom0->size_at *
- cos(atom0->angle)) +
- (int) (2 * atom0->size_at *
- sin(atom0->angle));
- xy[4].x = xy[0].x;
- xy[4].y = xy[0].y;
- trans_coor(xy, atom0->xy, 4, gamma);
- return;
- case 1: /* squares */
- xy[0].x = x0 + (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[0].y = y0 + (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[1].x = x0 + (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[1].y = y0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[2].x = x0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[2].y = y0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[3].x = x0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[3].y = y0 + (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[4].x = xy[0].x;
- xy[4].y = xy[0].y;
- trans_coor(xy, atom0->xy, 4, gamma);
- return;
- case 2: /* triangles */
- xy[0].x = x0 + (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[0].y = y0 + (int) (1.5 * atom0->size_at *
- cos(atom0->angle));
- xy[1].x = x0 + (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[1].y = y0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[2].x = x0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) -
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[2].y = y0 - (int) (1.5 * atom0->size_at *
- cos(atom0->angle)) +
- (int) (1.5 * atom0->size_at *
- sin(atom0->angle));
- xy[3].x = xy[0].x;
- xy[3].y = xy[0].y;
- trans_coor(xy, atom0->xy, 3, gamma);
- return;
- }
-}
-
-static void
-crystal_drawatom(ModeInfo * mi, crystalatom * atom0)
-{
- crystalstruct *cryst;
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int j, k, l, m;
-
- cryst = &crystals[MI_SCREEN(mi)];
- for (j = numops[2 * cryst->planegroup + 1];
- j < numops[2 * cryst->planegroup]; j++) {
- XPoint xy[5], new_xy[5];
- XPoint xy_1[5];
- int xtrans, ytrans;
-
- xtrans = operation[j * 6] * atom0->x0 + operation[j * 6 + 1] *
- atom0->y0 + (int) (operation[j * 6 + 4] * cryst->a /
- 2.0);
- ytrans = operation[j * 6 + 2] * atom0->x0 + operation[j * 6 +
- 3] * atom0->y0 + (int) (operation[j * 6 + 5] *
- cryst->b / 2.0);
- if (xtrans < 0) {
- if (xtrans < -cryst->a)
- xtrans = 2 * cryst->a;
- else
- xtrans = cryst->a;
- } else if (xtrans >= cryst->a)
- xtrans = -cryst->a;
- else
- xtrans = 0;
- if (ytrans < 0)
- ytrans = cryst->b;
- else if (ytrans >= cryst->b)
- ytrans = -cryst->b;
- else
- ytrans = 0;
- for (k = 0; k < atom0->num_point; k++) {
- xy[k].x = operation[j * 6] * atom0->xy[k].x +
- operation[j * 6 + 1] *
- atom0->xy[k].y + (int) (operation[j * 6 + 4] *
- cryst->a / 2.0) +
- xtrans;
- xy[k].y = operation[j * 6 + 2] * atom0->xy[k].x +
- operation[j * 6 + 3] *
- atom0->xy[k].y + (int) (operation[j * 6 + 5] *
- cryst->b / 2.0) +
- ytrans;
- }
- xy[atom0->num_point].x = xy[0].x;
- xy[atom0->num_point].y = xy[0].y;
- for (l = 0; l < cryst->nx; l++) {
- for (m = 0; m < cryst->ny; m++) {
-
- for (k = 0; k <= atom0->num_point; k++) {
- xy_1[k].x = xy[k].x + l * cryst->a;
- xy_1[k].y = xy[k].y + m * cryst->b;
- }
- trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma, cryst->offset_w,
- cryst->offset_h ,
- cryst->win_height,
- cryst->invert);
- XFillPolygon(display, window, cryst->gc, new_xy,
- atom0->num_point, Convex, CoordModeOrigin);
- }
- }
- if (centro[cryst->planegroup] == True) {
- for (k = 0; k <= atom0->num_point; k++) {
- xy[k].x = cryst->a - xy[k].x;
- xy[k].y = cryst->b - xy[k].y;
- }
- for (l = 0; l < cryst->nx; l++) {
- for (m = 0; m < cryst->ny; m++) {
-
- for (k = 0; k <= atom0->num_point; k++) {
- xy_1[k].x = xy[k].x + l * cryst->a;
- xy_1[k].y = xy[k].y + m * cryst->b;
- }
- trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma,
- cryst->offset_w,
- cryst->offset_h ,
- cryst->win_height ,
- cryst->invert);
- XFillPolygon(display, window, cryst->gc,
- new_xy,
- atom0->num_point, Convex,
- CoordModeOrigin);
- }
- }
- }
- if (primitive[cryst->planegroup] == False) {
- if (xy[atom0->num_point].x >= (int) (cryst->a / 2.0))
- xtrans = (int) (-cryst->a / 2.0);
- else
- xtrans = (int) (cryst->a / 2.0);
- if (xy[atom0->num_point].y >= (int) (cryst->b / 2.0))
- ytrans = (int) (-cryst->b / 2.0);
- else
- ytrans = (int) (cryst->b / 2.0);
- for (k = 0; k <= atom0->num_point; k++) {
- xy[k].x = xy[k].x + xtrans;
- xy[k].y = xy[k].y + ytrans;
- }
- for (l = 0; l < cryst->nx; l++) {
- for (m = 0; m < cryst->ny; m++) {
-
- for (k = 0; k <= atom0->num_point; k++) {
- xy_1[k].x = xy[k].x + l * cryst->a;
- xy_1[k].y = xy[k].y + m * cryst->b;
- }
- trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma,
- cryst->offset_w,
- cryst->offset_h ,
- cryst->win_height,
- cryst->invert);
- XFillPolygon(display, window, cryst->gc,
- new_xy,
- atom0->num_point, Convex,
- CoordModeOrigin);
- }
- }
- if (centro[cryst->planegroup] == True) {
- XPoint xy1[5];
-
- for (k = 0; k <= atom0->num_point; k++) {
- xy1[k].x = cryst->a - xy[k].x;
- xy1[k].y = cryst->b - xy[k].y;
- }
- for (l = 0; l < cryst->nx; l++) {
- for (m = 0; m < cryst->ny; m++) {
-
- for (k = 0; k <= atom0->num_point; k++) {
- xy_1[k].x = xy1[k].x + l * cryst->a;
- xy_1[k].y = xy1[k].y + m * cryst->b;
- }
- trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma,
- cryst->offset_w,
- cryst->offset_h ,
- cryst->win_height,
- cryst->invert);
- XFillPolygon(display, window,
- cryst->gc,
- new_xy, atom0->num_point,
- Convex, CoordModeOrigin);
- }
- }
- }
- }
- }
-}
-
-ENTRYPOINT void init_crystal(ModeInfo * mi);
-
-
-ENTRYPOINT void
-draw_crystal(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
- int i;
-
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
-#endif
-
- if (cryst->no_colors) {
- init_crystal(mi);
- return;
- }
-
- /* Moved from init_crystal because you can't draw after MI_CLEARWINDOW in
- XScreenSaver. - Dave Odell <dmo2118@gmail.com>
- */
- if (cryst->unit_cell
-#ifndef HAVE_JWXYZ
- && !cryst->painted
-#endif
- ) {
- int y_coor1 , y_coor2;
-
- XSetForeground(display, cryst->gc, cryst->grid_pixel);
- if (cryst->grid_cell) {
- int inx, iny;
-
- if ( cryst->invert )
- y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
- else
- y_coor1 = y_coor2 = cryst->offset_h;
- XDrawLine(display, window, cryst->gc, cryst->offset_w,
- y_coor1, cryst->offset_w + cryst->nx * cryst->a,
- y_coor2);
- if ( cryst->invert )
- {
- y_coor1 = cryst->win_height - cryst->offset_h;
- y_coor2 = cryst->win_height - (int) (cryst->ny *
- cryst->b *
- cos((cryst->gamma - 90) * PI_RAD)) -
- cryst->offset_h;
- }
- else
- {
- y_coor1 = cryst->offset_h;
- y_coor2 = (int) (cryst->ny * cryst->b *
- cos((cryst->gamma - 90) * PI_RAD)) +
- cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc, cryst->offset_w,
- y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- inx = cryst->nx;
- for (iny = 1; iny <= cryst->ny; iny++) {
- if ( cryst->invert )
- {
- y_coor1 = cryst->win_height -
- (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) - cryst->offset_h;
- y_coor2 = cryst->win_height -
- (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) -
- cryst->offset_h;
- }
- else
- {
- y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) + cryst->offset_h;
- y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
- cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc,
- (int) (cryst->offset_w +
- inx * cryst->a - (int) (iny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD))),
- y_coor1,
- (int) (cryst->offset_w - iny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- }
- iny = cryst->ny;
- for (inx = 1; inx <= cryst->nx; inx++) {
- if ( cryst->invert )
- {
- y_coor1 =cryst->win_height -
- (int) (iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) - cryst->offset_h;
- y_coor2 =cryst->win_height - cryst->offset_h;
- }
- else
- {
- y_coor1 =(int) (iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) + cryst->offset_h;
- y_coor2 =cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc,
- (int) (cryst->offset_w +
- inx * cryst->a - (int) (iny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD))),
- y_coor1,
- cryst->offset_w + inx * cryst->a,
- y_coor2);
- }
- } else {
- if ( cryst->invert )
- {
- y_coor1 =cryst->win_height -
- (int) (cryst->iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) -
- cryst->offset_h;
- y_coor2 =cryst->win_height -
- (int) ( ( cryst->iny + 1 ) * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) -
- cryst->offset_h;
- }
- else
- {
- y_coor1 =(int) (cryst->iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) +
- cryst->offset_h;
- y_coor2 =(int) (( cryst->iny + 1 ) * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) +
- cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + cryst->inx * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1,
- cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1);
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + cryst->inx * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1,
- cryst->offset_w + cryst->inx * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1,
- cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + cryst->inx * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2,
- cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- }
- }
-
- XSetFunction(display, cryst->gc, GXxor);
-
-/* Rotate colours */
- if (cryst->cycle_p) {
- rotate_colors(mi->xgwa.screen, cryst->cmap,
- cryst->colors, cryst->ncolors,
- cryst->direction);
- if (!(LRAND() % 1000))
- cryst->direction = -cryst->direction;
- }
- for (i = 0; i < cryst->num_atom; i++) {
- crystalatom *atom0;
-
- atom0 = &cryst->atom[i];
-
- if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
- XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
- } else {
- XSetForeground(display, cryst->gc, atom0->colour);
- }
-#ifndef HAVE_JWXYZ
- if(cryst->painted)
- crystal_drawatom(mi, atom0);
-#endif
- atom0->velocity[0] += NRAND(3) - 1;
- atom0->velocity[0] = MAX(-20, MIN(20, atom0->velocity[0]));
- atom0->velocity[1] += NRAND(3) - 1;
- atom0->velocity[1] = MAX(-20, MIN(20, atom0->velocity[1]));
- atom0->x0 += atom0->velocity[0];
- /*if (cryst->gamma == 90.0) { */
- if (atom0->x0 < 0)
- atom0->x0 += cryst->a;
- else if (atom0->x0 >= cryst->a)
- atom0->x0 -= cryst->a;
- atom0->y0 += atom0->velocity[1];
- if (atom0->y0 < 0)
- atom0->y0 += cryst->b;
- else if (atom0->y0 >= cryst->b)
- atom0->y0 -= cryst->b;
- /*} */
- atom0->velocity_a += ((float) NRAND(1001) - 500.0) / 2000.0;
- atom0->angle += atom0->velocity_a;
- crystal_setupatom(atom0, cryst->gamma);
- crystal_drawatom(mi, atom0);
- }
- XSetFunction(display, cryst->gc, GXcopy);
- cryst->painted = True;
- MI_IS_DRAWN(mi) = True;
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_crystal(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
- int i;
-
- if (!cryst->painted)
- return;
- MI_CLEARWINDOW(mi);
- XSetFunction(display, cryst->gc, GXxor);
-
- if (cryst->unit_cell) {
- int y_coor1 , y_coor2;
-
- if (MI_NPIXELS(mi) > 2)
- XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
- else
- XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
- if (cryst->grid_cell) {
- int inx, iny;
-
- if ( cryst->invert )
- y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
- else
- y_coor1 = y_coor2 = cryst->offset_h;
- XDrawLine(display, window, cryst->gc, cryst->offset_w,
- y_coor1, cryst->offset_w + cryst->nx * cryst->a,
- y_coor2);
- if ( cryst->invert )
- {
- y_coor1 = cryst->win_height - cryst->offset_h;
- y_coor2 = cryst->win_height - (int) (cryst->ny *
- cryst->b *
- cos((cryst->gamma - 90) * PI_RAD)) -
- cryst->offset_h;
- }
- else
- {
- y_coor1 = cryst->offset_h;
- y_coor2 = (int) (cryst->ny * cryst->b *
- cos((cryst->gamma - 90) * PI_RAD)) +
- cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc, cryst->offset_w,
- y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- inx = cryst->nx;
- for (iny = 1; iny <= cryst->ny; iny++) {
- if ( cryst->invert )
- {
- y_coor1 = cryst->win_height -
- (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) - cryst->offset_h;
- y_coor2 = cryst->win_height -
- (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) -
- cryst->offset_h;
- }
- else
- {
- y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) + cryst->offset_h;
- y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
- cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc,
- (int) (cryst->offset_w +
- inx * cryst->a - (int) (iny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD))),
- y_coor1,
- (int) (cryst->offset_w - iny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- }
- iny = cryst->ny;
- for (inx = 1; inx <= cryst->nx; inx++) {
- if ( cryst->invert )
- {
- y_coor1 =cryst->win_height -
- (int) (iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) - cryst->offset_h;
- y_coor2 =cryst->win_height - cryst->offset_h;
- }
- else
- {
- y_coor1 =(int) (iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) + cryst->offset_h;
- y_coor2 =cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc,
- (int) (cryst->offset_w +
- inx * cryst->a - (int) (iny * cryst->b *
- sin((cryst->gamma - 90) * PI_RAD))),
- y_coor1,
- cryst->offset_w + inx * cryst->a,
- y_coor2);
- }
- } else {
- int inx, iny;
-
- inx = NRAND(cryst->nx);
- iny = NRAND(cryst->ny);
- if ( cryst->invert )
- {
- y_coor1 =cryst->win_height -
- (int) (iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) -
- cryst->offset_h;
- y_coor2 =cryst->win_height -
- (int) ( ( iny + 1 ) * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) -
- cryst->offset_h;
- }
- else
- {
- y_coor1 =(int) (iny * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) +
- cryst->offset_h;
- y_coor2 =(int) (( iny + 1 ) * cryst->b *
- cos((cryst->gamma - 90) *
- PI_RAD)) +
- cryst->offset_h;
- }
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1,
- cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1);
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1,
- cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor1,
- cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- XDrawLine(display, window, cryst->gc,
- cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2,
- cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- y_coor2);
- }
- }
- for (i = 0; i < cryst->num_atom; i++) {
- crystalatom *atom0;
-
- atom0 = &cryst->atom[i];
- if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
- XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
- } else {
- XSetForeground(display, cryst->gc, atom0->colour);
- }
- crystal_drawatom(mi, atom0);
- }
- XSetFunction(display, cryst->gc, GXcopy);
-}
-#endif
-
-ENTRYPOINT void
-free_crystal(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
-
- if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
- MI_WHITE_PIXEL(mi) = cryst->whitepixel;
- MI_BLACK_PIXEL(mi) = cryst->blackpixel;
-#ifndef STANDALONE
- MI_FG_PIXEL(mi) = cryst->fg;
- MI_BG_PIXEL(mi) = cryst->bg;
-#endif
- if (cryst->colors && cryst->ncolors && !cryst->no_colors)
- free_colors(mi->xgwa.screen, cryst->cmap, cryst->colors,
- cryst->ncolors);
- if (cryst->colors)
- (void) free((void *) cryst->colors);
-#if 0 /* #### wrong! -jwz */
- XFreeColormap(display, cryst->cmap);
-#endif
- }
- if (cryst->gc != NULL)
- XFreeGC(display, cryst->gc);
- if (cryst->atom != NULL)
- (void) free((void *) cryst->atom);
-}
-
-ENTRYPOINT void
-init_crystal(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- crystalstruct *cryst;
- int i, max_atoms, size_atom, neqv;
- int cell_min;
-
-#define MIN_CELL 200
-
-/* initialize */
- MI_INIT (mi, crystals);
- cryst = &crystals[MI_SCREEN(mi)];
-
- if (!cryst->gc) {
- if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
- XColor color;
-
-#ifndef STANDALONE
- extern char *background;
- extern char *foreground;
-
- cryst->fg = MI_FG_PIXEL(mi);
- cryst->bg = MI_BG_PIXEL(mi);
-#endif
- cryst->blackpixel = MI_BLACK_PIXEL(mi);
- cryst->whitepixel = MI_WHITE_PIXEL(mi);
-#if 0 /* #### wrong! -jwz */
- cryst->cmap = XCreateColormap(display, window,
- MI_VISUAL(mi), AllocNone);
- XSetWindowColormap(display, window, cryst->cmap);
-#else
- cryst->cmap = mi->xgwa.colormap;
-#endif
- (void) XParseColor(display, cryst->cmap, "black", &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_BLACK_PIXEL(mi) = color.pixel;
- (void) XParseColor(display, cryst->cmap, "white", &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_WHITE_PIXEL(mi) = color.pixel;
-#ifndef STANDALONE
- (void) XParseColor(display, cryst->cmap, background, &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_BG_PIXEL(mi) = color.pixel;
- (void) XParseColor(display, cryst->cmap, foreground, &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_FG_PIXEL(mi) = color.pixel;
-#endif
- cryst->colors = 0;
- cryst->ncolors = 0;
- }
- if ((cryst->gc = XCreateGC(display, MI_WINDOW(mi),
- (unsigned long) 0, (XGCValues *) NULL)) == None)
- return;
- }
-/* Clear Display */
- MI_CLEARWINDOW(mi);
- cryst->painted = False;
- XSetFunction(display, cryst->gc, GXxor);
-
-
-/*Set up crystal data */
- cryst->direction = (LRAND() & 1) ? 1 : -1;
- if (MI_IS_FULLRANDOM(mi)) {
- if (LRAND() & 1)
- cryst->unit_cell = True;
- else
- cryst->unit_cell = False;
- } else
- cryst->unit_cell = unit_cell;
- if (cryst->unit_cell) {
- if (MI_IS_FULLRANDOM(mi)) {
- if (LRAND() & 1)
- cryst->grid_cell = True;
- else
- cryst->grid_cell = False;
- } else
- cryst->grid_cell = grid_cell;
- }
- cryst->win_width = MI_WIDTH(mi);
- cryst->win_height = MI_HEIGHT(mi);
- cell_min = min(cryst->win_width / 2 + 1, MIN_CELL);
- cell_min = min(cell_min, cryst->win_height / 2 + 1);
- cryst->planegroup = NRAND(17);
- cryst->invert = NRAND(2);
- if (MI_IS_VERBOSE(mi))
- (void) fprintf(stdout, "Selected plane group no %d\n",
- cryst->planegroup + 1);
- if (cryst->planegroup > 11)
- cryst->gamma = 120.0;
- else if (cryst->planegroup < 2)
- cryst->gamma = 60.0 + NRAND(60);
- else
- cryst->gamma = 90.0;
- neqv = numops[2 * cryst->planegroup] - numops[2 * cryst->planegroup + 1];
- if (centro[cryst->planegroup] == True)
- neqv = 2 * neqv;
- if (primitive[cryst->planegroup] == False)
- neqv = 2 * neqv;
-
-
- if (nx > 0)
- cryst->nx = nx;
- else if (nx < 0)
- cryst->nx = NRAND(-nx) + 1;
- else
- cryst->nx = DEF_NX1;
- if (cryst->planegroup > 8)
- cryst->ny = cryst->nx;
- else if (ny > 0)
- cryst->ny = ny;
- else if (ny < 0)
- cryst->ny = NRAND(-ny) + 1;
- else
- cryst->ny = DEF_NY1;
- neqv = neqv * cryst->nx * cryst->ny;
-
- cryst->num_atom = MI_COUNT(mi);
- max_atoms = MI_COUNT(mi);
- if (cryst->num_atom == 0) {
- cryst->num_atom = DEF_NUM_ATOM;
- max_atoms = DEF_NUM_ATOM;
- } else if (cryst->num_atom < 0) {
- max_atoms = -cryst->num_atom;
- cryst->num_atom = NRAND(-cryst->num_atom) + 1;
- }
- if (neqv > 1)
- cryst->num_atom = cryst->num_atom / neqv + 1;
-
- if (cryst->atom == NULL)
- cryst->atom = (crystalatom *) calloc(max_atoms, sizeof (
- crystalatom));
-
- if (maxsize) {
- if (cryst->planegroup < 13) {
- cryst->gamma = 90.0;
- cryst->offset_w = 0;
- cryst->offset_h = 0;
- if (cryst->planegroup < 10) {
- cryst->b = cryst->win_height;
- cryst->a = cryst->win_width;
- } else {
- cryst->b = min(cryst->win_height, cryst->win_width);
- cryst->a = cryst->b;
- }
- } else {
- cryst->gamma = 120.0;
- cryst->a = (int) (cryst->win_width * 2.0 / 3.0);
- cryst->b = cryst->a;
- cryst->offset_h = (int) (cryst->b * 0.25 *
- cos((cryst->gamma - 90) * PI_RAD));
- cryst->offset_w = (int) (cryst->b * 0.5);
- }
- } else {
- int max_repeat = 10;
- cryst->offset_w = -1;
- while (max_repeat-- &&
- (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)) < 4)
- ) {
- cryst->b = NRAND((int) (cryst->win_height / (cos((cryst->gamma - 90) *
- PI_RAD))) - cell_min) + cell_min;
- if (cryst->planegroup > 8)
- cryst->a = cryst->b;
- else
- cryst->a = NRAND(cryst->win_width - cell_min) + cell_min;
- cryst->offset_w = (int) ((cryst->win_width - (cryst->a - cryst->b *
- sin((cryst->gamma - 90) *
- PI_RAD))) / 2.0);
- }
- cryst->offset_h = (int) ((cryst->win_height - cryst->b * cos((
- cryst->gamma - 90) * PI_RAD)) / 2.0);
- if (!centre) {
- int n2 = (2 * cryst->offset_h);
- if (cryst->offset_h > 0)
- cryst->offset_h = NRAND(n2);
- cryst->offset_w = (int) (cryst->win_width - cryst->a -
- cryst->b *
- fabs(sin((cryst->gamma - 90) * PI_RAD)));
- if (cryst->gamma > 90.0) {
- if (cryst->offset_w > 0)
- cryst->offset_w = NRAND(cryst->offset_w) +
- (int) (cryst->b * sin((cryst->gamma - 90) * PI_RAD));
- else
- cryst->offset_w = (int) (cryst->b * sin((cryst->gamma - 90) *
- PI_RAD));
- } else if (cryst->offset_w > 0)
- cryst->offset_w = NRAND(cryst->offset_w);
- else
- cryst->offset_w = 0;
- }
- }
-
- size_atom = min((int) ((float) (cryst->a) / 40.) + 1,
- (int) ((float) (cryst->b) / 40.) + 1);
- if (MI_SIZE(mi) < size_atom) {
- if (MI_SIZE(mi) < -size_atom)
- size_atom = -size_atom;
- else
- size_atom = MI_SIZE(mi);
- }
- cryst->a = cryst->a / cryst->nx;
- cryst->b = cryst->b / cryst->ny;
- if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
-/* Set up colour map */
- if (cryst->colors && cryst->ncolors && !cryst->no_colors)
- free_colors(mi->xgwa.screen, cryst->cmap,
- cryst->colors, cryst->ncolors);
- if (cryst->colors)
- (void) free((void *) cryst->colors);
- cryst->colors = 0;
- cryst->ncolors = MI_NCOLORS(mi);
- if (cryst->ncolors < 2)
- cryst->ncolors = 2;
- if (cryst->ncolors <= 2)
- cryst->mono_p = True;
- else
- cryst->mono_p = False;
-
- if (cryst->mono_p)
- cryst->colors = 0;
- else
- cryst->colors = (XColor *) malloc(sizeof (*cryst->colors) * (cryst->ncolors + 1));
- cryst->cycle_p = has_writable_cells(mi->xgwa.screen, MI_VISUAL(mi));
- if (cryst->cycle_p) {
- if (MI_IS_FULLRANDOM(mi)) {
- if (!NRAND(8))
- cryst->cycle_p = False;
- else
- cryst->cycle_p = True;
- } else {
- cryst->cycle_p = cycle_p;
- }
- }
- if (!cryst->mono_p) {
- if (!(LRAND() % 10))
- make_random_colormap(mi->xgwa.screen, MI_VISUAL(mi),
- cryst->cmap, cryst->colors,
- &cryst->ncolors,
- True, True, &cryst->cycle_p, True);
- else if (!(LRAND() % 2))
- make_uniform_colormap(mi->xgwa.screen, MI_VISUAL(mi),
- cryst->cmap, cryst->colors,
- &cryst->ncolors, True,
- &cryst->cycle_p, True);
- else
- make_smooth_colormap(mi->xgwa.screen, MI_VISUAL(mi),
- cryst->cmap, cryst->colors,
- &cryst->ncolors,
- True, &cryst->cycle_p, True);
- }
-#if 0 /* #### wrong! -jwz */
- XInstallColormap(display, cryst->cmap);
-#endif
- if (cryst->ncolors < 2) {
- cryst->ncolors = 2;
- cryst->no_colors = True;
- } else
- cryst->no_colors = False;
- if (cryst->ncolors <= 2)
- cryst->mono_p = True;
-
- if (cryst->mono_p)
- cryst->cycle_p = False;
-
- }
- for (i = 0; i < cryst->num_atom; i++) {
- crystalatom *atom0;
-
- atom0 = &cryst->atom[i];
- if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
- if (cryst->ncolors > 2)
- atom0->colour = NRAND(cryst->ncolors - 2) + 2;
- else
- atom0->colour = 1; /* Just in case */
- } else {
- if (MI_NPIXELS(mi) > 2)
- atom0->colour = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
- else
- atom0->colour = 1; /*Xor'red so WHITE may not be appropriate */
- }
- atom0->x0 = NRAND(cryst->a);
- atom0->y0 = NRAND(cryst->b);
- atom0->velocity[0] = NRAND(7) - 3;
- atom0->velocity[1] = NRAND(7) - 3;
- atom0->velocity_a = (NRAND(7) - 3) * PI_RAD;
- atom0->angle = NRAND(90) * PI_RAD;
- atom0->at_type = NRAND(3);
- if (size_atom == 0)
- atom0->size_at = DEF_SIZ_ATOM;
- else if (size_atom > 0)
- atom0->size_at = size_atom;
- else
- atom0->size_at = NRAND(-size_atom) + 1;
- atom0->size_at++;
- if (atom0->at_type == 2)
- atom0->num_point = 3;
- else
- atom0->num_point = 4;
- crystal_setupatom(atom0, cryst->gamma);
- }
- XSetFunction(display, cryst->gc, GXcopy);
-
- if (MI_NPIXELS(mi) > 2)
- cryst->grid_pixel = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
- else
- cryst->grid_pixel = MI_WHITE_PIXEL(mi);
-
- cryst->inx = NRAND(cryst->nx);
- cryst->iny = NRAND(cryst->ny);
-
-}
-
-XSCREENSAVER_MODULE ("Crystal", crystal)
diff --git a/hacks/crystal.man b/hacks/crystal.man
deleted file mode 100644
index b56e1cc..0000000
--- a/hacks/crystal.man
+++ /dev/null
@@ -1,81 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-crystal \- kaleidescope.
-.SH SYNOPSIS
-.B crystal
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-grid]
-[\-no-cell]
-[\-centre]
-[\-nx \fInumber\fP]
-[\-ny \fInumber\fP]
-[\-count \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Moving polygons, similar to a kaleidescope (more like a kaleidescope than
-the hack called `kaleid,' actually.)
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-grid | \-no-grid
-Whether to draw grid.
-.TP 8
-.B \-cell | \-no-cell
-Whether to draw the cell.
-.TP 8
-.B \-centre | \-no-centre
-Whether to center on screen
-.TP 8
-.B \-nx \fInumber\fP
-Horizontal Symmetries. -10 - 10. Default: -3.
-.TP 8
-.B \-ny \fInumber\fP
-Vertical Symmetries. -10 - 10. Default: -3.
-.TP 8
-.B \-count \fInumber\fP
-Count. -5000 - 5000. Default: -500.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 60000 (0.06 seconds.).
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 100.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jouk Jansen. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jouk Jansen.
diff --git a/hacks/cwaves.c b/hacks/cwaves.c
deleted file mode 100644
index 3b93bb7..0000000
--- a/hacks/cwaves.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* xscreensaver, Copyright (c) 2007-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * cwaves -- languid sinusoidal colors.
- */
-
-#include "screenhack.h"
-#include <stdio.h>
-#include "ximage-loader.h"
-
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-typedef struct {
- double scale;
- double offset;
- double delta;
-} wave;
-
-typedef struct {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- GC gc;
- int delay;
- int scale;
- int ncolors;
- XColor *colors;
-
- int nwaves;
- wave *waves;
- int debug_p;
-
-} state;
-
-
-static void *
-cwaves_init (Display *dpy, Window window)
-{
- int i;
- XGCValues gcv;
- state *st = (state *) calloc (1, sizeof (*st));
-
- st->dpy = dpy;
- st->window = window;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- st->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
- /* Xft uses 'scale' */
- st->scale = get_integer_resource (dpy, "waveScale", "Integer");
- if (st->scale <= 0) st->scale = 1;
- st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
- if (st->ncolors < 4) st->ncolors = 4;
- st->colors = (XColor *) malloc (sizeof(*st->colors) * (st->ncolors+1));
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors,
- True, 0, False);
-
- st->gc = XCreateGC (st->dpy, st->window, 0, &gcv);
- st->delay = get_integer_resource (dpy, "delay", "Integer");
-
- st->nwaves = get_integer_resource (dpy, "nwaves", "Integer");
- st->waves = (wave *) calloc (st->nwaves, sizeof(*st->waves));
-
- for (i = 0; i < st->nwaves; i++)
- {
- st->waves[i].scale = frand(0.03) + 0.005;
- st->waves[i].offset = frand(M_PI);
- st->waves[i].delta = (BELLRAND(2)-1) / 15.0;
- }
-
- return st;
-}
-
-
-static unsigned long
-cwaves_draw (Display *dpy, Window window, void *closure)
-{
- state *st = (state *) closure;
- int i, x;
-
- for (i = 0; i < st->nwaves; i++)
- st->waves[i].offset += st->waves[i].delta;
-
- for (x = 0; x < st->xgwa.width; x += st->scale)
- {
- double v = 0;
- int j;
- for (i = 0; i < st->nwaves; i++)
- v += cos ((x * st->waves[i].scale) - st->waves[i].offset);
- v /= st->nwaves;
-
- j = st->ncolors * (v/2 + 0.5);
- if (j < 0 || j >= st->ncolors) abort();
- XSetForeground (st->dpy, st->gc, st->colors[j].pixel);
- XFillRectangle (st->dpy, st->window, st->gc,
- x, 0, st->scale, st->xgwa.height);
- }
-
- if (st->debug_p)
- {
- int wh = (st->xgwa.height / (st->nwaves + 1)) * 0.9;
- int i;
- XSetLineAttributes (st->dpy, st->gc, 2, LineSolid, CapRound, JoinRound);
- XSetForeground (st->dpy, st->gc, BlackPixelOfScreen (st->xgwa.screen));
- for (i = 0; i < st->nwaves; i++)
- {
- int y = st->xgwa.height * i / (st->nwaves + 1);
- int ox = -1, oy = -1;
-
- for (x = 0; x < st->xgwa.width; x += st->scale)
- {
- int yy;
- double v = 0;
- v = cos ((x * st->waves[i].scale) - st->waves[i].offset);
- v /= 2;
-
- yy = y + wh/2 + (wh * v);
- if (ox == -1)
- ox = x, oy = yy;
- XDrawLine (st->dpy, st->window, st->gc, ox, oy, x, yy);
- ox = x;
- oy = yy;
- }
- }
-
- {
- int y = st->xgwa.height * i / (st->nwaves + 1);
- int ox = -1, oy = -1;
-
- for (x = 0; x < st->xgwa.width; x += st->scale)
- {
- int yy;
- double v = 0;
- for (i = 0; i < st->nwaves; i++)
- v += cos ((x * st->waves[i].scale) - st->waves[i].offset);
- v /= st->nwaves;
- v /= 2;
-
- yy = y + wh/2 + (wh * v);
- if (ox == -1)
- ox = x, oy = yy;
- XDrawLine (st->dpy, st->window, st->gc, ox, oy, x, yy);
- ox = x;
- oy = yy;
- }
- }
- }
-
- return st->delay;
-}
-
-
-static void
-cwaves_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- state *st = (state *) closure;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-}
-
-static Bool
-cwaves_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- state *st = (state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap,
- st->colors, &st->ncolors,
- True, 0, False);
- return True;
- }
- return False;
-}
-
-static void
-cwaves_free (Display *dpy, Window window, void *closure)
-{
- state *st = (state *) closure;
- XFreeGC (dpy, st->gc);
- free (st->colors);
- free (st->waves);
- free (st);
-}
-
-
-static const char *cwaves_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*ncolors: 600",
- "*nwaves: 15",
- "*waveScale: 2",
- "*debug: False",
- "*delay: 20000",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec cwaves_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-waves", ".nwaves", XrmoptionSepArg, 0 },
- { "-colors", ".ncolors", XrmoptionSepArg, 0 },
- { "-scale", ".waveScale", XrmoptionSepArg, 0 },
- { "-debug", ".debug", XrmoptionNoArg, "True" },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("CWaves", cwaves)
diff --git a/hacks/cwaves.man b/hacks/cwaves.man
deleted file mode 100644
index 9247eb8..0000000
--- a/hacks/cwaves.man
+++ /dev/null
@@ -1,76 +0,0 @@
-.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
-.SH NAME
-cwaves \- languid sinusoidal colors
-.SH SYNOPSIS
-.B cwaves
-[\-display \fIhost:display.screen\fP]
-[\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP]
-[\-window]
-[\-root]
-[\-mono]
-[\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-waves \fIint\fP]
-[\-colors \fIint\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIcwaves\fP program draws a languidly-scrolling vertical field
-of sinusoidal colors.
-.SH OPTIONS
-.I cwaves
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 20000, or about 1/50th second.
-.TP 8
-.B \-waves \fIint\fP
-How many cosines to add together. The more waves, the more complex
-the apparent motion.
-.TP 8
-.B \-colors \fIint\fP
-How many colors to use. Default 800. The more colors, the smoother the
-blending will be.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 2-Jul-2007.
diff --git a/hacks/cynosure.c b/hacks/cynosure.c
deleted file mode 100644
index 3eaa397..0000000
--- a/hacks/cynosure.c
+++ /dev/null
@@ -1,448 +0,0 @@
-/* cynosure --- draw some rectangles
- *
- * 01-aug-96: written in Java by ozymandias G desiderata <ogd@organic.com>
- * 25-dec-97: ported to C and XScreenSaver by Jamie Zawinski <jwz@jwz.org>
- *
- * Original version:
- * http://www.organic.com/staff/ogd/java/cynosure.html
- * http://www.organic.com/staff/ogd/java/source/cynosure/Cynosure-java.txt
- *
- * Original comments and copyright:
- *
- * Cynosure.java
- * A Java implementation of Stephen Linhart's Cynosure screen-saver as a
- * drop-in class.
- *
- * Header: /home/ogd/lib/cvs/aoaioxxysz/graphics/Cynosure.java,v 1.2 1996/08/02 02:41:21 ogd Exp
- *
- * ozymandias G desiderata <ogd@organic.com>
- * Thu Aug 1 1996
- *
- * COPYRIGHT NOTICE
- *
- * Copyright 1996 ozymandias G desiderata. Title, ownership rights, and
- * intellectual property rights in and to this software remain with
- * ozymandias G desiderata. This software may be copied, modified,
- * or used as long as this copyright is retained. Use this code at your
- * own risk.
- *
- * Revision: 1.2
- *
- * Log: Cynosure.java,v
- * Revision 1.2 1996/08/02 02:41:21 ogd
- * Added a few more comments, fixed messed-up header.
- *
- * Revision 1.1.1.1 1996/08/02 02:30:45 ogd
- * First version
- */
-
-#include "screenhack.h"
-
-/* #define DO_STIPPLE */
-
-struct state {
- Display *dpy;
- Window window;
-
- XColor *colors;
- int ncolors;
-
-#ifndef DO_STIPPLE
- XColor *colors2;
- int ncolors2;
-#endif
-
- int fg_pixel, bg_pixel;
- GC fg_gc, bg_gc, shadow_gc;
-
- int curColor;
- int curBase; /* color progression */
- int shadowWidth;
- int elevation; /* offset of dropshadow */
- int sway; /* time until base color changed */
- int timeLeft; /* until base color used */
- int tweak; /* amount of color variance */
- int gridSize;
- int iterations, i, delay;
- XWindowAttributes xgwa;
-};
-
-
-/**
- * The smallest size for an individual cell.
- **/
-#define MINCELLSIZE 16
-
-/**
- * The narrowest a rectangle can be.
- **/
-#define MINRECTSIZE 6
-
-/**
- * Every so often genNewColor() generates a completely random
- * color. This variable sets how frequently that happens. It's
- * currently set to happen 1% of the time.
- *
- * @see #genNewColor
- **/
-#define THRESHOLD 100 /*0.01*/
-
-static void paint(struct state *st);
-static int genNewColor(struct state *st);
-static int genConstrainedColor(struct state *st, int base, int tweak);
-static int c_tweak(struct state *st, int base, int tweak);
-
-
-static void *
-cynosure_init (Display *d, Window w)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
-
- st->dpy = d;
- st->window = w;
-
- st->curColor = 0;
- st->curBase = st->curColor;
- st->shadowWidth = get_integer_resource (st->dpy, "shadowWidth", "Integer");
- st->elevation = get_integer_resource (st->dpy, "elevation", "Integer");
- st->sway = get_integer_resource (st->dpy, "sway", "Integer");
- st->tweak = get_integer_resource (st->dpy, "tweak", "Integer");
- st->gridSize = get_integer_resource (st->dpy, "gridSize", "Integer");
- st->timeLeft = 0;
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
- if (st->ncolors < 2) st->ncolors = 2;
- if (st->ncolors <= 2) mono_p = True;
-
- if (mono_p)
- st->colors = 0;
- else
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
-
- if (mono_p)
- ;
- else {
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors,
- True, 0, True);
- if (st->ncolors <= 2) {
- mono_p = True;
- st->ncolors = 2;
- if (st->colors) free(st->colors);
- st->colors = 0;
- }
- }
-
- st->bg_pixel = get_pixel_resource(st->dpy,
- st->xgwa.colormap, "background", "Background");
- st->fg_pixel = get_pixel_resource(st->dpy,
- st->xgwa.colormap, "foreground", "Foreground");
-
- gcv.foreground = st->fg_pixel;
- st->fg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
- gcv.foreground = st->bg_pixel;
- st->bg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
-
-#ifdef DO_STIPPLE
- gcv.fill_style = FillStippled;
- gcv.stipple = XCreateBitmapFromData(st->dpy, st->window, "\125\252", 8, 2);
- st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground|GCFillStyle|GCStipple, &gcv);
- XFreePixmap(st->dpy, gcv.stipple);
-
-#else /* !DO_STIPPLE */
- st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
-
-# ifdef HAVE_JWXYZ /* allow non-opaque alpha components in pixel values */
- jwxyz_XSetAlphaAllowed (st->dpy, st->shadow_gc, True);
-# endif
-
- if (st->colors)
- {
- int i;
- st->ncolors2 = st->ncolors;
- st->colors2 = (XColor *) malloc(sizeof(*st->colors2) * (st->ncolors2+1));
-
- for (i = 0; i < st->ncolors2; i++)
- {
-# ifdef HAVE_JWXYZ
- /* give a non-opaque alpha to the shadow colors */
- unsigned long pixel = st->colors[i].pixel;
- unsigned long amask = BlackPixelOfScreen (st->xgwa.screen);
- unsigned long a = (0x77777777 & amask);
- pixel = (pixel & (~amask)) | a;
- st->colors2[i].pixel = pixel;
-# else /* !HAVE_JWXYZ */
- int h;
- double s, v;
- rgb_to_hsv (st->colors[i].red,
- st->colors[i].green,
- st->colors[i].blue,
- &h, &s, &v);
- v *= 0.4;
- hsv_to_rgb (h, s, v,
- &st->colors2[i].red,
- &st->colors2[i].green,
- &st->colors2[i].blue);
- st->colors2[i].pixel = st->colors[i].pixel;
- XAllocColor (st->dpy, st->xgwa.colormap, &st->colors2[i]);
-# endif /* !HAVE_JWXYZ */
- }
- }
-# endif /* !DO_STIPPLE */
-
- st->delay = get_integer_resource (st->dpy, "delay", "Delay");
- st->iterations = get_integer_resource (st->dpy, "iterations", "Iterations");
-
- return st;
-}
-
-static unsigned long
-cynosure_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- if (st->iterations > 0 && ++st->i >= st->iterations)
- {
- st->i = 0;
- if (!mono_p)
- XSetWindowBackground(st->dpy, st->window,
- st->colors[random() % st->ncolors].pixel);
- XClearWindow(st->dpy, st->window);
- }
- paint(st);
-
- return st->delay;
-}
-
-
-/**
- * paint adds a new layer of multicolored rectangles within a grid of
- * randomly generated size. Each row of rectangles is the same color,
- * but colors vary slightly from row to row. Each rectangle is placed
- * within a regularly-sized cell, but each rectangle is sized and
- * placed randomly within that cell.
- *
- * @param g the Graphics coordinate in which to draw
- * @see #genNewColor
- **/
-static void paint(struct state *st)
-{
- int i;
- int cellsWide, cellsHigh, cellWidth, cellHeight;
- int width = st->xgwa.width;
- int height = st->xgwa.height;
-
- /* How many cells wide the grid is (equal to gridSize +/- (gridSize / 2))
- */
- cellsWide = c_tweak(st, st->gridSize, st->gridSize / 2);
- /* How many cells high the grid is (equal to gridSize +/- (gridSize / 2))
- */
- cellsHigh = c_tweak(st, st->gridSize, st->gridSize / 2);
- /* How wide each cell in the grid is */
- cellWidth = width / cellsWide;
- /* How tall each cell in the grid is */
- cellHeight = height / cellsHigh;
-
- /* Ensure that each cell is above a certain minimum size */
-
- if (cellWidth < MINCELLSIZE) {
- cellWidth = MINCELLSIZE;
- cellsWide = width / cellWidth;
- }
-
- if (cellHeight < MINCELLSIZE) {
- cellHeight = MINCELLSIZE;
- cellsHigh = width / cellWidth;
- }
-
- /* fill the grid with randomly-generated cells */
- for(i = 0; i < cellsHigh; i++) {
- int j;
-
- /* Each row is a different color, randomly generated (but constrained) */
- if (!mono_p)
- {
- int c = genNewColor(st);
- XSetForeground(st->dpy, st->fg_gc, st->colors[c].pixel);
-# ifndef DO_STIPPLE
- if (st->colors2)
- XSetForeground(st->dpy, st->shadow_gc, st->colors2[c].pixel);
-# endif
- }
-
- for(j = 0; j < cellsWide; j++) {
- int curWidth, curHeight, curX, curY;
-
- /* Generate a random height for a rectangle and make sure that */
- /* it's above a certain minimum size */
- curHeight = random() % (cellHeight - st->shadowWidth);
- if (curHeight < MINRECTSIZE)
- curHeight = MINRECTSIZE;
- /* Generate a random width for a rectangle and make sure that
- it's above a certain minimum size */
- curWidth = random() % (cellWidth - st->shadowWidth);
- if (curWidth < MINRECTSIZE)
- curWidth = MINRECTSIZE;
- /* Figure out a random place to locate the rectangle within the
- cell */
- curY = (i * cellHeight) + (random() % ((cellHeight - curHeight) -
- st->shadowWidth));
- curX = (j * cellWidth) + (random() % ((cellWidth - curWidth) -
- st->shadowWidth));
-
- /* Draw the shadow */
- if (st->elevation > 0)
- XFillRectangle(st->dpy, st->window, st->shadow_gc,
- curX + st->elevation, curY + st->elevation,
- curWidth, curHeight);
-
- /* Draw the edge */
- if (st->shadowWidth > 0)
- XFillRectangle(st->dpy, st->window, st->bg_gc,
- curX + st->shadowWidth, curY + st->shadowWidth,
- curWidth, curHeight);
-
- XFillRectangle(st->dpy, st->window, st->fg_gc, curX, curY, curWidth, curHeight);
-
- /* Draw a 1-pixel black border around the rectangle */
- XDrawRectangle(st->dpy, st->window, st->bg_gc, curX, curY, curWidth, curHeight);
- }
-
- }
-}
-
-
-/**
- * genNewColor returns a new color, gradually mutating the colors and
- * occasionally returning a totally random color, just for variety.
- *
- * @return the new color
- **/
-static int genNewColor(struct state *st)
-{
- /* These lines handle "sway", or the gradual random changing of */
- /* colors. After genNewColor() has been called a given number of */
- /* times (specified by a random permutation of the tweak variable), */
- /* take whatever color has been most recently randomly generated and */
- /* make it the new base color. */
- if (st->timeLeft == 0) {
- st->timeLeft = c_tweak(st, st->sway, st->sway / 3);
- st->curColor = st->curBase;
- } else {
- st->timeLeft--;
- }
-
- /* If a randomly generated number is less than the threshold value,
- produce a "sport" color value that is completely unrelated to the
- current palette. */
- if (0 == (random() % THRESHOLD)) {
- return (random() % st->ncolors);
- } else {
- st->curBase = genConstrainedColor(st, st->curColor, st->tweak);
- return st->curBase;
- }
-
-}
-
-/**
- * genConstrainedColor creates a random new color within a certain
- * range of an existing color. Right now this works with RGB color
- * values, but a future version of the program will most likely use HSV
- * colors, which should generate a more pleasing progression of values.
- *
- * @param base the color on which the new color will be based
- * @param tweak the amount that the new color can be tweaked
- * @return a new constrained color
- * @see #genNewColor
- **/
-static int genConstrainedColor(struct state *st, int base, int tweak)
-{
- int i = 1 + (random() % st->tweak);
- if (random() & 1)
- i = -i;
- i = (base + i) % st->ncolors;
- while (i < 0)
- i += st->ncolors;
- return i;
-}
-
-/**
- * Utility function to generate a tweaked color value
- *
- * @param base the byte value on which the color is based
- * @param tweak the amount the value will be skewed
- * @see #tweak
- * @return the tweaked byte
- **/
-static int c_tweak(struct state *st, int base, int tweak)
-{
- int ranTweak = (random() % (2 * tweak));
- int n = (base + (ranTweak - tweak));
- if (n < 0) n = -n;
- return (n < 255 ? n : 255);
-}
-
-static void
-cynosure_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->xgwa.width = w;
- st->xgwa.height = h;
-}
-
-static Bool
-cynosure_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->i = st->iterations;
- return True;
- }
- return False;
-}
-
-static void
-cynosure_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->fg_gc);
- XFreeGC (dpy, st->bg_gc);
- XFreeGC (dpy, st->shadow_gc);
- if (st->colors) free (st->colors);
- if (st->colors2) free (st->colors2);
- free (st);
-}
-
-
-static const char *cynosure_defaults [] = {
- ".background: black",
- ".foreground: white",
- ".lowrez: true",
- "*fpsSolid: true",
- "*delay: 500000",
- "*colors: 128",
- "*iterations: 100",
- "*shadowWidth: 2",
- "*elevation: 5",
- "*sway: 30",
- "*tweak: 20",
- "*gridSize: 12",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec cynosure_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-ncolors", ".colors", XrmoptionSepArg, 0 },
- { "-iterations", ".iterations", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Cynosure", cynosure)
diff --git a/hacks/cynosure.man b/hacks/cynosure.man
deleted file mode 100644
index fd97fa6..0000000
--- a/hacks/cynosure.man
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cynosure \- gentle overlapping squares screen saver.
-.SH SYNOPSIS
-.B cynosure
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-iterations \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-A hack similar to `greynetic', but less frenetic. The first implementation
-was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet
-clone. That clone was discovered by Jamie Zawinski, and ported to C for
-inclusion here.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 500000 (0.50 seconds.).
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 128.
-.TP 8
-.B \-iterations \fInumber\fP
-Duration. 2 - 200. Default: 100.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Stephen Linhart, Ozymandias G. Desiderata, and
-Jamie Zawinski. Permission to use, copy, modify, distribute, and sell
-this software and its documentation for any purpose is hereby granted
-without fee, provided that the above copyright notice appear in all
-copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about
-the suitability of this software for any purpose. It is provided "as
-is" without express or implied warranty.
-.SH AUTHOR
-Stephen Linhart, Ozymandias G. Desiderata, and Jamie Zawinski.
diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c
deleted file mode 100644
index 6b2a4cb..0000000
--- a/hacks/decayscreen.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* decayscreen
- *
- * Based on slidescreen program from the xscreensaver application and the
- * decay program for Sun framebuffers. This is the comment from the decay.c
- * file:
-
- * decay.c
- * find the screen bitmap for the console and make it "decay" by
- * randomly shifting random rectangles by one pixelwidth at a time.
- *
- * by David Wald, 1988
- * rewritten by Natuerlich!
- * based on a similar "utility" on the Apollo ring at Yale.
-
- * X version by
- *
- * Vivek Khera <khera@cs.duke.edu>
- * 5-AUG-1993
- *
- * Hacked by jwz, 28-Nov-97 (sped up and added new motion directions)
-
- * R. Schultz
- * Added "melt" & "stretch" modes 28-Mar-1999
- *
- */
-
-#include "screenhack.h"
-#include <time.h>
-
-struct state {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- Pixmap saved;
- int saved_w, saved_h;
-
- int sizex, sizey;
- int delay;
- int duration;
- GC gc;
- int mode;
- int random_p;
- time_t start_time;
-
- int fuzz_toggle;
- const int *current_bias;
-
- async_load_state *img_loader;
-};
-
-
-#define SHUFFLE 0
-#define UP 1
-#define LEFT 2
-#define RIGHT 3
-#define DOWN 4
-#define UPLEFT 5
-#define DOWNLEFT 6
-#define UPRIGHT 7
-#define DOWNRIGHT 8
-#define IN 9
-#define OUT 10
-#define MELT 11
-#define STRETCH 12
-#define FUZZ 13
-
-static void
-decayscreen_load_image (struct state *st)
-{
- XWindowAttributes xgwa;
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- st->sizex = xgwa.width;
- st->sizey = xgwa.height;
- if (st->img_loader) abort();
-
- st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
- st->window, 0, 0);
-}
-
-static void *
-decayscreen_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- long gcflags;
- unsigned long bg;
- char *s;
-
- st->dpy = dpy;
- st->window = window;
- st->random_p = 0;
-
- s = get_string_resource(st->dpy, "mode", "Mode");
- if (s && !strcmp(s, "shuffle")) st->mode = SHUFFLE;
- else if (s && !strcmp(s, "up")) st->mode = UP;
- else if (s && !strcmp(s, "left")) st->mode = LEFT;
- else if (s && !strcmp(s, "right")) st->mode = RIGHT;
- else if (s && !strcmp(s, "down")) st->mode = DOWN;
- else if (s && !strcmp(s, "upleft")) st->mode = UPLEFT;
- else if (s && !strcmp(s, "downleft")) st->mode = DOWNLEFT;
- else if (s && !strcmp(s, "upright")) st->mode = UPRIGHT;
- else if (s && !strcmp(s, "downright")) st->mode = DOWNRIGHT;
- else if (s && !strcmp(s, "in")) st->mode = IN;
- else if (s && !strcmp(s, "out")) st->mode = OUT;
- else if (s && !strcmp(s, "melt")) st->mode = MELT;
- else if (s && !strcmp(s, "stretch")) st->mode = STRETCH;
- else if (s && !strcmp(s, "fuzz")) st->mode = FUZZ;
- else {
- if (s && *s && !!strcmp(s, "random"))
- fprintf(stderr, "%s: unknown mode %s\n", progname, s);
- st->random_p = 1;
- st->mode = random() % (FUZZ+1);
- }
- if (s) free (s);
-
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- if (st->delay < 0) st->delay = 0;
-
- st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
- if (st->duration < 1) st->duration = 1;
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- gcv.function = GXcopy;
- gcv.subwindow_mode = IncludeInferiors;
- bg = get_pixel_resource (st->dpy, st->xgwa.colormap, "background", "Background");
- gcv.foreground = bg;
-
- gcflags = GCForeground | GCFunction;
- if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */
- gcflags |= GCSubwindowMode;
- st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
-
- st->start_time = time ((time_t *) 0);
- decayscreen_load_image (st);
-
- return st;
-}
-
-
-/*
- * perform one iteration of decay
- */
-static unsigned long
-decayscreen_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int left, top, width, height, toleft, totop;
-
-#define L 101
-#define R 102
-#define U 103
-#define D 104
- static const int no_bias[] = { L,L,L,L, R,R,R,R, U,U,U,U, D,D,D,D };
- static const int up_bias[] = { L,L,L,L, R,R,R,R, U,U,U,U, U,U,D,D };
- static const int down_bias[] = { L,L,L,L, R,R,R,R, U,U,D,D, D,D,D,D };
- static const int left_bias[] = { L,L,L,L, L,L,R,R, U,U,U,U, D,D,D,D };
- static const int right_bias[] = { L,L,R,R, R,R,R,R, U,U,U,U, D,D,D,D };
-
- static const int upleft_bias[] = { L,L,L,L, L,R,R,R, U,U,U,U, U,D,D,D };
- static const int downleft_bias[] = { L,L,L,L, L,R,R,R, U,U,U,D, D,D,D,D };
- static const int upright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,U, U,D,D,D };
- static const int downright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,D, D,D,D,D };
-
- int off = 1;
- if (st->sizex > 2560) off *= 2; /* Retina displays */
-
- if (st->img_loader) /* still loading */
- {
- st->img_loader = load_image_async_simple (st->img_loader,
- 0, 0, 0, 0, 0);
- if (! st->img_loader) { /* just finished */
-
- st->start_time = time ((time_t *) 0);
- if (st->random_p)
- st->mode = random() % (FUZZ+1);
-
- if (st->mode == MELT || st->mode == STRETCH)
- /* make sure screen eventually turns background color */
- XDrawLine (st->dpy, st->window, st->gc, 0, 0, st->sizex, 0);
-
- if (!st->saved) {
- st->saved = XCreatePixmap (st->dpy, st->window,
- st->sizex, st->sizey,
- st->xgwa.depth);
- st->saved_w = st->sizex;
- st->saved_h = st->sizey;
- }
- XCopyArea (st->dpy, st->window, st->saved, st->gc, 0, 0,
- st->sizex, st->sizey, 0, 0);
- }
- return st->delay;
- }
-
- if (!st->img_loader &&
- st->start_time + st->duration < time ((time_t *) 0)) {
- decayscreen_load_image (st);
- }
-
- switch (st->mode) {
- case SHUFFLE: st->current_bias = no_bias; break;
- case UP: st->current_bias = up_bias; break;
- case LEFT: st->current_bias = left_bias; break;
- case RIGHT: st->current_bias = right_bias; break;
- case DOWN: st->current_bias = down_bias; break;
- case UPLEFT: st->current_bias = upleft_bias; break;
- case DOWNLEFT: st->current_bias = downleft_bias; break;
- case UPRIGHT: st->current_bias = upright_bias; break;
- case DOWNRIGHT: st->current_bias = downright_bias; break;
- case IN: st->current_bias = no_bias; break;
- case OUT: st->current_bias = no_bias; break;
- case MELT: st->current_bias = no_bias; break;
- case STRETCH: st->current_bias = no_bias; break;
- case FUZZ: st->current_bias = no_bias; break;
- default: abort();
- }
-
-#define nrnd(x) ((x) ? random() % (x) : x)
-
- if (st->mode == MELT || st->mode == STRETCH) {
- left = nrnd(st->sizex/2);
- top = nrnd(st->sizey);
- width = nrnd( st->sizex/2 ) + st->sizex/2 - left;
- height = nrnd(st->sizey - top);
- toleft = left;
- totop = top+off;
-
- } else if (st->mode == FUZZ) { /* By Vince Levey <vincel@vincel.org>;
- inspired by the "melt" mode of the
- "scrhack" IrisGL program by Paul Haeberli
- circa 1991. */
- left = nrnd(st->sizex - 1);
- top = nrnd(st->sizey - 1);
- st->fuzz_toggle = !st->fuzz_toggle;
- if (st->fuzz_toggle)
- {
- totop = top;
- height = off;
- toleft = nrnd(st->sizex - 1);
- if (toleft > left)
- {
- width = toleft-left;
- toleft = left;
- left++;
- }
- else
- {
- width = left-toleft;
- left = toleft;
- toleft++;
- }
- }
- else
- {
- toleft = left;
- width = off;
- totop = nrnd(st->sizey - 1);
- if (totop > top)
- {
- height = totop-top;
- totop = top;
- top++;
- }
- else
- {
- height = top-totop;
- top = totop;
- totop++;
- }
- }
-
- } else {
-
- left = nrnd(st->sizex - 1);
- top = nrnd(st->sizey);
- width = nrnd(st->sizex - left);
- height = nrnd(st->sizey - top);
-
- toleft = left;
- totop = top;
- if (st->mode == IN || st->mode == OUT) {
- int x = left+(width/2);
- int y = top+(height/2);
- int cx = st->sizex/2;
- int cy = st->sizey/2;
- if (st->mode == IN) {
- if (x > cx && y > cy) st->current_bias = upleft_bias;
- else if (x < cx && y > cy) st->current_bias = upright_bias;
- else if (x < cx && y < cy) st->current_bias = downright_bias;
- else /* (x > cx && y < cy)*/ st->current_bias = downleft_bias;
- } else {
- if (x > cx && y > cy) st->current_bias = downright_bias;
- else if (x < cx && y > cy) st->current_bias = downleft_bias;
- else if (x < cx && y < cy) st->current_bias = upleft_bias;
- else /* (x > cx && y < cy)*/ st->current_bias = upright_bias;
- }
- }
-
- switch (st->current_bias[random() % (sizeof(no_bias)/sizeof(*no_bias))]) {
- case L: toleft = left-off; break;
- case R: toleft = left+off; break;
- case U: totop = top-off; break;
- case D: totop = top+off; break;
- default: abort(); break;
- }
- }
-
- if (st->mode == STRETCH) {
- XCopyArea (st->dpy, st->window, st->window, st->gc,
- 0, st->sizey-top-off*2, st->sizex, top+off,
- 0, st->sizey-top-off);
- } else {
- XCopyArea (st->dpy, st->window, st->window, st->gc,
- left, top, width, height,
- toleft, totop);
- }
-
-#undef nrnd
-
- return st->delay;
-}
-
-static void
-decayscreen_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- if (! st->saved) return; /* Image might not be loaded yet */
- XClearWindow (st->dpy, st->window);
- XCopyArea (st->dpy, st->saved, st->window, st->gc,
- 0, 0, st->saved_w, st->saved_h,
- ((int)w - st->saved_w) / 2,
- ((int)h - st->saved_h) / 2);
- st->sizex = w;
- st->sizey = h;
-}
-
-static Bool
-decayscreen_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->start_time = 0;
- return True;
- }
- return False;
-}
-
-static void
-decayscreen_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->gc);
- free (st);
-}
-
-
-
-static const char *decayscreen_defaults [] = {
- ".background: Black",
- ".foreground: Yellow",
- "*dontClearRoot: True",
- "*fpsSolid: True",
-
-#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
- "*visualID: Best",
-#endif
-
- "*delay: 10000",
- "*mode: random",
- "*duration: 120",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
- "*rotateImages: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec decayscreen_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("DecayScreen", decayscreen)
diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man
deleted file mode 100644
index 2272981..0000000
--- a/hacks/decayscreen.man
+++ /dev/null
@@ -1,92 +0,0 @@
-.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
-.SH NAME
-decayscreen \- make a screen meltdown.
-.SH SYNOPSIS
-.B decayscreen
-[\-display \fIhost:display.screen\fP]
-[\-window]
-[\-root]
-[\-mono]
-[\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-duration \fIsecs\fP]
-[\-mode \fImode\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIdecayscreen\fP program creates a melting effect by randomly
-shifting rectangles around the screen.
-
-The image that it manipulates will be grabbed from the portion of
-the screen underlying the window, or from the system's video input,
-or from a random file on disk, as indicated by
-the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
-and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
-file; see
-.BR xscreensaver\-settings (1)
-for more details.
-.SH OPTIONS
-.I decayscreen
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Slow it down.
-.TP 8
-.B \-duration \fIseconds\fP
-How long to run before loading a new image. Default 120 seconds.
-.TP 8
-.B \-mode \fImode\fP
-The direction in which the image should tend to slide. Legal values are
-\fIrandom\fP (meaning pick one), \fIup\fP, \fIleft\fP, \fIright\fP,
-\fIdown\fP, \fIupleft\fP, \fIdownleft\fP, \fIupright\fP, \fIdownright\fP,
-\fIshuffle\fP (meaning prefer no particular direction), \fIin\fP (meaning
-move things toward the center), \fIout\fP (meaning move things away
-from the center), \fImelt\fP (meaning melt straight
-downward), \fIstretch\fP (meaning stretch the screen downward),
-and \fIfuzz\fP (meaning go blurry instead of melty).
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH "SEE ALSO"
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright 1992 by Vivek Khera. Permission to use, copy, modify, distribute,
-and sell this software and its documentation for any purpose is hereby granted
-without fee, provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the suitability
-of this software for any purpose. It is provided "as is" without express or
-implied warranty.
-.SH AUTHOR
-Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on code by David Wald, 1988.
-Modified by jwz, 28-Nov-1997.
-Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
-Modified by Vince Levey <vincel@vincel.org> 25-Oct-2001.
diff --git a/hacks/deco.c b/hacks/deco.c
deleted file mode 100644
index cebed2c..0000000
--- a/hacks/deco.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Concept snarfed from Michael D. Bayne in
- * http://www.go2net.com/internet/deep/1997/04/16/body.html
- *
- * Changes by Lars Huttar, http://www.huttar.net:
- * - allow use of golden ratio for dividing rectangles instead of 1/2.
- * - allow smooth colors instead of random
- * - added line thickness setting
- * - added "Mondrian" mode
- * Other ideas:
- * - allow recomputing the colormap on each new frame (especially useful
- * when ncolors is low)
- */
-
-#include "screenhack.h"
-#include <stdio.h>
-
-struct state {
- XColor colors[255];
- int ncolors;
- int max_depth;
- int min_height;
- int min_width;
- int line_width;
- int old_line_width;
- Bool goldenRatio;
- Bool mondrian;
- Bool smoothColors;
-
- int delay;
- XWindowAttributes xgwa;
- GC fgc, bgc;
- int current_color;
-};
-
-/* Golden Ratio
- * Suppose you're dividing a rectangle of length A+B
- * into two parts, of length A and B respectively. You want the ratio of
- * A to B to be the same as the ratio of the whole (A+B) to A. The golden
- * ratio (phi) is that ratio. Supposed to be visually pleasing. */
-#define PHI 1.61803
-#define PHI1 (1.0/PHI)
-#define PHI2 (1.0 - PHI1)
-
-/* copied from make_random_colormap in colors.c */
-static void
-make_mondrian_colormap (Screen *screen, Visual *visual, Colormap cmap,
- XColor *colors, int *ncolorsP,
- Bool allocate_p,
- Bool *writable_pP,
- Bool verbose_p)
-{
- Display *dpy = DisplayOfScreen (screen);
- Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
- int ncolors = 8;
- int i;
-
- if (*ncolorsP <= 0) return;
-
- /* If this visual doesn't support writable cells, don't bother trying. */
- if (wanted_writable && !has_writable_cells(screen, visual))
- *writable_pP = False;
-
- for (i = 0; i < ncolors; i++)
- {
- colors[i].flags = DoRed|DoGreen|DoBlue;
- colors[i].red = 0;
- colors[i].green = 0;
- colors[i].blue = 0;
-
- switch(i) {
- case 0: case 1: case 2: case 3: case 7: /* white */
- colors[i].red = 0xE800;
- colors[i].green = 0xE800;
- colors[i].blue = 0xE800;
- break;
- case 4:
- colors[i].red = 0xCFFF; break; /* red */
- case 5:
- colors[i].red = 0x2000;
- colors[i].blue = 0xCFFF; break; /* blue */
- case 6:
- colors[i].red = 0xDFFF; /* yellow */
- colors[i].green = 0xCFFF; break;
- }
- }
-
- if (!allocate_p)
- return;
-
- RETRY_NON_WRITABLE:
- if (writable_pP && *writable_pP)
- {
- unsigned long *pixels = (unsigned long *)
- malloc(sizeof(*pixels) * (ncolors + 1));
-
- allocate_writable_colors (screen, cmap, pixels, &ncolors);
- if (ncolors > 0)
- for (i = 0; i < ncolors; i++)
- colors[i].pixel = pixels[i];
- free (pixels);
- if (ncolors > 0)
- XStoreColors (dpy, cmap, colors, ncolors);
- }
- else
- {
- for (i = 0; i < ncolors; i++)
- {
- XColor color;
- color = colors[i];
- if (!XAllocColor (dpy, cmap, &color))
- break;
- colors[i].pixel = color.pixel;
- }
- ncolors = i;
- }
-
- /* If we tried for writable cells and got none, try for non-writable. */
- if (allocate_p && ncolors == 0 && writable_pP && *writable_pP)
- {
- ncolors = *ncolorsP;
- *writable_pP = False;
- goto RETRY_NON_WRITABLE;
- }
-
-#if 0
- /* I don't think we need to bother copying or linking to the complain
- function. */
- if (verbose_p)
- complain(*ncolorsP, ncolors, wanted_writable,
- wanted_writable && *writable_pP);
-#endif
-
- *ncolorsP = ncolors;
-}
-
-static void
-mondrian_set_sizes (struct state *st, int w, int h)
-{
- if (w > h) {
- st->line_width = w/50;
- st->min_height = st->min_width = w/8;
- } else {
- st->line_width = h/50;
- st->min_height = st->min_width = h/8;
- }
-}
-
-static void
-deco (Display *dpy, Window window, struct state *st,
- int x, int y, int w, int h, int depth)
-{
- if (((random() % st->max_depth) < depth) || (w < st->min_width) || (h < st->min_height))
- {
- if (!mono_p)
- {
- if (++st->current_color >= st->ncolors)
- st->current_color = 0;
- XSetForeground(dpy, st->bgc, st->colors[st->current_color].pixel);
- }
- XFillRectangle (dpy, window, st->bgc, x, y, w, h);
- XDrawRectangle (dpy, window, st->fgc, x, y, w, h);
- }
- else
- {
- if ((st->goldenRatio || st->mondrian) ? (w > h) : (random() & 1))
- { /* Divide the rectangle side-by-side */
- int wnew = (st->goldenRatio ? (w * (random() & 1 ? PHI1 : PHI2)) : w/2);
- deco (dpy, window, st, x, y, wnew, h, depth+1);
- deco (dpy, window, st, x+wnew, y, w-wnew, h, depth+1);
- }
- else
- { /* Divide the rectangle top-to-bottom */
- int hnew = (st->goldenRatio ? (h * (random() & 1 ? PHI1 : PHI2)) : h/2);
- deco (dpy, window, st, x, y, w, hnew, depth+1);
- deco (dpy, window, st, x, y+hnew, w, h-hnew, depth+1);
- }
- }
-}
-
-static void *
-deco_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
-
- st->delay = get_integer_resource (dpy, "delay", "Integer");
-
- st->smoothColors = get_boolean_resource(dpy, "smoothColors", "Boolean");
- st->old_line_width = 1;
-
- st->goldenRatio = get_boolean_resource (dpy, "goldenRatio", "Boolean");
-
- st->max_depth = get_integer_resource (dpy, "maxDepth", "Integer");
- if (st->max_depth < 1) st->max_depth = 1;
- else if (st->max_depth > 1000) st->max_depth = 1000;
-
- st->min_width = get_integer_resource (dpy, "minWidth", "Integer");
- if (st->min_width < 2) st->min_width = 2;
- st->min_height = get_integer_resource (dpy, "minHeight", "Integer");
- if (st->min_height < 2) st->min_height = 2;
-
- st->line_width = get_integer_resource (dpy, "lineWidth", "Integer");
-
- XGetWindowAttributes (dpy, window, &st->xgwa);
-
- st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
-
- gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- st->fgc = XCreateGC (dpy, window, GCForeground, &gcv);
-
- gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
- "background", "Background");
- st->bgc = XCreateGC (dpy, window, GCForeground, &gcv);
-
- if (st->ncolors <= 2)
- mono_p = True;
-
- if (!mono_p)
- {
- GC tmp = st->fgc;
- st->fgc = st->bgc;
- st->bgc = tmp;
- }
-
- st->mondrian = get_boolean_resource(dpy, "mondrian", "Boolean");
- if (st->mondrian) {
- /* Mondrian, if true, overrides several other options. */
- mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
-
- /** set up red-yellow-blue-black-white colormap and fgc **/
- make_mondrian_colormap(st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap,
- st->colors, &st->ncolors, True, 0, True);
-
- /** put white in several cells **/
- /** set min-height and min-width to about 10% of total w/h **/
- }
- else if (st->smoothColors)
- make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap,
- st->colors, &st->ncolors, True, 0, True);
- else
- make_random_colormap (st->xgwa.screen, st->xgwa.visual,
- st->xgwa.colormap,
- st->colors, &st->ncolors, False, True, 0, True);
-
- gcv.line_width = st->old_line_width = st->line_width;
- XChangeGC(dpy, st->fgc, GCLineWidth, &gcv);
-
- return st;
-}
-
-static unsigned long
-deco_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFillRectangle (dpy, window, st->bgc, 0, 0, st->xgwa.width, st->xgwa.height);
- if (st->mondrian) {
- mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
- if (st->line_width != st->old_line_width) {
- XSetLineAttributes(dpy, st->fgc, st->line_width,
- LineSolid, CapButt, JoinBevel);
- st->old_line_width = st->line_width;
- }
- }
- deco (dpy, window, st, 0, 0, st->xgwa.width, st->xgwa.height, 0);
- return 1000000 * st->delay;
-}
-
-static void
-deco_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->xgwa.width = w;
- st->xgwa.height = h;
-}
-
-static Bool
-deco_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-deco_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->fgc);
- XFreeGC (dpy, st->bgc);
- free (st);
-}
-
-
-static const char *deco_defaults [] = {
- ".background: black",
- ".foreground: white",
- ".lowrez: true",
- "*maxDepth: 12",
- "*minWidth: 20",
- "*minHeight: 20",
- "*lineWidth: 1",
- "*delay: 5",
- "*ncolors: 64",
- "*goldenRatio: False",
- "*smoothColors: False",
- "*mondrian: False",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec deco_options [] = {
- { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 },
- { "-min-width", ".minWidth", XrmoptionSepArg, 0 },
- { "-min-height", ".minHeight", XrmoptionSepArg, 0 },
- { "-line-width", ".lineWidth", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
- { "-golden-ratio", ".goldenRatio", XrmoptionNoArg, "True" },
- { "-no-golden-ratio", ".goldenRatio", XrmoptionNoArg, "False" },
- { "-smooth-colors", ".smoothColors",XrmoptionNoArg, "True" },
- { "-no-smooth-colors",".smoothColors",XrmoptionNoArg, "False" },
- { "-mondrian", ".mondrian", XrmoptionNoArg, "True" },
- { "-no-mondrian", ".mondrian", XrmoptionNoArg, "False" },
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("Deco", deco)
diff --git a/hacks/deco.man b/hacks/deco.man
deleted file mode 100644
index 446b27f..0000000
--- a/hacks/deco.man
+++ /dev/null
@@ -1,105 +0,0 @@
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-deco \- draw tacky 70s basement wall panelling
-.SH SYNOPSIS
-.B deco
-[\-display \fIhost:display.screen\fP]
-[\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP]
-[\-window]
-[\-root]
-[\-mono]
-[\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIseconds\fP]
-[\-max\-depth \fIint\fP]
-[\-min\-width \fIint\fP]
-[\-min\-height \fIint\fP]
-[\-line-width \yIint\fP]
-[\-smooth\-colors]
-[\-golden\-ratio]
-[\-mondrian]
-[\-fps]
-.SH DESCRIPTION
-The \fIdeco\fP program subdivides and colors rectangles randomly.
-It looks kind of like Brady-Bunch-era rec-room wall paneling.
-(Raven says: "This screensaver is ugly enough to peel paint.")
-Can also produce more aesthetically pleasing displays via options.
-.SH OPTIONS
-.I deco
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIseconds\fP
-How long to wait before starting over. Default 5 seconds.
-.TP 8
-.B \-max\-depth \fIinteger\fP
-How deep to subdivide. Default 12.
-.TP 8
-.B \-min\-width \fIinteger\fP
-.TP 8
-.B \-min\-height \fIinteger\fP
-The size of the smallest rectangle to draw. Default 20x20.
-.TP 8
-.B \-line\-width \fIinteger\fP
-Width of lines drawn between rectangles. Default zero (minimal width).
-.TP 8
-.B \-smooth\-colors
-.TP 8
-.B \-no\-smooth\-colors
-Whether to use a smooth color palette instead of a random one.
-Less jarring. Default False.
-.TP 8
-.B \-golden\-ratio
-.TP 8
-.B \-no\-golden\-ratio
-Whether to subdivide rectangles using the golden ratio instead of 1/2.
-This ratio is supposed to be more aesthetically pleasing. Default false.
-.TP 8
-.B \-mondrian
-.TP 8
-.B \-no\-mondrian
-Whether to imitiate style of some famous paintings by Piet Mondrian.
-Overrides line-width and colormap options. Default false.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 26-Apr-97, based on code by
-Michael D. Bayne <mdb@go2net.com>. Golden ratio and
-Mondrian settings by Lars Huttar.
diff --git a/hacks/delaunay.c b/hacks/delaunay.c
deleted file mode 100644
index a6db5b1..0000000
--- a/hacks/delaunay.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/* Triangulate
- Efficient Triangulation Algorithm Suitable for Terrain Modelling
- or
- An Algorithm for Interpolating Irregularly-Spaced Data
- with Applications in Terrain Modelling
-
- Written by Paul Bourke
- Presented at Pan Pacific Computer Conference, Beijing, China.
- January 1989
- Abstract
-
- A discussion of a method that has been used with success in terrain
- modelling to estimate the height at any point on the land surface
- from irregularly distributed samples. The special requirements of
- terrain modelling are discussed as well as a detailed description
- of the algorithm and an example of its application.
-
- http://paulbourke.net/papers/triangulate/
- http://paulbourke.net/papers/triangulate/triangulate.c
- */
-
-#include <stdlib.h>
-#include <math.h>
-
-#include "delaunay.h"
-
-typedef struct {
- int p1,p2;
-} IEDGE;
-
-#define TRUE 1
-#define FALSE 0
-#define EPSILON 0.000001
-
-/*
- Return TRUE if a point (xp,yp) is inside the circumcircle made up
- of the points (x1,y1), (x2,y2), (x3,y3)
- The circumcircle centre is returned in (xc,yc) and the radius r
- NOTE: A point on the edge is inside the circumcircle
-*/
-static int
-circumcircle (double xp,double yp,
- double x1,double y1,double x2,double y2,double x3,double y3,
- double *xc,double *yc,double *rsqr)
-{
- double m1,m2,mx1,mx2,my1,my2;
- double dx,dy,drsqr;
- double fabsy1y2 = fabs(y1-y2);
- double fabsy2y3 = fabs(y2-y3);
-
- /* Check for coincident points */
- if (fabsy1y2 < EPSILON && fabsy2y3 < EPSILON)
- return(FALSE);
-
- if (fabsy1y2 < EPSILON) {
- m2 = - (x3-x2) / (y3-y2);
- mx2 = (x2 + x3) / 2.0;
- my2 = (y2 + y3) / 2.0;
- *xc = (x2 + x1) / 2.0;
- *yc = m2 * (*xc - mx2) + my2;
- } else if (fabsy2y3 < EPSILON) {
- m1 = - (x2-x1) / (y2-y1);
- mx1 = (x1 + x2) / 2.0;
- my1 = (y1 + y2) / 2.0;
- *xc = (x3 + x2) / 2.0;
- *yc = m1 * (*xc - mx1) + my1;
- } else {
- m1 = - (x2-x1) / (y2-y1);
- m2 = - (x3-x2) / (y3-y2);
- mx1 = (x1 + x2) / 2.0;
- mx2 = (x2 + x3) / 2.0;
- my1 = (y1 + y2) / 2.0;
- my2 = (y2 + y3) / 2.0;
- *xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
- if (fabsy1y2 > fabsy2y3) {
- *yc = m1 * (*xc - mx1) + my1;
- } else {
- *yc = m2 * (*xc - mx2) + my2;
- }
- }
-
- dx = x2 - *xc;
- dy = y2 - *yc;
- *rsqr = dx*dx + dy*dy;
-
- dx = xp - *xc;
- dy = yp - *yc;
- drsqr = dx*dx + dy*dy;
-
- /* Original
- return((drsqr <= *rsqr) ? TRUE : FALSE);
- Proposed by Chuck Morris */
- return((drsqr - *rsqr) <= EPSILON ? TRUE : FALSE);
-}
-
-
-/*
- Triangulation subroutine
- Takes as input NV vertices in array pxyz
- Returned is a list of ntri triangular faces in the array v
- These triangles are arranged in a consistent clockwise order.
- The triangle array 'v' should be malloced to 3 * nv
- The vertex array pxyz must be big enough to hold 3 more points
- The vertex array must be sorted in increasing x values say
- qsort(p,nv,sizeof(XYZ),XYZCompare);
-*/
-int
-delaunay (int nv,XYZ *pxyz,ITRIANGLE *v,int *ntri)
-{
- int *complete = NULL;
- IEDGE *edges = NULL;
- int nedge = 0;
- int trimax,emax = 200;
- int status = 0;
-
- int inside;
- int i,j,k;
- double xp,yp,x1,y1,x2,y2,x3,y3,xc=0,yc=0,r=0;
- double xmin,xmax,ymin,ymax,xmid,ymid;
- double dx,dy,dmax;
-
- /* Allocate memory for the completeness list, flag for each triangle */
- trimax = 4 * nv;
- if ((complete = malloc(trimax*sizeof(int))) == NULL) {
- status = 1;
- goto skip;
- }
-
- /* Allocate memory for the edge list */
- if ((edges = malloc(emax*(long)sizeof(IEDGE))) == NULL) {
- status = 2;
- goto skip;
- }
-
- /*
- Find the maximum and minimum vertex bounds.
- This is to allow calculation of the bounding triangle
- */
- xmin = pxyz[0].x;
- ymin = pxyz[0].y;
- xmax = xmin;
- ymax = ymin;
- for (i=1;i<nv;i++) {
- if (pxyz[i].x < xmin) xmin = pxyz[i].x;
- if (pxyz[i].x > xmax) xmax = pxyz[i].x;
- if (pxyz[i].y < ymin) ymin = pxyz[i].y;
- if (pxyz[i].y > ymax) ymax = pxyz[i].y;
- }
- dx = xmax - xmin;
- dy = ymax - ymin;
- dmax = (dx > dy) ? dx : dy;
- xmid = (xmax + xmin) / 2.0;
- ymid = (ymax + ymin) / 2.0;
-
- /*
- Set up the supertriangle
- This is a triangle which encompasses all the sample points.
- The supertriangle coordinates are added to the end of the
- vertex list. The supertriangle is the first triangle in
- the triangle list.
- */
- pxyz[nv+0].x = xmid - 20 * dmax;
- pxyz[nv+0].y = ymid - dmax;
- pxyz[nv+0].z = 0.0;
- pxyz[nv+1].x = xmid;
- pxyz[nv+1].y = ymid + 20 * dmax;
- pxyz[nv+1].z = 0.0;
- pxyz[nv+2].x = xmid + 20 * dmax;
- pxyz[nv+2].y = ymid - dmax;
- pxyz[nv+2].z = 0.0;
- v[0].p1 = nv;
- v[0].p2 = nv+1;
- v[0].p3 = nv+2;
- complete[0] = FALSE;
- *ntri = 1;
-
- /*
- Include each point one at a time into the existing mesh
- */
- for (i=0;i<nv;i++) {
-
- xp = pxyz[i].x;
- yp = pxyz[i].y;
- nedge = 0;
-
- /*
- Set up the edge buffer.
- If the point (xp,yp) lies inside the circumcircle then the
- three edges of that triangle are added to the edge buffer
- and that triangle is removed.
- */
- for (j=0;j<(*ntri);j++) {
- if (complete[j])
- continue;
- x1 = pxyz[v[j].p1].x;
- y1 = pxyz[v[j].p1].y;
- x2 = pxyz[v[j].p2].x;
- y2 = pxyz[v[j].p2].y;
- x3 = pxyz[v[j].p3].x;
- y3 = pxyz[v[j].p3].y;
- inside = circumcircle(xp,yp,x1,y1,x2,y2,x3,y3,&xc,&yc,&r);
- if (xc < xp && ((xp-xc)*(xp-xc)) > r)
- complete[j] = TRUE;
- if (inside) {
- /* Check that we haven't exceeded the edge list size */
- if (nedge+3 >= emax) {
- IEDGE *edges_old = edges;
- emax += 100;
- if ((edges = realloc(edges,emax*(long)sizeof(IEDGE))) == NULL) {
- edges = edges_old;
- status = 3;
- goto skip;
- }
- }
- edges[nedge+0].p1 = v[j].p1;
- edges[nedge+0].p2 = v[j].p2;
- edges[nedge+1].p1 = v[j].p2;
- edges[nedge+1].p2 = v[j].p3;
- edges[nedge+2].p1 = v[j].p3;
- edges[nedge+2].p2 = v[j].p1;
- nedge += 3;
- v[j] = v[(*ntri)-1];
- complete[j] = complete[(*ntri)-1];
- (*ntri)--;
- j--;
- }
- }
-
- /*
- Tag multiple edges
- Note: if all triangles are specified anticlockwise then all
- interior edges are opposite pointing in direction.
- */
- for (j=0;j<nedge-1;j++) {
- for (k=j+1;k<nedge;k++) {
- if ((edges[j].p1 == edges[k].p2) && (edges[j].p2 == edges[k].p1)) {
- edges[j].p1 = -1;
- edges[j].p2 = -1;
- edges[k].p1 = -1;
- edges[k].p2 = -1;
- }
- /* Shouldn't need the following, see note above */
- if ((edges[j].p1 == edges[k].p1) && (edges[j].p2 == edges[k].p2)) {
- edges[j].p1 = -1;
- edges[j].p2 = -1;
- edges[k].p1 = -1;
- edges[k].p2 = -1;
- }
- }
- }
-
- /*
- Form new triangles for the current point
- Skipping over any tagged edges.
- All edges are arranged in clockwise order.
- */
- for (j=0;j<nedge;j++) {
- if (edges[j].p1 < 0 || edges[j].p2 < 0)
- continue;
- if ((*ntri) >= trimax) {
- status = 4;
- goto skip;
- }
- v[*ntri].p1 = edges[j].p1;
- v[*ntri].p2 = edges[j].p2;
- v[*ntri].p3 = i;
- complete[*ntri] = FALSE;
- (*ntri)++;
- }
- }
-
- /*
- Remove triangles with supertriangle vertices
- These are triangles which have a vertex number greater than nv
- */
- for (i=0;i<(*ntri);i++) {
- if (v[i].p1 >= nv || v[i].p2 >= nv || v[i].p3 >= nv) {
- v[i] = v[(*ntri)-1];
- (*ntri)--;
- i--;
- }
- }
-
- skip:
- free(edges);
- free(complete);
- return(status);
-}
-
-
-int
-delaunay_xyzcompare (const void *v1, const void *v2)
-{
- const XYZ *p1,*p2;
- p1 = v1;
- p2 = v2;
- if (p1->x < p2->x)
- return(-1);
- else if (p1->x > p2->x)
- return(1);
- else
- return(0);
-}
diff --git a/hacks/delaunay.h b/hacks/delaunay.h
deleted file mode 100644
index 9c18c84..0000000
--- a/hacks/delaunay.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Triangulate
- Efficient Triangulation Algorithm Suitable for Terrain Modelling
- or
- An Algorithm for Interpolating Irregularly-Spaced Data
- with Applications in Terrain Modelling
-
- Written by Paul Bourke
- Presented at Pan Pacific Computer Conference, Beijing, China.
- January 1989
- Abstract
-
- A discussion of a method that has been used with success in terrain
- modelling to estimate the height at any point on the land surface
- from irregularly distributed samples. The special requirements of
- terrain modelling are discussed as well as a detailed description
- of the algorithm and an example of its application.
-
- http://paulbourke.net/papers/triangulate/
- http://paulbourke.net/papers/triangulate/triangulate.c
- */
-
-#ifndef __DELAUNAY_H__
-#define __DELAUNAY_H__
-
-typedef struct {
- double x,y,z;
-} XYZ;
-
-typedef struct {
- int p1,p2,p3;
-} ITRIANGLE;
-
-/*
- Takes as input NV vertices in array pxyz
- Returned is a list of ntri triangular faces in the array v
- These triangles are arranged in a consistent clockwise order.
- The triangle array 'v' should be malloced to 3 * nv
- The vertex array pxyz must be big enough to hold 3 more points
- The vertex array must be sorted in increasing x values
- */
-extern int delaunay (int nv, XYZ *pxyz, ITRIANGLE *v, int *ntri);
-
-/* qsort(p,nv,sizeof(XYZ), delaunay_xyzcompare); */
-extern int delaunay_xyzcompare (const void *v1, const void *v2);
-
-
-#endif /* __DELAUNAY_H__ */
-
diff --git a/hacks/deluxe.c b/hacks/deluxe.c
deleted file mode 100644
index 3116f6b..0000000
--- a/hacks/deluxe.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <math.h>
-#include "screenhack.h"
-#include "alpha.h"
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-# include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-#define ABS(x) ((x)<0?-(x):(x))
-
-struct state {
- Display *dpy;
- Window window;
-
- Bool transparent_p;
- int nplanes;
- unsigned long base_pixel, *plane_masks;
-
- int count;
- int delay;
- int ncolors;
- Bool dbuf;
- XColor *colors;
- GC erase_gc;
- struct throbber **throbbers;
- XWindowAttributes xgwa;
- Pixmap b, ba, bb; /* double-buffer to reduce flicker */
-
-# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- Bool dbeclear_p;
- XdbeBackBuffer backb;
-# endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-};
-
-struct throbber {
- int x, y;
- int size;
- int max_size;
- int thickness;
- int speed;
- int fuse;
- GC gc;
- void (*draw) (struct state *, Drawable, struct throbber *);
-};
-
-
-static void
-draw_star (struct state *st, Drawable w, struct throbber *t)
-{
- XPoint points[11];
- int x = t->x;
- int y = t->y;
-
- /*
- The following constant is really:
- sqrt(5 - sqrt(5)) / sqrt(25 - 11 * sqrt(5))
-
- Reference: http://mathworld.wolfram.com/Pentagram.html
- */
- int s = t->size * 2.6180339887498985;
- int s2 = t->size;
- double c = M_PI * 2;
- double o = -M_PI / 2;
-
- points[0].x = x + s * cos(o + 0.0*c); points[0].y = y + s * sin(o + 0.0*c);
- points[1].x = x + s2 * cos(o + 0.1*c); points[1].y = y + s2 * sin(o + 0.1*c);
- points[2].x = x + s * cos(o + 0.2*c); points[2].y = y + s * sin(o + 0.2*c);
- points[3].x = x + s2 * cos(o + 0.3*c); points[3].y = y + s2 * sin(o + 0.3*c);
- points[4].x = x + s * cos(o + 0.4*c); points[4].y = y + s * sin(o + 0.4*c);
- points[5].x = x + s2 * cos(o + 0.5*c); points[5].y = y + s2 * sin(o + 0.5*c);
- points[6].x = x + s * cos(o + 0.6*c); points[6].y = y + s * sin(o + 0.6*c);
- points[7].x = x + s2 * cos(o + 0.7*c); points[7].y = y + s2 * sin(o + 0.7*c);
- points[8].x = x + s * cos(o + 0.8*c); points[8].y = y + s * sin(o + 0.8*c);
- points[9].x = x + s2 * cos(o + 0.9*c); points[9].y = y + s2 * sin(o + 0.9*c);
- points[10] = points[0];
-
- XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
-}
-
-static void
-draw_circle (struct state *st, Drawable w, struct throbber *t)
-{
- XDrawArc (st->dpy, w, t->gc,
- t->x - t->size / 2,
- t->y - t->size / 2,
- t->size, t->size,
- 0, 360*64);
-}
-
-static void
-draw_hlines (struct state *st, Drawable w, struct throbber *t)
-{
- XDrawLine (st->dpy, w, t->gc, 0,
- t->y - t->size, t->max_size,
- t->y - t->size);
- XDrawLine (st->dpy, w, t->gc, 0,
- t->y + t->size, t->max_size,
- t->y + t->size);
-}
-
-static void
-draw_vlines (struct state *st, Drawable w, struct throbber *t)
-{
- XDrawLine (st->dpy, w, t->gc,
- t->x - t->size, 0,
- t->x - t->size, t->max_size);
- XDrawLine (st->dpy, w, t->gc,
- t->x + t->size, 0,
- t->x + t->size, t->max_size);
-}
-
-static void
-draw_corners (struct state *st, Drawable w, struct throbber *t)
-{
- int s = (t->size + t->thickness) / 2;
- XPoint points[3];
-
- if (t->y > s)
- {
- points[0].x = 0; points[0].y = t->y - s;
- points[1].x = t->x - s; points[1].y = t->y - s;
- points[2].x = t->x - s; points[2].y = 0;
- XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
-
- points[0].x = t->x + s; points[0].y = 0;
- points[1].x = t->x + s; points[1].y = t->y - s;
- points[2].x = t->max_size; points[2].y = t->y - s;
- XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
- }
-
- if (t->x > s)
- {
- points[0].x = 0; points[0].y = t->y + s;
- points[1].x = t->x - s; points[1].y = t->y + s;
- points[2].x = t->x - s; points[2].y = t->max_size;
- XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
-
- points[0].x = t->x + s; points[0].y = t->max_size;
- points[1].x = t->x + s; points[1].y = t->y + s;
- points[2].x = t->max_size; points[2].y = t->y + s;
- XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
- }
-}
-
-
-static struct throbber *
-make_throbber (struct state *st, Drawable d, int w, int h, unsigned long pixel)
-{
- XGCValues gcv;
- unsigned long flags;
- struct throbber *t = (struct throbber *) malloc (sizeof (*t));
- t->x = w / 2;
- t->y = h / 2;
- t->max_size = (w > h ? w : h);
- t->speed = get_integer_resource (st->dpy, "speed", "Speed");
- t->fuse = 1 + (random() % 4);
- t->thickness = get_integer_resource (st->dpy, "thickness", "Thickness");
-
- if (st->xgwa.width > 2560) t->thickness *= 3; /* Retina displays */
-
- if (t->speed < 0) t->speed = -t->speed;
- t->speed += (((random() % t->speed) / 2) - (t->speed / 2));
- if (t->speed > 0) t->speed = -t->speed;
-
- flags = GCForeground;
-# ifndef HAVE_JWXYZ
- if (st->transparent_p)
- {
- gcv.foreground = ~0L;
- gcv.plane_mask = st->base_pixel | st->plane_masks[random() % st->nplanes];
- flags |= GCPlaneMask;
- }
- else
-# endif /* !HAVE_JWXYZ */
- {
- gcv.foreground = pixel;
- }
-
- gcv.line_width = t->thickness;
- gcv.cap_style = CapProjecting;
- gcv.join_style = JoinMiter;
-
- flags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
- t->gc = XCreateGC (st->dpy, d, flags, &gcv);
-
-# ifdef HAVE_JWXYZ
- if (st->transparent_p)
- {
- /* give a non-opaque alpha to the color */
- unsigned long pixel = gcv.foreground;
- unsigned long amask = BlackPixelOfScreen (st->xgwa.screen);
- unsigned long a = (0xCCCCCCCC & amask);
- pixel = (pixel & (~amask)) | a;
-
- jwxyz_XSetAlphaAllowed (st->dpy, t->gc, True);
- XSetForeground (st->dpy, t->gc, pixel);
- }
-# endif /* HAVE_JWXYZ */
-
- switch (random() % 11) {
- case 0: case 1: case 2: case 3: t->draw = draw_star; break;
- case 4: case 5: case 6: case 7: t->draw = draw_circle; break;
- case 8: t->draw = draw_hlines; break;
- case 9: t->draw = draw_vlines; break;
- case 10: t->draw = draw_corners; break;
- default: abort(); break;
- }
-
- if (t->draw == draw_circle)
- t->max_size *= 1.5;
-
- if (random() % 4)
- t->size = t->max_size;
- else
- t->size = t->thickness, t->speed = -t->speed;
-
- return t;
-}
-
-static int
-throb (struct state *st, Drawable window, struct throbber *t)
-{
- t->size += t->speed;
- if (t->size <= (t->thickness / 2))
- {
- t->speed = -t->speed;
- t->size += (t->speed * 2);
- }
- else if (t->size > t->max_size)
- {
- t->speed = -t->speed;
- t->size += (t->speed * 2);
- t->fuse--;
- }
-
- if (t->fuse <= 0)
- {
- XFreeGC (st->dpy, t->gc);
- memset (t, 0, sizeof(*t));
- free (t);
- return -1;
- }
- else
- {
- t->draw (st, window, t);
- return 0;
- }
-}
-
-
-static void *
-deluxe_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- int i;
- st->dpy = dpy;
- st->window = window;
- st->count = get_integer_resource (st->dpy, "count", "Integer");
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
- st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
-
-# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- st->dbeclear_p = get_boolean_resource (st->dpy, "useDBEClear", "Boolean");
-#endif
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- st->dbuf = False;
-# endif
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- st->transparent_p = get_boolean_resource(st->dpy, "transparent", "Transparent");
-
- st->colors = (XColor *) calloc (sizeof(*st->colors), st->ncolors);
-
- if (get_boolean_resource(st->dpy, "mono", "Boolean"))
- {
- MONO:
- st->ncolors = 1;
- st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
- "foreground", "Foreground");
- }
-#ifndef HAVE_JWXYZ
- else if (st->transparent_p)
- {
- st->nplanes = get_integer_resource (st->dpy, "planes", "Planes");
- if (st->nplanes <= 0)
- st->nplanes = (random() % (st->xgwa.depth-2)) + 2;
-
- allocate_alpha_colors (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- &st->nplanes, True, &st->plane_masks,
- &st->base_pixel);
- if (st->nplanes <= 1)
- {
-# if 0
- fprintf (stderr,
- "%s: couldn't allocate any color planes; turning transparency off.\n",
- progname);
-# endif
- st->transparent_p = False;
- goto COLOR;
- }
- }
-#endif /* !HAVE_JWXYZ */
- else
- {
-#ifndef HAVE_JWXYZ
- COLOR:
-#endif
- make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
- st->colors, &st->ncolors, True, True, 0, True);
- if (st->ncolors < 2)
- goto MONO;
- }
-
- if (st->dbuf)
- {
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (st->dbeclear_p)
- st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeBackground);
- else
- st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
- st->backb = st->b;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- if (!st->b)
- {
- st->ba = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
- st->bb = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
- st->b = st->ba;
- }
- }
- else
- {
- st->b = st->window;
- }
-
- st->throbbers = (struct throbber **) calloc (st->count, sizeof(struct throbber *));
- for (i = 0; i < st->count; i++)
- st->throbbers[i] = make_throbber (st, st->b, st->xgwa.width, st->xgwa.height,
- st->colors[random() % st->ncolors].pixel);
-
- gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
- "background", "Background");
- st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &gcv);
-
- if (st->ba) XFillRectangle (st->dpy, st->ba, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
- if (st->bb) XFillRectangle (st->dpy, st->bb, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
-
- return st;
-}
-
-static unsigned long
-deluxe_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (!st->dbeclear_p || !st->backb)
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
-
- for (i = 0; i < st->count; i++)
- if (throb (st, st->b, st->throbbers[i]) < 0)
- st->throbbers[i] = make_throbber (st, st->b, st->xgwa.width, st->xgwa.height,
- st->colors[random() % st->ncolors].pixel);
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (st->backb)
- {
- XdbeSwapInfo info[1];
- info[0].swap_window = st->window;
- info[0].swap_action = (st->dbeclear_p ? XdbeBackground : XdbeUndefined);
- XdbeSwapBuffers (st->dpy, info, 1);
- }
- else
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- if (st->dbuf)
- {
- XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0,
- st->xgwa.width, st->xgwa.height, 0, 0);
- st->b = (st->b == st->ba ? st->bb : st->ba);
- }
-
- return st->delay;
-}
-
-static void
-deluxe_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- if (! st->dbuf) { /* #### more complicated if we have a back buffer... */
- int i;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
- XClearWindow (dpy, window);
- for (i = 0; i < st->count; i++)
- if (st->throbbers[i])
- st->throbbers[i]->fuse = 0;
- }
-}
-
-static Bool
-deluxe_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-deluxe_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i;
- XFreeGC (dpy, st->erase_gc);
- if (st->ba) XFreePixmap (dpy, st->ba);
- if (st->bb) XFreePixmap (dpy, st->bb);
- if (st->plane_masks) free (st->plane_masks);
- for (i = 0; i < st->count; i++)
- if (st->throbbers[i]) {
- XFreeGC (dpy, st->throbbers[i]->gc);
- free (st->throbbers[i]);
- }
- free (st->throbbers);
- free (st->colors);
- free (st);
-}
-
-
-static const char *deluxe_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*delay: 10000",
- "*count: 5",
- "*thickness: 50",
- "*speed: 15",
- "*ncolors: 20",
- "*transparent: True",
- "*doubleBuffer: True",
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- "*useDBE: True",
- "*useDBEClear: True",
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec deluxe_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-thickness", ".thickness", XrmoptionSepArg, 0 },
- { "-count", ".count", XrmoptionSepArg, 0 },
- { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-transparent", ".transparent", XrmoptionNoArg, "True" },
- { "-no-transparent", ".transparent", XrmoptionNoArg, "False" },
- { "-opaque", ".transparent", XrmoptionNoArg, "False" },
- { "-no-opaque", ".transparent", XrmoptionNoArg, "True" },
- { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
- { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Deluxe", deluxe)
diff --git a/hacks/deluxe.man b/hacks/deluxe.man
deleted file mode 100644
index 4bf5d3b..0000000
--- a/hacks/deluxe.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-deluxe \- pulsing sequence of stars, circles, and lines.
-.SH SYNOPSIS
-.B deluxe
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-thickness \fInumber\fP]
-[\-count \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-transparent]
-[\-no-db]
-[\-fps]
-.SH DESCRIPTION
-This draws a pulsing sequence of stars, circles, and lines.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
-.TP 8
-.B \-thickness \fInumber\fP
-Thickness of lines. Default: 50.
-.TP 8
-.B \-count \fInumber\fP
-Number of objects. Default: 5.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of colors. Default: 20.
-.TP 8
-.B \-transparent | \-no-transparent
-Whether to use transparency.
-.TP 8
-.B \-db | \-no-db
-Whether to double buffer.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/demon.c b/hacks/demon.c
deleted file mode 100644
index 0fff863..0000000
--- a/hacks/demon.c
+++ /dev/null
@@ -1,952 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* demon --- David Griffeath's cellular automata */
-
-#if 0
-static const char sccsid[] = "@(#)demon.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1995 by David Bagley.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 01-Nov-2000: Allocation checks
- * 10-May-1997: Compatible with xscreensaver
- * 16-Apr-1997: -neighbors 3, 9 (not sound mathematically), 12, and 8 added
- * 30-May-1996: Ron Hitchens <ron@idiom.com>
- * Fixed memory management that caused leaks
- * 14-Apr-1996: -neighbors 6 runtime-time option added
- * 21-Aug-1995: Coded from A.K. Dewdney's "Computer Recreations", Scientific
- * American Magazine" Aug 1989 pp 102-105. Also very similar
- * to hodgepodge machine described in A.K. Dewdney's "Computer
- * Recreations", Scientific American Magazine" Aug 1988
- * pp 104-107. Also used life.c as a guide.
- */
-
-/*-
- * A cellular universe of 4 phases debris, droplets, defects, and demons.
- */
-
-/*-
- Grid Number of Neighbors
- ---- ------------------
- Square 4 or 8
- Hexagon 6
- Triangle 3, 9, or 12
-*/
-
-#ifndef HAVE_JWXYZ
-# define DO_STIPPLE
-#endif
-
-#ifdef STANDALONE
-# define MODE_demon
-# define DEFAULTS "*delay: 50000 \n" \
- "*count: 0 \n" \
- "*cycles: 1000 \n" \
- "*size: -30 \n" \
- "*ncolors: 64 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n" \
-
-# define UNIFORM_COLORS
-# define release_demon 0
-# define reshape_demon 0
-# define demon_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-#include "automata.h"
-
-#ifdef MODE_demon
-
-/*-
- * neighbors of 0 randomizes it between 3, 4, 6, 8, 9, and 12.
- */
-#define DEF_NEIGHBORS "0" /* choose random value */
-
-static int neighbors;
-
-static XrmOptionDescRec opts[] =
-{
- {"-neighbors", ".demon.neighbors", XrmoptionSepArg, 0}
-};
-
-static argtype vars[] =
-{
- {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
-};
-static OptionStruct desc[] =
-{
- {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3, 9 or 12"}
-};
-
-ENTRYPOINT ModeSpecOpt demon_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct demon_description =
-{"demon", "init_demon", "draw_demon", (char *) NULL,
- "refresh_demon", "init_demon", "free_demon", &demon_opts,
- 50000, 0, 1000, -7, 64, 1.0, "",
- "Shows Griffeath's cellular automata", 0, NULL};
-
-#endif
-
-#define DEMONBITS(n,w,h)\
- if ((dp->pixmaps[dp->init_bits]=\
- XCreatePixmapFromBitmapData(MI_DISPLAY(mi),window,(char *)n,w,h,1,0,1))==None){\
- free_demon(mi); return;} else {dp->init_bits++;}
-
-#define REDRAWSTEP 2000 /* How many cells to draw per cycle */
-#define MINSTATES 2
-#define MINGRIDSIZE 5
-#define MINSIZE 4
-#define NEIGHBORKINDS 6
-
-/* Singly linked list */
-typedef struct _CellList {
- XPoint pt;
- struct _CellList *next;
-} CellList;
-
-typedef struct {
- int generation;
- int xs, ys;
- int xb, yb;
- int nrows, ncols;
- int width, height;
- int states;
- int state;
- int redrawing, redrawpos;
- int *ncells;
- CellList **cellList;
- unsigned char *oldcell, *newcell;
- int neighbors;
- int init_bits;
- GC stippledGC;
- Pixmap pixmaps[NUMSTIPPLES - 1];
- union {
- XPoint hexagon[6];
- XPoint triangle[2][3];
- } shape;
-} demonstruct;
-
-static char plots[2][NEIGHBORKINDS] =
-{
- {3, 4, 6, 8, 9, 12}, /* Neighborhoods */
- {12, 16, 18, 20, 22, 24} /* Number of states */
-};
-
-static demonstruct *demons = (demonstruct *) NULL;
-
-static void
-drawcell(ModeInfo * mi, int col, int row, unsigned char state)
-{
- demonstruct *dp = &demons[MI_SCREEN(mi)];
- GC gc;
-
- if (!state) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- gc = MI_GC(mi);
- } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
- (dp->states - 1)) % MI_NPIXELS(mi)));
- gc = MI_GC(mi);
- } else {
- XGCValues gcv;
-#ifdef DO_STIPPLE
- gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
-#endif /* DO_STIPPLE */
- gcv.foreground = MI_WHITE_PIXEL(mi);
- gcv.background = MI_BLACK_PIXEL(mi);
- XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
- GCStipple | GCForeground | GCBackground, &gcv);
- gc = dp->stippledGC;
- }
- if (dp->neighbors == 6) {
- int ccol = 2 * col + !(row & 1), crow = 2 * row;
-
- dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
- dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
- if (dp->xs == 1 && dp->ys == 1)
- XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
- gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y);
- else
- XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- dp->shape.hexagon, 6, Convex, CoordModePrevious);
- } else if (dp->neighbors == 4 || dp->neighbors == 8) {
- XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- dp->xb + dp->xs * col, dp->yb + dp->ys * row,
- dp->xs - (dp->xs > 3), dp->ys - (dp->ys > 3));
- } else { /* TRI */
- int orient = (col + row) % 2; /* O left 1 right */
-
- dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
- dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
- if (dp->xs <= 3 || dp->ys <= 3)
- XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
- dp->shape.triangle[orient][0].y);
- else {
- if (orient)
- dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
- else
- dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
- XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
-
- }
- }
-}
-
-static Bool
-addtolist(ModeInfo * mi, int col, int row, unsigned char state)
-{
- demonstruct *dp = &demons[MI_SCREEN(mi)];
- CellList *current;
-
- current = dp->cellList[state];
- if ((dp->cellList[state] = (CellList *)
- malloc(sizeof (CellList))) == NULL) {
- return False;
- }
- dp->cellList[state]->pt.x = col;
- dp->cellList[state]->pt.y = row;
- dp->cellList[state]->next = current;
- dp->ncells[state]++;
- return True;
-}
-
-
-static void
-free_state(demonstruct * dp, int state)
-{
- CellList *current;
-
- while (dp->cellList[state]) {
- current = dp->cellList[state];
- dp->cellList[state] = dp->cellList[state]->next;
- (void) free((void *) current);
- }
- dp->cellList[state] = (CellList *) NULL;
- if (dp->ncells != NULL)
- dp->ncells[state] = 0;
-}
-
-
-static void
-free_list(demonstruct * dp)
-{
- int state;
-
- for (state = 0; state < dp->states; state++)
- free_state(dp, state);
- (void) free((void *) dp->cellList);
- dp->cellList = (CellList **) NULL;
-}
-
-static void
-free_struct(demonstruct * dp)
-{
- if (dp->cellList != NULL) {
- free_list(dp);
- }
- if (dp->ncells != NULL) {
- (void) free((void *) dp->ncells);
- dp->ncells = (int *) NULL;
- }
- if (dp->oldcell != NULL) {
- (void) free((void *) dp->oldcell);
- dp->oldcell = (unsigned char *) NULL;
- }
- if (dp->newcell != NULL) {
- (void) free((void *) dp->newcell);
- dp->newcell = (unsigned char *) NULL;
- }
-}
-
-ENTRYPOINT void
-free_demon(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- demonstruct *dp = &demons[MI_SCREEN(mi)];
- int shade;
-
- if (dp->stippledGC != None) {
- XFreeGC(display, dp->stippledGC);
- dp->stippledGC = None;
- }
- for (shade = 0; shade < dp->init_bits; shade++) {
- XFreePixmap(display, dp->pixmaps[shade]);
- }
- dp->init_bits = 0;
- free_struct(dp);
-}
-
-static Bool
-draw_state(ModeInfo * mi, int state)
-{
- demonstruct *dp = &demons[MI_SCREEN(mi)];
- GC gc;
- XRectangle *rects;
- CellList *current;
-
- if (!state) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- gc = MI_GC(mi);
- } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
- MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
- (dp->states - 1)) % MI_NPIXELS(mi)));
- gc = MI_GC(mi);
- } else {
- XGCValues gcv;
-
-#ifdef DO_STIPPLE
- gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
-#endif /* DO_STIPPLE */
- gcv.foreground = MI_WHITE_PIXEL(mi);
- gcv.background = MI_BLACK_PIXEL(mi);
- XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
- GCStipple | GCForeground | GCBackground, &gcv);
- gc = dp->stippledGC;
- }
- if (dp->neighbors == 6) { /* Draw right away, slow */
- current = dp->cellList[state];
- while (current) {
- int col, row, ccol, crow;
-
- col = current->pt.x;
- row = current->pt.y;
- ccol = 2 * col + !(row & 1), crow = 2 * row;
- dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
- dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
- if (dp->xs == 1 && dp->ys == 1)
- XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
- gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y);
- else
- XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- dp->shape.hexagon, 6, Convex, CoordModePrevious);
- current = current->next;
- }
- } else if (dp->neighbors == 4 || dp->neighbors == 8) {
- /* Take advantage of XDrawRectangles */
- int ncells = 0;
-
- /* Create Rectangle list from part of the cellList */
- if ((rects = (XRectangle *) malloc(dp->ncells[state] *
- sizeof (XRectangle))) == NULL) {
- return False;
- }
- current = dp->cellList[state];
- while (current) {
- rects[ncells].x = dp->xb + current->pt.x * dp->xs;
- rects[ncells].y = dp->yb + current->pt.y * dp->ys;
- rects[ncells].width = dp->xs - (dp->xs > 3);
- rects[ncells].height = dp->ys - (dp->ys > 3);
- current = current->next;
- ncells++;
- }
- /* Finally get to draw */
- XFillRectangles(MI_DISPLAY(mi), MI_WINDOW(mi), gc, rects, ncells);
- /* Free up rects list and the appropriate part of the cellList */
- (void) free((void *) rects);
- } else { /* TRI */
- current = dp->cellList[state];
- while (current) {
- int col, row, orient;
-
- col = current->pt.x;
- row = current->pt.y;
- orient = (col + row) % 2; /* O left 1 right */
- dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
- dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
- if (dp->xs <= 3 || dp->ys <= 3)
- XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
- dp->shape.triangle[orient][0].y);
- else {
- if (orient)
- dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
- else
- dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
- XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
- dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
- }
- current = current->next;
- }
- }
- free_state(dp, state);
- return True;
-}
-
-static void
-RandomSoup(ModeInfo * mi)
-{
- demonstruct *dp = &demons[MI_SCREEN(mi)];
- int row, col, mrow = 0;
-
- for (row = 0; row < dp->nrows; ++row) {
- for (col = 0; col < dp->ncols; ++col) {
- dp->oldcell[col + mrow] =
- (unsigned char) LRAND() % ((unsigned char) dp->states);
- if (!addtolist(mi, col, row, dp->oldcell[col + mrow]))
- return; /* sparse soup */
- }
- mrow += dp->ncols;
- }
-}
-
-ENTRYPOINT void
-init_demon (ModeInfo * mi)
-{
- int size = MI_SIZE(mi), nk;
- demonstruct *dp;
-
- MI_INIT (mi, demons);
- dp = &demons[MI_SCREEN(mi)];
-
- if (MI_WIDTH(mi) < 100 || MI_HEIGHT(mi) < 100) /* tiny window */
- size = MIN(MI_WIDTH(mi), MI_HEIGHT(mi));
-
- dp->generation = 0;
- dp->redrawing = 0;
-#ifdef DO_STIPPLE
- if (MI_NPIXELS(mi) < NUMSTIPPLES) {
- Window window = MI_WINDOW(mi);
- if (dp->stippledGC == None) {
- XGCValues gcv;
-
- gcv.fill_style = FillOpaqueStippled;
- if ((dp->stippledGC = XCreateGC(MI_DISPLAY(mi), window,
- GCFillStyle, &gcv)) == None) {
- free_demon(mi);
- return;
- }
- }
- if (dp->init_bits == 0) {
- int i;
-
- for (i = 1; i < NUMSTIPPLES; i++) {
- DEMONBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
- }
- }
- }
-#endif /* DO_STIPPLE */
- free_struct(dp);
-
-#ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
-#endif
-
- for (nk = 0; nk < NEIGHBORKINDS; nk++) {
- if (neighbors == plots[0][nk]) {
- dp->neighbors = plots[0][nk];
- break;
- }
- if (nk == NEIGHBORKINDS - 1) {
- nk = NRAND(NEIGHBORKINDS);
- dp->neighbors = plots[0][nk];
- break;
- }
- }
-
- dp->states = MI_COUNT(mi);
- if (dp->states < -MINSTATES)
- dp->states = NRAND(-dp->states - MINSTATES + 1) + MINSTATES;
- else if (dp->states < MINSTATES)
- dp->states = plots[1][nk];
- if ((dp->cellList = (CellList **) calloc(dp->states,
- sizeof (CellList *))) == NULL) {
- free_demon(mi);
- return;
- }
- if ((dp->ncells = (int *) calloc(dp->states, sizeof (int))) == NULL) {
- free_demon(mi);
- return;
- }
-
- dp->state = 0;
-
- dp->width = MI_WIDTH(mi);
- dp->height = MI_HEIGHT(mi);
-
- if (dp->neighbors == 6) {
- int nccols, ncrows, i;
-
- if (dp->width < 8)
- dp->width = 8;
- if (dp->height < 8)
- dp->height = 8;
- if (size < -MINSIZE)
- dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
- MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
- else if (size < MINSIZE) {
- if (!size)
- dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
- else
- dp->ys = MINSIZE;
- } else
- dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
- MINGRIDSIZE));
- dp->xs = dp->ys;
- nccols = MAX(dp->width / dp->xs - 2, 2);
- ncrows = MAX(dp->height / dp->ys - 1, 4);
- dp->ncols = nccols / 2;
- dp->nrows = 2 * (ncrows / 4);
- dp->xb = (dp->width - dp->xs * nccols) / 2 + dp->xs / 2;
- dp->yb = (dp->height - dp->ys * (ncrows / 2) * 2) / 2 + dp->ys - 2;
- for (i = 0; i < 6; i++) {
- dp->shape.hexagon[i].x = (dp->xs - 1) * hexagonUnit[i].x;
- dp->shape.hexagon[i].y = ((dp->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
- }
- } else if (dp->neighbors == 4 || dp->neighbors == 8) {
- if (size < -MINSIZE)
- dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
- MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
- else if (size < MINSIZE) {
- if (!size)
- dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
- else
- dp->ys = MINSIZE;
- } else
- dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
- MINGRIDSIZE));
- dp->xs = dp->ys;
- dp->ncols = MAX(dp->width / dp->xs, 2);
- dp->nrows = MAX(dp->height / dp->ys, 2);
- dp->xb = (dp->width - dp->xs * dp->ncols) / 2;
- dp->yb = (dp->height - dp->ys * dp->nrows) / 2;
- } else { /* TRI */
- int orient, i;
-
- if (dp->width < 2)
- dp->width = 2;
- if (dp->height < 2)
- dp->height = 2;
- if (size < -MINSIZE)
- dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
- MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
- else if (size < MINSIZE) {
- if (!size)
- dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
- else
- dp->ys = MINSIZE;
- } else
- dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
- MINGRIDSIZE));
- dp->xs = (int) (1.52 * dp->ys);
- dp->ncols = (MAX(dp->width / dp->xs - 1, 2) / 2) * 2;
- dp->nrows = (MAX(dp->height / dp->ys - 1, 2) / 2) * 2;
- dp->xb = (dp->width - dp->xs * dp->ncols) / 2 + dp->xs / 2;
- dp->yb = (dp->height - dp->ys * dp->nrows) / 2 + dp->ys / 2;
- for (orient = 0; orient < 2; orient++) {
- for (i = 0; i < 3; i++) {
- dp->shape.triangle[orient][i].x =
- (dp->xs - 2) * triangleUnit[orient][i].x;
- dp->shape.triangle[orient][i].y =
- (dp->ys - 2) * triangleUnit[orient][i].y;
- }
- }
- }
-
- MI_CLEARWINDOW(mi);
-
- if ((dp->oldcell = (unsigned char *)
- malloc(dp->ncols * dp->nrows * sizeof (unsigned char))) == NULL) {
- free_demon(mi);
- return;
- }
-
- if ((dp->newcell = (unsigned char *)
- malloc(dp->ncols * dp->nrows * sizeof (unsigned char))) == NULL) {
- free_demon(mi);
- return;
- }
-
- RandomSoup(mi);
-}
-
-ENTRYPOINT void
-draw_demon (ModeInfo * mi)
-{
- int i, j, k, l, mj = 0, ml;
- demonstruct *dp;
-
- if (demons == NULL)
- return;
- dp = &demons[MI_SCREEN(mi)];
- if (dp->cellList == NULL)
- return;
-
- MI_IS_DRAWN(mi) = True;
- if (dp->state >= dp->states) {
- (void) memcpy((char *) dp->newcell, (char *) dp->oldcell,
- dp->ncols * dp->nrows * sizeof (unsigned char));
-
- if (dp->neighbors == 6) {
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++) {
- /* NE */
- if (!(j & 1))
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- else
- k = i;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* E */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SE */
- if (!(j & 1))
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- else
- k = i;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SW */
- if (j & 1)
- k = (!i) ? dp->ncols - 1 : i - 1;
- else
- k = i;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* W */
- k = (!i) ? dp->ncols - 1 : i - 1;
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* NW */
- if (j & 1)
- k = (!i) ? dp->ncols - 1 : i - 1;
- else
- k = i;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- mj += dp->ncols;
- }
- } else if (dp->neighbors == 4 || dp->neighbors == 8) {
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++) {
- /* N */
- k = i;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* E */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* S */
- k = i;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* W */
- k = (!i) ? dp->ncols - 1 : i - 1;
- /*l = j;*/
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- mj += dp->ncols;
- }
- if (dp->neighbors == 8) {
- mj = 0;
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++) {
- /* NE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* NW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- mj += dp->ncols;
- }
- }
- } else if (dp->neighbors == 3 || dp->neighbors == 9 ||
- dp->neighbors == 12) {
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++) {
- if ((i + j) % 2) { /* right */
- /* W */
- k = (!i) ? dp->ncols - 1 : i - 1;
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- } else { /* left */
- /* E */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- /* N */
- k = i;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* S */
- k = i;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- mj += dp->ncols;
- }
- if (dp->neighbors == 9 || dp->neighbors == 12) {
- mj = 0;
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++) {
- /* NN */
- k = i;
- if (!j)
- l = dp->nrows - 2;
- else if (!(j - 1))
- l = dp->nrows - 1;
- else
- l = j - 2;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SS */
- k = i;
- if (j + 1 == dp->nrows)
- l = 1;
- else if (j + 2 == dp->nrows)
- l = 0;
- else
- l = j + 2;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* NW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* NE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- l = (!j) ? dp->nrows - 1 : j - 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- l = (j + 1 == dp->nrows) ? 0 : j + 1;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- mj += dp->ncols;
- }
- if (dp->neighbors == 12) {
- mj = 0;
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++) {
- if ((i + j) % 2) { /* right */
- /* NNW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- if (!j)
- l = dp->nrows - 2;
- else if (!(j - 1))
- l = dp->nrows - 1;
- else
- l = j - 2;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SSW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- if (j + 1 == dp->nrows)
- l = 1;
- else if (j + 2 == dp->nrows)
- l = 0;
- else
- l = j + 2;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* EE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- /*l = j;*/
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- } else { /* left */
- /* NNE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- if (!j)
- l = dp->nrows - 2;
- else if (!(j - 1))
- l = dp->nrows - 1;
- else
- l = j - 2;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* SSE */
- k = (i + 1 == dp->ncols) ? 0 : i + 1;
- if (j + 1 == dp->nrows)
- l = 1;
- else if (j + 2 == dp->nrows)
- l = 0;
- else
- l = j + 2;
- ml = l * dp->ncols;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- /* WW */
- k = (!i) ? dp->ncols - 1 : i - 1;
- /*l = j;*/
- ml = mj;
- if (dp->oldcell[k + ml] ==
- (int) (dp->oldcell[i + mj] + 1) % dp->states)
- dp->newcell[i + mj] = dp->oldcell[k + ml];
- }
- }
- mj += dp->ncols;
- }
- }
- }
- }
- mj = 0;
- for (j = 0; j < dp->nrows; j++) {
- for (i = 0; i < dp->ncols; i++)
- if (dp->oldcell[i + mj] != dp->newcell[i + mj]) {
- dp->oldcell[i + mj] = dp->newcell[i + mj];
- if (!addtolist(mi, i, j, dp->oldcell[i + mj])) {
- free_demon(mi);
- return;
- }
- }
- mj += dp->ncols;
- }
- if (++dp->generation > MI_CYCLES(mi))
- init_demon(mi);
- dp->state = 0;
- } else {
- if (dp->ncells[dp->state])
- if (!draw_state(mi, dp->state)) {
- free_demon(mi);
- return;
- }
- dp->state++;
- }
- if (dp->redrawing) {
- for (i = 0; i < REDRAWSTEP; i++) {
- if (dp->oldcell[dp->redrawpos]) {
- drawcell(mi, dp->redrawpos % dp->ncols, dp->redrawpos / dp->ncols,
- dp->oldcell[dp->redrawpos]);
- }
- if (++(dp->redrawpos) >= dp->ncols * dp->nrows) {
- dp->redrawing = 0;
- break;
- }
- }
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_demon (ModeInfo * mi)
-{
- demonstruct *dp;
-
- if (demons == NULL)
- return;
- dp = &demons[MI_SCREEN(mi)];
-
- dp->redrawing = 1;
- dp->redrawpos = 0;
-}
-#endif
-
-XSCREENSAVER_MODULE ("Demon", demon)
-
-#endif /* MODE_demon */
diff --git a/hacks/demon.man b/hacks/demon.man
deleted file mode 100644
index 1fe5fb8..0000000
--- a/hacks/demon.man
+++ /dev/null
@@ -1,69 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-demon \- cellular automaton.
-.SH SYNOPSIS
-.B demon
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-size \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-A cellular automaton that starts with a random field, and organizes it into
-stripes and spirals.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-States. 0 - 20. Default: 0.
-.TP 8
-.B \-cycles \fInumber\fP
-Timeout. 0 - 800000. Default: 1000.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 50000 (0.05 seconds.).
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 64.
-.TP 8
-.B \-size \fInumber\fP
-Cell Size. -20 - 20. Default: -7.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-David Bagley.
diff --git a/hacks/discrete.c b/hacks/discrete.c
deleted file mode 100644
index bfb4459..0000000
--- a/hacks/discrete.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* discrete --- chaotic mappings */
-
-#if 0
-static const char sccsid[] = "@(#)discrete.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * "discrete" shows a number of fractals based on the "discrete map"
- * type of dynamical systems. They include a different way of looking
- * at the HOPALONG system, an inverse julia-set iteration, the "Standard
- * Map" and the "Bird in a Thornbush" fractal.
- *
- * Revision History:
- * 01-Nov-2000: Allocation checks
- * 31-Jul-1997: Ported to xlockmore-4
- * 08-Aug-1996: Adapted from hop.c Copyright (c) 1991 by Patrick J. Naughton.
- */
-
-#ifdef STANDALONE
-# define MODE_discrete
-#define DEFAULTS "*delay: 20000 \n" \
- "*count: 4096 \n" \
- "*cycles: 2500 \n" \
- "*ncolors: 100 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n" \
- "*lowrez: True \n" \
-
-# define SMOOTH_COLORS
-# define release_discrete 0
-# define discrete_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_discrete
-
-ENTRYPOINT ModeSpecOpt discrete_opts =
-{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
-
-#ifdef USE_MODULES
-ModStruct discrete_description =
-{"discrete", "init_discrete", "draw_discrete", (char *) NULL,
- "refresh_discrete", "init_discrete", "free_discrete", &discrete_opts,
- 1000, 4096, 2500, 1, 64, 1.0, "",
- "Shows various discrete maps", 0, NULL};
-
-#endif
-
-enum ftypes {
- SQRT, BIRDIE, STANDARD, TRIG, CUBIC, HENON, AILUJ, HSHOE, DELOG
-};
-
-/*#define TEST STANDARD */
-
-#define BIASES 18
-static enum ftypes bias[BIASES] =
-{
- STANDARD, STANDARD, STANDARD, STANDARD,
- SQRT, SQRT, SQRT, SQRT,
- BIRDIE, BIRDIE, BIRDIE,
- AILUJ, AILUJ, AILUJ,
- TRIG, TRIG,
- CUBIC,
- HENON,
-};
-
-typedef struct {
- int maxx;
- int maxy; /* max of the screen */
- double a;
- double b;
- double c;
- double d;
- double e;
- double i;
- double j; /* discrete parameters */
- double ic;
- double jc;
- double is;
- double js;
- int inc;
- int pix;
- enum ftypes op;
- int count;
- XPoint *pointBuffer; /* pointer for XDrawPoints */
-
- int sqrt_sign, std_sign;
-
-} discretestruct;
-
-static discretestruct *discretes = (discretestruct *) NULL;
-
-ENTRYPOINT void
-init_discrete (ModeInfo * mi)
-{
- double range;
- discretestruct *hp;
-
- MI_INIT (mi, discretes);
- hp = &discretes[MI_SCREEN(mi)];
-
- hp->maxx = MI_WIDTH(mi);
- hp->maxy = MI_HEIGHT(mi);
-#ifdef TEST
- hp->op = TEST;
-#else
- hp->op = bias[LRAND() % BIASES];
-#endif
- switch (hp->op) {
- case HSHOE:
- hp->ic = 0;
- hp->jc = 0;
- hp->is = hp->maxx / (4);
- hp->js = hp->maxy / (4);
- hp->a = 0.5;
- hp->b = 0.5;
- hp->c = 0.2;
- hp->d = -1.25;
- hp->e = 1;
- hp->i = hp->j = 0.0;
- break;
- case DELOG:
- hp->ic = 0.5;
- hp->jc = 0.3;
- hp->is = hp->maxx / 1.5;
- hp->js = hp->maxy / 1.5;
- hp->a = 2.176399;
- hp->i = hp->j = 0.01;
- break;
- case HENON:
- hp->jc = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.4;
- hp->ic = 1.3 * (1 - (hp->jc * hp->jc) / (0.4 * 0.4));
- hp->is = hp->maxx;
- hp->js = hp->maxy * 1.5;
- hp->a = 1;
- hp->b = 1.4;
- hp->c = 0.3;
- hp->i = hp->j = 0;
- break;
- case SQRT:
- hp->ic = 0;
- hp->jc = 0;
- hp->is = 1;
- hp->js = 1;
- range = sqrt((double) hp->maxx * 2 * hp->maxx * 2 +
- (double) hp->maxy * 2 * hp->maxy * 2) /
- (10.0 + LRAND() % 10);
-
- hp->a = (LRAND() / MAXRAND) * range - range / 2.0;
- hp->b = (LRAND() / MAXRAND) * range - range / 2.0;
- hp->c = (LRAND() / MAXRAND) * range - range / 2.0;
- if (!(LRAND() % 2))
- hp->c = 0.0;
- hp->i = hp->j = 0.0;
- break;
- case STANDARD:
- hp->ic = M_PI;
- hp->jc = M_PI;
- hp->is = hp->maxx / (M_PI * 2);
- hp->js = hp->maxy / (M_PI * 2);
- hp->a = 0; /* decay */
- hp->b = (LRAND() / MAXRAND) * 2.0;
- hp->c = 0;
- hp->i = M_PI;
- hp->j = M_PI;
- break;
- case BIRDIE:
- hp->ic = 0;
- hp->jc = 0;
- hp->is = hp->maxx / 2;
- hp->js = hp->maxy / 2;
- hp->a = 1.99 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.2;
- hp->b = 0;
- hp->c = 0.8 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
- hp->i = hp->j = 0;
- break;
- case TRIG:
- hp->a = 5;
- hp->b = 0.5 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.3;
- hp->ic = hp->a;
- hp->jc = 0;
- hp->is = hp->maxx / (hp->b * 20);
- hp->js = hp->maxy / (hp->b * 20);
- hp->i = hp->j = 0;
- break;
- case CUBIC:
- hp->a = 2.77;
- hp->b = 0.1 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
- hp->ic = 0;
- hp->jc = 0;
- hp->is = hp->maxx / 4;
- hp->js = hp->maxy / 4;
- hp->i = hp->j = 0.1;
- break;
- case AILUJ:
- {
- int i;
- double x, y, xn, yn;
-
- hp->ic = 0;
- hp->jc = 0;
- hp->is = hp->maxx / 4;
- hp->js = hp->maxx / 4;
- do {
- hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5 - 0.5;
- hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5;
- x = y = 0;
-#define MAXITER 10
- for (i = 0; i < MAXITER && x * x + y * y < 13; i++) { /* 'Brot calc */
- xn = x * x - y * y + hp->a;
- yn = 2 * x * y + hp->b;
- x = xn;
- y = yn;
- }
- } while (i < MAXITER); /* wait for a connected set */
- hp->i = hp->j = 0.1;
- break;
- }
- }
- hp->pix = 0;
- hp->inc = 0;
-
- if (hp->pointBuffer == NULL) {
- hp->pointBuffer = (XPoint *) malloc(sizeof (XPoint) * MI_COUNT(mi));
- /* if fails will check later */
- }
-
- /* Clear the background. */
- MI_CLEARWINDOW(mi);
-
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
- hp->count = 0;
- hp->sqrt_sign = 1;
- hp->std_sign = 1;
-}
-
-
-static void
-draw_discrete_1 (ModeInfo * mi)
-{
- Display *dsp = MI_DISPLAY(mi);
- Window win = MI_WINDOW(mi);
- double oldj, oldi;
- int count = MI_COUNT(mi);
- int cycles = MI_CYCLES(mi);
- int k;
- XPoint *xp;
- GC gc = MI_GC(mi);
- discretestruct *hp;
-
- if (discretes == NULL)
- return;
- hp = &discretes[MI_SCREEN(mi)];
- if (hp->pointBuffer == NULL)
- return;
-
- k = count;
- xp = hp->pointBuffer;
-
- hp->inc++;
-
- MI_IS_DRAWN(mi) = True;
-
- if (MI_NPIXELS(mi) > 2) {
- XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
- if (++hp->pix >= MI_NPIXELS(mi))
- hp->pix = 0;
- }
- while (k--) {
- oldj = hp->j;
- oldi = hp->i;
- switch (hp->op) {
- case HSHOE:
- {
- int i;
-
-#if 0
- if (!k) {
- XSetForeground(dsp, gc, MI_BLACK_PIXEL(mi));
- XFillRectangle(dsp, win, gc, 0, 0, hp->maxx, hp->maxy);
- XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
- } else
-#endif
-#define HD
-#ifdef HD
- if (k < count / 4) {
- hp->i = ((double) k / count) * 8 - 1;
- hp->j = 1;
- } else if (k < count / 2) {
- hp->i = 1;
- hp->j = 3 - ((double) k / count) * 8;
- } else if (k < 3 * count / 4) {
- hp->i = 5 - ((double) k / count) * 8;
- hp->j = -1;
- } else {
- hp->i = -1;
- hp->j = ((double) k / count) * 8 - 7;
- }
- for (i = 1; i < (hp->inc % 15); i++) {
- oldj = hp->j;
- oldi = hp->i;
-#endif
- hp->i = (hp->a * oldi + hp->b) * oldj;
- hp->j = (hp->e - hp->d + hp->c * oldi) * oldj * oldj - hp->c * oldi + hp->d;
-#ifdef HD
- }
-#endif
- break;
- }
- case DELOG:
- hp->j = oldi;
- hp->i = hp->a * oldi * (1 - oldj);
- break;
- case HENON:
- hp->i = oldj + hp->a - hp->b * oldi * oldi;
- hp->j = hp->c * oldi;
- break;
- case SQRT:
- if (k) {
- hp->j = hp->a + hp->i;
- hp->i = -oldj + (hp->i < 0
- ? sqrt(fabs(hp->b * (hp->i - hp->c)))
- : -sqrt(fabs(hp->b * (hp->i - hp->c))));
- } else {
- hp->i = (hp->sqrt_sign ? 1 : -1) * hp->inc * hp->maxx / cycles / 2;
- hp->j = hp->a + hp->i;
- hp->sqrt_sign = !hp->sqrt_sign;
- }
- break;
- case STANDARD:
- if (k) {
- hp->j = (1 - hp->a) * oldj + hp->b * sin(oldi) + hp->a * hp->c;
- hp->j = fmod(hp->j + 2 * M_PI, 2 * M_PI);
- hp->i = oldi + hp->j;
- hp->i = fmod(hp->i + 2 * M_PI, 2 * M_PI);
- } else {
- hp->j = M_PI + fmod((hp->std_sign ? 1 : -1) * hp->inc * 2 * M_PI / (cycles - 0.5), M_PI);
- hp->i = M_PI;
- hp->std_sign = !hp->std_sign;
- }
- break;
- case BIRDIE:
- hp->j = oldi;
- hp->i = (1 - hp->c) * cos(M_PI * hp->a * oldj) + hp->c * hp->b;
- hp->b = oldj;
- break;
- case TRIG:
- {
- double r2 = oldi * oldi + oldj * oldj;
-
- hp->i = hp->a + hp->b * (oldi * cos(r2) - oldj * sin(r2));
- hp->j = hp->b * (oldj * cos(r2) + oldi * sin(r2));
- }
- break;
- case CUBIC:
- hp->i = oldj;
- hp->j = hp->a * oldj - oldj * oldj * oldj - hp->b * oldi;
- break;
- case AILUJ:
- hp->i = ((LRAND() < MAXRAND / 2) ? -1 : 1) *
- sqrt(((oldi - hp->a) +
- sqrt((oldi - hp->a) * (oldi - hp->a) + (oldj - hp->b) * (oldj - hp->b))) / 2);
- if (hp->i < 0.00000001 && hp->i > -0.00000001)
- hp->i = (hp->i > 0.0) ? 0.00000001 : -0.00000001;
- hp->j = (oldj - hp->b) / (2 * hp->i);
- break;
- }
- xp->x = hp->maxx / 2 + (int) ((hp->i - hp->ic) * hp->is);
- xp->y = hp->maxy / 2 - (int) ((hp->j - hp->jc) * hp->js);
- xp++;
- }
- XDrawPoints(dsp, win, gc, hp->pointBuffer, count, CoordModeOrigin);
-}
-
-ENTRYPOINT void
-draw_discrete (ModeInfo * mi)
-{
- discretestruct *hp = &discretes[MI_SCREEN(mi)];
- int cycles = MI_CYCLES(mi);
- int i;
-
- for (i = 0; i < 10; i++) {
- draw_discrete_1 (mi);
- hp->count++;
- }
-
- if (hp->count > cycles) {
- init_discrete(mi);
- }
-}
-
-
-ENTRYPOINT void
-reshape_discrete(ModeInfo * mi, int width, int height)
-{
- discretestruct *hp = &discretes[MI_SCREEN(mi)];
- hp->maxx = width;
- hp->maxy = height;
- XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
-}
-
-ENTRYPOINT void
-free_discrete(ModeInfo * mi)
-{
- discretestruct *hp = &discretes[MI_SCREEN(mi)];
-
- if (hp->pointBuffer != NULL) {
- (void) free((void *) hp->pointBuffer);
- /* hp->pointBuffer = NULL; */
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_discrete(ModeInfo * mi)
-{
- MI_CLEARWINDOW(mi);
-}
-#endif
-
-XSCREENSAVER_MODULE ("Discrete", discrete)
-
-#endif /* MODE_discrete */
diff --git a/hacks/discrete.man b/hacks/discrete.man
deleted file mode 100644
index d3c6c5b..0000000
--- a/hacks/discrete.man
+++ /dev/null
@@ -1,61 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-discrete \- discrete map iterative function fractal systems.
-.SH SYNOPSIS
-.B discrete
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-cycles \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-More ``discrete map'' systems, including new variants of Hopalong and
-Julia, and a few others.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-cycles \fInumber\fP
-Timeout. 100 - 10000. Default: 2500.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 100.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Tim Auckland. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Tim Auckland.
diff --git a/hacks/distort.c b/hacks/distort.c
deleted file mode 100644
index a3586cf..0000000
--- a/hacks/distort.c
+++ /dev/null
@@ -1,897 +0,0 @@
-/* -*- mode: C; tab-width: 4 -*-
- * xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* distort
- * by Jonas Munsin (jmunsin@iki.fi) and Jamie Zawinski <jwz@jwz.org>
- * TODO:
- * -check the allocations in init_round_lense again, maybe make it possible again
- * to use swamp without pre-allocating/calculating (although that
- * makes it slower) - -swamp is memory hungry
- * -more distortion matrices (fortunately, I'm out of ideas :)
- * Stuff that would be cool but probably too much of a resource hog:
- * -some kind of interpolation to avoid jaggies
- * -large speed values leaves the image distorted
- * program idea borrowed from a screensaver on a non-*NIX OS,
- *
- * 28 Sep 1999 Jonas Munsin (jmunsin@iki.fi)
- * Added about 10x faster algortim for 8, 16 and 32 bpp (modifies pixels
- * directly avoiding costly XPutPixle(XGetPixel()) calls, inspired by
- * xwhirl made by horvai@clipper.ens.fr (Peter Horvai) and the XFree86
- * Xlib sources.
- * This piece of code is really horrible, but it works, and at the moment
- * I don't have time or inspiration to fix something that works (knock
- * on wood).
- * 08 Oct 1999 Jonas Munsin (jmunsin@iki.fi)
- * Corrected several bugs causing references beyond allocated memory.
- * 09 Oct 2016 Dave Odell (dmo2118@gmail.com)
- * Updated for new xshm.c.
- */
-
-#include <math.h>
-#include <time.h>
-#include "screenhack.h"
-/*#include <X11/Xmd.h>*/
-# include "xshm.h"
-
-#define CARD32 unsigned int
-#define CARD16 unsigned short
-#define CARD8 unsigned char
-
-
-struct coo {
- int x;
- int y;
- int r, r_change;
- int xmove, ymove;
-};
-
-struct state {
- Display *dpy;
- Window window;
-
- struct coo xy_coo[10];
-
- int delay, radius, speed, number, blackhole, vortex, magnify, reflect, slow;
- int duration;
- time_t start_time;
-
- XWindowAttributes xgwa;
- GC gc;
- unsigned long black_pixel;
-
- XImage *orig_map, *buffer_map;
- unsigned long *buffer_map_cache;
-
- int ***from;
- int ****from_array;
- int *fast_from;
- int from_size;
-
- int bpp_size;
-
- XShmSegmentInfo shm_info;
-
- void (*effect) (struct state *, int);
- void (*draw) (struct state *, int);
- void (*draw_routine) (struct state *st, XImage *, XImage *, int, int, int *);
-
- async_load_state *img_loader;
- Pixmap pm;
-};
-
-
-static void move_lense(struct state *, int);
-static void swamp_thing(struct state *, int);
-static void new_rnd_coo(struct state *, int);
-static void init_round_lense(struct state *st);
-static void reflect_draw(struct state *, int);
-static void plain_draw(struct state *, int);
-
-static void fast_draw_8 (struct state *st, XImage *, XImage *, int, int, int *);
-static void fast_draw_16(struct state *st, XImage *, XImage *, int, int, int *);
-static void fast_draw_32(struct state *st, XImage *, XImage *, int, int, int *);
-static void generic_draw(struct state *st, XImage *, XImage *, int, int, int *);
-
-
-static void distort_finish_loading (struct state *);
-
-static void
-distort_reset (struct state *st)
-{
- char *s;
- int i;
-
- st->start_time = 0;
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- st->delay = get_integer_resource(st->dpy, "delay", "Integer");
- st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
- st->radius = get_integer_resource(st->dpy, "radius", "Integer");
- st->speed = get_integer_resource(st->dpy, "speed", "Integer");
- st->number = get_integer_resource(st->dpy, "number", "Integer");
-
- st->blackhole = get_boolean_resource(st->dpy, "blackhole", "Boolean");
- st->vortex = get_boolean_resource(st->dpy, "vortex", "Boolean");
- st->magnify = get_boolean_resource(st->dpy, "magnify", "Boolean");
- st->reflect = get_boolean_resource(st->dpy, "reflect", "Boolean");
- st->slow = get_boolean_resource(st->dpy, "slow", "Boolean");
-
- if (st->xgwa.width > 2560) st->radius *= 3; /* Retina displays */
-
- if (st->delay < 0) st->delay = 0;
- if (st->duration < 1) st->duration = 1;
-
- st->effect = NULL;
- s = get_string_resource(st->dpy, "effect", "String");
- if (s && !strcasecmp(s,"swamp"))
- st->effect = &swamp_thing;
- else if (s && !strcasecmp(s,"bounce"))
- st->effect = &move_lense;
- else if (s && !strcasecmp(s,"none"))
- ;
- else if (s && *s)
- fprintf(stderr,"%s: bogus effect: %s\n", progname, s);
- if (s) free (s);
-
- if (st->effect == NULL && st->radius == 0 && st->speed == 0 && st->number == 0
- && !st->blackhole && !st->vortex && !st->magnify && !st->reflect) {
-/* if no cmdline options are given, randomly choose one of:
- * -radius 125 -number 4 -speed 1 -bounce
- * -radius 125 -number 4 -speed 1 -blackhole
- * -radius 125 -number 4 -speed 1 -vortex
- * -radius 125 -number 4 -speed 1 -vortex -magnify
- * -radius 125 -number 4 -speed 1 -vortex -magnify -blackhole
- * -radius 250 -number 1 -speed 2 -bounce
- * -radius 250 -number 1 -speed 2 -blackhole
- * -radius 250 -number 1 -speed 2 -vortex
- * -radius 250 -number 1 -speed 2 -vortex -magnify
- * -radius 250 -number 1 -speed 2 -vortex -magnify -blackhole
- * -radius 80 -number 1 -speed 2 -reflect
- * -radius 125 -number 3 -speed 2 -reflect
- * jwz: not these
- * -radius 125 -number 4 -speed 2 -swamp
- * -radius 125 -number 4 -speed 2 -swamp -blackhole
- * -radius 125 -number 4 -speed 2 -swamp -vortex
- * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify
- * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify -blackhole
- */
-
- i = (random() % 12 /* 17 */);
-
- st->draw = &plain_draw;
-
- switch (i) {
- case 0:
- st->radius=125;st->number=4;st->speed=1;
- st->effect=&move_lense;break;
- case 1:
- st->radius=125;st->number=4;st->speed=1;st->blackhole=1;
- st->effect=&move_lense;break;
- case 2:
- st->radius=125;st->number=4;st->speed=1;st->vortex=1;
- st->effect=&move_lense;break;
- case 3:
- st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;
- st->effect=&move_lense;break;
- case 4:
- st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;st->blackhole=1;
- st->effect=&move_lense;break;
- case 5:
- st->radius=250;st->number=1;st->speed=2;
- st->effect=&move_lense;break;
- case 6:
- st->radius=250;st->number=1;st->speed=2;st->blackhole=1;
- st->effect=&move_lense;break;
- case 7:
- st->radius=250;st->number=1;st->speed=2;st->vortex=1;
- st->effect=&move_lense;break;
- case 8:
- st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;
- st->effect=&move_lense;break;
- case 9:
- st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
- st->effect=&move_lense;break;
-
- case 10:
- st->radius=80;st->number=1;st->speed=2;st->reflect=1;
- st->draw = &reflect_draw;st->effect = &move_lense;break;
- case 11:
- st->radius=125;st->number=4;st->speed=2;st->reflect=1;
- st->draw = &reflect_draw;st->effect = &move_lense;break;
-
-#if 0 /* jwz: not these */
- case 12:
- st->radius=125;st->number=4;st->speed=2;
- effect=&swamp_thing;break;
- case 13:
- st->radius=125;st->number=4;st->speed=2;st->blackhole=1;
- effect=&swamp_thing;break;
- case 14:
- st->radius=125;st->number=4;st->speed=2;st->vortex=1;
- effect=&swamp_thing;break;
- case 15:
- st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;
- effect=&swamp_thing;break;
- case 16:
- st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
- effect=&swamp_thing;break;
-#endif
-
- default:
- abort(); break;
- }
- }
-
- /* never allow the radius to be too close to the min window dimension
- */
- if (st->radius > st->xgwa.width * 0.3) st->radius = st->xgwa.width * 0.3;
- if (st->radius > st->xgwa.height * 0.3) st->radius = st->xgwa.height * 0.3;
-
-
- /* -swamp mode consumes vast amounts of memory, proportional to radius --
- so throttle radius to a small-ish value (60 => ~30MB.)
- */
- if (st->effect == &swamp_thing && st->radius > 60)
- st->radius = 60;
-
- if (st->delay < 0)
- st->delay = 0;
- if (st->radius <= 0)
- st->radius = 60;
- if (st->speed <= 0)
- st->speed = 2;
- if (st->number <= 0)
- st->number=1;
- if (st->number >= 10)
- st->number=1;
- if (st->effect == NULL)
- st->effect = &move_lense;
- if (st->reflect) {
- st->draw = &reflect_draw;
- st->effect = &move_lense;
- }
- if (st->draw == NULL)
- st->draw = &plain_draw;
-}
-
-static void *
-distort_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- long gcflags;
-
- st->dpy = dpy;
- st->window = window;
-
- distort_reset (st);
-
- st->black_pixel = BlackPixelOfScreen( st->xgwa.screen );
-
- gcv.function = GXcopy;
- gcv.subwindow_mode = IncludeInferiors;
- gcflags = GCFunction;
- if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */
- gcflags |= GCSubwindowMode;
- st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
-
- /* On MacOS X11, XGetImage on a Window often gets an inexplicable BadMatch,
- possibly due to the window manager having occluded something? It seems
- nondeterministic. Loading the image into a pixmap instead fixes it. */
- if (st->pm) XFreePixmap (st->dpy, st->pm);
- st->pm = XCreatePixmap (st->dpy, st->window,
- st->xgwa.width, st->xgwa.height, st->xgwa.depth);
-
- st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
- st->pm, 0, 0);
- st->start_time = time ((time_t *) 0);
- return st;
-}
-
-static void
-distort_finish_loading (struct state *st)
-{
- int i;
-
- st->start_time = time ((time_t *) 0);
-
- if (! st->pm) abort();
- XClearWindow (st->dpy, st->window);
- XCopyArea (st->dpy, st->pm, st->window, st->gc,
- 0, 0, st->xgwa.width, st->xgwa.height, 0, 0);
- if (st->orig_map) XDestroyImage (st->orig_map);
- st->orig_map = XGetImage(st->dpy, st->pm, 0, 0,
- st->xgwa.width, st->xgwa.height,
- ~0L, ZPixmap);
- if (st->buffer_map_cache) free (st->buffer_map_cache);
- st->buffer_map_cache = malloc(sizeof(unsigned long)*(2*st->radius+st->speed+2)*(2*st->radius+st->speed+2));
-
- if (st->buffer_map_cache == NULL) {
- perror("distort");
- exit(EXIT_FAILURE);
- }
-
- if (st->buffer_map)
- destroy_xshm_image (st->dpy, st->buffer_map, &st->shm_info);
- st->buffer_map = create_xshm_image(st->dpy, st->xgwa.visual, st->orig_map->depth,
- ZPixmap, &st->shm_info,
- 2*st->radius + st->speed + 2,
- 2*st->radius + st->speed + 2);
-
- if ((st->buffer_map->byte_order == st->orig_map->byte_order)
- && (st->buffer_map->depth == st->orig_map->depth)
- && (st->buffer_map->format == ZPixmap)
- && (st->orig_map->format == ZPixmap)
- && !st->slow) {
- switch (st->orig_map->bits_per_pixel) {
- case 32:
- st->draw_routine = &fast_draw_32;
- st->bpp_size = sizeof(CARD32);
- break;
- case 16:
- st->draw_routine = &fast_draw_16;
- st->bpp_size = sizeof(CARD16);
- break;
- case 8:
- st->draw_routine = &fast_draw_8;
- st->bpp_size = sizeof(CARD8);
- break;
- default:
- st->draw_routine = &generic_draw;
- break;
- }
- } else {
- st->draw_routine = &generic_draw;
- }
- init_round_lense(st);
-
- for (i = 0; i < st->number; i++) {
- new_rnd_coo(st,i);
- if (st->number != 1)
- st->xy_coo[i].r = (i*st->radius)/(st->number-1); /* "randomize" initial */
- else
- st->xy_coo[i].r = 0;
- st->xy_coo[i].r_change = st->speed + (i%2)*2*(-st->speed); /* values a bit */
- st->xy_coo[i].xmove = st->speed + (i%2)*2*(-st->speed);
- st->xy_coo[i].ymove = st->speed + (i%2)*2*(-st->speed);
- }
-}
-
-/* example: initializes a "see-trough" matrix */
-/* static void make_null_lense(struct state *st)
-{
- int i, j;
- for (i = 0; i < 2*radius+speed+2; i++) {
- for (j = 0 ; j < 2*radius+speed+2 ; j++) {
- from[i][j][0]=i;
- from[i][j][1]=j;
- }
- }
-}
-*/
-static void convert(struct state *st)
-{
- int *p;
- int i, j;
- if (st->fast_from) free (st->fast_from);
- st->fast_from = calloc(1, sizeof(int)*((st->buffer_map->bytes_per_line/st->bpp_size)*(2*st->radius+st->speed+2) + 2*st->radius+st->speed+2));
- if (st->fast_from == NULL) {
- perror("distort");
- exit(EXIT_FAILURE);
- }
- p = st->fast_from;
- for (i = 0; i < 2*st->radius+st->speed+2; i++) {
- for (j = 0; j < 2*st->radius+st->speed+2; j++) {
- *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size)
- = st->from[i][j][0] + st->xgwa.width*st->from[i][j][1];
- if (*(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) < 0
- || *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) >= st->orig_map->height*st->orig_map->width) {
- *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) = 0;
- }
- }
- }
-}
-
-/* makes a lense with the Radius=loop and centred in
- * the point (radius, radius)
- */
-static void make_round_lense(struct state *st, int radius, int loop)
-{
- int i, j;
-
- for (i = 0; i < 2*radius+st->speed+2; i++) {
- for(j = 0; j < ((0 == st->bpp_size) ? (2*radius+st->speed+2) : (st->buffer_map->bytes_per_line/st->bpp_size)); j++) {
- double r, d;
- r = sqrt ((i-radius)*(i-radius)+(j-radius)*(j-radius));
- if (loop == 0)
- d=0.0;
- else
- d=r/loop;
-
- if (r < loop-1) {
-
- if (st->vortex) { /* vortex-twist effect */
- double angle;
- /* this one-line formula for getting a nice rotation angle is borrowed
- * (with permission) from the whirl plugin for gimp,
- * Copyright (C) 1996 Federico Mena Quintero
- */
- /* 5 is just a constant used because it looks good :) */
- angle = 5*(1-d)*(1-d);
-
- /* Avoid atan2: DOMAIN error message */
- if ((radius-j) == 0.0 && (radius-i) == 0.0) {
- st->from[i][j][0] = radius + cos(angle)*r;
- st->from[i][j][1] = radius + sin(angle)*r;
- } else {
- st->from[i][j][0] = radius +
- cos(angle - atan2(radius-j, -(radius-i)))*r;
- st->from[i][j][1] = radius +
- sin(angle - atan2(radius-j, -(radius-i)))*r;
- }
- if (st->magnify) {
- r = sin(d*M_PI_2);
- if (st->blackhole && r != 0) /* blackhole effect */
- r = 1/r;
- st->from[i][j][0] = radius + (st->from[i][j][0]-radius)*r;
- st->from[i][j][1] = radius + (st->from[i][j][1]-radius)*r;
- }
- } else { /* default is to magnify */
- r = sin(d*M_PI_2);
-
- /* raising r to different power here gives different amounts of
- * distortion, a negative value sucks everything into a black hole
- */
- /* r = r*r; */
- if (st->blackhole && r != 0) /* blackhole effect */
- r = 1/r;
- /* bubble effect (and blackhole) */
- st->from[i][j][0] = radius + (i-radius)*r;
- st->from[i][j][1] = radius + (j-radius)*r;
- }
- } else { /* not inside loop */
- st->from[i][j][0] = i;
- st->from[i][j][1] = j;
- }
- }
- }
-
- /* this is really just a quick hack to keep both the compability mode with all depths and still
- * allow the custom optimized draw routines with the minimum amount of work */
- if (0 != st->bpp_size) {
- convert(st);
- }
-}
-
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE -1
-#endif
-
-static void allocate_lense(struct state *st)
-{
- int i, j;
- int s = ((0 != st->bpp_size) ? (st->buffer_map->bytes_per_line/st->bpp_size) : (2*st->radius+st->speed+2));
- /* maybe this should be redone so that from[][][] is in one block;
- * then pointers could be used instead of arrays in some places (and
- * maybe give a speedup - maybe also consume less memory)
- */
- if (st->from) {
- for (i = 0; i < st->from_size; i++)
- if (st->from[i]) {
- for (j = 0; j < st->from_size; j++) {
- if (st->from[i][j]) free (st->from[i][j]);
- }
- free (st->from[i]);
- }
- free (st->from);
- }
- st->from_size = s;
- st->from = (int ***)malloc(s*sizeof(int **));
- if (st->from == NULL) {
- perror("distort");
- exit(EXIT_FAILURE);
- }
- for (i = 0; i < s; i++) {
- st->from[i] = (int **)malloc((2*st->radius+st->speed+2) * sizeof(int *));
- if (st->from[i] == NULL) {
- perror("distort");
- exit(EXIT_FAILURE);
- }
- for (j = 0; j < s; j++) {
- st->from[i][j] = (int *)malloc(2 * sizeof(int));
- if (st->from[i][j] == NULL) {
- perror("distort");
- exit(EXIT_FAILURE);
- }
- }
- }
-}
-
-/* from_array in an array containing precalculated from matrices,
- * this is a double faced mem vs speed trade, it's faster, but eats
- * _a lot_ of mem for large radius (is there a bug here? I can't see it)
- */
-static void init_round_lense(struct state *st)
-{
- int k;
-
- if (st->effect == &swamp_thing) {
- if (st->from_array) free (st->from_array);
- st->from_array = (int ****)malloc((st->radius+1)*sizeof(int ***));
- for (k=0; k <= st->radius; k++) {
- allocate_lense(st);
- make_round_lense(st, st->radius, k);
- st->from_array[k] = st->from;
- }
- } else { /* just allocate one from[][][] */
- allocate_lense(st);
- make_round_lense(st, st->radius,st->radius);
- }
-}
-
-/* If fast_draw_8, fast_draw_16 or fast_draw_32 are to be used, the following properties
- * of the src and dest XImages must hold (otherwise the generic, slooow, method provided
- * by X is to be used):
- * src->byte_order == dest->byte_order
- * src->format == ZPixmap && dest->format == ZPixmap
- * src->depth == dest->depth == the depth the function in question asumes
- * x and y is the coordinates in src from where to cut out the image from,
- * distort_matrix is a precalculated array of how to distort the matrix
- */
-
-static void fast_draw_8(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
-{
- CARD8 *u = (CARD8 *)dest->data;
- CARD8 *t = (CARD8 *)src->data + x + y*src->bytes_per_line/sizeof(CARD8);
-
- while (u < (CARD8 *)(dest->data + sizeof(CARD8)*dest->height
- *dest->bytes_per_line/sizeof(CARD8))) {
- *u++ = t[*distort_matrix++];
- }
-}
-
-static void fast_draw_16(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
-{
- CARD16 *u = (CARD16 *)dest->data;
- CARD16 *t = (CARD16 *)src->data + x + y*src->bytes_per_line/sizeof(CARD16);
-
- while (u < (CARD16 *)(dest->data + sizeof(CARD16)*dest->height
- *dest->bytes_per_line/sizeof(CARD16))) {
- *u++ = t[*distort_matrix++];
- }
-}
-
-static void fast_draw_32(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
-{
- CARD32 *u = (CARD32 *)dest->data;
- CARD32 *t = (CARD32 *)src->data + x + y*src->bytes_per_line/sizeof(CARD32);
-
- while (u < (CARD32 *)(dest->data + sizeof(CARD32)*dest->height
- *dest->bytes_per_line/sizeof(CARD32))) {
- *u++ = t[*distort_matrix++];
- }
-}
-
-static void generic_draw(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
-{
- int i, j;
- for (i = 0; i < dest->width; i++)
- for (j = 0; j < dest->height; j++)
- if (st->from[i][j][0] + x >= 0 &&
- st->from[i][j][0] + x < src->width &&
- st->from[i][j][1] + y >= 0 &&
- st->from[i][j][1] + y < src->height)
- XPutPixel(dest, i, j,
- XGetPixel(src,
- st->from[i][j][0] + x,
- st->from[i][j][1] + y));
-}
-
-/* generate an XImage of from[][][] and draw it on the screen */
-static void plain_draw(struct state *st, int k)
-{
- if (st->xy_coo[k].x+2*st->radius+st->speed+2 > st->orig_map->width ||
- st->xy_coo[k].y+2*st->radius+st->speed+2 > st->orig_map->height)
- return;
-
- st->draw_routine(st, st->orig_map, st->buffer_map, st->xy_coo[k].x, st->xy_coo[k].y, st->fast_from);
-
- put_xshm_image(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, st->xy_coo[k].x, st->xy_coo[k].y,
- 2*st->radius+st->speed+2, 2*st->radius+st->speed+2, &st->shm_info);
-}
-
-
-/* generate an XImage from the reflect algoritm submitted by
- * Randy Zack <randy@acucorp.com>
- * draw really got too big and ugly so I split it up
- * it should be possible to use the from[][] to speed it up
- * (once I figure out the algorithm used :)
- */
-static void reflect_draw(struct state *st, int k)
-{
- int i, j;
- int cx, cy;
- int ly, lysq, lx, ny, dist, rsq = st->radius * st->radius;
-
- cx = cy = st->radius;
- if (st->xy_coo[k].ymove > 0)
- cy += st->speed;
- if (st->xy_coo[k].xmove > 0)
- cx += st->speed;
-
- for(i = 0 ; i < 2*st->radius+st->speed+2; i++) {
- ly = i - cy;
- lysq = ly * ly;
- ny = st->xy_coo[k].y + i;
- if (ny >= st->orig_map->height) ny = st->orig_map->height-1;
- for(j = 0 ; j < 2*st->radius+st->speed+2 ; j++) {
- lx = j - cx;
- dist = lx * lx + lysq;
- if (dist > rsq ||
- ly < -st->radius || ly > st->radius ||
- lx < -st->radius || lx > st->radius)
- XPutPixel( st->buffer_map, j, i,
- XGetPixel( st->orig_map, st->xy_coo[k].x + j, ny ));
- else if (dist == 0)
- XPutPixel( st->buffer_map, j, i, st->black_pixel );
- else {
- int x = st->xy_coo[k].x + cx + (lx * rsq / dist);
- int y = st->xy_coo[k].y + cy + (ly * rsq / dist);
- if (x < 0 || x >= st->xgwa.width ||
- y < 0 || y >= st->xgwa.height)
- XPutPixel( st->buffer_map, j, i, st->black_pixel );
- else
- XPutPixel( st->buffer_map, j, i,
- XGetPixel( st->orig_map, x, y ));
- }
- }
- }
-
- XPutImage(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, st->xy_coo[k].x, st->xy_coo[k].y,
- 2*st->radius+st->speed+2, 2*st->radius+st->speed+2);
-}
-
-/* create a new, random coordinate, that won't interfer with any other
- * coordinates, as the drawing routines would be significantly slowed
- * down if they were to handle serveral layers of distortions
- */
-static void new_rnd_coo(struct state *st, int k)
-{
- int i;
- int loop = 0;
-
- st->xy_coo[k].x = (random() % (st->xgwa.width-2*st->radius));
- st->xy_coo[k].y = (random() % (st->xgwa.height-2*st->radius));
-
- for (i = 0; i < st->number; i++) {
- if (i != k) {
- if ((abs(st->xy_coo[k].x - st->xy_coo[i].x) <= 2*st->radius+st->speed+2)
- && (abs(st->xy_coo[k].y - st->xy_coo[i].y) <= 2*st->radius+st->speed+2)) {
- st->xy_coo[k].x = (random() % (st->xgwa.width-2*st->radius));
- st->xy_coo[k].y = (random() % (st->xgwa.height-2*st->radius));
- i=-1; /* ugly */
- }
- }
- if (loop++ > 1000) return; /* let's not get stuck */
- }
-}
-
-/* move lens and handle bounces with walls and other lenses */
-static void move_lense(struct state *st, int k)
-{
- int i;
-
- if (st->xy_coo[k].x + 2*st->radius + st->speed + 2 >= st->xgwa.width)
- st->xy_coo[k].xmove = -abs(st->xy_coo[k].xmove);
- if (st->xy_coo[k].x <= st->speed)
- st->xy_coo[k].xmove = abs(st->xy_coo[k].xmove);
- if (st->xy_coo[k].y + 2*st->radius + st->speed + 2 >= st->xgwa.height)
- st->xy_coo[k].ymove = -abs(st->xy_coo[k].ymove);
- if (st->xy_coo[k].y <= st->speed)
- st->xy_coo[k].ymove = abs(st->xy_coo[k].ymove);
-
- st->xy_coo[k].x = st->xy_coo[k].x + st->xy_coo[k].xmove;
- st->xy_coo[k].y = st->xy_coo[k].y + st->xy_coo[k].ymove;
-
- /* bounce against othe lenses */
- for (i = 0; i < st->number; i++) {
- if ((i != k)
-
-/* This commented test is for rectangular lenses (not currently used) and
- * the one used is for circular ones
- && (abs(xy_coo[k].x - xy_coo[i].x) <= 2*radius)
- && (abs(xy_coo[k].y - xy_coo[i].y) <= 2*radius)) { */
-
- && ((st->xy_coo[k].x - st->xy_coo[i].x)*(st->xy_coo[k].x - st->xy_coo[i].x)
- + (st->xy_coo[k].y - st->xy_coo[i].y)*(st->xy_coo[k].y - st->xy_coo[i].y)
- <= 2*st->radius*2*st->radius)) {
-
- int x, y;
- x = st->xy_coo[k].xmove;
- y = st->xy_coo[k].ymove;
- st->xy_coo[k].xmove = st->xy_coo[i].xmove;
- st->xy_coo[k].ymove = st->xy_coo[i].ymove;
- st->xy_coo[i].xmove = x;
- st->xy_coo[i].ymove = y;
- }
- }
-
-}
-
-/* make xy_coo[k] grow/shrink */
-static void swamp_thing(struct state *st, int k)
-{
- if (st->xy_coo[k].r >= st->radius)
- st->xy_coo[k].r_change = -abs(st->xy_coo[k].r_change);
-
- if (st->xy_coo[k].r <= 0) {
- st->from = st->from_array[0];
- st->draw(st,k);
- st->xy_coo[k].r_change = abs(st->xy_coo[k].r_change);
- new_rnd_coo(st,k);
- st->xy_coo[k].r=st->xy_coo[k].r_change;
- return;
- }
-
- st->xy_coo[k].r = st->xy_coo[k].r + st->xy_coo[k].r_change;
-
- if (st->xy_coo[k].r >= st->radius)
- st->xy_coo[k].r = st->radius;
- if (st->xy_coo[k].r <= 0)
- st->xy_coo[k].r=0;
-
- st->from = st->from_array[st->xy_coo[k].r];
-}
-
-
-static unsigned long
-distort_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int k;
-
- if (st->img_loader) /* still loading */
- {
- st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
- if (! st->img_loader) { /* just finished */
- distort_finish_loading (st);
- }
- return st->delay;
- }
-
- if (!st->img_loader &&
- st->start_time + st->duration < time ((time_t *) 0)) {
- if (st->pm) XFreePixmap (st->dpy, st->pm);
- st->pm = XCreatePixmap (st->dpy, st->window,
- st->xgwa.width, st->xgwa.height, st->xgwa.depth);
- st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
- st->pm, 0, 0);
- return st->delay;
- }
-
- for (k = 0; k < st->number; k++) {
- st->effect(st,k);
- st->draw(st,k);
- }
- return st->delay;
-}
-
-static void
-distort_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
- /* XClearWindow (dpy, window); */
- /* Why doesn't this work? */
- if (st->orig_map) /* created in distort_finish_loading, might be early */
- XPutImage (st->dpy, st->window, st->gc, st->orig_map,
- 0, 0, st->orig_map->width, st->orig_map->height, 0, 0);
-}
-
-static Bool
-distort_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- distort_reset(st);
- return True;
- }
- return False;
-}
-
-static void
-distort_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i, j;
- XFreeGC (st->dpy, st->gc);
- if (st->pm) XFreePixmap (dpy, st->pm);
- if (st->orig_map) XDestroyImage (st->orig_map);
- if (st->buffer_map)
- destroy_xshm_image (st->dpy, st->buffer_map, &st->shm_info);
- if (st->fast_from) free (st->fast_from);
- if (st->from_array) free (st->from_array);
- if (st->buffer_map_cache) free (st->buffer_map_cache);
-
- if (st->from) {
- for (i = 0; i < st->from_size; i++)
- if (st->from[i]) {
- for (j = 0; j < st->from_size; j++) {
- if (st->from[i][j]) free (st->from[i][j]);
- }
- free (st->from[i]);
- }
- free (st->from);
- }
-
- free (st);
-}
-
-
-
-
-static const char *distort_defaults [] = {
- "*dontClearRoot: True",
- "*background: Black",
- "*fpsSolid: true",
-#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
- "*visualID: Best",
-#endif
-
- "*delay: 20000",
- "*duration: 120",
- "*radius: 0",
- "*speed: 0",
- "*number: 0",
- "*slow: False",
- "*vortex: False",
- "*magnify: False",
- "*reflect: False",
- "*blackhole: False",
- "*effect: none",
-#ifdef HAVE_XSHM_EXTENSION
- "*useSHM: False", /* xshm turns out not to help. */
-#endif /* HAVE_XSHM_EXTENSION */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
- "*rotateImages: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec distort_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
- { "-radius", ".radius", XrmoptionSepArg, 0 },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-number", ".number", XrmoptionSepArg, 0 },
-
- { "-effect", ".effect", XrmoptionSepArg, 0 },
- { "-swamp", ".effect", XrmoptionNoArg, "swamp" },
- { "-bounce", ".effect", XrmoptionNoArg, "bounce" },
-
- { "-reflect", ".reflect", XrmoptionNoArg, "True" },
- { "-vortex", ".vortex", XrmoptionNoArg, "True" },
- { "-magnify", ".magnify", XrmoptionNoArg, "True" },
- { "-blackhole", ".blackhole", XrmoptionNoArg, "True" },
- { "-slow", ".slow", XrmoptionNoArg, "True" },
-#ifdef HAVE_XSHM_EXTENSION
- { "-shm", ".useSHM", XrmoptionNoArg, "True" },
- { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
-#endif /* HAVE_XSHM_EXTENSION */
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("Distort", distort)
diff --git a/hacks/distort.man b/hacks/distort.man
deleted file mode 100644
index f26cab6..0000000
--- a/hacks/distort.man
+++ /dev/null
@@ -1,137 +0,0 @@
-.TH XScreenSaver 1 "17-Oct-99" "X Version 11"
-.SH NAME
-distort \- distort the content of the screen in interesting ways
-.SH SYNOPSIS
-.B distort
-[\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIvisual\fP]
-[\-window\-id \fIwindow\-id\fP]
-[\-delay \fIusecs\fP]
-[\-duration \fIsecs\fP]
-[\-radius \fIpixels\fP]
-[\-speed \fIint\fP]
-[\-number \fIint\fP]
-[\-swamp]
-[\-bounce]
-[\-reflect]
-[\-vortex]
-[\-magnify]
-[\-blackhole]
-[\-slow]
-[\-shm] [\-no\-shm]
-[\-fps]
-.SH DESCRIPTION
-The \fIdistort\fP program takes an image and lets circular zones of
-distortion wander randomly around it, distorting what is under them.
-The mode of distortion and the overall behaviour of the zones can be
-influenced in various ways.
-
-The image that it manipulates will be grabbed from the portion of
-the screen underlying the window, or from the system's video input,
-or from a random file on disk, as indicated by
-the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
-and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
-file; see
-.BR xscreensaver\-settings (1)
-for more details.
-.SH OPTIONS
-.I distort
-accepts the following options:
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-noinstall
-Don't install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual
-class or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window\-id \fIwindow\-id\fP
-Specify which window id to use.
-.TP 8
-.B \-delay \fIusecs\fP
-Specify the delay between subsequent animation frames in microseconds.
-.TP 8
-.B \-duration \fIseconds\fP
-How long to run before loading a new image. Default 120 seconds.
-.TP 8
-.B \-radius \fIpixels\fP
-Specify the radius of the distortion zone in pixels.
-.TP 8
-.B \-speed \fIint\fP
-Specify the speed at which the distortion zone moves, where 0 is slow,
-higher numbers are faster (10 is pretty fast.)
-.TP 8
-.B \-number \fIint\fP
-Specify the number of distortion zones.
-.TP 8
-.B \-swamp
-Instead of letting zones wander around, let small zones pop up like
-bubbles in a swamp and leave permanent distortion. \fBWARNING:\fP
-this option uses a \fIcolossal\fP amount of memory: keep the \fI\-radius\fP
-small when using \fI\-swamp\fP.
-.TP 8
-.B \-bounce
-Let zones wander around and bounce off the window border. This is the
-default.
-.TP 8
-.B \-reflect
-Mode of distortion that resembles reflection by a cylindrical mirror.
-.TP 8
-.B \-vortex
-Whirlpool-shaped distortion. Way cool.
-.TP 8
-.B \-magnify
-This mode of distortion looks like a magnifying glass.
-.TP 8
-.B \-blackhole
-Suck your pixels beyond the event horizon. Favourite mode of Dr
-Stephen Hawking.
-.TP 8
-.B \-slow
-Make the zone wander slower.
-.TP 8
-.B \-shm
-Use shared memory extension.
-.TP 8
-.B \-no\-shm
-Don't use shared memory extension.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 1998 by Jonas Munsin and Jamie Zawinski. Permission to use,
-copy, modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHORS
-Jonas Munsin <jmunsin@iki.fi> and Jamie Zawinski <jwz@jwz.org>.
-This manual page by Matthias Warkus <mawa@iname.com>, 17-Oct-1999.
diff --git a/hacks/drift.c b/hacks/drift.c
deleted file mode 100644
index 376d926..0000000
--- a/hacks/drift.c
+++ /dev/null
@@ -1,673 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* drift --- drifting recursive fractal cosmic flames */
-
-#if 0
-static const char sccsid[] = "@(#)drift.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1991 by Patrick J. Naughton.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 01-Nov-2000: Allocation checks
- * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
- * 01-Jan-1997: Moved new flame to drift. Compile time options now run time.
- * 01-Jun-1995: Updated by Scott Draves.
- * 27-Jun-1991: vary number of functions used.
- * 24-Jun-1991: fixed portability problem with integer mod (%).
- * 06-Jun-1991: Written, received from Scott Draves <spot@cs.cmu.edu>
- */
-
-#ifdef STANDALONE
-# define MODE_drift
-# define DEFAULTS "*delay: 10000 \n" \
- "*count: 30 \n" \
- "*ncolors: 200 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n" \
-
-# define SMOOTH_COLORS
-# define release_drift 0
-# define reshape_drift 0
-# define drift_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# define ENTRYPOINT /**/
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_drift
-
-#define DEF_GROW "False" /* Grow fractals instead of animating one at a time,
- would then be like flame */
-#define DEF_LISS "False" /* if this is defined then instead of a point
- bouncing around in a high dimensional sphere, we
- use lissojous figures. Only makes sense if
- grow is false. */
-
-static Bool grow;
-static Bool liss;
-
-static XrmOptionDescRec opts[] =
-{
- {"-grow", ".drift.grow", XrmoptionNoArg, "on"},
- {"+grow", ".drift.grow", XrmoptionNoArg, "off"},
- {"-liss", ".drift.trail", XrmoptionNoArg, "on"},
- {"+liss", ".drift.trail", XrmoptionNoArg, "off"}
-};
-static argtype vars[] =
-{
- {&grow, "grow", "Grow", DEF_GROW, t_Bool},
- {&liss, "trail", "Trail", DEF_LISS, t_Bool}
-};
-static OptionStruct desc[] =
-{
- {"-/+grow", "turn on/off growing fractals, else they are animated"},
- {"-/+liss", "turn on/off using lissojous figures to get points"}
-};
-
-ENTRYPOINT ModeSpecOpt drift_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct drift_description =
-{"drift", "init_drift", "draw_drift", (char *) NULL,
- "refresh_drift", "init_drift", "free_drift", &drift_opts,
- 10000, 30, 1, 1, 64, 1.0, "",
- "Shows cosmic drifting flame fractals", 0, NULL};
-
-#endif
-
-#define MAXBATCH1 200 /* mono */
-#define MAXBATCH2 20 /* color */
-#define FUSE 10 /* discard this many initial iterations */
-#define NMAJORVARS 7
-#define MAXLEV 10
-
-typedef struct {
- /* shape of current flame */
- int nxforms;
- double f[2][3][MAXLEV]; /* a bunch of non-homogeneous xforms */
- int variation[10]; /* for each xform */
-
- /* Animation */
- double df[2][3][MAXLEV];
-
- /* high-level control */
- int mode; /* 0->slow/single 1->fast/many */
- int nfractals; /* draw this many fractals */
- int major_variation;
- int fractal_len; /* pts/fractal */
- int color;
- int rainbow; /* more than one color per fractal
- 1-> computed by adding dimension to fractal */
-
- int width, height; /* of window */
- int timer;
-
- /* draw info about current flame */
- int fuse; /* iterate this many before drawing */
- int total_points; /* draw this many pts before fractal ends */
- int npoints; /* how many we've computed but not drawn */
- XPoint pts[MAXBATCH1]; /* here they are */
- unsigned long pixcol;
- /* when drawing in color, we have a buffer per color */
- int *ncpoints;
- XPoint *cpts;
-
- double x, y, c;
- int liss_time;
- Bool grow, liss;
-
- short lasthalf;
- long saved_random_bits;
- int nbits;
-
- int erase_countdown;
-} driftstruct;
-
-static driftstruct *drifts = (driftstruct *) NULL;
-
-static short
-halfrandom(driftstruct * dp, int mv)
-{
- unsigned long r;
-
- if (dp->lasthalf) {
- r = dp->lasthalf;
- dp->lasthalf = 0;
- } else {
- r = LRAND();
- dp->lasthalf = (short) (r >> 16);
- }
- r = r % mv;
- return r;
-}
-
-static int
-frandom(driftstruct * dp, int n)
-{
- int result;
-
- if (3 > dp->nbits) {
- dp->saved_random_bits = LRAND();
- dp->nbits = 31;
- }
- switch (n) {
- case 2:
- result = (int) (dp->saved_random_bits & 1);
- dp->saved_random_bits >>= 1;
- dp->nbits -= 1;
- return result;
-
- case 3:
- result = (int) (dp->saved_random_bits & 3);
- dp->saved_random_bits >>= 2;
- dp->nbits -= 2;
- if (3 == result)
- return frandom(dp, 3);
- return result;
-
- case 4:
- result = (int) (dp->saved_random_bits & 3);
- dp->saved_random_bits >>= 2;
- dp->nbits -= 2;
- return result;
-
- case 5:
- result = (int) (dp->saved_random_bits & 7);
- dp->saved_random_bits >>= 3;
- dp->nbits -= 3;
- if (4 < result)
- return frandom(dp, 5);
- return result;
- default:
- (void) fprintf(stderr, "bad arg to frandom\n");
- }
- return 0;
-}
-
-#define DISTRIB_A (halfrandom(dp, 7000) + 9000)
-#define DISTRIB_B ((frandom(dp, 3) + 1) * (frandom(dp, 3) + 1) * 120000)
-#define LEN(x) (sizeof(x)/sizeof((x)[0]))
-
-static void
-initmode(ModeInfo * mi, int mode)
-{
- driftstruct *dp = &drifts[MI_SCREEN(mi)];
-
-#define VARIATION_LEN 14
-
- dp->mode = mode;
-
- dp->major_variation = halfrandom(dp, VARIATION_LEN);
- /* 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6 */
- dp->major_variation = ((dp->major_variation >= VARIATION_LEN >> 1) &&
- (dp->major_variation < VARIATION_LEN - 1)) ?
- (dp->major_variation + 1) >> 1 : dp->major_variation >> 1;
-
- if (dp->grow) {
- dp->rainbow = 0;
- if (mode) {
- if (!dp->color || halfrandom(dp, 8)) {
- dp->nfractals = halfrandom(dp, 30) + 5;
- dp->fractal_len = DISTRIB_A;
- } else {
- dp->nfractals = halfrandom(dp, 5) + 5;
- dp->fractal_len = DISTRIB_B;
- }
- } else {
- dp->rainbow = dp->color;
- dp->nfractals = 1;
- dp->fractal_len = DISTRIB_B;
- }
- } else {
- dp->nfractals = 1;
- dp->rainbow = dp->color;
- dp->fractal_len = 2000000;
- }
- dp->fractal_len = (dp->fractal_len * MI_COUNT(mi)) / 20;
-
- MI_CLEARWINDOW(mi);
-}
-
-static void
-pick_df_coefs(ModeInfo * mi)
-{
- driftstruct *dp = &drifts[MI_SCREEN(mi)];
- int i, j, k;
- double r;
-
- for (i = 0; i < dp->nxforms; i++) {
-
- r = 1e-6;
- for (j = 0; j < 2; j++)
- for (k = 0; k < 3; k++) {
- dp->df[j][k][i] = ((double) halfrandom(dp, 1000) / 500.0 - 1.0);
- r += dp->df[j][k][i] * dp->df[j][k][i];
- }
- r = (3 + halfrandom(dp, 5)) * 0.01 / sqrt(r);
- for (j = 0; j < 2; j++)
- for (k = 0; k < 3; k++)
- dp->df[j][k][i] *= r;
- }
-}
-
-ENTRYPOINT void
-free_drift(ModeInfo * mi)
-{
- driftstruct *dp = &drifts[MI_SCREEN(mi)];
- if (dp->ncpoints != NULL) {
- (void) free((void *) dp->ncpoints);
- dp->ncpoints = (int *) NULL;
- }
- if (dp->cpts != NULL) {
- (void) free((void *) dp->cpts);
- dp->cpts = (XPoint *) NULL;
- }
-}
-
-static void
-initfractal(ModeInfo * mi)
-{
- driftstruct *dp = &drifts[MI_SCREEN(mi)];
- int i, j, k;
-
-#define XFORM_LEN 9
-
- dp->fuse = FUSE;
- dp->total_points = 0;
-
- if (!dp->ncpoints) {
- if ((dp->ncpoints = (int *) malloc(sizeof (int) * MI_NCOLORS(mi))) ==
- NULL) {
- free_drift(mi);
- return;
- }
- }
- if (!dp->cpts) {
- if ((dp->cpts = (XPoint *) malloc(MAXBATCH2 * sizeof (XPoint) *
- MI_NCOLORS(mi))) == NULL) {
- free_drift(mi);
- return;
- }
- }
-
- if (dp->rainbow)
- for (i = 0; i < MI_NPIXELS(mi); i++)
- dp->ncpoints[i] = 0;
- else
- dp->npoints = 0;
- dp->nxforms = halfrandom(dp, XFORM_LEN);
- /* 2, 2, 2, 3, 3, 3, 4, 4, 5 */
- dp->nxforms = (dp->nxforms >= XFORM_LEN - 1) + dp->nxforms / 3 + 2;
-
- dp->c = dp->x = dp->y = 0.0;
- if (dp->liss && !halfrandom(dp, 10)) {
- dp->liss_time = 0;
- }
- if (!dp->grow)
- pick_df_coefs(mi);
- for (i = 0; i < dp->nxforms; i++) {
- if (NMAJORVARS == dp->major_variation)
- dp->variation[i] = halfrandom(dp, NMAJORVARS);
- else
- dp->variation[i] = dp->major_variation;
- for (j = 0; j < 2; j++)
- for (k = 0; k < 3; k++) {
- if (dp->liss)
- dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
- else
- dp->f[j][k][i] = ((double) halfrandom(dp, 1000) / 500.0 - 1.0);
- }
- }
- if (dp->color)
- dp->pixcol = MI_PIXEL(mi, halfrandom(dp, MI_NPIXELS(mi)));
- else
- dp->pixcol = MI_WHITE_PIXEL(mi);
-
-}
-
-
-ENTRYPOINT void
-init_drift(ModeInfo * mi)
-{
- driftstruct *dp;
-
- MI_INIT (mi, drifts);
- dp = &drifts[MI_SCREEN(mi)];
-
- dp->width = MI_WIDTH(mi);
- dp->height = MI_HEIGHT(mi);
- dp->color = MI_NPIXELS(mi) > 2;
-
- if (MI_IS_FULLRANDOM(mi)) {
- if (NRAND(3) == 0)
- dp->grow = True;
- else {
- dp->grow = False;
- dp->liss = (Bool) (LRAND() & 1);
- }
- } else {
- dp->grow = grow;
- if (dp->grow)
- dp->liss = False;
- else
- dp->liss = liss;
- }
- initmode(mi, 1);
- initfractal(mi);
-}
-
-static void
-iter(driftstruct * dp)
-{
- int i = frandom(dp, dp->nxforms);
- double nx, ny, nc;
-
-
- if (i)
- nc = (dp->c + 1.0) / 2.0;
- else
- nc = dp->c / 2.0;
-
- nx = dp->f[0][0][i] * dp->x + dp->f[0][1][i] * dp->y + dp->f[0][2][i];
- ny = dp->f[1][0][i] * dp->x + dp->f[1][1][i] * dp->y + dp->f[1][2][i];
-
-
- switch (dp->variation[i]) {
- case 1:
- /* sinusoidal */
- nx = sin(nx);
- ny = sin(ny);
- break;
- case 2:
- {
- /* complex */
- double r2 = nx * nx + ny * ny + 1e-6;
-
- nx = nx / r2;
- ny = ny / r2;
- break;
- }
- case 3:
- /* bent */
- if (nx < 0.0)
- nx = nx * 2.0;
- if (ny < 0.0)
- ny = ny / 2.0;
- break;
- case 4:
- {
- /* swirl */
-
- double r = (nx * nx + ny * ny); /* times k here is fun */
- double c1 = sin(r);
- double c2 = cos(r);
- double t = nx;
-
- if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
- ny = 1e4;
- else
- ny = c2 * t + c1 * ny;
- nx = c1 * nx - c2 * ny;
- break;
- }
- case 5:
- {
- /* horseshoe */
- double r, c1, c2, t;
-
- /* Avoid atan2: DOMAIN error message */
- if (nx == 0.0 && ny == 0.0)
- r = 0.0;
- else
- r = atan2(nx, ny); /* times k here is fun */
- c1 = sin(r);
- c2 = cos(r);
- t = nx;
-
- nx = c1 * nx - c2 * ny;
- ny = c2 * t + c1 * ny;
- break;
- }
- case 6:
- {
- /* drape */
- double t;
-
- /* Avoid atan2: DOMAIN error message */
- if (nx == 0.0 && ny == 0.0)
- t = 0.0;
- else
- t = atan2(nx, ny) / M_PI;
-
- if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
- ny = 1e4;
- else
- ny = sqrt(nx * nx + ny * ny) - 1.0;
- nx = t;
- break;
- }
- }
-
-#if 0
- /* here are some others */
- {
- /* broken */
- if (nx > 1.0)
- nx = nx - 1.0;
- if (nx < -1.0)
- nx = nx + 1.0;
- if (ny > 1.0)
- ny = ny - 1.0;
- if (ny < -1.0)
- ny = ny + 1.0;
- break;
- }
- {
- /* complex sine */
- double u = nx, v = ny;
- double ev = exp(v);
- double emv = exp(-v);
-
- nx = (ev + emv) * sin(u) / 2.0;
- ny = (ev - emv) * cos(u) / 2.0;
- }
- {
-
- /* polynomial */
- if (nx < 0)
- nx = -nx * nx;
- else
- nx = nx * nx;
-
- if (ny < 0)
- ny = -ny * ny;
- else
- ny = ny * ny;
- }
- {
- /* spherical */
- double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
-
- nx = nx / r;
- ny = ny / r;
- }
- {
- nx = atan(nx) / M_PI_2
- ny = atan(ny) / M_PI_2
- }
-#endif
-
- /* how to check nan too? some machines don't have finite().
- don't need to check ny, it'll propogate */
- if (nx > 1e4 || nx < -1e4) {
- nx = halfrandom(dp, 1000) / 500.0 - 1.0;
- ny = halfrandom(dp, 1000) / 500.0 - 1.0;
- dp->fuse = FUSE;
- }
- dp->x = nx;
- dp->y = ny;
- dp->c = nc;
-
-}
-
-static void
-draw(ModeInfo * mi, driftstruct * dp, Drawable d)
-{
- Display *display = MI_DISPLAY(mi);
- GC gc = MI_GC(mi);
- double x = dp->x;
- double y = dp->y;
- int fixed_x, fixed_y, npix, c, n;
-
- if (dp->fuse) {
- dp->fuse--;
- return;
- }
- if (!(x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0))
- return;
-
- fixed_x = (int) ((dp->width / 2) * (x + 1.0));
- fixed_y = (int) ((dp->height / 2) * (y + 1.0));
-
- if (!dp->rainbow) {
-
- dp->pts[dp->npoints].x = fixed_x;
- dp->pts[dp->npoints].y = fixed_y;
- dp->npoints++;
- if (dp->npoints == MAXBATCH1) {
- XSetForeground(display, gc, dp->pixcol);
- XDrawPoints(display, d, gc, dp->pts, dp->npoints, CoordModeOrigin);
- dp->npoints = 0;
- }
- } else {
-
- npix = MI_NPIXELS(mi);
- c = (int) (dp->c * npix);
-
- if (c < 0)
- c = 0;
- if (c >= npix)
- c = npix - 1;
- n = dp->ncpoints[c];
- dp->cpts[c * MAXBATCH2 + n].x = fixed_x;
- dp->cpts[c * MAXBATCH2 + n].y = fixed_y;
- if (++dp->ncpoints[c] == MAXBATCH2) {
- XSetForeground(display, gc, MI_PIXEL(mi, c));
- XDrawPoints(display, d, gc, &(dp->cpts[c * MAXBATCH2]),
- dp->ncpoints[c], CoordModeOrigin);
- dp->ncpoints[c] = 0;
- }
- }
-}
-
-static void
-draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d)
-{
- Display *display = MI_DISPLAY(mi);
- GC gc = MI_GC(mi);
-
- if (dp->rainbow) {
- int npix = MI_NPIXELS(mi);
- int i;
-
- for (i = 0; i < npix; i++) {
- if (dp->ncpoints[i]) {
- XSetForeground(display, gc, MI_PIXEL(mi, i));
- XDrawPoints(display, d, gc, &(dp->cpts[i * MAXBATCH2]),
- dp->ncpoints[i], CoordModeOrigin);
- dp->ncpoints[i] = 0;
- }
- }
- } else {
- if (dp->npoints)
- XSetForeground(display, gc, dp->pixcol);
- XDrawPoints(display, d, gc, dp->pts,
- dp->npoints, CoordModeOrigin);
- dp->npoints = 0;
- }
-}
-
-
-ENTRYPOINT void
-draw_drift(ModeInfo * mi)
-{
- Window window = MI_WINDOW(mi);
- driftstruct *dp;
-
- if (drifts == NULL)
- return;
- dp = &drifts[MI_SCREEN(mi)];
- if (dp->ncpoints == NULL)
- return;
-
- if (dp->erase_countdown) {
- if (!--dp->erase_countdown) {
- initmode(mi, frandom(dp, 2));
- initfractal(mi);
- }
- return;
- }
-
- MI_IS_DRAWN(mi) = True;
- dp->timer = 3000;
- while (dp->timer) {
- iter(dp);
- draw(mi, dp, window);
- if (dp->total_points++ > dp->fractal_len) {
- draw_flush(mi, dp, window);
- if (0 == --dp->nfractals) {
- dp->erase_countdown = 4 * 1000000 /
- ((MI_PAUSE(mi) == 0) ? 1 : MI_PAUSE(mi));
- return;
- }
- initfractal(mi);
- }
- dp->timer--;
- }
- if (!dp->grow) {
- int i, j, k;
-
- draw_flush(mi, dp, window);
- if (dp->liss)
- dp->liss_time++;
- for (i = 0; i < dp->nxforms; i++)
- for (j = 0; j < 2; j++)
- for (k = 0; k < 3; k++) {
- if (dp->liss)
- dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
- else {
- double t = dp->f[j][k][i] += dp->df[j][k][i];
-
- if (t < -1.0 || 1.0 < t)
- dp->df[j][k][i] *= -1.0;
- }
- }
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_drift(ModeInfo * mi)
-{
- MI_CLEARWINDOW(mi);
-}
-#endif
-
-XSCREENSAVER_MODULE ("Drift", drift)
-
-#endif /* MODE_drift */
diff --git a/hacks/drift.man b/hacks/drift.man
deleted file mode 100644
index 125b2e6..0000000
--- a/hacks/drift.man
+++ /dev/null
@@ -1,79 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-drift \- draws drifting recursive fractal cosmic flames
-.SH SYNOPSIS
-.B drift
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-grow] [\-no\-grow] [\-liss] [\-no\-liss]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIdrift\fP program draws drifting recursive fractal cosmic flames
-.SH OPTIONS
-.I drift
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 200.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-grow
-.TP 8
-.B \-no\-grow
-Whether fractals should grow; otherwise, they are animated.
-
-.TP 8
-.B \-liss
-.TP 8
-.B \-no\-liss
-Whether we should use lissajous figures to get points.
-
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR flame (MANSUFFIX),
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1991, 1995 by Scott Draves.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-Scott Draves <spot@cs.cmu.edu>, 06-Jun-91, 01-Jun-95.
-
-Ability to run standalone or with \fIxscreensaver\fP added by
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/epicycle.c b/hacks/epicycle.c
deleted file mode 100644
index a8a257c..0000000
--- a/hacks/epicycle.c
+++ /dev/null
@@ -1,798 +0,0 @@
-/* epicycle --- The motion of a body with epicycles, as in the pre-Copernican
- * cosmologies.
- *
- * Copyright (c) 1998 James Youngman <jay@gnu.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* Standard C headers; screenhack.h assumes that these have already
- * been included if required -- for example, it defines M_PI if not
- * already defined.
- */
-#include <float.h>
-#include <math.h>
-
-
-#include "screenhack.h"
-#include "erase.h"
-
-/* MIT-SHM headers omitted; this screenhack doesn't use it */
-
-
-
-/*********************************************************/
-/******************** MAGIC CONSTANTS ********************/
-/*********************************************************/
-#define MIN_RADIUS (5) /* smallest allowable circle radius */
-#define FILL_PROPORTION (0.9) /* proportion of screen to fill by scaling. */
-/*********************************************************/
-/***************** END OF MAGIC CONSTANTS ****************/
-/*********************************************************/
-
-
-
-#define FULLCIRCLE (2.0 * M_PI) /* radians in a circle. */
-
-
-/* Some of these resource values here are hand-tuned to give a
- * pleasing variety of interesting shapes. These are not the only
- * good settings, but you may find you need to change some as a group
- * to get pleasing figures.
- */
-static const char *epicycle_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*colors: 100",
- "*color0: red",
- "*delay: 20000",
- "*holdtime: 2",
- "*lineWidth: 4",
- "*minCircles: 2",
- "*maxCircles: 10",
- "*minSpeed: 0.003",
- "*maxSpeed: 0.005",
- "*harmonics: 8",
- "*timestep: 1.0",
- "*timestepCoarseFactor: 1.0", /* no option for this resource. */
- "*divisorPoisson: 0.4",
- "*sizeFactorMin: 1.05",
- "*sizeFactorMax: 2.05",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-/* options passed to this program */
-static XrmOptionDescRec epicycle_options [] = {
- { "-color0", ".color0", XrmoptionSepArg, 0 },
- { "-colors", ".colors", XrmoptionSepArg, 0 },
- { "-colours", ".colors", XrmoptionSepArg, 0 },
- { "-foreground", ".foreground", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
- { "-linewidth", ".lineWidth", XrmoptionSepArg, 0 },
- { "-min_circles", ".minCircles", XrmoptionSepArg, 0 },
- { "-max_circles", ".maxCircles", XrmoptionSepArg, 0 },
- { "-min_speed", ".minSpeed", XrmoptionSepArg, 0 },
- { "-max_speed", ".maxSpeed", XrmoptionSepArg, 0 },
- { "-harmonics", ".harmonics", XrmoptionSepArg, 0 },
- { "-timestep", ".timestep", XrmoptionSepArg, 0 },
- { "-divisor_poisson",".divisorPoisson",XrmoptionSepArg, 0 },
- { "-size_factor_min", ".sizeFactorMin", XrmoptionSepArg, 0 },
- { "-size_factor_max", ".sizeFactorMax", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-
-/* Each circle is centred on a point on the rim of another circle.
- */
-struct tagCircle
-{
- long radius; /* in pixels */
- double w; /* position (radians ccw from x-axis) */
- double initial_w; /* starting position */
- double wdot; /* rotation rate (change in w per iteration) */
- int divisor;
-
- struct tagCircle *pchild;
-};
-typedef struct tagCircle Circle;
-
-
-struct tagBody /* a body that moves on a system of circles. */
-{
- int x_origin, y_origin;
- int x, y;
- int old_x, old_y;
- int current_color; /* pixel index into colors[] */
- Circle *epicycles; /* system of circles on which it moves. */
- struct tagBody *next; /* next in list. */
-};
-typedef struct tagBody Body;
-
-
-struct state {
- Display *dpy;
- Window window;
- GC color0;
- int width, height;
- int x_offset, y_offset;
- int unit_pixels;
- unsigned long bg;
- Colormap cmap;
- int restart;
- double wdot_max;
- XColor *colors;
- int ncolors;
- int color_shift_pos; /* how far we are towards that. */
- double colour_cycle_rate;
- int harmonics;
- double divisorPoisson;
- double sizeFactorMin;
- double sizeFactorMax;
- int minCircles;
- int maxCircles;
-
- Bool done;
-
- long L;
- double T, timestep, circle, timestep_coarse;
- int delay;
- int uncleared;
- int holdtime;
- int xmax, xmin, ymax, ymin;
- Body *pb0;
- double xtime;
- eraser_state *eraser;
-};
-
-
-
-/* Determine the GCD of two numbers using Euclid's method. The other
- * possible algorighm is Stein's method, but it's probably only going
- * to be much faster on machines with no divide instruction, like the
- * ARM and the Z80. The former is very fast anyway and the latter
- * probably won't run X clients; in any case, this calculation is not
- * the bulk of the computational expense of the program. I originally
- * tried using Stein's method, but I wanted to remove the gotos. Not
- * wanting to introduce possible bugs, I plumped for Euclid's method
- * instead. Lastly, Euclid's algorithm is preferred to the
- * generalisation for N inputs.
- *
- * See Knuth, section 4.5.2.
- */
-static int
-gcd(int u, int v) /* Euclid's Method */
-{
- /* If either operand of % is negative, the sign of the result is
- * implementation-defined. See section 6.3.5 "Multiplicative
- * Operators" of the ANSI C Standard (page 46 [LEFT HAND PAGE!] of
- * "Annotated C Standard", Osborne, ISBN 0-07-881952-0).
- */
- if (u < 0) u = -u;
- if (v < 0) v = -v;
-
- while (0 != v)
- {
- int r;
- r = u % v;
- u = v;
- v = r;
- }
- return u;
-}
-
-/* Determine the Lowest Common Multiple of two integers, using
- * Euclid's Proposition 34, as explained in Knuth's The Art of
- * Computer Programming, Vol 2, section 4.5.2.
- */
-static int
-lcm(int u, int v)
-{
- return u / gcd(u,v) * v;
-}
-
-static long
-random_radius(struct state *st, double scale)
-{
- long r;
-
- r = frand(scale) * st->unit_pixels/2; /* for frand() see utils/yarandom.h */
- if (r < MIN_RADIUS)
- r = MIN_RADIUS;
- return r;
-}
-
-
-static long
-random_divisor(struct state *st)
-{
- int divisor = 1;
- int sign;
-
- while (frand(1.0) < st->divisorPoisson && divisor <= st->harmonics)
- {
- ++divisor;
- }
- sign = (frand(1.0) < 0.5) ? +1 : -1;
- return sign * divisor;
-}
-
-
-/* Construct a circle or die.
- */
-static Circle *
-new_circle(struct state *st, double scale)
-{
- Circle *p = malloc(sizeof(Circle));
-
- p->radius = random_radius(st, scale);
- p->w = p->initial_w = 0.0;
- p->divisor = random_divisor(st);
- p->wdot = st->wdot_max / p->divisor;
- p->pchild = NULL;
-
- return p;
-}
-
-static void delete_circle(Circle *p)
-{
- free(p);
-}
-
-static void
-delete_circle_chain(Circle *p)
-{
- while (p)
- {
- Circle *q = p->pchild;
- delete_circle(p);
- p = q;
- }
-}
-
-static Circle *
-new_circle_chain(struct state *st)
-{
- Circle *head;
- double scale = 1.0, factor;
- int n;
-
- /* Parent circles are larger than their children by a factor of at
- * least FACTOR_MIN and at most FACTOR_MAX.
- */
- factor = st->sizeFactorMin + frand(st->sizeFactorMax - st->sizeFactorMin);
-
- /* There are between minCircles and maxCircles in each figure.
- */
- if (st->maxCircles == st->minCircles)
- n = st->minCircles; /* Avoid division by zero. */
- else
- n = st->minCircles + random() % (st->maxCircles - st->minCircles);
-
- head = NULL;
- while (n--)
- {
- Circle *p = new_circle(st, scale);
- p->pchild = head;
- head = p;
-
- scale /= factor;
- }
- return head;
-}
-
-static void
-assign_random_common_w(Circle *p)
-{
- double w_common = frand(FULLCIRCLE); /* anywhere on the circle */
- while (p)
- {
- p->initial_w = w_common;
- p = p->pchild;
- }
-}
-
-static Body *
-new_body(struct state *st)
-{
- Body *p = malloc(sizeof(Body));
- if (!p) abort();
- p->epicycles = new_circle_chain(st);
- p->current_color = 0; /* ?? start them all on different colors? */
- p->next = NULL;
- p->x = p->y = 0;
- p->old_x = p->old_y = 0;
- p->x_origin = p->y_origin = 0;
-
- /* Start all the epicycles at the same w value to make it easier to
- * figure out at what T value the cycle is closed. We don't just fix
- * the initial W value because that makes all the patterns tend to
- * be symmetrical about the X axis.
- */
- assign_random_common_w(p->epicycles);
- return p;
-}
-
-static void
-delete_body(Body *p)
-{
- delete_circle_chain(p->epicycles);
- free(p);
-}
-
-
-static void
-draw_body(struct state *st, Body *pb, GC gc)
-{
- XDrawLine(st->dpy, st->window, gc, pb->old_x, pb->old_y, pb->x, pb->y);
-}
-
-static long
-compute_divisor_lcm(Circle *p)
-{
- long l = 1;
-
- while (p)
- {
- l = lcm(l, p->divisor);
- p = p->pchild;
- }
- return l;
-}
-
-
-/* move_body()
- *
- * Calculate the position for the body at time T. We work in double
- * rather than int to avoid the cumulative errors that would be caused
- * by the rounding implicit in an assignment to int.
- */
-static void
-move_body(Body *pb, double t)
-{
- Circle *p;
- double x, y;
-
- pb->old_x = pb->x;
- pb->old_y = pb->y;
-
- x = pb->x_origin;
- y = pb->y_origin;
-
- for (p=pb->epicycles; NULL != p; p=p->pchild)
- {
- /* angular pos = initial_pos + time * angular speed */
- /* but this is an angular position, so modulo FULLCIRCLE. */
- p->w = fmod(p->initial_w + (t * p->wdot), FULLCIRCLE);
-
- x += (p->radius * cos(p->w));
- y += (p->radius * sin(p->w));
- }
-
- pb->x = (int)x;
- pb->y = (int)y;
-}
-
-static int
-colour_init(struct state *st, XWindowAttributes *pxgwa)
-{
- XGCValues gcv;
-
-#if 0
- int H = random() % 360; /* colour choice from attraction.c. */
- double S1 = 0.25;
- double S2 = 1.00;
- double V = frand(0.25) + 0.75;
- int line_width = 0;
-#endif
-
- int retval = 1;
- unsigned long valuemask = 0L;
- unsigned long fg;
-
- /* Free any already allocated colors...
- */
- if (st->colors)
- {
- free_colors(pxgwa->screen, st->cmap, st->colors, st->ncolors);
- st->colors = 0;
- st->ncolors = 0;
- }
-
- st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
- if (0 == st->ncolors) /* English spelling? */
- st->ncolors = get_integer_resource (st->dpy, "colours", "Colors");
-
- if (st->ncolors < 2)
- st->ncolors = 2;
- if (st->ncolors <= 2)
- mono_p = True;
- st->colors = 0;
-
- if (!mono_p)
- {
- st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
- if (!st->colors) abort();
-
- make_smooth_colormap (pxgwa->screen, pxgwa->visual, st->cmap,
- st->colors, &st->ncolors,
- True, /* allocate */
- False, /* not writable */
- True); /* verbose (complain about failure) */
- if (st->ncolors <= 2)
- {
- if (st->colors)
- free (st->colors);
- st->colors = 0;
- mono_p = True;
- }
- }
-
-
- st->bg = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
-
- /* Set the line width
- */
- gcv.line_width = get_integer_resource (st->dpy, "lineWidth", "Integer");
- if (gcv.line_width)
- {
- valuemask |= GCLineWidth;
-
- gcv.join_style = JoinRound;
- gcv.cap_style = CapRound;
-
- valuemask |= (GCCapStyle | GCJoinStyle);
- }
-
-
- /* Set the drawing function.
- */
- gcv.function = GXcopy;
- valuemask |= GCFunction;
-
- /* Set the foreground.
- */
-/* if (mono_p)*/
- fg = get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
-/* WTF?
-else
- fg = st->bg ^ get_pixel_resource (st->dpy, st->cmap, ("color0"), "Foreground");
-*/
- gcv.foreground = fg;
- valuemask |= GCForeground;
-
- /* Actually create the GC.
- */
- st->color0 = XCreateGC (st->dpy, st->window, valuemask, &gcv);
-
- return retval;
-}
-
-
-
-
-static void
-setup(struct state *st)
-{
- XWindowAttributes xgwa;
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- st->cmap = xgwa.colormap;
-
- st->width = xgwa.width;
- st->height = xgwa.height;
- st->x_offset = st->width / 2;
- st->y_offset = st->height / 2;
- st->unit_pixels = st->width < st->height ? st->width : st->height;
-
- {
- if (!st->done)
- {
- colour_init(st, &xgwa);
- st->done = True;
- }
- }
-}
-
-
-static void
-color_step(struct state *st, Body *pb, double frac)
-{
- if (!mono_p)
- {
- int newshift = st->ncolors * fmod(frac * st->colour_cycle_rate, 1.0);
- if (newshift != st->color_shift_pos)
- {
- pb->current_color = newshift;
- XSetForeground (st->dpy, st->color0, st->colors[pb->current_color].pixel);
- st->color_shift_pos = newshift;
- }
- }
-}
-
-
-#if 0
-static long
-distance(long x1, long y1, long x2, long y2)
-{
- long dx, dy;
-
- dx = x2 - x1;
- dy = y2 - y1;
- return dx*dx + dy*dy;
-}
-
-static int poisson_irand(double p)
-{
- int r = 1;
- while (fabs(frand(1.0)) < p)
- ++r;
- return r < 1 ? 1 : r;
-}
-#endif
-
-static void
-precalculate_figure(Body *pb,
- double this_xtime, double step,
- int *x_max, int *y_max,
- int *x_min, int *y_min)
-{
- double t;
-
- move_body(pb, 0.0); /* move once to avoid initial line from origin */
- *x_min = *x_max = pb->x;
- *y_min = *y_max = pb->y;
-
- for (t=0.0; t<this_xtime; t += step)
- {
- move_body(pb, t); /* move once to avoid initial line from origin */
- if (pb->x > *x_max)
- *x_max = pb->x;
- if (pb->x < *x_min)
- *x_min = pb->x;
- if (pb->y > *y_max)
- *y_max = pb->y;
- if (pb->y < *y_min)
- *y_min = pb->y;
- }
-}
-
-static int i_max(int a, int b)
-{
- return (a>b) ? a : b;
-}
-
-static void rescale_circles(struct state *st, Body *pb,
- int x_max, int y_max,
- int x_min, int y_min)
-{
- double xscale, yscale, scale;
- double xm, ym;
-
- x_max -= st->x_offset;
- x_min -= st->x_offset;
- y_max -= st->y_offset;
- y_min -= st->y_offset;
-
- x_max = i_max(x_max, -x_min);
- y_max = i_max(y_max, -y_min);
-
-
- xm = st->width / 2.0;
- ym = st->height / 2.0;
- if (x_max > xm)
- xscale = xm / x_max;
- else
- xscale = 1.0;
- if (y_max > ym)
- yscale = ym / y_max;
- else
- yscale = 1.0;
-
- if (xscale < yscale) /* wider than tall */
- scale = xscale; /* ensure width fits onscreen */
- else
- scale = yscale; /* ensure height fits onscreen */
-
-
- scale *= FILL_PROPORTION; /* only fill FILL_PROPORTION of screen */
- if (scale < 1.0) /* only reduce, don't enlarge. */
- {
- Circle *p;
- for (p=pb->epicycles; p; p=p->pchild)
- {
- p->radius *= scale;
- }
- }
- else
- {
- printf("enlarge by x%.2f skipped...\n", scale);
- }
-
- if (st->width > st->height * 5 || /* window has weird aspect */
- st->height > st->width * 5)
- {
- Circle *p;
- double r = (st->width > st->height
- ? st->width / (double) st->height
- : st->height / (double) st->width);
- for (p=pb->epicycles; p; p=p->pchild)
- p->radius *= r;
- }
-}
-
-
-/* angular speeds of the circles are harmonics of a fundamental
- * value. That should please the Pythagoreans among you... :-)
- */
-static double
-random_wdot_max(struct state *st)
-{
- /* Maximum and minimum values for the choice of wdot_max. Possible
- * epicycle speeds vary from wdot_max to (wdot_max * harmonics).
- */
- double minspeed, maxspeed;
- minspeed = get_float_resource(st->dpy, "minSpeed", "Double");
- maxspeed = get_float_resource(st->dpy, "maxSpeed", "Double");
- return st->harmonics * (minspeed + FULLCIRCLE * frand(maxspeed-minspeed));
-}
-
-
-static void *
-epicycle_init (Display *disp, Window win)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- st->dpy = disp;
- st->window = win;
-
- st->holdtime = get_integer_resource (st->dpy, "holdtime", "Integer");
-
- st->circle = FULLCIRCLE;
-
- XClearWindow(st->dpy, st->window);
- st->uncleared = 0;
- st->restart = 1;
-
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- st->harmonics = get_integer_resource(st->dpy, "harmonics", "Integer");
- st->divisorPoisson = get_float_resource(st->dpy, "divisorPoisson", "Double");
-
- st->timestep = get_float_resource(st->dpy, "timestep", "Double");
- st->timestep_coarse = st->timestep *
- get_float_resource(st->dpy, "timestepCoarseFactor", "Double");
-
- st->sizeFactorMin = get_float_resource(st->dpy, "sizeFactorMin", "Double");
- st->sizeFactorMax = get_float_resource(st->dpy, "sizeFactorMax", "Double");
-
- st->minCircles = get_integer_resource (st->dpy, "minCircles", "Integer");
- st->maxCircles = get_integer_resource (st->dpy, "maxCircles", "Integer");
-
- st->xtime = 0; /* is this right? */
-
- return st;
-}
-
-static unsigned long
-epicycle_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int this_delay = st->delay;
-
- if (st->eraser) {
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- return 10000;
- }
-
- if (st->restart)
- {
- setup(st);
- st->restart = 0;
-
- /* Flush any outstanding events; this has the side effect of
- * reducing the number of "false restarts"; resdtarts caused by
- * one event (e.g. ConfigureNotify) followed by another
- * (e.g. Expose).
- */
-
- st->wdot_max = random_wdot_max(st);
-
- if (st->pb0)
- {
- delete_body(st->pb0);
- st->pb0 = NULL;
- }
- st->pb0 = new_body(st);
- st->pb0->x_origin = st->pb0->x = st->x_offset;
- st->pb0->y_origin = st->pb0->y = st->y_offset;
-
- if (st->uncleared)
- {
- st->eraser = erase_window (st->dpy, st->window, st->eraser);
- st->uncleared = 0;
- }
-
- precalculate_figure(st->pb0, st->xtime, st->timestep_coarse,
- &st->xmax, &st->ymax, &st->xmin, &st->ymin);
-
- rescale_circles(st, st->pb0, st->xmax, st->ymax, st->xmin, st->ymin);
-
- move_body(st->pb0, 0.0); /* move once to avoid initial line from origin */
- move_body(st->pb0, 0.0); /* move once to avoid initial line from origin */
-
-
- st->T = 0.0; /* start at time zero. */
-
- st->L = compute_divisor_lcm(st->pb0->epicycles);
-
- st->colour_cycle_rate = labs(st->L);
-
- st->xtime = fabs(st->L * st->circle / st->wdot_max);
-
- if (st->colors) /* (colors==NULL) if mono_p */
- XSetForeground (st->dpy, st->color0, st->colors[st->pb0->current_color].pixel);
- }
-
-
- color_step(st, st->pb0, st->T/st->xtime );
- draw_body(st, st->pb0, st->color0);
- st->uncleared = 1;
-
-
- /* Check if the figure is complete...*/
- if (st->T > st->xtime)
- {
- this_delay = st->holdtime * 1000000;
- st->restart = 1; /* begin new figure. */
- }
-
-
-
- st->T += st->timestep;
- move_body(st->pb0, st->T);
-
- return this_delay;
-}
-
-static void
-epicycle_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->restart = 1;
-}
-
-static Bool
-epicycle_event (Display *dpy, Window window, void *closure, XEvent *e)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, e))
- {
- st->restart = 1;
- return True;
- }
-
- return False;
-}
-
-static void
-epicycle_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- if (st->eraser) eraser_free (st->eraser);
- if (st->pb0) delete_body (st->pb0);
- XFreeGC (dpy, st->color0);
- free (st->colors);
- free (st);
-}
-
-XSCREENSAVER_MODULE ("Epicycle", epicycle)
diff --git a/hacks/epicycle.man b/hacks/epicycle.man
deleted file mode 100644
index a7c0ed2..0000000
--- a/hacks/epicycle.man
+++ /dev/null
@@ -1,167 +0,0 @@
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-epicycle \- draws a point moving around a circle which moves around a cicle which...
-.SH SYNOPSIS
-.B epicycle
-[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIviz\fP] [\-colors \fIN\fP] [\-foreground \fIname\fP] [\-color\-shift \fIN\fP] [\-delay \fImicroseconds\fP] [\-holdtime \fIseconds\fP] [\-linewidth \fIN\fP] [\-min_circles \fIN\fP] [\-max_circles \fIN\fP] [\-min_speed \fInumber\fP] [\-max_speed \fInumber\fP] [\-harmonics \fIN\fP] [\-timestep \fInumber\fP] [\-divisor_poisson \fIprobability\fP] [\-size_factor_min \fInumber\fP] [\-size_factor_max \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-The epicycle program draws the path traced out by a point on the edge
-of a circle. That circle rotates around a point on the rim of another
-circle, and so on, several times. The random curves produced can be
-simple or complex, convex or concave, but they are always closed
-curves (they never go in indefinitely).
-
-You can configure both the way the curves are drawn and the way in
-which the random sequence of circles is generated, either with
-command-line options or X resources.
-.SH OPTIONS
-.TP 8
-.B \-display \fIhost:display.screen\fP
-Specifies which X display we should use (see the section DISPLAY NAMES in
-.BR X (1)
-for more information about this option).
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-If we're on a mono display, we have no choice.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-noinstall
-Don't install a private colormap for the window.
-.TP 8
-.B \-visual \fIviz\fP
-Specify which visual to use. Legal values are the name of a visual
-class, or the id number (decimal or hex) of a specific visual.
-Possible choices include
-
-.RS
-default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor,
-truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
-
-If a decimal or hexadecimal number is used,
-.BR XGetVisualInfo (3X)
-is consulted to obtain the required visual.
-.RE
-.TP 8
-.B \-colors \fIN\fP
-How many colors should be used (if possible). The colors are chosen
-randomly.
-.TP 8
-.B \-foreground \fIname\fP
-With
-.BR \-mono ,
-this option selects the foreground colour.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Specifies the delay between drawing successive line segments of the
-path. If you do not specify
-.BR -sync ,
-some X servers may batch up several drawing operations together,
-producing a less smooth effect. This is more likely to happen
-in monochrome mode (on monochrome servers or when
-.B \-mono
-is specified).
-.TP 8
-.B \-holdtime \fIseconds\fP
-When the figure is complete,
-.I epicycle
-pauses this number of seconds.
-.TP 8
-.B \-linewidth \fIN\fP
-Width in pixels of the body's track. Specifying values greater than
-one may cause slower drawing. The fastest value is usually zero,
-meaning one pixel.
-.TP 8
-.B \-min_circles \fIN\fP
-Smallest number of epicycles in the figure.
-.TP 8
-.B \-max_circles \fIN\fP
-Largest number of epicycles in the figure.
-.TP 8
-.B \-min_speed \fInumber\fP
-Smallest possible value for the base speed of revolution of the
-epicycles. The actual speeds of the epicycles vary from this down
-to
-.IB "min_speed / harmonics" .
-.TP 8
-.B \-max_speed \fInumber\fP
-Smallest possible value for the base speed of revolution of the
-epicycles.
-.TP 8
-.B \-harmonics \fIN\fP
-Number of possible harmonics; the larger this value is, the greater
-the possible variety of possible speeds of epicycle.
-.TP 8
-.B \-timestep \fInumber\fP
-Decreasing this value will reduce the distance the body moves for
-each line segment, possibly producing a smoother figure. Increasing
-it may produce faster results.
-.TP 8
-.B \-divisor_poisson \fIprobability\fP
-Each epicycle rotates at a rate which is a factor of the base speed.
-The speed of each epicycle is the base speed divided by some integer
-between 1 and the value of the
-.B \-harmonics
-option. This integer is decided by starting at 1 and tossing
-a biased coin. For each consecutive head, the value is incremented by
-one. The integer will not be incremented above the value of the
-.B \-harmonics
-option. The argument of this option decides the bias of the coin; it
-is the probability that that coin will produce a head at any given toss.
-.TP 8
-.B \-size_factor_min \fInumber\fP
-Epicycles are always at least this factor smaller than their
-parents.
-.TP 8
-.B \-size_factor_max \fInumber\fP
-Epicycles are never more than this factor smaller than their parents.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.B \-timestep
-option multiplied by the timestepCoarseFactor resource. The default
-value of 1 will almost always work fast enough and so this resource
-is not available as a command-line option.
-.SH USER INTERFACE
-The program runs mostly without user interaction. When running on the
-root window, no input is accepted. When running in its own window,
-the program will exit if mouse button 3 is pressed. If any other
-mouse button is pressed, the current figure will be abandoned and
-another will be started.
-.SH HISTORY
-The geometry of epicycles was perfected by Hipparchus of Rhodes at
-some time around 125 B.C., 185 years after the birth of Aristarchus of
-Samos, the inventor of the heliocentric universe model. Hipparchus
-applied epicycles to the Sun and the Moon. Ptolemy of Alexandria went
-on to apply them to what was then the known universe, at around 150
-A.D. Copernicus went on to apply them to the heliocentric model at
-the beginning of the sixteenth century. Johannes Kepler discovered
-that the planets actually move in elliptical orbits in about 1602.
-The inverse-square law of gravity was suggested by Boulliau in 1645.
-Isaac Newton's
-.I Principia Mathematica
-was published in 1687, and proved that Kepler's laws derived from
-Newtonian gravitation.
-.SH BUGS
-The colour selection is re-done for every figure. This may
-generate too much network traffic for this program to work well
-over slow or long links.
-.SH COPYRIGHT
-Copyright \(co 1998, James Youngman. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-James Youngman <jay@gnu.org>, April 1998.
diff --git a/hacks/eruption.c b/hacks/eruption.c
deleted file mode 100644
index a4cfc25..0000000
--- a/hacks/eruption.c
+++ /dev/null
@@ -1,607 +0,0 @@
-/* Eruption, Copyright (c) 2002-2003 W.P. van Paassen <peter@paassen.tmfweb.nl>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Module - "eruption.c"
- *
- * [01-2015] - Dave Odell <dmo2118@gmail.com>: Performance tweaks. Also, click-for-explosion.
- * [02-2003] - W.P. van Paassen: Improvements, added some code of jwz from the pyro hack for a spherical distribution of the particles
- * [01-2003] - W.P. van Paassen: Port to X for use with XScreenSaver, the shadebob hack by Shane Smit was used as a template
- * [04-2002] - W.P. van Paassen: Creation for the Demo Effects Collection (http://demo-effects.sourceforge.net)
- */
-
-#include <assert.h>
-#include <math.h>
-#include "screenhack.h"
-#include "xshm.h"
-
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-typedef unsigned long uint32_t;
-typedef unsigned short uint16_t;
-typedef unsigned char uint8_t;
-#endif
-
-/*#define VERBOSE*/
-
-/* Slightly whacked, for better explosions
- */
-#define PI_2000 6284
-#define SPREAD 15
-
-/*particle structure*/
-typedef struct
-{
- short xpos, ypos, xdir, ydir;
- unsigned char colorindex;
- unsigned char dead;
-} PARTICLE;
-
-struct state {
- Display *dpy;
- Window window;
-
- int sin_cache[PI_2000];
- int cos_cache[PI_2000];
-
- PARTICLE *particles;
- unsigned short iWinWidth, iWinHeight;
- unsigned char *fire;
- unsigned short nParticleCount;
- unsigned char xdelta, ydelta, decay;
- signed char gravity;
- signed short heat;
-
- int cycles, delay;
- GC gc;
- signed short iColorCount;
- unsigned long *aiColorVals;
- XImage *pImage;
- XShmSegmentInfo shm_info;
-
- int draw_i;
-};
-
-static void
-cache(struct state *st) /* jwz */
-{ /*needs to be run once. Could easily be */
- int i; /*reimplemented to run and cache at compile-time,*/
- double dA;
- for (i=0; i<PI_2000; i++)
- {
- dA=sin(((double) (random() % (PI_2000/2)))/1000.0);
- /*Emulation of spherical distribution*/
- dA+=asin(frand(1.0))/M_PI_2*0.1;
- /*Approximating the integration of the binominal, for
- well-distributed randomness*/
- st->cos_cache[i]=-abs((int) (cos(((double)i)/1000.0)*dA*st->ydelta));
- st->sin_cache[i]=(int) (sin(((double)i)/1000.0)*dA*st->xdelta);
- }
-}
-
-static void init_particle(struct state *st, PARTICLE* particle, unsigned short xcenter, unsigned short ycenter)
-{
- int v = random() % PI_2000;
- particle->xpos = xcenter - SPREAD + (random() % (SPREAD * 2));
- particle->ypos = ycenter - SPREAD + (random() % (SPREAD * 2));;
- particle->xdir = st->sin_cache[v];
- particle->ydir = st->cos_cache[v];
- particle->colorindex = st->iColorCount-1;
- particle->dead = 0;
-}
-
-#define X_PAD 1 /* Could be more if anybody wants the blur to fall off the left/right edges. */
-#define Y_PAD 1
-
-
-static void Execute( struct state *st )
-{
- XImage *img = st->pImage;
- int i, j;
- size_t fire_pitch = st->iWinWidth + X_PAD * 2;
- unsigned char *line0, *line1, *line2;
-
- /* move particles */
-
- for (i = 0; i < st->nParticleCount; i++)
- {
- if (!st->particles[i].dead)
- {
- st->particles[i].xpos += st->particles[i].xdir;
- st->particles[i].ypos += st->particles[i].ydir;
-
- /* is particle dead? */
-
- if (st->particles[i].colorindex == 0)
- {
- st->particles[i].dead = 1;
- continue;
- }
-
- if (st->particles[i].xpos < 1)
- {
- st->particles[i].xpos = 1;
- st->particles[i].xdir = -st->particles[i].xdir - 4;
- st->particles[i].colorindex = st->iColorCount;
- }
- else if (st->particles[i].xpos >= st->iWinWidth - 2)
- {
- st->particles[i].xpos = st->iWinWidth - 2;
- if (st->particles[i].xpos < 1) st->particles[i].xpos = 1;
- st->particles[i].xdir = -st->particles[i].xdir + 4;
- st->particles[i].colorindex = st->iColorCount;
- }
-
- if (st->particles[i].ypos < 1)
- {
- st->particles[i].ypos = 1;
- st->particles[i].ydir = -st->particles[i].ydir;
- st->particles[i].colorindex = st->iColorCount;
- }
- else if (st->particles[i].ypos >= st->iWinHeight - 3)
- {
- st->particles[i].ypos = st->iWinHeight- 3;
- if (st->particles[i].ypos < 1) st->particles[i].ypos = 1;
- st->particles[i].ydir = (-st->particles[i].ydir >> 2) - (random() % 2);
- st->particles[i].colorindex = st->iColorCount;
- }
-
-
- /* st->gravity kicks in */
- st->particles[i].ydir += st->gravity;
-
- /* particle cools off */
- st->particles[i].colorindex--;
- }
- }
-
- /* draw particles into st->fire array */
- for( i = 0; i < st->nParticleCount; i++ )
- {
- PARTICLE *p = &st->particles[i];
- if( !p->dead && p->ypos >= -Y_PAD + 1 && p->ypos < st->iWinHeight + Y_PAD - 1 )
- {
- /* draw particle */
- unsigned char *center = st->fire + (p->ypos - -Y_PAD) * fire_pitch + (p->xpos + X_PAD);
- unsigned char color = p->colorindex;
- *center = color;
- center[-1] = color;
- if (p->ypos < st->iWinHeight + Y_PAD - 2)
- center[fire_pitch] = color;
- if (p->ypos >= -Y_PAD + 2)
- center[-fire_pitch] = color;
- center[1] = color;
- }
- }
-
- line0 = st->fire + X_PAD;
- line1 = line0 + fire_pitch;
- line2 = line1 + fire_pitch;
-
- /* create st->fire effect */
-
- switch( img->bits_per_pixel )
- {
- case 8:
- case 16:
- case 32:
- break;
- default:
- memset( img->data, 0, img->bytes_per_line * img->height );
- break;
- }
-
- for( i = -Y_PAD + 1; i < st->iWinHeight + Y_PAD - 1; i++ )
- {
- const int j0 = -X_PAD + 1;
-
- unsigned
- t0 = line0[j0 - 1] + line1[j0 - 1] + line2[j0 - 1],
- t1 = line0[j0] + line1[j0] + line2[j0];
-
- unsigned j1 = st->iWinWidth + X_PAD;
-
- /* This is basically like the GIMP's "Convolution Matrix" filter, with
- the following settings:
- Matrix:
- | 1 1 1 | Divisor = 8
- | 1 0 1 | Offset = -eruption.cooloff
- | 1 1 1 |
- Except that the effect is applied to each pixel individually, in order
- from left-to-right, then top-to-bottom, resulting in a slight smear
- going rightwards and downwards.
- */
-
- for( j = j0 + 1; j != j1; j++ )
- {
- unsigned t2 = line0[j] + line1[j] + line2[j];
- unsigned char *px = line1 + j - 1;
- int temp;
- t1 -= *px;
- temp = t0 + t1 + t2 - st->decay;
- temp = temp >= 0 ? temp >> 3 : 0;
- *px = temp;
- t0 = t1 + temp;
- t1 = t2;
- }
-
- if( i >= 0 && i < st->iWinHeight )
- {
- /* draw st->fire array to screen */
- void *out_ptr = img->data + img->bytes_per_line * i;
-
- switch( img->bits_per_pixel )
- {
- case 32:
- {
- uint32_t *out = (uint32_t *)out_ptr;
- for( j = 0; j < st->iWinWidth; ++j )
- out[j] = st->aiColorVals[ line1[j] ];
- }
- break;
- case 16:
- {
- uint16_t *out = (uint16_t *)out_ptr;
- for( j = 0; j < st->iWinWidth; ++j )
- out[j] = st->aiColorVals[ line1[j] ];
- }
- break;
- case 8:
- {
- uint8_t *out = (uint8_t *)out_ptr;
- for( j = 0; j < st->iWinWidth; ++j )
- out[j] = st->aiColorVals[ line1[j] ];
- }
- break;
- default:
- for( j = 0; j < st->iWinWidth; ++j )
- {
- if( line1[j] )
- XPutPixel( img, j, i, st->aiColorVals[ line1[j] ] );
- }
- break;
- }
- }
-
- line0 += fire_pitch;
- line1 += fire_pitch;
- line2 += fire_pitch;
- }
- put_xshm_image( st->dpy, st->window, st->gc, st->pImage,
- 0,0,0,0, st->iWinWidth, st->iWinHeight, &st->shm_info );
-}
-
-static unsigned long * SetPalette(struct state *st)
-{
- XWindowAttributes XWinAttribs;
- XColor Color, *aColors;
- signed short iColor;
-
- XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
-
- st->iColorCount = get_integer_resource(st->dpy, "ncolors", "Integer" );
- if( st->iColorCount < 16 ) st->iColorCount = 16;
- if( st->iColorCount > 255 ) st->iColorCount = 256;
-
- aColors = calloc( st->iColorCount, sizeof(XColor) );
- st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
-
- Color.red = Color.green = Color.blue = 65535 / st->iColorCount;
-
- /* create st->fire palette */
- for( iColor=0; iColor < st->iColorCount; iColor++ )
- {
- if (iColor < st->iColorCount >> 3)
- {
- /* black to blue */
- aColors[iColor].red = 0;
- aColors[iColor].green = 0;
- aColors[iColor].blue = Color.blue * (iColor << 1);
- }
- else if (iColor < st->iColorCount >> 2)
- {
- /* blue to red */
- signed short temp = (iColor - (st->iColorCount >> 3));
- aColors[iColor].red = Color.red * (temp << 3);
- aColors[iColor].green = 0;
- aColors[iColor].blue = 16383 - Color.blue * (temp << 1);
- }
- else if (iColor < (st->iColorCount >> 2) + (st->iColorCount >> 3))
- {
- /* red to yellow */
- signed short temp = (iColor - (st->iColorCount >> 2)) << 3;
- aColors[iColor].red = 65535;
- aColors[iColor].green = Color.green * temp;
- aColors[iColor].blue = 0;
- }
- else if (iColor < st->iColorCount >> 1)
- {
- /* yellow to white */
- signed int temp = (iColor - ((st->iColorCount >> 2) + (st->iColorCount >> 3))) << 3;
- aColors[iColor].red = 65535;
- aColors[iColor].green = 65535;
- aColors[iColor].blue = Color.blue * temp;
- }
- else
- {
- /* white */
- aColors[iColor].red = aColors[iColor].green = aColors[iColor].blue = 65535;
- }
-
- if( !XAllocColor( st->dpy, XWinAttribs.colormap, &aColors[ iColor ] ) )
- {
- /* start all over with less colors */
- XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, iColor, 0 );
- free( aColors );
- free( st->aiColorVals );
- (st->iColorCount)--;
- aColors = calloc( st->iColorCount, sizeof(XColor) );
- st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
- iColor = -1;
- }
- else
- st->aiColorVals[ iColor ] = aColors[ iColor ].pixel;
- }
-
- if (st->heat < st->iColorCount)
- st->iColorCount = st->heat;
-
- free( aColors );
-
- XSetWindowBackground( st->dpy, st->window, st->aiColorVals[ 0 ] );
-
- return st->aiColorVals;
-}
-
-
-static void DestroyImage (struct state *st)
-{
- free (st->fire);
- destroy_xshm_image (st->dpy, st->pImage, &st->shm_info);
-}
-
-static void CreateImage( struct state *st, XWindowAttributes *XWinAttribs )
-{
- /* Create the Image for drawing */
-
- /* Must be NULL because of how DestroyImage works. */
- assert( !st->fire );
-
- st->pImage = create_xshm_image( st->dpy, XWinAttribs->visual,
- XWinAttribs->depth, ZPixmap, &st->shm_info,
- XWinAttribs->width, XWinAttribs->height );
-
- memset( (st->pImage)->data, 0,
- (st->pImage)->bytes_per_line * (st->pImage)->height);
-
- st->iWinWidth = XWinAttribs->width;
- st->iWinHeight = XWinAttribs->height;
-
- /* create st->fire array */
- st->fire = calloc( (st->iWinHeight + Y_PAD * 2) * (st->iWinWidth + X_PAD * 2), sizeof(unsigned char));
-}
-
-static void Initialize( struct state *st, XWindowAttributes *XWinAttribs )
-{
- XGCValues gcValues;
-
- /* Create the GC. */
- st->gc = XCreateGC( st->dpy, st->window, 0, &gcValues );
-
- CreateImage (st, XWinAttribs);
-
- /*create st->particles */
- st->particles = malloc (st->nParticleCount * sizeof(PARTICLE));
-}
-
-static void *
-eruption_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XWindowAttributes XWinAttribs;
- unsigned short sum = 0;
-#ifdef VERBOSE
- time_t nTime = time( NULL );
- unsigned short iFrame = 0;
-#endif /* VERBOSE */
-
- st->dpy = dpy;
- st->window = window;
-
- st->nParticleCount = get_integer_resource(st->dpy, "particles", "Integer" );
- if (st->nParticleCount < 100)
- st->nParticleCount = 100;
- if (st->nParticleCount > 2000)
- st->nParticleCount = 2000;
-
- st->decay = get_integer_resource(st->dpy, "cooloff", "Integer" );
- if (st->decay <= 0)
- st->decay = 0;
- if (st->decay > 10)
- st->decay = 10;
- st->decay <<= 3;
-
- st->gravity = get_integer_resource(st->dpy, "gravity", "Integer" );
- if (st->gravity < -5)
- st->gravity = -5;
- if (st->gravity > 5)
- st->gravity = 5;
-
- st->heat = get_integer_resource(st->dpy, "heat", "Integer" );
- if (st->heat < 64)
- st->heat = 64;
- if (st->heat > 256)
- st->heat = 256;
-
-#ifdef VERBOSE
- printf( "%s: Allocated %d st->particles\n", progclass, st->nParticleCount );
-#endif /* VERBOSE */
-
- XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
-
- Initialize( st, &XWinAttribs );
-
- st->ydelta = 0;
- while (sum < (st->iWinHeight >> 1) - SPREAD)
- {
- st->ydelta++;
- sum += st->ydelta;
- }
-
- sum = 0;
- while (sum < (st->iWinWidth >> 3))
- {
- st->xdelta++;
- sum += st->xdelta;
- }
-
- st->delay = get_integer_resource(st->dpy, "delay", "Integer" );
- st->cycles = get_integer_resource(st->dpy, "cycles", "Integer" );
-
- cache(st);
-
- XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, st->iColorCount, 0 );
- free( st->aiColorVals );
- st->aiColorVals = SetPalette( st );
- XClearWindow( st->dpy, st->window );
-
- st->draw_i = -1;
-
- return st;
-}
-
-
-static void
-new_eruption (struct state *st, unsigned short xcenter, unsigned short ycenter)
-{
- for (st->draw_i = 0; st->draw_i < st->nParticleCount; st->draw_i++)
- init_particle(st, st->particles + st->draw_i, xcenter, ycenter);
- st->draw_i = 0;
-}
-
-
-static void
-random_eruption (struct state *st)
-{
- /* compute random center */
- new_eruption (st, random() % st->iWinWidth, random() % st->iWinHeight);
-}
-
-
-static unsigned long
-eruption_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if( st->draw_i < 0 || st->draw_i++ >= st->cycles )
- {
- random_eruption (st);
- }
-
- Execute( st );
-
-#ifdef VERBOSE
- iFrame++;
- if( nTime - time( NULL ) )
- {
- printf( "%s: %d FPS\n", progclass, iFrame );
- nTime = time( NULL );
- iFrame = 0;
- }
-#endif /* VERBOSE */
-
- return st->delay;
-}
-
-
-static void
-eruption_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XWindowAttributes XWinAttribs;
-
- DestroyImage (st);
- st->fire = NULL;
-
- XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
- XWinAttribs.width = w;
- XWinAttribs.height = h;
- CreateImage (st, &XWinAttribs);
- st->draw_i = -1;
-}
-
-static Bool
-eruption_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
-
- if (event->type == ButtonPress)
- {
- new_eruption (st, event->xbutton.x, event->xbutton.y);
- return True;
- }
- else if (screenhack_event_helper (dpy, window, event))
- {
- random_eruption (st);
- return True;
- }
-
- return False;
-}
-
-static void
-eruption_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- DestroyImage (st);
- free (st->aiColorVals);
- free (st->particles);
- XFreeGC (dpy, st->gc);
- free (st);
-}
-
-
-static const char *eruption_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsTop: true",
- "*cycles: 80",
- "*ncolors: 256",
- "*delay: 10000",
- "*particles: 300",
- "*cooloff: 2",
- "*gravity: 1",
- "*heat: 256",
- ".lowrez: true", /* Too slow on Retina screens otherwise */
- "*useSHM: True",
- 0
-};
-
-static XrmOptionDescRec eruption_options [] = {
- { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-cycles", ".cycles", XrmoptionSepArg, 0 },
- { "-particles", ".particles", XrmoptionSepArg, 0 },
- { "-cooloff", ".cooloff", XrmoptionSepArg, 0 },
- { "-gravity", ".gravity", XrmoptionSepArg, 0 },
- { "-heat", ".heat", XrmoptionSepArg, 0 },
-#ifdef HAVE_XSHM_EXTENSION
- { "-shm", ".useSHM", XrmoptionNoArg, "True" },
- { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
-#endif
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("Eruption", eruption)
-
-/* End of Module - "eruption.c" */
-
diff --git a/hacks/eruption.man b/hacks/eruption.man
deleted file mode 100644
index 032b3bd..0000000
--- a/hacks/eruption.man
+++ /dev/null
@@ -1,77 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-Eruption \- eruption of pieces of hot volcanic rock
-.SH SYNOPSIS
-.B Eruption
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-ncolors \fInumber\fP]
-[\-nParticles \fInumber\fP]
-[\-Heat \fInumber\fP]
-[\-Cooling \fInumber\fP]
-[\-Gravity \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-This hack creates an eruption of pieces of hot volcanic rock.
-Ported from the demo effects collection (http://demo-effects.sourceforge.net)
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 256.
-.TP 8
-.B \-particles \fInumber\fP
-Number of Particles. Default: 300.
-.TP 8
-.B \-cooloff \fInumber\fP
-Eruption Cooloff. Default: 2.
-.TP 8
-.B \-heat \fInumber\fP
-Heat of Eruption. Default: 256.
-.TP 8
-.B \-gravity \fInumber\fP
-Gravity. Default: 1.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
-.TP 8
-.B \-cycles \fInumber\fP
-Duration. 10 - 3000. Default: 80.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002-2003 by W.P. van Paassen. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
- suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-W.P. van Paassen
diff --git a/hacks/euler2d.c b/hacks/euler2d.c
deleted file mode 100644
index d42a2bb..0000000
--- a/hacks/euler2d.c
+++ /dev/null
@@ -1,887 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* euler2d --- 2 Dimensional Incompressible Inviscid Fluid Flow */
-
-#if 0
-static const char sccsid[] = "@(#)euler2d.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*
- * Copyright (c) 2000 by Stephen Montgomery-Smith <stephen@math.missouri.edu>
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 04-Nov-2000: Added an option eulerpower. This allows for example the
- * quasi-geostrophic equation by setting eulerpower to 2.
- * 01-Nov-2000: Allocation checks.
- * 10-Sep-2000: Added optimizations, and removed subtle_perturb, by stephen.
- * 03-Sep-2000: Changed method of solving ode to Adams-Bashforth of order 2.
- * Previously used a rather compilcated method of order 4.
- * This doubles the speed of the program. Also it seems
- * to have improved numerical stability. Done by stephen.
- * 27-Aug-2000: Added rotation of region to maximize screen fill by stephen.
- * 05-Jun-2000: Adapted from flow.c Copyright (c) 1996 by Tim Auckland
- * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
- * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org)
- */
-
-/*
- * The mathematical aspects of this program are discussed in the file
- * euler2d.tex.
- */
-
-#ifdef STANDALONE
-# define MODE_euler2d
-# define DEFAULTS "*delay: 10000 \n" \
- "*count: 1024 \n" \
- "*cycles: 3000 \n" \
- "*ncolors: 64 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n" \
-
-# define SMOOTH_COLORS
-# define release_euler2d 0
-# define reshape_euler2d 0
-# define euler2d_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_euler2d
-
-#define DEF_EULERTAIL "10"
-
-#define DEBUG_POINTED_REGION 0
-
-static int tail_len;
-static int variable_boundary = 1;
-static float power = 1;
-
-static XrmOptionDescRec opts[] =
-{
- {"-eulertail", ".euler2d.eulertail", XrmoptionSepArg, NULL},
- {"-eulerpower", ".euler2d.eulerpower", XrmoptionSepArg, NULL},
-};
-static argtype vars[] =
-{
- {&tail_len, "eulertail",
- "EulerTail", (char *) DEF_EULERTAIL, t_Int},
- {&power, "eulerpower",
- "EulerPower", "1", t_Float},
-};
-static OptionStruct desc[] =
-{
- {"-eulertail len", "Length of Euler2d tails"},
- {"-eulerpower power", "power of interaction law for points for Euler2d"},
-};
-
-ENTRYPOINT ModeSpecOpt euler2d_opts =
-{sizeof opts / sizeof opts[0], opts,
- sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct euler2d_description = {
- "euler2d", "init_euler2d", "draw_euler2d", (char *) NULL,
- "refresh_euler2d", "init_euler2d", "free_euler2d", &euler2d_opts,
- 1000, 1024, 3000, 1, 64, 1.0, "",
- "Simulates 2D incompressible invisid fluid.", 0, NULL
-};
-
-#endif
-
-#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
-#define positive_rand(v) (LRAND()/MAXRAND*(v)) /* positive random */
-
-#define number_of_vortex_points 20
-
-#define n_bound_p 500
-#define deg_p 6
-
-static double delta_t;
-
-typedef struct {
- int width;
- int height;
- int count;
- double xshift,yshift,scale;
- double xshift2,yshift2;
- double radius;
-
- int N;
- int Nvortex;
-
-/* x[2i+0] = x coord for nth point
- x[2i+1] = y coord for nth point
- w[i] = vorticity at nth point
-*/
- double *x;
- double *w;
-
- double *diffx;
- double *olddiffx;
- double *tempx;
- double *tempdiffx;
-/* (xs[2i+0],xs[2i+1]) is reflection of (x[2i+0],x[2i+1]) about unit circle
- xs[2i+0] = x[2i+0]/nx
- xs[2i+1] = x[2i+1]/nx
- where
- nx = x[2i+0]*x[2i+0] + x[2i+1]*x[2i+1]
-
- x_is_zero[i] = (nx < 1e-10)
-*/
- double *xs;
- short *x_is_zero;
-
-/* (p[2i+0],p[2i+1]) is image of (x[2i+0],x[2i+1]) under polynomial p.
- mod_dp2 is |p'(z)|^2 when z = (x[2i+0],x[2i+1]).
-*/
- double *p;
- double *mod_dp2;
-
-/* Sometimes in our calculations we get overflow or numbers that are too big.
- If that happens with the point x[2*i+0], x[2*i+1], we set dead[i].
-*/
- short *dead;
-
- XSegment *csegs;
- int cnsegs;
- XSegment *old_segs;
- int *nold_segs;
- int c_old_seg;
- int boundary_color;
- int hide_vortex;
- short *lastx;
-
- double p_coef[2*(deg_p-1)];
- XSegment *boundary;
-
-} euler2dstruct;
-
-static euler2dstruct *euler2ds = (euler2dstruct *) NULL;
-
-/*
- If variable_boundary == 1, then we make a variable boundary.
- The way this is done is to map the unit disk under a
- polynomial p, where
- p(z) = z + c_2 z^2 + ... + c_n z^n
- where n = deg_p. sp->p_coef contains the complex numbers
- c_2, c_3, ... c_n.
-*/
-
-#define add(a1,a2,b1,b2) (a1)+=(b1);(a2)+=(b2)
-#define mult(a1,a2,b1,b2) temp=(a1)*(b1)-(a2)*(b2); \
- (a2)=(a1)*(b2)+(a2)*(b1);(a1)=temp
-
-static void
-calc_p(double *p1, double *p2, double z1, double z2, double p_coef[])
-{
- int i;
- double temp;
-
- *p1=0;
- *p2=0;
- for(i=deg_p;i>=2;i--)
- {
- add(*p1,*p2,p_coef[(i-2)*2],p_coef[(i-2)*2+1]);
- mult(*p1,*p2,z1,z2);
- }
- add(*p1,*p2,1,0);
- mult(*p1,*p2,z1,z2);
-}
-
-/* Calculate |p'(z)|^2 */
-static double
-calc_mod_dp2(double z1, double z2, double p_coef[])
-{
- int i;
- double temp,mp1,mp2;
-
- mp1=0;
- mp2=0;
- for(i=deg_p;i>=2;i--)
- {
- add(mp1,mp2,i*p_coef[(i-2)*2],i*p_coef[(i-2)*2+1]);
- mult(mp1,mp2,z1,z2);
- }
- add(mp1,mp2,1,0);
- return mp1*mp1+mp2*mp2;
-}
-
-static void
-calc_all_p(euler2dstruct *sp)
-{
- int i,j;
- double temp,p1,p2,z1,z2;
- for(j=(sp->hide_vortex?sp->Nvortex:0);j<sp->N;j++) if(!sp->dead[j])
- {
- p1=0;
- p2=0;
- z1=sp->x[2*j+0];
- z2=sp->x[2*j+1];
- for(i=deg_p;i>=2;i--)
- {
- add(p1,p2,sp->p_coef[(i-2)*2],sp->p_coef[(i-2)*2+1]);
- mult(p1,p2,z1,z2);
- }
- add(p1,p2,1,0);
- mult(p1,p2,z1,z2);
- sp->p[2*j+0] = p1;
- sp->p[2*j+1] = p2;
- }
-}
-
-static void
-calc_all_mod_dp2(double *x, euler2dstruct *sp)
-{
- int i,j;
- double temp,mp1,mp2,z1,z2;
- for(j=0;j<sp->N;j++) if(!sp->dead[j])
- {
- mp1=0;
- mp2=0;
- z1=x[2*j+0];
- z2=x[2*j+1];
- for(i=deg_p;i>=2;i--)
- {
- add(mp1,mp2,i*sp->p_coef[(i-2)*2],i*sp->p_coef[(i-2)*2+1]);
- mult(mp1,mp2,z1,z2);
- }
- add(mp1,mp2,1,0);
- sp->mod_dp2[j] = mp1*mp1+mp2*mp2;
- }
-}
-
-static void
-derivs(double *x, euler2dstruct *sp)
-{
- int i,j;
- double u1,u2,x1,x2,xij1,xij2,nxij;
- double nx;
-
- if (variable_boundary)
- calc_all_mod_dp2(sp->x,sp);
-
- for (j=0;j<sp->Nvortex;j++) if (!sp->dead[j])
- {
- nx = x[2*j+0]*x[2*j+0] + x[2*j+1]*x[2*j+1];
- if (nx < 1e-10)
- sp->x_is_zero[j] = 1;
- else {
- sp->x_is_zero[j] = 0;
- sp->xs[2*j+0] = x[2*j+0]/nx;
- sp->xs[2*j+1] = x[2*j+1]/nx;
- }
- }
-
- (void) memset(sp->diffx,0,sizeof(double)*2*sp->N);
-
- for (i=0;i<sp->N;i++) if (!sp->dead[i])
- {
- x1 = x[2*i+0];
- x2 = x[2*i+1];
- for (j=0;j<sp->Nvortex;j++) if (!sp->dead[j])
- {
-/*
- Calculate the Biot-Savart kernel, that is, effect of a
- vortex point at a = (x[2*j+0],x[2*j+1]) at the point
- x = (x1,x2), returning the vector field in (u1,u2).
-
- In the plane, this is given by the formula
-
- u = (x-a)/|x-a|^2 or zero if x=a.
-
- However, in the unit disk we have to subtract from the
- above:
-
- (x-as)/|x-as|^2
-
- where as = a/|a|^2 is the reflection of a about the unit circle.
-
- If however power != 1, then
-
- u = (x-a)/|x-a|^(power+1) - |a|^(1-power) (x-as)/|x-as|^(power+1)
-
-*/
-
- xij1 = x1 - x[2*j+0];
- xij2 = x2 - x[2*j+1];
- nxij = (power==1.0) ? xij1*xij1+xij2*xij2 : pow(xij1*xij1+xij2*xij2,(power+1)/2.0);
-
- if(nxij >= 1e-4) {
- u1 = xij2/nxij;
- u2 = -xij1/nxij;
- }
- else
- u1 = u2 = 0.0;
-
- if (!sp->x_is_zero[j])
- {
- xij1 = x1 - sp->xs[2*j+0];
- xij2 = x2 - sp->xs[2*j+1];
- nxij = (power==1.0) ? xij1*xij1+xij2*xij2 : pow(xij1*xij1+xij2*xij2,(power+1)/2.0);
-
- if (nxij < 1e-5)
- {
- sp->dead[i] = 1;
- u1 = u2 = 0.0;
- }
- else
- {
- u1 -= xij2/nxij;
- u2 += xij1/nxij;
- }
- }
-
- if (!sp->dead[i])
- {
- sp->diffx[2*i+0] += u1*sp->w[j];
- sp->diffx[2*i+1] += u2*sp->w[j];
- }
- }
-
- if (!sp->dead[i] && variable_boundary)
- {
- if (sp->mod_dp2[i] < 1e-5)
- sp->dead[i] = 1;
- else
- {
- sp->diffx[2*i+0] /= sp->mod_dp2[i];
- sp->diffx[2*i+1] /= sp->mod_dp2[i];
- }
- }
- }
-}
-
-/*
- What perturb does is effectively
- ret = x + k,
- where k should be of order delta_t.
-
- We have the option to do this more subtly by mapping points x
- in the unit disk to points y in the plane, where y = f(|x|) x,
- with f(t) = -log(1-t)/t.
-
- This might reduce (but does not remove) problems where particles near
- the edge of the boundary bounce around.
-
- But it seems to be not that effective, so for now switch it off.
-*/
-
-#define SUBTLE_PERTURB 0
-
-static void
-perturb(double ret[], double x[], double k[], euler2dstruct *sp)
-{
- int i;
- double x1,x2,k1,k2;
-
-#if SUBTLE_PERTURB
- double d1,d2,t1,t2,mag,mag2,mlog1mmag,memmagdmag,xdotk;
- for (i=0;i<sp->N;i++) if (!sp->dead[i])
- {
- x1 = x[2*i+0];
- x2 = x[2*i+1];
- k1 = k[2*i+0];
- k2 = k[2*i+1];
- mag2 = x1*x1 + x2*x2;
- if (mag2 < 1e-10)
- {
- ret[2*i+0] = x1+k1;
- ret[2*i+1] = x2+k2;
- }
- else if (mag2 > 1-1e-5)
- sp->dead[i] = 1;
- else
- {
- mag = sqrt(mag2);
- mlog1mmag = -log(1-mag);
- xdotk = x1*k1 + x2*k2;
- t1 = (x1 + k1)*mlog1mmag/mag + x1*xdotk*(1.0/(1-mag)-mlog1mmag/mag)/mag/mag;
- t2 = (x2 + k2)*mlog1mmag/mag + x2*xdotk*(1.0/(1-mag)-mlog1mmag/mag)/mag/mag;
- mag = sqrt(t1*t1+t2*t2);
- if (mag > 11.5 /* log(1e5) */)
- sp->dead[i] = 1;
- else
- {
- memmagdmag = (mag>1e-5) ? ((1.0-exp(-mag))/mag) : (1-mag/2.0);
- ret[2*i+0] = t1*memmagdmag;
- ret[2*i+1] = t2*memmagdmag;
- }
- }
- if (!sp->dead[i])
- {
- d1 = ret[2*i+0]-x1;
- d2 = ret[2*i+1]-x2;
- if (d1*d1+d2*d2 > 0.1)
- sp->dead[i] = 1;
- }
- }
-
-#else
-
- for (i=0;i<sp->N;i++) if (!sp->dead[i])
- {
- x1 = x[2*i+0];
- x2 = x[2*i+1];
- k1 = k[2*i+0];
- k2 = k[2*i+1];
- if (k1*k1+k2*k2 > 0.1 || x1*x1+x2*x2 > 1-1e-5)
- sp->dead[i] = 1;
- else
- {
- ret[2*i+0] = x1+k1;
- ret[2*i+1] = x2+k2;
- }
- }
-#endif
-}
-
-static void
-ode_solve(euler2dstruct *sp)
-{
- int i;
- double *temp;
-
- if (sp->count < 1) {
- /* midpoint method */
- derivs(sp->x,sp);
- (void) memcpy(sp->olddiffx,sp->diffx,sizeof(double)*2*sp->N);
- for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
- sp->tempdiffx[2*i+0] = 0.5*delta_t*sp->diffx[2*i+0];
- sp->tempdiffx[2*i+1] = 0.5*delta_t*sp->diffx[2*i+1];
- }
- perturb(sp->tempx,sp->x,sp->tempdiffx,sp);
- derivs(sp->tempx,sp);
- for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
- sp->tempdiffx[2*i+0] = delta_t*sp->diffx[2*i+0];
- sp->tempdiffx[2*i+1] = delta_t*sp->diffx[2*i+1];
- }
- perturb(sp->x,sp->x,sp->tempdiffx,sp);
- } else {
- /* Adams Basforth */
- derivs(sp->x,sp);
- for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
- sp->tempdiffx[2*i+0] = delta_t*(1.5*sp->diffx[2*i+0] - 0.5*sp->olddiffx[2*i+0]);
- sp->tempdiffx[2*i+1] = delta_t*(1.5*sp->diffx[2*i+1] - 0.5*sp->olddiffx[2*i+1]);
- }
- perturb(sp->x,sp->x,sp->tempdiffx,sp);
- temp = sp->olddiffx;
- sp->olddiffx = sp->diffx;
- sp->diffx = temp;
- }
-}
-
-#define deallocate(p,t) if (p!=NULL) {(void) free((void *) p); p=(t*)NULL; }
-#define allocate(p,t,s) if ((p=(t*)malloc(sizeof(t)*s))==NULL)\
-{free_euler2d(mi);return;}
-
-ENTRYPOINT void
-free_euler2d(ModeInfo * mi)
-{
- euler2dstruct *sp = &euler2ds[MI_SCREEN(mi)];
- deallocate(sp->csegs, XSegment);
- deallocate(sp->old_segs, XSegment);
- deallocate(sp->nold_segs, int);
- deallocate(sp->lastx, short);
- deallocate(sp->x, double);
- deallocate(sp->diffx, double);
- deallocate(sp->w, double);
- deallocate(sp->olddiffx, double);
- deallocate(sp->tempdiffx, double);
- deallocate(sp->tempx, double);
- deallocate(sp->dead, short);
- deallocate(sp->boundary, XSegment);
- deallocate(sp->xs, double);
- deallocate(sp->x_is_zero, short);
- deallocate(sp->p, double);
- deallocate(sp->mod_dp2, double);
-}
-
-ENTRYPOINT void
-init_euler2d (ModeInfo * mi)
-{
-#define nr_rotates 18 /* how many rotations to try to fill as much of screen as possible - must be even number */
- euler2dstruct *sp;
- int i,k,n,np;
- double r,theta,x,y,w;
- double mag,xscale,yscale,p1,p2;
- double low[nr_rotates],high[nr_rotates],pp1,pp2,pn1,pn2,angle1,angle2,tempangle,dist,scale,bestscale,temp;
- int besti = 0;
-
- if (power<0.5) power = 0.5;
- if (power>3.0) power = 3.0;
- variable_boundary &= power == 1.0;
- delta_t = 0.001;
- if (power>1.0) delta_t *= pow(0.1,power-1);
-
- MI_INIT (mi, euler2ds);
- sp = &euler2ds[MI_SCREEN(mi)];
-
-#ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
-#endif
-
- sp->boundary_color = NRAND(MI_NPIXELS(mi));
- sp->hide_vortex = NRAND(4) != 0;
-
- sp->count = 0;
-
- sp->xshift2 = sp->yshift2 = 0;
-
- sp->width = MI_WIDTH(mi);
- sp->height = MI_HEIGHT(mi);
-
- if (sp->width > sp->height * 5 || /* window has weird aspect */
- sp->height > sp->width * 5)
- {
- if (sp->width > sp->height)
- {
- sp->height = sp->width * 0.8;
- sp->yshift2 = -sp->height/2;
- }
- else
- {
- sp->width = sp->height * 0.8;
- sp->xshift2 = -sp->width/2;
- }
- }
-
- sp->N = MI_COUNT(mi)+number_of_vortex_points;
- sp->Nvortex = number_of_vortex_points;
-
- if (tail_len < 1) { /* minimum tail */
- tail_len = 1;
- }
- if (tail_len > MI_CYCLES(mi)) { /* maximum tail */
- tail_len = MI_CYCLES(mi);
- }
-
- /* Clear the background. */
- MI_CLEARWINDOW(mi);
-
- /* Allocate memory. */
-
- if (sp->csegs == NULL) {
- allocate(sp->csegs, XSegment, sp->N);
- allocate(sp->old_segs, XSegment, sp->N * tail_len);
- allocate(sp->nold_segs, int, tail_len);
- allocate(sp->lastx, short, sp->N * 2);
- allocate(sp->x, double, sp->N * 2);
- allocate(sp->diffx, double, sp->N * 2);
- allocate(sp->w, double, sp->Nvortex);
- allocate(sp->olddiffx, double, sp->N * 2);
- allocate(sp->tempdiffx, double, sp->N * 2);
- allocate(sp->tempx, double, sp->N * 2);
- allocate(sp->dead, short, sp->N);
- allocate(sp->boundary, XSegment, n_bound_p);
- allocate(sp->xs, double, sp->Nvortex * 2);
- allocate(sp->x_is_zero, short, sp->Nvortex);
- allocate(sp->p, double, sp->N * 2);
- allocate(sp->mod_dp2, double, sp->N);
- }
- for (i=0;i<tail_len;i++) {
- sp->nold_segs[i] = 0;
- }
- sp->c_old_seg = 0;
- (void) memset(sp->dead,0,sp->N*sizeof(short));
-
- if (variable_boundary)
- {
- /* Initialize polynomial p */
-/*
- The polynomial p(z) = z + c_2 z^2 + ... c_n z^n needs to be
- a bijection of the unit disk onto its image. This is achieved
- by insisting that sum_{k=2}^n k |c_k| <= 1. Actually we set
- the inequality to be equality (to get more interesting shapes).
-*/
- mag = 0;
- for(k=2;k<=deg_p;k++)
- {
- r = positive_rand(1.0/k);
- theta = balance_rand(2*M_PI);
- sp->p_coef[2*(k-2)+0]=r*cos(theta);
- sp->p_coef[2*(k-2)+1]=r*sin(theta);
- mag += k*r;
- }
- if (mag > 0.0001) for(k=2;k<=deg_p;k++)
- {
- sp->p_coef[2*(k-2)+0] /= mag;
- sp->p_coef[2*(k-2)+1] /= mag;
- }
-
-#if DEBUG_POINTED_REGION
- for(k=2;k<=deg_p;k++){
- sp->p_coef[2*(k-2)+0]=0;
- sp->p_coef[2*(k-2)+1]=0;
- }
- sp->p_coef[2*(6-2)+0] = 1.0/6.0;
-#endif
-
-
-/* Here we figure out the best rotation of the domain so that it fills as
- much of the screen as possible. The number of angles we look at is determined
- by nr_rotates (we look every 180/nr_rotates degrees).
- While we figure out the best angle to rotate, we also figure out the correct scaling factors.
-*/
-
- for(k=0;k<nr_rotates;k++) {
- low[k] = 1e5;
- high[k] = -1e5;
- }
-
- for(k=0;k<n_bound_p;k++) {
- calc_p(&p1,&p2,cos((double)k/(n_bound_p)*2*M_PI),sin((double)k/(n_bound_p)*2*M_PI),sp->p_coef);
- calc_p(&pp1,&pp2,cos((double)(k-1)/(n_bound_p)*2*M_PI),sin((double)(k-1)/(n_bound_p)*2*M_PI),sp->p_coef);
- calc_p(&pn1,&pn2,cos((double)(k+1)/(n_bound_p)*2*M_PI),sin((double)(k+1)/(n_bound_p)*2*M_PI),sp->p_coef);
- angle1 = nr_rotates/M_PI*atan2(p2-pp2,p1-pp1)-nr_rotates/2;
- angle2 = nr_rotates/M_PI*atan2(pn2-p2,pn1-p1)-nr_rotates/2;
- while (angle1<0) angle1+=nr_rotates*2;
- while (angle2<0) angle2+=nr_rotates*2;
- if (angle1>nr_rotates*1.75 && angle2<nr_rotates*0.25) angle2+=nr_rotates*2;
- if (angle1<nr_rotates*0.25 && angle2>nr_rotates*1.75) angle1+=nr_rotates*2;
- if (angle2<angle1) {
- tempangle=angle1;
- angle1=angle2;
- angle2=tempangle;
- }
- for(i=(int)floor(angle1);i<(int)ceil(angle2);i++) {
- dist = cos((double)i*M_PI/nr_rotates)*p1 + sin((double)i*M_PI/nr_rotates)*p2;
- if (i%(nr_rotates*2)<nr_rotates) {
- if (dist>high[i%nr_rotates]) high[i%nr_rotates] = dist;
- if (dist<low[i%nr_rotates]) low[i%nr_rotates] = dist;
- }
- else {
- if (-dist>high[i%nr_rotates]) high[i%nr_rotates] = -dist;
- if (-dist<low[i%nr_rotates]) low[i%nr_rotates] = -dist;
- }
- }
- }
- bestscale = 0;
- for (i=0;i<nr_rotates;i++) {
- xscale = (sp->width-5.0)/(high[i]-low[i]);
- yscale = (sp->height-5.0)/(high[(i+nr_rotates/2)%nr_rotates]-low[(i+nr_rotates/2)%nr_rotates]);
- scale = (xscale>yscale) ? yscale : xscale;
- if (scale>bestscale) {
- bestscale = scale;
- besti = i;
- }
- }
-/* Here we do the rotation. The way we do this is to replace the
- polynomial p(z) by a^{-1} p(a z) where a = exp(i best_angle).
-*/
- p1 = 1;
- p2 = 0;
- for(k=2;k<=deg_p;k++)
- {
- mult(p1,p2,cos((double)besti*M_PI/nr_rotates),sin((double)besti*M_PI/nr_rotates));
- mult(sp->p_coef[2*(k-2)+0],sp->p_coef[2*(k-2)+1],p1,p2);
- }
-
- sp->scale = bestscale;
- sp->xshift = -(low[besti]+high[besti])/2.0*sp->scale+sp->width/2;
- if (besti<nr_rotates/2)
- sp->yshift = -(low[besti+nr_rotates/2]+high[besti+nr_rotates/2])/2.0*sp->scale+sp->height/2;
- else
- sp->yshift = (low[besti-nr_rotates/2]+high[besti-nr_rotates/2])/2.0*sp->scale+sp->height/2;
-
- sp->xshift += sp->xshift2;
- sp->yshift += sp->yshift2;
-
-/* Initialize boundary */
-
- for(k=0;k<n_bound_p;k++)
- {
-
- calc_p(&p1,&p2,cos((double)k/(n_bound_p)*2*M_PI),sin((double)k/(n_bound_p)*2*M_PI),sp->p_coef);
- sp->boundary[k].x1 = (short)(p1*sp->scale+sp->xshift);
- sp->boundary[k].y1 = (short)(p2*sp->scale+sp->yshift);
- }
- for(k=1;k<n_bound_p;k++)
- {
- sp->boundary[k].x2 = sp->boundary[k-1].x1;
- sp->boundary[k].y2 = sp->boundary[k-1].y1;
- }
- sp->boundary[0].x2 = sp->boundary[n_bound_p-1].x1;
- sp->boundary[0].y2 = sp->boundary[n_bound_p-1].y1;
- }
- else
- {
- if (sp->width>sp->height)
- sp->radius = sp->height/2.0-5.0;
- else
- sp->radius = sp->width/2.0-5.0;
- }
-
- /* Initialize point positions */
-
- for (i=sp->Nvortex;i<sp->N;i++) {
- do {
- r = sqrt(positive_rand(1.0));
- theta = balance_rand(2*M_PI);
- sp->x[2*i+0]=r*cos(theta);
- sp->x[2*i+1]=r*sin(theta);
- /* This is to make sure the initial distribution of points is uniform */
- } while (variable_boundary &&
- calc_mod_dp2(sp->x[2*i+0],sp->x[2*i+1],sp->p_coef)
- < positive_rand(4));
- }
-
- n = NRAND(4)+2;
- /* number of vortex points with negative vorticity */
- if (n%2) {
- np = NRAND(n+1);
- }
- else {
- /* if n is even make sure that np==n/2 is twice as likely
- as the other possibilities. */
- np = NRAND(n+2);
- if (np==n+1) np=n/2;
- }
- for(k=0;k<n;k++)
- {
- r = sqrt(positive_rand(0.77));
- theta = balance_rand(2*M_PI);
- x=r*cos(theta);
- y=r*sin(theta);
- r = 0.02+positive_rand(0.1);
- w = (2*(k<np)-1)*2.0/sp->Nvortex;
- for (i=sp->Nvortex*k/n;i<sp->Nvortex*(k+1)/n;i++) {
- theta = balance_rand(2*M_PI);
- sp->x[2*i+0]=x + r*cos(theta);
- sp->x[2*i+1]=y + r*sin(theta);
- sp->w[i]=w;
- }
- }
-}
-
-ENTRYPOINT void
-draw_euler2d (ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GC gc = MI_GC(mi);
- int b, col, n_non_vortex_segs;
- euler2dstruct *sp;
-
- MI_IS_DRAWN(mi) = True;
-
- if (euler2ds == NULL)
- return;
- sp = &euler2ds[MI_SCREEN(mi)];
- if (sp->csegs == NULL)
- return;
-
- ode_solve(sp);
- if (variable_boundary)
- calc_all_p(sp);
-
- sp->cnsegs = 0;
- for(b=sp->Nvortex;b<sp->N;b++) if(!sp->dead[b])
- {
- sp->csegs[sp->cnsegs].x1 = sp->lastx[2*b+0];
- sp->csegs[sp->cnsegs].y1 = sp->lastx[2*b+1];
- if (variable_boundary)
- {
- sp->csegs[sp->cnsegs].x2 = (short)(sp->p[2*b+0]*sp->scale+sp->xshift);
- sp->csegs[sp->cnsegs].y2 = (short)(sp->p[2*b+1]*sp->scale+sp->yshift);
- }
- else
- {
- sp->csegs[sp->cnsegs].x2 = (short)(sp->x[2*b+0]*sp->radius+sp->width/2);
- sp->csegs[sp->cnsegs].y2 = (short)(sp->x[2*b+1]*sp->radius+sp->height/2);
- }
- sp->lastx[2*b+0] = sp->csegs[sp->cnsegs].x2;
- sp->lastx[2*b+1] = sp->csegs[sp->cnsegs].y2;
- sp->cnsegs++;
- }
- n_non_vortex_segs = sp->cnsegs;
-
- if (!sp->hide_vortex) for(b=0;b<sp->Nvortex;b++) if(!sp->dead[b])
- {
- sp->csegs[sp->cnsegs].x1 = sp->lastx[2*b+0];
- sp->csegs[sp->cnsegs].y1 = sp->lastx[2*b+1];
- if (variable_boundary)
- {
- sp->csegs[sp->cnsegs].x2 = (short)(sp->p[2*b+0]*sp->scale+sp->xshift);
- sp->csegs[sp->cnsegs].y2 = (short)(sp->p[2*b+1]*sp->scale+sp->yshift);
- }
- else
- {
- sp->csegs[sp->cnsegs].x2 = (short)(sp->x[2*b+0]*sp->radius+sp->width/2);
- sp->csegs[sp->cnsegs].y2 = (short)(sp->x[2*b+1]*sp->radius+sp->height/2);
- }
- sp->lastx[2*b+0] = sp->csegs[sp->cnsegs].x2;
- sp->lastx[2*b+1] = sp->csegs[sp->cnsegs].y2;
- sp->cnsegs++;
- }
-
- if (sp->count) {
- XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
-
- XDrawSegments(display, window, gc, sp->old_segs+sp->c_old_seg*sp->N, sp->nold_segs[sp->c_old_seg]);
-
- if (MI_NPIXELS(mi) > 2){ /* render colour */
- for (col = 0; col < MI_NPIXELS(mi); col++) {
- int start = col*n_non_vortex_segs/MI_NPIXELS(mi);
- int finish = (col+1)*n_non_vortex_segs/MI_NPIXELS(mi);
- XSetForeground(display, gc, MI_PIXEL(mi, col));
- XDrawSegments(display, window, gc,sp->csegs+start, finish-start);
- }
- if (!sp->hide_vortex) {
- XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
- XDrawSegments(display, window, gc,sp->csegs+n_non_vortex_segs, sp->cnsegs-n_non_vortex_segs);
- }
-
- } else { /* render mono */
- XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
- XDrawSegments(display, window, gc,
- sp->csegs, sp->cnsegs);
- }
-
- if (MI_NPIXELS(mi) > 2) /* render colour */
- XSetForeground(display, gc, MI_PIXEL(mi, sp->boundary_color));
- else
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
- if (variable_boundary)
- XDrawSegments(display, window, gc,
- sp->boundary, n_bound_p);
- else
- XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
- sp->width/2 - (int) sp->radius - 1, sp->height/2 - (int) sp->radius -1,
- (int) (2*sp->radius) + 2, (int) (2* sp->radius) + 2, 0, 64*360);
-
- /* Copy to erase-list */
- (void) memcpy(sp->old_segs+sp->c_old_seg*sp->N, sp->csegs, sp->cnsegs*sizeof(XSegment));
- sp->nold_segs[sp->c_old_seg] = sp->cnsegs;
- sp->c_old_seg++;
- if (sp->c_old_seg >= tail_len)
- sp->c_old_seg = 0;
- }
-
- if (++sp->count > MI_CYCLES(mi)) /* pick a new flow */
- init_euler2d(mi);
-
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_euler2d (ModeInfo * mi)
-{
- MI_CLEARWINDOW(mi);
-}
-#endif
-
-XSCREENSAVER_MODULE ("Euler2D", euler2d)
-
-#endif /* MODE_euler2d */
diff --git a/hacks/euler2d.man b/hacks/euler2d.man
deleted file mode 100644
index e99d023..0000000
--- a/hacks/euler2d.man
+++ /dev/null
@@ -1,69 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-euler2d \- two dimensional incompressible inviscid fluid flow.
-.SH SYNOPSIS
-.B euler2d
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-eulertail \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Simulates two dimensional incompressible inviscid fluid flow.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-Particles. 2 - 5000. Default: 1024.
-.TP 8
-.B \-eulertail \fInumber\fP
-Trail Length. 2 - 500. Default: 10.
-.TP 8
-.B \-cycles \fInumber\fP
-Duration. 100 - 5000. Default: 3000.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 64.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Stephen Montgomery-Smith. Permission to use,
-copy, modify, distribute, and sell this software and its documentation
-for any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Stephen Montgomery-Smith.
diff --git a/hacks/euler2d.tex b/hacks/euler2d.tex
deleted file mode 100644
index 700ad31..0000000
--- a/hacks/euler2d.tex
+++ /dev/null
@@ -1,337 +0,0 @@
-\documentclass[12pt]{article}
-
-%\usepackage{fullpage}
-\usepackage{amsmath,amssymb}
-
-\begin{document}
-
-\title{Two Dimensional Euler Simulation}
-
-\author{
-S.J. Montgomery-Smith\\
-Department of Mathematics\\
-University of Missouri\\
-Columbia, MO 65211, U.S.A.\\
-stephen@math.missouri.edu\\
-http://www.math.missouri.edu/\~{}stephen}
-
-\date{September 10, 2000}
-
-\maketitle
-
-This document describes a program I wrote to simulate the
-two dimensional Euler Equation --- a program that is part
-of the {\tt xlock} screensaver as the {\tt euler2d}
-mode. A similar explanation may also be found in the
-book by Chorin \cite{C}.
-
-\section{The Euler Equation}
-
-The Euler Equation describes the motion of an incompressible
-fluid that has no viscosity. If the fluid is contained
-in a domain $\Omega$ with boundary $\partial \Omega$, then
-the equation is in the vector field $u$ (the velocity)
-and the
-scalar field $p$ (the pressure):
-\begin{eqnarray*}
-\frac{\partial}{\partial t} u &=& -u \cdot \nabla u + \nabla p \\
-\nabla \cdot u &=& 0 \\
-u \cdot n &=& 0 \quad \text{on $\partial \Omega$}
-\end{eqnarray*}
-where $n$ is the unit normal to $\partial \Omega$.
-
-\section{Vorticity}
-
-It turns out that it can be easier write these equations
-in terms of the vorticity. In two dimensions the vorticity
-is the scalar $w = \partial u_2/\partial x - \partial u_1/\partial y$.
-The equation for vorticity becomes
-\[ \frac{\partial}{\partial t} w = -u \cdot \nabla w .\]
-A solution to this equation can be written as follows. The velocity
-$u$ causes a flow, that is, a function $\varphi(t,x)$ that tells where
-the particle initially at $x$ ends up at time $t$, that is
-\[
-\frac\partial{\partial t} \varphi(t,x)
-= u(t,\varphi(t,x)) .\]
-Then the equation
-for $w$ tells us that the vorticity is ``pushed'' around by the flow,
-that is, $w(t,\varphi(t,x)) = w(0,x)$.
-
-\section{The Biot-Savart Kernel}
-
-Now, once we have the vorticity, we can recover the velocity $u$ by
-solving the equation
-\begin{eqnarray*}
-\partial u_2/\partial x - \partial u_1/\partial y &=& w \\
-\nabla \cdot u &=& 0 \\
-u \cdot n &=& 0 \quad \text{on $\partial \Omega$}.
-\end{eqnarray*}
-This equation is solved by using a Biot-Savart kernel $K(x,y)$:
-$$ u(x) = \int_\Omega K(x,y) w(y) \, dy .$$
-The function $K$ depends upon the choice of domain. First let us consider
-the case when $\Omega$ is the whole plane (in which case the boundary
-condition $u \cdot n = 0$ is replaced by saying that $u$ decays at infinity).
-Then
-\begin{equation*}
-K(x,y) = K_1(x,y) = c \frac{(x-y)^\perp}{|x-y|^2} .
-\end{equation*}
-Here $x^\perp = (-x_2,x_1)$, and $c$ is a constant, probably something
-like $1/2\pi$. In any case we will set it to be one, which in effect
-is rescaling the time variable, so we don't need to worry about it.
-
-We can use this as a basis to find $K$ on the unit disk
-$\Omega = \Delta = \{x:|x|<1\}$. It turns out to be
-\begin{equation*}
-K_2(x,y) = K_1(x,y) - K_1(x,y^*) ,
-\end{equation*}
-where $y^* = y/|y|^2$ is called the reflection of $y$ about the
-boundary of the unit disk.
-
-Another example is if we have a bijective analytic function
-$p:\Delta \to {\mathbb C}$, and we let $\Omega = p(\Delta)$.
-(Here we think of $\Delta$ as a subset of $\mathbb C$, that is,
-we are identifying the plane with the set of complex numbers.)
-In that case we get
-\[ K_p(p(x),p(y)) = K_2(x,y)/|p'(x)|^2 .\]
-Our simulation considers the last case. Examples of such
-analytic functions include series
-$p(x) = x + \sum_{n=2}^\infty c_n x^n$, where
-$\sum_{n=2}^\infty n |c_n| \le 1$.
-(Thanks to David Ullrich for pointing this out to me.)
-
-\section{The Simulation}
-
-Now let's get to decribing the simulation. We assume a rather
-unusual initial distribution for the vorticity --- that the
-vorticity is a finite sum of dirac delta masses.
-\[ w(0,x) = \sum_{k=1}^N w_k \delta(x-x_k(0)) .\]
-Here $x_k(0)$ is the initial place where the points
-of vorticity are concentrated, with values $w_k$.
-Then at time $t$, the vorticity becomes
-\[ w(t,x) = \sum_{k=1}^N w_k \delta(x-x_k(t)) .\]
-The points of fluid $x_k(t)$ are pushed by the
-flow, that is, $x_k(t) = \varphi(t,x_k(0))$, or
-\[ \frac{\partial}{\partial t} x_k(t) = u(t,x_k(t)) .\]
-Putting this all together, we finally obtain the equations
-\[ \frac{\partial}{\partial t} x_k = \alpha_k \]
-where
-\[ \alpha_k = \sum_{l=1}^N w_l K(x_k,x_l) .\]
-This is the equation that our simulation solves.
-
-In fact, in our case, where the domain is $p(\Delta)$,
-the points are described by points
-$\tilde x_k$, where $x_k = p(\tilde x_k)$. Then
-the equations become
-\begin{eqnarray}
-\label{tildex-p1}
-\frac{\partial}{\partial t} \tilde x_k &=& \tilde\alpha_k \\
-\label{tildex-p2}
-\tilde\alpha_k &=& \frac1{|p'(\tilde x_k)|^2}
- \sum_{l=1}^N w_l K_2(\tilde x_k,\tilde x_l) .
-\end{eqnarray}
-
-We solve this $2N$ system of equations using standard
-numerical methods, in our case, using the second order midpoint method
-for the first step, and thereafter using the second order Adams-Bashforth
-method. (See for example the book
-by Burden and Faires \cite{BF}).
-
-\section{The Program - Data Structures}
-
-The computer program solves equation (\ref{tildex-p1}), and displays
-the results on the screen, with a boundary. All the information
-for solving the equation and displaying the output is countained
-in the structure {\tt euler2dstruct}. Let us describe some of
-the fields in {\tt euler2dstruct}.
-The points $\tilde x_k$ are contained
-in {\tt double *x}: with the coordinates of
-$\tilde x_k$ being the two numbers
-{\tt x[2*k+0]}, {\tt x[2*k+1]}. The values $w_k$ are contained
-in {\tt double *w}. The total number of points is
-{\tt int N}. (But only the first {\tt int Nvortex} points
-have $w_k \ne 0$.) The coefficients of the analytic function
-(in our case a polynomial) $p$
-are contained in {\tt double p\_coef[2*(deg\_p-1)]} --- here
-{\tt deg\_p} is the degree of $p$, and the real and imaginary
-parts of the coefficient
-$c_n$ is contained in {\tt p\_coef[2*(n-2)+0]} and {\tt p\_coef[2*(n-2)+1]}.
-
-\section{Data Initialization}
-
-The program starts in the function {\tt init\_euler2d}. After allocating
-the memory for the data, and initialising some of the temporary variables
-required for the numerical solving program, it randomly assigns the
-coefficients of $p$, making sure that $\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$.
-Then the program figures out how to draw the boundary, and what rescaling
-of the data is required to draw it on the screen. (This uses the
-function {\tt calc\_p} which calculates $p(x)$.)
-
-Next, it randomly assigns the initial values of $\tilde x_k$. We want
-to do this in such a way so that the points are uniformly spread over the
-domain. Let us first consider the case when the domain is the unit circle
-$\Delta$. In that case the proportion of points that we would expect
-inside the circle of radius $r$ would be proportional to $r^2$. So
-we do it as follows:
-\[ r = \sqrt{R_{0,1}},\quad \theta = R_{-\pi,\pi}, \quad
- \tilde x_k = r (\cos \theta, \sin \theta) .\]
-Here, and in the rest of this discussion, $R_{a,b}$ is a function
-that returns a random variable uniformly distributed over the interval
-$[a,b]$.
-
-This works fine for $\Delta$, but for $p(\Delta)$, the points
-$p(\tilde x_k)$ are not uniformly distributed over $p(\Delta)$,
-but are distributed with a density proportional to
-$1/|p'(\tilde x_k)|^2$. So to restore the uniform density we need
-to reject this value of $\tilde x_k$ with probability proportional
-to $|p'(\tilde x_k)|^2$. Noticing that the condition
-$\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$ implies that
-$|p'(\tilde x_k)| \le 2$, we
-do this by rejecting if $|p'(\tilde x_k)|^2 < R_{0,4}$.
-(This makes use of the function {\tt calc\_mod\_dp2} which calculates
-$|p'(x)|^2$.)
-
-\section{Solving the Equation}
-
-The main loop of the program is in the function {\tt draw\_euler2d}.
-Most of the drawing operations are contained in this function, and
-the numerical aspects are sent to the function {\tt ode\_solve}.
-But there is an aspect of this that I would like
-to discuss in the next section, and so we will look at a simple method for
-numerically solving differential equations.
-
-The Euler Method
-(nothing to do with the Euler Equation), is as
-follows. Pick a small number $h$ --- the time step (in
-the program call {\tt delta\_t}). Then we approximate
-the solution of the equation:
-\begin{equation}
-\label{method-simple}
-\tilde x_k(t+h) = \tilde x_k(t) + h \tilde\alpha_k(t) .
-\end{equation}
-The more sophisticated methods we use are variations of
-the Euler Method, and so the discussion in the following section
-still applies.
-
-In the program, the quantities $\tilde\alpha_k$, given by
-equations (\ref{tildex-p2}) are calculated by the function
-{\tt derivs}
-(which in turns calls {\tt calc\_all\_mod\_dp2} to
-calculate $|p'(\tilde x_k)|^2$ at all the points).
-
-
-\section{Subtle Perturbation}
-
-Added later: the scheme described here seems to not be that effective,
-so now it is not used.
-
-One problem using a numerical scheme such as the Euler Method occurs
-when the points $\tilde x_k$ get close to the boundary
-of $\Delta$. In that case, it is possible that the new
-points will be pushed outside of the boundary. Even if they
-are not pushed out of the boundary, they may be much closer
-or farther from the boundary than they should be.
-Our system of equations is very sensitive to how close points
-are to the boundary --- points with non-zero vorticity
-(``vortex points'') that are close to the boundary travel
-at great speed alongside the boundary, with speed that is
-inversely proportional to the distance from the boundary.
-
-A way to try to mitigate this problem is something that I call
-``subtle perturbation.''
-We map the points in
-the unit disk to points in the plane using the map
-\begin{equation*}
-F(x) = f(|x|) \frac x{|x|} ,
-\end{equation*}
-where $f:[0,1]\to[0,\infty]$ is an increasing continuous
-bijection. It turns out that a good choice is
-\begin{equation*}
-f(t) = -\log(1-t) .
-\end{equation*}
-(The reason for this is that points close to each other
-that are a distance
-about $r$ from the boundary will be pushed around so that
-their distance from each other is about multiplied by the
-derivative of $\log r$, that is, $1/r$.)
-Note that the inverse of this function is given by
-\begin{equation*}
-F^{-1}(x) = f^{-1}(|x|) \frac x{|x|} ,
-\end{equation*}
-where
-\begin{equation*}
-f^{-1}(t) = 1-e^{-t} .
-\end{equation*}
-
-So what we could do is the following: instead of working with
-the points $\tilde x_k$, we could work instead with the points
-$y_k = F(\tilde x_k)$. In effect this is what we do.
-Instead of performing the computation (\ref{method-simple}),
-we do the calculation
-\begin{equation*}
-y_k = F(\tilde x_k(t)) + h {\cal A}(\tilde x_k) \tilde\alpha_k(t)
-\end{equation*}
-where
-${\cal A}(x)$ is the matrix of partial derivatives of $F$:
-\begin{equation*}
-{\cal A}(x) =
-\frac{f(|x|)}{|x|}
-\left[
-\begin{matrix}
-1 & 0\\
-0 & 1
-\end{matrix}
-\right]
-+ \frac1{|x|}
- \left(\frac{f'(|x|)}{|x|} - \frac{f(|x|)}{|x|^2}\right)
-\left[
-\begin{matrix}
-x_{1}^2 & x_{1} x_{2}\\
-x_{1} x_{2} & x_{2}^2
-\end{matrix}
-\right],
-\end{equation*}
-and then compute
-\begin{equation*}
-\tilde x_k(t+h) = F^{-1}(y_k).
-\end{equation*}
-These calculations are done in the function {\tt perturb}, if
-the quantity {\tt SUBTLE\_PERTURB} is set.
-
-\section{Drawing the Points}
-
-As we stated earlier, most of the drawing functions are contained
-in the function {\tt draw\_euler2d}. If the variable
-{\tt hide\_vortex} is set (and the function {\tt init\_euler2d}
-will set this with probability $3/4$), then we only display
-the points $\tilde x_k$ for ${\tt Nvortex} < k \le N$. If
-{\tt hide\_vortex} is not set, then the ``vortex points''
-$\tilde x_k$ ($1 \le k \le {\tt Nvortex}$) are displayed in white.
-In fact the points $p(\tilde x_k)$ are what are put onto the screen,
-and for this we make use of the function {\tt calc\_all\_p}.
-
-\section{Addition to Program: Changing the Power Law}
-
-A later addition to the program adds an option {\tt eulerpower},
-which allows one to change the power law that describes how
-the vortex points influence other points. In effect, if this
-option is set with the value $m$, then the Biot-Savart Kernel
-is replace by
-$$ K_1(x,y) = \frac{(x-y)^\perp}{|x-y|^{m+1}}, $$
-and
-$$ K_2(x,y) = K_1(x,y) - |y|^{1-m} K_1(x,y) .$$
-So for example, setting $m=2$ corresponds to the
-quasi-geostrophic equation. (I haven't yet figured out
-what $K_p$ should be, so if $m \ne 1$ we use the unit circle
-as the boundary.)
-
-\begin{thebibliography}{9}
-
-\bibitem{BF} Richard L. Burden, J. Douglas Faires, Numerical Analysis,
-sixth edition, Brooks/Cole, 1996.
-
-\bibitem{C} Alexandre J. Chorin, Vorticity and Turbulence,
-Applied Mathematical Sciences, Vol 103, Springer Verlag, 1994.
-
-\end{thebibliography}
-
-\end{document}
diff --git a/hacks/fadeplot.c b/hacks/fadeplot.c
deleted file mode 100644
index 93f4719..0000000
--- a/hacks/fadeplot.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* fadeplot --- a fading plot of sine squared */
-
-#if 0
-static const char sccsid[] = "@(#)fadeplot.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Some easy plotting stuff, by Bas van Gaalen, Holland, PD
- *
- * Copyright (c) 1996 by Charles Vidal
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 01-Nov-2000: Allocation checks
- * 10-May-1997: Compatible with screensaver
- * 1996: Written by Charles Vidal based on work by Bas van Gaalen
- */
-
-#ifdef STANDALONE
-# define MODE_fadeplot
-# define DEFAULTS "*delay: 30000 \n" \
- "*count: 10 \n" \
- "*cycles: 1500 \n" \
- "*ncolors: 64 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n" \
-
-# define BRIGHT_COLORS
-# define UNIFORM_COLORS
-# define release_fadeplot 0
-# define fadeplot_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_fadeplot
-
-ENTRYPOINT ModeSpecOpt fadeplot_opts =
-{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
-
-#ifdef USE_MODULES
-ModStruct fadeplot_description =
-{"fadeplot", "init_fadeplot", "draw_fadeplot", (char *) NULL,
- "refresh_fadeplot", "init_fadeplot", "free_fadeplot", &fadeplot_opts,
- 30000, 10, 1500, 1, 64, 0.6, "",
- "Shows a fading plot of sine squared", 0, NULL};
-
-#endif
-
-#define MINSTEPS 1
-
-typedef struct {
- XPoint speed, step, factor, st;
- int temps, maxpts, nbstep;
- int min;
- int width, height;
- int pix;
- int angles;
- int *stab;
- XPoint *pts;
-} fadeplotstruct;
-
-static fadeplotstruct *fadeplots = (fadeplotstruct *) NULL;
-
-ENTRYPOINT void
-free_fadeplot(ModeInfo * mi)
-{
- fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
- if (fp->pts != NULL) {
- (void) free((void *) fp->pts);
- fp->pts = (XPoint *) NULL;
- }
- if (fp->stab != NULL) {
- (void) free((void *) fp->stab);
- fp->stab = (int *) NULL;
- }
-}
-
-static Bool
-initSintab(ModeInfo * mi)
-{
- fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
- int i;
- float x;
-
- fp->angles = NRAND(950) + 250;
- if ((fp->stab = (int *) malloc(fp->angles * sizeof (int))) == NULL) {
- free_fadeplot(mi);
- return False;
- }
- for (i = 0; i < fp->angles; i++) {
- x = SINF(2.0 * M_PI * i / fp->angles);
- fp->stab[i] = (int) (x * ABS(x) * fp->min) + fp->min;
- }
- return True;
-}
-
-ENTRYPOINT void
-init_fadeplot (ModeInfo * mi)
-{
- fadeplotstruct *fp;
-
- MI_INIT (mi, fadeplots);
- fp = &fadeplots[MI_SCREEN(mi)];
-
- fp->width = MI_WIDTH(mi);
- fp->height = MI_HEIGHT(mi);
- fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
-
- fp->speed.x = 8;
- fp->speed.y = 10;
- fp->step.x = 1;
- fp->step.y = 1;
- fp->temps = 0;
- fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
- fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
-
- fp->nbstep = MI_COUNT(mi);
- if (fp->nbstep < -MINSTEPS) {
- fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS;
- } else if (fp->nbstep < MINSTEPS)
- fp->nbstep = MINSTEPS;
-
- fp->maxpts = MI_CYCLES(mi);
- if (fp->maxpts < 1)
- fp->maxpts = 1;
-
- if (fp->pts == NULL) {
- if ((fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint))) ==
- NULL) {
- free_fadeplot(mi);
- return;
- }
- }
- if (MI_NPIXELS(mi) > 2)
- fp->pix = NRAND(MI_NPIXELS(mi));
-
- if (fp->stab != NULL)
- (void) free((void *) fp->stab);
- if (!initSintab(mi))
- return;
- MI_CLEARWINDOW(mi);
-}
-
-ENTRYPOINT void
-draw_fadeplot (ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GC gc = MI_GC(mi);
- int i, j, temp;
- fadeplotstruct *fp;
-
- if (fadeplots == NULL)
- return;
- fp = &fadeplots[MI_SCREEN(mi)];
- if (fp->stab == NULL)
- return;
-
- MI_IS_DRAWN(mi) = True;
- XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
- XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin);
-
- if (MI_NPIXELS(mi) > 2) {
- XSetForeground(display, gc, MI_PIXEL(mi, fp->pix));
- if (++fp->pix >= MI_NPIXELS(mi))
- fp->pix = 0;
- } else
- XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
-
- temp = 0;
- for (j = 0; j < fp->nbstep; j++) {
- for (i = 0; i < fp->maxpts / fp->nbstep; i++) {
- fp->pts[temp].x =
- fp->stab[(fp->st.x + fp->speed.x * j + i * fp->step.x) % fp->angles] *
- fp->factor.x + fp->width / 2 - fp->min;
- fp->pts[temp].y =
- fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % fp->angles] *
- fp->factor.y + fp->height / 2 - fp->min;
- temp++;
- }
- }
- XDrawPoints(display, window, gc, fp->pts, temp, CoordModeOrigin);
- fp->st.x = (fp->st.x + fp->speed.x) % fp->angles;
- fp->st.y = (fp->st.y + fp->speed.y) % fp->angles;
- fp->temps++;
- if ((fp->temps % (fp->angles / 2)) == 0) {
- fp->temps = fp->temps % fp->angles * 5;
- if ((fp->temps % (fp->angles)) == 0)
- fp->speed.y = (fp->speed.y + 1) % 30 + 1;
- if ((fp->temps % (fp->angles * 2)) == 0)
- fp->speed.x = (fp->speed.x) % 20;
- if ((fp->temps % (fp->angles * 3)) == 0)
- fp->step.y = (fp->step.y + 1) % 2 + 1;
-
- MI_CLEARWINDOW(mi);
- }
-}
-
-ENTRYPOINT void
-reshape_fadeplot(ModeInfo * mi, int width, int height)
-{
- fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
- fp->width = width;
- fp->height = height;
- fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
- fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
- fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_fadeplot (ModeInfo * mi)
-{
-}
-#endif
-
-XSCREENSAVER_MODULE ("FadePlot", fadeplot)
-
-#endif /* MODE_fadeplot */
diff --git a/hacks/fadeplot.man b/hacks/fadeplot.man
deleted file mode 100644
index 7638d63..0000000
--- a/hacks/fadeplot.man
+++ /dev/null
@@ -1,65 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-fadeplot \- draws a waving ribbon following a sinusoidal path.
-.SH SYNOPSIS
-.B fadeplot
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Draws what looks like a waving ribbon following a sinusoidal path.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-Count. 0 - 20. Default: 10.
-.TP 8
-.B \-cycles \fInumber\fP
-How many frames until the shape changes. Default: 1500.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of colors. Default: 64.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Bas van Gaalen and Charles Vidal. Permission to
-use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided
-that the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation. No representations are made about the suitability of
-this software for any purpose. It is provided "as is" without express
-or implied warranty.
-.SH AUTHOR
-Bas van Gaalen and Charles Vidal.
diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c
deleted file mode 100644
index 580851a..0000000
--- a/hacks/fiberlamp.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* fiberlamp --- A Fiber Optic Lamp */
-
-#if 0
-static const char sccsid[] = "@(#)fiberlamp.c 5.00 2000/11/01 xlockmore";
-
-#endif
-
-/*-
- * Copyright (c) 2005 by Tim Auckland <tda10.geo@yahoo.com>
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * "fiberlamp" shows Fiber Optic Lamp. Since there is no closed-form
- * solution to the large-amplitude cantilever equation, the flexible
- * fiber is modeled as a set of descrete nodes.
- *
- * Revision History:
- * 13-Jan-2005: Initial development.
- */
-
-#ifdef STANDALONE
-#define MODE_fiberlamp
-#define DEFAULTS "*delay: 10000 \n" \
- "*count: 500 \n" \
- "*cycles: 10000 \n" \
- "*ncolors: 64 \n" \
- "*fpsTop: true \n" \
-
-# define UNIFORM_COLORS
-# define release_fiberlamp 0
-# define reshape_fiberlamp 0
-# define fiberlamp_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_fiberlamp
-
-ENTRYPOINT ModeSpecOpt fiberlamp_opts =
-{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
-
-#ifdef USE_MODULES
-ModStruct fiberlamp_description =
-{"fiberlamp", "init_fiberlamp", "draw_fiberlamp", (char *) NULL,
- "draw_fiberlamp", "change_fiberlamp", "free_fiberlamp", &fiberlamp_opts,
- 1000, 500, 10000, 0, 64, 1.0, "", "Shows a Fiber Optic Lamp", 0, NULL};
-
-#endif
-
-#define SPREAD (30.0) /* Angular spread at the base */
-#define SCALE (MI_WIDTH(mi)/2) /* Screen size */
-#define NODES (20L) /* Number of nodes in a fiber. Variable with range
- 10 .. 30, if desired. High values have
- stability problems unless you use small DT */
-
-/* Physics parameters. Tune carefully to keep realism and avoid instability*/
-#define DT (0.5) /* Time increment: Low is slow, High is less stable. */
-#define PY (0.12) /* Rigidity: Low droops, High is stiff. */
-#define DAMPING (0.055) /* Damping: Low allows oscillations, High is boring. */
-
-#undef PLAN /* Plan view (for debugging) */
-#undef CHECKCOLORWHEEL /* Plan view with no spread */
-
-#define DRAND(v) (LRAND()/MAXRAND*(v)) /* double random 0 - v */
-
-/* Length of nodes. Uniform except for shorter notes at the tips for
- colour highlights. Sum from 0..NODES-1 should exactly 1.0 */
-#define LEN(A) ((A<NODES-3) ? 1.0/(NODES-2.5) : 0.25/(NODES-2.5))
-
-
-typedef struct {
- double phi, phidash;
- double eta, etadash;
- double x;
- double y;
- double z;
-} nodestruct;
-
-typedef struct {
- nodestruct *node;
- XPoint *draw;
-} fiberstruct;
-
-typedef struct {
- int init;
- double psi;
- double dpsi;
- long count, nfibers;
- double cx;
- double rx, ry; /* Coordinates relative to root */
- fiberstruct *fiber;
- Bool dbufp;
- Pixmap buffer; /* Double Buffer */
- long bright, medium, dim; /* "White" colors */
-} fiberlampstruct;
-
-static fiberlampstruct *fiberlamps = (fiberlampstruct *) NULL;
-
-static void
-change_fiberlamp(ModeInfo * mi)
-{
- fiberlampstruct *fl;
- if (fiberlamps == NULL)
- return;
- fl = &fiberlamps[MI_SCREEN(mi)];
- fl->cx = (DRAND(SCALE/4)-SCALE/8)/SCALE; /* Knock the lamp */
- fl->count = 0; /* Reset counter */
- if (fl->dbufp) {
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
- MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-}
-
-static void
-free_fiber(fiberlampstruct *fl)
-{
- if (fl->fiber) {
- int f;
-
- for (f = 0; f < fl->nfibers; f++) {
- fiberstruct *fs = fl->fiber + f;
-
- if (fs->node)
- free(fs->node);
- if (fs->draw)
- free(fs->draw);
- }
- free(fl->fiber);
- fl->fiber = NULL;
- }
-}
-
-ENTRYPOINT void
-free_fiberlamp(ModeInfo *mi)
-{
- fiberlampstruct *fl = &fiberlamps[MI_SCREEN(mi)];
- if (fl->buffer != None && fl->dbufp) {
- XFreePixmap(MI_DISPLAY(mi), fl->buffer);
- fl->buffer = None;
- }
- free_fiber(fl);
-}
-
-ENTRYPOINT void
-init_fiberlamp(ModeInfo * mi)
-{
- fiberlampstruct *fl;
-
- MI_INIT (mi, fiberlamps);
- fl = &fiberlamps[MI_SCREEN(mi)];
-
- /* Create or Resize double buffer */
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- fl->dbufp = False;
-#else
- fl->dbufp = True;
-#endif
-
- if(fl->buffer != None && fl->buffer != MI_WINDOW(mi) && fl->dbufp)
- XFreePixmap(MI_DISPLAY(mi), fl->buffer);
-
- if(fl->dbufp) {
- fl->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
- MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
- if (fl->buffer == None) {
- free_fiberlamp(mi);
- return;
- }
- } else {
- fl->buffer = MI_WINDOW(mi);
- }
-
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
- MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if(fl->init) /* Nothing else to do (probably a resize) */
- return;
-
- fl->init = True;
- fl->nfibers = MI_COUNT(mi);
- /* Allocate fibers */
- if((fl->fiber =
- (fiberstruct*) calloc(fl->nfibers, sizeof (fiberstruct))) == NULL) {
- free_fiberlamp(mi);
- return;
- } else {
- int f;
- for(f = 0; f < fl->nfibers; f++) {
- fiberstruct *fs = fl->fiber + f;
- if((fs->node =
- (nodestruct*) calloc(NODES, sizeof (nodestruct))) == NULL
- ||(fs->draw =
- (XPoint*) calloc(NODES, sizeof (XPoint))) == NULL) {
- free_fiberlamp(mi);
- return;
- }
- }
- }
-
- {
- int f, i;
- for(f = 0; f < fl->nfibers; f++) {
- double phi = M_PI/180 * DRAND(SPREAD);
- double eta = DRAND(2*M_PI) - M_PI;
- for(i = 0; i < NODES; i++) {
- nodestruct *n = &fl->fiber[f].node[i];
- n->phi = phi;
- n->phidash = 0;
- n->eta = eta;
- n->etadash = 0;
- }
- fl->fiber[f].node[0].etadash = 0.002/DT;
- fl->fiber[f].node[0].y = 0;
- fl->fiber[f].node[0].z = 0;
- }
-
- }
-
- /* Set up rotation */
- fl->psi = DRAND(2*M_PI);
- fl->dpsi = 0.01;
-
- /* no "NoExpose" events from XCopyArea wanted */
- XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
-
- /* Make sure we're using 'thin' lines */
- XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
- JoinMiter);
-#ifdef CHECKCOLORWHEEL
- /* Only interested in tips, leave the rest black */
- fl->bright = fl->medium = fl->dim = MI_BLACK_PIXEL(mi);
-#else
- if(MI_NPIXELS(mi) > 2) {
- /* Set up colours for the fiber bodies. Tips handled seperately */
- XColor c, t;
- if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#E0E0C0", &c, &t)){
- fl->bright = c.pixel;
- } else {
- fl->bright = MI_WHITE_PIXEL(mi);
- }
- if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#808070", &c, &t)){
- fl->medium = c.pixel;
- } else {
- fl->medium = MI_WHITE_PIXEL(mi);
- }
- if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#404020", &c, &t)){
- fl->dim = c.pixel;
- } else {
- fl->dim = MI_BLACK_PIXEL(mi);
- }
- } else {
- fl->bright = MI_WHITE_PIXEL(mi);
- fl->medium = MI_WHITE_PIXEL(mi);
- fl->dim = MI_BLACK_PIXEL(mi);
- }
-#endif
-
- /* Clear the background. */
- MI_CLEARWINDOW(mi);
- change_fiberlamp(mi);
-}
-
-/* sort fibers so they get drawn back-to-front, one bubble pass is
- enough as the order only changes slowly */
-static void
-sort_fibers(fiberlampstruct *fl)
-{
- int i;
-
- for(i = 1; i < fl->nfibers; i++) {
- if (fl->fiber[i - 1].node[NODES - 1].z > fl->fiber[i].node[NODES - 1].z) {
- fiberstruct tmp = fl->fiber[i - 1];
- fl->fiber[i - 1] = fl->fiber[i];
- fl->fiber[i] = tmp;
- }
- }
-}
-
-ENTRYPOINT void
-draw_fiberlamp (ModeInfo * mi)
-{
- fiberlampstruct *fl;
- int f, i;
- int x, y;
- int ww, hh;
- Window unused;
- short cx, cy;
-
- ww = MI_WIDTH(mi);
- hh = MI_HEIGHT(mi);
-
- cx = MI_WIDTH(mi)/2;
-#if defined PLAN || defined CHECKCOLORWHEEL
- cy = MI_HEIGHT(mi)/2;
-#else
- cy = MI_HEIGHT(mi);
-#endif
-
- if (ww > hh * 5 || /* window has weird aspect */
- hh > ww * 5)
- {
- if (ww > hh)
- {
- hh = ww;
- cy = hh / 4;
- }
- else
- {
- ww = hh;
- cx = 0;
- cy = hh*3/4;
- }
- }
-
- if (fiberlamps == NULL)
- return;
- fl = &fiberlamps[MI_SCREEN(mi)];
-
- fl->psi += fl->dpsi; /* turn colorwheel */
-
- XTranslateCoordinates(MI_DISPLAY(mi), MI_WINDOW(mi),
- RootWindow(MI_DISPLAY(mi),0/*#### MI_SCREEN(mi)*/),
- cx, cy, &x, &y, &unused);
- sort_fibers(fl);
-
- for(f = 0; f < fl->nfibers; f++) {
- fiberstruct *fs = fl->fiber + f;
-
- fs->node[0].eta += DT*fs->node[0].etadash;
- fs->node[0].x = fl->cx; /* Handle center movement */
- /* Handle window move. NOTE, only x is deflected, since y doesn't
- directly affect the physics */
- fs->node[NODES-2].x *= 0.1*(fl->ry - y);
- fs->node[NODES-2].x += 0.05*(fl->rx - x);
-
- /* 2nd order diff equation */
- for(i = 1; i < NODES; i++) {
- nodestruct *n = fs->node+i;
- nodestruct *p = fs->node+i-1;
- double pload = 0;
- double eload = 0;
- double pstress = (n->phi - p->phi)*PY;
- double estress = (n->eta - p->eta)*PY;
- double dxi = n->x - p->x;
- double dzi = n->z - p->z;
- double li = sqrt(dxi*dxi + dzi*dzi)/LEN(i);
- double drag = DAMPING*LEN(i)*LEN(i)*NODES*NODES;
-
- if(li > 0) {
- int j;
- for(j = i+1; j < NODES; j++) {
- nodestruct *nn = fs->node+j;
- double dxj = nn->x - n->x;
- double dzj = nn->z - n->z;
-
- pload += LEN(j)*(dxi*dxj + dzi*dzj)/li; /* Radial load */
- eload += LEN(j)*(dxi*dzj - dzi*dxj)/li; /* Transverse load */
- /* Not a perfect simulation: in reality the transverse load
- is only indirectly coupled to the eta deflection, but of
- all the approaches I've tried this produces the most
- stable model and looks the most realistic. */
- }
- }
-
-#ifndef CHECKCOLORWHEEL
- n->phidash += DT*(pload - pstress - drag*n->phidash)/LEN(i);
- n->phi += DT*n->phidash;
-#endif
-
- n->etadash += DT*(eload - estress - drag*n->etadash)/LEN(i);
- n->eta += DT*n->etadash;
-
- {
- double sp = sin(p->phi);
- double cp = cos(p->phi);
- double se = sin(p->eta);
- double ce = cos(p->eta);
-
- n->x = p->x + LEN(i-1) * ce * sp;
- n->y = p->y - LEN(i-1) * cp;
- n->z = p->z + LEN(i-1) * se * sp;
- }
-
- fs->draw[i-1].x = cx + ww/2*n->x;
-#if defined PLAN || defined CHECKCOLORWHEEL /* Plan */
- fs->draw[i-1].y = cy + ww/2*n->z;
-#else /* Elevation */
- fs->draw[i-1].y = cy + ww/2*n->y;
-#endif
- }
- MI_IS_DRAWN(mi) = True;
-
- /* Erase: this may only be erasing an off-screen buffer, but on a
- slow system it may still be faster than XFillRectangle() */
- /* That's unpossible. -jwz */
- }
-
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
- 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- for(f = 0; f < fl->nfibers; f++) {
- fiberstruct *fs = fl->fiber + f;
-
- {
- double x = fs->node[1].x - fl->cx + 0.025;
- double y = fs->node[1].z + 0.02;
- double angle = atan2(y, x) + fl->psi;
- long tipcolor = (int)(MI_NPIXELS(mi)*angle/(2*M_PI)) % MI_NPIXELS(mi);
- long fibercolor;
- long tiplen;
-
- if (tipcolor < 0) tipcolor += MI_NPIXELS(mi);
- tipcolor = MI_PIXEL(mi, tipcolor);
-
- if(fs->node[1].z < 0.0) { /* Back */
- tiplen = 2;
- fibercolor = fl->dim;
- }else if(fs->node[NODES-1].z < 0.7) { /* Middle */
- tiplen = 3;
- fibercolor = fl->medium;
- } else { /* Front */
- tiplen = 3;
- fibercolor = fl->bright;
- }
-
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), fibercolor);
- XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
- fs->draw, NODES-tiplen, CoordModeOrigin);
-
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), tipcolor);
- XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
- fs->draw+NODES-1-tiplen, tiplen, CoordModeOrigin);
- }
- }
-
- /* Update the screen from the double-buffer */
- if (fl->dbufp)
- XCopyArea(MI_DISPLAY(mi), fl->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
- MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
-
- fl->rx = x;
- fl->ry = y;
-
- if(fl->count++ > MI_CYCLES(mi)) {
- change_fiberlamp(mi);
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_fiberlamp(ModeInfo * mi)
-{
- MI_CLEARWINDOW(mi);
-}
-#endif
-
-XSCREENSAVER_MODULE ("Fiberlamp", fiberlamp)
-
-#endif /* MODE_fiberlamp */
diff --git a/hacks/fiberlamp.man b/hacks/fiberlamp.man
deleted file mode 100644
index cc6e84d..0000000
--- a/hacks/fiberlamp.man
+++ /dev/null
@@ -1,65 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-fiberlamp \- Fiber Optic Lamp
-.SH SYNOPSIS
-.B fiberlamp
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-ncolors \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Displays a Fiber Optic Lamp.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-Number of Fibers. 10 - 500. Default: 500.
-.TP 8
-.B \-cycles \fInumber\fP
-Number of cycles before the lamp is knocked sideways. 100 - 10000.
-Default: 10000.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 64.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2005 by Tim Auckland. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Tim Auckland.
diff --git a/hacks/filmleader.c b/hacks/filmleader.c
deleted file mode 100644
index 454b91d..0000000
--- a/hacks/filmleader.c
+++ /dev/null
@@ -1,561 +0,0 @@
-/* filmleader, Copyright (c) 2018-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Simulate an SMPTE Universal Film Leader playing on an analog television.
- */
-
-#include "screenhack.h"
-#include "analogtv.h"
-
-#include <time.h>
-
-struct state {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- int w, h;
- unsigned long bg, text_color, ring_color, trace_color;
- XftColor xft_text_color_1, xft_text_color_2;
-
- XftFont *font, *font2, *font3;
- XftDraw *xftdraw;
- Pixmap pix;
- GC gc;
- double start, last_time;
- double value;
- int stop;
- double noise;
- analogtv *tv;
- analogtv_input *inp;
- analogtv_reception rec;
- Bool button_down_p;
-};
-
-
-static void *
-filmleader_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- char *s;
-
- st->dpy = dpy;
- st->window = window;
- st->tv = analogtv_allocate (st->dpy, st->window);
- analogtv_set_defaults (st->tv, "");
- st->tv->need_clear = 1;
- st->inp = analogtv_input_allocate();
- analogtv_setup_sync (st->inp, 1, 0);
- st->rec.input = st->inp;
- st->rec.level = 2.0;
- st->tv->use_color = 1;
- st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
- st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
- st->tv->powerup = 0;
-
- st->rec.multipath = 0.0;
- st->tv->color_control += frand(0.3);
- st->noise = get_float_resource (st->dpy, "noise", "Float");
- st->value = 18; /* Leave time for powerup */
- st->stop = 2 + (random() % 5);
- XGetWindowAttributes (dpy, window, &st->xgwa);
-
- /* Let's render it into a 16:9 pixmap, since that's what most screens are
- these days. That means the circle will be squashed on 4:3 screens. */
- {
- double r = 16/9.0;
-
-# ifdef HAVE_MOBILE
- /* analogtv.c always fills whole screen on mobile, so use screen aspect. */
- r = st->xgwa.width / (double) st->xgwa.height;
- if (r < 1) r = 1/r;
-# endif
-
- st->w = 712;
- st->h = st->w / r;
- }
-
- if (st->xgwa.width < st->xgwa.height)
- {
- int swap = st->w;
- st->w = st->h;
- st->h = swap;
- }
-
- st->pix = XCreatePixmap (dpy, window,
- st->w > st->h ? st->w : st->h,
- st->w > st->h ? st->w : st->h,
- st->xgwa.depth);
- st->gc = XCreateGC (dpy, st->pix, 0, &gcv);
-
- st->xftdraw = XftDrawCreate (dpy, st->pix, st->xgwa.visual,
- st->xgwa.colormap);
- s = get_string_resource (dpy, "numberFont", "Font");
- st->font = load_xft_font_retry (dpy, screen_number (st->xgwa.screen), s);
- if (s) free (s);
- s = get_string_resource (dpy, "numberFont2", "Font");
- st->font2 = load_xft_font_retry (dpy, screen_number (st->xgwa.screen), s);
- if (s) free (s);
- s = get_string_resource (dpy, "numberFont3", "Font");
- st->font3 = load_xft_font_retry (dpy, screen_number (st->xgwa.screen), s);
- if (s) free (s);
-
- st->bg = get_pixel_resource (dpy, st->xgwa.colormap,
- "textBackground", "Background");
- st->text_color = get_pixel_resource (dpy, st->xgwa.colormap,
- "textColor", "Foreground");
- st->ring_color = get_pixel_resource (dpy, st->xgwa.colormap,
- "ringColor", "Foreground");
- st->trace_color = get_pixel_resource (dpy, st->xgwa.colormap,
- "traceColor", "Foreground");
-
- s = get_string_resource (dpy, "textColor", "Foreground");
- if (!s) s = strdup ("white");
- XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap, s,
- &st->xft_text_color_1);
- free (s);
-
- s = get_string_resource (dpy, "textBackground", "Background");
- if (!s) s = strdup ("black");
- XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap, s,
- &st->xft_text_color_2);
- if (s) free (s);
-
- return st;
-}
-
-
-static double
-double_time (void)
-{
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- return (now.tv_sec + ((double) now.tv_usec * 0.000001));
-}
-
-
-static unsigned long
-filmleader_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- const analogtv_reception *rec = &st->rec;
- double then = double_time(), now, timedelta;
- XImage *img;
- int i, x, y, w2, h2;
- XGlyphInfo extents;
- int lbearing, rbearing, ascent, descent;
- char s[20];
- double r = 1 - (st->value - (int) st->value);
- int ivalue = st->value;
- XftFont *xftfont;
- XftColor *xftcolor;
-
- const struct { double t; int k, f; const char * const s[4]; } blurbs[] = {
- { 9.1, 3, 1, { "PICTURE", " START", 0, 0 }},
- { 10.0, 2, 1, { " 16", "SOUND", "START", 0 }},
- { 10.5, 2, 1, { " 32", "SOUND", "START", 0 }},
- { 11.6, 2, 0, { "PICTURE", "COMPANY", "SERIES", 0 }},
- { 11.7, 2, 0, { "XSCRNSAVER", 0, 0, 0 }},
- { 11.9, 2, 0, { "REEL No.", "PROD No.", "PLAY DATE", 0 }},
- { 12.2, 0, 0, { " SMPTE ", "UNIVERSAL", " LEADER", 0 }},
- { 12.3, 0, 1, { "X ", "X", "X", "X" }},
- { 12.4, 0, 0, { " SMPTE ", "UNIVERSAL", " LEADER", 0 }},
- { 12.5, 3, 1, { "PICTURE", 0, 0, 0 }},
- { 12.7, 3, 1, { "HEAD", 0, 0, 0 }},
- { 12.8, 2, 1, { "OOOO", 0, "ASPECT", "TYPE OF" }},
- { 12.9, 2, 0, { "SOUND", 0, "RATIO", 0 }},
- { 13.2, 1, 1, { " ", "PICTURE", 0, 0 }},
- { 13.3, 1, 0, { "REEL No. ", "COLOR", 0, 0 }},
- { 13.4, 1, 0, { "LENGTH ", 0, 0, "ROLL" }},
- { 13.5, 1, 0, { "SUBJECT", 0, 0, 0 }},
- { 13.9, 1, 1, { " \342\206\221", "SPLICE", " HERE", 0 }},
- };
-
- for (i = 0; i < countof(blurbs); i++)
- {
- if (st->value >= blurbs[i].t && st->value <= blurbs[i].t + 1/15.0)
- {
- int line_height;
- int j;
- xftfont = (blurbs[i].f == 1 ? st->font2 :
- blurbs[i].f == 2 ? st->font : st->font3);
-
- XSetForeground (dpy, st->gc,
- blurbs[i].k == 3 ? st->bg : st->text_color);
- XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
- XSetForeground (dpy, st->gc,
- blurbs[i].k == 3 ? st->text_color : st->bg);
- xftcolor = (blurbs[i].k == 3 ?
- &st->xft_text_color_1 : &st->xft_text_color_2);
-
- /* The height of a string of spaces is 0... */
- XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) "My", 2, &extents);
- line_height = extents.height;
-
- XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *)
- blurbs[i].s[0], strlen(blurbs[i].s[0]),
- &extents);
- /* lbearing = -extents.x; */
- rbearing = extents.width - extents.x;
- ascent = extents.y;
- /* descent = extents.height - extents.y; */
-
- x = (st->w - rbearing) / 2;
- y = st->h * 0.1 + ascent;
-
- for (j = 0; j < countof(blurbs[i].s); j++)
- {
- if (blurbs[i].s[j])
- XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
- (FcChar8 *) blurbs[i].s[j],
- strlen(blurbs[i].s[j]));
-
- y += line_height * 1.5;
-
- if (blurbs[i].s[j])
- {
- XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *)
- blurbs[i].s[0], strlen(blurbs[i].s[j]),
- &extents);
- /* lbearing = -extents.x; */
- /* rbearing = extents.width - extents.x; */
- /* ascent = extents.y; */
- /* descent = extents.height - extents.y; */
- }
- }
-
- if (blurbs[i].k == 2) /* Rotate clockwise and flip */
- {
- int wh = st->w < st->h ? st->w : st->h;
- XImage *img1 = XGetImage (dpy, st->pix,
- (st->w - wh) / 2,
- (st->h - wh) / 2,
- wh, wh, ~0L, ZPixmap);
- XImage *img2 = XCreateImage (dpy, st->xgwa.visual,
- st->xgwa.depth, ZPixmap, 0, 0,
- wh, wh, 32, 0);
- img2->data = malloc (img2->bytes_per_line * img2->height);
- for (y = 0; y < wh; y++)
- for (x = 0; x < wh; x++)
- XPutPixel (img2, y, x, XGetPixel (img1, x, y));
- XSetForeground (dpy, st->gc,
- blurbs[i].k == 3 ? st->bg : st->text_color);
- XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
- XPutImage (dpy, st->pix, st->gc, img2,
- 0, 0,
- (st->w - wh) / 2,
- (st->h - wh) / 2,
- wh, wh);
- XDestroyImage (img1);
- XDestroyImage (img2);
- }
- else if (blurbs[i].k == 1) /* Flip vertically */
- {
- XImage *img1 = XGetImage (dpy, st->pix, 0, 0,
- st->w, st->h, ~0L, ZPixmap);
- XImage *img2 = XCreateImage (dpy, st->xgwa.visual,
- st->xgwa.depth, ZPixmap, 0, 0,
- st->w, st->h, 32, 0);
- img2->data = malloc (img2->bytes_per_line * img2->height);
- for (y = 0; y < img2->height; y++)
- for (x = 0; x < img2->width; x++)
- XPutPixel (img2, x, img2->height-y-1,
- XGetPixel (img1, x, y));
- XPutImage (dpy, st->pix, st->gc, img2, 0, 0, 0, 0, st->w, st->h);
- XDestroyImage (img1);
- XDestroyImage (img2);
- }
-
- goto DONE;
- }
- }
-
- if (st->value < 2.0 || st->value >= 9.0) /* Black screen */
- {
- XSetForeground (dpy, st->gc, st->text_color);
- XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
- goto DONE;
- }
-
- XSetForeground (dpy, st->gc, st->bg);
- XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
-
- if (r > 1/30.0) /* Sweep line and background */
- {
- x = st->w/2 + st->w * cos (M_PI * 2 * r - M_PI/2);
- y = st->h/2 + st->h * sin (M_PI * 2 * r - M_PI/2);
-
- XSetForeground (dpy, st->gc, st->trace_color);
- XFillArc (dpy, st->pix, st->gc,
- -st->w, -st->h, st->w*3, st->h*3,
- 90*64,
- 90*64 - ((r + 0.25) * 360*64));
-
- XSetForeground (dpy, st->gc, st->text_color);
- XSetLineAttributes (dpy, st->gc, 1, LineSolid, CapRound, JoinRound);
- XDrawLine (dpy, st->pix, st->gc, st->w/2, st->h/2, x, y);
-
- XSetForeground (dpy, st->gc, st->text_color);
- XSetLineAttributes (dpy, st->gc, 2, LineSolid, CapRound, JoinRound);
- XDrawLine (dpy, st->pix, st->gc, st->w/2, 0, st->w/2, st->h);
- XDrawLine (dpy, st->pix, st->gc, 0, st->h/2, st->w, st->h/2);
- }
-
- /* Big number */
-
- s[0] = (char) (ivalue + '0');
- xftfont = st->font;
- xftcolor = &st->xft_text_color_1;
- XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, 1, &extents);
- lbearing = -extents.x;
- rbearing = extents.width - extents.x;
- ascent = extents.y;
- descent = extents.height - extents.y;
-
- x = (st->w - (rbearing + lbearing)) / 2;
- y = (st->h + (ascent - descent)) / 2;
- XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y, (FcChar8 *) s, 1);
-
- /* Annotations on 7 and 4 */
-
- if ((st->value >= 7.75 && st->value <= 7.85) ||
- (st->value >= 4.00 && st->value <= 4.25))
- {
- XSetForeground (dpy, st->gc, st->ring_color);
- xftcolor = &st->xft_text_color_2;
- xftfont = st->font2;
-
- s[0] = (ivalue == 4 ? 'C' : 'M');
- s[1] = 0;
-
- XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, strlen(s), &extents);
- lbearing = -extents.x;
- rbearing = extents.width - extents.x;
- ascent = extents.y;
- /* descent = extents.height - extents.y; */
-
- x = st->w * 0.1;
- y = st->h * 0.1 + ascent;
- XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
- (FcChar8 *) s, strlen(s));
- x = st->w * 0.9 - (rbearing + lbearing);
- XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
- (FcChar8 *) s, strlen(s));
-
- s[0] = (ivalue == 4 ? 'F' : '3');
- s[1] = (ivalue == 4 ? 0 : '5');
- s[2] = 0;
-
- XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, strlen(s), &extents);
- lbearing = -extents.x;
- rbearing = extents.width - extents.x;
- /* ascent = extents.y; */
- /* descent = extents.height - extents.y; */
-
- x = st->w * 0.1;
- y = st->h * 0.95;
- XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
- (FcChar8 *) s, strlen(s));
- x = st->w * 0.9 - (rbearing + lbearing);
- XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
- (FcChar8 *) s, strlen(s));
- }
-
- if (r > 1/30.0) /* Two rings around number */
- {
- double r2 = st->w / (double) st->h;
- double ss = 1;
-
- if (st->xgwa.width < st->xgwa.height)
- ss = 0.5;
-
- XSetForeground (dpy, st->gc, st->ring_color);
- XSetLineAttributes (dpy, st->gc, st->w * 0.025,
- LineSolid, CapRound, JoinRound);
-
- w2 = st->w * 0.8 * ss / r2;
- h2 = st->h * 0.8 * ss;
- x = (st->w - w2) / 2;
- y = (st->h - h2) / 2;
- XDrawArc (dpy, st->pix, st->gc, x, y, w2, h2, 0, 360*64);
-
- w2 = w2 * 0.8;
- h2 = h2 * 0.8;
- x = (st->w - w2) / 2;
- y = (st->h - h2) / 2;
- XDrawArc (dpy, st->pix, st->gc, x, y, w2, h2, 0, 360*64);
- }
-
- DONE:
-
- img = XGetImage (dpy, st->pix, 0, 0, st->w, st->h, ~0L, ZPixmap);
-
- analogtv_load_ximage (st->tv, st->rec.input, img, 0, 0, 0, 0, 0);
- analogtv_reception_update (&st->rec);
- analogtv_draw (st->tv, st->noise, &rec, 1);
-
- XDestroyImage (img);
-
- now = double_time();
- timedelta = (1 / 29.97) - (now - then);
-
- if (! st->button_down_p)
- {
- if (st->last_time == 0)
- st->start = then;
- else
- st->value -= then - st->last_time;
-
- if (st->value <= 0 ||
- (r > 0.9 && st->value <= st->stop))
- {
- st->value = (random() % 20) ? 8.9 : 15;
- st->stop = ((random() % 50) ? 2 : 1) + (random() % 5);
-
- if (st->value > 9) /* Spin the knobs again */
- {
- st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
- st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
- st->tv->color_control += frand(0.3) - 0.15;
- }
- }
- }
-
- st->tv->powerup = then - st->start;
- st->last_time = then;
-
- return timedelta > 0 ? timedelta * 1000000 : 0;
-}
-
-
-static void
-filmleader_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- analogtv_reconfigure (st->tv);
- XGetWindowAttributes (dpy, window, &st->xgwa);
-
- if ((st->w > st->h) != (st->xgwa.width > st->xgwa.height))
- {
- int swap = st->w;
- st->w = st->h;
- st->h = swap;
- }
-}
-
-
-static Bool
-filmleader_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (event->xany.type == ButtonPress)
- {
- st->button_down_p = True;
- return True;
- }
- else if (event->xany.type == ButtonRelease)
- {
- st->button_down_p = False;
- return True;
- }
- else if (screenhack_event_helper (dpy, window, event))
- {
- st->value = 15;
- st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
- st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
- st->tv->color_control += frand(0.3) - 0.15;
- return True;
- }
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c >= '2' && c <= '8')
- {
- st->value = (c - '0') + (st->value - (int) st->value);
- return True;
- }
- }
-
- return False;
-}
-
-
-static void
-filmleader_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- analogtv_release (st->tv);
- free (st->inp);
- XftDrawDestroy (st->xftdraw);
- XftColorFree(dpy, st->xgwa.visual, st->xgwa.colormap, &st->xft_text_color_1);
- XftColorFree(dpy, st->xgwa.visual, st->xgwa.colormap, &st->xft_text_color_2);
- XFreePixmap (dpy, st->pix);
- XFreeGC (dpy, st->gc);
- free (st);
-}
-
-
-static const char *filmleader_defaults [] = {
-
- ".background: #000000",
-
-# ifdef HAVE_MOBILE
-
- "*textBackground: #444488", /* Need much higher contrast for some reason */
- "*textColor: #000033",
- "*ringColor: #DDDDFF",
- "*traceColor: #222244",
-
-# else /* X11 or Cocoa */
-
- "*textBackground: #9999DD",
- "*textColor: #000015",
- "*ringColor: #DDDDFF",
- "*traceColor: #555577",
-
-# endif
-
- /* Note: these font sizes aren't relative to screen pixels, but to the
- 712 x Y or X x 712 canvas that we draw in, which is then scaled to
- the size of the screen by analogtv. */
-
-# if defined(HAVE_IPHONE) || defined(HAVE_COCOA)
- "*numberFont: Helvetica Bold 120",
- "*numberFont2: Helvetica 36",
- "*numberFont3: Helvetica 28",
-# else /* X11 or Android */
- "*numberFont: Helvetica Bold 170",
- "*numberFont2: Helvetica 50",
- "*numberFont3: Helvetica 36",
-# endif
-
- "*noise: 0.04",
- ANALOGTV_DEFAULTS
- ".lowrez: false", /* Required on macOS, or font size fucks up */
- "*geometry: 1280x720",
- 0
-};
-
-static XrmOptionDescRec filmleader_options [] = {
- { "-noise", ".noise", XrmoptionSepArg, 0 },
- ANALOGTV_OPTIONS
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("FilmLeader", filmleader)
diff --git a/hacks/filmleader.man b/hacks/filmleader.man
deleted file mode 100644
index 9724bb3..0000000
--- a/hacks/filmleader.man
+++ /dev/null
@@ -1,69 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-filmleader \- screen saver.
-.SH SYNOPSIS
-.B filmleader
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-tv-color \fInumber\fP]
-[\-tv-tint \fInumber\fP]
-[\-noise \fInumber\fP]
-[\-tv-brightness \fInumber\fP]
-[\-tv-contrast \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Displays a looping countdown based on the SMPTE Universal Film leader on a
-simulation of an old analog television.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-tv-color \fInumber\fP
-Color Knob. 0 - 1000. Default: 70.
-.TP 8
-.B \-tv-tint \fInumber\fP
-Tint Knob. 0 - 100. Default: 5.
-.TP 8
-.B \-noise \fInumber\fP
-Noise. 0.0 - 0.2. Default: 0.04.
-.TP 8
-.B \-tv-brightness \fInumber\fP
-Brightness Knob. 0 - 200. Default: 150.
-.TP 8
-.B \-tv-contrast \fInumber\fP
-Contrast Knob. 0 - 1500. Default: 1000.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/fireworkx.c b/hacks/fireworkx.c
deleted file mode 100644
index 12d9864..0000000
--- a/hacks/fireworkx.c
+++ /dev/null
@@ -1,879 +0,0 @@
-/*
- Fireworkx 2.2 - Pyrotechnic explosions simulation,
- an eyecandy, live animating colorful fireworks super-blasts..!
- Copyright (GPL) 1999-2013 Rony B Chandran <ronybc@gmail.com>
-
- From Kerala, INDIA
- Website: http://www.ronybc.com
-
- Permission to use, copy, modify, distribute, and sell this software and its
- documentation for any purpose is hereby granted without fee, provided that
- the above copyright notice appear in all copies and that both that
- copyright notice and this permission notice appear in supporting
- documentation. No representations are made about the suitability of this
- software for any purpose. It is provided "as is" without express or
- implied warranty.
-
- 2004-OCT: ronybc: Landed on Xscreensaver..!
- 2012-DEC: ronybc: Almost rewrite of the last version (>4 years old)
- with SSE2 optimization, colored light flashes,
- HSV color and many visual and speed improvements.
-
- Additional coding:
- ---------------------------------------------------------------------------------
- Support for different display color modes: put_image()
- Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
-
- Fixed array access problems by beating on it with a large hammer.
- Nicholas Miell <nmiell@gmail.com>
-
- Help 'free'ing up of memory with needed 'XSync's.
- Renuka S <renuka@ronybc.com>
- Rugmini R Chandran <rugmini@ronybc.com>
-\
- */
-
-#include "screenhack.h"
-
-#ifdef __SSE2__
-# include <emmintrin.h>
-#endif
-
-#define FWXVERSION "2.2"
-
-#define WIDTH 1024 /* 888 */
-#define HEIGHT 632 /* 548 */
-#define SHELLCOUNT 4 /* FIXED NUMBER; for SSE optimization */
-#define PIXCOUNT 500 /* 500 */
-#define SHELL_LIFE_DEFAULT 32 /* 32 */
-#define SHELL_LIFE_RATIO 6 /* 6 */
-#define POWDER 5.0 /* 5.0 */
-#define FTWEAK 12 /* 12 */
-#define FLASH_ZOOM 0.8 /* 1.0 */
-#define G_ACCELERATION 0.001 /* GRAVITY */
-
-typedef struct
-{
- unsigned int burn;
- float x, y;
- float xv, yv;
-} firepix;
-
-typedef struct
-{
- unsigned int cx, cy;
- unsigned int seq_number, life;
- unsigned int bicolor, flies, hshift, vshift;
- unsigned int mortar_fired, explode_y;
- float air_drag, vshift_phase;
- float flash_r, flash_g, flash_b;
- unsigned int h;
- double s, v;
- unsigned char r, g, b;
- firepix *fpix;
-} fireshell;
-
-struct state
-{
- unsigned int fps_on;
- unsigned int flash_on;
- unsigned int shoot;
- unsigned int verbose;
- unsigned int width;
- unsigned int height;
- unsigned int fullscreen;
- unsigned int max_shell_life;
- unsigned int delay;
- float flash_fade;
- float *light_map;
- unsigned char *palaka1;
- unsigned char *palaka2;
- void *mem1;
- void *mem2;
- fireshell *fireshell_array;
-
- Display *dpy;
- Window window;
- XImage *xim;
- GC gc;
- XColor *colors;
- int depth;
- int bigendian;
- int ncolors;
- Bool button_down_p;
- int deferred;
-
-};
-
-/*
- will return zero.. divide with care.
-*/
-static unsigned int rnd(unsigned int x)
-{
- return(random() % x);
-}
-
-static void fs_roll_rgb(fireshell *fs)
-{
- unsigned short r, g, b;
- hsv_to_rgb (fs->h, fs->s, fs->v, &r, &g, &b);
- fs->r = (unsigned char) (r >> 8);
- fs->g = (unsigned char) (g >> 8);
- fs->b = (unsigned char) (b >> 8);
-}
-
-static void mix_colors(fireshell *fs)
-{
- float flash;
- fs->h = rnd(360);
- fs->s = frand(0.4) + 0.6;
- fs->v = 1.0;
- fs_roll_rgb(fs);
-
- flash = rnd(444) + 111; /* Mega Jouls ! */
- fs->flash_r = fs->r * flash;
- fs->flash_g = fs->g * flash;
- fs->flash_b = fs->b * flash;
-}
-
-static void render_light_map(struct state *st, fireshell *fs)
-{
- signed int x, y, v = 0;
- for (y = 0, v = fs->seq_number; y < st->height; y += 2)
- {
- for (x = 0; x < st->width; x += 2, v += SHELLCOUNT)
- {
- double f;
- f = sqrt((fs->cx - x) * (fs->cx - x) + (fs->cy - y) * (fs->cy - y)) + 4.0;
- f = FLASH_ZOOM / f;
- f += pow(f,0.1) * frand(0.0001); /* dither */
- st->light_map[v] = f;
- }
- }
-}
-
-static void recycle(struct state *st, fireshell *fs, unsigned int x, unsigned int y)
-{
- unsigned int n, pixlife;
- firepix *fp = fs->fpix;
- fs->mortar_fired = st->shoot;
- fs->explode_y = y;
- fs->cx = x;
- fs->cy = st->shoot ? st->height : y ;
- fs->life = rnd(st->max_shell_life) + (st->max_shell_life/SHELL_LIFE_RATIO);
- fs->life += !rnd(25) ? st->max_shell_life * 5 : 0;
- fs->air_drag = 1.0 - (float)(rnd(200)) / (10000.0 + fs->life);
- fs->bicolor = !rnd(5) ? 120 : 0;
- fs->flies = !rnd(10) ? 1 : 0; /* flies' motion */
- fs->hshift = !rnd(5) ? 1 : 0; /* hue shifting */
- fs->vshift = !rnd(10) ? 1 : 0; /* value shifting */
- fs->vshift_phase = M_PI/2.0;
- pixlife = rnd(fs->life) + fs->life / 10 + 1; /* ! */
- for (n = 0; n < PIXCOUNT; n++)
- {
- fp->burn = rnd(pixlife) + 32;
- fp->xv = frand(2.0) * POWDER - POWDER;
- fp->yv = sqrt(POWDER * POWDER - fp->xv * fp->xv) * (frand(2.0) - 1.0);
- fp->x = x;
- fp->y = y;
- fp++;
- }
- mix_colors(fs);
- render_light_map(st, fs);
-}
-
-static void recycle_oldest(struct state *st, unsigned int x, unsigned int y)
-{
- unsigned int n;
- fireshell *fs, *oldest;
- fs = oldest = st->fireshell_array;
- for (n = 0; n < SHELLCOUNT; n++)
- {
- if(fs[n].life < oldest->life) oldest = &fs[n];
- }
- recycle(st, oldest, x, y);
-}
-
-static void rotate_hue(fireshell *fs, int dh)
-{
- fs->h = fs->h + dh;
- fs->s = fs->s - 0.001;
- fs_roll_rgb(fs);
-}
-
-static void wave_value(fireshell *fs)
-{
- fs->vshift_phase = fs->vshift_phase + 0.008;
- fs->v = fabs(sin(fs->vshift_phase));
- fs_roll_rgb(fs);
-}
-
-static int explode(struct state *st, fireshell *fs)
-{
- float air_drag;
- unsigned int n;
- unsigned int h = st->height;
- unsigned int w = st->width;
- unsigned char r, g, b;
- unsigned char *prgba;
- unsigned char *palaka = st->palaka1;
- firepix *fp = fs->fpix;
- if (fs->mortar_fired)
- {
- if (--fs->cy == fs->explode_y)
- {
- fs->mortar_fired = 0;
- mix_colors(fs);
- render_light_map(st, fs);
- }
- else
- {
- fs->flash_r =
- fs->flash_g =
- fs->flash_b = 50 + (fs->cy - fs->explode_y) * 10;
- prgba = palaka + (fs->cy * w + fs->cx + rnd(5) - 2) * 4;
- prgba[0] = (rnd(32) + 128);
- prgba[1] = (rnd(32) + 128);
- prgba[2] = (rnd(32) + 128);
- return(1);
- }
- }
- if ((fs->bicolor + 1) % 50 == 0) rotate_hue(fs, 180);
- if (fs->bicolor) --fs->bicolor;
- if (fs->hshift) rotate_hue(fs, rnd(8));
- if (fs->vshift) wave_value(fs);
- if (fs->flash_r > 1.0) fs->flash_r *= st->flash_fade;
- if (fs->flash_g > 1.0) fs->flash_g *= st->flash_fade;
- if (fs->flash_b > 1.0) fs->flash_b *= st->flash_fade;
- air_drag = fs->air_drag;
- r = fs->r;
- g = fs->g;
- b = fs->b;
- for (n = 0; n < PIXCOUNT; n++, fp++)
- {
- if (!fp->burn) continue;
- --fp->burn;
- if (fs->flies)
- {
- fp->x += fp->xv = fp->xv * air_drag + frand(0.1) - 0.05;
- fp->y += fp->yv = fp->yv * air_drag + frand(0.1) - 0.05 + G_ACCELERATION;
- }
- else
- {
- fp->x += fp->xv = fp->xv * air_drag + frand(0.01) - 0.005;
- fp->y += fp->yv = fp->yv * air_drag + frand(0.005) - 0.0025 + G_ACCELERATION;
- }
- if (fp->y > h)
- {
- if (rnd(5) == 3)
- {
- fp->yv *= -0.24;
- fp->y = h;
- }
- /* touch muddy ground :) */
- else fp->burn = 0;
- }
- if (fp->x < w && fp->x > 0 && fp->y < h && fp->y > 0)
- {
- prgba = palaka + ((int)fp->y * w + (int)fp->x) * 4;
- prgba[0] = b;
- prgba[1] = g;
- prgba[2] = r;
- }
- }
- return(--fs->life);
-}
-
-#ifdef __SSE2__
-
-/* SSE2 optimized versions of glow_blur() and chromo_2x2_light() */
-
-static void glow_blur(struct state *st)
-{
- unsigned int n, nn;
- unsigned char *ps = st->palaka1;
- unsigned char *pd = st->palaka2;
- unsigned char *pa = st->palaka1 - (st->width * 4);
- unsigned char *pb = st->palaka1 + (st->width * 4);
- __m128i xmm0, xmm1, xmm2, xmm3, xmm4;
-
- xmm0 = _mm_setzero_si128();
- nn = st->width * st->height * 4;
- for (n = 0; n < nn; n+=16)
- {
- _mm_prefetch((const void *)&ps[n+16],_MM_HINT_T0);
- _mm_prefetch((const void *)&pa[n+16],_MM_HINT_T0);
- _mm_prefetch((const void *)&pb[n+16],_MM_HINT_T0);
-
- xmm1 = _mm_load_si128((const __m128i*)&ps[n]);
- xmm2 = xmm1;
- xmm1 = _mm_unpacklo_epi8(xmm1,xmm0);
- xmm2 = _mm_unpackhi_epi8(xmm2,xmm0);
- xmm3 = _mm_loadu_si128((const __m128i*)&ps[n+4]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm3 = _mm_slli_epi16(xmm3,3);
- xmm4 = _mm_slli_epi16(xmm4,3);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
- xmm3 = _mm_loadu_si128((const __m128i*)&ps[n+8]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
-
- xmm3 = _mm_load_si128((const __m128i*)&pa[n]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
- xmm3 = _mm_loadu_si128((const __m128i*)&pa[n+4]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
- xmm3 = _mm_loadu_si128((const __m128i*)&pa[n+8]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
-
- xmm3 = _mm_load_si128((const __m128i*)&pb[n]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
- xmm3 = _mm_loadu_si128((const __m128i*)&pb[n+4]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
- xmm3 = _mm_loadu_si128((const __m128i*)&pb[n+8]);
- xmm4 = xmm3;
- xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
- xmm1 = _mm_add_epi16(xmm1,xmm3);
- xmm2 = _mm_add_epi16(xmm2,xmm4);
-
- xmm3 = xmm1;
- xmm4 = xmm2;
- xmm1 = _mm_srli_epi16(xmm1,4);
- xmm2 = _mm_srli_epi16(xmm2,4);
- xmm3 = _mm_srli_epi16(xmm3,3);
- xmm4 = _mm_srli_epi16(xmm4,3);
- xmm1 = _mm_packus_epi16(xmm1,xmm2);
- xmm3 = _mm_packus_epi16(xmm3,xmm4);
-
- _mm_storeu_si128((__m128i*)&ps[n+4], xmm1);
- _mm_storeu_si128((__m128i*)&pd[n+4], xmm3);
- }
-}
-
-static void chromo_2x2_light(struct state *st)
-{
- __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6;
- __m128i xmi4, xmi5, xmi6, xmi7;
-
- unsigned int x, y, v = 0;
- unsigned int nl = st->width * 4;
- unsigned char *mem = st->palaka2;
- fireshell *fs = st->fireshell_array;
-
- xmm0 = _mm_setr_ps(fs[0].flash_b, fs[0].flash_g, fs[0].flash_r, 0.0);
- xmm1 = _mm_setr_ps(fs[1].flash_b, fs[1].flash_g, fs[1].flash_r, 0.0);
- xmm2 = _mm_setr_ps(fs[2].flash_b, fs[2].flash_g, fs[2].flash_r, 0.0);
- xmm3 = _mm_setr_ps(fs[3].flash_b, fs[3].flash_g, fs[3].flash_r, 0.0);
-
- for (y = st->height/2; y; y--, mem += nl)
- {
- for (x = st->width/4; x; x--, v += 8, mem += 16)
- {
- xmm4 = _mm_set1_ps(st->light_map[v+0]);
- xmm5 = xmm0;
- xmm5 = _mm_mul_ps(xmm5,xmm4);
- xmm4 = _mm_set1_ps(st->light_map[v+1]);
- xmm4 = _mm_mul_ps(xmm4,xmm1);
- xmm5 = _mm_add_ps(xmm5,xmm4);
- xmm4 = _mm_set1_ps(st->light_map[v+2]);
- xmm4 = _mm_mul_ps(xmm4,xmm2);
- xmm5 = _mm_add_ps(xmm5,xmm4);
- xmm4 = _mm_set1_ps(st->light_map[v+3]);
- xmm4 = _mm_mul_ps(xmm4,xmm3);
- xmm5 = _mm_add_ps(xmm5,xmm4);
-
- xmm4 = _mm_set1_ps(st->light_map[v+4]);
- xmm6 = xmm0;
- xmm6 = _mm_mul_ps(xmm6,xmm4);
- xmm4 = _mm_set1_ps(st->light_map[v+5]);
- xmm4 = _mm_mul_ps(xmm4,xmm1);
- xmm6 = _mm_add_ps(xmm6,xmm4);
- xmm4 = _mm_set1_ps(st->light_map[v+6]);
- xmm4 = _mm_mul_ps(xmm4,xmm2);
- xmm6 = _mm_add_ps(xmm6,xmm4);
- xmm4 = _mm_set1_ps(st->light_map[v+7]);
- xmm4 = _mm_mul_ps(xmm4,xmm3);
- xmm6 = _mm_add_ps(xmm6,xmm4);
-
- xmi6 = _mm_cvtps_epi32(xmm5);
- xmi7 = _mm_cvtps_epi32(xmm6);
- xmi6 = _mm_packs_epi32(xmi6,xmi6);
- xmi7 = _mm_packs_epi32(xmi7,xmi7);
-
- xmi4 = _mm_load_si128((const __m128i*) mem);
- xmi5 = _mm_unpacklo_epi8(xmi5,xmi4);
- xmi5 = _mm_srli_epi16(xmi5,8);
- xmi4 = _mm_unpackhi_epi8(xmi4,xmi4);
- xmi4 = _mm_srli_epi16(xmi4,8);
- xmi5 = _mm_add_epi16(xmi5,xmi6);
- xmi4 = _mm_add_epi16(xmi4,xmi7);
- xmi5 = _mm_packus_epi16(xmi5,xmi4);
- _mm_store_si128((__m128i*) mem, xmi5);
-
- xmi4 = _mm_load_si128((const __m128i*) &mem[nl]);
- xmi5 = _mm_unpacklo_epi8(xmi5,xmi4);
- xmi5 = _mm_srli_epi16(xmi5,8);
- xmi4 = _mm_unpackhi_epi8(xmi4,xmi4);
- xmi4 = _mm_srli_epi16(xmi4,8);
- xmi5 = _mm_add_epi16(xmi5,xmi6);
- xmi4 = _mm_add_epi16(xmi4,xmi7);
- xmi5 = _mm_packus_epi16(xmi5,xmi4);
- _mm_store_si128((__m128i*) &mem[nl], xmi5);
- }
- }
-}
-
-#else
-
-static void glow_blur(struct state *st)
-{
- unsigned int n, q;
- unsigned char *pm = st->palaka1;
- unsigned char *po = st->palaka2;
- unsigned char *pa = pm - (st->width * 4);
- unsigned char *pb = pm + (st->width * 4);
- /*
- unsigned int rgba = 0;
- for (n = st->width*st->height*4; n; n--, pm++, pa++, pb++, po++)
- {
- if(++rgba > 3)
- {
- rgba = 0;
- continue;
- }
- q = pm[0] + pm[4] * 8 + pm[8] +
- pa[0] + pa[4] + pa[8] +
- pb[0] + pb[4] + pb[8];
- pm[4] = q >> 4;
- po[4] = q > 2047 ? 255 : q >> 3;
- }
- --- using unrolled version ------------
- */
- for (n = st->width*st->height*4; n; n-=4)
- {
- q = pm[0] + pm[4] * 8 + pm[8] +
- pa[0] + pa[4] + pa[8] +
- pb[0] + pb[4] + pb[8];
- pm[4] = q >> 4;
- po[4] = q > 2047 ? 255 : q >> 3;
- q = pm[1] + pm[5] * 8 + pm[9] +
- pa[1] + pa[5] + pa[9] +
- pb[1] + pb[5] + pb[9];
- pm[5] = q >> 4;
- po[5] = q > 2047 ? 255 : q >> 3;
- q = pm[2] + pm[6] * 8 + pm[10] +
- pa[2] + pa[6] + pa[10] +
- pb[2] + pb[6] + pb[10];
- pm[6] = q >> 4;
- po[6] = q > 2047 ? 255 : q >> 3;
-
- pm+=4, pa+=4, pb+=4, po+=4;
- }
-}
-
-static inline unsigned char addbs(unsigned char c, unsigned int i)
-{
- i += c;
- return(i > 255 ? 255 : i);
-}
-
-static void chromo_2x2_light(struct state *st)
-{
- unsigned int n, x, y, v = 0;
- unsigned int nl = st->width * 4;
- unsigned char *mem = st->palaka2;
- float r, g, b;
- float rgb[SHELLCOUNT*4];
- fireshell *fs = st->fireshell_array;
-
- for (n = 0, x = 0; n < SHELLCOUNT; n++, x += 4, fs++)
- {
- rgb[x ] = fs->flash_r;
- rgb[x+1] = fs->flash_g;
- rgb[x+2] = fs->flash_b;
- }
-
- for (y = st->height/2; y; y--)
- {
- for (x = st->width/2; x; x--, v += 4)
- {
- r = rgb[0] * st->light_map[v] + rgb[4] * st->light_map[v+1]
- + rgb[ 8] * st->light_map[v+2] + rgb[12] * st->light_map[v+3];
- g = rgb[1] * st->light_map[v] + rgb[5] * st->light_map[v+1]
- + rgb[ 9] * st->light_map[v+2] + rgb[13] * st->light_map[v+3];
- b = rgb[2] * st->light_map[v] + rgb[6] * st->light_map[v+1]
- + rgb[10] * st->light_map[v+2] + rgb[14] * st->light_map[v+3];
-
- mem[0] = addbs(mem[0], b);
- mem[1] = addbs(mem[1], g);
- mem[2] = addbs(mem[2], r);
- mem[4] = addbs(mem[4], b);
- mem[5] = addbs(mem[5], g);
- mem[6] = addbs(mem[6], r);
-
- mem += nl;
-
- mem[0] = addbs(mem[0], b);
- mem[1] = addbs(mem[1], g);
- mem[2] = addbs(mem[2], r);
- mem[4] = addbs(mem[4], b);
- mem[5] = addbs(mem[5], g);
- mem[6] = addbs(mem[6], r);
-
- mem -= nl - 8;
- }
- mem += nl;
- }
-}
-
-#endif
-
-static void resize(struct state *st)
-{
- unsigned int n;
- fireshell *fs = st->fireshell_array;
- XWindowAttributes xwa;
- XGetWindowAttributes (st->dpy, st->window, &xwa);
- xwa.width -= xwa.width % 4;
- xwa.height -= xwa.height % 2;
- st->width = xwa.width;
- st->height = xwa.height;
- if (st->verbose)
- {
- printf("resolution: %d x %d \n",st->width,st->height);
- }
- XSync(st->dpy, 0);
- if (st->xim)
- {
- /* if (st->xim->data == (char *)st->palaka2) */
- st->xim->data = NULL;
- XDestroyImage(st->xim);
- XSync(st->dpy, 0);
- free(st->mem2);
- free(st->mem1);
- st->xim = 0;
- }
- st->xim = XCreateImage(st->dpy, xwa.visual, xwa.depth, ZPixmap, 0, 0,
- st->width, st->height, 8, 0);
- if (!st->xim) return;
-
-#ifdef __SSE2___ABANDONED /* causes __ERROR_use_memset_not_bzero_in_xscreensaver__ */
- st->mem1 = _mm_malloc(((st->height + 2) * st->width + 8)*4, 16);
- bzero(st->mem1, ((st->height + 2) * st->width + 8)*4);
- st->mem2 = _mm_malloc(((st->height + 2) * st->width + 8)*4, 16);
- bzero(st->mem2, ((st->height + 2) * st->width + 8)*4);
-#else
- st->mem1 = calloc((st->height + 2) * st->width + 8, 4);
- st->mem2 = calloc((st->height + 2) * st->width + 8, 4);
-#endif
- st->palaka1 = (unsigned char *) st->mem1 + (st->width * 4 + 16);
- st->palaka2 = (unsigned char *) st->mem2 + (st->width * 4 + 16);
-
- if (xwa.depth >= 24)
- {
- st->xim->data = (char *)st->palaka2;
- }
- else
- {
- st->xim->data = calloc(st->height, st->xim->bytes_per_line);
- }
-
- if (st->light_map) free(st->light_map);
- st->light_map = calloc((st->width * st->height * SHELLCOUNT)/4, sizeof(float));
- for (n = 0; n < SHELLCOUNT; n++, fs++)
- {
- render_light_map(st, fs);
- }
-}
-
-static void put_image(struct state *st)
-{
- int x,y,i,j;
- unsigned char r, g, b;
- if (!st->xim) return;
- i = 0;
- j = 0;
- if (st->depth==16)
- {
- if(st->bigendian)
- for (y=0; y<st->xim->height; y++)
- for (x=0; x<st->xim->width; x++)
- {
- r = st->palaka2[j++];
- g = st->palaka2[j++];
- b = st->palaka2[j++];
- j++;
- st->xim->data[i++] = (g&224)>>5 | (r&248);
- st->xim->data[i++] = (b&248)>>3 | (g&28)<<3;
- }
- else
- for (y=0; y<st->xim->height; y++)
- for (x=0; x<st->xim->width; x++)
- {
- r = st->palaka2[j++];
- g = st->palaka2[j++];
- b = st->palaka2[j++];
- j++;
- st->xim->data[i++] = (b&248)>>3 | (g&28)<<3;
- st->xim->data[i++] = (g&224)>>5 | (r&248);
- }
- }
- if (st->depth==15)
- {
- if(st->bigendian)
- for (y=0; y<st->xim->height; y++)
- for (x=0; x<st->xim->width; x++)
- {
- r = st->palaka2[j++];
- g = st->palaka2[j++];
- b = st->palaka2[j++];
- j++;
- st->xim->data[i++] = (g&192)>>6 | (r&248)>>1;
- st->xim->data[i++] = (b&248)>>3 | (g&56)<<2;
- }
- else
- for (y=0; y<st->xim->height; y++)
- for (x=0; x<st->xim->width; x++)
- {
- r = st->palaka2[j++];
- g = st->palaka2[j++];
- b = st->palaka2[j++];
- j++;
- st->xim->data[i++] = (b&248)>>3 | (g&56)<<2;
- st->xim->data[i++] = (g&192)>>6 | (r&248)>>1;
- }
- }
- if (st->depth==8)
- {
- for (y=0; y<st->xim->height; y++)
- for (x=0; x<st->xim->width; x++)
- {
- r = st->palaka2[j++];
- g = st->palaka2[j++];
- b = st->palaka2[j++];
- j++;
- st->xim->data[i++] = (((7*g)/256)*36)+(((6*r)/256)*6)+((6*b)/256);
- }
- }
- XPutImage(st->dpy,st->window,st->gc,st->xim,0,0,0,0,st->xim->width,st->xim->height);
-}
-
-static void *
-fireworkx_init (Display *dpy, Window win)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- unsigned int n;
- Visual *vi;
- Colormap cmap;
- Bool writable;
- XWindowAttributes xwa;
- XGCValues gcv;
- firepix *fp;
- fireshell *fs;
-
- st->dpy = dpy;
- st->window = win;
- st->xim = NULL;
- st->flash_on = 1;
- st->shoot = 0;
- st->width = 0;
- st->height = 0;
- st->max_shell_life = SHELL_LIFE_DEFAULT;
- st->flash_fade = 0.995;
- st->light_map = NULL;
- st->palaka1 = NULL;
- st->palaka2 = NULL;
-
- st->flash_on = get_boolean_resource(st->dpy, "flash" , "Boolean");
- st->shoot = get_boolean_resource(st->dpy, "shoot" , "Boolean");
- st->verbose = get_boolean_resource(st->dpy, "verbose" , "Boolean");
- st->max_shell_life = get_integer_resource(st->dpy, "maxlife" , "Integer");
- /* transition from xscreensaver <= 5.20 */
- if (st->max_shell_life > 100) st->max_shell_life = 100;
-
- st->delay = get_integer_resource(st->dpy, "delay" , "Integer");
-
- st->max_shell_life = pow(10.0,(st->max_shell_life/50.0)+2.7);
- if(st->max_shell_life < 1000) st->flash_fade = 0.998;
-
- if(st->verbose)
- {
- printf("Fireworkx %s - Pyrotechnics explosions simulation \n", FWXVERSION);
- printf("Copyright (GPL) 1999-2013 Rony B Chandran <ronybc@gmail.com> \n\n");
- printf("url: http://www.ronybc.com \n\n");
- printf("Life = %u\n", st->max_shell_life);
-#ifdef __SSE2__
- printf("Using SSE2 optimization.\n");
-#endif
- }
-
- XGetWindowAttributes(st->dpy,win,&xwa);
- st->depth = xwa.depth;
- vi = xwa.visual;
- cmap = xwa.colormap;
- st->bigendian = (ImageByteOrder(st->dpy) == MSBFirst);
-
- if(st->depth==8)
- {
- st->colors = (XColor *) calloc(sizeof(XColor),st->ncolors+1);
- writable = False;
- make_smooth_colormap(xwa.screen, vi, cmap,
- st->colors, &st->ncolors,
- False, &writable, True);
- }
- st->gc = XCreateGC(st->dpy, win, 0, &gcv);
-
- fs = calloc(SHELLCOUNT, sizeof(fireshell));
- fp = calloc(PIXCOUNT * SHELLCOUNT, sizeof(firepix));
- st->fireshell_array = fs;
-
- XGetWindowAttributes (st->dpy, st->window, &xwa);
- st->depth = xwa.depth;
-
- resize(st); /* initialize palakas */
-
- for (n = 0; n < SHELLCOUNT; n++, fs++)
- {
- fs->seq_number = n;
- fs->fpix = fp;
- recycle (st, fs, rnd(st->width), rnd(st->height));
- fp += PIXCOUNT;
- }
-
- return st;
-}
-
-static unsigned long
-fireworkx_draw (Display *dpy, Window win, void *closure)
-{
- struct state *st = (struct state *) closure;
- fireshell *fs;
- unsigned int n, q;
- for (q = FTWEAK; q; q--)
- {
- fs = st->fireshell_array;
- for (n = 0; n < SHELLCOUNT; n++, fs++)
- {
- if (!explode(st, fs))
- {
- if (st->button_down_p)
- st->deferred++;
- else
- recycle(st, fs, rnd(st->width), rnd(st->height));
- }
- }
- }
-
- while (!st->button_down_p && st->deferred) {
- st->deferred--;
- recycle_oldest(st, rnd(st->width), rnd(st->height));
- }
-
- glow_blur(st);
-
- if (st->flash_on)
- {
- chromo_2x2_light(st);
- }
-
- put_image(st);
- return st->delay;
-}
-
-static void
-fireworkx_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->width = w;
- st->height = h;
- resize(st);
-}
-
-static Bool
-fireworkx_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (event->type == ButtonPress)
- {
- recycle_oldest(st, event->xbutton.x, event->xbutton.y);
- st->button_down_p = True;
- return True;
- }
- else if (event->type == ButtonRelease)
- {
- st->button_down_p = False;
- return True;
- }
-
- return False;
-}
-
-static void
-fireworkx_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- free(st->mem2);
- free(st->mem1);
- free(st->fireshell_array->fpix);
- free(st->fireshell_array);
- if (st->xim) {
- st->xim->data = NULL;
- XDestroyImage (st->xim);
- }
- if (st->light_map) free(st->light_map);
- if (st->colors) free (st->colors);
- XFreeGC (dpy, st->gc);
- free(st);
-}
-
-static const char *fireworkx_defaults [] =
-{
- ".background: black",
- ".foreground: white",
- "*delay: 10000", /* never default to zero! */
- "*maxlife: 32",
- "*flash: True",
- "*shoot: False",
- "*verbose: False",
- ".lowrez: true", /* Too slow on Retina screens otherwise */
- 0
-};
-
-static XrmOptionDescRec fireworkx_options [] =
-{
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-maxlife", ".maxlife", XrmoptionSepArg, 0 },
- { "-no-flash", ".flash", XrmoptionNoArg, "False" },
- { "-shoot", ".shoot", XrmoptionNoArg, "True" },
- { "-verbose", ".verbose", XrmoptionNoArg, "True" },
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("Fireworkx", fireworkx)
diff --git a/hacks/fireworkx.man b/hacks/fireworkx.man
deleted file mode 100644
index 0c114c3..0000000
--- a/hacks/fireworkx.man
+++ /dev/null
@@ -1,88 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-fireworkx \- pyrotechnic explosions eye-candy.
-.SH SYNOPSIS
-.B fireworkx
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-verbose]
-[\-noflash]
-[\-shoot]
-[\-delay \fInumber\fP]
-[\-maxlife \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Animates explosions.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-noflash
-Turn off light flash effect. (Runs faster)
-.TP 8
-.B \-shoot
-Fire shells up using mortar.
-.TP 8
-.B \-delay \fInumber\fP
-Delay between frames. In microseconds. (Default: 10000)
-.TP 8
-.B \-maxlife \fInumber\fP
-Maximum decay period for an explosion. (Range: 0-100)
-.TP 8
-.B \-verbose
-For scientific research purposes only..!
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1999-2013 by Rony B Chandran. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-
-.br
-Written by Rony B Chandran <ronybc@gmail.com>
-.br
-
-.br
-Additional programming and support:
-.br
---------------------------------------------------------------------
-.br
-Rugmini R Chandran <rugmini@ronybc.com>
-.br
-Renuka S <renuka@ronybc.com>
-.br
-Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
-.br
-Nicholas Miell <nmiell@gmail.com>
-
-.SH URL
-http://www.ronybc.com
-
diff --git a/hacks/flag.c b/hacks/flag.c
deleted file mode 100644
index 737388c..0000000
--- a/hacks/flag.c
+++ /dev/null
@@ -1,573 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*-
- * flag --- a waving flag
- */
-#if 0
-static const char sccsid[] = "@(#)flag.c 4.02 97/04/01 xlockmore";
-#endif
-
-/* Copyright (c) 1996 Charles Vidal <vidalc@univ-mlv.fr>.
- * PEtite demo X11 de charles vidal 15 05 96
- * tourne sous Linux et SOLARIS
- * thank's to Bas van Gaalen, Holland, PD, for his sources
- * in pascal vous devez rajouter une ligne dans mode.c
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 22-Jan-98: jwz: made the flag wigglier; added xpm support.
- * (I tried to do this by re-porting from xlockmore, but the
- * current xlockmore version is completely inscrutable.)
- * 13-May-97: jwz@jwz.org: turned into a standalone program.
- * Made it able to animate arbitrary (runtime) text or bitmaps.
- * 01-May-96: written.
- */
-
-#ifdef HAVE_COCOA
-# define DEF_FONT "Monaco 15"
-#else
-# define DEF_FONT "-*-fixed-medium-r-*-*-*-100-*-*-c-*-*-*"
-#endif
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 50000 \n" \
- "*cycles: 1000 \n" \
- "*size: -7 \n" \
- "*ncolors: 200 \n" \
- "*bitmap: \n" \
- "*font: " DEF_FONT "\n" \
- "*text: \n" \
- "*fpsSolid: true \n" \
- "*lowrez: true \n" \
-
-# define BRIGHT_COLORS
-# define UNIFORM_COLORS
-# define release_flag 0
-# define reshape_flag 0
-# define flag_handle_event 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-
-#include "ximage-loader.h"
-#include "images/gen/bob_png.h"
-
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-# include "flag.h"
-#endif /* !STANDALONE */
-
-
-#ifdef HAVE_UNAME
-# include <sys/utsname.h>
-#endif /* HAVE_UNAME */
-
-#ifdef STANDALONE
-static XrmOptionDescRec opts[] =
-{
- { "-bitmap", ".flag.bitmap", XrmoptionSepArg, 0 },
- { "-text", ".flag.text", XrmoptionSepArg, 0 }
-};
-
-#endif /* STANDALONE */
-
-ENTRYPOINT ModeSpecOpt flag_opts = {
-#ifdef STANDALONE
- 2, opts, 0, NULL, NULL
-#else /* !STANDALONE */
- 0, NULL, 0, NULL, NULL
-#endif /* STANDALONE */
-};
-
-#define MINSIZE 1
-#define MAXSCALE 8
-#define MINSCALE 2
-#define MAXINITSIZE 6
-#define MININITSIZE 2
-#define MINAMP 5
-#define MAXAMP 20
-#define MAXW(fp) (MAXSCALE * (fp)->image->width + 2 * MAXAMP + (fp)->pointsize)
-#define MAXH(fp) (MAXSCALE * (fp)->image->height+ 2 * MAXAMP + (fp)->pointsize)
-#define MINW(fp) (MINSCALE * (fp)->image->width + 2 * MINAMP + (fp)->pointsize)
-#define MINH(fp) (MINSCALE * (fp)->image->height+ 2 * MINAMP + (fp)->pointsize)
-#define ANGLES 360
-
-typedef struct {
- int samp;
- int sofs;
- int sidx;
- int x_flag, y_flag;
- int timer;
- int initialized;
- int stab[ANGLES];
- Bool dbufp;
- Pixmap cache;
- int width, height;
- int pointsize;
- float size;
- float inctaille;
- int startcolor;
- XImage *image;
-} flagstruct;
-
-static flagstruct *flags = NULL;
-
-static int
-random_num(int n)
-{
- return ((int) (((float) LRAND() / MAXRAND) * (n + 1.0)));
-}
-
-static void
-initSintab(ModeInfo * mi)
-{
- flagstruct *fp = &flags[MI_SCREEN(mi)];
- int i;
-
- /*-
- * change the periodicity of the sin formula : the maximum of the
- * periocity seem to be 16 ( 2^4 ), after the drawing isn't good looking
- */
- int periodicity = random_num(4);
- int puissance = 1;
-
- /* for (i=0;i<periodicity;i++) puissance*=2; */
- puissance <<= periodicity;
- for (i = 0; i < ANGLES; i++)
- fp->stab[i] = (int) (SINF(i * puissance * M_PI / ANGLES) * fp->samp) +
- fp->sofs;
-}
-
-static void
-affiche(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- int x, y, xp, yp;
- flagstruct *fp = &flags[MI_SCREEN(mi)];
-
- for (x = 0; x < fp->image->width; x++)
- for (y = fp->image->height-1; y >= 0; y--) {
- xp = (int) (fp->size * (float) x) +
- fp->stab[(fp->sidx + x + y) % ANGLES];
- yp = (int) (fp->size * (float) y) +
- fp->stab[(fp->sidx + 4 * x + y + y) % ANGLES];
-
- if (fp->image->depth > 1)
- XSetForeground(display, MI_GC(mi),
- XGetPixel(fp->image, x, y));
- else if (XGetPixel(fp->image, x, y))
- XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
- else if (MI_NPIXELS(mi) <= 2)
- XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
- else
- XSetForeground(display, MI_GC(mi),
- MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi)));
-
- if (fp->cache == MI_WINDOW(mi)) { /* not double-buffering */
- xp += fp->x_flag;
- yp += fp->y_flag;
- }
-
- if (fp->pointsize <= 1)
- XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp);
- else if (fp->pointsize < 6)
- XFillRectangle(display, fp->cache, MI_GC(mi), xp, yp,
- fp->pointsize, fp->pointsize);
- else
- XFillArc(display, fp->cache, MI_GC(mi), xp, yp,
- fp->pointsize, fp->pointsize, 0, 360*64);
- }
-}
-
-#ifdef STANDALONE
-
-static void
-make_flag_bits(ModeInfo *mi)
-{
- Display *dpy = MI_DISPLAY(mi);
- flagstruct *fp = &flags[MI_SCREEN(mi)];
- char *bitmap_name = get_string_resource (dpy, "bitmap", "Bitmap");
- char *text = get_string_resource (dpy, "text", "Text");
-
-#ifdef HAVE_JWXYZ /* always use default */
- if (bitmap_name) free (bitmap_name);
- bitmap_name = 0;
-#endif
-
- /* If neither a bitmap nor text are specified, randomly select either
- the builtin bitmap or builtin text. */
- if ((!bitmap_name || !*bitmap_name) && (!text || !*text))
- {
- if (random() & 1)
- {
- free(bitmap_name);
- bitmap_name = strdup("(default)");
- }
- else
- {
- free(text);
- text = strdup("(default)");
- }
- }
-
- if (bitmap_name &&
- *bitmap_name &&
- !!strcmp(bitmap_name, "(default)"))
- {
- Pixmap bitmap = 0;
- int width = 0;
- int height = 0;
-
- bitmap = file_to_pixmap (dpy, MI_WINDOW (mi), bitmap_name,
- &width, &height, 0);
- if (bitmap)
- {
- if (fp->image) XDestroyImage (fp->image);
- fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, ~0L,
- ZPixmap);
- XFreePixmap(dpy, bitmap);
- }
- }
- else if (text && *text)
- {
- char *text2;
- char *fn = get_string_resource (dpy, "font", "Font");
- char *def_fn = "fixed";
- char *line, *token;
- int width, height;
- int lines;
- int margin = 2;
- int fg = 1;
- int bg = 0;
- Pixmap bitmap;
- XFontStruct *font;
- XCharStruct overall;
- XGCValues gcv;
- GC gc;
-
- if (!strcmp(text, "(default)"))
- {
-# ifdef HAVE_UNAME
- struct utsname uts;
- if (uname (&uts) < 0)
- {
- if (text) free (text);
- text = strdup("uname() failed");
- }
- else
- {
- char *s;
- if ((s = strchr(uts.nodename, '.')))
- *s = 0;
- if (text) free (text);
- text = (char *) malloc(strlen(uts.nodename) +
- strlen(uts.sysname) +
- strlen(uts.version) +
- strlen(uts.release) + 10);
-# if defined(_AIX)
- sprintf(text, "%s\n%s %s.%s",
- uts.nodename, uts.sysname, uts.version, uts.release);
-# elif defined(__APPLE__) && !defined(HAVE_IPHONE) /* MacOS X + XDarwin */
- {
- const char *file =
- "/System/Library/CoreServices/SystemVersion.plist";
- FILE *f = fopen (file, "r");
- char *pbv = 0, *pn = 0, *puvv = 0;
- if (f) {
- char *s, buf[255];
-
- while (fgets (buf, sizeof(buf)-1, f)) {
-# define GRAB(S,V) \
- if (strstr(buf, S)) { \
- fgets (buf, sizeof(buf)-1, f); \
- if ((s = strchr (buf, '>'))) { \
- if (V) free (V); \
- V = strdup(s+1); \
- } \
- if ((s = strchr (V, '<'))) *s = 0; \
- }
- GRAB ("ProductName", pn)
- GRAB ("ProductBuildVersion", pbv)
- GRAB ("ProductUserVisibleVersion", puvv)
-# undef GRAB
- }
- }
- if (pbv)
- sprintf (text, "%s\n%s\n%s",
- uts.nodename, pn, puvv /*, uts.machine*/);
- else
- sprintf(text, "%s\n%s %s",
- uts.nodename, uts.sysname, uts.release);
- if (pbv) free (pbv);
- if (pn) free (pn);
- if (puvv) free (puvv);
- }
-# else
- sprintf(text, "%s\n%s %s",
- uts.nodename, uts.sysname, uts.release);
-# endif /* special system types */
- }
-#else /* !HAVE_UNAME */
- if (text) free (text);
-# ifdef VMS
- text = strdup(getenv("SYS$NODE"));
-# else
- text = strdup("X\nScreen\nSaver");
-# endif
-#endif /* !HAVE_UNAME */
- }
-
- while (*text &&
- (text[strlen(text)-1] == '\r' ||
- text[strlen(text)-1] == '\n'))
- text[strlen(text)-1] = 0;
-
- text2 = strdup(text);
-
- if (!fn) fn = strdup (def_fn);
- font = load_font_retry (dpy, fn);
- free (fn);
-
- memset(&overall, 0, sizeof(overall));
- token = text;
- lines = 0;
- while ((line = strtok(token, "\r\n")))
- {
- XCharStruct o2;
- int ascent, descent, direction;
- token = 0;
- XTextExtents(font, line, strlen(line),
- &direction, &ascent, &descent, &o2);
- overall.lbearing = MAX(overall.lbearing, o2.lbearing);
- overall.rbearing = MAX(overall.rbearing, o2.rbearing);
- lines++;
- }
-
- width = overall.lbearing + overall.rbearing + margin + margin + 1;
- height = ((font->ascent + font->descent) * lines) + margin + margin;
-
- bitmap = XCreatePixmap(dpy, MI_WINDOW(mi), width, height, 1);
-
- gcv.font = font->fid;
- gcv.foreground = bg;
- gc = XCreateGC (dpy, bitmap, (GCFont | GCForeground), &gcv);
- XFillRectangle(dpy, bitmap, gc, 0, 0, width, height);
- XSetForeground(dpy, gc, fg);
-
- token = text2;
- lines = 0;
- while ((line = strtok(token, "\r\n")))
- {
- XCharStruct o2;
- int ascent, descent, direction, xoff;
- token = 0;
-
- XTextExtents(font, line, strlen(line),
- &direction, &ascent, &descent, &o2);
- xoff = ((overall.lbearing + overall.rbearing) -
- (o2.lbearing + o2.rbearing)) / 2;
-
- XDrawString(dpy, bitmap, gc,
- overall.lbearing + margin + xoff,
- ((font->ascent * (lines + 1)) +
- (font->descent * lines) +
- margin),
- line, strlen(line));
- lines++;
- }
- free(text2);
- XFreeFont(dpy, font);
- XFreeGC(dpy, gc);
-
- if (fp->image) XDestroyImage (fp->image);
- fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap);
- XFreePixmap(dpy, bitmap);
- }
-
-
- if (! fp->image)
- {
- XImage *im = image_data_to_ximage (dpy, MI_VISUAL(mi),
- bob_png, sizeof(bob_png));
- int x, y;
-
- fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
- 0, im->width, im->height, 8, 0);
- fp->image->data = malloc (fp->image->bytes_per_line * fp->image->height);
-
- /* Convert deep image to 1 bit */
- for (y = 0; y < im->height; y++)
- {
- for (x = 0; x < im->width; x++)
- {
- unsigned long p = XGetPixel (im, x, im->height-y-1);
- if (! (p & 0xFF000000)) p = ~0; /* alpha -> white */
- p = (p >> 16) & 0xFF; /* red */
- XPutPixel (fp->image, x, y, p > 0x7F ? 0 : 1);
- }
- }
- XDestroyImage (im);
- }
-
- if (bitmap_name)
- free (bitmap_name);
- if (text)
- free (text);
-}
-
-#else /* !STANDALONE */
-
-static void
-make_flag_bits(ModeInfo *mi)
-{
- flagstruct *fp = &flags[MI_SCREEN(mi)];
- int x, y;
- int w = flag_width;
- int h = flag_height;
- int i = 0;
- if (fp->image) XDestroyImage (fp->image);
- fp->image =
- XCreateImage(MI_DISPLAY(mi), MI_VISUAL(mi),
- 1, XYBitmap, 0, /* dpth, fmt, offset */
- (char *) calloc ((w+8) / 8, h), /* data */
- w, h, 8, 0); /* w, h, pad, bpl */
- /* Geez, what kinda goofy bit order is this?? */
- for (x = 0; x < w; x++)
- for (y = h-1; y >= 0; y--)
- XPutPixel (fp->image, x, y, flag_bits[i++]);
-}
-
-#endif /* !STANDALONE */
-
-
-ENTRYPOINT void
-init_flag(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- int size = MI_SIZE(mi);
- flagstruct *fp;
-
- MI_INIT (mi, flags);
- fp = &flags[MI_SCREEN(mi)];
-
- make_flag_bits(mi);
- if (!fp->image) abort();
-
- fp->width = MI_WIN_WIDTH(mi);
- fp->height = MI_WIN_HEIGHT(mi);
-
- fp->samp = MAXAMP; /* Amplitude */
- fp->sofs = 20; /* ???????? */
- fp->pointsize = size;
- if (size < -MINSIZE)
- fp->pointsize = NRAND(-size - MINSIZE + 1) + MINSIZE;
- if (fp->pointsize < MINSIZE ||
- fp->width <= MAXW(fp) || fp->height <= MAXH(fp))
- fp->pointsize = MINSIZE;
- fp->size = MAXINITSIZE; /* Initial distance between pts */
- fp->inctaille = 0.05;
- fp->timer = 0;
- fp->sidx = fp->x_flag = fp->y_flag = 0;
-
- if (!fp->initialized) {
- fp->dbufp = True;
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- fp->dbufp = False;
-#endif
- fp->initialized = True;
- if (!fp->dbufp)
- fp->cache = MI_WINDOW(mi); /* not double-buffering */
- else
- if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi),
- MAXW(fp), MAXH(fp),
- MI_WIN_DEPTH(mi))))
-#ifdef STANDALONE
- exit(-1);
-#else /* !STANDALONE */
- error("%s: catastrophe memoire\n");
-#endif /* !STANDALONE */
- }
- XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
- XFillRectangle(display, fp->cache, MI_GC(mi),
- 0, 0, MAXW(fp), MAXH(fp));
- /* don't want any exposure events from XCopyArea */
- XSetGraphicsExposures(display, MI_GC(mi), False);
- if (MI_NPIXELS(mi) > 2)
- fp->startcolor = NRAND(MI_NPIXELS(mi));
- if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
- fp->samp = MINAMP;
- fp->sofs = 0;
- fp->x_flag = random_num(fp->width - MINW(fp));
- fp->y_flag = random_num(fp->height - MINH(fp));
- } else {
- fp->samp = MAXAMP;
- fp->sofs = 20;
- fp->x_flag = random_num(fp->width - MAXW(fp));
- fp->y_flag = random_num(fp->height - MAXH(fp));
- }
-
- initSintab(mi);
-
- XClearWindow(display, MI_WINDOW(mi));
-}
-
-ENTRYPOINT void
-draw_flag(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- flagstruct *fp = &flags[MI_SCREEN(mi)];
-
- if (!fp->image) abort();
- if (fp->cache == window) { /* not double-buffering */
- XClearWindow (display, window);
- } else if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
- fp->size = MININITSIZE;
- /* fp->pointsize = MINPOINTSIZE; */
- XCopyArea(display, fp->cache, window, MI_GC(mi),
- 0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag);
- } else {
- if ((fp->size + fp->inctaille) > MAXSCALE)
- fp->inctaille = -fp->inctaille;
- if ((fp->size + fp->inctaille) < MINSCALE)
- fp->inctaille = -fp->inctaille;
- fp->size += fp->inctaille;
- XCopyArea(display, fp->cache, window, MI_GC(mi),
- 0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag);
- }
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
- XFillRectangle(display, fp->cache, MI_GC(mi),
- 0, 0, MAXW(fp), MAXH(fp));
- affiche(mi);
- fp->sidx += 2;
- fp->sidx %= (ANGLES * MI_NPIXELS(mi));
- fp->timer++;
- if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
- init_flag(mi);
-}
-
-ENTRYPOINT void
-free_flag(ModeInfo * mi)
-{
- flagstruct *fp = &flags[MI_SCREEN(mi)];
- if (fp->cache && fp->dbufp)
- XFreePixmap(MI_DISPLAY(mi), fp->cache);
- if (fp->image) XDestroyImage(fp->image);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_flag(ModeInfo * mi)
-{
- /* Do nothing, it will refresh by itself */
-}
-#endif
-
-XSCREENSAVER_MODULE ("Flag", flag)
diff --git a/hacks/flag.man b/hacks/flag.man
deleted file mode 100644
index ac53dfb..0000000
--- a/hacks/flag.man
+++ /dev/null
@@ -1,92 +0,0 @@
-.TH XScreenSaver 1 "24-May-97" "X Version 11"
-.SH NAME
-flag \- draws a waving flag, containing text or an image
-.SH SYNOPSIS
-.B flag
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-size \fIinteger\fP] [\-text \fIstring\fP] [\-font \fIfont\fP] [\-bitmap \fIxbm-file\fP]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIflag\fP program draws a waving flag that contains text or a bitmap.
-.SH OPTIONS
-.I flag
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 200.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-size \fIinteger\fP
-How large the pixels in the flag should be, from 1 to 8.
-If this is a negative number, the pixel size is chosen randomly
-from the range 1 to -size. Default -7.
-.TP 8
-.B \-text \fItext\fP
-The text to display in the flag. Multiple lines of text are allowed;
-the lines will be displayed centered atop one another. Default: none.
-If the text is the magic string \fI"(default)"\fP, then the text used
-will be the local machine name; a newline; and the local OS version.
-.TP 8
-.B \-bitmap \fIxbm-file\fP
-The bitmap to display in the flag; this must be an XBM file (color XPMs
-are not allowed.) Default: none. If the bitmap is the magic
-string \fI"(default)"\fP, then the bitmap used will be a charming
-little picture of J. R. "Bob" Dobbs.
-
-If neither \fI\-text\fP nor \fI\-bitmap\fP are specified, then either
-the builtin text or the builtin bitmap will be chosen randomly.
-.TP 8
-.B \-font \fIfont\fP
-The font in which to draw the text; the default is
-"-*-helvetica-bold-r-*-240-*".
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 Charles Vidal.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-
-.SH AUTHOR
-Charles Vidal <vidalc@univ-mlv.fr>, 1996.
-
-Ability to run standalone or with \fIxscreensaver\fP, and the \-text
-and \-bitmap options, added by Jamie Zawinski <jwz@jwz.org>, 24-May-97.
diff --git a/hacks/flame.c b/hacks/flame.c
deleted file mode 100644
index f7e9833..0000000
--- a/hacks/flame.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/* xscreensaver, Copyright (c) 1993-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* This file was ported from xlock for use in xscreensaver (and standalone)
- * by jwz on 18-Oct-93. (And again, 11-May-97.) Original copyright reads:
- *
- * static char sccsid[] = "@(#)flame.c 1.4 91/09/27 XLOCK";
- *
- * flame.c - recursive fractal cosmic flames.
- *
- * Copyright (c) 1991 by Patrick J. Naughton.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Comments and additions should be sent to the author:
- *
- * naughton@eng.sun.com
- *
- * Patrick J. Naughton
- * MS 21-14
- * Sun Laboritories, Inc.
- * 2550 Garcia Ave
- * Mountain View, CA 94043
- *
- * Revision History:
- * 01-Jun-95: This should look more like the original with some updates by
- * Scott Draves.
- * 27-Jun-91: vary number of functions used.
- * 24-Jun-91: fixed portability problem with integer mod (%).
- * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu).
- */
-
-#include <math.h>
-#include "screenhack.h"
-
-#include <signal.h> /* so we can ignore SIGFPE */
-
-#define POINT_BUFFER_SIZE 10
-#define MAXLEV 4
-#define MAXKINDS 10
-
-struct state {
- Display *dpy;
- Window window;
-
- double f[2][3][MAXLEV]; /* three non-homogeneous transforms */
- int max_total;
- int max_levels;
- int max_points;
- int cur_level;
- int variation;
- int snum;
- int anum;
- int num_points;
- int total_points;
- int pixcol;
- int ncolors;
- XColor *colors;
- XPoint points [POINT_BUFFER_SIZE];
- GC gc;
-
- int delay, delay2;
- int width, height;
-
- short lasthalf;
-
- int flame_alt;
- int do_reset;
-};
-
-
-static short
-halfrandom (struct state *st, int mv)
-{
- unsigned long r;
-
- if (st->lasthalf)
- {
- r = st->lasthalf;
- st->lasthalf = 0;
- }
- else
- {
- r = random ();
- st->lasthalf = r >> 16;
- }
- return (r % mv);
-}
-
-static void *
-flame_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
- XWindowAttributes xgwa;
- Colormap cmap;
-
- st->dpy = dpy;
- st->window = window;
-
-#if defined(SIGFPE) && defined(SIG_IGN)
- /* No doubt a better fix would be to track down where the NaN is coming
- from, and code around that; but this should do. Apparently most systems
- (Linux, Solaris, Irix, ...) ignore FPE by default -- but FreeBSD dumps
- core by default. */
- signal (SIGFPE, SIG_IGN);
-#endif
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- st->width = xgwa.width;
- st->height = xgwa.height;
- cmap = xgwa.colormap;
-
- st->max_points = get_integer_resource (st->dpy, "iterations", "Integer");
- if (st->max_points <= 0) st->max_points = 100;
-
- st->max_levels = st->max_points;
-
- st->max_total = get_integer_resource (st->dpy, "points", "Integer");
- if (st->max_total <= 0) st->max_total = 10000;
-
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- if (st->delay < 0) st->delay = 0;
- st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
- if (st->delay2 < 0) st->delay2 = 0;
-
- st->variation = random() % MAXKINDS;
-
- if (mono_p)
- st->ncolors = 0;
- else
- {
- st->ncolors = get_integer_resource (st->dpy, "colors", "Integer");
- if (st->ncolors <= 0) st->ncolors = 128;
- st->colors = (XColor *) malloc ((st->ncolors+1) * sizeof (*st->colors));
- make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
- st->colors, &st->ncolors,
- True, 0, True);
- if (st->ncolors <= 2)
- mono_p = True, st->ncolors = 0;
- }
-
- gcv.foreground = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
- gcv.background = get_pixel_resource (st->dpy, cmap, "background", "Background");
-
- if (! mono_p)
- {
- st->pixcol = halfrandom (st, st->ncolors);
- gcv.foreground = (st->colors [st->pixcol].pixel);
- }
-
- st->gc = XCreateGC (st->dpy, st->window, GCForeground | GCBackground, &gcv);
- return st;
-}
-
-static int
-recurse (struct state *st, double x, double y, int l, Display *dpy, Window win)
-{
- int i;
- double nx, ny;
-
- if (l == st->max_levels)
- {
- st->total_points++;
- if (st->total_points > st->max_total) /* how long each fractal runs */
- return 0;
-
- if (x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0)
- {
- st->points[st->num_points].x = (int) ((st->width / 2) * (x + 1.0));
- st->points[st->num_points].y = (int) ((st->height / 2) * (y + 1.0));
- st->num_points++;
- if (st->num_points >= POINT_BUFFER_SIZE)
- {
- XDrawPoints (st->dpy, win, st->gc, st->points, st->num_points, CoordModeOrigin);
- st->num_points = 0;
- }
- }
- }
- else
- {
- for (i = 0; i < st->snum; i++)
- {
-
- /* Scale back when values get very large. Spot sez:
- "I think this happens on HPUX. I think it's non-IEEE
- to generate an exception instead of a silent NaN."
- */
- if ((fabs(x) > 1.0E5) || (fabs(y) > 1.0E5))
- x = x / y;
-
- nx = st->f[0][0][i] * x + st->f[0][1][i] * y + st->f[0][2][i];
- ny = st->f[1][0][i] * x + st->f[1][1][i] * y + st->f[1][2][i];
- if (i < st->anum)
- {
- switch (st->variation)
- {
- case 0: /* sinusoidal */
- nx = sin(nx);
- ny = sin(ny);
- break;
- case 1: /* complex */
- {
- double r2 = nx * nx + ny * ny + 1e-6;
- nx = nx / r2;
- ny = ny / r2;
- }
- break;
- case 2: /* bent */
- if (nx < 0.0)
- nx = nx * 2.0;
- if (ny < 0.0)
- ny = ny / 2.0;
- break;
- case 3: /* swirl */
- {
- double r = (nx * nx + ny * ny); /* times k here is fun */
- double c1 = sin(r);
- double c2 = cos(r);
- double t = nx;
-
- if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
- ny = 1e4;
- else
- ny = c2 * t + c1 * ny;
- nx = c1 * nx - c2 * ny;
- }
- break;
- case 4: /* horseshoe */
- {
- double r, c1, c2, t;
-
- /* Avoid atan2: DOMAIN error message */
- if (nx == 0.0 && ny == 0.0)
- r = 0.0;
- else
- r = atan2(nx, ny); /* times k here is fun */
- c1 = sin(r);
- c2 = cos(r);
- t = nx;
-
- nx = c1 * nx - c2 * ny;
- ny = c2 * t + c1 * ny;
- }
- break;
- case 5: /* drape */
- {
- double t;
-
- /* Avoid atan2: DOMAIN error message */
- if (nx == 0.0 && ny == 0.0)
- t = 0.0;
- else
- t = atan2(nx, ny) / M_PI;
-
- if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
- ny = 1e4;
- else
- ny = sqrt(nx * nx + ny * ny) - 1.0;
- nx = t;
- }
- break;
- case 6: /* broken */
- if (nx > 1.0)
- nx = nx - 1.0;
- if (nx < -1.0)
- nx = nx + 1.0;
- if (ny > 1.0)
- ny = ny - 1.0;
- if (ny < -1.0)
- ny = ny + 1.0;
- break;
- case 7: /* spherical */
- {
- double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
-
- nx = nx / r;
- ny = ny / r;
- }
- break;
- case 8: /* */
- nx = atan(nx) / M_PI_2;
- ny = atan(ny) / M_PI_2;
- break;
-/* #if 0 */ /* core dumps on some machines, why not all? */
- case 9: /* complex sine */
- {
- double u = nx;
- double v = ny;
- double ev = exp(v);
- double emv = exp(-v);
-
- nx = (ev + emv) * sin(u) / 2.0;
- ny = (ev - emv) * cos(u) / 2.0;
- }
- break;
- case 10: /* polynomial */
- if (nx < 0)
- nx = -nx * nx;
- else
- nx = nx * nx;
- if (ny < 0)
- ny = -ny * ny;
- else
- ny = ny * ny;
- break;
-/* #endif */
- default:
- nx = sin(nx);
- ny = sin(ny);
- }
- }
- if (!recurse (st, nx, ny, l + 1, st->dpy, win))
- return 0;
- }
- }
- return 1;
-}
-
-static unsigned long
-flame_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- int i, j, k;
- unsigned long this_delay = st->delay;
-
- if (st->do_reset)
- {
- st->do_reset = 0;
- XClearWindow (st->dpy, st->window);
- }
-
- if (!(st->cur_level++ % st->max_levels))
- {
- st->do_reset = 1;
- this_delay = st->delay2;
- st->flame_alt = !st->flame_alt;
- st->variation = random() % MAXKINDS;
- }
- else
- {
- if (st->ncolors > 2)
- {
- XSetForeground (st->dpy, st->gc, st->colors [st->pixcol].pixel);
- if (--st->pixcol < 0)
- st->pixcol = st->ncolors - 1;
- }
- }
-
- /* number of functions */
- st->snum = 2 + (st->cur_level % (MAXLEV - 1));
-
- /* how many of them are of alternate form */
- if (st->flame_alt)
- st->anum = 0;
- else
- st->anum = halfrandom (st, st->snum) + 2;
-
- /* 6 coefs per function */
- for (k = 0; k < st->snum; k++)
- {
- for (i = 0; i < 2; i++)
- for (j = 0; j < 3; j++)
- st->f[i][j][k] = ((double) (random() & 1023) / 512.0 - 1.0);
- }
- st->num_points = 0;
- st->total_points = 0;
- recurse (st, 0.0, 0.0, 0, st->dpy, st->window);
- XDrawPoints (st->dpy, st->window, st->gc, st->points, st->num_points, CoordModeOrigin);
-
- return this_delay;
-}
-
-
-#if defined(__hpux) && defined(PLOSS)
-/* I don't understand why this is necessary, but I'm told that this program
- does nothing at all on HP-sUX without it.
-
- I'm further told that HPUX 11.0 doesn't define PLOSS, and works ok without
- this section. Go figure.
- */
-#undef random
-#undef srandom
-#include <math.h>
-int matherr(x)
- register struct exception *x;
-{
- if (x->type == PLOSS) return 1;
- else return 0;
-}
-#endif /* __hpux */
-
-
-
-static const char *flame_defaults [] = {
- ".background: black",
- ".foreground: white",
- "*fpsSolid: true",
- "*colors: 64",
- "*iterations: 25",
- "*delay: 50000",
- "*delay2: 2000000",
- "*points: 10000",
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec flame_options [] = {
- { "-colors", ".colors", XrmoptionSepArg, 0 },
- { "-iterations", ".iterations", XrmoptionSepArg, 0 },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-delay2", ".delay2", XrmoptionSepArg, 0 },
- { "-points", ".points", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-static void
-flame_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- st->width = w;
- st->height = h;
-}
-
-static Bool
-flame_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (screenhack_event_helper (dpy, window, event))
- {
- st->do_reset = 1;
- return True;
- }
- return False;
-}
-
-static void
-flame_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->gc);
- free (st->colors);
- free (st);
-}
-
-XSCREENSAVER_MODULE ("Flame", flame)
-
diff --git a/hacks/flame.man b/hacks/flame.man
deleted file mode 100644
index f0136e2..0000000
--- a/hacks/flame.man
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-flame \- draw weird cosmic fractals
-.SH SYNOPSIS
-.B flame
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-colors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
-[\-fps]
-.SH DESCRIPTION
-The \fIflame\fP program generates colorful fractal displays.
-.SH OPTIONS
-.I flame
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-colors \fIinteger\fP
-How many colors should be used (if possible). Default 64.
-.TP 8
-.B \-iterations \fIinteger\fP
-How many fractals to generate. Default 25.
-.TP 8
-.B \-points \fIinteger\fP
-How many pixels to draw for each fractal. Default 10000.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long we should wait between drawing each fractal. Default 50000,
-or about 1/20th second.
-.TP 8
-.B \-delay2 \fImicroseconds\fP
-How long we should wait before clearing the screen when each run ends.
-Default 2000000, or two seconds.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1991 by Patrick J. Naughton
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-Scott Graves <spot@cs.cmu.edu>, 06-Jun-91.n
-
-Ability to run standalone or with \fIxscreensaver\fP added by
-Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/hacks/flow.c b/hacks/flow.c
deleted file mode 100644
index 6dddd8e..0000000
--- a/hacks/flow.c
+++ /dev/null
@@ -1,1211 +0,0 @@
-/* -*- Mode: C; tab-width: 4; c-basic-offset: 4 -*- */
-/* flow --- flow of strange bees */
-
-#if 0
-static const char sccsid[] = "@(#)flow.c 5.00 2000/11/01 xlockmore";
-#endif
-
-/*-
- * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
- * Incorporating some code from Stephen Davies Copyright (c) 2000
- *
- * Search code based on techniques described in "Strange Attractors:
- * Creating Patterns in Chaos" by Julien C. Sprott
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * "flow" shows a variety of continuous phase-space flows around strange
- * attractors. It includes the well-known Lorentz mask (the "Butterfly"
- * of chaos fame), two forms of Rossler's "Folded Band" and Poincare'
- * sections of the "Birkhoff Bagel" and Duffing's forced occilator. "flow"
- * can now discover new attractors.
- *
- * Revision History:
- *
- * 29-Oct-2004: [TDA] Discover Attractors unknown to science.
- * Replace 2D rendering of Periodic Attractors with a 3D
- * 'interrupted' rendering. Replace "-/+allow2d" with "-/+periodic"
- * Replace all ODE formulae with completely generic forms.
- * Add '-search' option to perform background high-speed discovery
- * for completely new attractors without impacting rendering
- * performance.
- * Use gaussian distribution for initial point positions and for
- * parameter search.
- * Add "+dbuf" option to allow Double-Buffering to be turned off on
- * slow X servers.
- * Remove redundant '-zoom' option. Now automatically zooms if both
- * rotation and riding are permitted.
- * Replace dynamic bounding box with static one pre-calculated
- * during discovery phase.
- * Simplify and fix bounding box clipping code. Should now be safe
- * to run without double buffer on all XFree86 servers if desired.
- * 12-Oct-2004: [TDA] Merge Xscreensaver and Xlockmore branches
- * Added Chalky's orbital camera, but made the zooming work by
- * flying the camera rather than interpolating the view transforms.
- * Added Chalky's Bounding Box, but time-averaged the boundaries to
- * let the lost bees escape.
- * Added Chalky's 'view-frustrum' clipping, but only applying it to
- * the Bounding Box. Trails make clipping less useful.
- * Added Chalky's "-slow" and "-freeze" options for compatibility,
- * but haven't implemented the features, since the results are ugly
- * and make no mathematical contribution.
- * Added Double-Buffering as a work-around for a persistent XFree86
- * bug that left debris on the screen.
- * 21-Mar-2003: [TDA] Trails added (XLockmore branch)
- * 01-Nov-2000: [TDA] Allocation checks (XLockmore branch)
- * 21-Feb-2000: [Chalky] Major hackage (Stephen Davies, chalky@null.net)
- * (Xscreensaver branch)
- * Forced perspective mode, added 3d box around attractor which
- * involved coding 3d-planar-clipping against the view-frustrum
- * thingy. Also made view alternate between piggybacking on a 'bee'
- * to zooming around outside the attractor. Most bees slow down and
- * stop, to make the structure of the attractor more obvious.
-* 28-Jan-1999: [TDA] Catch 'lost' bees in flow.c and disable them.
- * (XLockmore branch)
- * I chose to disable them rather than reinitialise them because
- * reinitialising can produce fake attractors.
- * This has allowed me to relax some of the parameters and initial
- * conditions slightly to catch some of the more extreme cases. As a
- * result you may see some bees fly away at the start - these are the ones
- * that 'missed' the attractor. If the bee with the camera should fly
- * away the mode will restart :-)
- * 31-Nov-1998: [TDA] Added Duffing (what a strange day that was :) DAB)
- * Duffing's forced oscillator has been added to the formula list and
- * the parameters section has been updated to display it in Poincare'
- * section.
- * 30-Nov-1998: [TDA] Added travelling perspective option
- * A more exciting point-of-view has been added to all autonomous flows.
- * This views the flow as seen by a particle moving with the flow. In the
- * metaphor of the original code, I've attached a camera to one of the
- * trained bees!
- * 30-Nov-1998: [TDA] Much code cleanup.
- * 09-Apr-1997: [TDA] Ported to xlockmore-4
- * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
- * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org).
- */
-
-#ifdef STANDALONE
-# define MODE_flow
-# define DEFAULTS "*delay: 10000 \n" \
- "*count: 3000 \n" \
- "*size: -10 \n" \
- "*cycles: 10000 \n" \
- "*ncolors: 200 \n"
-
-# define release_flow 0
-# define reshape_flow 0
-# define flow_handle_event 0
-# include "xlockmore.h" /* in xscreensaver distribution */
-#else /* STANDALONE */
-# include "xlock.h" /* in xlockmore distribution */
-#endif /* STANDALONE */
-
-#ifdef MODE_flow
-
-#define DEF_ROTATE "TRUE"
-#define DEF_RIDE "TRUE"
-#define DEF_BOX "TRUE"
-#define DEF_PERIODIC "TRUE"
-#define DEF_SEARCH "TRUE"
-#define DEF_DBUF "TRUE"
-
-static Bool rotatep;
-static Bool ridep;
-static Bool boxp;
-static Bool periodicp;
-static Bool searchp;
-static Bool dbufp;
-
-static XrmOptionDescRec opts[] = {
- {"-rotate", ".flow.rotate", XrmoptionNoArg, "on"},
- {"+rotate", ".flow.rotate", XrmoptionNoArg, "off"},
- {"-ride", ".flow.ride", XrmoptionNoArg, "on"},
- {"+ride", ".flow.ride", XrmoptionNoArg, "off"},
- {"-box", ".flow.box", XrmoptionNoArg, "on"},
- {"+box", ".flow.box", XrmoptionNoArg, "off"},
- {"-periodic", ".flow.periodic", XrmoptionNoArg, "on"},
- {"+periodic", ".flow.periodic", XrmoptionNoArg, "off"},
- {"-search", ".flow.search", XrmoptionNoArg, "on"},
- {"+search", ".flow.search", XrmoptionNoArg, "off"},
- {"-dbuf", ".flow.dbuf", XrmoptionNoArg, "on"},
- {"+dbuf", ".flow.dbuf", XrmoptionNoArg, "off"},
-};
-
-static argtype vars[] = {
- {&rotatep, "rotate", "Rotate", DEF_ROTATE, t_Bool},
- {&ridep, "ride", "Ride", DEF_RIDE, t_Bool},
- {&boxp, "box", "Box", DEF_BOX, t_Bool},
- {&periodicp, "periodic", "Periodic", DEF_PERIODIC, t_Bool},
- {&searchp, "search", "Search", DEF_SEARCH, t_Bool},
- {&dbufp, "dbuf", "Dbuf", DEF_DBUF, t_Bool},
-};
-
-static OptionStruct desc[] = {
- {"-/+rotate", "turn on/off rotating around attractor."},
- {"-/+ride", "turn on/off ride in the flow."},
- {"-/+box", "turn on/off bounding box."},
- {"-/+periodic", "turn on/off periodic attractors."},
- {"-/+search", "turn on/off search for new attractors."},
- {"-/+dbuf", "turn on/off double buffering."},
-};
-
-ENTRYPOINT ModeSpecOpt flow_opts =
-{sizeof opts / sizeof opts[0], opts,
- sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct flow_description = {
- "flow", "init_flow", "draw_flow", NULL,
- "refresh_flow", "init_flow", "free_flow", &flow_opts,
- 1000, 1024, 10000, -10, 200, 1.0, "",
- "Shows dynamic strange attractors", 0, NULL
-};
-
-#endif
-
-typedef struct { double x, y, z; } dvector;
-
-#define N_PARS 20 /* Enough for Full Cubic or Periodic Cubic */
-typedef dvector Par[N_PARS];
-enum { /* Name the parameter indices to make it easier to write
- standard examples */
- C,
- X,XX,XXX,XXY,XXZ,XY,XYY,XYZ,XZ,XZZ,
- Y,YY,YYY,YYZ,YZ,YZZ,
- Z,ZZ,ZZZ,
- SINY = XY /* OK to overlap in this case */
-};
-
-/* Camera target [TDA] */
-typedef enum {
- ORBIT = 0,
- BEE = 1
-} Chaseto;
-
-/* Macros */
-#define IX(C) ((C) * segindex + sp->cnsegs[(C)])
-#define B(t,b) (sp->p + (t) + (b) * sp->taillen)
-#define X(t,b) (B((t),(b))->x)
-#define Y(t,b) (B((t),(b))->y)
-#define Z(t,b) (B((t),(b))->z)
-#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
-#define LOST_IN_SPACE 2000.0
-#define INITIALSTEP 0.04
-#define EYEHEIGHT 0.005
-#define MINTRAIL 2
-#define BOX_L 36
-
-/* Points that make up the box (normalized coordinates) */
-static const double box[][3] = {
- {1,1,1}, /* 0 */
- {1,1,-1}, /* 1 */
- {1,-1,-1}, /* 2 */
- {1,-1,1}, /* 3 */
- {-1,1,1}, /* 4 */
- {-1,1,-1}, /* 5 */
- {-1,-1,-1},/* 6 */
- {-1,-1,1}, /* 7 */
- {1, .8, .8},
- {1, .8,-.8},
- {1,-.8,-.8},
- {1,-.8, .8},
- { .8,1, .8},
- { .8,1,-.8},
- {-.8,1,-.8},
- {-.8,1, .8},
- { .8, .8,1},
- { .8,-.8,1},
- {-.8,-.8,1},
- {-.8, .8,1},
- {-1, .8, .8},
- {-1, .8,-.8},
- {-1,-.8,-.8},
- {-1,-.8, .8},
- { .8,-1, .8},
- { .8,-1,-.8},
- {-.8,-1,-.8},
- {-.8,-1, .8},
- { .8, .8,-1},
- { .8,-.8,-1},
- {-.8,-.8,-1},
- {-.8, .8,-1}
-};
-
-/* Lines connecting the box dots */
-static const double lines[][2] = {
- {0,1}, {1,2}, {2,3}, {3,0}, /* box */
- {4,5}, {5,6}, {6,7}, {7,4},
- {0,4}, {1,5}, {2,6}, {3,7},
- {4+4,5+4}, {5+4,6+4}, {6+4,7+4}, {7+4,4+4},
- {4+8,5+8}, {5+8,6+8}, {6+8,7+8}, {7+8,4+8},
- {4+12,5+12}, {5+12,6+12}, {6+12,7+12}, {7+12,4+12},
- {4+16,5+16}, {5+16,6+16}, {6+16,7+16}, {7+16,4+16},
- {4+20,5+20}, {5+20,6+20}, {6+20,7+20}, {7+20,4+20},
- {4+24,5+24}, {5+24,6+24}, {6+24,7+24}, {7+24,4+24},
-};
-
-typedef struct {
- /* Variables used in rendering */
- dvector cam[3]; /* camera flight path */
- int chasetime;
- Chaseto chaseto;
- Pixmap buffer; /* Double Buffer */
- dvector circle[2]; /* POV that circles around the scene */
- dvector centre; /* centre */
- int beecount; /* number of bees */
- XSegment *csegs; /* bee lines */
- int *cnsegs;
- XSegment *old_segs; /* old bee lines */
- int nold_segs;
- int taillen;
-
- /* Variables common to iterators */
- dvector (*ODE) (Par par, double x, double y, double z);
- dvector range; /* Initial conditions */
- double yperiod; /* ODE's where Y is periodic. */
-
- /* Variables used in iterating main flow */
- Par par;
- dvector *p; /* bee positions x[time][bee#] */
- int count;
- double lyap;
- double size;
- dvector mid; /* Effective bounding box */
- double step;
-
- /* second set of variables, used for parallel search */
- Par par2;
- dvector p2[2];
- int count2;
- double lyap2;
- double size2;
- dvector mid2;
- double step2;
-
-} flowstruct;
-
-static flowstruct *flows = (flowstruct *) NULL;
-
-/*
- * Private functions
- */
-
-
-/* ODE functions */
-
-/* Generic 3D Cubic Polynomial. Includes all the Quadratics (Lorentz,
- Rossler) and much more! */
-
-/* I considered offering a seperate 'Quadratic' option, since Cubic is
- clearly overkill for the standard examples, but the performance
- difference is too small to measure. The compute time is entirely
- dominated by the XDrawSegments calls anyway. [TDA] */
-static dvector
-Cubic(Par a, double x, double y, double z)
-{
- dvector d;
- d.x = a[C].x + a[X].x*x + a[XX].x*x*x + a[XXX].x*x*x*x + a[XXY].x*x*x*y +
- a[XXZ].x*x*x*z + a[XY].x*x*y + a[XYY].x*x*y*y + a[XYZ].x*x*y*z +
- a[XZ].x*x*z + a[XZZ].x*x*z*z + a[Y].x*y + a[YY].x*y*y +
- a[YYY].x*y*y*y + a[YYZ].x*y*y*z + a[YZ].x*y*z + a[YZZ].x*y*z*z +
- a[Z].x*z + a[ZZ].x*z*z + a[ZZZ].x*z*z*z;
-
- d.y = a[C].y + a[X].y*x + a[XX].y*x*x + a[XXX].y*x*x*x + a[XXY].y*x*x*y +
- a[XXZ].y*x*x*z + a[XY].y*x*y + a[XYY].y*x*y*y + a[XYZ].y*x*y*z +
- a[XZ].y*x*z + a[XZZ].y*x*z*z + a[Y].y*y + a[YY].y*y*y +
- a[YYY].y*y*y*y + a[YYZ].y*y*y*z + a[YZ].y*y*z + a[YZZ].y*y*z*z +
- a[Z].y*z + a[ZZ].y*z*z + a[ZZZ].y*z*z*z;
-
- d.z = a[C].z + a[X].z*x + a[XX].z*x*x + a[XXX].z*x*x*x + a[XXY].z*x*x*y +
- a[XXZ].z*x*x*z + a[XY].z*x*y + a[XYY].z*x*y*y + a[XYZ].z*x*y*z +
- a[XZ].z*x*z + a[XZZ].z*x*z*z + a[Y].z*y + a[YY].z*y*y +
- a[YYY].z*y*y*y + a[YYZ].z*y*y*z + a[YZ].z*y*z + a[YZZ].z*y*z*z +
- a[Z].z*z + a[ZZ].z*z*z + a[ZZZ].z*z*z*z;
-
- return d;
-}
-
-/* 3D Cubic in (x,z) with periodic sinusoidal forcing term in x. y is
- the independent periodic (time) axis. This includes Birkhoff's
- Bagel and Duffing's Attractor */
-static dvector
-Periodic(Par a, double x, double y, double z)
-{
- dvector d;
-
- d.x = a[C].x + a[X].x*x + a[XX].x*x*x + a[XXX].x*x*x*x +
- a[XXZ].x*x*x*z + a[XZ].x*x*z + a[XZZ].x*x*z*z + a[Z].x*z +
- a[ZZ].x*z*z + a[ZZZ].x*z*z*z + a[SINY].x*sin(y);
-
- d.y = a[C].y;
-
- d.z = a[C].z + a[X].z*x + a[XX].z*x*x + a[XXX].z*x*x*x +
- a[XXZ].z*x*x*z + a[XZ].z*x*z + a[XZZ].z*x*z*z + a[Z].z*z +
- a[ZZ].z*z*z + a[ZZZ].z*z*z*z;
-
- return d;
-}
-
-/* Numerical integration of the ODE using 2nd order Runge Kutta.
- Returns length^2 of the update, so that we can detect if the step
- size needs reducing. */
-static double
-Iterate(dvector *p, dvector(*ODE)(Par par, double x, double y, double z),
- Par par, double step)
-{
- dvector k1, k2, k3;
-
- k1 = ODE(par, p->x, p->y, p->z);
- k1.x *= step;
- k1.y *= step;
- k1.z *= step;
- k2 = ODE(par, p->x + k1.x, p->y + k1.y, p->z + k1.z);
- k2.x *= step;
- k2.y *= step;
- k2.z *= step;
- k3.x = (k1.x + k2.x) / 2.0;
- k3.y = (k1.y + k2.y) / 2.0;
- k3.z = (k1.z + k2.z) / 2.0;
-
- p->x += k3.x;
- p->y += k3.y;
- p->z += k3.z;
-
- return k3.x*k3.x + k3.y*k3.y + k3.z*k3.z;
-}
-
-/* Memory functions */
-
-#define deallocate(p,t) if (p!=NULL) {free(p); p=(t*)NULL; }
-#define allocate(p,t,s) if ((p=(t*)malloc(sizeof(t)*s))==NULL)\
-{free_flow(mi);return;}
-
-ENTRYPOINT void
-free_flow(ModeInfo * mi)
-{
- flowstruct *sp = &flows[MI_SCREEN(mi)];
- deallocate(sp->csegs, XSegment);
- deallocate(sp->cnsegs, int);
- deallocate(sp->old_segs, XSegment);
- deallocate(sp->p, dvector);
-}
-
-/* Generate Gaussian random number: mean 0, "amplitude" A (actually
- A is 3*standard deviation). */
-
-/* Note this generates a pair of gaussian variables, so it saves one
- to give out next time it's called */
-static double
-Gauss_Rand(double A)
-{
- static double d;
- static Bool ready = 0;
- if(ready) {
- ready = 0;
- return A/3 * d;
- } else {
- double x, y, w;
- do {
- x = 2.0 * (double)LRAND() / MAXRAND - 1.0;
- y = 2.0 * (double)LRAND() / MAXRAND - 1.0;
- w = x*x + y*y;
- } while(w >= 1.0);
-
- w = sqrt((-2 * log(w))/w);
- ready = 1;
- d = x * w;
- return A/3 * y * w;
- }
-}
-
-/* Attempt to discover new atractors by sending a pair of bees on a
- fast trip through the new flow and computing their Lyapunov
- exponent. Returns False if the bees fly away.
-
- If the bees stay bounded, the new bounds and the Lyapunov exponent
- are stored in sp and the function returns True.
-
- Repeat invocations continue the flow and improve the accuracy of
- the bounds and the Lyapunov exponent. Set sp->count2 to zero to
- start a new test.
-
- Acts on alternate variable set, so that it can be run in parallel
- with the main flow */
-
-static Bool
-discover(ModeInfo * mi)
-{
- flowstruct *sp;
- double l = 0;
- dvector dl;
- dvector max, min;
- double dl2, df, rs, lsum = 0, s, maxv2 = 0, v2;
-
- int N, i, nl = 0;
-
- if (flows == NULL)
- return 0;
- sp = &flows[MI_SCREEN(mi)];
-
- if(sp->count2 == 0) {
- /* initial conditions */
- sp->p2[0].x = Gauss_Rand(sp->range.x);
- sp->p2[0].y = (sp->yperiod > 0)?
- balance_rand(sp->range.y) : Gauss_Rand(sp->range.y);
- sp->p2[0].z = Gauss_Rand(sp->range.z);
-
- /* 1000 steps to find an attractor */
- /* Most cases explode out here */
- for(N=0; N < 1000; N++){
- Iterate(sp->p2, sp->ODE, sp->par2, sp->step2);
- if(sp->yperiod > 0 && sp->p2[0].y > sp->yperiod)
- sp->p2[0].y -= sp->yperiod;
- if(fabs(sp->p2[0].x) > LOST_IN_SPACE ||
- fabs(sp->p2[0].y) > LOST_IN_SPACE ||
- fabs(sp->p2[0].z) > LOST_IN_SPACE) {
- return 0;
- }
- sp->count2++;
- }
- /* Small perturbation */
- sp->p2[1].x = sp->p2[0].x + 0.000001;
- sp->p2[1].y = sp->p2[0].y;
- sp->p2[1].z = sp->p2[0].z;
- }
-
- /* Reset bounding box */
- max.x = min.x = sp->p2[0].x;
- max.y = min.y = sp->p2[0].y;
- max.z = min.z = sp->p2[0].z;
-
- /* Compute Lyapunov Exponent */
-
- /* (Technically, we're only estimating the largest Lyapunov
- Exponent, but that's all we need to know to determine if we
- have a strange attractor.) [TDA] */
-
- /* Fly two bees close together */
- for(N=0; N < 5000; N++){
- for(i=0; i< 2; i++) {
- v2 = Iterate(sp->p2+i, sp->ODE, sp->par2, sp->step2);
- if(sp->yperiod > 0 && sp->p2[i].y > sp->yperiod)
- sp->p2[i].y -= sp->yperiod;
-
- if(fabs(sp->p2[i].x) > LOST_IN_SPACE ||
- fabs(sp->p2[i].y) > LOST_IN_SPACE ||
- fabs(sp->p2[i].z) > LOST_IN_SPACE) {
- return 0;
- }
- if(v2 > maxv2) maxv2 = v2; /* Track max v^2 */
- }
-
- /* find bounding box */
- if ( sp->p2[0].x < min.x ) min.x = sp->p2[0].x;
- else if ( sp->p2[0].x > max.x ) max.x = sp->p2[0].x;
- if ( sp->p2[0].y < min.y ) min.y = sp->p2[0].y;
- else if ( sp->p2[0].y > max.y ) max.y = sp->p2[0].y;
- if ( sp->p2[0].z < min.z ) min.z = sp->p2[0].z;
- else if ( sp->p2[0].z > max.z ) max.z = sp->p2[0].z;
-
- /* Measure how much we have to pull the two bees to prevent
- them diverging. */
- dl.x = sp->p2[1].x - sp->p2[0].x;
- dl.y = sp->p2[1].y - sp->p2[0].y;
- dl.z = sp->p2[1].z - sp->p2[0].z;
-
- dl2 = dl.x*dl.x + dl.y*dl.y + dl.z*dl.z;
- if(dl2 > 0) {
- df = 1e12 * dl2;
- rs = 1/sqrt(df);
- sp->p2[1].x = sp->p2[0].x + rs * dl.x;
- sp->p2[1].y = sp->p2[0].y + rs * dl.y;
- sp->p2[1].z = sp->p2[0].z + rs * dl.z;
- lsum = lsum + log(df);
- nl = nl + 1;
- l = M_LOG2E / 2 * lsum / nl / sp->step2;
- }
- sp->count2++;
- }
- /* Anything that didn't explode has a finite attractor */
- /* If Lyapunov is negative then it probably hit a fixed point or a
- * limit cycle. Positive Lyapunov indicates a strange attractor. */
-
- sp->lyap2 = l;
-
- sp->size2 = max.x - min.x;
- s = max.y - min.y;
- if(s > sp->size2) sp->size2 = s;
- s = max.z - min.z;
- if(s > sp->size2) sp->size2 = s;
-
- sp->mid2.x = (max.x + min.x) / 2;
- sp->mid2.y = (max.y + min.y) / 2;
- sp->mid2.z = (max.z + min.z) / 2;
-
- if(sqrt(maxv2) > sp->size2 * 0.2) {
- /* Flowing too fast, reduce step size. This
- helps to eliminate high-speed limit cycles,
- which can show +ve Lyapunov due to integration
- inaccuracy. */
- sp->step2 /= 2;
- }
- return 1;
-}
-
-/* Sets up initial conditions for a flow without all the extra baggage
- that goes with init_flow */
-static void
-restart_flow(ModeInfo * mi)
-{
- flowstruct *sp;
- int b;
-
- if (flows == NULL)
- return;
- sp = &flows[MI_SCREEN(mi)];
- sp->count = 0;
-
- /* Re-Initialize point positions, velocities, etc. */
- for (b = 0; b < sp->beecount; b++) {
- X(0, b) = Gauss_Rand(sp->range.x);
- Y(0, b) = (sp->yperiod > 0)?
- balance_rand(sp->range.y) : Gauss_Rand(sp->range.y);
- Z(0, b) = Gauss_Rand(sp->range.z);
- }
-}
-
-/* Returns true if line was behind a clip plane, or it clips the line */
-/* nx,ny,nz is the normal to the plane. d is the distance from the origin */
-/* s and e are the end points of the line to be clipped */
-static int
-clip(double nx, double ny, double nz, double d, dvector *s, dvector *e)
-{
- int front1, front2;
- dvector w, p;
- double t;
-
- front1 = (nx*s->x + ny*s->y + nz*s->z >= -d);
- front2 = (nx*e->x + ny*e->y + nz*e->z >= -d);
- if (!front1 && !front2) return 1;
- if (front1 && front2) return 0;
- w.x = e->x - s->x;
- w.y = e->y - s->y;
- w.z = e->z - s->z;
-
- /* Find t in line equation */
- t = ( -d - nx*s->x - ny*s->y - nz*s->z) / ( nx*w.x + ny*w.y + nz*w.z);
-
- p.x = s->x + w.x * t;
- p.y = s->y + w.y * t;
- p.z = s->z + w.z * t;
-
- /* Move clipped point to the intersection */
- if (front2) {
- *s = p;
- } else {
- *e = p;
- }
- return 0;
-}
-
-/*
- * Public functions
- */
-
-ENTRYPOINT void
-init_flow (ModeInfo * mi)
-{
- flowstruct *sp;
- char *name;
-
- MI_INIT (mi, flows);
- sp = &flows[MI_SCREEN(mi)];
-
- sp->count2 = 0;
-
- sp->taillen = MI_SIZE(mi);
- if (sp->taillen < -MINTRAIL) {
- /* Change by sqrt so it seems more variable */
- sp->taillen = NRAND((int)sqrt((double) (-sp->taillen - MINTRAIL + 1)));
- sp->taillen = sp->taillen * sp->taillen + MINTRAIL;
- } else if (sp->taillen < MINTRAIL) {
- sp->taillen = MINTRAIL;
- }
-
- if(!rotatep && !ridep) rotatep = True; /* We need at least one viewpoint */
-
- /* Start camera at Orbit or Bee */
- if(rotatep) {
- sp->chaseto = ORBIT;
- } else {
- sp->chaseto = BEE;
- }
- sp->chasetime = 1; /* Go directly to target */
-
- sp->lyap = 0;
- sp->yperiod = 0;
- sp->step2 = INITIALSTEP;
-
- /* Zero parameter set */
- memset(sp->par2, 0, N_PARS * sizeof(dvector));
-
- /* Set up standard examples */
- switch (NRAND((periodicp) ? 5 : 3)) {
- case 0:
- /*
- x' = a(y - x)
- y' = x(b - z) - y
- z' = xy - cz
- */
- name = "Lorentz";
- sp->par2[Y].x = 10 + balance_rand(5*0); /* a */
- sp->par2[X].x = - sp->par2[Y].x; /* -a */
- sp->par2[X].y = 28 + balance_rand(5*0); /* b */
- sp->par2[XZ].y = -1;
- sp->par2[Y].y = -1;
- sp->par2[XY].z = 1;
- sp->par2[Z].z = - 2 + balance_rand(1*0); /* -c */
- break;
- case 1:
- /*
- x' = -(y + az)
- y' = x + by
- z' = c + z(x - 5.7)
- */
- name = "Rossler";
- sp->par2[Y].x = -1;
- sp->par2[Z].x = -2 + balance_rand(1); /* a */
- sp->par2[X].y = 1;
- sp->par2[Y].y = 0.2 + balance_rand(0.1); /* b */
- sp->par2[C].z = 0.2 + balance_rand(0.1); /* c */
- sp->par2[XZ].z = 1;
- sp->par2[Z].z = -5.7;
- break;
- case 2:
- /*
- x' = -(y + az)
- y' = x + by - cz^2
- z' = 0.2 + z(x - 5.7)
- */
- name = "RosslerCone";
- sp->par2[Y].x = -1;
- sp->par2[Z].x = -2; /* a */
- sp->par2[X].y = 1;
- sp->par2[Y].y = 0.2; /* b */
- sp->par2[ZZ].y = -0.331 + balance_rand(0.01); /* c */
- sp->par2[C].z = 0.2;
- sp->par2[XZ].z = 1;
- sp->par2[Z].z = -5.7;
- break;
- case 3:
- /*
- x' = -z + b sin(y)
- y' = c
- z' = 0.7x + az(0.1 - x^2)
- */
- name = "Birkhoff";
- sp->par2[Z].x = -1;
- sp->par2[SINY].x = 0.35 + balance_rand(0.25); /* b */
- sp->par2[C].y = 1.57; /* c */
- sp->par2[X].z = 0.7;
- sp->par2[Z].z = 1 + balance_rand(0.5); /* a/10 */
- sp->par2[XXZ].z = -10 * sp->par2[Z].z; /* -a */
- sp->yperiod = 2 * M_PI;
- break;
- default:
- /*
- x' = -ax - z/2 - z^3/8 + b sin(y)
- y' = c
- z' = 2x
- */
- name = "Duffing";
- sp->par2[X].x = -0.2 + balance_rand(0.1); /* a */
- sp->par2[Z].x = -0.5;
- sp->par2[ZZZ].x = -0.125;
- sp->par2[SINY].x = 27.0 + balance_rand(3.0); /* b */
- sp->par2[C].y = 1.33; /* c */
- sp->par2[X].z = 2;
- sp->yperiod = 2 * M_PI;
- break;
-
- }
-
- sp->range.x = 5;
- sp->range.z = 5;
-
- if(sp->yperiod > 0) {
- sp->ODE = Periodic;
- /* periodic flows show either uniform distribution or a
- snapshot on the 'time' axis */
- sp->range.y = NRAND(2)? sp->yperiod : 0;
- } else {
- sp->range.y = 5;
- sp->ODE = Cubic;
- }
-
- /* Run discoverer to set up bounding box, etc. Lyapunov will
- probably be innaccurate, since we're only running it once, but
- we're using known strange attractors so it should be ok. */
- discover(mi);
- if(MI_IS_VERBOSE(mi))
- fprintf(stdout,
- "flow: Lyapunov exponent: %g, step: %g, size: %g (%s)\n",
- sp->lyap2, sp->step2, sp->size2, name);
- /* Install new params */
- sp->lyap = sp->lyap2;
- sp->size = sp->size2;
- sp->mid = sp->mid2;
- sp->step = sp->step2;
- memcpy(sp->par, sp->par2, sizeof(sp->par2));
-
- sp->count2 = 0; /* Reset search */
-
- sp->beecount = MI_COUNT(mi);
- if (!sp->beecount) {
- sp->beecount = 1; /* The camera requires 1 or more */
- } else if (sp->beecount < 0) { /* random variations */
- sp->beecount = NRAND(-sp->beecount) + 1; /* Minimum 1 */
- }
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- dbufp = False;
-# endif
-
- if(dbufp) { /* Set up double buffer */
- if (sp->buffer != None)
- XFreePixmap(MI_DISPLAY(mi), sp->buffer);
- sp->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
- MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
- } else {
- sp->buffer = MI_WINDOW(mi);
- }
- /* no "NoExpose" events from XCopyArea wanted */
- XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
-
- /* Make sure we're using 'thin' lines */
- XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
- JoinMiter);
-
- /* Clear the background (may be slow depending on user prefs). */
- MI_CLEARWINDOW(mi);
-
- /* Allocate memory. */
- if (sp->csegs == NULL) {
- allocate(sp->csegs, XSegment,
- (sp->beecount + BOX_L) * MI_NPIXELS(mi) * sp->taillen);
- allocate(sp->cnsegs, int, MI_NPIXELS(mi));
- allocate(sp->old_segs, XSegment, (sp->beecount + BOX_L) * sp->taillen);
- allocate(sp->p, dvector, sp->beecount * sp->taillen);
- }
-
- /* Initialize point positions, velocities, etc. */
- restart_flow(mi);
-
- /* Set up camera tail */
- X(1, 0) = sp->cam[1].x = 0;
- Y(1, 0) = sp->cam[1].y = 0;
- Z(1, 0) = sp->cam[1].z = 0;
-}
-
-ENTRYPOINT void
-draw_flow (ModeInfo * mi)
-{
- int b, i;
- int col, begin, end;
- double M[3][3]; /* transformation matrix */
- flowstruct *sp = NULL;
- int swarm = 0;
- int segindex;
-
- if (flows == NULL)
- return;
- sp = &flows[MI_SCREEN(mi)];
- if (sp->csegs == NULL)
- return;
-
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
-#endif
-
- /* multiplier for indexing segment arrays. Used in IX macro, etc. */
- segindex = (sp->beecount + BOX_L) * sp->taillen;
-
- if(searchp){
- if(sp->count2 == 0) { /* start new search */
- sp->step2 = INITIALSTEP;
- /* Pick random parameters. Actual range is irrelevant
- since parameter scale determines flow speed but not
- structure. */
- for(i=0; i< N_PARS; i++) {
- sp->par2[i].x = Gauss_Rand(1.0);
- sp->par2[i].y = Gauss_Rand(1.0);
- sp->par2[i].z = Gauss_Rand(1.0);
- }
- }
- if(!discover(mi)) { /* Flow exploded, reset. */
- sp->count2 = 0;
- } else {
- if(sp->lyap2 < 0) {
- sp->count2 = 0; /* Attractor found, but it's not strange */
- }else if(sp->count2 > 1000000) { /* This one will do */
- sp->count2 = 0; /* Reset search */
- if(MI_IS_VERBOSE(mi))
- fprintf(stdout,
- "flow: Lyapunov exponent: %g, step: %g, size: %g (unnamed)\n",
- sp->lyap2, sp->step2, sp->size2);
- /* Install new params */
- sp->lyap = sp->lyap2;
- sp->size = sp->size2;
- sp->mid = sp->mid2;
- sp->step = sp->step2;
- memcpy(sp->par, sp->par2, sizeof(sp->par2));
-
- /* If we're allowed to zoom out, do so now, so that we
- get a look at the new attractor. */
- if(sp->chaseto == BEE && rotatep) {
- sp->chaseto = ORBIT;
- sp->chasetime = 100;
- }
- /* Reset initial conditions, so we don't get
- misleading artifacts in the particle density. */
- restart_flow(mi);
- }
- }
- }
-
- /* Reset segment buffers */
- for (col = 0; col < MI_NPIXELS(mi); col++)
- sp->cnsegs[col] = 0;
-
- MI_IS_DRAWN(mi) = True;
-
- /* Calculate circling POV [Chalky]*/
- sp->circle[1] = sp->circle[0];
- sp->circle[0].x = sp->size * 2 * sin(sp->count / 100.0) *
- (-0.6 + 0.4 *cos(sp->count / 500.0)) + sp->mid.x;
- sp->circle[0].y = sp->size * 2 * cos(sp->count / 100.0) *
- (0.6 + 0.4 *cos(sp->count / 500.0)) + sp->mid.y;
- sp->circle[0].z = sp->size * 2 * sin(sp->count / 421.0) + sp->mid.z;
-
- /* Timed chase instead of Chalkie's Bistable oscillator [TDA] */
- if(rotatep && ridep) {
- if(sp->chaseto == BEE && NRAND(1000) == 0){
- sp->chaseto = ORBIT;
- sp->chasetime = 100;
- }else if(NRAND(4000) == 0){
- sp->chaseto = BEE;
- sp->chasetime = 100;
- }
- }
-
- /* Set up orientation matrix */
- {
- double x[3], p[3], x2=0, xp=0;
- int j;
-
- /* Chasetime is here to guarantee the camera makes it all the
- way to the target in a finite number of steps. */
- if(sp->chasetime > 1)
- sp->chasetime--;
-
- if(sp->chaseto == BEE){
- /* Camera Head targets bee 0 */
- sp->cam[0].x += (X(0, 0) - sp->cam[0].x)/sp->chasetime;
- sp->cam[0].y += (Y(0, 0) - sp->cam[0].y)/sp->chasetime;
- sp->cam[0].z += (Z(0, 0) - sp->cam[0].z)/sp->chasetime;
-
- /* Camera Tail targets previous position of bee 0 */
- sp->cam[1].x += (X(1, 0) - sp->cam[1].x)/sp->chasetime;
- sp->cam[1].y += (Y(1, 0) - sp->cam[1].y)/sp->chasetime;
- sp->cam[1].z += (Z(1, 0) - sp->cam[1].z)/sp->chasetime;
-
- /* Camera Wing targets bee 1 */
- sp->cam[2].x += (X(0, 1) - sp->cam[2].x)/sp->chasetime;
- sp->cam[2].y += (Y(0, 1) - sp->cam[2].y)/sp->chasetime;
- sp->cam[2].z += (Z(0, 1) - sp->cam[2].z)/sp->chasetime;
- } else {
- /* Camera Head targets Orbiter */
- sp->cam[0].x += (sp->circle[0].x - sp->cam[0].x)/sp->chasetime;
- sp->cam[0].y += (sp->circle[0].y - sp->cam[0].y)/sp->chasetime;
- sp->cam[0].z += (sp->circle[0].z - sp->cam[0].z)/sp->chasetime;
-
- /* Camera Tail targets diametrically opposite the middle
- of the bounding box from the Orbiter */
- sp->cam[1].x +=
- (2*sp->circle[0].x - sp->mid.x - sp->cam[1].x)/sp->chasetime;
- sp->cam[1].y +=
- (2*sp->circle[0].y - sp->mid.y - sp->cam[1].y)/sp->chasetime;
- sp->cam[1].z +=
- (2*sp->circle[0].z - sp->mid.z - sp->cam[1].z)/sp->chasetime;
- /* Camera Wing targets previous position of Orbiter */
- sp->cam[2].x += (sp->circle[1].x - sp->cam[2].x)/sp->chasetime;
- sp->cam[2].y += (sp->circle[1].y - sp->cam[2].y)/sp->chasetime;
- sp->cam[2].z += (sp->circle[1].z - sp->cam[2].z)/sp->chasetime;
- }
-
- /* Viewpoint from Tail of camera */
- sp->centre.x=sp->cam[1].x;
- sp->centre.y=sp->cam[1].y;
- sp->centre.z=sp->cam[1].z;
-
- /* forward vector */
- x[0] = sp->cam[0].x - sp->cam[1].x;
- x[1] = sp->cam[0].y - sp->cam[1].y;
- x[2] = sp->cam[0].z - sp->cam[1].z;
-
- /* side */
- p[0] = sp->cam[2].x - sp->cam[1].x;
- p[1] = sp->cam[2].y - sp->cam[1].y;
- p[2] = sp->cam[2].z - sp->cam[1].z;
-
-
- /* So long as X and P don't collide, these can be used to form
- three mutually othogonal axes: X, (X x P) x X and X x P.
- After being normalised to unit length, these form the
- Orientation Matrix. */
-
- for(i=0; i<3; i++){
- x2+= x[i]*x[i]; /* X . X */
- xp+= x[i]*p[i]; /* X . P */
- M[0][i] = x[i]; /* X */
- }
-
- for(i=0; i<3; i++) /* (X x P) x X */
- M[1][i] = x2*p[i] - xp*x[i]; /* == (X . X) P - (X . P) X */
-
- M[2][0] = x[1]*p[2] - x[2]*p[1]; /* X x P */
- M[2][1] = -x[0]*p[2] + x[2]*p[0];
- M[2][2] = x[0]*p[1] - x[1]*p[0];
-
- /* normalise axes */
- for(j=0; j<3; j++){
- double A=0;
- for(i=0; i<3; i++) A+=M[j][i]*M[j][i]; /* sum squares */
- A=sqrt(A);
- if(A>0)
- for(i=0; i<3; i++) M[j][i]/=A;
- }
-
- if(sp->chaseto == BEE) {
- X(0, 1)=X(0, 0)+M[1][0]*sp->step; /* adjust neighbour */
- Y(0, 1)=Y(0, 0)+M[1][1]*sp->step;
- Z(0, 1)=Z(0, 0)+M[1][2]*sp->step;
- }
- }
-
- /* <=- Bounding Box -=> */
- if(boxp) {
- for (b = 0; b < BOX_L; b++) {
-
- /* Chalky's clipping code, Only used for the box */
- /* clipping trails is slow and of little benefit. [TDA] */
- int p1 = lines[b][0];
- int p2 = lines[b][1];
- dvector A1, A2;
- double x1=box[p1][0]* sp->size/2 + sp->mid.x - sp->centre.x;
- double y1=box[p1][1]* sp->size/2 + sp->mid.y - sp->centre.y;
- double z1=box[p1][2]* sp->size/2 + sp->mid.z - sp->centre.z;
- double x2=box[p2][0]* sp->size/2 + sp->mid.x - sp->centre.x;
- double y2=box[p2][1]* sp->size/2 + sp->mid.y - sp->centre.y;
- double z2=box[p2][2]* sp->size/2 + sp->mid.z - sp->centre.z;
-
- A1.x=M[0][0]*x1 + M[0][1]*y1 + M[0][2]*z1;
- A1.y=M[1][0]*x1 + M[1][1]*y1 + M[1][2]*z1;
- A1.z=M[2][0]*x1 + M[2][1]*y1 + M[2][2]*z1 + EYEHEIGHT * sp->size;
- A2.x=M[0][0]*x2 + M[0][1]*y2 + M[0][2]*z2;
- A2.y=M[1][0]*x2 + M[1][1]*y2 + M[1][2]*z2;
- A2.z=M[2][0]*x2 + M[2][1]*y2 + M[2][2]*z2 + EYEHEIGHT * sp->size;
-
- /* Clip in 3D before projecting down to 2D. A 2D clip
- after projection wouldn't be able to handle lines that
- cross x=0 */
- if (clip(1, 0, 0,-1, &A1, &A2) || /* Screen */
- clip(1, 2, 0, 0, &A1, &A2) || /* Left */
- clip(1,-2, 0, 0, &A1, &A2) || /* Right */
- clip(1,0, 2.0*MI_WIDTH(mi)/MI_HEIGHT(mi), 0, &A1, &A2)||/*UP*/
- clip(1,0,-2.0*MI_WIDTH(mi)/MI_HEIGHT(mi), 0, &A1, &A2))/*Down*/
- continue;
-
- /* Colour according to bee */
- col = b % (MI_NPIXELS(mi) - 1);
-
- sp->csegs[IX(col)].x1 = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * A1.y/A1.x;
- sp->csegs[IX(col)].y1 = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * A1.z/A1.x;
- sp->csegs[IX(col)].x2 = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * A2.y/A2.x;
- sp->csegs[IX(col)].y2 = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * A2.z/A2.x;
- sp->cnsegs[col]++;
- }
- }
-
- /* <=- Bees -=> */
- for (b = 0; b < sp->beecount; b++) {
- if(fabs(X(0, b)) > LOST_IN_SPACE ||
- fabs(Y(0, b)) > LOST_IN_SPACE ||
- fabs(Z(0, b)) > LOST_IN_SPACE){
- if(sp->chaseto == BEE && b == 0){
- /* Lost camera bee. Need to replace it since
- rerunning init_flow could lose us a hard-won new
- attractor. Try moving it very close to a random
- other bee. This way we have a good chance of being
- close to the attractor and not forming a false
- artifact. If we've lost many bees this may need to
- be repeated. */
- /* Don't worry about camera wingbee. It stays close
- to the main camera bee no matter what happens. */
- int newb = 1 + NRAND(sp->beecount - 1);
- X(0, 0) = X(0, newb) + 0.001;
- Y(0, 0) = Y(0, newb);
- Z(0, 0) = Z(0, newb);
- if(MI_IS_VERBOSE(mi))
- fprintf(stdout,
- "flow: resetting lost camera near bee %d\n",
- newb);
- }
- continue;
- }
-
- /* Age the tail. It's critical this be fast since
- beecount*taillen can be large. */
- memmove(B(1, b), B(0, b), (sp->taillen - 1) * sizeof(dvector));
-
- Iterate(B(0,b), sp->ODE, sp->par, sp->step);
-
- /* Don't show wingbee since he's not quite in the flow. */
- if(sp->chaseto == BEE && b == 1) continue;
-
- /* Colour according to bee */
- col = b % (MI_NPIXELS(mi) - 1);
-
- /* Fill the segment lists. */
-
- begin = 0; /* begin new trail */
- end = MIN(sp->taillen, sp->count); /* short trails at first */
- for(i=0; i < end; i++){
- double x = X(i,b)-sp->centre.x;
- double y = Y(i,b)*(sp->yperiod < 0? (sp->size/sp->yperiod) :1)
- -sp->centre.y;
- double z = Z(i,b)-sp->centre.z;
- double XM=M[0][0]*x + M[0][1]*y + M[0][2]*z;
- double YM=M[1][0]*x + M[1][1]*y + M[1][2]*z;
- double ZM=M[2][0]*x + M[2][1]*y + M[2][2]*z + EYEHEIGHT * sp->size;
- short absx, absy;
-
- swarm++; /* count the remaining bees */
- if(sp->yperiod > 0 && Y(i,b) > sp->yperiod){
- int j;
- Y(i,b) -= sp->yperiod;
- /* hide tail to prevent streaks in Y. Streaks in X,Z
- are ok, they help to outline the Poincare'
- slice. */
- for(j = i; j < end; j++) Y(j,b) = Y(i,b);
- /*begin = i + 1;*/
- break;
- }
-
- if(XM <= 0){ /* off screen - new trail */
- begin = i + 1;
- continue;
- }
- absx = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * YM/XM;
- absy = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * ZM/XM;
- /* Performance bottleneck */
- if(absx <= 0 || absx >= MI_WIDTH(mi) ||
- absy <= 0 || absy >= MI_HEIGHT(mi)) {
- /* off screen - new trail */
- begin = i + 1;
- continue;
- }
- if(i > begin) { /* complete previous segment */
- sp->csegs[IX(col)].x2 = absx;
- sp->csegs[IX(col)].y2 = absy;
- sp->cnsegs[col]++;
- }
-
- if(i < end -1){ /* start new segment */
- sp->csegs[IX(col)].x1 = absx;
- sp->csegs[IX(col)].y1 = absy;
- }
- }
- }
-
- /* Erase */
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
- if (dbufp) { /* In Double Buffer case, prepare off-screen copy */
- /* For slow systems, this can be the single biggest bottleneck
- in the program. These systems may be better of not using
- the double buffer. */
- XFillRectangle(MI_DISPLAY(mi), sp->buffer, MI_GC(mi), 0, 0,
- MI_WIDTH(mi), MI_HEIGHT(mi));
- } else { /* Otherwise, erase previous segment list directly */
- XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
- sp->old_segs, sp->nold_segs);
- }
-
- /* Render */
- if (MI_NPIXELS(mi) > 2){ /* colour */
- int mn = 0;
- for (col = 0; col < MI_NPIXELS(mi) - 1; col++)
- if (sp->cnsegs[col] > 0) {
- if(sp->cnsegs[col] > mn) mn = sp->cnsegs[col];
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, col+1));
- /* This is usually the biggest bottleneck on most
- systems. The maths load is insignificant compared
- to this. */
- XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
- sp->csegs + col * segindex, sp->cnsegs[col]);
- }
- } else { /* mono handled seperately since xlockmore uses '1' for
- mono white! */
- XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
- XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
- sp->csegs, sp->cnsegs[0]);
- }
- if (dbufp) { /* In Double Buffer case, this updates the screen */
- XCopyArea(MI_DISPLAY(mi), sp->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
- MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
- } else { /* Otherwise, screen is already updated. Copy segments
- to erase-list to be erased directly next time. */
- int c = 0;
- for (col = 0; col < MI_NPIXELS(mi) - 1; col++) {
- memcpy(sp->old_segs + c, sp->csegs + col * segindex,
- sp->cnsegs[col] * sizeof(XSegment));
- c += sp->cnsegs[col];
- }
- sp->nold_segs = c;
- }
-
- if(sp->count > 1 && swarm == 0) { /* all gone */
- if(MI_IS_VERBOSE(mi))
- fprintf(stdout, "flow: all gone at %d\n", sp->count);
- init_flow(mi);
- }
-
- if(sp->count++ > MI_CYCLES(mi)){ /* Time's up. If we haven't
- found anything new by now we
- should pick a new standard
- flow */
- init_flow(mi);
- }
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_flow (ModeInfo * mi)
-{
- if(!dbufp) MI_CLEARWINDOW(mi);
-}
-#endif
-
-XSCREENSAVER_MODULE ("Flow", flow)
-
-#endif /* MODE_flow */
diff --git a/hacks/flow.man b/hacks/flow.man
deleted file mode 100644
index afe0771..0000000
--- a/hacks/flow.man
+++ /dev/null
@@ -1,137 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-flow \- strange attractors.
-.SH SYNOPSIS
-.B flow
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-periodic|\-no\-periodic]
-[\-search|\-no\-search]
-[\-rotate|\-no\-rotate]
-[\-ride|\-no\-ride]
-[\-box|\-no\-box]
-[\-dbuf|\-no\-dbuf]
-[\-ncolors \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Strange attractors formed of flows in a 3D differential equation phase
-space. Features the popular attractors described by \fBLorentz\fP,
-\fBRoessler\fP, \fBBirkhoff\fP and \fBDuffing\fP, and can discover
-entirely new attractors by itself.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-Number of particles in the flow. Default: 3000
-.TP 8
-.B \-size \fInumber\fP
-Length of particle trails. Negative values indicate
-randomness. The computational load of a given flow depends on
-(particle count) * (trail length). Default: -10
-.TP 8
-.B \-cycles \fInumber\fP
-Timeout before changing objects. 0 - 800000. Default: 10000.
-.TP 8
-.B \-periodic
-.TP 8
-.B \-no\-periodic
-turn on/off periodic attractors. These are flows in 2 dependent
-variables, with a periodic dependence on a third independent variable
-(eg time). Flow will sometimes choose to start all the particles in
-the same phase to illustrate the flow's cross-section. Default:
-on
-.TP 8
-.B \-search
-.TP 8
-.B \-no\-search
-turn on/off search for new attractors. If this is enabled, a fraction
-of the computing cycles is directed to searching a 60-dimensional
-parameter space for new strange attractors. If periodic flows are
-enabled, these can be searched too. Watch carefully - you are quite
-likely to see mathematical objects that have never been seen before,
-and since the parameters are not recorded, you'll probably never see
-them again! Default: on
-.TP 8
-.B \-rotate
-.TP 8
-.B \-no\-rotate
-turn on/off rotating around attractor. Default: on
-.TP 8
-.B \-ride
-.TP 8
-.B \-no\-ride
-turn on/off ride in the flow. Default: on
-
-If both -rotate and -ride are enabled the viewpoint will occasionally
-fly between the two views.
-.TP 8
-.B \-box
-.TP 8
-.B \-no\-box
-turn on/off bounding box. Default: on
-.TP 8
-.B \-dbuf
-.TP 8
-.B \-no\-dbuf
-turn on/off double buffering. If Flow runs slowly in full screen, but
-fast in a smaller window (eg on old graphics cards with too little
-memory), try turning this option off. Default: on
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of Colors. Default: 200.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright (c) 1996 by Tim Auckland <Tim.Auckland@Procket.com>
-Incorporating some code from Stephen Davies Copyright (c) 2000
-
-Search code based on techniques described in "Strange Attractors:
-Creating Patterns in Chaos" by Julien C. Sprott
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-
-This file is provided AS IS with no warranties of any kind. The author
-shall have no liability with respect to the infringement of copyrights,
-trade secrets or any patents by this file or any part thereof. In no
-event will the author be liable for any lost revenue or profits or
-other special, indirect and consequential damages.
-
-Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
-
-Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org).
-.SH AUTHOR
-Tim Auckland
diff --git a/hacks/fluidballs.c b/hacks/fluidballs.c
deleted file mode 100644
index c42632a..0000000
--- a/hacks/fluidballs.c
+++ /dev/null
@@ -1,877 +0,0 @@
-/* fluidballs, Copyright (c) 2000 by Peter Birtles <peter@bqdesign.com.au>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Ported to X11 and xscreensaver by jwz, 27-Feb-2002.
- *
- * http://astronomy.swin.edu.au/~pbourke/modelling/fluid/
- *
- * Some physics improvements by Steven Barker <steve@blckknght.org>
- */
-
-/* Future ideas:
- * Specifying a distribution in the ball sizes (with a gamma curve, possibly).
- * Brownian motion, for that extra touch of realism.
- *
- * It would be nice to detect when there are more balls than fit in
- * the window, and scale the number of balls back. Useful for the
- * xscreensaver-settings preview, which is often too tight by default.
- */
-
-#include <math.h>
-#include "screenhack.h"
-#include <stdio.h>
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-#include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-typedef struct {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
- int delay;
-
- Pixmap b, ba; /* double-buffer to reduce flicker */
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- XdbeBackBuffer backb;
- Bool dbeclear_p;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- GC draw_gc; /* most of the balls */
- GC draw_gc2; /* the ball being dragged with the mouse */
- GC erase_gc;
- XColor fg;
- XColor fg2;
-
- int count; /* number of balls */
- float xmin, ymin; /* rectangle of window, relative to root */
- float xmax, ymax;
-
- int mouse_ball; /* index of ball being dragged, or 0 if none. */
-
- float tc; /* time constant (time-warp multiplier) */
- float accx; /* horizontal acceleration (wind) */
- float accy; /* vertical acceleration (gravity) */
-
- float *vx, *vy; /* current ball velocities */
- float *px, *py; /* current ball positions */
- float *opx, *opy; /* previous ball positions */
- float *r; /* ball radiuses */
-
- float *m; /* ball mass, precalculated */
- float e; /* coeficient of elasticity */
- float max_radius; /* largest radius of any ball */
-
- Bool random_sizes_p; /* Whether balls should be various sizes up to max. */
- Bool shake_p; /* Whether to mess with gravity when things settle. */
- Bool dbuf; /* Whether we're using double buffering. */
- float shake_threshold;
- int time_since_shake;
-
- Bool fps_p; /* Whether to draw some text at the bottom. */
- XftColor xft_fg;
- XftDraw *xftdraw;
- XftFont *font;
- int font_height;
- int font_baseline;
- int frame_count;
- int collision_count;
- char fps_str[1024];
-
- int time_tick;
- struct timeval last_time;
-
-} b_state;
-
-
-/* Draws the frames per second string */
-static void
-draw_fps_string (b_state *state)
-{
- XFillRectangle (state->dpy, state->b, state->erase_gc,
- 0, state->xgwa.height - state->font_height*3 - 20,
- state->xgwa.width, state->font_height*3 + 20);
- XftDrawStringUtf8 (state->xftdraw, &state->xft_fg, state->font,
- 10, state->xgwa.height - state->font_height*2 -
- state->font_baseline - 10,
- (FcChar8 *) state->fps_str, strlen(state->fps_str));
-}
-
-/* Finds the origin of the window relative to the root window, by
- walking up the window tree until it reaches the top.
- */
-static void
-window_origin (Display *dpy, Window window, int *x, int *y)
-{
- XTranslateCoordinates (dpy, window, RootWindow (dpy, DefaultScreen (dpy)),
- 0, 0, x, y, &window);
-}
-
-
-/* Queries the window position to see if the window has moved or resized.
- We poll this instead of waiting for ConfigureNotify events, because
- when the window manager moves the window, only one ConfigureNotify
- comes in: at the end of the motion. If we poll, we can react to the
- new position while the window is still being moved. (Assuming the WM
- does OpaqueMove, of course.)
- */
-static void
-check_window_moved (b_state *state)
-{
- float oxmin = state->xmin;
- float oxmax = state->xmax;
- float oymin = state->ymin;
- float oymax = state->ymax;
- int wx, wy;
- XGetWindowAttributes (state->dpy, state->window, &state->xgwa);
- window_origin (state->dpy, state->window, &wx, &wy);
- state->xmin = wx;
- state->ymin = wy;
- state->xmax = state->xmin + state->xgwa.width;
- state->ymax = state->ymin + state->xgwa.height - (state->font_height*3) -
- (state->font_height ? 22 : 0);
-
- if (state->dbuf && (state->ba))
- {
- if (oxmax != state->xmax || oymax != state->ymax)
- {
- XFreePixmap (state->dpy, state->ba);
- state->ba = XCreatePixmap (state->dpy, state->window,
- state->xgwa.width, state->xgwa.height,
- state->xgwa.depth);
- XFillRectangle (state->dpy, state->ba, state->erase_gc, 0, 0,
- state->xgwa.width, state->xgwa.height);
- state->b = state->ba;
- }
- }
- else
- {
- /* Only need to erase the window if the origin moved */
- if (oxmin != state->xmin || oymin != state->ymin)
- XClearWindow (state->dpy, state->window);
- else if (state->fps_p && oymax != state->ymax)
- XFillRectangle (state->dpy, state->b, state->erase_gc,
- 0, state->xgwa.height - state->font_height*3,
- state->xgwa.width, state->font_height*3);
- }
-}
-
-
-/* Returns the position of the mouse relative to the root window.
- */
-static void
-query_mouse (b_state *state, int *x, int *y)
-{
- Window root1, child1;
- int mouse_x, mouse_y, root_x, root_y;
- unsigned int mask;
- if (XQueryPointer (state->dpy, state->window, &root1, &child1,
- &root_x, &root_y, &mouse_x, &mouse_y, &mask))
- {
- *x = root_x;
- *y = root_y;
- }
- else
- {
- *x = -9999;
- *y = -9999;
- }
-}
-
-/* Re-pick the colors of the balls, and the mouse-ball.
- */
-static void
-recolor (b_state *state)
-{
- if (state->fg.flags)
- XFreeColors (state->dpy, state->xgwa.colormap, &state->fg.pixel, 1, 0);
- if (state->fg2.flags)
- XFreeColors (state->dpy, state->xgwa.colormap, &state->fg2.pixel, 1, 0);
-
- state->fg.flags = DoRed|DoGreen|DoBlue;
- state->fg.red = 0x8888 + (random() % 0x8888);
- state->fg.green = 0x8888 + (random() % 0x8888);
- state->fg.blue = 0x8888 + (random() % 0x8888);
-
- state->fg2.flags = DoRed|DoGreen|DoBlue;
- state->fg2.red = 0x8888 + (random() % 0x8888);
- state->fg2.green = 0x8888 + (random() % 0x8888);
- state->fg2.blue = 0x8888 + (random() % 0x8888);
-
- if (XAllocColor (state->dpy, state->xgwa.colormap, &state->fg))
- XSetForeground (state->dpy, state->draw_gc, state->fg.pixel);
-
- if (XAllocColor (state->dpy, state->xgwa.colormap, &state->fg2))
- XSetForeground (state->dpy, state->draw_gc2, state->fg2.pixel);
-}
-
-/* Initialize the state structure and various X data.
- */
-static void *
-fluidballs_init (Display *dpy, Window window)
-{
- int i;
- float extx, exty;
- b_state *state = (b_state *) calloc (1, sizeof(*state));
- XGCValues gcv;
-
- state->dpy = dpy;
- state->window = window;
- state->delay = get_integer_resource (dpy, "delay", "Integer");
-
- check_window_moved (state);
-
- state->dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- state->dbuf = False;
-# endif
-
- if (state->dbuf)
- {
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- state->dbeclear_p = get_boolean_resource (dpy, "useDBEClear", "Boolean");
- if (state->dbeclear_p)
- state->b = xdbe_get_backbuffer (dpy, window, XdbeBackground);
- else
- state->b = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
- state->backb = state->b;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- if (!state->b)
- {
- state->ba = XCreatePixmap (state->dpy, state->window,
- state->xgwa.width, state->xgwa.height,
- state->xgwa.depth);
- state->b = state->ba;
- }
- }
- else
- {
- state->b = state->window;
- }
-
- /* Select ButtonRelease events on the external window, if no other app has
- already selected it (only one app can select it at a time: BadAccess. */
-#if 0
- if (! (state->xgwa.all_event_masks & ButtonReleaseMask))
- XSelectInput (state->dpy, state->window,
- state->xgwa.your_event_mask | ButtonReleaseMask);
-#endif
-
- gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
- "foreground", "Foreground");
- gcv.background = get_pixel_resource(state->dpy, state->xgwa.colormap,
- "background", "Background");
- state->draw_gc = XCreateGC (state->dpy, state->b,
- GCForeground|GCBackground, &gcv);
-
- gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
- "mouseForeground", "MouseForeground");
- state->draw_gc2 = XCreateGC (state->dpy, state->b,
- GCForeground|GCBackground, &gcv);
-
- gcv.foreground = gcv.background;
- state->erase_gc = XCreateGC (state->dpy, state->b,
- GCForeground|GCBackground, &gcv);
-
-
- if (state->ba)
- XFillRectangle (state->dpy, state->ba, state->erase_gc, 0, 0,
- state->xgwa.width, state->xgwa.height);
-
- recolor (state);
-
- extx = state->xmax - state->xmin;
- exty = state->ymax - state->ymin;
-
- state->count = get_integer_resource (dpy, "count", "Count");
- if (state->count < 1) state->count = 20;
-
- state->max_radius = get_float_resource (dpy, "size", "Size") / 2;
- if (state->max_radius < 1.0) state->max_radius = 1.0;
-
- if (state->xgwa.width > 2560) state->max_radius *= 2; /* Retina displays */
-
- if (state->xgwa.width < 100 || state->xgwa.height < 100) /* tiny window */
- {
- if (state->max_radius > 5)
- state->max_radius = 5;
- }
-
- state->random_sizes_p = get_boolean_resource (dpy, "random", "Random");
-
- /* If the initial window size is too small to hold all these balls,
- make fewer of them...
- */
- {
- float r = (state->random_sizes_p
- ? state->max_radius * 0.7
- : state->max_radius);
- float ball_area = M_PI * r * r;
- float balls_area = state->count * ball_area;
- float window_area = state->xgwa.width * state->xgwa.height;
- window_area *= 0.75; /* don't pack it completely full */
- if (balls_area > window_area)
- state->count = window_area / ball_area;
- }
-
- state->accx = get_float_resource (dpy, "wind", "Wind");
- if (state->accx < -1.0 || state->accx > 1.0) state->accx = 0;
-
- state->accy = get_float_resource (dpy, "gravity", "Gravity");
- if (state->accy < -1.0 || state->accy > 1.0) state->accy = 0.01;
-
- state->e = get_float_resource (dpy, "elasticity", "Elacitcity");
- if (state->e < 0.2 || state->e > 1.0) state->e = 0.97;
-
- state->tc = get_float_resource (dpy, "timeScale", "TimeScale");
- if (state->tc <= 0 || state->tc > 10) state->tc = 1.0;
-
- state->shake_p = get_boolean_resource (dpy, "shake", "Shake");
- state->shake_threshold = get_float_resource (dpy, "shakeThreshold",
- "ShakeThreshold");
- state->time_tick = 999999;
-
-# ifdef HAVE_MOBILE /* Always obey real-world gravity */
- state->shake_p = False;
-# endif
-
-
- state->fps_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
- if (state->fps_p)
- {
- char *fontname = get_string_resource (dpy, "fpsFont", "Font");
- char *s;
- if (!fontname) fontname = "monospace bold 18";
- state->font =
- load_xft_font_retry (dpy, screen_number (state->xgwa.screen),
- fontname);
- if (!state->font) abort();
- s = get_string_resource (state->dpy, "textColor", "Foreground");
- if (!s) s = strdup ("white");
- XftColorAllocName (state->dpy, state->xgwa.visual, state->xgwa.colormap,
- s, &state->xft_fg);
- free (s);
- state->xftdraw = XftDrawCreate (state->dpy, state->window,
- state->xgwa.visual,
- state->xgwa.colormap);
- state->font_height = state->font->ascent + state->font->descent;
- state->font_baseline = state->font->descent;
- }
-
- state->m = (float *) malloc (sizeof (*state->m) * (state->count + 1));
- state->r = (float *) malloc (sizeof (*state->r) * (state->count + 1));
- state->vx = (float *) malloc (sizeof (*state->vx) * (state->count + 1));
- state->vy = (float *) malloc (sizeof (*state->vy) * (state->count + 1));
- state->px = (float *) malloc (sizeof (*state->px) * (state->count + 1));
- state->py = (float *) malloc (sizeof (*state->py) * (state->count + 1));
- state->opx = (float *) malloc (sizeof (*state->opx) * (state->count + 1));
- state->opy = (float *) malloc (sizeof (*state->opy) * (state->count + 1));
-
- for (i=1; i<=state->count; i++)
- {
- state->px[i] = frand(extx) + state->xmin;
- state->py[i] = frand(exty) + state->ymin;
- state->vx[i] = frand(0.2) - 0.1;
- state->vy[i] = frand(0.2) - 0.1;
-
- state->r[i] = (state->random_sizes_p
- ? ((0.2 + frand(0.8)) * state->max_radius)
- : state->max_radius);
- /*state->r[i] = pow(frand(1.0), state->sizegamma) * state->max_radius;*/
-
- /* state->m[i] = pow(state->r[i],2) * M_PI; */
- state->m[i] = pow(state->r[i],3) * M_PI * 1.3333;
- }
-
- memcpy (state->opx, state->px, sizeof (*state->opx) * (state->count + 1));
- memcpy (state->opy, state->py, sizeof (*state->opx) * (state->count + 1));
-
- return state;
-}
-
-
-/* Messes with gravity: permute "down" to be in a random direction.
- */
-static void
-shake (b_state *state)
-{
- float a = state->accx;
- float b = state->accy;
- int i = random() % 4;
-
- switch (i)
- {
- case 0:
- state->accx = a;
- state->accy = b;
- break;
- case 1:
- state->accx = -a;
- state->accy = -b;
- break;
- case 2:
- state->accx = b;
- state->accy = a;
- break;
- case 3:
- state->accx = -b;
- state->accy = -a;
- break;
- default:
- abort();
- break;
- }
-
- state->time_since_shake = 0;
- recolor (state);
-}
-
-
-/* Look at the current time, and update state->time_since_shake.
- Draw the FPS display if desired.
- */
-static void
-check_wall_clock (b_state *state, float max_d)
-{
- state->frame_count++;
-
-#if 0
- if (state->time_tick++ > 20) /* don't call gettimeofday() too often -- it's slow. */
-#endif
- {
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- if (state->last_time.tv_sec == 0)
- state->last_time = now;
-
- state->time_tick = 0;
-#if 0
- if (now.tv_sec == state->last_time.tv_sec)
- return;
-#endif
-
- state->time_since_shake += (now.tv_sec - state->last_time.tv_sec);
-
-# ifdef HAVE_MOBILE /* Always obey real-world gravity */
- {
- float a = fabs (fabs(state->accx) > fabs(state->accy)
- ? state->accx : state->accy);
- int rot = current_device_rotation();
- switch (rot) {
- case 0: case 360: state->accx = 0; state->accy = a; break;
- case -90: state->accx = -a; state->accy = 0; break;
- case 90: state->accx = a; state->accy = 0; break;
- case 180: case -180: state->accx = 0; state->accy = -a; break;
- default: break;
- }
- }
-# endif /* HAVE_MOBILE */
-
- if (state->fps_p)
- {
- float elapsed = ((now.tv_sec + (now.tv_usec / 1000000.0)) -
- (state->last_time.tv_sec + (state->last_time.tv_usec / 1000000.0)));
- float fps = state->frame_count / elapsed;
- float cps = state->collision_count / elapsed;
-
- sprintf (state->fps_str,
- "Collisions: %6.3f/frame Max motion: %6.3f",
- cps/fps, max_d);
-
- draw_fps_string(state);
- }
-
- state->frame_count = 0;
- state->collision_count = 0;
- state->last_time = now;
- }
-}
-
-/* Erases the balls at their previous positions, and draws the new ones.
- */
-static void
-repaint_balls (b_state *state)
-{
- int a;
-# ifndef HAVE_JWXYZ
- int x1a, x2a, y1a, y2a;
-# endif
- int x1b, x2b, y1b, y2b;
- float max_d = 0;
-
-#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- XClearWindow (state->dpy, state->b);
-#endif
-
- for (a=1; a <= state->count; a++)
- {
- GC gc;
-# ifndef HAVE_JWXYZ
- x1a = (state->opx[a] - state->r[a] - state->xmin);
- y1a = (state->opy[a] - state->r[a] - state->ymin);
- x2a = (state->opx[a] + state->r[a] - state->xmin);
- y2a = (state->opy[a] + state->r[a] - state->ymin);
-# endif
-
- x1b = (state->px[a] - state->r[a] - state->xmin);
- y1b = (state->py[a] - state->r[a] - state->ymin);
- x2b = (state->px[a] + state->r[a] - state->xmin);
- y2b = (state->py[a] + state->r[a] - state->ymin);
-
-#ifndef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (!state->dbeclear_p || !state->backb)
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- {
-/* if (x1a != x1b || y1a != y1b) -- leaves turds if we optimize this */
- {
- gc = state->erase_gc;
- XFillArc (state->dpy, state->b, gc,
- x1a, y1a, x2a-x1a, y2a-y1a,
- 0, 360*64);
- }
- }
-#endif /* !HAVE_JWXYZ */
-
- if (state->mouse_ball == a)
- gc = state->draw_gc2;
- else
- gc = state->draw_gc;
-
- XFillArc (state->dpy, state->b, gc,
- x1b, y1b, x2b-x1b, y2b-y1b,
- 0, 360*64);
-
- if (state->shake_p)
- {
- /* distance this ball moved this frame */
- float d = ((state->px[a] - state->opx[a]) *
- (state->px[a] - state->opx[a]) +
- (state->py[a] - state->opy[a]) *
- (state->py[a] - state->opy[a]));
- if (d > max_d) max_d = d;
- }
-
- state->opx[a] = state->px[a];
- state->opy[a] = state->py[a];
- }
-
- if (state->fps_p
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- && (state->backb ? state->dbeclear_p : 1)
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- )
- draw_fps_string(state);
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (state->backb)
- {
- XdbeSwapInfo info[1];
- info[0].swap_window = state->window;
- info[0].swap_action = (state->dbeclear_p ? XdbeBackground : XdbeUndefined);
- XdbeSwapBuffers (state->dpy, info, 1);
- }
- else
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- if (state->dbuf)
- {
- XCopyArea (state->dpy, state->b, state->window, state->erase_gc,
- 0, 0, state->xgwa.width, state->xgwa.height, 0, 0);
- }
-
- if (state->shake_p && state->time_since_shake > 5)
- {
- max_d /= state->max_radius;
- if (max_d < state->shake_threshold || /* when its stable */
- state->time_since_shake > 30) /* or when 30 secs has passed */
- {
- shake (state);
- }
- }
-
- check_wall_clock (state, max_d);
-}
-
-
-/* Implements the laws of physics: move balls to their new positions.
- */
-static void
-update_balls (b_state *state)
-{
- int a, b;
- float d, vxa, vya, vxb, vyb, dd, cdx, cdy;
- float ma, mb, vca, vcb, dva, dvb;
- float dee2;
-
- check_window_moved (state);
-
- /* If we're currently tracking the mouse, update that ball first.
- */
- if (state->mouse_ball != 0)
- {
- int mouse_x, mouse_y;
- query_mouse (state, &mouse_x, &mouse_y);
- state->px[state->mouse_ball] = mouse_x;
- state->py[state->mouse_ball] = mouse_y;
- state->vx[state->mouse_ball] =
- (0.1 *
- (state->px[state->mouse_ball] - state->opx[state->mouse_ball]) *
- state->tc);
- state->vy[state->mouse_ball] =
- (0.1 *
- (state->py[state->mouse_ball] - state->opy[state->mouse_ball]) *
- state->tc);
- }
-
- /* For each ball, compute the influence of every other ball. */
- for (a=1; a <= state->count - 1; a++)
- for (b=a + 1; b <= state->count; b++)
- {
- d = ((state->px[a] - state->px[b]) *
- (state->px[a] - state->px[b]) +
- (state->py[a] - state->py[b]) *
- (state->py[a] - state->py[b]));
- dee2 = (state->r[a] + state->r[b]) *
- (state->r[a] + state->r[b]);
- if (d < dee2)
- {
- state->collision_count++;
- d = sqrt(d);
- dd = state->r[a] + state->r[b] - d;
-
- cdx = (state->px[b] - state->px[a]) / d;
- cdy = (state->py[b] - state->py[a]) / d;
-
- /* Move each ball apart from the other by half the
- * 'collision' distance.
- */
- state->px[a] -= 0.5 * dd * cdx;
- state->py[a] -= 0.5 * dd * cdy;
- state->px[b] += 0.5 * dd * cdx;
- state->py[b] += 0.5 * dd * cdy;
-
- ma = state->m[a];
- mb = state->m[b];
-
- vxa = state->vx[a];
- vya = state->vy[a];
- vxb = state->vx[b];
- vyb = state->vy[b];
-
- vca = vxa * cdx + vya * cdy; /* the component of each velocity */
- vcb = vxb * cdx + vyb * cdy; /* along the axis of the collision */
-
- /* elastic collison */
- dva = (vca * (ma - mb) + vcb * 2 * mb) / (ma + mb) - vca;
- dvb = (vcb * (mb - ma) + vca * 2 * ma) / (ma + mb) - vcb;
-
- dva *= state->e; /* some energy lost to inelasticity */
- dvb *= state->e;
-
-#if 0
- dva += (frand (50) - 25) / ma; /* q: why are elves so chaotic? */
- dvb += (frand (50) - 25) / mb; /* a: brownian motion. */
-#endif
-
- vxa += dva * cdx;
- vya += dva * cdy;
- vxb += dvb * cdx;
- vyb += dvb * cdy;
-
- state->vx[a] = vxa;
- state->vy[a] = vya;
- state->vx[b] = vxb;
- state->vy[b] = vyb;
- }
- }
-
- /* Force all balls to be on screen.
- */
- for (a=1; a <= state->count; a++)
- {
- if (state->px[a] <= (state->xmin + state->r[a]))
- {
- state->px[a] = state->xmin + state->r[a];
- state->vx[a] = -state->vx[a] * state->e;
- }
- if (state->px[a] >= (state->xmax - state->r[a]))
- {
- state->px[a] = state->xmax - state->r[a];
- state->vx[a] = -state->vx[a] * state->e;
- }
- if (state->py[a] <= (state->ymin + state->r[a]))
- {
- state->py[a] = state->ymin + state->r[a];
- state->vy[a] = -state->vy[a] * state->e;
- }
- if (state->py[a] >= (state->ymax - state->r[a]))
- {
- state->py[a] = state->ymax - state->r[a];
- state->vy[a] = -state->vy[a] * state->e;
- }
- }
-
- /* Apply gravity to all balls.
- */
- for (a=1; a <= state->count; a++)
- if (a != state->mouse_ball)
- {
- state->vx[a] += state->accx * state->tc;
- state->vy[a] += state->accy * state->tc;
- state->px[a] += state->vx[a] * state->tc;
- state->py[a] += state->vy[a] * state->tc;
- }
-}
-
-
-/* Handle X events, specifically, allow a ball to be picked up with the mouse.
- */
-static Bool
-fluidballs_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- b_state *state = (b_state *) closure;
-
- if (event->xany.type == ButtonPress)
- {
- int i, rx, ry;
- XTranslateCoordinates (dpy, window, RootWindow (dpy, DefaultScreen(dpy)),
- event->xbutton.x, event->xbutton.y, &rx, &ry,
- &window);
-
- if (state->mouse_ball != 0) /* second down-click? drop the ball. */
- {
- state->mouse_ball = 0;
- return True;
- }
- else
- {
- /* When trying to pick up a ball, first look for a click directly
- inside the ball; but if we don't find it, expand the radius
- outward until we find something nearby.
- */
- float max = state->max_radius * 4;
- float step = max / 10;
- float r2;
- for (r2 = step; r2 < max; r2 += step) {
- for (i = 1; i <= state->count; i++)
- {
- float d = ((state->px[i] - rx) * (state->px[i] - rx) +
- (state->py[i] - ry) * (state->py[i] - ry));
- float r = state->r[i];
- if (r2 > r) r = r2;
- if (d < r*r)
- {
- state->mouse_ball = i;
- return True;
- }
- }
- }
- }
- return True;
- }
- else if (event->xany.type == ButtonRelease) /* drop the ball */
- {
- state->mouse_ball = 0;
- return True;
- }
-
- return False;
-}
-
-static unsigned long
-fluidballs_draw (Display *dpy, Window window, void *closure)
-{
- b_state *state = (b_state *) closure;
- repaint_balls(state);
- update_balls(state);
- return state->delay;
-}
-
-static void
-fluidballs_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
-}
-
-static void
-fluidballs_free (Display *dpy, Window window, void *closure)
-{
- b_state *state = (b_state *) closure;
- XFreeGC (dpy, state->draw_gc);
- XFreeGC (dpy, state->draw_gc2);
- XFreeGC (dpy, state->erase_gc);
- XftFontClose (state->dpy, state->font);
- XftDrawDestroy (state->xftdraw);
- free (state->m);
- free (state->r);
- free (state->vx);
- free (state->vy);
- free (state->px);
- free (state->py);
- free (state->opx);
- free (state->opy);
- free (state);
-}
-
-
-static const char *fluidballs_defaults [] = {
- ".background: black",
- ".foreground: yellow",
- ".textColor: yellow",
- "*mouseForeground: white",
- "*delay: 10000",
- "*count: 300",
- "*size: 25",
- "*random: True",
- "*gravity: 0.01",
- "*wind: 0.00",
- "*elasticity: 0.97",
- "*timeScale: 1.0",
- "*shake: True",
- "*shakeThreshold: 0.015",
- "*doubleBuffer: True",
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- "*useDBE: True",
- "*useDBEClear: True",
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec fluidballs_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-count", ".count", XrmoptionSepArg, 0 },
- { "-size", ".size", XrmoptionSepArg, 0 },
- { "-count", ".count", XrmoptionSepArg, 0 },
- { "-gravity", ".gravity", XrmoptionSepArg, 0 },
- { "-wind", ".wind", XrmoptionSepArg, 0 },
- { "-elasticity", ".elasticity", XrmoptionSepArg, 0 },
- { "-shake", ".shake", XrmoptionNoArg, "True" },
- { "-no-shake", ".shake", XrmoptionNoArg, "False" },
- { "-random", ".random", XrmoptionNoArg, "True" },
- { "-no-random", ".random", XrmoptionNoArg, "False" },
- { "-nonrandom", ".random", XrmoptionNoArg, "False" },
- { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
- { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("FluidBalls", fluidballs)
diff --git a/hacks/fluidballs.man b/hacks/fluidballs.man
deleted file mode 100644
index 0fa3ded..0000000
--- a/hacks/fluidballs.man
+++ /dev/null
@@ -1,90 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-fluidballs \- the physics of bouncing balls.
-.SH SYNOPSIS
-.B fluidballs
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-size \fInumber\fP]
-[\-gravity \fInumber\fP]
-[\-wind \fInumber\fP]
-[\-elasticity \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-nonrandom]
-[\-no-shake]
-[\-fps]
-.SH DESCRIPTION
-Models the physics of bouncing balls, or of particles in a gas or fluid,
-depending on the settings. If "Shake Box" is selected, then every now and
-then, the box will be rotated, changing which direction is down (in order
-to keep the settled balls in motion.)
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-How many balls to display. Default: 300.
-.TP 8
-.B \-size \fInumber\fP
-Maximum size of each ball. Default: 25.
-.TP 8
-.B \-gravity \fInumber\fP
-Coefficient of gravity. Useful values are < 0.1. Default: 0.01.
-.TP 8
-.B \-wind \fInumber\fP
-Wind. Useful values are < 0.1. Default: 0.00.
-.TP 8
-.B \-elasticity \fInumber\fP
-Coefficient of elasticity. Useful values are 0.2 to 1.0. Default: 0.97.
-Lower numbers make less bouncy balls.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-nonrandom
-Make all balls be the same size.
-.TP 8
-.B \-no-nonrandom
-Make the balls be random sizes. Default.
-.TP 8
-.B \-shake | \-no-shake
-Whether to shake the box if the system seems to have settled down.
-"Shake" means "change the direction of Down."
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Peter Birtles and Jamie Zawinski. Permission to
-use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided
-that the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation. No representations are made about the suitability of
-this software for any purpose. It is provided "as is" without express
-or implied warranty.
-.SH AUTHOR
-Peter Birtles, Jamie Zawinski, and Steven Barker.
-
diff --git a/hacks/fontglide.c b/hacks/fontglide.c
deleted file mode 100644
index 3eff604..0000000
--- a/hacks/fontglide.c
+++ /dev/null
@@ -1,2582 +0,0 @@
-/* xscreensaver, Copyright (c) 2003-2017 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * fontglide -- reads text from a subprocess and puts it on the screen using
- * large characters that glide in from the edges, assemble, then disperse.
- * Requires a system with scalable fonts. (X's font handing sucks. A lot.)
- */
-
-/* If you turn on DEBUG, this program also masquerades as a tool for
- debugging font metrics issues, which is probably only if interest
- if you are doing active development on libjwxyz.a itself.
- */
-/* #define DEBUG */
-
-#include "screenhack.h"
-#include "textclient.h"
-#include "utf8wc.h"
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
-#include "xdbe.h"
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
-#include <math.h>
-#include <time.h>
-
-#ifndef HAVE_JWXYZ
-# include <X11/Intrinsic.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-typedef struct {
- char *text;
-
- int x, y; /* Position of origin of first character in word */
-
- /* These have the same meanings as in XCharStruct: */
- int lbearing; /* origin to leftmost pixel */
- int rbearing; /* origin to rightmost pixel */
- int ascent; /* origin to topmost pixel */
- int descent; /* origin to bottommost pixel */
- int width; /* origin to next word's origin */
-
- int nticks, tick;
- int start_x, start_y;
- int target_x, target_y;
- Pixmap pixmap, mask;
-} word;
-
-
-typedef struct {
- int id;
- Bool dark_p;
- Bool move_chars_p;
- int width;
-
- char *font_name;
- GC fg_gc;
- XftFont *xftfont;
- XftColor xftcolor_fg, xftcolor_bg;
-
- int nwords;
- word **words;
-
- enum { IN, PAUSE, OUT } anim_state;
- enum { LEFT, CENTER, RIGHT } alignment;
- int pause_tick;
-
-} sentence;
-
-
-typedef struct {
- Display *dpy;
- Window window;
- XWindowAttributes xgwa;
-
- Pixmap b, ba; /* double-buffer to reduce flicker */
- GC bg_gc;
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- XdbeBackBuffer backb;
- Bool dbeclear_p;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- Bool dbuf; /* Whether we're using double buffering. */
-
- int border_width; /* size of the font outline */
- char *charset; /* registry and encoding for font lookups */
- double speed; /* frame rate multiplier */
- double linger; /* multiplier for how long to leave words on screen */
- Bool trails_p;
- enum { PAGE, SCROLL, CHARS } mode;
-
- char *font_override; /* if -font was specified on the cmd line */
-
- char buf [40]; /* this only needs to be as big as one "word". */
- int buf_tail;
- Bool early_p;
- time_t start_time;
-
- int nsentences;
- sentence **sentences;
- Bool spawn_p; /* whether it is time to create a new sentence */
- int latest_sentence;
- unsigned long frame_delay;
- int id_tick;
- text_data *tc;
-
-# ifdef DEBUG
- Bool debug_p;
- unsigned long debug_metrics_p;
- int debug_metrics_antialiasing_p;
- int debug_scale;
- unsigned entering_unicode_p; /* 0 = No, 1 = Just started, 2 = in progress */
- XFontStruct *metrics_font1;
- XFontStruct *metrics_font2;
- XftFont *metrics_xftfont;
- GC label_gc;
- char *prev_font_name;
- char *next_font_name;
-# endif /* DEBUG */
-
-} state;
-
-
-static void drain_input (state *s);
-
-
-static int
-pick_font_size (state *s)
-{
- double scale = s->xgwa.height / 1024.0; /* shrink for small windows */
- int min, max, r, pixel;
-
- min = scale * 24;
- max = scale * 260;
-
- if (min < 10) min = 10;
- if (max < 30) max = 30;
-
- r = ((max-min)/3)+1;
-
- pixel = min + ((random() % r) + (random() % r) + (random() % r));
-
- if (s->mode == SCROLL) /* scroll mode likes bigger fonts */
- pixel *= 1.5;
-
- return pixel;
-}
-
-
-#ifdef HAVE_JWXYZ
-
-static char *
-append_font_name(Display *dpy, char *dest, const XFontStruct *font)
-{
- int i;
- for (i = 0; i != font->n_properties; ++i) {
- if (font->properties[i].name == XA_FONT) {
- char *suffix = XGetAtomName (dpy, font->properties[i].card32);
- int L = strlen(suffix);
- strcpy(dest, suffix);
- free (suffix);
- return dest + L;
- }
- }
-
- dest[0] = '?';
- dest[1] = 0;
- return dest + 1;
-
-/*
- float s;
- const char *n = jwxyz_nativeFontName (font->fid, &s);
- return dest + sprintf (dest, "%s %.1f", n, s);
- */
-}
-
-#endif
-
-
-/* Finds the set of scalable fonts on the system; picks one;
- and loads that font in a random pixel size.
- Returns False if something went wrong.
- */
-static Bool
-pick_font_1 (state *s, sentence *se)
-{
- Bool ok = False;
- char pattern[1024];
- char pattern2[1024];
-
-# define _DONE_1 /**/
-# define _DONE_2 /**/
-# if defined(HAVE_XFT) && !defined(HAVE_JWXYZ) /* Real Xft under real X11 */
-# undef _DONE_1
-# undef _DONE_2
-# define _DONE_1 DONE_1:
-# define _DONE_2 DONE_2:
- if (s->font_override)
- {
- sprintf (pattern, "%.200s", s->font_override);
- ok = True;
- goto DONE_1;
- }
- else
- {
- unsigned long pixel = pick_font_size (s);
-
- /* https://keithp.com/~keithp/render/Xft.tutorial */
- XftFontSet *fs =
- XftListFonts (s->dpy, DefaultScreen (s->dpy),
- /* Pattern-triples to match, followed by a NULL */
- /* XFT_FAMILY, XftTypeString, "Helvetica", */
- /* XFT_SIZE, XftTypeDouble, 12.0, */
- NULL,
- /* Properties to return, followed by a second NULL */
- XFT_FAMILY,
- XFT_STYLE,
- XFT_SLANT,
- XFT_WEIGHT,
- XFT_SIZE,
- NULL);
- XftPattern *pat;
- char name1[1024], name2[1024], *s1, *s2;
- XftFont *font;
-
- if (!fs) abort();
- if (fs->nfont <= 0)
- {
- fprintf (stderr, "%s: unable to list fonts\n", progname);
- abort();
- }
- pat = fs->fonts[(random() % fs->nfont)];
- if (!pat) abort();
- if (! XftNameUnparse (pat, name1, sizeof(name1)-1))
- {
- /* I've seen this happen but rarely. Bogus font? */
- /* fprintf (stderr, "%s: unable to get font name\n", progname); */
- return False;
- }
-
- /* Convert "Helvetica:style=..." into "Helvetica-48:style=" */
- s1 = strchr (name1, ':');
- s2 = strchr (name1, '-');
- if (!s1) abort();
- if (!s2) s2 = s1;
- memcpy (name2, name1, s2 - name1);
- name2[s2 - name1] = 0;
- sprintf (name2 + strlen(name2), "-%ld:", pixel);
- strcat (name2, s2 + 1);
- font = XftFontOpenName (s->dpy, screen_number (s->xgwa.screen), name2);
-
- if (!font)
- {
- fprintf (stderr, "%s: unable to load Xft font \"%s\"\n",
- progname, name2);
- return False;
- }
-
- /* #### This gets a link error with FcFontSetDestroy missing. */
- /* if (fs) XftFontSetDestroy (fs); */
-
- se->xftfont = font;
- ok = True;
- goto DONE_2;
- }
-
-# elif !defined(HAVE_JWXYZ) /* No Xft but real Xlib */
-
- char **names = 0;
- char **names2 = 0;
- XFontStruct *info = 0;
- int count = 0, count2 = 0;
- int i;
-
- if (se->xftfont)
- {
- XftFontClose (s->dpy, se->xftfont);
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
- &se->xftcolor_fg);
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
- &se->xftcolor_bg);
-
- free (se->font_name);
- se->xftfont = 0;
- se->font_name = 0;
- }
-
- if (s->font_override)
- sprintf (pattern, "%.200s", s->font_override);
- else
- sprintf (pattern, "-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s",
- "*", /* foundry */
- "*", /* family */
- "*", /* weight */
- "*", /* slant */
- "*", /* swidth */
- "*", /* adstyle */
- "0", /* pixel size */
- "0", /* point size */
- "0", /* resolution x */
- "0", /* resolution y */
- "p", /* spacing */
- "0", /* avg width */
- s->charset); /* registry + encoding */
-
-
- names = XListFonts (s->dpy, pattern, 1000, &count);
-
- if (count <= 0)
- {
- if (s->font_override)
- fprintf (stderr, "%s: -font option bogus: %s\n", progname, pattern);
- else
- fprintf (stderr, "%s: no scalable fonts found! (pattern: %s)\n",
- progname, pattern);
- exit (1);
- }
-
- i = random() % count;
-
- names2 = XListFontsWithInfo (s->dpy, names[i], 1000, &count2, &info);
- if (count2 <= 0)
- {
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: pattern %s\n"
- " gave unusable %s\n\n",
- progname, pattern, names[i]);
-# endif /* DEBUG */
- goto FAIL;
- }
-
- {
- XFontStruct *font = &info[0];
- unsigned long value = 0;
- char *foundry=0, *family=0, *weight=0, *slant=0, *setwidth=0, *add_style=0;
- unsigned long pixel=0, point=0, res_x=0, res_y=0;
- char *spacing=0;
- unsigned long avg_width=0;
- char *registry=0, *encoding=0;
- Atom a;
- char *bogus = "\"?\"";
-
-# define STR(ATOM,VAR) \
- bogus = (ATOM); \
- a = XInternAtom (s->dpy, (ATOM), False); \
- if (XGetFontProperty (font, a, &value)) \
- VAR = XGetAtomName (s->dpy, value); \
- else \
- goto FAIL2
-
-# define INT(ATOM,VAR) \
- bogus = (ATOM); \
- a = XInternAtom (s->dpy, (ATOM), False); \
- if (!XGetFontProperty (font, a, &VAR) || \
- VAR > 9999) \
- goto FAIL2
-
- STR ("FOUNDRY", foundry);
- STR ("FAMILY_NAME", family);
- STR ("WEIGHT_NAME", weight);
- STR ("SLANT", slant);
- STR ("SETWIDTH_NAME", setwidth);
- STR ("ADD_STYLE_NAME", add_style);
- INT ("PIXEL_SIZE", pixel);
- INT ("POINT_SIZE", point);
- INT ("RESOLUTION_X", res_x);
- INT ("RESOLUTION_Y", res_y);
- STR ("SPACING", spacing);
- INT ("AVERAGE_WIDTH", avg_width);
- STR ("CHARSET_REGISTRY", registry);
- STR ("CHARSET_ENCODING", encoding);
-
-#undef INT
-#undef STR
-
- pixel = pick_font_size (s);
-
-#if 0
- /* Occasionally change the aspect ratio of the font, by increasing
- either the X or Y resolution (while leaving the other alone.)
-
- #### Looks like this trick doesn't really work that well: the
- metrics of the individual characters are ok, but the
- overall font ascent comes out wrong (unscaled.)
- */
- if (! (random() % 8))
- {
- double n = 2.5 / 3;
- double scale = 1 + (frand(n) + frand(n) + frand(n));
- if (random() % 2)
- res_x *= scale;
- else
- res_y *= scale;
- }
-# endif
-
- sprintf (pattern,
- "-%s-%s-%s-%s-%s-%s-%ld-%s-%ld-%ld-%s-%s-%s-%s",
- foundry, family, weight, slant, setwidth, add_style,
- pixel, "*", /* point, */
- res_x, res_y, spacing,
- "*", /* avg_width */
- registry, encoding);
- ok = True;
-
- FAIL2:
- if (!ok)
- fprintf (stderr, "%s: font has bogus %s property: %s\n",
- progname, bogus, names[i]);
-
- if (foundry) XFree (foundry);
- if (family) XFree (family);
- if (weight) XFree (weight);
- if (slant) XFree (slant);
- if (setwidth) XFree (setwidth);
- if (add_style) XFree (add_style);
- if (spacing) XFree (spacing);
- if (registry) XFree (registry);
- if (encoding) XFree (encoding);
- }
-
- FAIL:
-
- XFreeFontInfo (names2, info, count2);
- XFreeFontNames (names);
-
-# else /* HAVE_JWXYZ -- no Xft on macOS, iOS or Android */
-
- if (s->font_override)
- sprintf (pattern, "%.200s", s->font_override);
- else
- {
- const char *family = "random";
- const char *weight = ((random() % 2) ? "regular" : "bold");
- const char *slant = ((random() % 2) ? "o" : "r");
- int size = 10 * pick_font_size (s);
- sprintf (pattern, "*-%s-%s-%s-*-*-*-%d-*", family, weight, slant, size);
- }
- ok = True;
-# endif /* HAVE_JWXYZ */
-
- _DONE_1
-
- if (! ok) return False;
-
- se->xftfont = XftFontOpenXlfd (s->dpy, screen_number (s->xgwa.screen),
- pattern);
-
- _DONE_2
-
- if (! se->xftfont)
- {
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: unable to load font %s\n",
- progname, pattern);
-#endif
- return False;
- }
-
- strcpy (pattern2, pattern);
-# ifdef HAVE_JWXYZ
- {
- char *out = pattern2 + strlen(pattern2);
- out[0] = ' ';
- out[1] = '(';
- out = append_font_name (s->dpy, out + 2, se->xftfont->xfont);
- out[0] = ')';
- out[1] = 0;
- }
-# endif
-
-# ifdef DEBUG
- if (s->prev_font_name) free (s->prev_font_name);
- s->prev_font_name = s->next_font_name;
- s->next_font_name = strdup (pattern2);
-# endif
-
- /* Sometimes we get fonts with screwed up metrics. For example:
- -b&h-lucida-medium-r-normal-sans-40-289-100-100-p-0-iso8859-1
-
- When using XDrawString, XTextExtents and XTextExtents16, it is rendered
- as a scaled-up bitmap font. The character M has rbearing 70, ascent 68
- and width 78, which is correct for the glyph as rendered.
-
- But when using XftDrawStringUtf8 and XftTextExtentsUtf8, it is rendered
- at the original, smaller, un-scaled size, with rbearing 26, ascent 25
- and... width 77!
-
- So it's taking the *size* from the unscaled font, the *advancement* from
- the scaled-up version, and then *not* actually scaling it up. Awesome.
-
- So, after loading the font, measure the M, and if its advancement is more
- than 20% larger than its rbearing, reject the font.
-
- ------------------------------------------------------------------------
-
- Some observations on this nonsense from Dave Odell:
-
- 1. -*-lucidatypewriter-bold-r-normal-*-*-480-*-*-*-*-iso8859-1 normally
- resolves to /usr/share/fonts/X11/100dpi/lutBS24-ISO8859-1.pcf.gz.
-
- -*-lucidatypewriter-* is from the 'xfonts-100dpi' package in
- Debian/Ubuntu. It's usually (54.46% of systems), but not always,
- installed whenever an X.org server (57.96% of systems) is. It might
- be a good idea for this and xfonts-75dpi to be recommended
- dependencies of XScreenSaver in Debian, but that's neither here nor
- there. https://qa.debian.org/popcon.php?package=xorg
- https://qa.debian.org/popcon.php?package=xfonts-100dpi
-
- 2. It normally resolves to the PCF font... but not always.
-
- Fontconfig has /etc/fonts/conf.d/ (it's /opt/local/etc/fonts/conf.d/
- with MacPorts) containing symlinks to configuration files. And both
- Debian and Ubuntu normally has a 70-no-bitmaps.conf, installed as part
- of the 'fontconfig-config' package. And the 70-no-bitmaps.conf
- symlink... disables bitmap fonts.
-
- Without bitmap fonts, I get DejaVu Sans.
-
- 3. There's another symlink of interest here:
- /etc/fonts/conf.d/10-scale-bitmap-fonts.conf. This adds space to the
- right of glyphs of bitmap fonts when the requested size of the font is
- larger than the actual bitmap font. Ubuntu and MacPorts has this one.
-
- This specifically is causing text to have excessive character spacing.
-
- (jwz asks: WHY WOULD ANYONE EVER WANT THIS BEHAVIOR?)
-
- 4. Notice that I'm only talking about Debian and Ubuntu. Other distros
- will probably have different symlinks in /etc/fonts/conf.d/. So yes,
- this can be an issue on Linux as well as MacOS.
- */
- {
- XGlyphInfo extents;
- int rbearing, width;
- float ratio;
- float min = 0.8;
-
- XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) "M", 1, &extents);
- rbearing = extents.width - extents.x;
- width = extents.xOff;
- ratio = rbearing / (float) width;
-
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: M ratio %.2f (%d %d): %s\n", progname,
- ratio, rbearing, width, pattern2);
-# endif
-
- if (ratio < min && !s->font_override)
- {
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: skipping font with broken metrics: %s\n",
- progname, pattern2);
-# endif
- return False;
- }
- }
-
-
-# ifdef DEBUG
- if (s->debug_p)
- fprintf(stderr, "%s: %s\n", progname, pattern2);
-# endif /* DEBUG */
-
- se->font_name = strdup (pattern);
- return True;
-}
-
-
-/* Finds the set of scalable fonts on the system; picks one;
- and loads that font in a random pixel size.
- */
-static void
-pick_font (state *s, sentence *se)
-{
- int i;
- for (i = 0; i < 50; i++)
- if (pick_font_1 (s, se))
- return;
- fprintf (stderr, "%s: too many font-loading failures: giving up!\n",
- progname);
- exit (1);
-}
-
-
-static char *unread_word_text = 0;
-
-/* Returns a newly-allocated string with one word in it, or NULL if there
- is no complete word available.
- */
-static char *
-get_word_text (state *s)
-{
- const char *start = s->buf;
- const char *end;
- char *result = 0;
- int lfs = 0;
-
- drain_input (s);
-
- /* If we just launched, and haven't had any text yet, and it has been
- more than 2 seconds since we launched, then push out "Loading..."
- as our first text. So if the text source is speedy, just use that.
- But if we'd display a blank screen for a while, give 'em something
- to see.
- */
- if (s->early_p &&
- !*s->buf &&
- !unread_word_text &&
- s->start_time < ((time ((time_t *) 0) - 2)))
- {
- unread_word_text = "Loading...";
- s->early_p = False;
- }
-
- if (unread_word_text)
- {
- result = unread_word_text;
- unread_word_text = 0;
- return strdup (result);
- }
-
- /* Skip over whitespace at the beginning of the buffer,
- and count up how many linebreaks we see while doing so.
- */
- while (*start &&
- (*start == ' ' ||
- *start == '\t' ||
- *start == '\r' ||
- *start == '\n'))
- {
- if (*start == '\n' || (*start == '\r' && start[1] != '\n'))
- lfs++;
- start++;
- }
-
- end = start;
-
- /* If we saw a blank line, then return NULL (treat it as a temporary "eof",
- to trigger a sentence break here.) */
- if (lfs >= 2)
- goto DONE;
-
- /* Skip forward to the end of this word (find next whitespace.) */
- while (*end &&
- (! (*end == ' ' ||
- *end == '\t' ||
- *end == '\r' ||
- *end == '\n')))
- end++;
-
- /* If we have a word, allocate a string for it */
- if (end > start)
- {
- result = malloc ((end - start) + 1);
- strncpy (result, start, (end-start));
- result [end-start] = 0;
- }
-
- DONE:
-
- /* Make room in the buffer by compressing out any bytes we've processed.
- */
- if (end > s->buf)
- {
- int n = end - s->buf;
- memmove (s->buf, end, sizeof(s->buf) - n);
- s->buf_tail -= n;
- }
-
- return result;
-}
-
-
-/* Returns a 1-bit pixmap of the same size as the drawable,
- with a 0 wherever the drawable is black.
- */
-static Pixmap
-make_mask (Screen *screen, Visual *visual, Drawable drawable)
-{
- Display *dpy = DisplayOfScreen (screen);
- unsigned long black = BlackPixelOfScreen (screen);
- Window r;
- int x, y;
- unsigned int w, h, bw, d;
- XImage *out, *in;
- Pixmap mask;
- GC gc;
-
- XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bw, &d);
- in = XGetImage (dpy, drawable, 0, 0, w, h, ~0L, ZPixmap);
- out = XCreateImage (dpy, visual, 1, XYPixmap, 0, 0, w, h, 8, 0);
- out->data = (char *) malloc (h * out->bytes_per_line);
- for (y = 0; y < h; y++)
- for (x = 0; x < w; x++)
- XPutPixel (out, x, y, (black != XGetPixel (in, x, y)));
- mask = XCreatePixmap (dpy, drawable, w, h, 1L);
- gc = XCreateGC (dpy, mask, 0, 0);
- XPutImage (dpy, mask, gc, out, 0, 0, 0, 0, w, h);
- XFreeGC (dpy, gc);
- free (in->data);
- free (out->data);
- in->data = out->data = 0;
- XDestroyImage (in);
- XDestroyImage (out);
- return mask;
-}
-
-
-/* Gets some random text, and creates a "word" object from it.
- */
-static word *
-new_word (state *s, sentence *se, const char *txt, Bool alloc_p)
-{
- word *w;
- XGlyphInfo extents;
- int bw = s->border_width;
-
- if (!txt)
- return 0;
-
- w = (word *) calloc (1, sizeof(*w));
- XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) txt, strlen(txt),
- &extents);
-
- w->lbearing = -extents.x;
- w->rbearing = extents.width - extents.x;
- w->ascent = extents.y;
- w->descent = extents.height - extents.y;
- w->width = extents.xOff;
-
- w->lbearing -= bw;
- w->rbearing += bw;
- w->descent += bw;
- w->ascent += bw;
-
- if (s->mode == SCROLL && !alloc_p) abort();
-
- if (alloc_p)
- {
- int i, j;
- XGCValues gcv;
- GC gc_fg, gc_bg, gc_black;
- XftDraw *xftdraw;
- int width = w->rbearing - w->lbearing;
- int height = w->ascent + w->descent;
-
- if (width <= 0) width = 1;
- if (height <= 0) height = 1;
-
- w->pixmap = XCreatePixmap (s->dpy, s->b, width, height, s->xgwa.depth);
- xftdraw = XftDrawCreate (s->dpy, w->pixmap, s->xgwa.visual,
- s->xgwa.colormap);
-
- gcv.foreground = se->xftcolor_fg.pixel;
- gc_fg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
-
- gcv.foreground = se->xftcolor_bg.pixel;
- gc_bg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
-
- gcv.foreground = BlackPixelOfScreen (s->xgwa.screen);
- gc_black = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
-
- XFillRectangle (s->dpy, w->pixmap, gc_black, 0, 0, width, height);
-
-# ifdef DEBUG
- if (s->debug_p)
- {
- /* bounding box (behind the characters) */
- XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
- 0, 0, width-1, height-1);
- }
-# endif /* DEBUG */
-
- /* Draw background text for border */
- for (i = -bw; i <= bw; i++)
- for (j = -bw; j <= bw; j++)
- XftDrawStringUtf8 (xftdraw, &se->xftcolor_bg, se->xftfont,
- -w->lbearing + i, w->ascent + j,
- (FcChar8 *) txt, strlen(txt));
-
- /* Draw foreground text */
- XftDrawStringUtf8 (xftdraw, &se->xftcolor_fg, se->xftfont,
- -w->lbearing, w->ascent,
- (FcChar8 *) txt, strlen(txt));
-
-# ifdef DEBUG
- if (s->debug_p)
- {
- if (w->ascent != height)
- {
- /* baseline (on top of the characters) */
- XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
- 0, w->ascent, width-1, w->ascent);
- }
-
- if (w->lbearing < 0)
- {
- /* left edge of charcell */
- XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
- -w->lbearing, 0,
- -w->lbearing, height-1);
- }
-
- if (w->rbearing != w->width)
- {
- /* right edge of charcell */
- XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
- w->width - w->lbearing, 0,
- w->width - w->lbearing, height-1);
- }
- }
-# endif /* DEBUG */
-
- w->mask = make_mask (s->xgwa.screen, s->xgwa.visual, w->pixmap);
-
- XftDrawDestroy (xftdraw);
- XFreeGC (s->dpy, gc_fg);
- XFreeGC (s->dpy, gc_bg);
- XFreeGC (s->dpy, gc_black);
- }
-
- w->text = strdup (txt);
- return w;
-}
-
-
-static void
-free_word (state *s, word *w)
-{
- if (w->text) free (w->text);
- if (w->pixmap) XFreePixmap (s->dpy, w->pixmap);
- if (w->mask) XFreePixmap (s->dpy, w->mask);
- free (w);
-}
-
-
-static sentence *
-new_sentence (state *st, state *s)
-{
- XGCValues gcv;
- sentence *se = (sentence *) calloc (1, sizeof (*se));
- se->fg_gc = XCreateGC (s->dpy, s->b, 0, &gcv);
- se->anim_state = IN;
- se->id = ++st->id_tick;
- return se;
-}
-
-
-static void
-free_sentence (state *s, sentence *se)
-{
- int i;
- for (i = 0; i < se->nwords; i++)
- free_word (s, se->words[i]);
- if (se->words)
- free (se->words);
- if (se->font_name)
- free (se->font_name);
- if (se->fg_gc)
- XFreeGC (s->dpy, se->fg_gc);
-
- if (se->xftfont)
- {
- XftFontClose (s->dpy, se->xftfont);
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
- &se->xftcolor_fg);
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
- &se->xftcolor_bg);
- }
-
- free (se);
-}
-
-
-/* free the word, and put its text back at the front of the input queue,
- to be read next time. */
-static void
-unread_word (state *s, word *w)
-{
- if (unread_word_text)
- abort();
- unread_word_text = w->text;
- w->text = 0;
- free_word (s, w);
-}
-
-
-/* Divide each of the words in the sentence into one character words,
- without changing the positions of those characters.
- */
-static void
-split_words (state *s, sentence *se)
-{
- word **words2;
- int nwords2 = 0;
- int i, j;
-
- char ***word_chars = (char ***) malloc (se->nwords * sizeof(*word_chars));
- for (i = 0; i < se->nwords; i++)
- {
- int L;
- word *ow = se->words[i];
- word_chars[i] = utf8_split (ow->text, &L);
- nwords2 += L;
- }
-
- words2 = (word **) calloc (nwords2, sizeof(*words2));
-
- for (i = 0, j = 0; i < se->nwords; i++)
- {
- char **chars = word_chars[i];
- word *parent = se->words[i];
- int x = parent->x;
- int y = parent->y;
- int sx = parent->start_x;
- int sy = parent->start_y;
- int tx = parent->target_x;
- int ty = parent->target_y;
- int k;
-
- for (k = 0; chars[k]; k++)
- {
- char *t2 = chars[k];
- word *w2 = new_word (s, se, t2, True);
- words2[j++] = w2;
- free (t2);
-
- w2->x = x;
- w2->y = y;
- w2->start_x = sx;
- w2->start_y = sy;
- w2->target_x = tx;
- w2->target_y = ty;
-
- x += w2->width;
- sx += w2->width;
- tx += w2->width;
- }
-
- /* This is not invariant when kerning is involved! */
- /* if (x != parent->x + parent->width) abort(); */
-
- free (chars); /* but we retain its contents */
- free_word (s, parent);
- }
- if (j != nwords2) abort();
- free (word_chars);
- free (se->words);
-
- se->words = words2;
- se->nwords = nwords2;
-}
-
-
-/* Set the source or destination position of the words to be somewhere
- off screen.
- */
-static void
-scatter_sentence (state *s, sentence *se)
-{
- int i = 0;
- int off = s->border_width * 4 + 2;
-
- int flock_p = ((random() % 4) == 0);
- int mode = (flock_p ? (random() % 12) : 0);
-
- for (i = 0; i < se->nwords; i++)
- {
- word *w = se->words[i];
- int x, y;
- int r = (flock_p ? mode : (random() % 4));
- int left = -(off + w->rbearing);
- int top = -(off + w->descent);
- int right = off - w->lbearing + s->xgwa.width;
- int bottom = off + w->ascent + s->xgwa.height;
-
- switch (r) {
- /* random positions on the edges */
- case 0: x = left; y = random() % s->xgwa.height; break;
- case 1: x = right; y = random() % s->xgwa.height; break;
- case 2: x = random() % s->xgwa.width; y = top; break;
- case 3: x = random() % s->xgwa.width; y = bottom; break;
-
- /* straight towards the edges */
- case 4: x = left; y = w->target_y; break;
- case 5: x = right; y = w->target_y; break;
- case 6: x = w->target_x; y = top; break;
- case 7: x = w->target_x; y = bottom; break;
-
- /* corners */
- case 8: x = left; y = top; break;
- case 9: x = left; y = bottom; break;
- case 10: x = right; y = top; break;
- case 11: x = right; y = bottom; break;
-
- default: abort(); break;
- }
-
- if (se->anim_state == IN)
- {
- w->start_x = x;
- w->start_y = y;
- }
- else
- {
- w->start_x = w->x;
- w->start_y = w->y;
- w->target_x = x;
- w->target_y = y;
- }
-
- w->nticks = ((100 + ((random() % 140) +
- (random() % 140) +
- (random() % 140)))
- / s->speed);
- if (w->nticks < 2)
- w->nticks = 2;
- w->tick = 0;
- }
-}
-
-
-/* Set the source position of the words to be off the right side,
- and the destination to be off the left side.
- */
-static void
-aim_sentence (state *s, sentence *se)
-{
- int i = 0;
- int nticks;
- int yoff = 0;
-
- if (se->nwords <= 0) abort();
-
- /* Have the sentence shift up or down a little bit; not too far, and
- never let it fall off the top or bottom of the screen before its
- last character has reached the left edge.
- */
- for (i = 0; i < 10; i++)
- {
- int ty = random() % (s->xgwa.height - se->words[0]->ascent);
- yoff = ty - se->words[0]->target_y;
- if (yoff < s->xgwa.height/3) /* this one is ok */
- break;
- }
-
- for (i = 0; i < se->nwords; i++)
- {
- word *w = se->words[i];
- w->start_x = w->target_x + s->xgwa.width;
- w->target_x -= se->width;
- w->start_y = w->target_y;
- w->target_y += yoff;
- }
-
- nticks = ((se->words[0]->start_x - se->words[0]->target_x)
- / (s->speed * 7));
- nticks *= (frand(0.9) + frand(0.9) + frand(0.9));
-
- if (nticks < 2)
- nticks = 2;
-
- for (i = 0; i < se->nwords; i++)
- {
- word *w = se->words[i];
- w->nticks = nticks;
- w->tick = 0;
- }
-}
-
-
-/* Randomize the order of the words in the list (since that changes
- which ones are "on top".)
- */
-static void
-shuffle_words (state *s, sentence *se)
-{
- int i;
- for (i = 0; i < se->nwords-1; i++)
- {
- int j = i + (random() % (se->nwords - i));
- word *swap = se->words[i];
- se->words[i] = se->words[j];
- se->words[j] = swap;
- }
-}
-
-
-/* qsort comparitor */
-static int
-cmp_sentences (const void *aa, const void *bb)
-{
- const sentence *a = *(sentence **) aa;
- const sentence *b = *(sentence **) bb;
- return ((a ? a->id : 999999) - (b ? b->id : 999999));
-}
-
-
-/* Sort the sentences by id, so that sentences added later are on top.
- */
-static void
-sort_sentences (state *s)
-{
- qsort (s->sentences, s->nsentences, sizeof(*s->sentences), cmp_sentences);
-}
-
-
-/* Re-pick the colors of the text and border
- */
-static void
-recolor (state *s, sentence *se)
-{
- XRenderColor fg, bg;
-
- fg.red = (random() % 0x5555) + 0xAAAA;
- fg.green = (random() % 0x5555) + 0xAAAA;
- fg.blue = (random() % 0x5555) + 0xAAAA;
- fg.alpha = 0xFFFF;
- bg.red = (random() % 0x5555);
- bg.green = (random() % 0x5555);
- bg.blue = (random() % 0x5555);
- bg.alpha = 0xFFFF;
- se->dark_p = False;
-
- if (random() & 1)
- {
- XRenderColor swap = fg; fg = bg; bg = swap;
- se->dark_p = True;
- }
-
- if (se->xftfont)
- {
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
- &se->xftcolor_fg);
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
- &se->xftcolor_bg);
- }
-
- XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &fg,
- &se->xftcolor_fg);
- XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &bg,
- &se->xftcolor_bg);
-}
-
-
-static void
-align_line (state *s, sentence *se, int line_start, int x, int right)
-{
- int off, j;
- switch (se->alignment)
- {
- case LEFT: off = 0; break;
- case CENTER: off = (right - x) / 2; break;
- case RIGHT: off = (right - x); break;
- default: abort(); break;
- }
-
- if (off != 0)
- for (j = line_start; j < se->nwords; j++)
- se->words[j]->target_x += off;
-}
-
-
-/* Fill the sentence with new words: in "page" mode, fills the page
- with text; in "scroll" mode, just makes one long horizontal sentence.
- The sentence might have *no* words in it, if no text is currently
- available.
- */
-static void
-populate_sentence (state *s, sentence *se)
-{
- int i = 0;
- int left, right, top, x, y;
- int space = 0;
- int line_start = 0;
- Bool done = False;
-
- int array_size = 100;
-
- se->move_chars_p = (s->mode == CHARS ? True :
- s->mode == SCROLL ? False :
- (random() % 3) ? False : True);
- se->alignment = (random() % 3);
-
- recolor (s, se);
-
- if (se->words)
- {
- for (i = 0; i < se->nwords; i++)
- free_word (s, se->words[i]);
- free (se->words);
- }
-
- se->words = (word **) calloc (array_size, sizeof(*se->words));
- se->nwords = 0;
-
- switch (s->mode)
- {
- case PAGE:
- case CHARS:
- left = random() % (s->xgwa.width / 3);
- right = s->xgwa.width - (random() % (s->xgwa.width / 3));
- top = random() % (s->xgwa.height * 2 / 3);
- break;
- case SCROLL:
- left = 0;
- right = s->xgwa.width;
- top = random() % s->xgwa.height;
- break;
- default:
- abort();
- break;
- }
-
- x = left;
- y = top;
-
- while (!done)
- {
- char *txt = get_word_text (s);
- word *w;
- if (!txt)
- {
- if (se->nwords == 0)
- return; /* If the stream is empty, bail. */
- else
- break; /* If EOF after some words, end of sentence. */
- }
-
- if (! se->xftfont) /* Got a word: need a font now */
- {
- XGlyphInfo extents;
- pick_font (s, se);
- if (y < se->xftfont->ascent)
- y += se->xftfont->ascent;
-
- /* Measure the space character to figure out how much room to
- leave between words (since we don't actually render that.) */
- XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) " ", 1,
- &extents);
- space = extents.xOff;
- }
-
- w = new_word (s, se, txt, !se->move_chars_p);
- free (txt);
- txt = 0;
-
- /* If we have a few words, let punctuation terminate the sentence:
- stop gathering more words if the last word ends in a period, etc. */
- if (se->nwords >= 4)
- {
- char c = w->text[strlen(w->text)-1];
- if (c == '.' || c == '?' || c == '!')
- done = True;
- }
-
- /* If the sentence is kind of long already, terminate at commas, etc. */
- if (se->nwords >= 12)
- {
- char c = w->text[strlen(w->text)-1];
- if (c == ',' || c == ';' || c == ':' || c == '-' ||
- c == ')' || c == ']' || c == '}')
- done = True;
- }
-
- if (se->nwords >= 25) /* ok that's just about enough out of you */
- done = True;
-
- if ((s->mode == PAGE || s->mode == CHARS) &&
- x + w->rbearing > right) /* wrap line */
- {
- align_line (s, se, line_start, x, right);
- line_start = se->nwords;
-
- x = left;
- y += se->xftfont->ascent + se->xftfont->descent;
-
- /* If we're close to the bottom of the screen, stop, and
- unread the current word. (But not if this is the first
- word, otherwise we might just get stuck on it.)
- */
- if (se->nwords > 0 &&
- y + se->xftfont->ascent + se->xftfont->descent > s->xgwa.height)
- {
- unread_word (s, w);
- w = 0;
- /* done = True; */
- break;
- }
- }
-
- w->target_x = x;
- w->target_y = y;
-
- x += w->width + space;
- se->width = x;
-
- if (se->nwords >= (array_size - 1))
- {
- array_size += 100;
- se->words = (word **)
- realloc (se->words, array_size * sizeof(*se->words));
- if (!se->words)
- {
- fprintf (stderr, "%s: out of memory (%d words)\n",
- progname, array_size);
- exit (1);
- }
- }
-
- se->words[se->nwords++] = w;
- }
-
- se->width -= space;
-
- switch (s->mode)
- {
- case PAGE:
- case CHARS:
- align_line (s, se, line_start, x, right);
- if (se->move_chars_p)
- split_words (s, se);
- scatter_sentence (s, se);
- shuffle_words (s, se);
- break;
- case SCROLL:
- aim_sentence (s, se);
- break;
- default:
- abort();
- break;
- }
-
-# ifdef DEBUG
- if (s->debug_p)
- {
- fprintf (stderr, "%s: sentence %d:", progname, se->id);
- for (i = 0; i < se->nwords; i++)
- fprintf (stderr, " %s", se->words[i]->text);
- fprintf (stderr, "\n");
- }
-# endif /* DEBUG */
-}
-
-
-/* Render a single word object to the screen.
- */
-static void
-draw_word (state *s, sentence *se, word *word)
-{
- int x, y, w, h;
- if (! word->pixmap) return;
-
- x = word->x + word->lbearing;
- y = word->y - word->ascent;
- w = word->rbearing - word->lbearing;
- h = word->ascent + word->descent;
-
- if (x + w < 0 ||
- y + h < 0 ||
- x > s->xgwa.width ||
- y > s->xgwa.height)
- return;
-
- XSetClipMask (s->dpy, se->fg_gc, word->mask);
- XSetClipOrigin (s->dpy, se->fg_gc, x, y);
- XCopyArea (s->dpy, word->pixmap, s->b, se->fg_gc,
- 0, 0, w, h, x, y);
-}
-
-
-/* If there is room for more sentences, add one.
- */
-static void
-more_sentences (state *s)
-{
- int i;
- Bool any = False;
- for (i = 0; i < s->nsentences; i++)
- {
- sentence *se = s->sentences[i];
- if (! se)
- {
- se = new_sentence (s, s);
- populate_sentence (s, se);
- if (se->nwords > 0)
- s->spawn_p = False, any = True;
- else
- {
- free_sentence (s, se);
- se = 0;
- }
- s->sentences[i] = se;
- if (se)
- s->latest_sentence = se->id;
- break;
- }
- }
-
- if (any) sort_sentences (s);
-}
-
-
-/* Render all the words to the screen, and run the animation one step.
- */
-static void
-draw_sentence (state *s, sentence *se)
-{
- int i;
- Bool moved = False;
-
- if (! se) return;
-
- for (i = 0; i < se->nwords; i++)
- {
- word *w = se->words[i];
-
- switch (s->mode)
- {
- case PAGE:
- case CHARS:
- if (se->anim_state != PAUSE &&
- w->tick <= w->nticks)
- {
- int dx = w->target_x - w->start_x;
- int dy = w->target_y - w->start_y;
- double r = sin (w->tick * M_PI / (2 * w->nticks));
- w->x = w->start_x + (dx * r);
- w->y = w->start_y + (dy * r);
-
- w->tick++;
- if (se->anim_state == OUT &&
- (s->mode == PAGE || s->mode == CHARS))
- w->tick++; /* go out faster */
- moved = True;
- }
- break;
- case SCROLL:
- {
- int dx = w->target_x - w->start_x;
- int dy = w->target_y - w->start_y;
- double r = (double) w->tick / w->nticks;
- w->x = w->start_x + (dx * r);
- w->y = w->start_y + (dy * r);
- w->tick++;
- moved = (w->tick <= w->nticks);
-
- /* Launch a new sentence when:
- - the front of this sentence is almost off the left edge;
- - the end of this sentence is almost on screen.
- - or, randomly
- */
- if (se->anim_state != OUT &&
- i == 0 &&
- se->id == s->latest_sentence)
- {
- Bool new_p = (w->x < (s->xgwa.width * 0.4) &&
- w->x + se->width < (s->xgwa.width * 2.1));
- Bool rand_p = (new_p ? 0 : !(random() % 2000));
-
- if (new_p || rand_p)
- {
- se->anim_state = OUT;
- s->spawn_p = True;
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: OUT %d (x2 = %d%s)\n",
- progname, se->id,
- se->words[0]->x + se->width,
- rand_p ? " randomly" : "");
-# endif /* DEBUG */
- }
- }
- }
- break;
- default:
- abort();
- break;
- }
-
- draw_word (s, se, w);
- }
-
- if (moved && se->anim_state == PAUSE)
- abort();
-
- if (! moved)
- {
- switch (se->anim_state)
- {
- case IN:
- se->anim_state = PAUSE;
- se->pause_tick = (se->nwords * 7 * s->linger);
- if (se->move_chars_p)
- se->pause_tick /= 5;
- scatter_sentence (s, se);
- shuffle_words (s, se);
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: PAUSE %d\n", progname, se->id);
-# endif /* DEBUG */
- break;
- case PAUSE:
- if (--se->pause_tick <= 0)
- {
- se->anim_state = OUT;
- s->spawn_p = True;
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: OUT %d\n", progname, se->id);
-# endif /* DEBUG */
- }
- break;
- case OUT:
-# ifdef DEBUG
- if (s->debug_p)
- fprintf (stderr, "%s: DEAD %d\n", progname, se->id);
-# endif /* DEBUG */
- {
- int j;
- for (j = 0; j < s->nsentences; j++)
- if (s->sentences[j] == se)
- s->sentences[j] = 0;
- free_sentence (s, se);
- }
- break;
- default:
- abort();
- break;
- }
- }
-}
-
-
-#ifdef DEBUG /* All of this stuff is for -debug-metrics mode. */
-
-
-static Pixmap
-scale_ximage (Screen *screen, Window window, XImage *img, int scale,
- int margin)
-{
- Display *dpy = DisplayOfScreen (screen);
- int x, y;
- unsigned width = img->width, height = img->height;
- Pixmap p2;
- GC gc;
-
- p2 = XCreatePixmap (dpy, window, width*scale, height*scale, img->depth);
- gc = XCreateGC (dpy, p2, 0, 0);
-
- XSetForeground (dpy, gc, BlackPixelOfScreen (screen));
- XFillRectangle (dpy, p2, gc, 0, 0, width*scale, height*scale);
- for (y = 0; y < height; y++)
- for (x = 0; x < width; x++)
- {
- XSetForeground (dpy, gc, XGetPixel (img, x, y));
- XFillRectangle (dpy, p2, gc, x*scale, y*scale, scale, scale);
- }
-
- if (scale > 2)
- {
- XWindowAttributes xgwa;
- XColor c;
- c.red = c.green = c.blue = 0x4444;
- c.flags = DoRed|DoGreen|DoBlue;
- XGetWindowAttributes (dpy, window, &xgwa);
- if (! XAllocColor (dpy, xgwa.colormap, &c)) abort();
- XSetForeground (dpy, gc, c.pixel);
- XDrawRectangle (dpy, p2, gc, 0, 0, width*scale-1, height*scale-1);
- XDrawRectangle (dpy, p2, gc, margin*scale, margin*scale,
- width*scale-1, height*scale-1);
- for (y = 0; y <= height - 2*margin; y++)
- XDrawLine (dpy, p2, gc,
- margin*scale, (y+margin)*scale-1,
- (width-margin)*scale, (y+margin)*scale-1);
- for (x = 0; x <= width - 2*margin; x++)
- XDrawLine (dpy, p2, gc,
- (x+margin)*scale-1, margin*scale,
- (x+margin)*scale-1, (height-margin)*scale);
- XFreeColors (dpy, xgwa.colormap, &c.pixel, 1, 0);
- }
-
- XFreeGC (dpy, gc);
- return p2;
-}
-
-
-static int check_edge (Display *dpy, Drawable p, GC gc,
- unsigned msg_x, unsigned msg_y, const char *msg,
- XImage *img,
- unsigned x, unsigned y, unsigned dim, unsigned end)
-{
- unsigned pt[2];
- pt[0] = x;
- pt[1] = y;
- end += pt[dim];
-
- for (;;)
- {
- if (pt[dim] == end)
- {
- XDrawString (dpy, p, gc, msg_x, msg_y, msg, strlen (msg));
- return 1;
- }
-
- if (XGetPixel(img, pt[0], pt[1]) & 0xffffff)
- break;
-
- ++pt[dim];
- }
-
- return 0;
-}
-
-
-static unsigned long
-fontglide_draw_metrics (state *s)
-{
- unsigned int margin = (s->debug_metrics_antialiasing_p ? 2 : 0);
-
- char txt[2], utxt[3], txt2[80];
- XChar2b *txt3 = 0;
- const char *fn = (s->font_override ? s->font_override : "fixed");
- char fn2[1024];
- XCharStruct c, overall, fake_c;
- int dir, ascent, descent;
- int x, y;
- XGlyphInfo extents;
- XftColor xftcolor;
- XftDraw *xftdraw;
- int sc = s->debug_scale;
- GC gc;
- unsigned long red = 0xFFFF0000; /* so shoot me */
- unsigned long green = 0xFF00FF00;
- unsigned long blue = 0xFF6666FF;
- unsigned long yellow = 0xFFFFFF00;
- unsigned long cyan = 0xFF004040;
- int i, j;
- Drawable dest = s->b ? s->b : s->window;
-
- if (sc < 1) sc = 1;
-
- /* Self-test these macros to make sure they're symmetrical. */
- for (i = 0; i < 1000; i++)
- {
- XGlyphInfo g, g2;
- XRectangle r;
- c.lbearing = (random()%50)-100;
- c.rbearing = (random()%50)-100;
- c.ascent = (random()%50)-100;
- c.descent = (random()%50)-100;
- c.width = (random()%50)-100;
- XCharStruct_to_XGlyphInfo (c, g);
- XGlyphInfo_to_XCharStruct (g, overall);
- if (c.lbearing != overall.lbearing) abort();
- if (c.rbearing != overall.rbearing) abort();
- if (c.ascent != overall.ascent) abort();
- if (c.descent != overall.descent) abort();
- if (c.width != overall.width) abort();
- XCharStruct_to_XGlyphInfo (overall, g2);
- if (g.x != g2.x) abort();
- if (g.y != g2.y) abort();
- if (g.xOff != g2.xOff) abort();
- if (g.yOff != g2.yOff) abort();
- if (g.width != g2.width) abort();
- if (g.height != g2.height) abort();
- XCharStruct_to_XmbRectangle (overall, r);
- XmbRectangle_to_XCharStruct (r, c, c.width);
- if (c.lbearing != overall.lbearing) abort();
- if (c.rbearing != overall.rbearing) abort();
- if (c.ascent != overall.ascent) abort();
- if (c.descent != overall.descent) abort();
- if (c.width != overall.width) abort();
- }
-
- txt[0] = s->debug_metrics_p;
- txt[1] = 0;
-
- /* Convert Unicode code point to UTF-8. */
- utxt[utf8_encode(s->debug_metrics_p, utxt, 4)] = 0;
-
- txt3 = utf8_to_XChar2b (utxt, 0);
-
- if (! s->metrics_font1)
- s->metrics_font1 = XLoadQueryFont (s->dpy, fn);
- if (! s->metrics_font2)
- s->metrics_font2 = XLoadQueryFont (s->dpy, "fixed");
- if (! s->metrics_font1)
- s->metrics_font1 = s->metrics_font2;
-
- gc = XCreateGC (s->dpy, dest, 0, 0);
- XSetFont (s->dpy, gc, s->metrics_font1->fid);
-
-# if defined(HAVE_JWXYZ)
- jwxyz_XSetAntiAliasing (s->dpy, gc, False);
-# endif
-
- if (! s->metrics_xftfont)
- {
- s->metrics_xftfont =
- load_xft_font_retry (s->dpy, screen_number(s->xgwa.screen), fn);
- if (! s->metrics_xftfont)
- {
- const char *fn2 = "fixed";
- s->metrics_xftfont =
- load_xft_font_retry (s->dpy, screen_number(s->xgwa.screen), fn2);
- if (s->metrics_xftfont)
- fn = fn2;
- else
- {
- fprintf (stderr, "%s: XftFontOpen failed on \"%s\" and \"%s\"\n",
- progname, fn, fn2);
- exit (1);
- }
- }
- }
-
- strcpy (fn2, fn);
-# ifdef HAVE_JWXYZ
- append_font_name (s->dpy, fn2, s->metrics_xftfont->xfont);
-# endif
-
- xftdraw = XftDrawCreate (s->dpy, dest, s->xgwa.visual,
- s->xgwa.colormap);
- XftColorAllocName (s->dpy, s->xgwa.visual, s->xgwa.colormap, "white",
- &xftcolor);
- XftTextExtentsUtf8 (s->dpy, s->metrics_xftfont,
- (FcChar8 *) utxt, strlen(utxt),
- &extents);
-
-
- XTextExtents (s->metrics_font1, txt, strlen(txt),
- &dir, &ascent, &descent, &overall);
- c = ((s->debug_metrics_p >= s->metrics_font1->min_char_or_byte2 &&
- s->debug_metrics_p <= s->metrics_font1->max_char_or_byte2)
- ? s->metrics_font1->per_char[s->debug_metrics_p -
- s->metrics_font1->min_char_or_byte2]
- : overall);
-
- XSetForeground (s->dpy, gc, BlackPixelOfScreen (s->xgwa.screen));
- XFillRectangle (s->dpy, dest, gc, 0, 0, s->xgwa.width, s->xgwa.height);
-
- XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
- XSetFont (s->dpy, gc, s->metrics_font2->fid);
- XDrawString (s->dpy, dest, gc,
- s->xgwa.width / 2,
- s->xgwa.height - 5,
- fn2, strlen(fn2));
-
-# ifdef HAVE_JWXYZ
- {
- char *name = jwxyz_unicode_character_name (
- s->dpy, s->metrics_font1->fid, s->debug_metrics_p);
- if (!name || !*name) name = strdup("unknown character name");
- XDrawString (s->dpy, dest, gc,
- 10,
- 10 + 2 * (s->metrics_font2->ascent +
- s->metrics_font2->descent),
- name, strlen(name));
- free (name);
- }
-# endif
-
- /* i 0, j 0: top left, XDrawString, char metrics
- i 1, j 0: bot left, XDrawString, overall metrics, ink escape
- i 0, j 1: top right, XftDrawStringUtf8, utf8 metrics
- i 1, j 1: bot right, XDrawString16, 16 metrics, ink escape
- */
- for (j = 0; j < 2; j++) {
- Bool xft_p = (j != 0);
- int ww = s->xgwa.width / 2 - 20;
- int xoff = (j == 0 ? 0 : ww + 20);
-
- /* XDrawString only does 8-bit characters, so skip it outside Latin-1. */
- if (s->debug_metrics_p >= 256)
- {
- if (!xft_p)
- continue;
- xoff = 0;
- ww = s->xgwa.width;
- }
-
- x = (ww - overall.width) / 2;
-
- for (i = 0; i < 2; i++)
- {
- XCharStruct cc;
- int x1 = xoff + ww * 0.18;
- int x2 = xoff + ww * 0.82;
- int x3 = xoff + ww;
- int pixw, pixh;
- Pixmap p;
-
- y = 80;
- {
- int h = sc * (ascent + descent);
- int min = (ascent + descent) * 4;
- if (h < min) h = min;
- if (i == 1) h *= 3;
- y += h;
- }
-
- memset (&fake_c, 0, sizeof(fake_c));
-
- if (!xft_p && i == 0)
- cc = c;
- else if (!xft_p && i == 1)
- cc = overall;
- else if (xft_p && i == 0)
- {
- /* Measure the glyph in the Xft way */
- XGlyphInfo extents;
- XftTextExtentsUtf8 (s->dpy,
- s->metrics_xftfont,
- (FcChar8 *) utxt, strlen(utxt),
- &extents);
- XGlyphInfo_to_XCharStruct (extents, fake_c);
- cc = fake_c;
- }
- else if (xft_p)
- {
- /* Measure the glyph in the 16-bit way */
- int dir, ascent, descent;
- XTextExtents16 (s->metrics_font1, txt3, 1, &dir, &ascent, &descent,
- &fake_c);
- cc = fake_c;
- }
-
- pixw = margin * 2 + cc.rbearing - cc.lbearing;
- pixh = margin * 2 + cc.ascent + cc.descent;
- p = (pixw > 0 && pixh > 0
- ? XCreatePixmap (s->dpy, dest, pixw, pixh, s->xgwa.depth)
- : 0);
-
- if (p)
- {
- Pixmap p2;
- GC gc2 = XCreateGC (s->dpy, p, 0, 0);
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (s->dpy, gc2, False);
-# endif
- XSetFont (s->dpy, gc2, s->metrics_font1->fid);
- XSetForeground (s->dpy, gc2, BlackPixelOfScreen (s->xgwa.screen));
- XFillRectangle (s->dpy, p, gc2, 0, 0, pixw, pixh);
- XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
- XSetForeground (s->dpy, gc2, WhitePixelOfScreen (s->xgwa.screen));
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (s->dpy, gc2,
- s->debug_metrics_antialiasing_p);
-# endif
-
- if (xft_p && i == 0)
- {
- XftDraw *xftdraw2 = XftDrawCreate (s->dpy, p, s->xgwa.visual,
- s->xgwa.colormap);
- XftDrawStringUtf8 (xftdraw2, &xftcolor,
- s->metrics_xftfont,
- -cc.lbearing + margin,
- cc.ascent + margin,
- (FcChar8 *) utxt, strlen(utxt));
- XftDrawDestroy (xftdraw2);
- }
- else if (xft_p)
- XDrawString16 (s->dpy, p, gc2,
- -cc.lbearing + margin,
- cc.ascent + margin,
- txt3, 1);
- else
- XDrawString (s->dpy, p, gc2,
- -cc.lbearing + margin,
- cc.ascent + margin,
- txt, strlen(txt));
-
- {
- unsigned x2, y2;
- XImage *img = XGetImage (s->dpy, p, 0, 0, pixw, pixh,
- ~0L, ZPixmap);
- XImage *img2;
-
- if (i == 1)
- {
- unsigned w = pixw - margin * 2, h = pixh - margin * 2;
-
- if (margin > 0)
- {
- /* Check for ink escape. */
- unsigned long ink = 0;
- for (y2 = 0; y2 != pixh; ++y2)
- for (x2 = 0; x2 != pixw; ++x2)
- {
- /* Sloppy... */
- if (! (x2 >= margin &&
- x2 < pixw - margin &&
- y2 >= margin &&
- y2 < pixh - margin))
- ink |= XGetPixel (img, x2, y2);
- }
-
- if (ink & 0xFFFFFF)
- {
- XSetFont (s->dpy, gc, s->metrics_font2->fid);
- XDrawString (s->dpy, dest, gc,
- xoff + 10, 40,
- "Ink escape!", 11);
- }
- }
-
- /* ...And wasted space. */
- if (w && h)
- {
- if (check_edge (s->dpy, dest, gc, 120, 60, "left",
- img, margin, margin, 1, h) |
- check_edge (s->dpy, dest, gc, 160, 60, "right",
- img, margin + w - 1, margin, 1, h) |
- check_edge (s->dpy, dest, gc, 200, 60, "top",
- img, margin, margin, 0, w) |
- check_edge (s->dpy, dest, gc, 240, 60, "bottom",
- img, margin, margin + h - 1, 0, w))
- {
- XSetFont (s->dpy, gc, s->metrics_font2->fid);
- XDrawString (s->dpy, dest, gc,
- xoff + 10, 60,
- "Wasted space: ", 14);
- }
- }
- }
-
- if (s->debug_metrics_antialiasing_p)
- {
- /* Draw a dark cyan boundary around antialiased glyphs */
- img2 = XCreateImage (s->dpy, s->xgwa.visual, img->depth,
- ZPixmap, 0, NULL,
- img->width, img->height,
- img->bitmap_pad, 0);
- img2->data = malloc (img->bytes_per_line * img->height);
-
- for (y2 = 0; y2 != pixh; ++y2)
- for (x2 = 0; x2 != pixw; ++x2)
- {
- unsigned long px = XGetPixel (img, x2, y2);
- if ((px & 0xffffff) == 0)
- {
- unsigned long neighbors = 0;
- if (x2)
- neighbors |= XGetPixel (img, x2 - 1, y2);
- if (x2 != pixw - 1)
- neighbors |= XGetPixel (img, x2 + 1, y2);
- if (y2)
- neighbors |= XGetPixel (img, x2, y2 - 1);
- if (y2 != pixh - 1)
- neighbors |= XGetPixel (img, x2, y2 + 1);
- XPutPixel (img2, x2, y2,
- (neighbors & 0xffffff
- ? cyan
- : BlackPixelOfScreen (s->xgwa.screen)));
- }
- else
- {
- XPutPixel (img2, x2, y2, px);
- }
- }
- }
- else
- {
- img2 = img;
- img = NULL;
- }
-
- p2 = scale_ximage (s->xgwa.screen, s->window, img2, sc, margin);
- if (img)
- XDestroyImage (img);
- XDestroyImage (img2);
- }
-
- XCopyArea (s->dpy, p2, dest, gc,
- 0, 0, sc*pixw, sc*pixh,
- xoff + x + sc * (cc.lbearing - margin),
- y - sc * (cc.ascent + margin));
- XFreePixmap (s->dpy, p);
- XFreePixmap (s->dpy, p2);
- XFreeGC (s->dpy, gc2);
- }
-
- if (i == 0)
- {
- XSetFont (s->dpy, gc, s->metrics_font1->fid);
- XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (s->dpy, gc, s->debug_metrics_antialiasing_p);
-# endif
- sprintf (txt2, "%s [XX%sXX] [%s%s%s%s]",
- (xft_p ? utxt : txt),
- (xft_p ? utxt : txt),
- (xft_p ? utxt : txt),
- (xft_p ? utxt : txt),
- (xft_p ? utxt : txt),
- (xft_p ? utxt : txt));
-
- if (xft_p)
- XftDrawStringUtf8 (xftdraw, &xftcolor,
- s->metrics_xftfont,
- xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2
- + 40,
- ascent + 10,
- (FcChar8 *) txt2, strlen(txt2));
- else
- XDrawString (s->dpy, dest, gc,
- xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2,
- ascent + 10,
- txt2, strlen(txt2));
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (s->dpy, gc, False);
-# endif
- XSetFont (s->dpy, gc, s->metrics_font2->fid);
- if (xft_p)
- {
- char *uptr;
- char *tptr = txt2 + sprintf(txt2, "U+%04lX", s->debug_metrics_p);
- *tptr++ = " ?_"[s->entering_unicode_p];
- *tptr++ = ' ';
-
- uptr = utxt;
- while (*uptr)
- {
- tptr += sprintf (tptr, "0%03o ", (unsigned char) *uptr);
- ++uptr;
- }
- *tptr++ = ' ';
- uptr = utxt;
- while (*uptr)
- {
- tptr += sprintf (tptr, "%02x ", (unsigned char) *uptr);
- ++uptr;
- }
- }
- else
- sprintf (txt2, "%c %3ld 0%03lo 0x%02lx%s",
- (char)s->debug_metrics_p, s->debug_metrics_p,
- s->debug_metrics_p, s->debug_metrics_p,
- (txt[0] < s->metrics_font1->min_char_or_byte2
- ? " *" : ""));
- XDrawString (s->dpy, dest, gc,
- xoff + 10, 20,
- txt2, strlen(txt2));
- }
-
-# ifdef HAVE_JWXYZ
- jwxyz_XSetAntiAliasing (s->dpy, gc, True);
-# endif
-
- {
- const char *ss = (j == 0
- ? (i == 0 ? "char" : "overall")
- : (i == 0 ? "utf8" : "16 bit"));
- XSetFont (s->dpy, gc, s->metrics_font2->fid);
-
- XSetForeground (s->dpy, gc, red);
-
- sprintf (txt2, "%s ascent %d", ss, ascent);
- XDrawString (s->dpy, dest, gc,
- xoff + 10,
- y - sc*ascent - 2,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- xoff, y - sc*ascent,
- x3, y - sc*ascent);
-
- sprintf (txt2, "%s descent %d", ss, descent);
- XDrawString (s->dpy, dest, gc,
- xoff + 10,
- y + sc*descent - 2,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- xoff, y + sc*descent,
- x3, y + sc*descent);
- }
-
-
- /* ascent, descent, baseline */
-
- XSetForeground (s->dpy, gc, green);
-
- sprintf (txt2, "ascent %d", cc.ascent);
- if (cc.ascent != 0)
- XDrawString (s->dpy, dest, gc,
- x1, y - sc*cc.ascent - 2,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- x1, y - sc*cc.ascent,
- x2, y - sc*cc.ascent);
-
- sprintf (txt2, "descent %d", cc.descent);
- if (cc.descent != 0)
- XDrawString (s->dpy, dest, gc,
- x1, y + sc*cc.descent - 2,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- x1, y + sc*cc.descent,
- x2, y + sc*cc.descent);
-
- XSetForeground (s->dpy, gc, yellow);
- strcpy (txt2, "baseline");
- XDrawString (s->dpy, dest, gc,
- x1, y - 2,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc, x1, y, x2, y);
-
-
- /* origin, width */
-
- XSetForeground (s->dpy, gc, blue);
-
- strcpy (txt2, "origin");
- XDrawString (s->dpy, dest, gc,
- xoff + x + 2,
- y + sc*descent + 50,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- xoff + x, y - sc*(ascent - 10),
- xoff + x, y + sc*(descent + 10));
-
- sprintf (txt2, "width %d", cc.width);
- XDrawString (s->dpy, dest, gc,
- xoff + x + sc*cc.width + 2,
- y + sc*descent + 60,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- xoff + x + sc*cc.width, y - sc*(ascent - 10),
- xoff + x + sc*cc.width, y + sc*(descent + 10));
-
-
- /* lbearing, rbearing */
-
- XSetForeground (s->dpy, gc, green);
-
- sprintf (txt2, "lbearing %d", cc.lbearing);
- XDrawString (s->dpy, dest, gc,
- xoff + x + sc*cc.lbearing + 2,
- y + sc * descent + 30,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- xoff + x + sc*cc.lbearing, y - sc*ascent,
- xoff + x + sc*cc.lbearing, y + sc*descent + 20);
-
- sprintf (txt2, "rbearing %d", cc.rbearing);
- XDrawString (s->dpy, dest, gc,
- xoff + x + sc*cc.rbearing + 2,
- y + sc * descent + 40,
- txt2, strlen(txt2));
- XDrawLine (s->dpy, dest, gc,
- xoff + x + sc*cc.rbearing, y - sc*ascent,
- xoff + x + sc*cc.rbearing, y + sc*descent + 40);
-
- /* y += sc * (ascent + descent) * 2; */
- }
- }
-
- if (dest != s->window)
- XCopyArea (s->dpy, dest, s->window, s->bg_gc,
- 0, 0, s->xgwa.width, s->xgwa.height, 0, 0);
-
- XFreeGC (s->dpy, gc);
- XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap, &xftcolor);
- XftDrawDestroy (xftdraw);
- free (txt3);
-
- return s->frame_delay;
-}
-
-# endif /* DEBUG */
-
-
-/* Render all the words to the screen, and run the animation one step.
- Clear screen first, swap buffers after.
- */
-static unsigned long
-fontglide_draw (Display *dpy, Window window, void *closure)
-{
- state *s = (state *) closure;
- int i;
-
-# ifdef DEBUG
- if (s->debug_metrics_p)
- return fontglide_draw_metrics (closure);
-# endif /* DEBUG */
-
- if (s->spawn_p)
- more_sentences (s);
-
- if (!s->trails_p)
- XFillRectangle (s->dpy, s->b, s->bg_gc,
- 0, 0, s->xgwa.width, s->xgwa.height);
-
- for (i = 0; i < s->nsentences; i++)
- draw_sentence (s, s->sentences[i]);
-
-# ifdef DEBUG
- if (s->debug_p && (s->prev_font_name || s->next_font_name))
- {
- if (! s->label_gc)
- {
- if (! s->metrics_font2)
- s->metrics_font2 = XLoadQueryFont (s->dpy, "fixed");
- s->label_gc = XCreateGC (dpy, s->b, 0, 0);
- XSetFont (s->dpy, s->label_gc, s->metrics_font2->fid);
- }
- if (s->prev_font_name)
- XDrawString (s->dpy, s->b, s->label_gc,
- 10, 10 + s->metrics_font2->ascent,
- s->prev_font_name, strlen(s->prev_font_name));
- if (s->next_font_name)
- XDrawString (s->dpy, s->b, s->label_gc,
- 10, 10 + s->metrics_font2->ascent * 2,
- s->next_font_name, strlen(s->next_font_name));
- }
-# endif /* DEBUG */
-
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- if (s->backb)
- {
- XdbeSwapInfo info[1];
- info[0].swap_window = s->window;
- info[0].swap_action = (s->dbeclear_p ? XdbeBackground : XdbeUndefined);
- XdbeSwapBuffers (s->dpy, info, 1);
- }
- else
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- if (s->dbuf)
- {
- XCopyArea (s->dpy, s->b, s->window, s->bg_gc,
- 0, 0, s->xgwa.width, s->xgwa.height, 0, 0);
- }
-
- return s->frame_delay;
-}
-
-
-
-/* When the subprocess has generated some output, this reads as much as it
- can into s->buf at s->buf_tail.
- */
-static void
-drain_input (state *s)
-{
- while (s->buf_tail < sizeof(s->buf) - 2)
- {
- int c = textclient_getc (s->tc);
- if (c > 0)
- s->buf[s->buf_tail++] = (char) c;
- else
- break;
- }
-}
-
-
-/* Window setup and resource loading */
-
-static void *
-fontglide_init (Display *dpy, Window window)
-{
- XGCValues gcv;
- state *s = (state *) calloc (1, sizeof(*s));
- s->dpy = dpy;
- s->window = window;
- s->frame_delay = get_integer_resource (dpy, "delay", "Integer");
-
- XGetWindowAttributes (s->dpy, s->window, &s->xgwa);
-
- s->font_override = get_string_resource (dpy, "font", "Font");
- if (s->font_override && (!*s->font_override || *s->font_override == '(')) {
- free (s->font_override);
- s->font_override = 0;
- }
-
- s->charset = get_string_resource (dpy, "fontCharset", "FontCharset");
- s->border_width = get_integer_resource (dpy, "fontBorderWidth", "Integer");
- if (s->border_width < 0 || s->border_width > 20)
- s->border_width = 1;
-
- s->speed = get_float_resource (dpy, "speed", "Float");
- if (s->speed <= 0 || s->speed > 200)
- s->speed = 1;
-
- s->linger = get_float_resource (dpy, "linger", "Float");
- if (s->linger <= 0 || s->linger > 200)
- s->linger = 1;
-
- s->trails_p = get_boolean_resource (dpy, "trails", "Trails");
-
-# ifdef DEBUG
- s->debug_p = get_boolean_resource (dpy, "debug", "Debug");
- s->debug_metrics_p = (get_boolean_resource (dpy, "debugMetrics", "Debug")
- ? 199 : 0);
- s->debug_scale = 6;
-
-# ifdef HAVE_JWXYZ
- if (s->debug_metrics_p && !s->font_override)
- s->font_override = "Helvetica Bold 16";
-# endif
-
-# endif /* DEBUG */
-
- s->dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- s->dbuf = False;
-# endif
-
-# ifdef DEBUG
- if (s->debug_metrics_p) s->trails_p = False;
-# endif /* DEBUG */
-
- if (s->trails_p) s->dbuf = False; /* don't need it in this case */
-
- {
- char *ss = get_string_resource (dpy, "mode", "Mode");
- if (!ss || !*ss || !strcasecmp (ss, "random"))
- s->mode = ((random() % 2) ? SCROLL : PAGE);
- else if (!strcasecmp (ss, "scroll"))
- s->mode = SCROLL;
- else if (!strcasecmp (ss, "page"))
- s->mode = PAGE;
- else if (!strcasecmp (ss, "chars") || !strcasecmp (ss, "char"))
- s->mode = CHARS;
- else
- {
- fprintf (stderr,
- "%s: `mode' must be `scroll', `page', or `random', not `%s'\n",
- progname, ss);
- }
- if (ss) free (ss);
- }
-
- if (s->dbuf)
- {
-#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- s->dbeclear_p = get_boolean_resource (dpy, "useDBEClear", "Boolean");
- if (s->dbeclear_p)
- s->b = xdbe_get_backbuffer (dpy, window, XdbeBackground);
- else
- s->b = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
- s->backb = s->b;
-#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
-
- if (!s->b)
- {
- s->ba = XCreatePixmap (s->dpy, s->window,
- s->xgwa.width, s->xgwa.height,
- s->xgwa.depth);
- s->b = s->ba;
- }
- }
- else
- {
- s->b = s->window;
- }
-
- gcv.foreground = get_pixel_resource (s->dpy, s->xgwa.colormap,
- "background", "Background");
- s->bg_gc = XCreateGC (s->dpy, s->b, GCForeground, &gcv);
-
- s->nsentences = 5; /* #### */
- s->sentences = (sentence **) calloc (s->nsentences, sizeof (sentence *));
- s->spawn_p = True;
-
- s->early_p = True;
- s->start_time = time ((time_t *) 0);
- s->tc = textclient_open (dpy);
-
- return s;
-}
-
-
-static Bool
-fontglide_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
-# ifdef DEBUG
- state *s = (state *) closure;
-
- if (! s->debug_metrics_p)
- return False;
- if (event->xany.type == KeyPress)
- {
- static const unsigned long max = 0x110000;
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
-
- if (s->entering_unicode_p > 0)
- {
- unsigned digit;
- unsigned long new_char = 0;
-
- if (c >= 'a' && c <= 'f')
- digit = c + 0xa - 'a';
- else if (c >= 'A' && c <= 'F')
- digit = c + 0xa - 'A';
- else if (c >= '0' && c <= '9')
- digit = c + 0 - '0';
- else
- {
- s->entering_unicode_p = 0;
- return True;
- }
-
- if (s->entering_unicode_p == 1)
- new_char = 0;
- else if (s->entering_unicode_p == 2)
- new_char = s->debug_metrics_p;
-
- new_char = (new_char << 4) | digit;
- if (new_char > 0 && new_char < max)
- {
- s->debug_metrics_p = new_char;
- s->entering_unicode_p = 2;
- }
- else
- s->entering_unicode_p = 0;
- return True;
- }
-
- if (c == '\t')
- s->debug_metrics_antialiasing_p ^= True;
- else if (c == 3 || c == 27)
- exit (0);
- else if (c >= ' ')
- s->debug_metrics_p = (unsigned char) c;
- else if (keysym == XK_Left || keysym == XK_Right)
- {
- s->debug_metrics_p += (keysym == XK_Left ? -1 : 1);
- if (s->debug_metrics_p >= max)
- s->debug_metrics_p = 1;
- else if (s->debug_metrics_p <= 0)
- s->debug_metrics_p = max - 1;
- return True;
- }
- else if (keysym == XK_Prior)
- s->debug_metrics_p = (s->debug_metrics_p + max - 0x80) % max;
- else if (keysym == XK_Next)
- s->debug_metrics_p = (s->debug_metrics_p + 0x80) % max;
- else if (keysym == XK_Up)
- s->debug_scale++;
- else if (keysym == XK_Down)
- s->debug_scale = (s->debug_scale > 1 ? s->debug_scale-1 : 1);
- else if (keysym == XK_F1)
- s->entering_unicode_p = 1;
- else
- return False;
- return True;
- }
-# endif /* DEBUG */
-
- return False;
-}
-
-
-static void
-fontglide_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- state *s = (state *) closure;
- XGetWindowAttributes (s->dpy, s->window, &s->xgwa);
-
- if (s->dbuf && s->ba)
- {
- XFreePixmap (s->dpy, s->ba);
- s->ba = XCreatePixmap (s->dpy, s->window,
- s->xgwa.width, s->xgwa.height,
- s->xgwa.depth);
- XFillRectangle (s->dpy, s->ba, s->bg_gc, 0, 0,
- s->xgwa.width, s->xgwa.height);
- s->b = s->ba;
- }
-}
-
-static void
-fontglide_free (Display *dpy, Window window, void *closure)
-{
- state *s = (state *) closure;
- int i;
-
- textclient_close (s->tc);
-
-/* if (s->b && s->b != s->window) XFreePixmap (dpy, s->b); */
-/* if (s->ba && s->ba != s->b) XFreePixmap (dpy, s->ba); */
- XFreeGC (dpy, s->bg_gc);
- if (s->charset) free (s->charset);
- if (s->font_override) free (s->font_override);
- for (i = 0;i < s->nsentences; i++)
- if (s->sentences[i])
- free_sentence (s, s->sentences[i]);
- free (s->sentences);
-
-#ifdef DEBUG
- if (s->metrics_xftfont)
- XftFontClose (s->dpy, s->metrics_xftfont);
- if (s->metrics_font1)
- XFreeFont (s->dpy, s->metrics_font1);
- if (s->metrics_font2 && s->metrics_font1 != s->metrics_font2)
- XFreeFont (s->dpy, s->metrics_font2);
- if (s->prev_font_name) free (s->prev_font_name);
- if (s->next_font_name) free (s->next_font_name);
- if (s->label_gc) XFreeGC (dpy, s->label_gc);
-#endif
-
- free (s);
-}
-
-
-static const char *fontglide_defaults [] = {
- ".background: #000000",
- ".foreground: #DDDDDD",
- ".borderColor: #555555",
- "*delay: 10000",
- "*program: xscreensaver-text",
- "*usePty: false",
- "*mode: random",
- ".font: (default)",
-
- /* I'm not entirely clear on whether the charset of an XLFD has any
- meaning when Xft is being used. */
- "*fontCharset: iso8859-1",
-/*"*fontCharset: iso10646-1", */
-/*"*fontCharset: *-*",*/
-
- "*fontBorderWidth: 2",
- "*speed: 1.0",
- "*linger: 1.0",
- "*trails: False",
-# ifdef DEBUG
- "*debug: False",
- "*debugMetrics: False",
-# endif /* DEBUG */
- "*doubleBuffer: True",
-# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
- "*useDBE: True",
- "*useDBEClear: True",
-# endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
- 0
-};
-
-static XrmOptionDescRec fontglide_options [] = {
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-scroll", ".mode", XrmoptionNoArg, "scroll" },
- { "-page", ".mode", XrmoptionNoArg, "page" },
- { "-random", ".mode", XrmoptionNoArg, "random" },
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-linger", ".linger", XrmoptionSepArg, 0 },
- { "-program", ".program", XrmoptionSepArg, 0 },
- { "-font", ".font", XrmoptionSepArg, 0 },
- { "-fn", ".font", XrmoptionSepArg, 0 },
- { "-bw", ".fontBorderWidth", XrmoptionSepArg, 0 },
- { "-trails", ".trails", XrmoptionNoArg, "True" },
- { "-no-trails", ".trails", XrmoptionNoArg, "False" },
- { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
- { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
-# ifdef DEBUG
- { "-debug", ".debug", XrmoptionNoArg, "True" },
- { "-debug-metrics", ".debugMetrics", XrmoptionNoArg, "True" },
-# endif /* DEBUG */
- { 0, 0, 0, 0 }
-};
-
-
-XSCREENSAVER_MODULE ("FontGlide", fontglide)
diff --git a/hacks/fontglide.man b/hacks/fontglide.man
deleted file mode 100644
index 0edcb3b..0000000
--- a/hacks/fontglide.man
+++ /dev/null
@@ -1,124 +0,0 @@
-.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
-.SH NAME
-fontglide \- characters float onto the screen to form words
-.SH SYNOPSIS
-.B fontglide
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-scroll\fP]
-[\-page\fP]
-[\-random\fP]
-[\-speed \fIfloat\fP]
-[\-linger \fIfloat\fP]
-[\-program \fIsh-command\fP]
-[\-font \fIfont-name\fP]
-[\-bw \fIint\fP]
-[\-trails]
-[\-db]
-[\-debug]
-[\-fps]
-.SH DESCRIPTION
-The \fIfontglide\fP program reads text from a subprocess and puts it on
-the screen using large characters that glide in from the edges,
-assemble, then disperse. Alternately, it can simply scroll whole
-sentences from right to left.
-.SH OPTIONS
-.I fontglide
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-The delay between steps of the animation, in microseconds: default 10000.
-.TP 8
-.B \-page
-With this option, a page full of text will glide in, and disperse.
-.TP 8
-.B \-scroll
-With this option, sentences will scroll by from right to left.
-.TP 8
-.B \-random
-The default is to pick randomly between \fI\-page\fP and \fI\-scroll\fP.
-.TP 8
-.B \-speed \fIfloat\fP
-How fast to animate; 2 means twice as fast, 0.5 means half as fast.
-Default 1.0.
-.TP 8
-.B \-linger \fIfloat\fP
-How long to leave the assembled text on the screen in \fI\-page\fP mode;
-2 means twice as long, 0.5 means half as long. Default 1.0. (The more
-words there are on the screen, the longer it lingers.)
-.TP 8
-.B \-program \fIsh-command\fP
-The command to run to generate the text to display. This option may be
-any string acceptable to /bin/sh. The program will be run at the end of
-a pipe, and any words that it prints to \fIstdout\fP will end up on
-the window. (Whitespace and line breaks are ignored.) If the program
-exits, it will be launched again after we have processed all the text
-it produced. Default:
-.BR xscreensaver\-text (MANSUFFIX).
-.TP 8
-.B \-font\fP \fIstring\fP
-The base font pattern to use when loading fonts. The default is to search
-for any Latin1 scalable proportional fonts on the system. Once a base font
-is selected, it will be loaded in a random size.
-.TP 8
-.B \-bw \fIint\fP
-How thick an outline to draw around the characters. Default 2 pixels.
-.TP 8
-.B \-trails\fP
-Leave "vapor trails" behind the moving text. Default off.
-.TP 8
-.B \-no-db\fP
-Turn off double-buffering. It may be faster, but will flicker.
-.TP 8
-.B \-debug\fP
-Draw some boxes showing character metrics, and print the name of the
-current font to stderr.
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR xscreensaver (1),
-.BR xscreensaver\-text (MANSUFFIX),
-.BR fortune (1),
-.BR phosphor (MANSUFFIX),
-.BR apple2 (MANSUFFIX),
-.BR starwars (MANSUFFIX),
-.BR ljlatest (MANSUFFIX),
-.BR dadadodo (1),
-.BR webcollage (MANSUFFIX),
-.BR driftnet (1)
-.BR EtherPEG ,
-.BR EtherPeek
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 15-Sep-2003.
diff --git a/hacks/fonts/Makefile.in b/hacks/fonts/Makefile.in
deleted file mode 100644
index 193ecec..0000000
--- a/hacks/fonts/Makefile.in
+++ /dev/null
@@ -1,96 +0,0 @@
-# hacks/fonts/Makefile.in --- xscreensaver, Copyright © 2021 Jamie Zawinski.
-# the `../configure' script generates `hacks/fonts/Makefile' from this file.
-
-@SET_MAKE@
-srcdir = @srcdir@
-VPATH = ${srcdir}
-top_srcdir = @top_srcdir@
-top_builddir = ..
-
-install_prefix =
-prefix = @prefix@
-datarootdir = @datarootdir@
-datadir = @datadir@
-FONT_DIR = @FONT_DIR@
-
-RM = rm -f
-
-STAR = *
-TARFILES = Makefile.in \
- $(STAR).ttf \
- $(STAR).otf
-
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_DIRS = @INSTALL_DIRS@
-
-# "Classic Console" is a reproduction of the MS-DOS 8x16 VGA font by
-# Deejayy. Freely redistributable. http://webdraft.hu/fonts/classic-console/
-# It us used by BSOD.
-#
-# "Gallant" was the original Solaris 2.x console font. It is used by BSOD.
-#
-# "Luxi Mono" was the Red Hat console font; it is very similar to "Gallant".
-# Also used by BSOD.
-#
-# "OCR-A Std" is the ANSI Standard Optical Character Recognition font,
-# ANSI X3.17-1981 / ISO 1073-1:1976. It is used by Esper, MemScroller,
-# Carousel and Photopile.
-#
-# "Special Elite Regular" is a typewriter font by Astigmatic One Eye
-# Typographic Institute, Brian J. Bonislawsky. Apache 2.0 license.
-# https://www.1001fonts.com/special-elite-font.html
-# Used by XJack.
-#
-FONTS = clacon.ttf \
- gallant12x22.ttf \
- luximr.ttf \
- OCRAStd.otf \
- SpecialElite.ttf
-
-default: all
-
-all:
-clean:
-distclean:: clean
- -rm -f Makefile TAGS *~ "#"*
-
-list_tarfiles:
- @find $(TARFILES) -type f -print | sort
-
-install:: install-fonts
-install-fonts:
- @if [ -z "$(FONT_DIR)" ]; then \
- echo "not installing fonts" ; \
- else \
- dest="$(install_prefix)$(FONT_DIR)" ; \
- if [ ! -d "$$dest" ]; then \
- echo $(INSTALL_DIRS) "$$dest" ; \
- $(INSTALL_DIRS) "$$dest" ; \
- fi ; \
- for f in $(FONTS) ; do \
- echo $(INSTALL_DATA) $$f $$dest/$$f ; \
- $(INSTALL_DATA) $$f $$dest/$$f ; \
- done ; \
- fi
-
-uninstall:: uninstall-fonts
-uninstall-fonts:
- @if ! [ -z "$(FONT_DIR)" ]; then \
- dest="$(install_prefix)$(FONT_DIR)" ; \
- for f in $(FONTS) ; do \
- echo $(RM) $$dest/$$f ; \
- $(RM) $$dest/$$f ; \
- done ; \
- rmdir "$(install_prefix)$(FONT_DIR)" ; \
- exit 0 ; \
- fi
-
-install-program:
-install-man:
-install-strip:
-uninstall-program:
-uninstall-man:
-depend:
-distdepend:
-tags:
diff --git a/hacks/fonts/OCRAStd.otf b/hacks/fonts/OCRAStd.otf
deleted file mode 100644
index aee7c35..0000000
--- a/hacks/fonts/OCRAStd.otf
+++ /dev/null
Binary files differ
diff --git a/hacks/fonts/SpecialElite.ttf b/hacks/fonts/SpecialElite.ttf
deleted file mode 100644
index b62fddb..0000000
--- a/hacks/fonts/SpecialElite.ttf
+++ /dev/null
Binary files differ
diff --git a/hacks/fonts/clacon.ttf b/hacks/fonts/clacon.ttf
deleted file mode 100644
index c7b98fc..0000000
--- a/hacks/fonts/clacon.ttf
+++ /dev/null
Binary files differ
diff --git a/hacks/fonts/gallant12x22.ttf b/hacks/fonts/gallant12x22.ttf
deleted file mode 100644
index c7ce0dc..0000000
--- a/hacks/fonts/gallant12x22.ttf
+++ /dev/null
Binary files differ
diff --git a/hacks/fonts/luximr.ttf b/hacks/fonts/luximr.ttf
deleted file mode 100644
index 6ad6e12..0000000
--- a/hacks/fonts/luximr.ttf
+++ /dev/null
Binary files differ
diff --git a/hacks/forest.c b/hacks/forest.c
deleted file mode 100644
index 6afd98f..0000000
--- a/hacks/forest.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/* forest.c (aka xtree.c), Copyright (c) 1999
- * Peter Baumung <unn6@rz.uni-karlsruhe.de>
- *
- * Most code taken from
- * xscreensaver, Copyright (c) 1992, 1995, 1997
- * Jamie Zawinski <jwz@netscape.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* ****************************** NOTE ******************************
-
- This is not the xlockmore version of forest, but a much better
- looking rewrite. Be careful not to delete it in a merging frenzy...
-
- **********************************************************************
- */
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 500000 \n" \
- "*ncolors: 20 \n" \
- "*fpsSolid: true \n" \
-
-# include "xlockmore.h" /* from the xscreensaver distribution */
-# define free_trees 0
-# define release_trees 0
-# define reshape_trees 0
-# define trees_handle_event 0
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-ENTRYPOINT ModeSpecOpt trees_opts = {0, NULL, 0, NULL, NULL};
-
-typedef struct {
- int x;
- int y;
- int thick;
- double size;
- long color;
- int toDo;
- int pause;
- int season;
-} treestruct;
-
-static treestruct *trees = NULL;
-
-static XColor colors[20];
-static int color;
-
-static long colorM[12] = {0xff0000, 0xff8000, 0xffff00, 0x80ff00,
- 0x00ff00, 0x00ff80, 0x00ffff, 0x0080ff,
- 0x0000ff, 0x8000ff, 0xff00ff, 0xff0080};
-
-static long colorV[12] = {0x0a0000, 0x0a0500, 0x0a0a00, 0x050a00,
- 0x000a00, 0x000a05, 0x000a0a, 0x00050a,
- 0x00000a, 0x05000a, 0x0a000a, 0x0a0005};
-
-ENTRYPOINT void
-init_trees(ModeInfo * mi)
-{
- treestruct *tree;
- Display *display = MI_DISPLAY(mi);
- GC gc = MI_GC(mi);
- int i;
-
- if (trees == NULL) {
-
- if (mi->npixels > 20) {
- printf("%d colors selected. Setting limit to 20...\n", mi->npixels);
- mi->npixels = 20;
- }
-
- if (mi->npixels < 4) {
- for (i = 0; i < mi->npixels; i++) {
- colors[i].red = 65535 * (i & 1);
- colors[i].green = 65535 * (i & 1);
- colors[i].blue = 65535 * (i & 1);
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- } else {
- if (mi->npixels < 8) {
- for (i = 0; i < mi->npixels; i++) {
- colors[i].red = 32768 + 4096 * (i % 4);
- colors[i].green = 32768 + 4096 * (i % 4);
- colors[i].blue = 32768 + 4096 * (i % 4);
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- } else {
- for (i = 0; i < mi->npixels; i++) {
- colors[i].red = 24576 + 4096 * (i % 4);
- colors[i].green = 10240 + 2048 * (i % 4);
- colors[i].blue = 0;
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- }
- }
-
- for (i = 0; i < mi->npixels; i++)
- if (!XAllocColor(display, mi->xgwa.colormap, &colors[i])) break;
- color = i;
-
- XSetForeground(display, gc, colors[1].pixel);
- }
-
- MI_INIT (mi, trees);
-
- XClearWindow(display, MI_WINDOW(mi));
- XSetLineAttributes(display, gc, 2, LineSolid, CapButt, JoinMiter);
- tree = &trees[MI_SCREEN(mi)];
- tree->toDo = 25;
- tree->season = NRAND(12);
-
- for (i = 4; i < mi->npixels; i++) {
- int sIndex = (tree->season + (i-4) / 4) % 12;
- long color = colorM[sIndex] - 2 * colorV[sIndex] * (i % 4);
- colors[i].red = (color & 0xff0000) / 256;
- colors[i].green = (color & 0x00ff00);
- colors[i].blue = (color & 0x0000ff) * 256;
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
-
- for (i = 0; i < mi->npixels; i++)
- if (!XAllocColor(display, mi->xgwa.colormap, &colors[i])) break;
-
- color = i;
-}
-
-static double rRand(double a, double b)
-{
- return (a+(b-a)*NRAND(10001)/10000.0);
-}
-
-static void draw_line(ModeInfo * mi,
- int x1, int y1, int x2, int y2,
- double angle, int widths, int widthe)
-{
-
- Display *display = MI_DISPLAY(mi);
- GC gc = MI_GC(mi);
- double sns = 0.5*widths*sin(angle + M_PI_2);
- double css = 0.5*widths*cos(angle + M_PI_2);
- double sne = 0.5*widthe*sin(angle + M_PI_2);
- double cse = 0.5*widthe*cos(angle + M_PI_2);
-
- int xs1 = (int) (x1-sns);
- int xs2 = (int) (x1+sns);
- int ys1 = (int) (y1-css);
- int ys2 = (int) (y1+css);
- int xe1 = (int) (x2-sne);
- int xe2 = (int) (x2+sne);
- int ye1 = (int) (y2-cse);
- int ye2 = (int) (y2+cse);
- int i;
-
- for (i = 0; i < widths; i++) {
- if (color >= 4)
- XSetForeground(display, gc, colors[i*4/widths].pixel);
- XDrawLine(display, MI_WINDOW(mi), gc,
- xs1+(xs2-xs1)*i/widths, ys1+(ys2-ys1)*i/widths,
- xe1+(xe2-xe1)*i/widths, ye1+(ye2-ye1)*i/widths);
- }
-}
-
-static void draw_tree_rec(ModeInfo * mi, double thick, int x, int y, double angle)
-{
- treestruct *tree = &trees[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- GC gc = MI_GC(mi);
- int length = (24+NRAND(12))*tree->size;
- int a = (int) (x - length*sin(angle));
- int b = (int) (y - length*cos(angle));
- int i;
-
- draw_line(mi, x, y, a, b, angle, thick*tree->size, 0.68*thick*tree->size);
-
- if (thick > 2) {
- draw_tree_rec(mi, 0.68*thick, a, b, 0.8*angle+rRand(-0.2, 0.2));
- if (thick < tree->thick-1) {
- draw_tree_rec(mi, 0.68*thick, a, b, angle+rRand(0.2, 0.9));
- draw_tree_rec(mi, 0.68*thick, (a+x)/2, (b+y)/2, angle-rRand(0.2, 0.9));
- }
- }
-
- if (thick < 0.5*tree->thick) {
- int nleaf = 12 + NRAND(4);
- XArc leaf[16];
- for (i = 0; i < nleaf; i++) {
- leaf[i].x = a + (int) (tree->size * rRand(-12, 12));
- leaf[i].y = b + (int) (tree->size * rRand(-12, 12));
- leaf[i].width = (int) (tree->size * rRand(2, 6));
- leaf[i].height = leaf[i].width;
- leaf[i].angle1 = 0;
- leaf[i].angle2 = 360 * 64;
- }
- if (mi->npixels >= 4)
- XSetForeground(display, gc, colors[tree->color+NRAND(4)].pixel);
- XFillArcs(display, MI_WINDOW(mi), gc, leaf, nleaf);
- }
-}
-
-ENTRYPOINT void
-draw_trees(ModeInfo * mi)
-{
- treestruct *tree = &trees[MI_SCREEN(mi)];
- int width = MI_WIN_WIDTH(mi);
- int height = MI_WIN_HEIGHT(mi);
-
- if (tree->pause == 1) {
- tree->pause--;
- init_trees(mi);
- } else if (tree->pause > 1) {
- tree->pause--;
- return;
- } else if (--(tree->toDo) == 0) {
- tree->pause = 6;
- return;
- }
-
- tree->x = NRAND(width);
- tree->y = (int) (1.25 * height * (1 - tree->toDo / 23.0));
- tree->thick = rRand(7, 12);
- tree->size = height / 480.0;
- if (color < 8) {
- tree->color = 0;
- } else {
- tree->color = 4 * (1 + NRAND(color / 4 - 1));
- }
-
- draw_tree_rec(mi, tree->thick, tree->x, tree->y, rRand(-0.1, 0.1));
-}
-
-
-XSCREENSAVER_MODULE_2 ("Forest", forest, trees)
diff --git a/hacks/forest.man b/hacks/forest.man
deleted file mode 100644
index cc46df6..0000000
--- a/hacks/forest.man
+++ /dev/null
@@ -1,62 +0,0 @@
-.TH XScreenSaver 1 "27-May-97" "X Version 11"
-.SH NAME
-forest \- draws a fractal forest
-.SH SYNOPSIS
-.B forest
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIforest\fP program draws a fractal forest.
-.SH OPTIONS
-.I forest
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 20.
-
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1995 by Pascal Pensa.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-Pascal Pensa <pensa@aurora.unice.fr>, 1995.
-
-Ability to run standalone or with \fIxscreensaver\fP added by
-Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/fps.c b/hacks/fps.c
deleted file mode 100644
index c62b867..0000000
--- a/hacks/fps.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* fps, Copyright © 2001-2021 Jamie Zawinski <jwz@jwz.org>
- * Draw a frames-per-second display (Xlib and OpenGL).
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhackI.h"
-#include "xft.h"
-#include "fpsI.h"
-
-#include <time.h>
-
-fps_state *
-fps_init (Display *dpy, Window window)
-{
- fps_state *st;
- const char *font;
- XftFont *f;
- Bool top_p;
- XWindowAttributes xgwa;
- XGCValues gcv;
- char *s;
-
- if (! get_boolean_resource (dpy, "doFPS", "DoFPS"))
- return 0;
-
- if (!strcasecmp (progname, "BSOD")) return 0; /* Never worked right */
-
- top_p = get_boolean_resource (dpy, "fpsTop", "FPSTop");
-
- st = (fps_state *) calloc (1, sizeof(*st));
-
- st->dpy = dpy;
- st->window = window;
- st->clear_p = get_boolean_resource (dpy, "fpsSolid", "FPSSolid");
-
- font = get_string_resource (dpy, "fpsFont", "Font");
-
- XGetWindowAttributes (dpy, window, &xgwa);
-
- if (!font)
- font = "monospace bold 18"; /* also texfont.c */
- f = load_xft_font_retry (dpy, screen_number (xgwa.screen), font);
- if (!f) abort();
-
- s = get_string_resource (st->dpy, "foreground", "Foreground");
- if (!s) s = strdup ("white");
- XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap, s, &st->fg);
- free (s);
- st->xftdraw = XftDrawCreate (dpy, window, xgwa.visual, xgwa.colormap);
- gcv.foreground =
- get_pixel_resource (st->dpy, xgwa.colormap, "background", "Background");
- st->erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
-
- st->font = f;
- st->x = 10;
- st->y = 10;
- if (top_p)
- st->y = - (st->font->ascent + st->font->descent + 10);
-
- {
- XGlyphInfo overall;
- XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) "m", 1, &overall);
- st->em = overall.xOff;
- }
-
-# ifdef HAVE_IPHONE
- /* Don't hide the FPS display under the iPhone X bezel.
- #### This is the worst of all possible ways to do this! But how else?
- This magic number should catch iPhone X and larger, but unfortunately
- also catches iPads which do not have the stupid bezel.
- */
- if (xgwa.width >= 1218 || xgwa.height >= 1218)
- {
- st->x += 18;
- st->y += 18 * (top_p ? -1 : 1);
- }
-# endif
-
- strcpy (st->string, "FPS: ... ");
-
- return st;
-}
-
-void
-fps_free (fps_state *st)
-{
- if (st->xftdraw) XftDrawDestroy (st->xftdraw);
- if (st->erase_gc) XFreeGC (st->dpy, st->erase_gc);
- if (st->font) XftFontClose (st->dpy, st->font);
- free (st);
-}
-
-
-void
-fps_slept (fps_state *st, unsigned long usecs)
-{
- st->slept += usecs;
-}
-
-
-double
-fps_compute (fps_state *st, unsigned long polys, double depth)
-{
- if (! st) return 0; /* too early? */
-
- /* Every N frames (where N is approximately one second's worth of frames)
- check the wall clock. We do this because checking the wall clock is
- a slow operation.
- */
- if (st->frame_count++ >= st->last_ifps)
- {
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&st->this_frame_end, &tzp);
-# else
- gettimeofday(&st->this_frame_end);
-# endif
-
- if (st->prev_frame_end.tv_sec == 0)
- st->prev_frame_end = st->this_frame_end;
- }
-
- /* If we've probed the wall-clock time, regenerate the string.
- */
- if (st->this_frame_end.tv_sec != st->prev_frame_end.tv_sec)
- {
- double uprev_frame_end = (st->prev_frame_end.tv_sec +
- ((double) st->prev_frame_end.tv_usec
- * 0.000001));
- double uthis_frame_end = (st->this_frame_end.tv_sec +
- ((double) st->this_frame_end.tv_usec
- * 0.000001));
- double fps = st->frame_count / (uthis_frame_end - uprev_frame_end);
- double idle = (((double) st->slept * 0.000001) /
- (uthis_frame_end - uprev_frame_end));
- double load = 100 * (1 - idle);
-
- if (load < 0) load = 0; /* well that's obviously nonsense... */
-
- st->prev_frame_end = st->this_frame_end;
- st->frame_count = 0;
- st->slept = 0;
- st->last_ifps = fps;
- st->last_fps = fps;
-
- sprintf (st->string, (polys
- ? "FPS: %.1f \nLoad: %.1f%% "
- : "FPS: %.1f \nLoad: %.1f%% "),
- fps, load);
-
- if (polys > 0)
- {
- const char *s = "";
-# if 0
- if (polys >= (1024 * 1024)) polys >>= 20, s = "M";
- else if (polys >= 2048) polys >>= 10, s = "K";
-# endif
-
- strcat (st->string, "\nPolys: ");
- if (polys >= 1000000)
- sprintf (st->string + strlen(st->string), "%lu,%03lu,%03lu%s ",
- (polys / 1000000), ((polys / 1000) % 1000),
- (polys % 1000), s);
- else if (polys >= 1000)
- sprintf (st->string + strlen(st->string), "%lu,%03lu%s ",
- (polys / 1000), (polys % 1000), s);
- else
- sprintf (st->string + strlen(st->string), "%lu%s ", polys, s);
- }
-
- if (depth >= 0.0)
- {
- const char *s = "";
- unsigned long ldepth = depth;
-# if 0
- if (depth >= (1024 * 1024 * 1024))
- ldepth = depth / (1024 * 1024 * 1024), s = "G";
- else if (depth >= (1024 * 1024)) ldepth >>= 20, s = "M";
- else if (depth >= 2048) ldepth >>= 10, s = "K";
-# endif
- strcat (st->string, "\nDepth: ");
- if (ldepth >= 1000000000)
- sprintf (st->string + strlen(st->string),
- "%lu,%03lu,%03lu,%03lu%s ",
- (ldepth / 1000000000),
- ((ldepth / 1000000) % 1000),
- ((ldepth / 1000) % 1000),
- (ldepth % 1000), s);
- else if (ldepth >= 1000000)
- sprintf (st->string + strlen(st->string), "%lu,%03lu,%03lu%s ",
- (ldepth / 1000000), ((ldepth / 1000) % 1000),
- (ldepth % 1000), s);
- else if (ldepth >= 1000)
- sprintf (st->string + strlen(st->string), "%lu,%03lu%s ",
- (ldepth / 1000), (ldepth % 1000), s);
- else if (*s)
- sprintf (st->string + strlen(st->string), "%lu%s ",
- ldepth, s);
- else
- {
- int L;
- sprintf (st->string + strlen(st->string), "%.1f", depth);
- L = strlen (st->string);
- /* Remove trailing ".0" in case depth is not a fraction. */
- if (st->string[L-2] == '.' && st->string[L-1] == '0')
- st->string[L-2] = 0;
- }
- }
- }
-
- return st->last_fps;
-}
-
-
-/* This function is used only in Xlib mode. For GL mode, see glx/fps-gl.c.
- */
-void
-fps_draw (fps_state *st)
-{
- XWindowAttributes xgwa;
- const char *string = st->string;
- const char *s;
- int x = st->x;
- int y = st->y;
- int lines = 1;
- int lh = st->font->ascent + st->font->descent;
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
-
- for (s = string; *s; s++)
- if (*s == '\n') lines++;
-
- if (y < 0)
- y = -y + (lines-1) * lh;
- else
- y = xgwa.height - y;
-
- y -= lh * (lines-1) + st->font->descent;
-
- /* clear the background */
- if (st->clear_p)
- {
- int w, h;
- int olines = lines;
- const char *ostring = string;
- int maxw = 0;
- while (lines)
- {
- s = strchr (string, '\n');
- if (! s) s = string + strlen(string);
-# if 0
- {
- XGlyphInfo overall;
- XftTextExtentsUtf8 (st->dpy, st->font, (FcChar8 *) string,
- s - string, &overall);
- w = overall.width - overall.x + st->em;
- }
-# else
- /* Measuring the font is slow, let's just assume this will fit. */
- w = st->em * 12; /* "Load: 100.0%" */
-# endif
- if (w > maxw) maxw = w;
- string = s;
- string++;
- lines--;
- }
- w = maxw;
- h = olines * (st->font->ascent + st->font->descent);
-
- XFillRectangle (st->dpy, st->window, st->erase_gc,
- x - st->font->descent,
- y - lh,
- w + 2*st->font->descent,
- h + 2*st->font->descent);
-
-
- lines = olines;
- string = ostring;
- }
-
- /* draw the text */
- while (lines)
- {
- s = strchr (string, '\n');
- if (! s) s = string + strlen(string);
- XftDrawStringUtf8 (st->xftdraw, &st->fg, st->font,
- x, y, (FcChar8 *) string, s - string);
- string = s;
- string++;
- lines--;
- y += lh;
- }
-}
diff --git a/hacks/fps.h b/hacks/fps.h
deleted file mode 100644
index 2678217..0000000
--- a/hacks/fps.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* fps, Copyright (c) 2001-2011 Jamie Zawinski <jwz@jwz.org>
- * Draw a frames-per-second display (Xlib and OpenGL).
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __XSCREENSAVER_FPS_H__
-# define __XSCREENSAVER_FPS_H__
-
-typedef struct fps_state fps_state;
-
-extern fps_state *fps_init (Display *, Window);
-extern void fps_free (fps_state *);
-extern void fps_slept (fps_state *, unsigned long usecs);
-extern double fps_compute (fps_state *, unsigned long polys, double depth);
-extern void fps_draw (fps_state *);
-
-/* Doesn't really belong here, but close enough. */
-#ifdef HAVE_MOBILE
- extern double current_device_rotation (void);
-#else
-# define current_device_rotation() (0)
-#endif
-
-#endif /* __XSCREENSAVER_FPS_H__ */
diff --git a/hacks/fpsI.h b/hacks/fpsI.h
deleted file mode 100644
index 87e9f82..0000000
--- a/hacks/fpsI.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* fps, Copyright (c) 2001-2021 Jamie Zawinski <jwz@jwz.org>
- * Draw a frames-per-second display (Xlib and OpenGL).
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __XSCREENSAVER_FPSI_H__
-# define __XSCREENSAVER_FPSI_H__
-
-#include "fps.h"
-
-struct fps_state {
- Display *dpy;
- Window window;
- int x, y, em;
- XftFont *font;
- Bool clear_p;
- char string[1024];
-
- /* for glx/fps-gl.c */
- void *gl_fps_data;
-
- XftColor fg;
- XftDraw *xftdraw;
- GC erase_gc;
-
- int last_ifps;
- double last_fps;
- int frame_count;
- unsigned long slept;
- struct timeval prev_frame_end, this_frame_end;
-};
-
-#endif /* __XSCREENSAVER_FPSI_H__ */
diff --git a/hacks/fuzzyflakes.c b/hacks/fuzzyflakes.c
deleted file mode 100644
index db6524c..0000000
--- a/hacks/fuzzyflakes.c
+++ /dev/null
@@ -1,654 +0,0 @@
-/* fuzzyflakes, Copyright (c) 2004
- * Barry Dmytro <badcherry@mailc.net>
- *
- * ! 2004.06.10 21:05
- * ! - Added support for resizing
- * ! - Added a color scheme generation algorithm
- * ! Thanks to <ZoeB> from #vegans@irc.blitzed.org
- * ! - Added random color generation
- * ! - Fixed errors in the xml config file
- * ! - Cleaned up a few inconsistencies in the code
- * ! - Changed the default color to #EFBEA5
- *
- * ! 2004.05.?? ??:??
- * ! -original creation
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <math.h>
-#include "screenhack.h"
-
-/* I have need of 1/3 and 2/3 constants later on */
-#define N1_3 0.3333333333
-#define N2_3 0.6666666666
-
-typedef struct _flake_var
-{
- double Ticks;
- double XPos, YPos;
- double TrueX;
- double XOffset;
- double Angle;
-} FlakeVariable;
-
-/* Struct containing the atrributes to our flakes */
-typedef struct _flake
-{
- Display *dpy;
- Window window;
-
- int Arms;
- int Thickness;
- int BorderThickness;
- int Radius;
- unsigned long BordColor;
- unsigned long ForeColor;
- unsigned long BackColor;
- Bool RandomColors;
- int Layers;
- int Density;
- int Delay;
- int FallingSpeed;
- struct _colors
- {
- char *Fore;
- char *Bord;
- char *Back;
- } Colors;
-/* a dynamic array containing positions of all the flakes */
- FlakeVariable ***Flakes;
- XGCValues GCValues;
- unsigned long GCFlags;
- GC GCVar;
- XWindowAttributes XGWA;
- struct _dbevar
- {
- Bool dbuf;
- Pixmap b, ba, bb;
- } DB;
-} Flake;
-
-/*
- *This gets the pixel resource for a color: #ffffff
- */
-static unsigned int
-FuzzyFlakesColorResource(Flake *flake, char *Color)
-{
- XColor color;
-
- if (!XParseColor(flake->dpy, flake->XGWA.colormap, Color, &color))
- {
- fprintf(stderr, "%s: can't parse color %s", progname, Color);
- return 0;
- }
- if (!XAllocColor(flake->dpy, flake->XGWA.colormap, &color))
- {
- fprintf(stderr, "%s: can't allocate color %s", progname, Color);
- return 0;
- }
- return color.pixel;
-}
-
-/*
- * This is a great color matching algorithm that I got from
- * a friend of mine on #vegans@irc.blitzed.org
- * She wrote it in PHP and I ported it over to C
- * her site is http://beautifulfreak.net/
- */
-static int
-FuzzyFlakesColorHelper(Flake *flake)
-{
- unsigned int iR, iG, iB;
- unsigned int iR0, iG0, iB0;
- unsigned int iR1, iG1, iB1;
- float fR, fG, fB;
- float Max = 0, Min = 0, Lig, Sat;
- float Hue, Hue0, Hue1;
- float f1, f2;
- float fR0, fG0, fB0;
- float fR1, fG1, fB1;
- float nR0, nG0, nB0;
- float nR1, nG1, nB1;
- XColor color;
-
- /* First convert from hex to dec */
- /* while splitting up the RGB values */
- if (!XParseColor(flake->dpy, flake->XGWA.colormap,
- flake->Colors.Back, &color))
- {
- fprintf(stderr, "%s: can't parse color %s", progname,
- flake->Colors.Back);
- return 1;
- }
- iR = color.red >> 8;
- iG = color.green >> 8;
- iB = color.blue >> 8;
-
- /* Convert from int to float */
- fR = iR;
- fG = iG;
- fB = iB;
-
- /* convert from 0-255 to 0-1 */
- fR = fR / 255;
- fG = fG / 255;
- fB = fB / 255;
-
- /* work out the lightness */
- if (fR >= fG && fR >= fB)
- Max = fR;
- if (fG >= fR && fG >= fB)
- Max = fG;
- if (fB >= fR && fB >= fG)
- Max = fB;
-
- if (fR <= fG && fR <= fB)
- Min = fR;
- if (fG <= fR && fG <= fB)
- Min = fG;
- if (fB <= fR && fB <= fG)
- Min = fB;
-
- Lig = (Max + Min) / 2;
-
- /* work out the saturation */
- if (Max == Min)
- Sat = 0;
- else
- {
- if (Lig < 0.5)
- Sat = (Max - Min) / (Max + Min);
- else
- Sat = (Max - Min) / (2 - Max - Min);
- }
-
- /*
- * if our satration is too low we won't be
- * able to see any objects
- */
- if (Sat < 0.03)
- {
- return 1;
- }
-
- /* work out the hue */
- if (fR == Max)
- Hue = (fG - fB) / (Max - Min);
- else if (fG == Max)
- Hue = 2 + (fB - fR) / (Max - Min);
- else
- Hue = 4 + (fR - fG) / (Max - Min);
-
- Hue = Hue / 6;
-
- /* fine two equidistant hues */
- Hue0 = Hue + N1_3;
- if (Hue0 > 1)
- Hue0 = Hue0 - 1;
- Hue1 = Hue0 + N1_3;
- if (Hue1 > 1)
- Hue1 = Hue1 - 1;
-
- /* convert the colors into hex codes */
- if (Lig < 0.5)
- f2 = Lig * (1 + Sat);
- else
- f2 = (Lig + Sat) - (Lig * Sat);
-
- f1 = (2 * Lig) - f2;
-
- fR0 = (Hue0 + 1) / 3;
- fR1 = (Hue1 + 1) / 3;
- fG0 = Hue0;
- fG1 = Hue1;
- fB0 = (Hue0 - 1) / 3;
- fB1 = (Hue1 - 1) / 3;
-
- if (fR0 < 0)
- fR0 = fR0 + 1;
- if (fR0 > 1)
- fR0 = fR0 - 1;
- if (fG0 < 0)
- fG0 = fG0 + 1;
- if (fG0 > 1)
- fG0 = fG0 - 1;
- if (fB0 < 0)
- fB0 = fB0 + 1;
- if (fB0 > 1)
- fB0 = fB0 - 1;
-
- if (fR1 < 0)
- fR1 = fR1 + 1;
- if (fR1 > 1)
- fR1 = fR1 - 1;
- if (fG1 < 0)
- fG1 = fG1 + 1;
- if (fG1 > 1)
- fG1 = fG1 - 1;
- if (fB1 < 0)
- fB1 = fB1 + 1;
- if (fB1 > 1)
- fB1 = fB1 - 1;
-
- if (6 * fR0 < 1)
- nR0 = f1 + (f2 - f1) * 6 * fR0;
- else if (2 * fR0 < 1)
- nR0 = f2;
- else if (3 * fR0 < 2)
- nR0 = f1 + (f2 - f1) * (N2_3 - fR0) * 6;
- else
- nR0 = f1;
-
- if (6 * fG0 < 1)
- nG0 = f1 + (f2 - f1) * 6 * fG0;
- else if (2 * fG0 < 1)
- nG0 = f2;
- else if (3 * fG0 < 2)
- nG0 = f1 + (f2 - f1) * (N2_3 - fG0) * 6;
- else
- nG0 = f1;
-
- if (6 * fB0 < 1)
- nB0 = f1 + (f2 - f1) * 6 * fB0;
- else if (2 * fB0 < 1)
- nB0 = f2;
- else if (3 * fB0 < 2)
- nB0 = f1 + (f2 - f1) * (N2_3 - fB0) * 6;
- else
- nB0 = f1;
-
- if (6 * fR1 < 1)
- nR1 = f1 + (f2 - f1) * 6 * fR1;
- else if (2 * fR1 < 1)
- nR1 = f2;
- else if (3 * fR1 < 2)
- nR1 = f1 + (f2 - f1) * (N2_3 - fR1) * 6;
- else
- nR1 = f1;
-
- if (6 * fG1 < 1)
- nG1 = f1 + (f2 - f1) * 6 * fG1;
- else if (2 * fG1 < 1)
- nG1 = f2;
- else if (3 * fG1 < 2)
- nG1 = f1 + (f2 - f1) * (N2_3 - fG1) * 6;
- else
- nG1 = f1;
-
- if (6 * fB1 < 1)
- nB1 = f1 + (f2 - f1) * 6 * fB1;
- else if (2 * fB1 < 1)
- nB1 = f2;
- else if (3 * fB1 < 2)
- nB1 = f1 + (f2 - f1) * (N2_3 - fB1) * 6;
- else
- nB1 = f1;
-
- /* at last convert them to a hex string */
- iR0 = nR0 * 255;
- iG0 = nG0 * 255;
- iB0 = nB0 * 255;
-
- iR1 = nR1 * 255;
- iG1 = nG1 * 255;
- iB1 = nB1 * 255;
-
- flake->Colors.Fore = malloc(sizeof(char) * 8);
- flake->Colors.Bord = malloc(sizeof(char) * 8);
-
- sprintf(flake->Colors.Fore, "#%02X%02X%02X", iR0, iG0, iB0);
- sprintf(flake->Colors.Bord, "#%02X%02X%02X", iR1, iG1, iB1);
-
- return 0;
-}
-
-static void
-FuzzyFlakesInit(Flake *flake)
-{
- int i, j;
- XWindowAttributes xgwa;
-
- XGetWindowAttributes(flake->dpy, flake->window, &xgwa);
- flake->XGWA = xgwa;
- flake->DB.b = flake->DB.ba = flake->DB.bb = 0;
- flake->DB.dbuf = get_boolean_resource(flake->dpy, "doubleBuffer", "Boolean");
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- flake->DB.dbuf = False;
-# endif
-
- if (flake->DB.dbuf)
- {
- flake->DB.ba =
- XCreatePixmap(flake->dpy, flake->window, xgwa.width, xgwa.height, xgwa.depth);
- flake->DB.bb =
- XCreatePixmap(flake->dpy, flake->window, xgwa.width, xgwa.height, xgwa.depth);
- flake->DB.b = flake->DB.ba;
- }
- else
- {
- flake->DB.b = flake->window;
- }
-
- flake->Arms = get_integer_resource(flake->dpy, "arms", "Integer");
- flake->Thickness = get_integer_resource(flake->dpy, "thickness", "Integer");
- flake->BorderThickness = get_integer_resource(flake->dpy, "bthickness", "Integer");
- flake->Radius = get_integer_resource(flake->dpy, "radius", "Integer");
-
- flake->Density = get_integer_resource(flake->dpy, "density", "Integer");
- flake->Layers = get_integer_resource(flake->dpy, "layers", "Integer");
- flake->FallingSpeed = get_integer_resource(flake->dpy, "fallingspeed", "Integer");
- flake->Delay = get_integer_resource(flake->dpy, "delay", "Integer");
- if (flake->RandomColors == True)
- flake->RandomColors = get_boolean_resource(flake->dpy, "randomColors", "Boolean");
-
- if (xgwa.width > 2560) { /* Retina displays */
- flake->Thickness *= 2;
- flake->BorderThickness *= 2;
- flake->Radius *= 2;
- flake->FallingSpeed *= 2;
- }
-
- if (flake->Delay < 0)
- flake->Delay = 0;
-
- if (!flake->Colors.Back)
- {
- flake->Colors.Back = get_string_resource(flake->dpy, "color", "Color");
- if (!FuzzyFlakesColorResource(flake, flake->Colors.Back))
- {
- fprintf(stderr, " reverting to random\n");
- flake->RandomColors = True;
- }
-
- if (flake->RandomColors)
- {
- if (flake->Colors.Back)
- free(flake->Colors.Back);
- flake->Colors.Back = malloc(sizeof(char) * 8);
- sprintf(flake->Colors.Back, "#%X%X%X%X%X%X", random() % 16,
- random() % 16, random() % 16, random() % 16, random() % 16,
- random() % 16);
- }
-
- /*
- * Here we establish our colormap based on what is in
- * flake->Colors.Back
- */
- if (FuzzyFlakesColorHelper(flake))
- {
- fprintf(stderr, " reverting to random\n");
- if (flake->Colors.Back)
- free(flake->Colors.Back);
- flake->Colors.Back = malloc(sizeof(char) * 8);
- sprintf(flake->Colors.Back, "#%X%X%X%X%X%X", random() % 16,
- random() % 16, random() % 16, random() % 16, random() % 16,
- random() % 16);
- FuzzyFlakesColorHelper(flake);
- }
-
- flake->ForeColor = FuzzyFlakesColorResource(flake, flake->Colors.Fore);
- flake->BackColor = FuzzyFlakesColorResource(flake, flake->Colors.Back);
- flake->BordColor = FuzzyFlakesColorResource(flake, flake->Colors.Bord);
-
- flake->GCValues.foreground = flake->ForeColor;
- flake->GCValues.background = flake->BackColor;
- flake->RandomColors = False;
- }
-
- flake->GCValues.line_width = flake->Thickness;
- flake->GCValues.cap_style = CapProjecting;
- flake->GCValues.join_style = JoinMiter;
- flake->GCFlags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
-
- flake->GCVar =
- XCreateGC(flake->dpy, flake->window, flake->GCFlags,
- &flake->GCValues);
-
- flake->Density = flake->XGWA.width / 200 * flake->Density;
- flake->Flakes = malloc(sizeof(FlakeVariable **) * flake->Layers);
- for (i = 1; i <= flake->Layers; i++)
- {
- flake->Flakes[i - 1] = malloc(sizeof(FlakeVariable *) * flake->Density);
- for (j = 0; j < flake->Density; j++)
- {
- flake->Flakes[i - 1][j] = malloc(sizeof(FlakeVariable));
- flake->Flakes[i - 1][j]->XPos = random() % flake->XGWA.width;
- flake->Flakes[i - 1][j]->YPos = random() % flake->XGWA.height;
- flake->Flakes[i - 1][j]->Angle = random() % 360 * (M_PI / 180);
- flake->Flakes[i - 1][j]->Ticks = random() % 360;
- flake->Flakes[i - 1][j]->XOffset = random() % flake->XGWA.height;
- }
- }
-}
-
-static void
-FuzzyFlakesFreeFlake(Flake *flake)
-{
- int i, j;
-
- for (i = 1; i <= flake->Layers; i++)
- {
- for (j = 0; j < flake->Density; j++)
- {
- free(flake->Flakes[i - 1][j]);
- }
- free(flake->Flakes[i - 1]);
- }
-
- if (flake->DB.bb) XFreePixmap(flake->dpy, flake->DB.bb);
- if (flake->DB.ba) XFreePixmap(flake->dpy, flake->DB.ba);
- XFreeGC (flake->dpy, flake->GCVar);
- if (flake->Colors.Back) free (flake->Colors.Back);
- flake->Colors.Back = 0;
- if (flake->Colors.Fore) free (flake->Colors.Fore);
- flake->Colors.Fore = 0;
- if (flake->Colors.Bord) free (flake->Colors.Bord);
- flake->Colors.Bord = 0;
-}
-
-static void
-FuzzyFlakesMove(Flake *flake)
-{
- int i, j;
-
- for (i = 1; i <= flake->Layers; i++)
- {
- for (j = 0; j < flake->Density; j++)
- {
- FlakeVariable *FlakeVar;
-
- FlakeVar = flake->Flakes[i - 1][j];
- FlakeVar->Ticks++;
- FlakeVar->YPos =
- FlakeVar->YPos + ((double)flake->FallingSpeed) / 10 / i;
- FlakeVar->TrueX =
- (sin
- (FlakeVar->XOffset +
- FlakeVar->Ticks * (M_PI / 180) * ((double)flake->FallingSpeed /
- 10))) * 10 + FlakeVar->XPos;
- FlakeVar->Angle =
- FlakeVar->Angle + 0.005 * ((double)flake->FallingSpeed / 10);
- if (FlakeVar->YPos - flake->Radius > flake->XGWA.height)
- {
- FlakeVar->Ticks = 0;
- FlakeVar->YPos = 0 - flake->Radius;
- }
- }
- }
-}
-
-static void
-FuzzyFlakesDrawFlake(Flake *flake, int XPos, int YPos, double AngleOffset, int Layer)
-{
- int i;
- double x, y, Angle, Radius;
-
- /* calculate the shrink factor debending on which layer we are drawing atm */
- Radius = (double)(flake->Radius - Layer * 5);
- /* draw the flake one arm at a time */
- for (i = 1; i <= flake->Arms; i++)
- {
- int Diameter;
-
- Diameter = (flake->BorderThickness * 2 + flake->Thickness) / Layer;
- /* compute the angle of this arm of the flake */
- Angle = ((2 * M_PI) / flake->Arms) * i + AngleOffset;
- /* calculate the x and y dispositions for this arm */
- y = (int)(sin(Angle) * Radius);
- x = (int)(cos(Angle) * Radius);
- /* draw the base for the arm */
- flake->GCValues.line_width = Diameter;
- XFreeGC(flake->dpy, flake->GCVar);
- flake->GCVar =
- XCreateGC(flake->dpy, flake->DB.b, flake->GCFlags,
- &flake->GCValues);
- XSetForeground(flake->dpy, flake->GCVar, flake->BordColor);
- XDrawLine(flake->dpy, flake->DB.b, flake->GCVar, XPos, YPos,
- XPos + x, YPos + y);
- }
- /* draw the flake one arm at a time */
- for (i = 1; i <= flake->Arms; i++)
- {
- /* compute the angle of this arm of the flake */
- Angle = ((2 * M_PI) / flake->Arms) * i + AngleOffset;
- /* calculate the x and y dispositions for this arm */
- y = (int)(sin(Angle) * Radius);
- x = (int)(cos(Angle) * Radius);
- /* draw the inside of the arm */
- flake->GCValues.line_width = flake->Thickness / Layer;
- XFreeGC(flake->dpy, flake->GCVar);
- flake->GCVar =
- XCreateGC(flake->dpy, flake->DB.b, flake->GCFlags,
- &flake->GCValues);
- XSetForeground(flake->dpy, flake->GCVar, flake->ForeColor);
- XDrawLine(flake->dpy, flake->DB.b, flake->GCVar, XPos, YPos,
- XPos + x, YPos + y);
- }
-}
-
-static void
-FuzzyFlakes(Flake *flake)
-{
- int i, j;
-
- FuzzyFlakesMove(flake);
- XSetForeground(flake->dpy, flake->GCVar, flake->BackColor);
- XFillRectangle(flake->dpy, flake->DB.b, flake->GCVar, 0, 0,
- flake->XGWA.width, flake->XGWA.height);
- for (i = flake->Layers; i >= 1; i--)
- {
- for (j = 0; j < flake->Density; j++)
- {
- FuzzyFlakesDrawFlake(flake,
- flake->Flakes[i - 1][j]->TrueX,
- flake->Flakes[i - 1][j]->YPos,
- flake->Flakes[i - 1][j]->Angle, i);
- }
- }
-
-}
-
-static void *
-fuzzyflakes_init (Display *dpy, Window window)
-{
- Flake *flake = (Flake *) calloc (1, sizeof(*flake));
- flake->dpy = dpy;
- flake->window = window;
-
- /* This is needed even if it is going to be set to false */
- flake->RandomColors = True;
-
- /* set up our colors amoung many other things */
- FuzzyFlakesInit(flake);
-
- return flake;
-}
-
-static unsigned long
-fuzzyflakes_draw (Display *dpy, Window window, void *closure)
-{
- Flake *flake = (Flake *) closure;
-
- FuzzyFlakes(flake);
- if (flake->DB.dbuf)
- {
- XCopyArea(flake->dpy, flake->DB.b, flake->window,
- flake->GCVar, 0, 0, flake->XGWA.width, flake->XGWA.height,
- 0, 0);
- flake->DB.b =
- (flake->DB.b == flake->DB.ba ? flake->DB.bb : flake->DB.ba);
- }
-
- return flake->Delay;
-}
-
-static void
-fuzzyflakes_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- Flake *flake = (Flake *) closure;
-
- if (flake->XGWA.width != w || flake->XGWA.height != h)
- {
- FuzzyFlakesFreeFlake(flake);
- FuzzyFlakesInit(flake);
- }
-}
-
-static Bool
-fuzzyflakes_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- return False;
-}
-
-static void
-fuzzyflakes_free (Display *dpy, Window window, void *closure)
-{
- Flake *flake = (Flake *) closure;
- FuzzyFlakesFreeFlake(flake);
- free(flake->Flakes);
- free(flake);
-}
-
-
-static const char *fuzzyflakes_defaults[] = {
- "*color: #efbea5",
- "*arms: 5",
- "*thickness: 10",
- "*bthickness: 3",
- "*radius: 20",
- "*layers: 3",
- "*density: 5",
- "*fallingspeed: 10",
- "*delay: 10000",
- "*doubleBuffer: True",
- "*randomColors: False",
- 0
-};
-
-static XrmOptionDescRec fuzzyflakes_options[] = {
- { "-color", ".color", XrmoptionSepArg, 0},
- { "-arms", ".arms", XrmoptionSepArg, 0},
- { "-thickness", ".thickness", XrmoptionSepArg, 0},
- { "-bthickness", ".bthickness", XrmoptionSepArg, 0},
- { "-radius", ".radius", XrmoptionSepArg, 0},
- { "-layers", ".layers", XrmoptionSepArg, 0},
- { "-density", ".density", XrmoptionSepArg, 0},
- { "-speed", ".fallingspeed", XrmoptionSepArg, 0},
- { "-delay", ".delay", XrmoptionSepArg, 0},
- { "-db", ".doubleBuffer", XrmoptionNoArg, "True"},
- { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False"},
- { "-random-colors", ".randomColors", XrmoptionNoArg, "True"},
- { 0, 0, 0, 0}
-};
-
-
-XSCREENSAVER_MODULE ("FuzzyFlakes", fuzzyflakes)
diff --git a/hacks/fuzzyflakes.man b/hacks/fuzzyflakes.man
deleted file mode 100644
index f4e9122..0000000
--- a/hacks/fuzzyflakes.man
+++ /dev/null
@@ -1,112 +0,0 @@
-.TH XScreenSaver 1 "12-May-04" "X Version 11"
-.SH NAME
-fuzzyflakes \- falling snowflakes/flower shapes
-.SH SYNOPSIS
-.B fuzzyflakes
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-speed \fIint\fP]
-[\-arms \fIint\fP]
-[\-thickness \fIint\fP]
-[\-bthickness \fIint\fP]
-[\-radius \fIint\fP]
-[\-layers \fIint\fP]
-[\-density \fIint\fP]
-[\-no-db]
-(\-color \fIstring\fP)
-(\-random-colors)
-[\-fps]
-.SH DESCRIPTION
-The
-.I fuzzyflakes
-program draws falling pastel colored snowflake/flower shapes.
-Inspired by the credits of the anime "Azumanga Daioh".
-.SH OPTIONS
-.I fuzzyflakes
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-The delay between steps of the animation, in microseconds. Default: 250000.
-.TP 8
-.B \-speed \fIint\fP
-How fast, 1-50. Default 10.
-.TP 8
-.B \-arms \fIint\fP
-How many arms on the flakes; default 5.
-.TP 8
-.B \-thickness \fIint\fP
-How thick to make the lines; default 10 pixels.
-.TP 8
-.B \-bthickness \fIint\fP
-How thick to make the borders; default 3 pixels.
-.TP 8
-.B \-radius \fIint\fP
-Radius of the objects; default 20 pixels.
-.TP 8
-.B \-layers \fIint\fP
-How many layers of objects; default 3.
-.TP 8
-.B \-density \fIint\fP
-Default 5.
-.TP 8
-.B \-no-db
-Disable double-buffering.
-.TP 8
-.B \-color \fIstring\fP
-The base color for the color scheme. Typed as a hexadecimal triplet
-with or with out the leading #. ie. fa4563 & #43cd12 are both acceptable.
-If the saturation of you color is too low (<0.03) the random color
-generator will kick in.
-The default color is #efbea5
-.TP 8
-.B \-random-colors
-This enables the random color generation. It is disabled by default.
-It overrides anything from -color
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2004 Barry Dmytro. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any
-purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Barry Dmytro <badcherry@mailc.net>
-.SH CREDITS
-The color generation algorithm was borrowed from a friend <ZoeB>
-from #vegans@irc.blitzed.org. Her site was [REDACTED].
-To see her original code in action visit her site.
diff --git a/hacks/galaxy.c b/hacks/galaxy.c
deleted file mode 100644
index 3a6e1f7..0000000
--- a/hacks/galaxy.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* galaxy --- spinning galaxies */
-/* #include<math.h>*/
-#if 0
-static const char sccsid[] = "@(#)galaxy.c 4.04 97/07/28 xlockmore";
-#endif
-
-/* Originally done by Uli Siegmund <uli@wombat.okapi.sub.org> on Amiga
- * for EGS in Cluster
- * Port from Cluster/EGS to C/Intuition by Harald Backert
- * Port to X11 and incorporation into xlockmore by Hubert Feyrer
- * <hubert.feyrer@rz.uni-regensburg.de>
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 26-Aug-00: robert.nagtegaal@phil.uu.nl and roland@tschai.demon.nl:
- * various improvements
- * 10-May-97: jwz@jwz.org: turned into a standalone program.
- * 18-Apr-97: Memory leak fixed by Tom Schmidt <tschmidt@micron.com>
- * 07-Apr-97: Modified by Dave Mitchell <davem@magnet.com>
- * 23-Oct-94: Modified by David Bagley <bagleyd@bigfoot.com>
- * random star sizes
- * colors change depending on velocity
- * 10-Oct-94: Add colors by Hubert Feyer
- * 30-Sep-94: Initial port by Hubert Feyer
- * 09-Mar-94: VMS can generate a random number 0.0 which results in a
- * division by zero, corrected by Jouk Jansen
- * <joukj@crys.chem.uva.nl>
- */
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 20000 \n" \
- "*count: -5 \n" \
- "*cycles: 250 \n" \
- "*ncolors: 64 \n" \
- "*fpsSolid: true \n" \
- "*ignoreRotation: True \n" \
- "*lowrez: True \n" \
-
-# define UNIFORM_COLORS
-# define release_galaxy 0
-# define reshape_galaxy 0
-# define galaxy_handle_event 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-static Bool tracks;
-static Bool spin;
-static Bool dbufp;
-
-#define DEF_TRACKS "True"
-#define DEF_SPIN "True"
-#define DEF_DBUF "True"
-
-static XrmOptionDescRec opts[] =
-{
- {"-tracks", ".galaxy.tracks", XrmoptionNoArg, "on"},
- {"+tracks", ".galaxy.tracks", XrmoptionNoArg, "off"},
- {"-spin", ".galaxy.spin", XrmoptionNoArg, "on"},
- {"+spin", ".galaxy.spin", XrmoptionNoArg, "off"},
- {"-dbuf", ".galaxy.dbuf", XrmoptionNoArg, "on"},
- {"+dbuf", ".galaxy.dbuf", XrmoptionNoArg, "off"},
-};
-
-static argtype vars[] =
-{
- {&tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool},
- {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&dbufp, "dbuf", "Dbuf", DEF_DBUF, t_Bool},
-};
-
-static OptionStruct desc[] =
-{
- {"-/+tracks", "turn on/off star tracks"},
- {"-/+spin", "do/don't spin viewpoint"},
- {"-/+dbuf", "turn on/off double buffering."},
-};
-
-ENTRYPOINT ModeSpecOpt galaxy_opts =
-{sizeof opts / sizeof opts[0], opts,
- sizeof vars / sizeof vars[0], vars, desc};
-
-
-#define FLOATRAND ((double) LRAND() / ((double) MAXRAND))
-
-#if 0
-#define WRAP 1 /* Warp around edges */
-#define BOUNCE 1 /* Bounce from borders */
-#endif
-
-#define MINSIZE 1
-#define MINGALAXIES 2
-#define MAX_STARS 3000
-#define MAX_IDELTAT 50
-/* These come originally from the Cluster-version */
-#define DEFAULT_GALAXIES 3
-#define DEFAULT_STARS 1000
-#define DEFAULT_HITITERATIONS 7500
-#define DEFAULT_IDELTAT 200 /* 0.02 */
-#define EPSILON 0.00000001
-
-#define sqrt_EPSILON 0.0001
-
-#define DELTAT (MAX_IDELTAT * 0.0001)
-
-#define GALAXYRANGESIZE 0.1
-#define GALAXYMINSIZE 0.15
-#define QCONS 0.001
-
-
-#define COLORBASE 16
-/* colors per galaxy */
-/* #define COLORSTEP (NUMCOLORS/COLORBASE) */
-# define COLORSTEP (MI_NCOLORS(mi)/COLORBASE)
-
-
-typedef struct {
- double pos[3], vel[3];
-} Star;
-
-
-typedef struct {
- int mass;
- int nstars;
- Star *stars;
- XPoint *oldpoints;
- XPoint *newpoints;
- double pos[3], vel[3];
- int galcol;
-} Galaxy;
-
-typedef struct {
- double mat[3][3]; /* Movement of stars(?) */
- double scale; /* Scale */
- int midx; /* Middle of screen, x */
- int midy; /* Middle of screen, y */
- double size; /* */
- double diff[3]; /* */
- Galaxy *galaxies; /* the Whole Universe */
- int ngalaxies; /* # galaxies */
- int f_hititerations; /* # iterations before restart */
- int step; /* */
- double rot_y; /* rotation of eye around center of universe, around
-y-axis*/
- double rot_x; /* rotation of eye around center of universe, around
-x-axis */
-} unistruct;
-
-static unistruct *universes = NULL;
-
-ENTRYPOINT void
-free_galaxy(ModeInfo * mi)
-{
- unistruct *gp = &universes[MI_SCREEN(mi)];
- if (gp->galaxies != NULL) {
- int i;
-
- for (i = 0; i < gp->ngalaxies; i++) {
- Galaxy *gt = &gp->galaxies[i];
-
- if (gt->stars != NULL)
- (void) free((void *) gt->stars);
- if (gt->oldpoints != NULL)
- (void) free((void *) gt->oldpoints);
- if (gt->newpoints != NULL)
- (void) free((void *) gt->newpoints);
- }
- (void) free((void *) gp->galaxies);
- gp->galaxies = NULL;
- }
-}
-
-static void
-startover(ModeInfo * mi)
-{
- unistruct *gp = &universes[MI_SCREEN(mi)];
- int i, j; /* more tmp */
- double w1, w2; /* more tmp */
- double d, v, w, h; /* yet more tmp */
-
- gp->step = 0;
- gp->rot_y = 0;
- gp->rot_x = 0;
-
- if (MI_BATCHCOUNT(mi) < -MINGALAXIES)
- free_galaxy(mi);
- gp->ngalaxies = MI_BATCHCOUNT(mi);
- if (gp->ngalaxies < -MINGALAXIES)
- gp->ngalaxies = NRAND(-gp->ngalaxies - MINGALAXIES + 1) + MINGALAXIES;
-
- else if (gp->ngalaxies < MINGALAXIES)
- gp->ngalaxies = MINGALAXIES;
- if (gp->galaxies == NULL)
- gp->galaxies = (Galaxy *) calloc(gp->ngalaxies, sizeof (Galaxy));
-
- for (i = 0; i < gp->ngalaxies; ++i) {
- Galaxy *gt = &gp->galaxies[i];
- double sinw1, sinw2, cosw1, cosw2;
-
- gt->galcol = NRAND(COLORBASE - 2);
- if (gt->galcol > 1)
- gt->galcol += 2; /* Mult 8; 16..31 no green stars */
- /* Galaxies still may have some green stars but are not all green. */
-
- if (gt->stars != NULL) {
- (void) free((void *) gt->stars);
- gt->stars = NULL;
- }
- gt->nstars = (NRAND(MAX_STARS / 2)) + MAX_STARS / 2;
- gt->stars = (Star *) malloc(gt->nstars * sizeof (Star));
- gt->oldpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint));
- gt->newpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint));
-
- w1 = 2.0 * M_PI * FLOATRAND;
- w2 = 2.0 * M_PI * FLOATRAND;
- sinw1 = SINF(w1);
- sinw2 = SINF(w2);
- cosw1 = COSF(w1);
- cosw2 = COSF(w2);
-
- gp->mat[0][0] = cosw2;
- gp->mat[0][1] = -sinw1 * sinw2;
- gp->mat[0][2] = cosw1 * sinw2;
- gp->mat[1][0] = 0.0;
- gp->mat[1][1] = cosw1;
- gp->mat[1][2] = sinw1;
- gp->mat[2][0] = -sinw2;
- gp->mat[2][1] = -sinw1 * cosw2;
- gp->mat[2][2] = cosw1 * cosw2;
-
- gt->vel[0] = FLOATRAND * 2.0 - 1.0;
- gt->vel[1] = FLOATRAND * 2.0 - 1.0;
- gt->vel[2] = FLOATRAND * 2.0 - 1.0;
- gt->pos[0] = -gt->vel[0] * DELTAT * gp->f_hititerations + FLOATRAND -
-0.5;
- gt->pos[1] = -gt->vel[1] * DELTAT * gp->f_hititerations + FLOATRAND -
-0.5;
- gt->pos[2] = -gt->vel[2] * DELTAT * gp->f_hititerations + FLOATRAND -
-0.5;
-
- gt->mass = (int) (FLOATRAND * 1000.0) + 1;
-
- gp->size = GALAXYRANGESIZE * FLOATRAND + GALAXYMINSIZE;
-
- for (j = 0; j < gt->nstars; ++j) {
- Star *st = &gt->stars[j];
- XPoint *oldp = &gt->oldpoints[j];
- XPoint *newp = &gt->newpoints[j];
-
- double sinw, cosw;
-
- w = 2.0 * M_PI * FLOATRAND;
- sinw = SINF(w);
- cosw = COSF(w);
- d = FLOATRAND * gp->size;
- h = FLOATRAND * exp(-2.0 * (d / gp->size)) / 5.0 * gp->size;
- if (FLOATRAND < 0.5)
- h = -h;
- st->pos[0] = gp->mat[0][0] * d * cosw + gp->mat[1][0] * d * sinw +
-gp->mat[2][0] * h + gt->pos[0];
- st->pos[1] = gp->mat[0][1] * d * cosw + gp->mat[1][1] * d * sinw +
-gp->mat[2][1] * h + gt->pos[1];
- st->pos[2] = gp->mat[0][2] * d * cosw + gp->mat[1][2] * d * sinw +
-gp->mat[2][2] * h + gt->pos[2];
-
- v = sqrt(gt->mass * QCONS / sqrt(d * d + h * h));
- st->vel[0] = -gp->mat[0][0] * v * sinw + gp->mat[1][0] * v * cosw +
-gt->vel[0];
- st->vel[1] = -gp->mat[0][1] * v * sinw + gp->mat[1][1] * v * cosw +
-gt->vel[1];
- st->vel[2] = -gp->mat[0][2] * v * sinw + gp->mat[1][2] * v * cosw +
-gt->vel[2];
-
- st->vel[0] *= DELTAT;
- st->vel[1] *= DELTAT;
- st->vel[2] *= DELTAT;
-
- oldp->x = 0;
- oldp->y = 0;
- newp->x = 0;
- newp->y = 0;
- }
-
- }
-
- XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
-
-#if 0
- (void) printf("ngalaxies=%d, f_hititerations=%d\n", gp->ngalaxies,
-gp->f_hititerations);
- (void) printf("f_deltat=%g\n", DELTAT);
- (void) printf("Screen: ");
-#endif /*0 */
-}
-
-ENTRYPOINT void
-init_galaxy(ModeInfo * mi)
-{
- unistruct *gp;
-
- MI_INIT (mi, universes);
- gp = &universes[MI_SCREEN(mi)];
-
-# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
- dbufp = False;
-# endif
-
- gp->f_hititerations = MI_CYCLES(mi);
-
- gp->scale = (double) (MI_WIN_WIDTH(mi) + MI_WIN_HEIGHT(mi)) / 8.0;
- gp->midx = MI_WIN_WIDTH(mi) / 2;
- gp->midy = MI_WIN_HEIGHT(mi) / 2;
- startover(mi);
-}
-
-ENTRYPOINT void
-draw_galaxy(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GC gc = MI_GC(mi);
- unistruct *gp = &universes[MI_SCREEN(mi)];
- double d, eps, cox, six, cor, sir; /* tmp */
- int i, j, k; /* more tmp */
- XPoint *dummy = NULL;
-
- if (! dbufp)
- XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
-
- if(spin){
- gp->rot_y += 0.01;
- gp->rot_x += 0.004;
- }
-
- cox = COSF(gp->rot_y);
- six = SINF(gp->rot_y);
- cor = COSF(gp->rot_x);
- sir = SINF(gp->rot_x);
-
- eps = 1/(EPSILON * sqrt_EPSILON * DELTAT * DELTAT * QCONS);
-
- for (i = 0; i < gp->ngalaxies; ++i) {
- Galaxy *gt = &gp->galaxies[i];
-
- for (j = 0; j < gp->galaxies[i].nstars; ++j) {
- Star *st = &gt->stars[j];
- XPoint *newp = &gt->newpoints[j];
- double v0 = st->vel[0];
- double v1 = st->vel[1];
- double v2 = st->vel[2];
-
- for (k = 0; k < gp->ngalaxies; ++k) {
- Galaxy *gtk = &gp->galaxies[k];
- double d0 = gtk->pos[0] - st->pos[0];
- double d1 = gtk->pos[1] - st->pos[1];
- double d2 = gtk->pos[2] - st->pos[2];
-
- d = d0 * d0 + d1 * d1 + d2 * d2;
- if (d > EPSILON)
- d = gtk->mass / (d * sqrt(d)) * DELTAT * DELTAT * QCONS;
- else
- d = gtk->mass / (eps * sqrt(eps));
- v0 += d0 * d;
- v1 += d1 * d;
- v2 += d2 * d;
- }
-
- st->vel[0] = v0;
- st->vel[1] = v1;
- st->vel[2] = v2;
-
- st->pos[0] += v0;
- st->pos[1] += v1;
- st->pos[2] += v2;
-
- newp->x = (short) (((cox * st->pos[0]) - (six * st->pos[2])) *
- gp->scale) + gp->midx;
- newp->y = (short) (((cor * st->pos[1]) - (sir * ((six * st->pos[0]) +
- (cox * st->pos[2]))))
- * gp->scale) + gp->midy;
-
- }
-
- for (k = i + 1; k < gp->ngalaxies; ++k) {
- Galaxy *gtk = &gp->galaxies[k];
- double d0 = gtk->pos[0] - gt->pos[0];
- double d1 = gtk->pos[1] - gt->pos[1];
- double d2 = gtk->pos[2] - gt->pos[2];
-
- d = d0 * d0 + d1 * d1 + d2 * d2;
- if (d > EPSILON)
- d = 1 / (d * sqrt(d)) * DELTAT * QCONS;
- else
- d = 1 / (EPSILON * sqrt_EPSILON) * DELTAT * QCONS;
-
- d0 *= d;
- d1 *= d;
- d2 *= d;
- gt->vel[0] += d0 * gtk->mass;
- gt->vel[1] += d1 * gtk->mass;
- gt->vel[2] += d2 * gtk->mass;
- gtk->vel[0] -= d0 * gt->mass;
- gtk->vel[1] -= d1 * gt->mass;
- gtk->vel[2] -= d2 * gt->mass;
- }
-
- gt->pos[0] += gt->vel[0] * DELTAT;
- gt->pos[1] += gt->vel[1] * DELTAT;
- gt->pos[2] += gt->vel[2] * DELTAT;
-
- if (dbufp) {
- XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
- XDrawPoints(display, window, gc, gt->oldpoints, gt->nstars,
- CoordModeOrigin);
- }
- XSetForeground(display, gc, MI_PIXEL(mi, COLORSTEP * gt->galcol));
- XDrawPoints(display, window, gc, gt->newpoints, gt->nstars,
- CoordModeOrigin);
-
- dummy = gt->oldpoints;
- gt->oldpoints = gt->newpoints;
- gt->newpoints = dummy;
- }
-
- gp->step++;
- if (gp->step > gp->f_hititerations * 4)
- startover(mi);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_galaxy(ModeInfo * mi)
-{
- /* Do nothing, it will refresh by itself */
-}
-#endif
-
-XSCREENSAVER_MODULE ("Galaxy", galaxy)
diff --git a/hacks/galaxy.man b/hacks/galaxy.man
deleted file mode 100644
index bac06eb..0000000
--- a/hacks/galaxy.man
+++ /dev/null
@@ -1,87 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-galaxy \- draws spinning galaxies
-.SH SYNOPSIS
-.B galaxy
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP] [\-tracks] [\-no\-tracks] [\-spin] [\-no\-spin]
-
-[\-fps]
-.SH DESCRIPTION
-The \fIgalaxy\fP program draws spinning galaxies.
-.SH OPTIONS
-.I galaxy
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible). Default 64.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-.TP 8
-.B \-count \fIinteger\fP
-.TP 8
-.B \-size \fIinteger\fP
-.TP 8
-.B \-tracks
-.TP 8
-.B \-no\-tracks
-.TP 8
-.B \-spin
-.TP 8
-.B \-no\-spin
-.TP 8
-.B \-fps
-Display the current frame rate and CPU load.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1994 by Hubert Feyrer.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation.
-.SH AUTHOR
-Original Amiga version by Uli Siegmund <uli@wombat.okapi.sub.org>
- for EGS in Cluster.
-
-Ported from Cluster/EGS to C/Intuition by Harald Backert.
-
-Ported to X11 and xlockmore by
-Hubert Feyrer <hubert.feyrer@rz.uni-regensburg.de>, 30-Sep-94.
-
-Modified by David Bagley <bagleyd@bigfoot.com>, 23-Oct-94.
-
-Modified by Dave Mitchell <davem@magnet.com>, 7-Apr-97.
-
-Ability to run standalone or with \fIxscreensaver\fP added by
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/glitchpeg.c b/hacks/glitchpeg.c
deleted file mode 100644
index 7b4c5b0..0000000
--- a/hacks/glitchpeg.c
+++ /dev/null
@@ -1,465 +0,0 @@
-/* glitchpeg, Copyright (c) 2018-2021 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Insert errors into an image file, then display the corrupted result.
- *
- * This only works on X11 and MacOS because iOS and Android don't have
- * access to the source files of images, only the decoded image data.
- */
-
-#include "screenhack.h"
-#include "ximage-loader.h"
-
-#ifndef HAVE_JWXYZ
-# include <X11/Intrinsic.h> /* for XtInputId, etc */
-#endif
-
-#include <sys/stat.h>
-
-struct state {
- Display *dpy;
- Window window;
- GC gc;
- XWindowAttributes xgwa;
- int delay;
- int count;
- int duration;
- time_t start_time;
- unsigned char *image_data; unsigned long image_size;
- XtInputId pipe_id;
- FILE *pipe;
- Bool button_down_p;
-};
-
-
-static Bool
-bigendian (void)
-{
- union { int i; char c[sizeof(int)]; } u;
- u.i = 1;
- return !u.c[0];
-}
-
-
-/* Given a bitmask, returns the position and width of the field.
- Duplicated from ximage-loader.c.
- */
-static void
-decode_mask (unsigned long mask, unsigned long *pos_ret,
- unsigned long *size_ret)
-{
- int i;
- for (i = 0; i < 32; i++)
- if (mask & (1L << i))
- {
- int j = 0;
- *pos_ret = i;
- for (; i < 32; i++, j++)
- if (! (mask & (1L << i)))
- break;
- *size_ret = j;
- return;
- }
-}
-
-
-/* Renders a scaled, cropped version of the RGBA XImage onto the window.
- */
-static void
-draw_image (Display *dpy, Window window, Visual *v, GC gc,
- int w, int h, int depth, XImage *in)
-{
- XImage *out;
- int x, y, w2, h2, xoff, yoff;
- double xs, ys, s;
-
- unsigned long crpos=0, cgpos=0, cbpos=0/*,capos=0*/; /* bitfield positions */
- unsigned long srpos=0, sgpos=0, sbpos=0;
- unsigned long srmsk=0, sgmsk=0, sbmsk=0;
- unsigned long srsiz=0, sgsiz=0, sbsiz=0;
-
-# ifdef HAVE_JWXYZ
- /* BlackPixel has alpha: 0xFF000000. */
- unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
-#else
- unsigned long black = 0;
-# endif
-
- xs = in->width / (double) w;
- ys = in->height / (double) h;
- s = (xs > ys ? ys : xs);
- w2 = in->width / s;
- h2 = in->height / s;
- xoff = (w - w2) / 2;
- yoff = (h - h2) / 2;
-
- /* Create a new image in the depth and bit-order of the server. */
- out = XCreateImage (dpy, v, depth, ZPixmap, 0, 0, w, h, 8, 0);
- out->bitmap_bit_order = in->bitmap_bit_order;
- out->byte_order = in->byte_order;
-
- out->bitmap_bit_order = BitmapBitOrder (dpy);
- out->byte_order = ImageByteOrder (dpy);
-
- out->data = (char *) malloc (out->height * out->bytes_per_line);
- if (!out->data) abort();
-
- /* Find the server's color masks.
- We could cache this and just do it once, but it's a small number
- of instructions compared to the per-pixel operations happening next.
- */
- srmsk = out->red_mask;
- sgmsk = out->green_mask;
- sbmsk = out->blue_mask;
-
- if (!(srmsk && sgmsk && sbmsk)) abort(); /* No server color masks? */
-
- decode_mask (srmsk, &srpos, &srsiz);
- decode_mask (sgmsk, &sgpos, &sgsiz);
- decode_mask (sbmsk, &sbpos, &sbsiz);
-
- /* 'in' is RGBA in client endianness. Convert to what the server wants. */
- if (bigendian())
- crpos = 24, cgpos = 16, cbpos = 8/*, capos = 0*/;
- else
- crpos = 0, cgpos = 8, cbpos = 16/*, capos = 24*/;
-
- /* Iterate the destination rectangle and pull in the corresponding
- scaled and cropped source pixel, or black. Nearest-neighbor is fine.
- */
- for (y = 0; y < out->height; y++)
- {
- int iy = (out->height - y - yoff - 1) * s;
- for (x = 0; x < out->width; x++)
- {
- int ix = (x - xoff) * s;
- unsigned long p = (ix >= 0 && ix < in->width &&
- iy >= 0 && iy < in->height
- ? XGetPixel (in, ix, iy)
- : black);
- /* unsigned char a = (p >> capos) & 0xFF; */
- unsigned char b = (p >> cbpos) & 0xFF;
- unsigned char g = (p >> cgpos) & 0xFF;
- unsigned char r = (p >> crpos) & 0xFF;
- XPutPixel (out, x, y, ((r << srpos) |
- (g << sgpos) |
- (b << sbpos) |
- black));
- }
- }
-
- XPutImage (dpy, window, gc, out, 0, 0, 0, 0, out->width, out->height);
- XDestroyImage (out);
-}
-
-
-# define BACKSLASH(c) \
- (! ((c >= 'a' && c <= 'z') || \
- (c >= 'A' && c <= 'Z') || \
- (c >= '0' && c <= '9') || \
- c == '.' || c == '_' || c == '-' || c == '+' || c == '/'))
-
-/* Gets the name of an image file to load by running xscreensaver-getimage-file
- at the end of a pipe. This can be very slow!
- Duplicated from utils/grabclient.c
- */
-static FILE *
-open_image_name_pipe (void)
-{
- char *s;
- FILE *pipe;
-
- /* /bin/sh on OS X 10.10 wipes out the PATH. */
- const char *path = getenv("PATH");
- char *cmd = s = malloc (strlen(path) * 2 + 100);
- strcpy (s, "/bin/sh -c 'export PATH=");
- s += strlen (s);
- while (*path) {
- char c = *path++;
- if (BACKSLASH(c)) *s++ = '\\';
- *s++ = c;
- }
- strcpy (s, "; ");
- s += strlen (s);
-
- strcpy (s, "xscreensaver-getimage-file --name --absolute");
- s += strlen (s);
-
- strcpy (s, "'");
- s += strlen (s);
-
- *s = 0;
-
- pipe = popen (cmd, "r");
- free (cmd);
- return pipe;
-}
-
-
-/* Mostly duplicated from utils/grabclient.c */
-static void
-xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
-{
- /* This is not called from a signal handler, so doing stuff here is fine.
- */
- struct state *st = (struct state *) closure;
- char buf[10240];
- char *file = buf;
- char *result;
- FILE *fp;
- struct stat stat;
- int n;
- unsigned char *s;
- int L;
-
- static int error_count = 0;
-
- *buf = 0;
- result = fgets (buf, sizeof(buf)-1, st->pipe);
- pclose (st->pipe);
- st->pipe = 0;
- XtRemoveInput (st->pipe_id);
- st->pipe_id = 0;
- if (!result) goto FAIL;
-
- /* strip trailing newline */
- L = strlen(buf);
- while (L > 0 && (buf[L-1] == '\r' || buf[L-1] == '\n'))
- buf[--L] = 0;
-
- if (!*file)
- {
- /* fprintf (stderr, "%s: no suitable images in imageDirectory\n",
- progname); */
- goto FAIL;
- }
-
- fp = fopen (file, "r");
- if (! fp)
- {
- fprintf (stderr, "%s: unable to read %s\n", progname, file);
- goto FAIL;
- }
-
- if (fstat (fileno (fp), &stat))
- {
- fprintf (stderr, "%s: %s: stat failed\n", progname, file);
- goto FAIL;
- }
-
- if (st->image_data) free (st->image_data);
- st->image_size = stat.st_size;
- st->image_data = malloc (st->image_size);
-
- s = st->image_data;
- do {
- n = fread (s, 1, st->image_data + st->image_size - s, fp);
- if (n > 0) s += n;
- } while (n > 0);
-
- fclose (fp);
-
- st->start_time = time((time_t *) 0);
- error_count = 0;
- return;
-
- FAIL:
- if (++error_count > 10)
- {
- fprintf (stderr, "%s: too many errors loading images\n", progname);
- exit (1);
- }
-}
-
-
-static void *
-glitchpeg_init (Display *dpy, Window window)
-{
- struct state *st = (struct state *) calloc (1, sizeof(*st));
- XGCValues gcv;
-
- st->dpy = dpy;
- st->window = window;
- st->gc = XCreateGC (dpy, window, 0, &gcv);
-
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-
- st->delay = get_integer_resource (st->dpy, "delay", "Integer");
- if (st->delay < 1) st->delay = 1;
-
- st->duration = get_integer_resource (st->dpy, "duration", "Integer");
- if (st->duration < 0) st->duration = 0;
-
- st->count = get_integer_resource (st->dpy, "count", "Integer");
- if (st->count < 1) st->count = 1;
-
- XClearWindow (st->dpy, st->window);
-
-# if 0 /* This check doesn't work, because X11 resources are the devil. */
- if (! get_boolean_resource (dpy, "chooseRandomImages", "Boolean"))
- {
- fprintf (stderr, "%s: chooseRandomImages must be True", progname);
- exit (1);
- }
-# endif
-
- return st;
-}
-
-
-static unsigned long
-glitchpeg_draw (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
-
- if ((!st->image_data ||
- time((time_t *) 0) >= st->start_time + st->duration) &&
- !st->pipe)
- {
- /* Time to reload */
- st->pipe = open_image_name_pipe();
- st->pipe_id =
- XtAppAddInput (XtDisplayToApplicationContext (dpy),
- fileno (st->pipe),
- (XtPointer) (XtInputReadMask | XtInputExceptMask),
- xscreensaver_getimage_file_cb, (XtPointer) st);
- }
-
- if (st->image_data && !st->button_down_p)
- {
- int n;
- XImage *image;
- unsigned char *glitched = malloc (st->image_size);
- int nn = random() % st->count;
- if (nn <= 0) nn = 1;
- if (! (random() % 30)) nn *= 20;
-
- memcpy (glitched, st->image_data, st->image_size);
-
- for (n = 0; n < nn; n++)
- {
- int start = 255;
- int end = st->image_size - 255;
- int size = end - start;
- Bool byte_p = True; /* random() % 100; */
- if (size <= 100) break;
- if (byte_p)
- {
- int i = start + (random() % size);
- if (!(random() % 10))
- /* Take one random byte and randomize it. */
- glitched[i] = random() % 0xFF;
- else
- /* Take one random byte and add 5% to it. */
- glitched[i] +=
- (1 + (random() % 0x0C)) * ((random() & 1) ? 1 : -1);
- }
- else
- {
- /* Take two randomly-sized chunks of the file and swap them.
- This tends to just destroy the image. Doesn't look good. */
- int s2 = 2 + size * 0.05;
- char *swap = malloc (s2);
- int start1 = start + (random() % (size - s2));
- int start2 = start + (random() % (size - s2));
- memcpy (glitched + start1, swap, s2);
- memmove (glitched + start2, glitched + start1, s2);
- memcpy (swap, glitched + start2, s2);
- free (swap);
- }
- }
-
- image = image_data_to_ximage (dpy, st->xgwa.visual,
- glitched, st->image_size);
- free (glitched);
-
- if (image) /* Might be null if decode fails */
- {
- draw_image (dpy, window, st->xgwa.visual, st->gc,
- st->xgwa.width, st->xgwa.height, st->xgwa.depth,
- image);
- XDestroyImage (image);
- }
- }
-
- return st->delay;
-}
-
-
-static void
-glitchpeg_reshape (Display *dpy, Window window, void *closure,
- unsigned int w, unsigned int h)
-{
- struct state *st = (struct state *) closure;
- XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
-}
-
-
-static Bool
-glitchpeg_event (Display *dpy, Window window, void *closure, XEvent *event)
-{
- struct state *st = (struct state *) closure;
- if (event->xany.type == ButtonPress)
- {
- st->button_down_p = True;
- return True;
- }
- else if (event->xany.type == ButtonRelease)
- {
- st->button_down_p = False;
- return True;
- }
- else if (screenhack_event_helper (dpy, window, event))
- {
- st->start_time = 0; /* reload */
- return True;
- }
-
- return False;
-}
-
-
-static void
-glitchpeg_free (Display *dpy, Window window, void *closure)
-{
- struct state *st = (struct state *) closure;
- XFreeGC (dpy, st->gc);
- if (st->pipe_id) XtRemoveInput (st->pipe_id);
- if (st->pipe) fclose (st->pipe);
- if (st->image_data) free (st->image_data);
- free (st);
-}
-
-
-static const char *glitchpeg_defaults [] = {
- ".background: black",
- ".foreground: white",
- ".lowrez: True",
- "*fpsSolid: true",
- "*delay: 30000",
- "*duration: 120",
- "*count: 100",
- "*grabDesktopImages: False", /* HAVE_JWXYZ */
- "*chooseRandomImages: True", /* HAVE_JWXYZ */
-#ifdef HAVE_MOBILE
- "*ignoreRotation: True",
- "*rotateImages: True",
-#endif
- 0
-};
-
-static XrmOptionDescRec glitchpeg_options [] = {
- { "-delay", ".delay", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
- { "-count", ".count", XrmoptionSepArg, 0 },
- { 0, 0, 0, 0 }
-};
-
-XSCREENSAVER_MODULE ("GlitchPEG", glitchpeg)
diff --git a/hacks/glitchpeg.man b/hacks/glitchpeg.man
deleted file mode 100644
index 9593d2c..0000000
--- a/hacks/glitchpeg.man
+++ /dev/null
@@ -1,79 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glitchpeg \- glitched image screen saver.
-.SH SYNOPSIS
-.B glitchpeg
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-duration \fInumber\fP]
-[\-count \fInumber\fP]
-.SH DESCRIPTION
-Loads an image, corrupts it, and then displays the corrupted version,
-several times a second. After a while, finds a new image to corrupt.
-
-It glitches the image by altering random bytes in the compressed image
-file before de-compressing it. This creates interesting visual effects
-on JPEG files, but doesn't work well on PNG files, since PNG contains
-checksums that detect simple corruption.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-duration \fInumber\fP
-How many seconds before loading a new image. Default: 120.
-.TP 8
-.B \-count \fInumber\fP
-Number of glitches to introduce per iteration. Default: 100.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SECURITY
-Because this program is feeding intentionally-invalid data into your
-operating system's image-decoding libraries, it is possible that it
-may crash as a result of that corrupted data.
-
-That should not be possible -- but it might be.
-
-Please note that if this happens, that indicates a serious security
-bug in your system's image libraries! It likely means that your
-libraries are susceptible to buffer overflow attacks or similar, which
-can lead to remote code execution. You should report that bug to the
-maintainers of those image libraries.
-
-In the context of xscreensaver, when configured to load only local
-image files, this should not be a direct security concern: this screen
-saver crashing will not affect the xscreensaver daemon and will not
-unlock your screen.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in
deleted file mode 100644
index ed07a1f..0000000
--- a/hacks/glx/Makefile.in
+++ /dev/null
@@ -1,4757 +0,0 @@
-# hacks/glx/Makefile.in --- xscreensaver, Copyright © 1999-2021 Jamie Zawinski.
-# the `../../configure' script generates `hacks/glx/Makefile' from this file.
-
-@SET_MAKE@
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = ..
-
-install_prefix =
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-datarootdir = @datarootdir@
-datadir = @datadir@
-mandir = @mandir@
-libexecdir = @libexecdir@
-mansuffix = 6
-manNdir = $(mandir)/man$(mansuffix)
-
-HACKDIR = @HACKDIR@
-HACK_CONF_DIR = @HACK_CONF_DIR@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-LDFLAGS = @LDFLAGS@
-DEFS = -DSTANDALONE -DUSE_GL @DEFS@
-LIBS = @LIBS@
-PERL = @PERL@
-
-THREAD_LIBS = @PTHREAD_LIBS@
-THREAD_CFLAGS = @PTHREAD_CFLAGS@
-
-DEPEND = @DEPEND@
-DEPEND_FLAGS = @DEPEND_FLAGS@
-DEPEND_DEFINES = @DEPEND_DEFINES@
-
-SHELL = /bin/sh
-INSTALL = @INSTALL@
-SUID_FLAGS = -o root -m 4755
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SETUID = $(INSTALL_PROGRAM) $(SUID_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_DIRS = @INSTALL_DIRS@
-PROG_SETCAP = @PROG_SETCAP@
-SETCAP_FLAGS = cap_net_raw=p
-
-X_CFLAGS = @X_CFLAGS@
-X_LIBS = @X_LIBS@
-X_PRE_LIBS = @X_PRE_LIBS@
-X_EXTRA_LIBS = @X_EXTRA_LIBS@
-XFT_LIBS = @XFT_LIBS@
-
-# Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
-#
-HACK_PRE = $(LIBS) $(X_LIBS)
-HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
-HACK_POST2 = @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
-HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ $(HACK_POST2)
-PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ $(HACK_POST2)
-GLE_LIBS = $(HACK_PRE) @GLE_LIBS@ @PNG_LIBS@ $(HACK_POST2)
-TEXT_LIBS = @PTY_LIBS@
-#### Is LIBCAP_CFLAGS necessary?
-LIBCAP_CFLAGS = @LIBCAP_CFLAGS@
-LIBCAP_LIBS = @LIBCAP_LIBS@
-
-HACK_SRC = $(srcdir)/..
-HACK_BIN = ..
-UTILS_SRC = $(HACK_SRC)/../utils
-JWXYZ_SRC = $(HACK_SRC)/../jwxyz
-UTILS_BIN = $(HACK_BIN)/../utils
-JWXYZ_BIN = $(HACK_BIN)/../jwxyz
-
-INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I$(JWXYZ_SRC) -I$(HACK_SRC) -I$(HACK_BIN) -I../..
-INCLUDES = $(INCLUDES_1) @INCLUDES@
-
-UTILDIR_OBJS = $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabclient.o \
- $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
- $(UTILS_BIN)/usleep.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/xmu.o $(UTILS_BIN)/xft.o \
- $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/logo.o \
- $(UTILS_BIN)/visual-gl.o \
- $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/xshm.o \
- $(UTILS_BIN)/textclient.o $(UTILS_BIN)/async_netdb.o \
- $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
- $(UTILS_BIN)/spline.o $(UTILS_BIN)/pow2.o \
- $(UTILS_BIN)/font-retry.o
-JWXYZ_OBJS = $(JWXYZ_BIN)/jwzgles.o
-HACKDIR_OBJS = $(HACK_BIN)/screenhack.o $(HACK_BIN)/xlockmore.o \
- $(HACK_BIN)/fps.o $(HACK_BIN)/ximage-loader.o
-PNG = $(HACK_BIN)/ximage-loader.o
-
-SRCS = xscreensaver-gl-visual.c normals.c erase-gl.c fps-gl.c \
- atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
- buildlwo.c cage.c dolphin.c gears.c lament.c lament_model.c \
- moebius.c morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c \
- s1_3.c s1_4.c s1_5.c s1_6.c s1_b.c shark.c sproingies.c \
- sproingiewrap.c stairs.c superquadrics.c swim.c whale.c \
- xlock-gl-utils.c glplanet.c pulsar.c \
- extrusion.c extrusion-helix2.c extrusion-helix3.c \
- extrusion-helix4.c extrusion-joinoffset.c extrusion-screw.c \
- extrusion-taper.c extrusion-twistoid.c sierpinski3d.c \
- gflux.c stonerview.c stonerview-move.c stonerview-osc.c \
- stonerview-view.c starwars.c glut_stroke.c glut_swidth.c \
- gltext.c molecule.c dangerball.c sphere.c tube.c circuit.c \
- menger.c engine.c flipscreen3d.c dnalogo.c \
- grab-ximage.c glsnake.c boxed.c glforestfire.c sballs.c \
- cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
- trackball.c gltrackball.c queens.c endgame.c chessmodels.c \
- glblur.c gllist.c flurry.c flurry-smoke.c flurry-spark.c \
- flurry-star.c flurry-texture.c atunnel.c tunnel_draw.c \
- flyingtoasters.c toaster.c toaster_base.c toaster_handle.c \
- toaster_handle2.c toaster_jet.c toaster_knob.c \
- toaster_slots.c toaster_wing.c toast.c toast2.c \
- bouncingcow.c cow_face.c cow_hide.c cow_hoofs.c cow_horns.c \
- cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c \
- hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
- flipflop.c antspotlight.c polytopes.c gleidescope.c \
- mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
- antinspect.c providence.c pinion.c involute.c boing.c \
- texfont.c carousel.c fliptext.c antmaze.c \
- tangram.c tangram_shapes.c crackberg.c glhanoi.c cube21.c \
- timetunnel.c juggler3d.c topblock.c glschool.c \
- glschool_gl.c glschool_alg.c glcells.c voronoi.c \
- moebiusgears.c lockward.c cubicgrid.c hypnowheel.c \
- skytentacles.c teapot.c sonar.c sonar-sim.c sonar-icmp.c \
- jigsaw.c photopile.c dropshadow.c rubikblocks.c surfaces.c \
- hilbert.c companion.c companion_quad.c companion_disc.c \
- companion_heart.c tronbit.c tronbit_idle1.c tronbit_idle2.c \
- tronbit_no.c tronbit_yes.c kaleidocycle.c \
- quasicrystal.c unknownpleasures.c geodesic.c geodesicgears.c \
- projectiveplane.c winduprobot.c robot.c robot-wireframe.c \
- cityflow.c romanboy.c splitflap.c splitflap_obj.c \
- dymaxionmap.c dymaxionmap-coords.c unicrud.c energystream.c \
- raverhoop.c hydrostat.c discoball.c cubetwist.c cubestack.c \
- splodesic.c hexstrut.c vigilance.c seccam.c esper.c \
- razzledazzle.c ships.c peepers.c crumbler.c quickhull.c \
- maze3d.c handsy.c handsy_model.c gravitywell.c deepstars.c \
- gibson.c etruscanvenus.c sphereeversion.c covid19.c \
- co____9.c headroom.c headroom_model.c beats.c glsl-utils.c
-
-OBJS = xscreensaver-gl-visual.o normals.o erase-gl.o fps-gl.o \
- atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
- buildlwo.o cage.o dolphin.o gears.o lament.o lament_model.o \
- moebius.o morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o \
- s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o shark.o sproingies.o \
- sproingiewrap.o stairs.o superquadrics.o swim.o whale.o \
- xlock-gl-utils.o glplanet.o pulsar.o \
- extrusion.o extrusion-helix2.o extrusion-helix3.o \
- extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
- extrusion-taper.o extrusion-twistoid.o sierpinski3d.o \
- gflux.o stonerview.o stonerview-move.o stonerview-osc.o \
- stonerview-view.o starwars.o glut_stroke.o glut_swidth.o \
- gltext.o molecule.o dangerball.o sphere.o tube.o circuit.o \
- menger.o engine.o flipscreen3d.o dnalogo.o \
- grab-ximage.o glsnake.o boxed.o glforestfire.o sballs.o \
- cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
- trackball.o gltrackball.o queens.o endgame.o chessmodels.o \
- glblur.o gllist.o flurry.o flurry-smoke.o flurry-spark.o \
- flurry-star.o flurry-texture.o atunnel.o tunnel_draw.o \
- flyingtoasters.o toaster.o toaster_base.o toaster_handle.o \
- toaster_handle2.o toaster_jet.o toaster_knob.o \
- toaster_slots.o toaster_wing.o toast.o toast2.o \
- bouncingcow.o cow_face.o cow_hide.o cow_hoofs.o cow_horns.o \
- cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o \
- hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
- flipflop.o antspotlight.o polytopes.o gleidescope.o \
- mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
- antinspect.o providence.o pinion.o involute.o boing.o \
- texfont.o texfont-glsl.o carousel.o fliptext.o antmaze.o \
- tangram.o tangram_shapes.o crackberg.o glhanoi.o cube21.o \
- timetunnel.o juggler3d.o topblock.o glschool.o \
- glschool_gl.o glschool_alg.o glcells.o voronoi.o \
- moebiusgears.o lockward.o cubicgrid.o hypnowheel.o \
- skytentacles.o teapot.o sonar.o sonar-sim.o sonar-icmp.o \
- jigsaw.o photopile.o dropshadow.o rubikblocks.o surfaces.o \
- hilbert.o companion.o companion_quad.o companion_disc.o \
- companion_heart.o tronbit.o tronbit_idle1.o tronbit_idle2.o \
- tronbit_no.o tronbit_yes.o kaleidocycle.o \
- quasicrystal.o unknownpleasures.o geodesic.o geodesicgears.o \
- projectiveplane.o winduprobot.o robot.o robot-wireframe.o \
- cityflow.o romanboy.o splitflap.o splitflap_obj.o \
- dymaxionmap.o dymaxionmap-coords.o unicrud.o energystream.o \
- raverhoop.o hydrostat.o discoball.o cubetwist.o cubestack.o \
- splodesic.o hexstrut.o vigilance.o seccam.o esper.o \
- razzledazzle.o ships.o peepers.o crumbler.o quickhull.o \
- maze3d.o handsy.o handsy_model.o gravitywell.o deepstars.o \
- gibson.o etruscanvenus.o sphereeversion.o covid19.o \
- headroom.o headroom_model.o beats.o glsl-utils.o
-
-GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \
- morph3d rubik atlantis lament bubble3d glplanet pulsar \
- sierpinski3d gflux stonerview starwars gltext molecule \
- dangerball circuit menger engine flipscreen3d glsnake boxed \
- sballs cubenetic spheremonics lavalite queens \
- endgame glblur flurry atunnel flyingtoasters bouncingcow \
- glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
- glknots blocktube flipflop antspotlight polytopes \
- gleidescope mirrorblob blinkbox noof polyhedra \
- antinspect providence pinion boing carousel fliptext \
- antmaze tangram crackberg glhanoi cube21 timetunnel \
- juggler3d topblock glschool glcells voronoi moebiusgears \
- lockward cubicgrid hypnowheel skytentacles jigsaw photopile \
- rubikblocks surfaces hilbert companioncube tronbit \
- kaleidocycle quasicrystal unknownpleasures geodesic \
- geodesicgears projectiveplane winduprobot cityflow romanboy \
- splitflap dymaxionmap unicrud energystream raverhoop \
- hydrostat discoball cubetwist cubestack splodesic \
- hexstrut vigilance esper razzledazzle peepers crumbler \
- maze3d handsy gravitywell deepstars gibson etruscanvenus \
- sphereeversion covid19 headroom beats
-GLE_EXES = extrusion
-SUID_EXES = sonar
-SETCAP_EXES = sonar
-GL_UTIL_EXES = xscreensaver-gl-visual
-JWZGLES_OBJS = @JWZGLES_OBJS@
-HACK_EXES_1 = @GL_EXES@ @GLE_EXES@
-HACK_EXES = $(HACK_EXES_1) @SUID_EXES@
-XSHM_OBJS = $(UTILS_BIN)/xshm.o $(UTILS_BIN)/aligned_malloc.o
-GRAB_OBJS = $(UTILS_BIN)/grabclient.o grab-ximage.o $(XSHM_OBJS)
-ANIM_OBJS = recanim-gl.o
-ANIM_LIBS = @PNG_LIBS@
-EXES = @GL_UTIL_EXES@ $(HACK_EXES)
-
-RETIRED_EXES = @RETIRED_GL_EXES@
-RETIRED_GL_EXES = glforestfire
-
-FPS_OBJS = texfont.o $(HACK_BIN)/fps.o fps-gl.o \
- @XFT_OBJS@
-HACK_GLSL_OBJS = glsl-utils.o
-HACK_OBJS = $(HACK_BIN)/screenhack.o $(HACK_BIN)/xlockmore.o \
- xlock-gl-utils.o erase-gl.o \
- $(UTILS_BIN)/resources.o \
- $(UTILS_BIN)/colors.o \
- $(UTILS_BIN)/hsv.o \
- $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/visual-gl.o \
- $(UTILS_BIN)/font-retry.o \
- $(UTILS_BIN)/pow2.o \
- $(UTILS_BIN)/utf8wc.o \
- $(UTILS_BIN)/usleep.o \
- $(UTILS_BIN)/xmu.o \
- $(UTILS_BIN)/yarandom.o \
- ${FPS_OBJS} $(JWZGLES_OBJS) $(HACK_GLSL_OBJS) @ANIM_OBJS@
-
-HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h \
- grab-ximage.h tube.h sphere.h boxed.h \
- stonerview.h stonerview-move.h stonerview-osc.h \
- glutstroke.h glut_roman.h glut_mroman.h marching.h \
- rotator.h trackball.h gltrackball.h chessmodels.h \
- chessgames.h gllist.h flurry.h tunnel_draw.h ants.h \
- polyhedra.h normals.h texfont.h tangram_shapes.h \
- sproingies.h extrusion.h glschool.h glschool_gl.h \
- glschool_alg.h topblock.h involute.h teapot.h sonar.h \
- dropshadow.h starwars.h teapot2.h dnapizza.h curlicue.h \
- quickhull.h dymaxionmap-coords.h handsy_anim.h \
- glsl-utils.h
-GL_MEN = xscreensaver-gl-visual.man \
- atlantis.man boxed.man bubble3d.man cage.man circuit.man \
- cubenetic.man dangerball.man engine.man extrusion.man \
- flipscreen3d.man gears.man gflux.man \
- glplanet.man glsnake.man gltext.man lament.man lavalite.man \
- menger.man moebius.man molecule.man morph3d.man pipes.man \
- pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
- spheremonics.man sproingies.man stairs.man starwars.man \
- stonerview.man superquadrics.man \
- endgame.man flurry.man glblur.man atunnel.man \
- flyingtoasters.man bouncingcow.man glslideshow.man \
- jigglypuff.man klein.man hypertorus.man glmatrix.man \
- cubestorm.man glknots.man blocktube.man flipflop.man \
- antspotlight.man polytopes.man gleidescope.man \
- mirrorblob.man blinkbox.man noof.man polyhedra.man \
- antinspect.man providence.man pinion.man boing.man \
- carousel.man fliptext.man antmaze.man tangram.man \
- crackberg.man glhanoi.man cube21.man timetunnel.man \
- juggler3d.man topblock.man glschool.man glcells.man \
- voronoi.man moebiusgears.man lockward.man cubicgrid.man \
- hypnowheel.man skytentacles.man sonar.man jigsaw.man \
- photopile.man rubikblocks.man surfaces.man hilbert.man \
- companioncube.man tronbit.man kaleidocycle.man \
- quasicrystal.man unknownpleasures.man geodesic.man \
- geodesicgears.man projectiveplane.man winduprobot.man \
- cityflow.man romanboy.man splitflap.man dymaxionmap.man \
- unicrud.man energystream.man raverhoop.man hydrostat.man \
- discoball.man cubetwist.man cubestack.man splodesic.man \
- hexstrut.man vigilance.man esper.man razzledazzle.man \
- peepers.man crumbler.man maze3d.man handsy.man \
- gravitywell.man deepstars.man gibson.man etruscanvenus.man \
- sphereeversion.man covid19.man headroom.man beats.man
-MEN = @GL_MEN@
-RETIRED_MEN = glforestfire.man
-EXTRAS = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \
- molecules.sh starwars.txt zalgo.txt *.dxf
-
-TARFILES = $(SRCS) $(HDRS) $(GL_MEN) $(RETIRED_MEN) $(EXTRAS)
-
-
-default: all
-all: $(EXES) $(RETIRED_EXES)
-
-install: install-program install-xml install-man
-uninstall: uninstall-program uninstall-xml uninstall-man
-
-install-strip:
- $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
-
-# the hacks, in $HACKDIR
-install-program:: $(EXES)
- @exes="$(HACK_EXES_1) @GL_UTIL_EXES@" ; \
- idir="$(install_prefix)$(HACKDIR)" ; \
- if [ "$$exes" != "" ]; then \
- if [ ! -d $$idir ]; then \
- $(INSTALL_DIRS) $$idir ; \
- fi ; \
- for program in $$exes; do \
- echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
- $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
- done ; \
- \
- exes="$(SUID_EXES)" ; \
- if [ @SETUID_HACKS@ = yes ]; then \
- sinst="$(INSTALL_SETUID)" ; \
- else \
- sinst="$(INSTALL_PROGRAM)" ; \
- fi ; \
- for program in $$exes; do \
- echo $$sinst $$program $$idir/$$program ; \
- if $$sinst $$program $$idir/$$program ; then \
- true ; \
- elif [ @SETUID_HACKS@ = yes ]; then \
- echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
- if $(INSTALL_PROGRAM) $$program $$idir/$$program ; then\
- echo "" ; \
- echo "WARNING: unable to install $$program setuid:" \
- "installed non-setuid instead." ; \
- echo "" ; \
- else \
- exit 1 ; \
- fi ; \
- else \
- exit 1 ; \
- fi ; \
- done ; \
- \
- exes="${SETCAP_EXES}" ; \
- if [ @SETCAP_HACKS@ = yes ]; then \
- for program in $$exes; do \
- echo $(PROG_SETCAP) $(SETCAP_FLAGS) $$idir/$$program ; \
- if $(PROG_SETCAP) $(SETCAP_FLAGS) $$idir/$$program ; then \
- true ; \
- else \
- echo "" ; \
- echo "WARNING: unable to setcap $$program" ; \
- echo "" ; \
- fi ; \
- done ; \
- fi ; \
- fi
-
-
-# When installing man pages, we install "foo.man" as "foo.N" and update
-# the .TH line in the installed file with one like
-#
-# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
-#
-# where N is the manual section suffix.
-#
-install-man: $(MEN)
- @men="$(MEN)" ; \
- U=$(UTILS_SRC)/version.h ; \
- V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
- T=/tmp/xs$$$$.$(mansuffix) ; \
- TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
- echo "installing man pages: $$TH" ; \
- \
- if [ ! -d $(install_prefix)$(manNdir) ]; then \
- $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
- fi ; \
- \
- for man in $$men; do \
- instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
- manbase=`echo $$man | sed 's/\.man$$//'` ; \
- TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
- sed -e "s/^\.TH.*/$$TH/" \
- -e 's@(MANSUFFIX)@($(mansuffix))@g' \
- < $(srcdir)/$$man > $$T ; \
- echo $(INSTALL_DATA) $(srcdir)/$$man \
- $(install_prefix)$(manNdir)/$$instname ; \
- $(INSTALL_DATA) $$T \
- $(install_prefix)$(manNdir)/$$instname ; \
- done ; \
- rm -f $$T
-
-install-xml:
- @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
- if [ ! -d $$dest ]; then \
- $(INSTALL_DIRS) $$dest ; \
- fi ; \
- src=$(srcdir)/../config ; \
- for file in $(EXES) $(SCRIPTS) ; do \
- if [ -f $$src/$$file.xml ]; then \
- echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
- $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
- fi ; \
- done
-
-# the hacks, in $HACKDIR
-uninstall-program::
- @exes="$(HACK_EXES) $(RETIRED_EXES) @GL_UTIL_EXES@" ; \
- idir="$(install_prefix)$(HACKDIR)" ; \
- for program in $$exes; do \
- echo rm -f $$idir/$$program ; \
- rm -f $$idir/$$program ; \
- done
-
-# $HACKDIR/xscreensaver-gl-visual used to be $bindir/xscreensaver-gl-helper
-uninstall-program::
- rm -f $(install_prefix)$(bindir)/xscreensaver-gl-helper
-
-uninstall-man:
- @men="$(MEN) $(RETIRED_MEN)" ; \
- for man in $$men; do \
- instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
- echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
- rm -f $(install_prefix)$(manNdir)/$$instname* ; \
- done
-
-uninstall-xml:
- @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
- for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) ; do \
- echo rm -f $$dest/$$file.xml ; \
- rm -f $$dest/$$file.xml ; \
- done
-
-clean::
- -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) molecules.h
-
-distclean: clean
- -rm -f Makefile TAGS *~ "#"*
-
-# Adds all current dependencies to Makefile
-depend:
- $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
- $(DEPEND_FLAGS) -- \
- $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
- $(SRCS)
-
-# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
-# close. This excludes dependencies on files in /usr/include, etc. It tries
-# to include only dependencies on files which are themselves a part of this
-# package.
-distdepend:: molecules.h
- @echo updating dependencies in `pwd`/Makefile.in... ; \
- $(DEPEND) -w 0 -f - \
- -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
- $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
- $(SRCS) 2>/dev/null | \
- sort -d | \
- ( \
- awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
- sed -e '/^#.*/d' \
- -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
- -e 's@\.\./\.\./utils@$$(UTILS_SRC)@g' \
- -e 's@\.\./\.\./jwxyz@$$(JWXYZ_SRC)@g' \
- -e 's@\.\./glx/@@g' \
- -e 's@ \.\./@ $$(HACK_SRC)/@g' \
- -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
- -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' \
- -e 's@ $$(HACK_SRC)/\(.*config.h\)@ ../\1@g' \
- -e 's@ $$(srcdir)/\(.*molecules.h\)@ \1@g' \
- -e 's@ $$(srcdir)/\(images/gen/\)@ ../\1@g' \
- -e 's@ $$(HACK_SRC)/\(images/gen/\)@ ../\1@g' ; \
- echo '' \
- ) > /tmp/distdepend.$$$$ && \
- mv /tmp/distdepend.$$$$ Makefile.in
-
-
-TAGS: tags
-tags:
- find $(srcdir) -name '*.[chly]' -print | xargs etags -a
-
-list_tarfiles:
- @find $(TARFILES) -type f -print | sort
-
-check_men:
- @badmen="" ; \
- for exe in $(EXES); do \
- if ! [ -f $(srcdir)/$$exe.man ]; then \
- badmen="$$badmen $$exe" ; \
- fi ; \
- done ; \
- if [ -n "$$badmen" ]; then \
- echo "" ; \
- echo "Warning: The following programs have no manuals:" ; \
- echo "" ; \
- for m in $$badmen ; do \
- echo " $$m" ; \
- done ; \
- fi
-
-validate_xml:
- @echo "Validating XML..." ; \
- cd $(HACK_SRC) ; ./check-configs.pl $(GL_EXES) $(GLE_EXES) $(SUID_EXES)
-
-distdepend:: check_men validate_xml
-
-
-
-# Rules for noticing when the objects from the utils and hacks
-# directories are out of date with respect to their sources, and going
-# and building them according to the rules in their own Makefile...
-#
-$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
-$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
-$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
-$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
-$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
-$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
-$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
-$(UTILS_BIN)/xft.o: $(UTILS_SRC)/xft.c
-$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
-$(UTILS_BIN)/logo.o: $(UTILS_SRC)/logo.c
-$(UTILS_BIN)/visual-gl.o: $(UTILS_SRC)/visual-gl.c
-$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
-$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
-$(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
-$(UTILS_BIN)/async_netdb.o: $(UTILS_SRC)/async_netdb.c
-$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
-$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
-$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
-$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
-$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
-$(HACK_BIN)/screenhack.o: $(HACK_SRC)/screenhack.c
-$(HACK_BIN)/xlockmore.o: $(HACK_SRC)/xlockmore.c
-$(HACK_BIN)/fps.o: $(HACK_SRC)/fps.c
-
-$(UTILDIR_OBJS):
- cd $(UTILS_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
-$(JWXYZ_OBJS):
- cd $(JWXYZ_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
-$(HACKDIR_OBJS):
- cd $(HACK_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
-
-
-# How we build object files in this directory.
-HACK_CFLAGS_BASE=$(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
-.c.o:
- $(CC) -c $(HACK_CFLAGS_BASE) $<
-
-# Make sure the images have been packaged. This is the first one hit.
-#
-../images/gen/wood_png.h:
- cd ../images && $(MAKE)
- @if ! [ -f "$@" ]; then \
- echo; echo $@ "wasn't built -- try 'gmake' instead?"; echo; exit 1; \
- fi
-
-# How to build the "xscreensaver-gl-visual" program, that lets the daemon
-# know which visual is the right one for GL programs.
-#
-GLH1=xscreensaver-gl-visual.o $(UTILS_BIN)/visual-gl.o
-GLH2=$(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o
-xscreensaver-gl-visual: $(GLH1) $(GLH2)
- $(CC) $(LDFLAGS) -o $@ $(GLH1) $(GLH2) $(LIBS) $(X_LIBS) $(HACK_POST2)
-
-
-# These hacks use a slightly-differently-compiled variant of recanim.c.
-# This is how to make the the other .o file from it.
-#
-XLM_CFLAGS=-DUSE_GL $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
-recanim-gl.o: $(HACK_SRC)/recanim.c
- $(CC) -o $@ -c $(XLM_CFLAGS) $(HACK_SRC)/recanim.c
-
-CC_HACK = $(CC) $(LDFLAGS)
-
-THREAD_OBJS = $(UTILS_BIN)/thread_util.o
-TRACK_OBJS = rotator.o trackball.o gltrackball.o
-HACK_TRACK_OBJS = $(HACK_OBJS) $(TRACK_OBJS)
-HACK_GRAB_OBJS = $(HACK_OBJS) $(GRAB_OBJS)
-HACK_TRACK_GRAB_OBJS = $(HACK_TRACK_OBJS) $(GRAB_OBJS)
-TEXT = $(UTILS_BIN)/textclient.o
-
-ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o $(PNG)
-atlantis: atlantis.o $(ATLANTIS_OBJS)
- $(CC_HACK) -o $@ $@.o $(ATLANTIS_OBJS) $(PNG_LIBS)
-
-ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o $(PNG)
-atunnel: atunnel.o $(ATUNNEL_OBJS)
- $(CC_HACK) -o $@ $@.o $(ATUNNEL_OBJS) $(PNG_LIBS)
-
-cage: cage.o $(PNG) $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
-
-FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
-FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
-
-flurry: flurry.o $(FLURRY_OBJS)
- $(CC_HACK) -o $@ $@.o $(FLURRY_OBJS) $(HACK_LIBS) -lm
-
-GEARS_OBJS_1=normals.o involute.o
-GEARS_OBJS=$(GEARS_OBJS_1) $(HACK_TRACK_OBJS)
-gears: gears.o tube.o $(GEARS_OBJS)
- $(CC_HACK) -o $@ $@.o tube.o $(GEARS_OBJS) $(HACK_LIBS)
-
-MOEBIUS_OBJS=sphere.o tube.o $(PNG) $(HACK_TRACK_OBJS)
-moebius: moebius.o $(MOEBIUS_OBJS)
- $(CC_HACK) -o $@ $@.o $(MOEBIUS_OBJS) $(HACK_LIBS) $(PNG_LIBS)
-
-PIPE_OBJS=pipeobjs.o buildlwo.o sphere.o teapot.o normals.o
-pipes: pipes.o $(PIPE_OBJS) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PIPE_OBJS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-superquadrics: superquadrics.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-morph3d: morph3d.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-rubik: rubik.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-STAIRS=sphere.o $(PNG) $(HACK_TRACK_OBJS)
-stairs: stairs.o $(STAIRS)
- $(CC_HACK) -o $@ $@.o $(STAIRS) $(HACK_LIBS) $(PNG_LIBS)
-
-SPROING1=$(HACK_OBJS) sproingiewrap.o gllist.o
-SPROING2=s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
-sproingies: sproingies.o $(SPROING1) $(SPROING2)
- $(CC_HACK) -o $@ $@.o $(SPROING1) $(SPROING2) $(HACK_LIBS)
-
-LAMENTOBJS = gllist.o lament_model.o $(HACK_TRACK_OBJS) $(PNG) normals.o
-lament: lament.o $(LAMENTOBJS)
- $(CC_HACK) -o $@ $@.o $(LAMENTOBJS) $(PNG_LIBS)
-
-lament_dxf::
- ./dxf2gl.pl --smooth --layers lament.dxf lament_model.c
-
-
-B3D_OBJS = b_sphere.o b_draw.o b_lockglue.o $(HACK_OBJS)
-bubble3d: bubble3d.o $(B3D_OBJS)
- $(CC_HACK) -o $@ $@.o $(B3D_OBJS) $(HACK_LIBS)
-
-PLANET_OBJS=sphere.o $(PNG) $(HACK_TRACK_OBJS)
-glplanet: glplanet.o $(PLANET_OBJS)
- $(CC_HACK) -o $@ $@.o $(PLANET_OBJS) $(PNG_LIBS)
-
-DYMAXIOBJS=dymaxionmap-coords.o normals.o $(PLANET_OBJS)
-dymaxionmap: dymaxionmap.o $(DYMAXIOBJS)
- $(CC_HACK) -o $@ $@.o $(DYMAXIOBJS) $(PNG_LIBS)
-
-pulsar: pulsar.o $(HACK_OBJS) $(PNG)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
-
-EXTR1=extrusion.o extrusion-helix2.o extrusion-helix3.o
-EXTR2=extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o
-EXTR3=extrusion-taper.o extrusion-twistoid.o $(PNG) $(HACK_TRACK_OBJS)
-extrusion: $(EXTR1) $(EXTR2) $(EXTR3)
- $(CC_HACK) -o $@ $(EXTR1) $(EXTR2) $(EXTR3) $(GLE_LIBS)
-
-sierpinski3d: sierpinski3d.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-gflux: gflux.o $(HACK_TRACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
-
-SW_OBJS=starwars.o glut_stroke.o glut_swidth.o $(TEXT) $(HACK_OBJS)
-starwars: $(SW_OBJS)
- $(CC_HACK) -o $@ $(SW_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
-
-GLT1=gltext.o glut_stroke.o glut_swidth.o tube.o sphere.o
-GLT2=$(TEXT) $(HACK_TRACK_OBJS)
-gltext: $(GLT1) $(GLT2)
- $(CC_HACK) -o $@ $(GLT1) $(GLT2) $(HACK_LIBS) $(TEXT_LIBS)
-
-DB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
-dangerball: dangerball.o $(DB_OBJS)
- $(CC_HACK) -o $@ $@.o $(DB_OBJS) $(HACK_LIBS)
-
-circuit: circuit.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-menger: menger.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-engine: engine.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-flipscreen3d: flipscreen3d.o $(HACK_TRACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
-
-glsnake: glsnake.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-boxed: boxed.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-glforestfire: glforestfire.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
-
-sballs: sballs.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
-
-cubenetic: cubenetic.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-spheremonics: spheremonics.o normals.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-LL_OBJS=marching.o $(PNG) normals.o $(HACK_TRACK_OBJS)
-lavalite: lavalite.o $(LL_OBJS)
- $(CC_HACK) -o $@ $@.o $(LL_OBJS) $(PNG_LIBS)
-
-queens: queens.o chessmodels.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-endgame: endgame.o chessmodels.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-glblur: glblur.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-TOAST1=toaster.o toaster_base.o toaster_handle.o toaster_handle2.o
-TOAST2=toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o
-TOAST3=toast.o toast2.o flyingtoasters.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
-flyingtoasters: $(TOAST1) $(TOAST2) $(TOAST3)
- $(CC_HACK) -o $@ $(TOAST1) $(TOAST2) $(TOAST3) $(PNG_LIBS)
-
-toaster_dxf::
- @set -e ; \
- for f in \
- toaster.dxf \
- toaster_base.dxf \
- toaster_handle.dxf \
- toaster_handle2.dxf \
- toaster_jet.dxf \
- toaster_knob.dxf \
- toaster_slots.dxf \
- toaster_wing.dxf \
- toast.dxf \
- toast2.dxf \
- ; do \
- f2=`echo $$f | sed 's/dxf$$/c/'` ; \
- ./dxf2gl.pl --normalize --smooth $$f $$f2 ; \
- done ; \
-
-COW1=cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o
-COW2=bouncingcow.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
-bouncingcow: $(COW1) $(COW2)
- $(CC_HACK) -o $@ $(COW1) $(COW2) $(PNG_LIBS)
-
-ROBO1=robot.o robot-wireframe.o gllist.o $(PNG) sphere.o
-ROBO2=winduprobot.o $(GEARS_OBJS_1) $(TEXT) $(HACK_TRACK_OBJS)
-winduprobot: $(ROBO1) $(ROBO2)
- $(CC_HACK) -o $@ $(ROBO1) $(ROBO2) $(PNG_LIBS) $(TEXT_LIBS)
-
-winduprobot_dxf::
- ./dxf2gl.pl --smooth --layers robot.dxf robot.c
- ./dxf2gl.pl --wireframe robot-wireframe.dxf robot-wireframe.c
-
-CAM_OBJS=seccam.o gllist.o vigilance.o $(HACK_TRACK_OBJS)
-vigilance: $(CAM_OBJS)
- $(CC_HACK) -o $@ $(CAM_OBJS) $(HACK_LIBS)
-
-seccam_dxf::
- ./dxf2gl.pl --smooth --layers seccam.dxf seccam.c
-
-glslideshow: glslideshow.o $(HACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
-
-jigglypuff: jigglypuff.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
-
-klein: klein.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-surfaces: surfaces.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-hypertorus: hypertorus.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-projectiveplane: projectiveplane.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-romanboy: romanboy.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-etruscanvenus: etruscanvenus.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-sphereeversion: sphereeversion.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-glmatrix: glmatrix.o $(PNG) $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
-
-cubestorm: cubestorm.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-glknots: glknots.o tube.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-blocktube: blocktube.o $(PNG) $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
-
-flipflop: flipflop.o $(HACK_TRACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
-
-antspotlight: antspotlight.o sphere.o $(HACK_TRACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
-
-polytopes: polytopes.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-STONER_OBJS=stonerview-move.o stonerview-osc.o stonerview-view.o
-stonerview: stonerview.o $(STONER_OBJS) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(STONER_OBJS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-molecules.h:
- @echo "building molecules.h from $(HACK_SRC)/images/molecules/*.pdb"; \
- UTILS_SRC="$(UTILS_SRC)" \
- $(srcdir)/molecules.sh molecules.h $(HACK_SRC)/images/molecules/*.pdb
-
-MOLECULE_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
-molecule.o: molecules.h
-molecule: molecule.o $(MOLECULE_OBJS)
- $(CC_HACK) -o $@ $@.o $(MOLECULE_OBJS) $(HACK_LIBS)
-
-gleidescope: gleidescope.o $(PNG) $(HACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_GRAB_OBJS) $(PNG_LIBS)
-
-mirrorblob: mirrorblob.o $(HACK_TRACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(PNG_LIBS)
-
-blinkbox: blinkbox.o sphere.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o $(HACK_OBJS) $(HACK_LIBS)
-
-noof: noof.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-PH_OBJS=polyhedra-gl.o normals.o teapot.o $(HACK_TRACK_OBJS)
-polyhedra: polyhedra.o $(PH_OBJS)
- $(CC_HACK) -o $@ $@.o $(PH_OBJS) $(HACK_LIBS)
-
-antinspect: antinspect.o sphere.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-providence: providence.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-pinion: pinion.o $(GEARS_OBJS)
- $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
-
-moebiusgears: moebiusgears.o $(GEARS_OBJS)
- $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
-
-boing: boing.o normals.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-carousel: carousel.o $(HACK_TRACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
-
-fliptext: fliptext.o $(TEXT) $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(TEXT) $(HACK_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
-
-antmaze: antmaze.o sphere.o tube.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-TANGRAM_OBJS=tangram_shapes.o $(HACK_OBJS)
-tangram: tangram.o $(TANGRAM_OBJS)
- $(CC_HACK) -o $@ $@.o $(TANGRAM_OBJS) $(HACK_LIBS)
-
-crackberg: crackberg.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-glhanoi: glhanoi.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-cube21: cube21.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-TIMETUNNEL_OBJS = $(PNG) $(HACK_TRACK_OBJS)
-timetunnel: timetunnel.o $(TIMETUNNEL_OBJS)
- $(CC_HACK) -o $@ $@.o $(TIMETUNNEL_OBJS) $(PNG_LIBS)
-
-JUGG_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
-juggler3d: juggler3d.o $(JUGG_OBJS)
- $(CC_HACK) -o $@ $@.o $(JUGG_OBJS) $(HACK_LIBS)
-
-dnalogo: dnalogo.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-topblock: topblock.o sphere.o tube.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-SCHOOL_OBJS=glschool.o glschool_alg.o glschool_gl.o sphere.o tube.o normals.o
-glschool: $(SCHOOL_OBJS) $(HACK_OBJS)
- $(CC_HACK) -o $@ $(SCHOOL_OBJS) $(HACK_OBJS) $(HACK_LIBS)
-
-glcells: glcells.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-voronoi: voronoi.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-lockward: lockward.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
-
-cubicgrid: cubicgrid.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-hypnowheel: hypnowheel.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-TENTACLE_OBJS=normals.o $(PNG) $(HACK_TRACK_OBJS)
-skytentacles: skytentacles.o $(TENTACLE_OBJS)
- $(CC_HACK) -o $@ $@.o $(TENTACLE_OBJS) $(PNG_LIBS)
-
-SONAR_OBJS = sonar-sim.o sonar-icmp.o $(UTILS_BIN)/async_netdb.o \
- $(THREAD_OBJS) $(UTILS_BIN)/aligned_malloc.o \
- $(HACK_TRACK_OBJS)
-sonar-icmp.o: sonar-icmp.c
- $(CC) -c $(HACK_CFLAGS_BASE) $(THREAD_CFLAGS) $<
-sonar: sonar.o $(SONAR_OBJS)
- $(CC_HACK) -o $@ $@.o $(THREAD_CFLAGS) $(SONAR_OBJS) $(LIBCAP_LIBS) $(THREAD_LIBS) $(HACK_LIBS)
-
-JIGSAW_OBJS=normals.o $(UTILS_BIN)/spline.o $(HACK_TRACK_GRAB_OBJS)
-jigsaw: jigsaw.o $(JIGSAW_OBJS)
- $(CC_HACK) -o $@ $@.o $(JIGSAW_OBJS) $(HACK_LIBS)
-
-PHOTOPILE_OBJS=dropshadow.o $(HACK_GRAB_OBJS)
-photopile: photopile.o $(PHOTOPILE_OBJS)
- $(CC_HACK) -o $@ $@.o $(PHOTOPILE_OBJS) $(HACK_LIBS)
-
-rubikblocks: rubikblocks.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-HILB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
-hilbert: hilbert.o $(HILB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HILB_OBJS) $(HACK_LIBS)
-
-CCUBE1=companion.o companion_quad.o companion_disc.o companion_heart.o
-CCUBE2=gllist.o $(HACK_TRACK_OBJS)
-companioncube: $(CCUBE1) $(CCUBE2)
- $(CC_HACK) -o $@ $(CCUBE1) $(CCUBE2) $(HACK_LIBS)
-
-TBIT1=tronbit.o tronbit_idle1.o tronbit_idle2.o tronbit_no.o tronbit_yes.o
-TBIT2=gllist.o $(HACK_TRACK_OBJS)
-tronbit: $(TBIT1) $(TBIT2)
- $(CC_HACK) -o $@ $(TBIT1) $(TBIT2) $(HACK_LIBS)
-
-KALEIDOCYCLE_OBJS=kaleidocycle.o normals.o $(HACK_TRACK_OBJS)
-kaleidocycle: $(KALEIDOCYCLE_OBJS)
- $(CC_HACK) -o $@ $(KALEIDOCYCLE_OBJS) $(HACK_LIBS)
-
-quasicrystal: quasicrystal.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-unknownpleasures: unknownpleasures.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(HACK_LIBS) $(PNG_LIBS)
-
-geodesic: geodesic.o normals.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-geodesicgears: geodesicgears.o $(GEARS_OBJS)
- $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
-
-cityflow: cityflow.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-splitflap_dxf::
- ./dxf2gl.pl --normalize --smooth --layers splitflap.dxf splitflap_obj.c
-
-FLAP_OBJS=splitflap_obj.o gllist.o splitflap.o $(TEXT) $(HACK_TRACK_OBJS)
-splitflap: $(FLAP_OBJS)
- $(CC_HACK) -o $@ $(FLAP_OBJS) $(PNG_LIBS) $(TEXT_LIBS)
-
-unicrud: unicrud.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-ES_OBJS=$(PNG) $(HACK_TRACK_OBJS)
-energystream: energystream.o $(ES_OBJS)
- $(CC_HACK) -o $@ $@.o $(ES_OBJS) $(PNG_LIBS) $(HACK_LIBS)
-
-raverhoop: raverhoop.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-HSTAT_OBJS=sphere.o normals.o $(HACK_TRACK_OBJS)
-hydrostat: hydrostat.o $(HSTAT_OBJS)
- $(CC_HACK) -o $@ $@.o $(HSTAT_OBJS) $(HACK_LIBS)
-
-discoball: discoball.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-cubetwist: cubetwist.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-cubestack: cubestack.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-splodesic: splodesic.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-hexstrut: hexstrut.o normals.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-esper: esper.o $(HACK_GRAB_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
-
-ships_dxf::
- ./dxf2gl.pl --normalize --layers ships.dxf ships.c
-
-DAZ_OBJS=ships.o gllist.o $(HACK_TRACK_OBJS)
-razzledazzle: razzledazzle.o $(DAZ_OBJS)
- $(CC_HACK) -o $@ $@.o $(DAZ_OBJS) $(HACK_LIBS)
-
-peepers: peepers.o normals.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o normals.o $(PNG) $(PNG_LIBS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-crumbler: crumbler.o quickhull.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o quickhull.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-maze3d: maze3d.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(PNG_LIBS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-HANDSY_OBJS=gllist.o handsy_model.o normals.o $(HACK_TRACK_OBJS)
-handsy: handsy.o $(HANDSY_OBJS)
- $(CC_HACK) -o $@ $@.o $(HANDSY_OBJS) $(HACK_LIBS)
-
-handsy_dxf::
- ./dxf2gl.pl --smooth 28 --layers handsy.dxf handsy_model.c
-
-gravitywell: gravitywell.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-deepstars: deepstars.o $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
-
-gibson: gibson.o $(PNG) $(HACK_TRACK_OBJS)
- $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
-
-covid19: covid19.o $(DB_OBJS)
- $(CC_HACK) -o $@ $@.o $(DB_OBJS) $(HACK_LIBS)
-
-HEADROOM_OBJS=gllist.o headroom_model.o normals.o $(HACK_TRACK_OBJS)
-headroom: headroom.o $(HEADROOM_OBJS)
- $(CC_HACK) -o $@ $@.o $(HEADROOM_OBJS) $(HACK_LIBS)
-
-headroom_dxf::
- ./dxf2gl.pl --layers headroom.dxf headroom_model.c
-
-beats: beats.o sphere.o $(HACK_OBJS)
- $(CC_HACK) -o $@ $@.o sphere.o $(HACK_OBJS) $(HACK_LIBS)
-
-##############################################################################
-#
-# DO NOT DELETE: updated by make distdepend
-
-antinspect.o: ../../config.h
-antinspect.o: $(HACK_SRC)/fps.h
-antinspect.o: $(srcdir)/gltrackball.h
-antinspect.o: $(HACK_SRC)/recanim.h
-antinspect.o: $(HACK_SRC)/screenhackI.h
-antinspect.o: $(srcdir)/sphere.h
-antinspect.o: $(UTILS_SRC)/colors.h
-antinspect.o: $(UTILS_SRC)/erase.h
-antinspect.o: $(UTILS_SRC)/font-retry.h
-antinspect.o: $(UTILS_SRC)/grabscreen.h
-antinspect.o: $(UTILS_SRC)/hsv.h
-antinspect.o: $(UTILS_SRC)/resources.h
-antinspect.o: $(UTILS_SRC)/usleep.h
-antinspect.o: $(UTILS_SRC)/visual.h
-antinspect.o: $(UTILS_SRC)/xft.h
-antinspect.o: $(UTILS_SRC)/yarandom.h
-antinspect.o: $(HACK_SRC)/xlockmoreI.h
-antinspect.o: $(HACK_SRC)/xlockmore.h
-antmaze.o: $(srcdir)/ants.h
-antmaze.o: ../../config.h
-antmaze.o: $(HACK_SRC)/fps.h
-antmaze.o: $(srcdir)/gltrackball.h
-antmaze.o: $(HACK_SRC)/recanim.h
-antmaze.o: $(srcdir)/rotator.h
-antmaze.o: $(HACK_SRC)/screenhackI.h
-antmaze.o: $(srcdir)/sphere.h
-antmaze.o: $(srcdir)/tube.h
-antmaze.o: $(UTILS_SRC)/colors.h
-antmaze.o: $(UTILS_SRC)/erase.h
-antmaze.o: $(UTILS_SRC)/font-retry.h
-antmaze.o: $(UTILS_SRC)/grabscreen.h
-antmaze.o: $(UTILS_SRC)/hsv.h
-antmaze.o: $(UTILS_SRC)/resources.h
-antmaze.o: $(UTILS_SRC)/usleep.h
-antmaze.o: $(UTILS_SRC)/visual.h
-antmaze.o: $(UTILS_SRC)/xft.h
-antmaze.o: $(UTILS_SRC)/yarandom.h
-antmaze.o: $(HACK_SRC)/xlockmoreI.h
-antmaze.o: $(HACK_SRC)/xlockmore.h
-antspotlight.o: $(srcdir)/ants.h
-antspotlight.o: ../../config.h
-antspotlight.o: $(HACK_SRC)/fps.h
-antspotlight.o: $(srcdir)/gltrackball.h
-antspotlight.o: $(srcdir)/grab-ximage.h
-antspotlight.o: $(HACK_SRC)/recanim.h
-antspotlight.o: $(srcdir)/rotator.h
-antspotlight.o: $(HACK_SRC)/screenhackI.h
-antspotlight.o: $(srcdir)/sphere.h
-antspotlight.o: $(srcdir)/tube.h
-antspotlight.o: $(UTILS_SRC)/colors.h
-antspotlight.o: $(UTILS_SRC)/erase.h
-antspotlight.o: $(UTILS_SRC)/font-retry.h
-antspotlight.o: $(UTILS_SRC)/grabscreen.h
-antspotlight.o: $(UTILS_SRC)/hsv.h
-antspotlight.o: $(UTILS_SRC)/resources.h
-antspotlight.o: $(UTILS_SRC)/usleep.h
-antspotlight.o: $(UTILS_SRC)/visual.h
-antspotlight.o: $(UTILS_SRC)/xft.h
-antspotlight.o: $(UTILS_SRC)/yarandom.h
-antspotlight.o: $(HACK_SRC)/xlockmoreI.h
-antspotlight.o: $(HACK_SRC)/xlockmore.h
-atlantis.o: $(srcdir)/atlantis.h
-atlantis.o: ../../config.h
-atlantis.o: $(HACK_SRC)/fps.h
-atlantis.o: ../images/gen/sea-texture_png.h
-atlantis.o: $(HACK_SRC)/recanim.h
-atlantis.o: $(HACK_SRC)/screenhackI.h
-atlantis.o: $(UTILS_SRC)/colors.h
-atlantis.o: $(UTILS_SRC)/erase.h
-atlantis.o: $(UTILS_SRC)/font-retry.h
-atlantis.o: $(UTILS_SRC)/grabscreen.h
-atlantis.o: $(UTILS_SRC)/hsv.h
-atlantis.o: $(UTILS_SRC)/resources.h
-atlantis.o: $(UTILS_SRC)/usleep.h
-atlantis.o: $(UTILS_SRC)/visual.h
-atlantis.o: $(UTILS_SRC)/xft.h
-atlantis.o: $(UTILS_SRC)/yarandom.h
-atlantis.o: $(HACK_SRC)/ximage-loader.h
-atlantis.o: $(HACK_SRC)/xlockmoreI.h
-atlantis.o: $(HACK_SRC)/xlockmore.h
-atunnel.o: ../../config.h
-atunnel.o: $(HACK_SRC)/fps.h
-atunnel.o: ../images/gen/tunnel0_png.h
-atunnel.o: ../images/gen/tunnel1_png.h
-atunnel.o: ../images/gen/tunnel2_png.h
-atunnel.o: ../images/gen/tunnel3_png.h
-atunnel.o: ../images/gen/tunnel4_png.h
-atunnel.o: ../images/gen/tunnel5_png.h
-atunnel.o: $(HACK_SRC)/recanim.h
-atunnel.o: $(HACK_SRC)/screenhackI.h
-atunnel.o: $(srcdir)/tunnel_draw.h
-atunnel.o: $(UTILS_SRC)/colors.h
-atunnel.o: $(UTILS_SRC)/erase.h
-atunnel.o: $(UTILS_SRC)/font-retry.h
-atunnel.o: $(UTILS_SRC)/grabscreen.h
-atunnel.o: $(UTILS_SRC)/hsv.h
-atunnel.o: $(UTILS_SRC)/resources.h
-atunnel.o: $(UTILS_SRC)/usleep.h
-atunnel.o: $(UTILS_SRC)/visual.h
-atunnel.o: $(UTILS_SRC)/xft.h
-atunnel.o: $(UTILS_SRC)/yarandom.h
-atunnel.o: $(HACK_SRC)/ximage-loader.h
-atunnel.o: $(HACK_SRC)/xlockmoreI.h
-atunnel.o: $(HACK_SRC)/xlockmore.h
-b_draw.o: $(srcdir)/bubble3d.h
-b_draw.o: ../../config.h
-b_draw.o: $(HACK_SRC)/fps.h
-b_draw.o: $(HACK_SRC)/recanim.h
-b_draw.o: $(HACK_SRC)/screenhackI.h
-b_draw.o: $(UTILS_SRC)/colors.h
-b_draw.o: $(UTILS_SRC)/font-retry.h
-b_draw.o: $(UTILS_SRC)/grabscreen.h
-b_draw.o: $(UTILS_SRC)/hsv.h
-b_draw.o: $(UTILS_SRC)/resources.h
-b_draw.o: $(UTILS_SRC)/usleep.h
-b_draw.o: $(UTILS_SRC)/visual.h
-b_draw.o: $(UTILS_SRC)/xft.h
-b_draw.o: $(UTILS_SRC)/yarandom.h
-beats.o: ../../config.h
-beats.o: $(HACK_SRC)/fps.h
-beats.o: $(HACK_SRC)/recanim.h
-beats.o: $(HACK_SRC)/screenhackI.h
-beats.o: $(srcdir)/sphere.h
-beats.o: $(UTILS_SRC)/colors.h
-beats.o: $(UTILS_SRC)/erase.h
-beats.o: $(UTILS_SRC)/font-retry.h
-beats.o: $(UTILS_SRC)/grabscreen.h
-beats.o: $(UTILS_SRC)/hsv.h
-beats.o: $(UTILS_SRC)/resources.h
-beats.o: $(UTILS_SRC)/usleep.h
-beats.o: $(UTILS_SRC)/visual.h
-beats.o: $(UTILS_SRC)/xft.h
-beats.o: $(UTILS_SRC)/yarandom.h
-beats.o: $(HACK_SRC)/xlockmoreI.h
-beats.o: $(HACK_SRC)/xlockmore.h
-blinkbox.o: ../../config.h
-blinkbox.o: $(HACK_SRC)/fps.h
-blinkbox.o: $(HACK_SRC)/recanim.h
-blinkbox.o: $(HACK_SRC)/screenhackI.h
-blinkbox.o: $(srcdir)/sphere.h
-blinkbox.o: $(UTILS_SRC)/colors.h
-blinkbox.o: $(UTILS_SRC)/erase.h
-blinkbox.o: $(UTILS_SRC)/font-retry.h
-blinkbox.o: $(UTILS_SRC)/grabscreen.h
-blinkbox.o: $(UTILS_SRC)/hsv.h
-blinkbox.o: $(UTILS_SRC)/resources.h
-blinkbox.o: $(UTILS_SRC)/usleep.h
-blinkbox.o: $(UTILS_SRC)/visual.h
-blinkbox.o: $(UTILS_SRC)/xft.h
-blinkbox.o: $(UTILS_SRC)/yarandom.h
-blinkbox.o: $(HACK_SRC)/xlockmoreI.h
-blinkbox.o: $(HACK_SRC)/xlockmore.h
-b_lockglue.o: $(srcdir)/bubble3d.h
-b_lockglue.o: ../../config.h
-b_lockglue.o: $(HACK_SRC)/fps.h
-b_lockglue.o: $(HACK_SRC)/recanim.h
-b_lockglue.o: $(HACK_SRC)/screenhackI.h
-b_lockglue.o: $(UTILS_SRC)/colors.h
-b_lockglue.o: $(UTILS_SRC)/erase.h
-b_lockglue.o: $(UTILS_SRC)/font-retry.h
-b_lockglue.o: $(UTILS_SRC)/grabscreen.h
-b_lockglue.o: $(UTILS_SRC)/hsv.h
-b_lockglue.o: $(UTILS_SRC)/resources.h
-b_lockglue.o: $(UTILS_SRC)/usleep.h
-b_lockglue.o: $(UTILS_SRC)/visual.h
-b_lockglue.o: $(UTILS_SRC)/xft.h
-b_lockglue.o: $(UTILS_SRC)/yarandom.h
-b_lockglue.o: $(HACK_SRC)/xlockmoreI.h
-b_lockglue.o: $(HACK_SRC)/xlockmore.h
-blocktube.o: ../../config.h
-blocktube.o: $(HACK_SRC)/fps.h
-blocktube.o: ../images/gen/blocktube_png.h
-blocktube.o: $(HACK_SRC)/recanim.h
-blocktube.o: $(HACK_SRC)/screenhackI.h
-blocktube.o: $(UTILS_SRC)/colors.h
-blocktube.o: $(UTILS_SRC)/erase.h
-blocktube.o: $(UTILS_SRC)/font-retry.h
-blocktube.o: $(UTILS_SRC)/grabscreen.h
-blocktube.o: $(UTILS_SRC)/hsv.h
-blocktube.o: $(UTILS_SRC)/resources.h
-blocktube.o: $(UTILS_SRC)/usleep.h
-blocktube.o: $(UTILS_SRC)/visual.h
-blocktube.o: $(UTILS_SRC)/xft.h
-blocktube.o: $(UTILS_SRC)/yarandom.h
-blocktube.o: $(HACK_SRC)/ximage-loader.h
-blocktube.o: $(HACK_SRC)/xlockmoreI.h
-blocktube.o: $(HACK_SRC)/xlockmore.h
-boing.o: ../../config.h
-boing.o: $(HACK_SRC)/fps.h
-boing.o: $(srcdir)/gltrackball.h
-boing.o: $(HACK_SRC)/recanim.h
-boing.o: $(HACK_SRC)/screenhackI.h
-boing.o: $(UTILS_SRC)/colors.h
-boing.o: $(UTILS_SRC)/erase.h
-boing.o: $(UTILS_SRC)/font-retry.h
-boing.o: $(UTILS_SRC)/grabscreen.h
-boing.o: $(UTILS_SRC)/hsv.h
-boing.o: $(UTILS_SRC)/resources.h
-boing.o: $(UTILS_SRC)/usleep.h
-boing.o: $(UTILS_SRC)/visual.h
-boing.o: $(UTILS_SRC)/xft.h
-boing.o: $(UTILS_SRC)/yarandom.h
-boing.o: $(HACK_SRC)/xlockmoreI.h
-boing.o: $(HACK_SRC)/xlockmore.h
-bouncingcow.o: ../../config.h
-bouncingcow.o: $(HACK_SRC)/fps.h
-bouncingcow.o: $(srcdir)/gllist.h
-bouncingcow.o: $(srcdir)/gltrackball.h
-bouncingcow.o: $(HACK_SRC)/recanim.h
-bouncingcow.o: $(srcdir)/rotator.h
-bouncingcow.o: $(HACK_SRC)/screenhackI.h
-bouncingcow.o: $(UTILS_SRC)/colors.h
-bouncingcow.o: $(UTILS_SRC)/erase.h
-bouncingcow.o: $(UTILS_SRC)/font-retry.h
-bouncingcow.o: $(UTILS_SRC)/grabscreen.h
-bouncingcow.o: $(UTILS_SRC)/hsv.h
-bouncingcow.o: $(UTILS_SRC)/resources.h
-bouncingcow.o: $(UTILS_SRC)/usleep.h
-bouncingcow.o: $(UTILS_SRC)/visual.h
-bouncingcow.o: $(UTILS_SRC)/xft.h
-bouncingcow.o: $(UTILS_SRC)/yarandom.h
-bouncingcow.o: $(HACK_SRC)/ximage-loader.h
-bouncingcow.o: $(HACK_SRC)/xlockmoreI.h
-bouncingcow.o: $(HACK_SRC)/xlockmore.h
-boxed.o: $(srcdir)/boxed.h
-boxed.o: ../../config.h
-boxed.o: $(HACK_SRC)/fps.h
-boxed.o: $(HACK_SRC)/recanim.h
-boxed.o: $(HACK_SRC)/screenhackI.h
-boxed.o: $(UTILS_SRC)/colors.h
-boxed.o: $(UTILS_SRC)/erase.h
-boxed.o: $(UTILS_SRC)/font-retry.h
-boxed.o: $(UTILS_SRC)/grabscreen.h
-boxed.o: $(UTILS_SRC)/hsv.h
-boxed.o: $(UTILS_SRC)/resources.h
-boxed.o: $(UTILS_SRC)/usleep.h
-boxed.o: $(UTILS_SRC)/visual.h
-boxed.o: $(UTILS_SRC)/xft.h
-boxed.o: $(UTILS_SRC)/yarandom.h
-boxed.o: $(HACK_SRC)/xlockmoreI.h
-boxed.o: $(HACK_SRC)/xlockmore.h
-b_sphere.o: $(srcdir)/bubble3d.h
-b_sphere.o: ../../config.h
-b_sphere.o: $(HACK_SRC)/fps.h
-b_sphere.o: $(HACK_SRC)/recanim.h
-b_sphere.o: $(HACK_SRC)/screenhackI.h
-b_sphere.o: $(UTILS_SRC)/colors.h
-b_sphere.o: $(UTILS_SRC)/font-retry.h
-b_sphere.o: $(UTILS_SRC)/grabscreen.h
-b_sphere.o: $(UTILS_SRC)/hsv.h
-b_sphere.o: $(UTILS_SRC)/resources.h
-b_sphere.o: $(UTILS_SRC)/usleep.h
-b_sphere.o: $(UTILS_SRC)/visual.h
-b_sphere.o: $(UTILS_SRC)/xft.h
-b_sphere.o: $(UTILS_SRC)/yarandom.h
-bubble3d.o: $(srcdir)/bubble3d.h
-bubble3d.o: ../../config.h
-bubble3d.o: $(HACK_SRC)/fps.h
-bubble3d.o: $(HACK_SRC)/recanim.h
-bubble3d.o: $(HACK_SRC)/screenhackI.h
-bubble3d.o: $(UTILS_SRC)/colors.h
-bubble3d.o: $(UTILS_SRC)/font-retry.h
-bubble3d.o: $(UTILS_SRC)/grabscreen.h
-bubble3d.o: $(UTILS_SRC)/hsv.h
-bubble3d.o: $(UTILS_SRC)/resources.h
-bubble3d.o: $(UTILS_SRC)/usleep.h
-bubble3d.o: $(UTILS_SRC)/visual.h
-bubble3d.o: $(UTILS_SRC)/xft.h
-bubble3d.o: $(UTILS_SRC)/yarandom.h
-buildlwo.o: $(srcdir)/buildlwo.h
-buildlwo.o: ../../config.h
-buildlwo.o: $(HACK_SRC)/fps.h
-buildlwo.o: $(HACK_SRC)/recanim.h
-buildlwo.o: $(HACK_SRC)/screenhackI.h
-buildlwo.o: $(UTILS_SRC)/colors.h
-buildlwo.o: $(UTILS_SRC)/font-retry.h
-buildlwo.o: $(UTILS_SRC)/grabscreen.h
-buildlwo.o: $(UTILS_SRC)/hsv.h
-buildlwo.o: $(UTILS_SRC)/resources.h
-buildlwo.o: $(UTILS_SRC)/usleep.h
-buildlwo.o: $(UTILS_SRC)/visual.h
-buildlwo.o: $(UTILS_SRC)/xft.h
-buildlwo.o: $(UTILS_SRC)/yarandom.h
-cage.o: ../../config.h
-cage.o: $(HACK_SRC)/fps.h
-cage.o: ../images/gen/wood_png.h
-cage.o: $(HACK_SRC)/recanim.h
-cage.o: $(HACK_SRC)/screenhackI.h
-cage.o: $(UTILS_SRC)/colors.h
-cage.o: $(UTILS_SRC)/erase.h
-cage.o: $(UTILS_SRC)/font-retry.h
-cage.o: $(UTILS_SRC)/grabscreen.h
-cage.o: $(UTILS_SRC)/hsv.h
-cage.o: $(UTILS_SRC)/resources.h
-cage.o: $(UTILS_SRC)/usleep.h
-cage.o: $(UTILS_SRC)/visual.h
-cage.o: $(UTILS_SRC)/xft.h
-cage.o: $(UTILS_SRC)/yarandom.h
-cage.o: $(HACK_SRC)/ximage-loader.h
-cage.o: $(HACK_SRC)/xlockmoreI.h
-cage.o: $(HACK_SRC)/xlockmore.h
-carousel.o: ../../config.h
-carousel.o: $(HACK_SRC)/fps.h
-carousel.o: $(srcdir)/gltrackball.h
-carousel.o: $(srcdir)/grab-ximage.h
-carousel.o: $(HACK_SRC)/recanim.h
-carousel.o: $(srcdir)/rotator.h
-carousel.o: $(HACK_SRC)/screenhackI.h
-carousel.o: $(srcdir)/texfont.h
-carousel.o: $(UTILS_SRC)/colors.h
-carousel.o: $(UTILS_SRC)/erase.h
-carousel.o: $(UTILS_SRC)/font-retry.h
-carousel.o: $(UTILS_SRC)/grabscreen.h
-carousel.o: $(UTILS_SRC)/hsv.h
-carousel.o: $(UTILS_SRC)/resources.h
-carousel.o: $(UTILS_SRC)/usleep.h
-carousel.o: $(UTILS_SRC)/visual.h
-carousel.o: $(UTILS_SRC)/xft.h
-carousel.o: $(UTILS_SRC)/yarandom.h
-carousel.o: $(HACK_SRC)/xlockmoreI.h
-carousel.o: $(HACK_SRC)/xlockmore.h
-chessmodels.o: $(srcdir)/chessmodels.h
-chessmodels.o: ../../config.h
-chessmodels.o: $(HACK_SRC)/fps.h
-chessmodels.o: $(HACK_SRC)/recanim.h
-chessmodels.o: $(HACK_SRC)/screenhackI.h
-chessmodels.o: $(UTILS_SRC)/colors.h
-chessmodels.o: $(UTILS_SRC)/font-retry.h
-chessmodels.o: $(UTILS_SRC)/grabscreen.h
-chessmodels.o: $(UTILS_SRC)/hsv.h
-chessmodels.o: $(UTILS_SRC)/resources.h
-chessmodels.o: $(UTILS_SRC)/usleep.h
-chessmodels.o: $(UTILS_SRC)/visual.h
-chessmodels.o: $(UTILS_SRC)/xft.h
-chessmodels.o: $(UTILS_SRC)/yarandom.h
-circuit.o: ../../config.h
-circuit.o: $(HACK_SRC)/fps.h
-circuit.o: $(HACK_SRC)/recanim.h
-circuit.o: $(HACK_SRC)/screenhackI.h
-circuit.o: $(srcdir)/texfont.h
-circuit.o: $(UTILS_SRC)/colors.h
-circuit.o: $(UTILS_SRC)/erase.h
-circuit.o: $(UTILS_SRC)/font-retry.h
-circuit.o: $(UTILS_SRC)/grabscreen.h
-circuit.o: $(UTILS_SRC)/hsv.h
-circuit.o: $(UTILS_SRC)/resources.h
-circuit.o: $(UTILS_SRC)/usleep.h
-circuit.o: $(UTILS_SRC)/visual.h
-circuit.o: $(UTILS_SRC)/xft.h
-circuit.o: $(UTILS_SRC)/yarandom.h
-circuit.o: $(HACK_SRC)/xlockmoreI.h
-circuit.o: $(HACK_SRC)/xlockmore.h
-cityflow.o: ../../config.h
-cityflow.o: $(HACK_SRC)/fps.h
-cityflow.o: $(srcdir)/gltrackball.h
-cityflow.o: $(HACK_SRC)/recanim.h
-cityflow.o: $(HACK_SRC)/screenhackI.h
-cityflow.o: $(UTILS_SRC)/colors.h
-cityflow.o: $(UTILS_SRC)/erase.h
-cityflow.o: $(UTILS_SRC)/font-retry.h
-cityflow.o: $(UTILS_SRC)/grabscreen.h
-cityflow.o: $(UTILS_SRC)/hsv.h
-cityflow.o: $(UTILS_SRC)/resources.h
-cityflow.o: $(UTILS_SRC)/usleep.h
-cityflow.o: $(UTILS_SRC)/visual.h
-cityflow.o: $(UTILS_SRC)/xft.h
-cityflow.o: $(UTILS_SRC)/yarandom.h
-cityflow.o: $(HACK_SRC)/xlockmoreI.h
-cityflow.o: $(HACK_SRC)/xlockmore.h
-co____9.o: ../../config.h
-co____9.o: $(HACK_SRC)/fps.h
-co____9.o: $(srcdir)/gltrackball.h
-co____9.o: $(HACK_SRC)/recanim.h
-co____9.o: $(srcdir)/rotator.h
-co____9.o: $(HACK_SRC)/screenhackI.h
-co____9.o: $(srcdir)/sphere.h
-co____9.o: $(srcdir)/tube.h
-co____9.o: $(UTILS_SRC)/colors.h
-co____9.o: $(UTILS_SRC)/erase.h
-co____9.o: $(UTILS_SRC)/font-retry.h
-co____9.o: $(UTILS_SRC)/grabscreen.h
-co____9.o: $(UTILS_SRC)/hsv.h
-co____9.o: $(UTILS_SRC)/resources.h
-co____9.o: $(UTILS_SRC)/usleep.h
-co____9.o: $(UTILS_SRC)/visual.h
-co____9.o: $(UTILS_SRC)/xft.h
-co____9.o: $(UTILS_SRC)/yarandom.h
-co____9.o: $(HACK_SRC)/xlockmoreI.h
-co____9.o: $(HACK_SRC)/xlockmore.h
-companion_disc.o: ../../config.h
-companion_disc.o: $(HACK_SRC)/fps.h
-companion_disc.o: $(srcdir)/gllist.h
-companion_disc.o: $(HACK_SRC)/recanim.h
-companion_disc.o: $(HACK_SRC)/screenhackI.h
-companion_disc.o: $(UTILS_SRC)/colors.h
-companion_disc.o: $(UTILS_SRC)/erase.h
-companion_disc.o: $(UTILS_SRC)/font-retry.h
-companion_disc.o: $(UTILS_SRC)/grabscreen.h
-companion_disc.o: $(UTILS_SRC)/hsv.h
-companion_disc.o: $(UTILS_SRC)/resources.h
-companion_disc.o: $(UTILS_SRC)/usleep.h
-companion_disc.o: $(UTILS_SRC)/visual.h
-companion_disc.o: $(UTILS_SRC)/xft.h
-companion_disc.o: $(UTILS_SRC)/yarandom.h
-companion_disc.o: $(HACK_SRC)/xlockmoreI.h
-companion_heart.o: ../../config.h
-companion_heart.o: $(HACK_SRC)/fps.h
-companion_heart.o: $(srcdir)/gllist.h
-companion_heart.o: $(HACK_SRC)/recanim.h
-companion_heart.o: $(HACK_SRC)/screenhackI.h
-companion_heart.o: $(UTILS_SRC)/colors.h
-companion_heart.o: $(UTILS_SRC)/erase.h
-companion_heart.o: $(UTILS_SRC)/font-retry.h
-companion_heart.o: $(UTILS_SRC)/grabscreen.h
-companion_heart.o: $(UTILS_SRC)/hsv.h
-companion_heart.o: $(UTILS_SRC)/resources.h
-companion_heart.o: $(UTILS_SRC)/usleep.h
-companion_heart.o: $(UTILS_SRC)/visual.h
-companion_heart.o: $(UTILS_SRC)/xft.h
-companion_heart.o: $(UTILS_SRC)/yarandom.h
-companion_heart.o: $(HACK_SRC)/xlockmoreI.h
-companion.o: ../../config.h
-companion.o: $(HACK_SRC)/fps.h
-companion.o: $(srcdir)/gllist.h
-companion.o: $(srcdir)/gltrackball.h
-companion.o: $(HACK_SRC)/recanim.h
-companion.o: $(srcdir)/rotator.h
-companion.o: $(HACK_SRC)/screenhackI.h
-companion.o: $(UTILS_SRC)/colors.h
-companion.o: $(UTILS_SRC)/erase.h
-companion.o: $(UTILS_SRC)/font-retry.h
-companion.o: $(UTILS_SRC)/grabscreen.h
-companion.o: $(UTILS_SRC)/hsv.h
-companion.o: $(UTILS_SRC)/resources.h
-companion.o: $(UTILS_SRC)/usleep.h
-companion.o: $(UTILS_SRC)/visual.h
-companion.o: $(UTILS_SRC)/xft.h
-companion.o: $(UTILS_SRC)/yarandom.h
-companion.o: $(HACK_SRC)/ximage-loader.h
-companion.o: $(HACK_SRC)/xlockmoreI.h
-companion.o: $(HACK_SRC)/xlockmore.h
-companion_quad.o: ../../config.h
-companion_quad.o: $(HACK_SRC)/fps.h
-companion_quad.o: $(srcdir)/gllist.h
-companion_quad.o: $(HACK_SRC)/recanim.h
-companion_quad.o: $(HACK_SRC)/screenhackI.h
-companion_quad.o: $(UTILS_SRC)/colors.h
-companion_quad.o: $(UTILS_SRC)/erase.h
-companion_quad.o: $(UTILS_SRC)/font-retry.h
-companion_quad.o: $(UTILS_SRC)/grabscreen.h
-companion_quad.o: $(UTILS_SRC)/hsv.h
-companion_quad.o: $(UTILS_SRC)/resources.h
-companion_quad.o: $(UTILS_SRC)/usleep.h
-companion_quad.o: $(UTILS_SRC)/visual.h
-companion_quad.o: $(UTILS_SRC)/xft.h
-companion_quad.o: $(UTILS_SRC)/yarandom.h
-companion_quad.o: $(HACK_SRC)/xlockmoreI.h
-covid19.o: ../../config.h
-covid19.o: $(HACK_SRC)/fps.h
-covid19.o: $(srcdir)/gltrackball.h
-covid19.o: $(HACK_SRC)/recanim.h
-covid19.o: $(srcdir)/rotator.h
-covid19.o: $(HACK_SRC)/screenhackI.h
-covid19.o: $(srcdir)/sphere.h
-covid19.o: $(srcdir)/tube.h
-covid19.o: $(UTILS_SRC)/colors.h
-covid19.o: $(UTILS_SRC)/erase.h
-covid19.o: $(UTILS_SRC)/font-retry.h
-covid19.o: $(UTILS_SRC)/grabscreen.h
-covid19.o: $(UTILS_SRC)/hsv.h
-covid19.o: $(UTILS_SRC)/resources.h
-covid19.o: $(UTILS_SRC)/usleep.h
-covid19.o: $(UTILS_SRC)/visual.h
-covid19.o: $(UTILS_SRC)/xft.h
-covid19.o: $(UTILS_SRC)/yarandom.h
-covid19.o: $(HACK_SRC)/xlockmoreI.h
-covid19.o: $(HACK_SRC)/xlockmore.h
-cow_face.o: ../../config.h
-cow_face.o: $(HACK_SRC)/fps.h
-cow_face.o: $(srcdir)/gllist.h
-cow_face.o: $(HACK_SRC)/recanim.h
-cow_face.o: $(HACK_SRC)/screenhackI.h
-cow_face.o: $(UTILS_SRC)/colors.h
-cow_face.o: $(UTILS_SRC)/erase.h
-cow_face.o: $(UTILS_SRC)/font-retry.h
-cow_face.o: $(UTILS_SRC)/grabscreen.h
-cow_face.o: $(UTILS_SRC)/hsv.h
-cow_face.o: $(UTILS_SRC)/resources.h
-cow_face.o: $(UTILS_SRC)/usleep.h
-cow_face.o: $(UTILS_SRC)/visual.h
-cow_face.o: $(UTILS_SRC)/xft.h
-cow_face.o: $(UTILS_SRC)/yarandom.h
-cow_face.o: $(HACK_SRC)/xlockmoreI.h
-cow_hide.o: ../../config.h
-cow_hide.o: $(HACK_SRC)/fps.h
-cow_hide.o: $(srcdir)/gllist.h
-cow_hide.o: $(HACK_SRC)/recanim.h
-cow_hide.o: $(HACK_SRC)/screenhackI.h
-cow_hide.o: $(UTILS_SRC)/colors.h
-cow_hide.o: $(UTILS_SRC)/erase.h
-cow_hide.o: $(UTILS_SRC)/font-retry.h
-cow_hide.o: $(UTILS_SRC)/grabscreen.h
-cow_hide.o: $(UTILS_SRC)/hsv.h
-cow_hide.o: $(UTILS_SRC)/resources.h
-cow_hide.o: $(UTILS_SRC)/usleep.h
-cow_hide.o: $(UTILS_SRC)/visual.h
-cow_hide.o: $(UTILS_SRC)/xft.h
-cow_hide.o: $(UTILS_SRC)/yarandom.h
-cow_hide.o: $(HACK_SRC)/xlockmoreI.h
-cow_hoofs.o: ../../config.h
-cow_hoofs.o: $(HACK_SRC)/fps.h
-cow_hoofs.o: $(srcdir)/gllist.h
-cow_hoofs.o: $(HACK_SRC)/recanim.h
-cow_hoofs.o: $(HACK_SRC)/screenhackI.h
-cow_hoofs.o: $(UTILS_SRC)/colors.h
-cow_hoofs.o: $(UTILS_SRC)/erase.h
-cow_hoofs.o: $(UTILS_SRC)/font-retry.h
-cow_hoofs.o: $(UTILS_SRC)/grabscreen.h
-cow_hoofs.o: $(UTILS_SRC)/hsv.h
-cow_hoofs.o: $(UTILS_SRC)/resources.h
-cow_hoofs.o: $(UTILS_SRC)/usleep.h
-cow_hoofs.o: $(UTILS_SRC)/visual.h
-cow_hoofs.o: $(UTILS_SRC)/xft.h
-cow_hoofs.o: $(UTILS_SRC)/yarandom.h
-cow_hoofs.o: $(HACK_SRC)/xlockmoreI.h
-cow_horns.o: ../../config.h
-cow_horns.o: $(HACK_SRC)/fps.h
-cow_horns.o: $(srcdir)/gllist.h
-cow_horns.o: $(HACK_SRC)/recanim.h
-cow_horns.o: $(HACK_SRC)/screenhackI.h
-cow_horns.o: $(UTILS_SRC)/colors.h
-cow_horns.o: $(UTILS_SRC)/erase.h
-cow_horns.o: $(UTILS_SRC)/font-retry.h
-cow_horns.o: $(UTILS_SRC)/grabscreen.h
-cow_horns.o: $(UTILS_SRC)/hsv.h
-cow_horns.o: $(UTILS_SRC)/resources.h
-cow_horns.o: $(UTILS_SRC)/usleep.h
-cow_horns.o: $(UTILS_SRC)/visual.h
-cow_horns.o: $(UTILS_SRC)/xft.h
-cow_horns.o: $(UTILS_SRC)/yarandom.h
-cow_horns.o: $(HACK_SRC)/xlockmoreI.h
-cow_tail.o: ../../config.h
-cow_tail.o: $(HACK_SRC)/fps.h
-cow_tail.o: $(srcdir)/gllist.h
-cow_tail.o: $(HACK_SRC)/recanim.h
-cow_tail.o: $(HACK_SRC)/screenhackI.h
-cow_tail.o: $(UTILS_SRC)/colors.h
-cow_tail.o: $(UTILS_SRC)/erase.h
-cow_tail.o: $(UTILS_SRC)/font-retry.h
-cow_tail.o: $(UTILS_SRC)/grabscreen.h
-cow_tail.o: $(UTILS_SRC)/hsv.h
-cow_tail.o: $(UTILS_SRC)/resources.h
-cow_tail.o: $(UTILS_SRC)/usleep.h
-cow_tail.o: $(UTILS_SRC)/visual.h
-cow_tail.o: $(UTILS_SRC)/xft.h
-cow_tail.o: $(UTILS_SRC)/yarandom.h
-cow_tail.o: $(HACK_SRC)/xlockmoreI.h
-cow_udder.o: ../../config.h
-cow_udder.o: $(HACK_SRC)/fps.h
-cow_udder.o: $(srcdir)/gllist.h
-cow_udder.o: $(HACK_SRC)/recanim.h
-cow_udder.o: $(HACK_SRC)/screenhackI.h
-cow_udder.o: $(UTILS_SRC)/colors.h
-cow_udder.o: $(UTILS_SRC)/erase.h
-cow_udder.o: $(UTILS_SRC)/font-retry.h
-cow_udder.o: $(UTILS_SRC)/grabscreen.h
-cow_udder.o: $(UTILS_SRC)/hsv.h
-cow_udder.o: $(UTILS_SRC)/resources.h
-cow_udder.o: $(UTILS_SRC)/usleep.h
-cow_udder.o: $(UTILS_SRC)/visual.h
-cow_udder.o: $(UTILS_SRC)/xft.h
-cow_udder.o: $(UTILS_SRC)/yarandom.h
-cow_udder.o: $(HACK_SRC)/xlockmoreI.h
-crackberg.o: ../../config.h
-crackberg.o: $(HACK_SRC)/fps.h
-crackberg.o: $(HACK_SRC)/recanim.h
-crackberg.o: $(HACK_SRC)/screenhackI.h
-crackberg.o: $(UTILS_SRC)/colors.h
-crackberg.o: $(UTILS_SRC)/erase.h
-crackberg.o: $(UTILS_SRC)/font-retry.h
-crackberg.o: $(UTILS_SRC)/grabscreen.h
-crackberg.o: $(UTILS_SRC)/hsv.h
-crackberg.o: $(UTILS_SRC)/resources.h
-crackberg.o: $(UTILS_SRC)/usleep.h
-crackberg.o: $(UTILS_SRC)/visual.h
-crackberg.o: $(UTILS_SRC)/xft.h
-crackberg.o: $(UTILS_SRC)/yarandom.h
-crackberg.o: $(HACK_SRC)/xlockmoreI.h
-crackberg.o: $(HACK_SRC)/xlockmore.h
-crumbler.o: ../../config.h
-crumbler.o: $(HACK_SRC)/fps.h
-crumbler.o: $(srcdir)/gltrackball.h
-crumbler.o: $(srcdir)/quickhull.h
-crumbler.o: $(HACK_SRC)/recanim.h
-crumbler.o: $(srcdir)/rotator.h
-crumbler.o: $(HACK_SRC)/screenhackI.h
-crumbler.o: $(UTILS_SRC)/colors.h
-crumbler.o: $(UTILS_SRC)/erase.h
-crumbler.o: $(UTILS_SRC)/font-retry.h
-crumbler.o: $(UTILS_SRC)/grabscreen.h
-crumbler.o: $(UTILS_SRC)/hsv.h
-crumbler.o: $(UTILS_SRC)/resources.h
-crumbler.o: $(UTILS_SRC)/usleep.h
-crumbler.o: $(UTILS_SRC)/visual.h
-crumbler.o: $(UTILS_SRC)/xft.h
-crumbler.o: $(UTILS_SRC)/yarandom.h
-crumbler.o: $(HACK_SRC)/xlockmoreI.h
-crumbler.o: $(HACK_SRC)/xlockmore.h
-cube21.o: ../../config.h
-cube21.o: $(HACK_SRC)/fps.h
-cube21.o: $(srcdir)/gltrackball.h
-cube21.o: $(HACK_SRC)/recanim.h
-cube21.o: $(HACK_SRC)/screenhackI.h
-cube21.o: $(UTILS_SRC)/colors.h
-cube21.o: $(UTILS_SRC)/erase.h
-cube21.o: $(UTILS_SRC)/font-retry.h
-cube21.o: $(UTILS_SRC)/grabscreen.h
-cube21.o: $(UTILS_SRC)/hsv.h
-cube21.o: $(UTILS_SRC)/resources.h
-cube21.o: $(UTILS_SRC)/usleep.h
-cube21.o: $(UTILS_SRC)/visual.h
-cube21.o: $(UTILS_SRC)/xft.h
-cube21.o: $(UTILS_SRC)/yarandom.h
-cube21.o: $(HACK_SRC)/xlockmoreI.h
-cube21.o: $(HACK_SRC)/xlockmore.h
-cubenetic.o: ../../config.h
-cubenetic.o: $(HACK_SRC)/fps.h
-cubenetic.o: $(srcdir)/gltrackball.h
-cubenetic.o: $(HACK_SRC)/recanim.h
-cubenetic.o: $(srcdir)/rotator.h
-cubenetic.o: $(HACK_SRC)/screenhackI.h
-cubenetic.o: $(UTILS_SRC)/colors.h
-cubenetic.o: $(UTILS_SRC)/erase.h
-cubenetic.o: $(UTILS_SRC)/font-retry.h
-cubenetic.o: $(UTILS_SRC)/grabscreen.h
-cubenetic.o: $(UTILS_SRC)/hsv.h
-cubenetic.o: $(UTILS_SRC)/resources.h
-cubenetic.o: $(UTILS_SRC)/usleep.h
-cubenetic.o: $(UTILS_SRC)/visual.h
-cubenetic.o: $(UTILS_SRC)/xft.h
-cubenetic.o: $(UTILS_SRC)/yarandom.h
-cubenetic.o: $(HACK_SRC)/xlockmoreI.h
-cubenetic.o: $(HACK_SRC)/xlockmore.h
-cubestack.o: ../../config.h
-cubestack.o: $(HACK_SRC)/fps.h
-cubestack.o: $(srcdir)/gltrackball.h
-cubestack.o: $(HACK_SRC)/recanim.h
-cubestack.o: $(srcdir)/rotator.h
-cubestack.o: $(HACK_SRC)/screenhackI.h
-cubestack.o: $(UTILS_SRC)/colors.h
-cubestack.o: $(UTILS_SRC)/erase.h
-cubestack.o: $(UTILS_SRC)/font-retry.h
-cubestack.o: $(UTILS_SRC)/grabscreen.h
-cubestack.o: $(UTILS_SRC)/hsv.h
-cubestack.o: $(UTILS_SRC)/resources.h
-cubestack.o: $(UTILS_SRC)/usleep.h
-cubestack.o: $(UTILS_SRC)/visual.h
-cubestack.o: $(UTILS_SRC)/xft.h
-cubestack.o: $(UTILS_SRC)/yarandom.h
-cubestack.o: $(HACK_SRC)/xlockmoreI.h
-cubestack.o: $(HACK_SRC)/xlockmore.h
-cubestorm.o: ../../config.h
-cubestorm.o: $(HACK_SRC)/fps.h
-cubestorm.o: $(srcdir)/gltrackball.h
-cubestorm.o: $(HACK_SRC)/recanim.h
-cubestorm.o: $(srcdir)/rotator.h
-cubestorm.o: $(HACK_SRC)/screenhackI.h
-cubestorm.o: $(UTILS_SRC)/colors.h
-cubestorm.o: $(UTILS_SRC)/erase.h
-cubestorm.o: $(UTILS_SRC)/font-retry.h
-cubestorm.o: $(UTILS_SRC)/grabscreen.h
-cubestorm.o: $(UTILS_SRC)/hsv.h
-cubestorm.o: $(UTILS_SRC)/resources.h
-cubestorm.o: $(UTILS_SRC)/usleep.h
-cubestorm.o: $(UTILS_SRC)/visual.h
-cubestorm.o: $(UTILS_SRC)/xft.h
-cubestorm.o: $(UTILS_SRC)/yarandom.h
-cubestorm.o: $(HACK_SRC)/xlockmoreI.h
-cubestorm.o: $(HACK_SRC)/xlockmore.h
-cubetwist.o: ../../config.h
-cubetwist.o: $(HACK_SRC)/fps.h
-cubetwist.o: $(srcdir)/gltrackball.h
-cubetwist.o: $(srcdir)/normals.h
-cubetwist.o: $(HACK_SRC)/recanim.h
-cubetwist.o: $(srcdir)/rotator.h
-cubetwist.o: $(HACK_SRC)/screenhackI.h
-cubetwist.o: $(UTILS_SRC)/colors.h
-cubetwist.o: $(UTILS_SRC)/erase.h
-cubetwist.o: $(UTILS_SRC)/font-retry.h
-cubetwist.o: $(UTILS_SRC)/grabscreen.h
-cubetwist.o: $(UTILS_SRC)/hsv.h
-cubetwist.o: $(UTILS_SRC)/resources.h
-cubetwist.o: $(UTILS_SRC)/usleep.h
-cubetwist.o: $(UTILS_SRC)/visual.h
-cubetwist.o: $(UTILS_SRC)/xft.h
-cubetwist.o: $(UTILS_SRC)/yarandom.h
-cubetwist.o: $(HACK_SRC)/xlockmoreI.h
-cubetwist.o: $(HACK_SRC)/xlockmore.h
-cubicgrid.o: ../../config.h
-cubicgrid.o: $(HACK_SRC)/fps.h
-cubicgrid.o: $(srcdir)/gltrackball.h
-cubicgrid.o: $(HACK_SRC)/recanim.h
-cubicgrid.o: $(srcdir)/rotator.h
-cubicgrid.o: $(HACK_SRC)/screenhackI.h
-cubicgrid.o: $(UTILS_SRC)/colors.h
-cubicgrid.o: $(UTILS_SRC)/erase.h
-cubicgrid.o: $(UTILS_SRC)/font-retry.h
-cubicgrid.o: $(UTILS_SRC)/grabscreen.h
-cubicgrid.o: $(UTILS_SRC)/hsv.h
-cubicgrid.o: $(UTILS_SRC)/resources.h
-cubicgrid.o: $(UTILS_SRC)/usleep.h
-cubicgrid.o: $(UTILS_SRC)/visual.h
-cubicgrid.o: $(UTILS_SRC)/xft.h
-cubicgrid.o: $(UTILS_SRC)/yarandom.h
-cubicgrid.o: $(HACK_SRC)/xlockmoreI.h
-cubicgrid.o: $(HACK_SRC)/xlockmore.h
-dangerball.o: ../../config.h
-dangerball.o: $(HACK_SRC)/fps.h
-dangerball.o: $(srcdir)/gltrackball.h
-dangerball.o: $(HACK_SRC)/recanim.h
-dangerball.o: $(srcdir)/rotator.h
-dangerball.o: $(HACK_SRC)/screenhackI.h
-dangerball.o: $(srcdir)/sphere.h
-dangerball.o: $(srcdir)/tube.h
-dangerball.o: $(UTILS_SRC)/colors.h
-dangerball.o: $(UTILS_SRC)/erase.h
-dangerball.o: $(UTILS_SRC)/font-retry.h
-dangerball.o: $(UTILS_SRC)/grabscreen.h
-dangerball.o: $(UTILS_SRC)/hsv.h
-dangerball.o: $(UTILS_SRC)/resources.h
-dangerball.o: $(UTILS_SRC)/usleep.h
-dangerball.o: $(UTILS_SRC)/visual.h
-dangerball.o: $(UTILS_SRC)/xft.h
-dangerball.o: $(UTILS_SRC)/yarandom.h
-dangerball.o: $(HACK_SRC)/xlockmoreI.h
-dangerball.o: $(HACK_SRC)/xlockmore.h
-deepstars.o: ../../config.h
-deepstars.o: $(HACK_SRC)/fps.h
-deepstars.o: $(srcdir)/gltrackball.h
-deepstars.o: $(HACK_SRC)/recanim.h
-deepstars.o: $(HACK_SRC)/screenhackI.h
-deepstars.o: $(srcdir)/sphere.h
-deepstars.o: $(UTILS_SRC)/colors.h
-deepstars.o: $(UTILS_SRC)/erase.h
-deepstars.o: $(UTILS_SRC)/font-retry.h
-deepstars.o: $(UTILS_SRC)/grabscreen.h
-deepstars.o: $(UTILS_SRC)/hsv.h
-deepstars.o: $(UTILS_SRC)/resources.h
-deepstars.o: $(UTILS_SRC)/usleep.h
-deepstars.o: $(UTILS_SRC)/visual.h
-deepstars.o: $(UTILS_SRC)/xft.h
-deepstars.o: $(UTILS_SRC)/yarandom.h
-deepstars.o: $(HACK_SRC)/xlockmoreI.h
-deepstars.o: $(HACK_SRC)/xlockmore.h
-discoball.o: ../../config.h
-discoball.o: $(HACK_SRC)/fps.h
-discoball.o: $(srcdir)/gltrackball.h
-discoball.o: $(srcdir)/normals.h
-discoball.o: $(HACK_SRC)/recanim.h
-discoball.o: $(srcdir)/rotator.h
-discoball.o: $(HACK_SRC)/screenhackI.h
-discoball.o: $(UTILS_SRC)/colors.h
-discoball.o: $(UTILS_SRC)/erase.h
-discoball.o: $(UTILS_SRC)/font-retry.h
-discoball.o: $(UTILS_SRC)/grabscreen.h
-discoball.o: $(UTILS_SRC)/hsv.h
-discoball.o: $(UTILS_SRC)/resources.h
-discoball.o: $(UTILS_SRC)/usleep.h
-discoball.o: $(UTILS_SRC)/visual.h
-discoball.o: $(UTILS_SRC)/xft.h
-discoball.o: $(UTILS_SRC)/yarandom.h
-discoball.o: $(HACK_SRC)/xlockmoreI.h
-discoball.o: $(HACK_SRC)/xlockmore.h
-dnalogo.o: ../../config.h
-dnalogo.o: $(HACK_SRC)/fps.h
-dnalogo.o: $(srcdir)/gltrackball.h
-dnalogo.o: $(srcdir)/normals.h
-dnalogo.o: $(HACK_SRC)/recanim.h
-dnalogo.o: $(srcdir)/rotator.h
-dnalogo.o: $(HACK_SRC)/screenhackI.h
-dnalogo.o: $(srcdir)/sphere.h
-dnalogo.o: $(srcdir)/texfont.h
-dnalogo.o: $(srcdir)/tube.h
-dnalogo.o: $(UTILS_SRC)/colors.h
-dnalogo.o: $(UTILS_SRC)/erase.h
-dnalogo.o: $(UTILS_SRC)/font-retry.h
-dnalogo.o: $(UTILS_SRC)/grabscreen.h
-dnalogo.o: $(UTILS_SRC)/hsv.h
-dnalogo.o: $(UTILS_SRC)/resources.h
-dnalogo.o: $(UTILS_SRC)/usleep.h
-dnalogo.o: $(UTILS_SRC)/utf8wc.h
-dnalogo.o: $(UTILS_SRC)/visual.h
-dnalogo.o: $(UTILS_SRC)/xft.h
-dnalogo.o: $(UTILS_SRC)/yarandom.h
-dnalogo.o: $(HACK_SRC)/xlockmoreI.h
-dnalogo.o: $(HACK_SRC)/xlockmore.h
-dolphin.o: $(srcdir)/atlantis.h
-dolphin.o: ../../config.h
-dolphin.o: $(HACK_SRC)/fps.h
-dolphin.o: $(HACK_SRC)/recanim.h
-dolphin.o: $(HACK_SRC)/screenhackI.h
-dolphin.o: $(UTILS_SRC)/colors.h
-dolphin.o: $(UTILS_SRC)/erase.h
-dolphin.o: $(UTILS_SRC)/font-retry.h
-dolphin.o: $(UTILS_SRC)/grabscreen.h
-dolphin.o: $(UTILS_SRC)/hsv.h
-dolphin.o: $(UTILS_SRC)/resources.h
-dolphin.o: $(UTILS_SRC)/usleep.h
-dolphin.o: $(UTILS_SRC)/visual.h
-dolphin.o: $(UTILS_SRC)/xft.h
-dolphin.o: $(UTILS_SRC)/yarandom.h
-dolphin.o: $(HACK_SRC)/xlockmoreI.h
-dropshadow.o: ../../config.h
-dropshadow.o: $(srcdir)/dropshadow.h
-dropshadow.o: $(HACK_SRC)/fps.h
-dropshadow.o: $(HACK_SRC)/recanim.h
-dropshadow.o: $(HACK_SRC)/screenhackI.h
-dropshadow.o: $(UTILS_SRC)/colors.h
-dropshadow.o: $(UTILS_SRC)/font-retry.h
-dropshadow.o: $(UTILS_SRC)/grabscreen.h
-dropshadow.o: $(UTILS_SRC)/hsv.h
-dropshadow.o: $(UTILS_SRC)/resources.h
-dropshadow.o: $(UTILS_SRC)/usleep.h
-dropshadow.o: $(UTILS_SRC)/visual.h
-dropshadow.o: $(UTILS_SRC)/xft.h
-dropshadow.o: $(UTILS_SRC)/yarandom.h
-dymaxionmap-coords.o: ../../config.h
-dymaxionmap-coords.o: $(srcdir)/dymaxionmap-coords.h
-dymaxionmap.o: ../../config.h
-dymaxionmap.o: $(srcdir)/dymaxionmap-coords.h
-dymaxionmap.o: $(HACK_SRC)/fps.h
-dymaxionmap.o: $(srcdir)/gltrackball.h
-dymaxionmap.o: ../images/gen/earth_flat_png.h
-dymaxionmap.o: ../images/gen/earth_night_png.h
-dymaxionmap.o: ../images/gen/earth_png.h
-dymaxionmap.o: ../images/gen/ground_png.h
-dymaxionmap.o: $(srcdir)/normals.h
-dymaxionmap.o: $(HACK_SRC)/recanim.h
-dymaxionmap.o: $(srcdir)/rotator.h
-dymaxionmap.o: $(HACK_SRC)/screenhackI.h
-dymaxionmap.o: $(srcdir)/sphere.h
-dymaxionmap.o: $(srcdir)/texfont.h
-dymaxionmap.o: $(UTILS_SRC)/colors.h
-dymaxionmap.o: $(UTILS_SRC)/erase.h
-dymaxionmap.o: $(UTILS_SRC)/font-retry.h
-dymaxionmap.o: $(UTILS_SRC)/grabscreen.h
-dymaxionmap.o: $(UTILS_SRC)/hsv.h
-dymaxionmap.o: $(UTILS_SRC)/resources.h
-dymaxionmap.o: $(UTILS_SRC)/usleep.h
-dymaxionmap.o: $(UTILS_SRC)/visual.h
-dymaxionmap.o: $(UTILS_SRC)/xft.h
-dymaxionmap.o: $(UTILS_SRC)/yarandom.h
-dymaxionmap.o: $(HACK_SRC)/ximage-loader.h
-dymaxionmap.o: $(HACK_SRC)/xlockmoreI.h
-dymaxionmap.o: $(HACK_SRC)/xlockmore.h
-endgame.o: $(srcdir)/chessgames.h
-endgame.o: $(srcdir)/chessmodels.h
-endgame.o: ../../config.h
-endgame.o: $(HACK_SRC)/fps.h
-endgame.o: $(srcdir)/gltrackball.h
-endgame.o: $(HACK_SRC)/recanim.h
-endgame.o: $(HACK_SRC)/screenhackI.h
-endgame.o: $(UTILS_SRC)/colors.h
-endgame.o: $(UTILS_SRC)/erase.h
-endgame.o: $(UTILS_SRC)/font-retry.h
-endgame.o: $(UTILS_SRC)/grabscreen.h
-endgame.o: $(UTILS_SRC)/hsv.h
-endgame.o: $(UTILS_SRC)/resources.h
-endgame.o: $(UTILS_SRC)/usleep.h
-endgame.o: $(UTILS_SRC)/visual.h
-endgame.o: $(UTILS_SRC)/xft.h
-endgame.o: $(UTILS_SRC)/yarandom.h
-endgame.o: $(HACK_SRC)/xlockmoreI.h
-endgame.o: $(HACK_SRC)/xlockmore.h
-energystream.o: ../../config.h
-energystream.o: $(HACK_SRC)/fps.h
-energystream.o: $(srcdir)/gltrackball.h
-energystream.o: $(HACK_SRC)/recanim.h
-energystream.o: $(srcdir)/rotator.h
-energystream.o: $(HACK_SRC)/screenhackI.h
-energystream.o: $(UTILS_SRC)/colors.h
-energystream.o: $(UTILS_SRC)/erase.h
-energystream.o: $(UTILS_SRC)/font-retry.h
-energystream.o: $(UTILS_SRC)/grabscreen.h
-energystream.o: $(UTILS_SRC)/hsv.h
-energystream.o: $(UTILS_SRC)/resources.h
-energystream.o: $(UTILS_SRC)/usleep.h
-energystream.o: $(UTILS_SRC)/visual.h
-energystream.o: $(UTILS_SRC)/xft.h
-energystream.o: $(UTILS_SRC)/yarandom.h
-energystream.o: $(HACK_SRC)/xlockmoreI.h
-energystream.o: $(HACK_SRC)/xlockmore.h
-engine.o: ../../config.h
-engine.o: $(HACK_SRC)/fps.h
-engine.o: $(srcdir)/gltrackball.h
-engine.o: $(HACK_SRC)/recanim.h
-engine.o: $(srcdir)/rotator.h
-engine.o: $(HACK_SRC)/screenhackI.h
-engine.o: $(srcdir)/texfont.h
-engine.o: $(UTILS_SRC)/colors.h
-engine.o: $(UTILS_SRC)/erase.h
-engine.o: $(UTILS_SRC)/font-retry.h
-engine.o: $(UTILS_SRC)/grabscreen.h
-engine.o: $(UTILS_SRC)/hsv.h
-engine.o: $(UTILS_SRC)/resources.h
-engine.o: $(UTILS_SRC)/usleep.h
-engine.o: $(UTILS_SRC)/visual.h
-engine.o: $(UTILS_SRC)/xft.h
-engine.o: $(UTILS_SRC)/yarandom.h
-engine.o: $(HACK_SRC)/xlockmoreI.h
-engine.o: $(HACK_SRC)/xlockmore.h
-erase-gl.o: ../../config.h
-erase-gl.o: $(UTILS_SRC)/erase.h
-erase-gl.o: $(UTILS_SRC)/utils.h
-esper.o: ../../config.h
-esper.o: $(HACK_SRC)/fps.h
-esper.o: $(srcdir)/grab-ximage.h
-esper.o: $(HACK_SRC)/recanim.h
-esper.o: $(HACK_SRC)/screenhackI.h
-esper.o: $(srcdir)/texfont.h
-esper.o: $(UTILS_SRC)/colors.h
-esper.o: $(UTILS_SRC)/erase.h
-esper.o: $(UTILS_SRC)/font-retry.h
-esper.o: $(UTILS_SRC)/grabscreen.h
-esper.o: $(UTILS_SRC)/hsv.h
-esper.o: $(UTILS_SRC)/resources.h
-esper.o: $(UTILS_SRC)/usleep.h
-esper.o: $(UTILS_SRC)/visual.h
-esper.o: $(UTILS_SRC)/xft.h
-esper.o: $(UTILS_SRC)/xshm.h
-esper.o: $(UTILS_SRC)/yarandom.h
-esper.o: $(HACK_SRC)/xlockmoreI.h
-esper.o: $(HACK_SRC)/xlockmore.h
-etruscanvenus.o: ../../config.h
-etruscanvenus.o: $(srcdir)/curlicue.h
-etruscanvenus.o: $(HACK_SRC)/fps.h
-etruscanvenus.o: $(srcdir)/glsl-utils.h
-etruscanvenus.o: $(srcdir)/gltrackball.h
-etruscanvenus.o: $(HACK_SRC)/recanim.h
-etruscanvenus.o: $(HACK_SRC)/screenhackI.h
-etruscanvenus.o: $(UTILS_SRC)/colors.h
-etruscanvenus.o: $(UTILS_SRC)/erase.h
-etruscanvenus.o: $(UTILS_SRC)/font-retry.h
-etruscanvenus.o: $(UTILS_SRC)/grabscreen.h
-etruscanvenus.o: $(UTILS_SRC)/hsv.h
-etruscanvenus.o: $(UTILS_SRC)/resources.h
-etruscanvenus.o: $(UTILS_SRC)/usleep.h
-etruscanvenus.o: $(UTILS_SRC)/visual.h
-etruscanvenus.o: $(UTILS_SRC)/xft.h
-etruscanvenus.o: $(UTILS_SRC)/yarandom.h
-etruscanvenus.o: $(HACK_SRC)/xlockmoreI.h
-etruscanvenus.o: $(HACK_SRC)/xlockmore.h
-extrusion-helix2.o: ../../config.h
-extrusion-helix2.o: $(srcdir)/extrusion.h
-extrusion-helix2.o: $(HACK_SRC)/fps.h
-extrusion-helix2.o: $(HACK_SRC)/recanim.h
-extrusion-helix2.o: $(HACK_SRC)/screenhackI.h
-extrusion-helix2.o: $(UTILS_SRC)/colors.h
-extrusion-helix2.o: $(UTILS_SRC)/erase.h
-extrusion-helix2.o: $(UTILS_SRC)/font-retry.h
-extrusion-helix2.o: $(UTILS_SRC)/grabscreen.h
-extrusion-helix2.o: $(UTILS_SRC)/hsv.h
-extrusion-helix2.o: $(UTILS_SRC)/resources.h
-extrusion-helix2.o: $(UTILS_SRC)/usleep.h
-extrusion-helix2.o: $(UTILS_SRC)/visual.h
-extrusion-helix2.o: $(UTILS_SRC)/xft.h
-extrusion-helix2.o: $(UTILS_SRC)/yarandom.h
-extrusion-helix2.o: $(HACK_SRC)/xlockmoreI.h
-extrusion-helix3.o: ../../config.h
-extrusion-helix3.o: $(srcdir)/extrusion.h
-extrusion-helix3.o: $(HACK_SRC)/fps.h
-extrusion-helix3.o: $(HACK_SRC)/recanim.h
-extrusion-helix3.o: $(HACK_SRC)/screenhackI.h
-extrusion-helix3.o: $(UTILS_SRC)/colors.h
-extrusion-helix3.o: $(UTILS_SRC)/erase.h
-extrusion-helix3.o: $(UTILS_SRC)/font-retry.h
-extrusion-helix3.o: $(UTILS_SRC)/grabscreen.h
-extrusion-helix3.o: $(UTILS_SRC)/hsv.h
-extrusion-helix3.o: $(UTILS_SRC)/resources.h
-extrusion-helix3.o: $(UTILS_SRC)/usleep.h
-extrusion-helix3.o: $(UTILS_SRC)/visual.h
-extrusion-helix3.o: $(UTILS_SRC)/xft.h
-extrusion-helix3.o: $(UTILS_SRC)/yarandom.h
-extrusion-helix3.o: $(HACK_SRC)/xlockmoreI.h
-extrusion-helix4.o: ../../config.h
-extrusion-helix4.o: $(srcdir)/extrusion.h
-extrusion-helix4.o: $(HACK_SRC)/fps.h
-extrusion-helix4.o: $(HACK_SRC)/recanim.h
-extrusion-helix4.o: $(HACK_SRC)/screenhackI.h
-extrusion-helix4.o: $(UTILS_SRC)/colors.h
-extrusion-helix4.o: $(UTILS_SRC)/erase.h
-extrusion-helix4.o: $(UTILS_SRC)/font-retry.h
-extrusion-helix4.o: $(UTILS_SRC)/grabscreen.h
-extrusion-helix4.o: $(UTILS_SRC)/hsv.h
-extrusion-helix4.o: $(UTILS_SRC)/resources.h
-extrusion-helix4.o: $(UTILS_SRC)/usleep.h
-extrusion-helix4.o: $(UTILS_SRC)/visual.h
-extrusion-helix4.o: $(UTILS_SRC)/xft.h
-extrusion-helix4.o: $(UTILS_SRC)/yarandom.h
-extrusion-helix4.o: $(HACK_SRC)/xlockmoreI.h
-extrusion-joinoffset.o: ../../config.h
-extrusion-joinoffset.o: $(srcdir)/extrusion.h
-extrusion-joinoffset.o: $(HACK_SRC)/fps.h
-extrusion-joinoffset.o: $(HACK_SRC)/recanim.h
-extrusion-joinoffset.o: $(HACK_SRC)/screenhackI.h
-extrusion-joinoffset.o: $(UTILS_SRC)/colors.h
-extrusion-joinoffset.o: $(UTILS_SRC)/erase.h
-extrusion-joinoffset.o: $(UTILS_SRC)/font-retry.h
-extrusion-joinoffset.o: $(UTILS_SRC)/grabscreen.h
-extrusion-joinoffset.o: $(UTILS_SRC)/hsv.h
-extrusion-joinoffset.o: $(UTILS_SRC)/resources.h
-extrusion-joinoffset.o: $(UTILS_SRC)/usleep.h
-extrusion-joinoffset.o: $(UTILS_SRC)/visual.h
-extrusion-joinoffset.o: $(UTILS_SRC)/xft.h
-extrusion-joinoffset.o: $(UTILS_SRC)/yarandom.h
-extrusion-joinoffset.o: $(HACK_SRC)/xlockmoreI.h
-extrusion.o: ../../config.h
-extrusion.o: $(srcdir)/extrusion.h
-extrusion.o: $(HACK_SRC)/fps.h
-extrusion.o: $(srcdir)/gltrackball.h
-extrusion.o: $(HACK_SRC)/recanim.h
-extrusion.o: $(srcdir)/rotator.h
-extrusion.o: $(HACK_SRC)/screenhackI.h
-extrusion.o: $(UTILS_SRC)/colors.h
-extrusion.o: $(UTILS_SRC)/erase.h
-extrusion.o: $(UTILS_SRC)/font-retry.h
-extrusion.o: $(UTILS_SRC)/grabscreen.h
-extrusion.o: $(UTILS_SRC)/hsv.h
-extrusion.o: $(UTILS_SRC)/resources.h
-extrusion.o: $(UTILS_SRC)/usleep.h
-extrusion.o: $(UTILS_SRC)/visual.h
-extrusion.o: $(UTILS_SRC)/xft.h
-extrusion.o: $(UTILS_SRC)/yarandom.h
-extrusion.o: $(HACK_SRC)/ximage-loader.h
-extrusion.o: $(HACK_SRC)/xlockmoreI.h
-extrusion.o: $(HACK_SRC)/xlockmore.h
-extrusion-screw.o: ../../config.h
-extrusion-screw.o: $(srcdir)/extrusion.h
-extrusion-screw.o: $(HACK_SRC)/fps.h
-extrusion-screw.o: $(HACK_SRC)/recanim.h
-extrusion-screw.o: $(HACK_SRC)/screenhackI.h
-extrusion-screw.o: $(UTILS_SRC)/colors.h
-extrusion-screw.o: $(UTILS_SRC)/erase.h
-extrusion-screw.o: $(UTILS_SRC)/font-retry.h
-extrusion-screw.o: $(UTILS_SRC)/grabscreen.h
-extrusion-screw.o: $(UTILS_SRC)/hsv.h
-extrusion-screw.o: $(UTILS_SRC)/resources.h
-extrusion-screw.o: $(UTILS_SRC)/usleep.h
-extrusion-screw.o: $(UTILS_SRC)/visual.h
-extrusion-screw.o: $(UTILS_SRC)/xft.h
-extrusion-screw.o: $(UTILS_SRC)/yarandom.h
-extrusion-screw.o: $(HACK_SRC)/xlockmoreI.h
-extrusion-taper.o: ../../config.h
-extrusion-taper.o: $(srcdir)/extrusion.h
-extrusion-taper.o: $(HACK_SRC)/fps.h
-extrusion-taper.o: $(HACK_SRC)/recanim.h
-extrusion-taper.o: $(HACK_SRC)/screenhackI.h
-extrusion-taper.o: $(UTILS_SRC)/colors.h
-extrusion-taper.o: $(UTILS_SRC)/erase.h
-extrusion-taper.o: $(UTILS_SRC)/font-retry.h
-extrusion-taper.o: $(UTILS_SRC)/grabscreen.h
-extrusion-taper.o: $(UTILS_SRC)/hsv.h
-extrusion-taper.o: $(UTILS_SRC)/resources.h
-extrusion-taper.o: $(UTILS_SRC)/usleep.h
-extrusion-taper.o: $(UTILS_SRC)/visual.h
-extrusion-taper.o: $(UTILS_SRC)/xft.h
-extrusion-taper.o: $(UTILS_SRC)/yarandom.h
-extrusion-taper.o: $(HACK_SRC)/xlockmoreI.h
-extrusion-twistoid.o: ../../config.h
-extrusion-twistoid.o: $(srcdir)/extrusion.h
-extrusion-twistoid.o: $(HACK_SRC)/fps.h
-extrusion-twistoid.o: $(HACK_SRC)/recanim.h
-extrusion-twistoid.o: $(HACK_SRC)/screenhackI.h
-extrusion-twistoid.o: $(UTILS_SRC)/colors.h
-extrusion-twistoid.o: $(UTILS_SRC)/erase.h
-extrusion-twistoid.o: $(UTILS_SRC)/font-retry.h
-extrusion-twistoid.o: $(UTILS_SRC)/grabscreen.h
-extrusion-twistoid.o: $(UTILS_SRC)/hsv.h
-extrusion-twistoid.o: $(UTILS_SRC)/resources.h
-extrusion-twistoid.o: $(UTILS_SRC)/usleep.h
-extrusion-twistoid.o: $(UTILS_SRC)/visual.h
-extrusion-twistoid.o: $(UTILS_SRC)/xft.h
-extrusion-twistoid.o: $(UTILS_SRC)/yarandom.h
-extrusion-twistoid.o: $(HACK_SRC)/xlockmoreI.h
-flipflop.o: ../../config.h
-flipflop.o: $(HACK_SRC)/fps.h
-flipflop.o: $(srcdir)/gltrackball.h
-flipflop.o: $(srcdir)/grab-ximage.h
-flipflop.o: $(HACK_SRC)/recanim.h
-flipflop.o: $(HACK_SRC)/screenhackI.h
-flipflop.o: $(UTILS_SRC)/colors.h
-flipflop.o: $(UTILS_SRC)/erase.h
-flipflop.o: $(UTILS_SRC)/font-retry.h
-flipflop.o: $(UTILS_SRC)/grabscreen.h
-flipflop.o: $(UTILS_SRC)/hsv.h
-flipflop.o: $(UTILS_SRC)/resources.h
-flipflop.o: $(UTILS_SRC)/usleep.h
-flipflop.o: $(UTILS_SRC)/visual.h
-flipflop.o: $(UTILS_SRC)/xft.h
-flipflop.o: $(UTILS_SRC)/yarandom.h
-flipflop.o: $(HACK_SRC)/xlockmoreI.h
-flipflop.o: $(HACK_SRC)/xlockmore.h
-flipscreen3d.o: ../../config.h
-flipscreen3d.o: $(HACK_SRC)/fps.h
-flipscreen3d.o: $(srcdir)/gltrackball.h
-flipscreen3d.o: $(srcdir)/grab-ximage.h
-flipscreen3d.o: $(HACK_SRC)/recanim.h
-flipscreen3d.o: $(HACK_SRC)/screenhackI.h
-flipscreen3d.o: $(UTILS_SRC)/colors.h
-flipscreen3d.o: $(UTILS_SRC)/erase.h
-flipscreen3d.o: $(UTILS_SRC)/font-retry.h
-flipscreen3d.o: $(UTILS_SRC)/grabscreen.h
-flipscreen3d.o: $(UTILS_SRC)/hsv.h
-flipscreen3d.o: $(UTILS_SRC)/resources.h
-flipscreen3d.o: $(UTILS_SRC)/usleep.h
-flipscreen3d.o: $(UTILS_SRC)/visual.h
-flipscreen3d.o: $(UTILS_SRC)/xft.h
-flipscreen3d.o: $(UTILS_SRC)/yarandom.h
-flipscreen3d.o: $(HACK_SRC)/xlockmoreI.h
-flipscreen3d.o: $(HACK_SRC)/xlockmore.h
-fliptext.o: ../../config.h
-fliptext.o: $(HACK_SRC)/fps.h
-fliptext.o: $(HACK_SRC)/recanim.h
-fliptext.o: $(HACK_SRC)/screenhackI.h
-fliptext.o: $(srcdir)/texfont.h
-fliptext.o: $(UTILS_SRC)/colors.h
-fliptext.o: $(UTILS_SRC)/erase.h
-fliptext.o: $(UTILS_SRC)/font-retry.h
-fliptext.o: $(UTILS_SRC)/grabscreen.h
-fliptext.o: $(UTILS_SRC)/hsv.h
-fliptext.o: $(UTILS_SRC)/resources.h
-fliptext.o: $(UTILS_SRC)/textclient.h
-fliptext.o: $(UTILS_SRC)/usleep.h
-fliptext.o: $(UTILS_SRC)/visual.h
-fliptext.o: $(UTILS_SRC)/xft.h
-fliptext.o: $(UTILS_SRC)/yarandom.h
-fliptext.o: $(HACK_SRC)/xlockmoreI.h
-fliptext.o: $(HACK_SRC)/xlockmore.h
-flurry.o: ../../config.h
-flurry.o: $(srcdir)/flurry.h
-flurry.o: $(HACK_SRC)/fps.h
-flurry.o: $(srcdir)/gltrackball.h
-flurry.o: $(HACK_SRC)/recanim.h
-flurry.o: $(srcdir)/rotator.h
-flurry.o: $(HACK_SRC)/screenhackI.h
-flurry.o: $(UTILS_SRC)/colors.h
-flurry.o: $(UTILS_SRC)/erase.h
-flurry.o: $(UTILS_SRC)/font-retry.h
-flurry.o: $(UTILS_SRC)/grabscreen.h
-flurry.o: $(UTILS_SRC)/hsv.h
-flurry.o: $(UTILS_SRC)/resources.h
-flurry.o: $(UTILS_SRC)/usleep.h
-flurry.o: $(UTILS_SRC)/visual.h
-flurry.o: $(UTILS_SRC)/xft.h
-flurry.o: $(UTILS_SRC)/yarandom.h
-flurry.o: $(HACK_SRC)/xlockmoreI.h
-flurry.o: $(HACK_SRC)/xlockmore.h
-flurry-smoke.o: ../../config.h
-flurry-smoke.o: $(srcdir)/flurry.h
-flurry-smoke.o: $(HACK_SRC)/fps.h
-flurry-smoke.o: $(srcdir)/gltrackball.h
-flurry-smoke.o: $(HACK_SRC)/recanim.h
-flurry-smoke.o: $(srcdir)/rotator.h
-flurry-smoke.o: $(HACK_SRC)/screenhackI.h
-flurry-smoke.o: $(UTILS_SRC)/colors.h
-flurry-smoke.o: $(UTILS_SRC)/erase.h
-flurry-smoke.o: $(UTILS_SRC)/font-retry.h
-flurry-smoke.o: $(UTILS_SRC)/grabscreen.h
-flurry-smoke.o: $(UTILS_SRC)/hsv.h
-flurry-smoke.o: $(UTILS_SRC)/resources.h
-flurry-smoke.o: $(UTILS_SRC)/usleep.h
-flurry-smoke.o: $(UTILS_SRC)/visual.h
-flurry-smoke.o: $(UTILS_SRC)/xft.h
-flurry-smoke.o: $(UTILS_SRC)/yarandom.h
-flurry-smoke.o: $(HACK_SRC)/xlockmoreI.h
-flurry-spark.o: ../../config.h
-flurry-spark.o: $(srcdir)/flurry.h
-flurry-spark.o: $(HACK_SRC)/fps.h
-flurry-spark.o: $(srcdir)/gltrackball.h
-flurry-spark.o: $(HACK_SRC)/recanim.h
-flurry-spark.o: $(srcdir)/rotator.h
-flurry-spark.o: $(HACK_SRC)/screenhackI.h
-flurry-spark.o: $(UTILS_SRC)/colors.h
-flurry-spark.o: $(UTILS_SRC)/erase.h
-flurry-spark.o: $(UTILS_SRC)/font-retry.h
-flurry-spark.o: $(UTILS_SRC)/grabscreen.h
-flurry-spark.o: $(UTILS_SRC)/hsv.h
-flurry-spark.o: $(UTILS_SRC)/resources.h
-flurry-spark.o: $(UTILS_SRC)/usleep.h
-flurry-spark.o: $(UTILS_SRC)/visual.h
-flurry-spark.o: $(UTILS_SRC)/xft.h
-flurry-spark.o: $(UTILS_SRC)/yarandom.h
-flurry-spark.o: $(HACK_SRC)/xlockmoreI.h
-flurry-star.o: ../../config.h
-flurry-star.o: $(srcdir)/flurry.h
-flurry-star.o: $(HACK_SRC)/fps.h
-flurry-star.o: $(srcdir)/gltrackball.h
-flurry-star.o: $(HACK_SRC)/recanim.h
-flurry-star.o: $(srcdir)/rotator.h
-flurry-star.o: $(HACK_SRC)/screenhackI.h
-flurry-star.o: $(UTILS_SRC)/colors.h
-flurry-star.o: $(UTILS_SRC)/erase.h
-flurry-star.o: $(UTILS_SRC)/font-retry.h
-flurry-star.o: $(UTILS_SRC)/grabscreen.h
-flurry-star.o: $(UTILS_SRC)/hsv.h
-flurry-star.o: $(UTILS_SRC)/resources.h
-flurry-star.o: $(UTILS_SRC)/usleep.h
-flurry-star.o: $(UTILS_SRC)/visual.h
-flurry-star.o: $(UTILS_SRC)/xft.h
-flurry-star.o: $(UTILS_SRC)/yarandom.h
-flurry-star.o: $(HACK_SRC)/xlockmoreI.h
-flurry-texture.o: ../../config.h
-flurry-texture.o: $(srcdir)/flurry.h
-flurry-texture.o: $(HACK_SRC)/fps.h
-flurry-texture.o: $(srcdir)/gltrackball.h
-flurry-texture.o: $(HACK_SRC)/recanim.h
-flurry-texture.o: $(srcdir)/rotator.h
-flurry-texture.o: $(HACK_SRC)/screenhackI.h
-flurry-texture.o: $(UTILS_SRC)/colors.h
-flurry-texture.o: $(UTILS_SRC)/erase.h
-flurry-texture.o: $(UTILS_SRC)/font-retry.h
-flurry-texture.o: $(UTILS_SRC)/grabscreen.h
-flurry-texture.o: $(UTILS_SRC)/hsv.h
-flurry-texture.o: $(UTILS_SRC)/resources.h
-flurry-texture.o: $(UTILS_SRC)/usleep.h
-flurry-texture.o: $(UTILS_SRC)/visual.h
-flurry-texture.o: $(UTILS_SRC)/xft.h
-flurry-texture.o: $(UTILS_SRC)/yarandom.h
-flurry-texture.o: $(HACK_SRC)/xlockmoreI.h
-flyingtoasters.o: ../../config.h
-flyingtoasters.o: $(HACK_SRC)/fps.h
-flyingtoasters.o: $(srcdir)/gllist.h
-flyingtoasters.o: $(srcdir)/gltrackball.h
-flyingtoasters.o: ../images/gen/chromesphere_png.h
-flyingtoasters.o: ../images/gen/toast_png.h
-flyingtoasters.o: $(HACK_SRC)/recanim.h
-flyingtoasters.o: $(HACK_SRC)/screenhackI.h
-flyingtoasters.o: $(UTILS_SRC)/colors.h
-flyingtoasters.o: $(UTILS_SRC)/erase.h
-flyingtoasters.o: $(UTILS_SRC)/font-retry.h
-flyingtoasters.o: $(UTILS_SRC)/grabscreen.h
-flyingtoasters.o: $(UTILS_SRC)/hsv.h
-flyingtoasters.o: $(UTILS_SRC)/resources.h
-flyingtoasters.o: $(UTILS_SRC)/usleep.h
-flyingtoasters.o: $(UTILS_SRC)/visual.h
-flyingtoasters.o: $(UTILS_SRC)/xft.h
-flyingtoasters.o: $(UTILS_SRC)/yarandom.h
-flyingtoasters.o: $(HACK_SRC)/ximage-loader.h
-flyingtoasters.o: $(HACK_SRC)/xlockmoreI.h
-flyingtoasters.o: $(HACK_SRC)/xlockmore.h
-fps-gl.o: ../../config.h
-fps-gl.o: $(HACK_SRC)/fpsI.h
-fps-gl.o: $(HACK_SRC)/fps.h
-fps-gl.o: $(HACK_SRC)/recanim.h
-fps-gl.o: $(HACK_SRC)/screenhackI.h
-fps-gl.o: $(srcdir)/texfont.h
-fps-gl.o: $(UTILS_SRC)/colors.h
-fps-gl.o: $(UTILS_SRC)/erase.h
-fps-gl.o: $(UTILS_SRC)/font-retry.h
-fps-gl.o: $(UTILS_SRC)/grabscreen.h
-fps-gl.o: $(UTILS_SRC)/hsv.h
-fps-gl.o: $(UTILS_SRC)/resources.h
-fps-gl.o: $(UTILS_SRC)/usleep.h
-fps-gl.o: $(UTILS_SRC)/visual.h
-fps-gl.o: $(UTILS_SRC)/xft.h
-fps-gl.o: $(UTILS_SRC)/yarandom.h
-fps-gl.o: $(HACK_SRC)/xlockmoreI.h
-gears.o: ../../config.h
-gears.o: $(HACK_SRC)/fps.h
-gears.o: $(srcdir)/gltrackball.h
-gears.o: $(srcdir)/involute.h
-gears.o: $(srcdir)/normals.h
-gears.o: $(HACK_SRC)/recanim.h
-gears.o: $(srcdir)/rotator.h
-gears.o: $(HACK_SRC)/screenhackI.h
-gears.o: $(srcdir)/tube.h
-gears.o: $(UTILS_SRC)/colors.h
-gears.o: $(UTILS_SRC)/erase.h
-gears.o: $(UTILS_SRC)/font-retry.h
-gears.o: $(UTILS_SRC)/grabscreen.h
-gears.o: $(UTILS_SRC)/hsv.h
-gears.o: $(UTILS_SRC)/resources.h
-gears.o: $(UTILS_SRC)/usleep.h
-gears.o: $(UTILS_SRC)/visual.h
-gears.o: $(UTILS_SRC)/xft.h
-gears.o: $(UTILS_SRC)/yarandom.h
-gears.o: $(HACK_SRC)/xlockmoreI.h
-gears.o: $(HACK_SRC)/xlockmore.h
-geodesicgears.o: ../../config.h
-geodesicgears.o: $(HACK_SRC)/fps.h
-geodesicgears.o: $(srcdir)/gllist.h
-geodesicgears.o: $(srcdir)/gltrackball.h
-geodesicgears.o: $(srcdir)/involute.h
-geodesicgears.o: $(srcdir)/normals.h
-geodesicgears.o: $(HACK_SRC)/recanim.h
-geodesicgears.o: $(srcdir)/rotator.h
-geodesicgears.o: $(HACK_SRC)/screenhackI.h
-geodesicgears.o: $(srcdir)/texfont.h
-geodesicgears.o: $(UTILS_SRC)/colors.h
-geodesicgears.o: $(UTILS_SRC)/erase.h
-geodesicgears.o: $(UTILS_SRC)/font-retry.h
-geodesicgears.o: $(UTILS_SRC)/grabscreen.h
-geodesicgears.o: $(UTILS_SRC)/hsv.h
-geodesicgears.o: $(UTILS_SRC)/resources.h
-geodesicgears.o: $(UTILS_SRC)/usleep.h
-geodesicgears.o: $(UTILS_SRC)/visual.h
-geodesicgears.o: $(UTILS_SRC)/xft.h
-geodesicgears.o: $(UTILS_SRC)/yarandom.h
-geodesicgears.o: $(HACK_SRC)/xlockmoreI.h
-geodesicgears.o: $(HACK_SRC)/xlockmore.h
-geodesic.o: ../../config.h
-geodesic.o: $(HACK_SRC)/fps.h
-geodesic.o: $(srcdir)/gllist.h
-geodesic.o: $(srcdir)/gltrackball.h
-geodesic.o: $(srcdir)/normals.h
-geodesic.o: $(HACK_SRC)/recanim.h
-geodesic.o: $(srcdir)/rotator.h
-geodesic.o: $(HACK_SRC)/screenhackI.h
-geodesic.o: $(UTILS_SRC)/colors.h
-geodesic.o: $(UTILS_SRC)/erase.h
-geodesic.o: $(UTILS_SRC)/font-retry.h
-geodesic.o: $(UTILS_SRC)/grabscreen.h
-geodesic.o: $(UTILS_SRC)/hsv.h
-geodesic.o: $(UTILS_SRC)/resources.h
-geodesic.o: $(UTILS_SRC)/usleep.h
-geodesic.o: $(UTILS_SRC)/visual.h
-geodesic.o: $(UTILS_SRC)/xft.h
-geodesic.o: $(UTILS_SRC)/yarandom.h
-geodesic.o: $(HACK_SRC)/xlockmoreI.h
-geodesic.o: $(HACK_SRC)/xlockmore.h
-gflux.o: ../../config.h
-gflux.o: $(HACK_SRC)/fps.h
-gflux.o: $(srcdir)/gltrackball.h
-gflux.o: $(srcdir)/grab-ximage.h
-gflux.o: $(HACK_SRC)/recanim.h
-gflux.o: $(HACK_SRC)/screenhackI.h
-gflux.o: $(UTILS_SRC)/colors.h
-gflux.o: $(UTILS_SRC)/erase.h
-gflux.o: $(UTILS_SRC)/font-retry.h
-gflux.o: $(UTILS_SRC)/grabscreen.h
-gflux.o: $(UTILS_SRC)/hsv.h
-gflux.o: $(UTILS_SRC)/resources.h
-gflux.o: $(UTILS_SRC)/usleep.h
-gflux.o: $(UTILS_SRC)/visual.h
-gflux.o: $(UTILS_SRC)/xft.h
-gflux.o: $(UTILS_SRC)/yarandom.h
-gflux.o: $(HACK_SRC)/xlockmoreI.h
-gflux.o: $(HACK_SRC)/xlockmore.h
-gibson.o: ../../config.h
-gibson.o: $(HACK_SRC)/fps.h
-gibson.o: $(HACK_SRC)/recanim.h
-gibson.o: $(srcdir)/rotator.h
-gibson.o: $(HACK_SRC)/screenhackI.h
-gibson.o: $(srcdir)/texfont.h
-gibson.o: $(UTILS_SRC)/colors.h
-gibson.o: $(UTILS_SRC)/erase.h
-gibson.o: $(UTILS_SRC)/font-retry.h
-gibson.o: $(UTILS_SRC)/grabscreen.h
-gibson.o: $(UTILS_SRC)/hsv.h
-gibson.o: $(UTILS_SRC)/resources.h
-gibson.o: $(UTILS_SRC)/usleep.h
-gibson.o: $(UTILS_SRC)/visual.h
-gibson.o: $(UTILS_SRC)/xft.h
-gibson.o: $(UTILS_SRC)/yarandom.h
-gibson.o: $(HACK_SRC)/xlockmoreI.h
-gibson.o: $(HACK_SRC)/xlockmore.h
-glblur.o: ../../config.h
-glblur.o: $(HACK_SRC)/fps.h
-glblur.o: $(srcdir)/gltrackball.h
-glblur.o: $(HACK_SRC)/recanim.h
-glblur.o: $(srcdir)/rotator.h
-glblur.o: $(HACK_SRC)/screenhackI.h
-glblur.o: $(UTILS_SRC)/colors.h
-glblur.o: $(UTILS_SRC)/erase.h
-glblur.o: $(UTILS_SRC)/font-retry.h
-glblur.o: $(UTILS_SRC)/grabscreen.h
-glblur.o: $(UTILS_SRC)/hsv.h
-glblur.o: $(UTILS_SRC)/resources.h
-glblur.o: $(UTILS_SRC)/usleep.h
-glblur.o: $(UTILS_SRC)/visual.h
-glblur.o: $(UTILS_SRC)/xft.h
-glblur.o: $(UTILS_SRC)/yarandom.h
-glblur.o: $(HACK_SRC)/xlockmoreI.h
-glblur.o: $(HACK_SRC)/xlockmore.h
-glcells.o: ../../config.h
-glcells.o: $(HACK_SRC)/fps.h
-glcells.o: $(HACK_SRC)/recanim.h
-glcells.o: $(HACK_SRC)/screenhackI.h
-glcells.o: $(UTILS_SRC)/colors.h
-glcells.o: $(UTILS_SRC)/erase.h
-glcells.o: $(UTILS_SRC)/font-retry.h
-glcells.o: $(UTILS_SRC)/grabscreen.h
-glcells.o: $(UTILS_SRC)/hsv.h
-glcells.o: $(UTILS_SRC)/resources.h
-glcells.o: $(UTILS_SRC)/usleep.h
-glcells.o: $(UTILS_SRC)/visual.h
-glcells.o: $(UTILS_SRC)/xft.h
-glcells.o: $(UTILS_SRC)/yarandom.h
-glcells.o: $(HACK_SRC)/xlockmoreI.h
-glcells.o: $(HACK_SRC)/xlockmore.h
-gleidescope.o: ../../config.h
-gleidescope.o: $(HACK_SRC)/fps.h
-gleidescope.o: $(srcdir)/grab-ximage.h
-gleidescope.o: $(HACK_SRC)/recanim.h
-gleidescope.o: $(HACK_SRC)/screenhackI.h
-gleidescope.o: $(UTILS_SRC)/colors.h
-gleidescope.o: $(UTILS_SRC)/erase.h
-gleidescope.o: $(UTILS_SRC)/font-retry.h
-gleidescope.o: $(UTILS_SRC)/grabscreen.h
-gleidescope.o: $(UTILS_SRC)/hsv.h
-gleidescope.o: $(UTILS_SRC)/resources.h
-gleidescope.o: $(UTILS_SRC)/usleep.h
-gleidescope.o: $(UTILS_SRC)/visual.h
-gleidescope.o: $(UTILS_SRC)/xft.h
-gleidescope.o: $(UTILS_SRC)/yarandom.h
-gleidescope.o: $(HACK_SRC)/ximage-loader.h
-gleidescope.o: $(HACK_SRC)/xlockmoreI.h
-gleidescope.o: $(HACK_SRC)/xlockmore.h
-glforestfire.o: ../../config.h
-glforestfire.o: $(HACK_SRC)/fps.h
-glforestfire.o: $(srcdir)/gltrackball.h
-glforestfire.o: ../images/gen/ground_png.h
-glforestfire.o: ../images/gen/tree_png.h
-glforestfire.o: $(HACK_SRC)/recanim.h
-glforestfire.o: $(HACK_SRC)/screenhackI.h
-glforestfire.o: $(UTILS_SRC)/colors.h
-glforestfire.o: $(UTILS_SRC)/erase.h
-glforestfire.o: $(UTILS_SRC)/font-retry.h
-glforestfire.o: $(UTILS_SRC)/grabscreen.h
-glforestfire.o: $(UTILS_SRC)/hsv.h
-glforestfire.o: $(UTILS_SRC)/resources.h
-glforestfire.o: $(UTILS_SRC)/usleep.h
-glforestfire.o: $(UTILS_SRC)/visual.h
-glforestfire.o: $(UTILS_SRC)/xft.h
-glforestfire.o: $(UTILS_SRC)/yarandom.h
-glforestfire.o: $(HACK_SRC)/ximage-loader.h
-glforestfire.o: $(HACK_SRC)/xlockmoreI.h
-glforestfire.o: $(HACK_SRC)/xlockmore.h
-glhanoi.o: ../../config.h
-glhanoi.o: $(HACK_SRC)/fps.h
-glhanoi.o: $(HACK_SRC)/recanim.h
-glhanoi.o: $(srcdir)/rotator.h
-glhanoi.o: $(HACK_SRC)/screenhackI.h
-glhanoi.o: $(UTILS_SRC)/colors.h
-glhanoi.o: $(UTILS_SRC)/erase.h
-glhanoi.o: $(UTILS_SRC)/font-retry.h
-glhanoi.o: $(UTILS_SRC)/grabscreen.h
-glhanoi.o: $(UTILS_SRC)/hsv.h
-glhanoi.o: $(UTILS_SRC)/resources.h
-glhanoi.o: $(UTILS_SRC)/usleep.h
-glhanoi.o: $(UTILS_SRC)/visual.h
-glhanoi.o: $(UTILS_SRC)/xft.h
-glhanoi.o: $(UTILS_SRC)/yarandom.h
-glhanoi.o: $(HACK_SRC)/xlockmoreI.h
-glhanoi.o: $(HACK_SRC)/xlockmore.h
-glknots.o: ../../config.h
-glknots.o: $(HACK_SRC)/fps.h
-glknots.o: $(srcdir)/gltrackball.h
-glknots.o: $(HACK_SRC)/recanim.h
-glknots.o: $(srcdir)/rotator.h
-glknots.o: $(HACK_SRC)/screenhackI.h
-glknots.o: $(srcdir)/tube.h
-glknots.o: $(UTILS_SRC)/colors.h
-glknots.o: $(UTILS_SRC)/erase.h
-glknots.o: $(UTILS_SRC)/font-retry.h
-glknots.o: $(UTILS_SRC)/grabscreen.h
-glknots.o: $(UTILS_SRC)/hsv.h
-glknots.o: $(UTILS_SRC)/resources.h
-glknots.o: $(UTILS_SRC)/usleep.h
-glknots.o: $(UTILS_SRC)/visual.h
-glknots.o: $(UTILS_SRC)/xft.h
-glknots.o: $(UTILS_SRC)/yarandom.h
-glknots.o: $(HACK_SRC)/xlockmoreI.h
-glknots.o: $(HACK_SRC)/xlockmore.h
-gllist.o: ../../config.h
-gllist.o: $(HACK_SRC)/fps.h
-gllist.o: $(srcdir)/gllist.h
-gllist.o: $(HACK_SRC)/recanim.h
-gllist.o: $(HACK_SRC)/screenhackI.h
-gllist.o: $(UTILS_SRC)/colors.h
-gllist.o: $(UTILS_SRC)/erase.h
-gllist.o: $(UTILS_SRC)/font-retry.h
-gllist.o: $(UTILS_SRC)/grabscreen.h
-gllist.o: $(UTILS_SRC)/hsv.h
-gllist.o: $(UTILS_SRC)/resources.h
-gllist.o: $(UTILS_SRC)/usleep.h
-gllist.o: $(UTILS_SRC)/visual.h
-gllist.o: $(UTILS_SRC)/xft.h
-gllist.o: $(UTILS_SRC)/yarandom.h
-gllist.o: $(HACK_SRC)/xlockmoreI.h
-glmatrix.o: ../../config.h
-glmatrix.o: $(HACK_SRC)/fps.h
-glmatrix.o: ../images/gen/matrix3_png.h
-glmatrix.o: $(HACK_SRC)/recanim.h
-glmatrix.o: $(HACK_SRC)/screenhackI.h
-glmatrix.o: $(UTILS_SRC)/colors.h
-glmatrix.o: $(UTILS_SRC)/erase.h
-glmatrix.o: $(UTILS_SRC)/font-retry.h
-glmatrix.o: $(UTILS_SRC)/grabscreen.h
-glmatrix.o: $(UTILS_SRC)/hsv.h
-glmatrix.o: $(UTILS_SRC)/resources.h
-glmatrix.o: $(UTILS_SRC)/usleep.h
-glmatrix.o: $(UTILS_SRC)/visual.h
-glmatrix.o: $(UTILS_SRC)/xft.h
-glmatrix.o: $(UTILS_SRC)/yarandom.h
-glmatrix.o: $(HACK_SRC)/ximage-loader.h
-glmatrix.o: $(HACK_SRC)/xlockmoreI.h
-glmatrix.o: $(HACK_SRC)/xlockmore.h
-glplanet.o: ../../config.h
-glplanet.o: $(HACK_SRC)/fps.h
-glplanet.o: $(srcdir)/gltrackball.h
-glplanet.o: ../images/gen/earth_night_png.h
-glplanet.o: ../images/gen/earth_png.h
-glplanet.o: $(HACK_SRC)/recanim.h
-glplanet.o: $(srcdir)/rotator.h
-glplanet.o: $(HACK_SRC)/screenhackI.h
-glplanet.o: $(srcdir)/sphere.h
-glplanet.o: $(UTILS_SRC)/colors.h
-glplanet.o: $(UTILS_SRC)/erase.h
-glplanet.o: $(UTILS_SRC)/font-retry.h
-glplanet.o: $(UTILS_SRC)/grabscreen.h
-glplanet.o: $(UTILS_SRC)/hsv.h
-glplanet.o: $(UTILS_SRC)/resources.h
-glplanet.o: $(UTILS_SRC)/usleep.h
-glplanet.o: $(UTILS_SRC)/visual.h
-glplanet.o: $(UTILS_SRC)/xft.h
-glplanet.o: $(UTILS_SRC)/yarandom.h
-glplanet.o: $(HACK_SRC)/ximage-loader.h
-glplanet.o: $(HACK_SRC)/xlockmoreI.h
-glplanet.o: $(HACK_SRC)/xlockmore.h
-glschool_alg.o: ../../config.h
-glschool_alg.o: $(srcdir)/glschool_alg.h
-glschool_alg.o: $(UTILS_SRC)/yarandom.h
-glschool_gl.o: ../../config.h
-glschool_gl.o: $(HACK_SRC)/fps.h
-glschool_gl.o: $(srcdir)/glschool_alg.h
-glschool_gl.o: $(srcdir)/glschool_gl.h
-glschool_gl.o: $(HACK_SRC)/recanim.h
-glschool_gl.o: $(HACK_SRC)/screenhackI.h
-glschool_gl.o: $(srcdir)/sphere.h
-glschool_gl.o: $(srcdir)/tube.h
-glschool_gl.o: $(UTILS_SRC)/colors.h
-glschool_gl.o: $(UTILS_SRC)/erase.h
-glschool_gl.o: $(UTILS_SRC)/font-retry.h
-glschool_gl.o: $(UTILS_SRC)/grabscreen.h
-glschool_gl.o: $(UTILS_SRC)/hsv.h
-glschool_gl.o: $(UTILS_SRC)/resources.h
-glschool_gl.o: $(UTILS_SRC)/usleep.h
-glschool_gl.o: $(UTILS_SRC)/visual.h
-glschool_gl.o: $(UTILS_SRC)/xft.h
-glschool_gl.o: $(UTILS_SRC)/yarandom.h
-glschool_gl.o: $(HACK_SRC)/xlockmoreI.h
-glschool.o: ../../config.h
-glschool.o: $(HACK_SRC)/fps.h
-glschool.o: $(srcdir)/glschool_alg.h
-glschool.o: $(srcdir)/glschool_gl.h
-glschool.o: $(srcdir)/glschool.h
-glschool.o: $(HACK_SRC)/recanim.h
-glschool.o: $(HACK_SRC)/screenhackI.h
-glschool.o: $(UTILS_SRC)/colors.h
-glschool.o: $(UTILS_SRC)/erase.h
-glschool.o: $(UTILS_SRC)/font-retry.h
-glschool.o: $(UTILS_SRC)/grabscreen.h
-glschool.o: $(UTILS_SRC)/hsv.h
-glschool.o: $(UTILS_SRC)/resources.h
-glschool.o: $(UTILS_SRC)/usleep.h
-glschool.o: $(UTILS_SRC)/visual.h
-glschool.o: $(UTILS_SRC)/xft.h
-glschool.o: $(UTILS_SRC)/yarandom.h
-glschool.o: $(HACK_SRC)/xlockmoreI.h
-glschool.o: $(HACK_SRC)/xlockmore.h
-glslideshow.o: ../../config.h
-glslideshow.o: $(HACK_SRC)/fps.h
-glslideshow.o: $(srcdir)/grab-ximage.h
-glslideshow.o: $(HACK_SRC)/recanim.h
-glslideshow.o: $(HACK_SRC)/screenhackI.h
-glslideshow.o: $(srcdir)/texfont.h
-glslideshow.o: $(UTILS_SRC)/colors.h
-glslideshow.o: $(UTILS_SRC)/erase.h
-glslideshow.o: $(UTILS_SRC)/font-retry.h
-glslideshow.o: $(UTILS_SRC)/grabscreen.h
-glslideshow.o: $(UTILS_SRC)/hsv.h
-glslideshow.o: $(UTILS_SRC)/resources.h
-glslideshow.o: $(UTILS_SRC)/usleep.h
-glslideshow.o: $(UTILS_SRC)/visual.h
-glslideshow.o: $(UTILS_SRC)/xft.h
-glslideshow.o: $(UTILS_SRC)/yarandom.h
-glslideshow.o: $(HACK_SRC)/xlockmoreI.h
-glslideshow.o: $(HACK_SRC)/xlockmore.h
-glsl-utils.o: ../../config.h
-glsl-utils.o: $(HACK_SRC)/fps.h
-glsl-utils.o: $(srcdir)/glsl-utils.h
-glsl-utils.o: $(HACK_SRC)/recanim.h
-glsl-utils.o: $(HACK_SRC)/screenhackI.h
-glsl-utils.o: $(UTILS_SRC)/colors.h
-glsl-utils.o: $(UTILS_SRC)/font-retry.h
-glsl-utils.o: $(UTILS_SRC)/grabscreen.h
-glsl-utils.o: $(UTILS_SRC)/hsv.h
-glsl-utils.o: $(UTILS_SRC)/resources.h
-glsl-utils.o: $(UTILS_SRC)/usleep.h
-glsl-utils.o: $(UTILS_SRC)/visual.h
-glsl-utils.o: $(UTILS_SRC)/xft.h
-glsl-utils.o: $(UTILS_SRC)/yarandom.h
-glsnake.o: ../../config.h
-glsnake.o: $(HACK_SRC)/fps.h
-glsnake.o: $(HACK_SRC)/recanim.h
-glsnake.o: $(HACK_SRC)/screenhackI.h
-glsnake.o: $(srcdir)/texfont.h
-glsnake.o: $(UTILS_SRC)/colors.h
-glsnake.o: $(UTILS_SRC)/erase.h
-glsnake.o: $(UTILS_SRC)/font-retry.h
-glsnake.o: $(UTILS_SRC)/grabscreen.h
-glsnake.o: $(UTILS_SRC)/hsv.h
-glsnake.o: $(UTILS_SRC)/resources.h
-glsnake.o: $(UTILS_SRC)/usleep.h
-glsnake.o: $(UTILS_SRC)/visual.h
-glsnake.o: $(UTILS_SRC)/xft.h
-glsnake.o: $(UTILS_SRC)/yarandom.h
-glsnake.o: $(HACK_SRC)/xlockmoreI.h
-glsnake.o: $(HACK_SRC)/xlockmore.h
-gltext.o: ../../config.h
-gltext.o: $(HACK_SRC)/fps.h
-gltext.o: $(srcdir)/gltrackball.h
-gltext.o: $(srcdir)/glut_mroman.h
-gltext.o: $(srcdir)/glut_roman.h
-gltext.o: $(srcdir)/glutstroke.h
-gltext.o: $(HACK_SRC)/recanim.h
-gltext.o: $(srcdir)/rotator.h
-gltext.o: $(HACK_SRC)/screenhackI.h
-gltext.o: $(srcdir)/sphere.h
-gltext.o: $(srcdir)/tube.h
-gltext.o: $(UTILS_SRC)/colors.h
-gltext.o: $(UTILS_SRC)/erase.h
-gltext.o: $(UTILS_SRC)/font-retry.h
-gltext.o: $(UTILS_SRC)/grabscreen.h
-gltext.o: $(UTILS_SRC)/hsv.h
-gltext.o: $(UTILS_SRC)/resources.h
-gltext.o: $(UTILS_SRC)/textclient.h
-gltext.o: $(UTILS_SRC)/usleep.h
-gltext.o: $(UTILS_SRC)/utf8wc.h
-gltext.o: $(UTILS_SRC)/visual.h
-gltext.o: $(UTILS_SRC)/xft.h
-gltext.o: $(UTILS_SRC)/yarandom.h
-gltext.o: $(HACK_SRC)/xlockmoreI.h
-gltext.o: $(HACK_SRC)/xlockmore.h
-gltrackball.o: ../../config.h
-gltrackball.o: $(HACK_SRC)/fps.h
-gltrackball.o: $(srcdir)/gltrackball.h
-gltrackball.o: $(HACK_SRC)/recanim.h
-gltrackball.o: $(HACK_SRC)/screenhackI.h
-gltrackball.o: $(srcdir)/trackball.h
-gltrackball.o: $(UTILS_SRC)/colors.h
-gltrackball.o: $(UTILS_SRC)/font-retry.h
-gltrackball.o: $(UTILS_SRC)/grabscreen.h
-gltrackball.o: $(UTILS_SRC)/hsv.h
-gltrackball.o: $(UTILS_SRC)/resources.h
-gltrackball.o: $(UTILS_SRC)/usleep.h
-gltrackball.o: $(UTILS_SRC)/visual.h
-gltrackball.o: $(UTILS_SRC)/xft.h
-gltrackball.o: $(UTILS_SRC)/yarandom.h
-glut_stroke.o: ../../config.h
-glut_stroke.o: $(HACK_SRC)/fps.h
-glut_stroke.o: $(srcdir)/glutstroke.h
-glut_stroke.o: $(HACK_SRC)/recanim.h
-glut_stroke.o: $(HACK_SRC)/screenhackI.h
-glut_stroke.o: $(UTILS_SRC)/colors.h
-glut_stroke.o: $(UTILS_SRC)/font-retry.h
-glut_stroke.o: $(UTILS_SRC)/grabscreen.h
-glut_stroke.o: $(UTILS_SRC)/hsv.h
-glut_stroke.o: $(UTILS_SRC)/resources.h
-glut_stroke.o: $(UTILS_SRC)/usleep.h
-glut_stroke.o: $(UTILS_SRC)/visual.h
-glut_stroke.o: $(UTILS_SRC)/xft.h
-glut_stroke.o: $(UTILS_SRC)/yarandom.h
-glut_swidth.o: ../../config.h
-glut_swidth.o: $(HACK_SRC)/fps.h
-glut_swidth.o: $(srcdir)/glutstroke.h
-glut_swidth.o: $(HACK_SRC)/recanim.h
-glut_swidth.o: $(HACK_SRC)/screenhackI.h
-glut_swidth.o: $(UTILS_SRC)/colors.h
-glut_swidth.o: $(UTILS_SRC)/font-retry.h
-glut_swidth.o: $(UTILS_SRC)/grabscreen.h
-glut_swidth.o: $(UTILS_SRC)/hsv.h
-glut_swidth.o: $(UTILS_SRC)/resources.h
-glut_swidth.o: $(UTILS_SRC)/usleep.h
-glut_swidth.o: $(UTILS_SRC)/visual.h
-glut_swidth.o: $(UTILS_SRC)/xft.h
-glut_swidth.o: $(UTILS_SRC)/yarandom.h
-grab-ximage.o: ../../config.h
-grab-ximage.o: $(HACK_SRC)/fps.h
-grab-ximage.o: $(srcdir)/grab-ximage.h
-grab-ximage.o: $(HACK_SRC)/recanim.h
-grab-ximage.o: $(HACK_SRC)/screenhackI.h
-grab-ximage.o: $(UTILS_SRC)/colors.h
-grab-ximage.o: $(UTILS_SRC)/erase.h
-grab-ximage.o: $(UTILS_SRC)/font-retry.h
-grab-ximage.o: $(UTILS_SRC)/grabscreen.h
-grab-ximage.o: $(UTILS_SRC)/hsv.h
-grab-ximage.o: $(UTILS_SRC)/pow2.h
-grab-ximage.o: $(UTILS_SRC)/resources.h
-grab-ximage.o: $(UTILS_SRC)/usleep.h
-grab-ximage.o: $(UTILS_SRC)/visual.h
-grab-ximage.o: $(UTILS_SRC)/xft.h
-grab-ximage.o: $(UTILS_SRC)/xshm.h
-grab-ximage.o: $(UTILS_SRC)/yarandom.h
-grab-ximage.o: $(HACK_SRC)/xlockmoreI.h
-gravitywell.o: ../../config.h
-gravitywell.o: $(HACK_SRC)/fps.h
-gravitywell.o: $(srcdir)/gltrackball.h
-gravitywell.o: $(HACK_SRC)/recanim.h
-gravitywell.o: $(HACK_SRC)/screenhackI.h
-gravitywell.o: $(UTILS_SRC)/colors.h
-gravitywell.o: $(UTILS_SRC)/erase.h
-gravitywell.o: $(UTILS_SRC)/font-retry.h
-gravitywell.o: $(UTILS_SRC)/grabscreen.h
-gravitywell.o: $(UTILS_SRC)/hsv.h
-gravitywell.o: $(UTILS_SRC)/resources.h
-gravitywell.o: $(UTILS_SRC)/usleep.h
-gravitywell.o: $(UTILS_SRC)/visual.h
-gravitywell.o: $(UTILS_SRC)/xft.h
-gravitywell.o: $(UTILS_SRC)/yarandom.h
-gravitywell.o: $(HACK_SRC)/xlockmoreI.h
-gravitywell.o: $(HACK_SRC)/xlockmore.h
-handsy_model.o: ../../config.h
-handsy_model.o: $(HACK_SRC)/fps.h
-handsy_model.o: $(srcdir)/gllist.h
-handsy_model.o: $(HACK_SRC)/recanim.h
-handsy_model.o: $(HACK_SRC)/screenhackI.h
-handsy_model.o: $(UTILS_SRC)/colors.h
-handsy_model.o: $(UTILS_SRC)/erase.h
-handsy_model.o: $(UTILS_SRC)/font-retry.h
-handsy_model.o: $(UTILS_SRC)/grabscreen.h
-handsy_model.o: $(UTILS_SRC)/hsv.h
-handsy_model.o: $(UTILS_SRC)/resources.h
-handsy_model.o: $(UTILS_SRC)/usleep.h
-handsy_model.o: $(UTILS_SRC)/visual.h
-handsy_model.o: $(UTILS_SRC)/xft.h
-handsy_model.o: $(UTILS_SRC)/yarandom.h
-handsy_model.o: $(HACK_SRC)/xlockmoreI.h
-handsy.o: ../../config.h
-handsy.o: $(HACK_SRC)/fps.h
-handsy.o: $(srcdir)/gllist.h
-handsy.o: $(srcdir)/gltrackball.h
-handsy.o: $(srcdir)/handsy_anim.h
-handsy.o: $(HACK_SRC)/recanim.h
-handsy.o: $(srcdir)/rotator.h
-handsy.o: $(HACK_SRC)/screenhackI.h
-handsy.o: $(srcdir)/sphere.h
-handsy.o: $(srcdir)/tube.h
-handsy.o: $(UTILS_SRC)/colors.h
-handsy.o: $(UTILS_SRC)/erase.h
-handsy.o: $(UTILS_SRC)/font-retry.h
-handsy.o: $(UTILS_SRC)/grabscreen.h
-handsy.o: $(UTILS_SRC)/hsv.h
-handsy.o: $(UTILS_SRC)/resources.h
-handsy.o: $(UTILS_SRC)/usleep.h
-handsy.o: $(UTILS_SRC)/visual.h
-handsy.o: $(UTILS_SRC)/xft.h
-handsy.o: $(UTILS_SRC)/yarandom.h
-handsy.o: $(HACK_SRC)/xlockmoreI.h
-handsy.o: $(HACK_SRC)/xlockmore.h
-headroom_model.o: ../../config.h
-headroom_model.o: $(HACK_SRC)/fps.h
-headroom_model.o: $(srcdir)/gllist.h
-headroom_model.o: $(HACK_SRC)/recanim.h
-headroom_model.o: $(HACK_SRC)/screenhackI.h
-headroom_model.o: $(UTILS_SRC)/colors.h
-headroom_model.o: $(UTILS_SRC)/erase.h
-headroom_model.o: $(UTILS_SRC)/font-retry.h
-headroom_model.o: $(UTILS_SRC)/grabscreen.h
-headroom_model.o: $(UTILS_SRC)/hsv.h
-headroom_model.o: $(UTILS_SRC)/resources.h
-headroom_model.o: $(UTILS_SRC)/usleep.h
-headroom_model.o: $(UTILS_SRC)/visual.h
-headroom_model.o: $(UTILS_SRC)/xft.h
-headroom_model.o: $(UTILS_SRC)/yarandom.h
-headroom_model.o: $(HACK_SRC)/xlockmoreI.h
-headroom.o: ../../config.h
-headroom.o: $(HACK_SRC)/fps.h
-headroom.o: $(srcdir)/gllist.h
-headroom.o: $(srcdir)/gltrackball.h
-headroom.o: $(HACK_SRC)/recanim.h
-headroom.o: $(srcdir)/rotator.h
-headroom.o: $(HACK_SRC)/screenhackI.h
-headroom.o: $(UTILS_SRC)/colors.h
-headroom.o: $(UTILS_SRC)/erase.h
-headroom.o: $(UTILS_SRC)/font-retry.h
-headroom.o: $(UTILS_SRC)/grabscreen.h
-headroom.o: $(UTILS_SRC)/hsv.h
-headroom.o: $(UTILS_SRC)/resources.h
-headroom.o: $(UTILS_SRC)/usleep.h
-headroom.o: $(UTILS_SRC)/visual.h
-headroom.o: $(UTILS_SRC)/xft.h
-headroom.o: $(UTILS_SRC)/yarandom.h
-headroom.o: $(HACK_SRC)/xlockmoreI.h
-headroom.o: $(HACK_SRC)/xlockmore.h
-hexstrut.o: ../../config.h
-hexstrut.o: $(HACK_SRC)/fps.h
-hexstrut.o: $(srcdir)/gltrackball.h
-hexstrut.o: $(srcdir)/normals.h
-hexstrut.o: $(HACK_SRC)/recanim.h
-hexstrut.o: $(srcdir)/rotator.h
-hexstrut.o: $(HACK_SRC)/screenhackI.h
-hexstrut.o: $(UTILS_SRC)/colors.h
-hexstrut.o: $(UTILS_SRC)/erase.h
-hexstrut.o: $(UTILS_SRC)/font-retry.h
-hexstrut.o: $(UTILS_SRC)/grabscreen.h
-hexstrut.o: $(UTILS_SRC)/hsv.h
-hexstrut.o: $(UTILS_SRC)/resources.h
-hexstrut.o: $(UTILS_SRC)/usleep.h
-hexstrut.o: $(UTILS_SRC)/visual.h
-hexstrut.o: $(UTILS_SRC)/xft.h
-hexstrut.o: $(UTILS_SRC)/yarandom.h
-hexstrut.o: $(HACK_SRC)/xlockmoreI.h
-hexstrut.o: $(HACK_SRC)/xlockmore.h
-hilbert.o: ../../config.h
-hilbert.o: $(HACK_SRC)/fps.h
-hilbert.o: $(srcdir)/gltrackball.h
-hilbert.o: $(HACK_SRC)/recanim.h
-hilbert.o: $(srcdir)/rotator.h
-hilbert.o: $(HACK_SRC)/screenhackI.h
-hilbert.o: $(srcdir)/sphere.h
-hilbert.o: $(srcdir)/tube.h
-hilbert.o: $(UTILS_SRC)/colors.h
-hilbert.o: $(UTILS_SRC)/erase.h
-hilbert.o: $(UTILS_SRC)/font-retry.h
-hilbert.o: $(UTILS_SRC)/grabscreen.h
-hilbert.o: $(UTILS_SRC)/hsv.h
-hilbert.o: $(UTILS_SRC)/resources.h
-hilbert.o: $(UTILS_SRC)/usleep.h
-hilbert.o: $(UTILS_SRC)/visual.h
-hilbert.o: $(UTILS_SRC)/xft.h
-hilbert.o: $(UTILS_SRC)/yarandom.h
-hilbert.o: $(HACK_SRC)/xlockmoreI.h
-hilbert.o: $(HACK_SRC)/xlockmore.h
-hydrostat.o: ../../config.h
-hydrostat.o: $(HACK_SRC)/fps.h
-hydrostat.o: $(srcdir)/gltrackball.h
-hydrostat.o: $(srcdir)/normals.h
-hydrostat.o: $(HACK_SRC)/recanim.h
-hydrostat.o: $(HACK_SRC)/screenhackI.h
-hydrostat.o: $(srcdir)/sphere.h
-hydrostat.o: $(UTILS_SRC)/colors.h
-hydrostat.o: $(UTILS_SRC)/erase.h
-hydrostat.o: $(UTILS_SRC)/font-retry.h
-hydrostat.o: $(UTILS_SRC)/grabscreen.h
-hydrostat.o: $(UTILS_SRC)/hsv.h
-hydrostat.o: $(UTILS_SRC)/resources.h
-hydrostat.o: $(UTILS_SRC)/usleep.h
-hydrostat.o: $(UTILS_SRC)/visual.h
-hydrostat.o: $(UTILS_SRC)/xft.h
-hydrostat.o: $(UTILS_SRC)/yarandom.h
-hydrostat.o: $(HACK_SRC)/xlockmoreI.h
-hydrostat.o: $(HACK_SRC)/xlockmore.h
-hypertorus.o: ../../config.h
-hypertorus.o: $(HACK_SRC)/fps.h
-hypertorus.o: $(srcdir)/glsl-utils.h
-hypertorus.o: $(srcdir)/gltrackball.h
-hypertorus.o: $(HACK_SRC)/recanim.h
-hypertorus.o: $(HACK_SRC)/screenhackI.h
-hypertorus.o: $(UTILS_SRC)/colors.h
-hypertorus.o: $(UTILS_SRC)/erase.h
-hypertorus.o: $(UTILS_SRC)/font-retry.h
-hypertorus.o: $(UTILS_SRC)/grabscreen.h
-hypertorus.o: $(UTILS_SRC)/hsv.h
-hypertorus.o: $(UTILS_SRC)/resources.h
-hypertorus.o: $(UTILS_SRC)/usleep.h
-hypertorus.o: $(UTILS_SRC)/visual.h
-hypertorus.o: $(UTILS_SRC)/xft.h
-hypertorus.o: $(UTILS_SRC)/yarandom.h
-hypertorus.o: $(HACK_SRC)/xlockmoreI.h
-hypertorus.o: $(HACK_SRC)/xlockmore.h
-hypnowheel.o: ../../config.h
-hypnowheel.o: $(HACK_SRC)/fps.h
-hypnowheel.o: $(HACK_SRC)/recanim.h
-hypnowheel.o: $(srcdir)/rotator.h
-hypnowheel.o: $(HACK_SRC)/screenhackI.h
-hypnowheel.o: $(UTILS_SRC)/colors.h
-hypnowheel.o: $(UTILS_SRC)/erase.h
-hypnowheel.o: $(UTILS_SRC)/font-retry.h
-hypnowheel.o: $(UTILS_SRC)/grabscreen.h
-hypnowheel.o: $(UTILS_SRC)/hsv.h
-hypnowheel.o: $(UTILS_SRC)/resources.h
-hypnowheel.o: $(UTILS_SRC)/usleep.h
-hypnowheel.o: $(UTILS_SRC)/visual.h
-hypnowheel.o: $(UTILS_SRC)/xft.h
-hypnowheel.o: $(UTILS_SRC)/yarandom.h
-hypnowheel.o: $(HACK_SRC)/xlockmoreI.h
-hypnowheel.o: $(HACK_SRC)/xlockmore.h
-involute.o: ../../config.h
-involute.o: $(HACK_SRC)/fps.h
-involute.o: $(srcdir)/involute.h
-involute.o: $(srcdir)/normals.h
-involute.o: $(HACK_SRC)/recanim.h
-involute.o: $(HACK_SRC)/screenhackI.h
-involute.o: $(UTILS_SRC)/colors.h
-involute.o: $(UTILS_SRC)/font-retry.h
-involute.o: $(UTILS_SRC)/grabscreen.h
-involute.o: $(UTILS_SRC)/hsv.h
-involute.o: $(UTILS_SRC)/resources.h
-involute.o: $(UTILS_SRC)/usleep.h
-involute.o: $(UTILS_SRC)/visual.h
-involute.o: $(UTILS_SRC)/xft.h
-involute.o: $(UTILS_SRC)/yarandom.h
-jigglypuff.o: ../../config.h
-jigglypuff.o: $(HACK_SRC)/fps.h
-jigglypuff.o: $(srcdir)/gltrackball.h
-jigglypuff.o: ../images/gen/jigglymap_png.h
-jigglypuff.o: $(HACK_SRC)/recanim.h
-jigglypuff.o: $(HACK_SRC)/screenhackI.h
-jigglypuff.o: $(UTILS_SRC)/colors.h
-jigglypuff.o: $(UTILS_SRC)/erase.h
-jigglypuff.o: $(UTILS_SRC)/font-retry.h
-jigglypuff.o: $(UTILS_SRC)/grabscreen.h
-jigglypuff.o: $(UTILS_SRC)/hsv.h
-jigglypuff.o: $(UTILS_SRC)/resources.h
-jigglypuff.o: $(UTILS_SRC)/usleep.h
-jigglypuff.o: $(UTILS_SRC)/visual.h
-jigglypuff.o: $(UTILS_SRC)/xft.h
-jigglypuff.o: $(UTILS_SRC)/yarandom.h
-jigglypuff.o: $(HACK_SRC)/ximage-loader.h
-jigglypuff.o: $(HACK_SRC)/xlockmoreI.h
-jigglypuff.o: $(HACK_SRC)/xlockmore.h
-jigsaw.o: ../../config.h
-jigsaw.o: $(HACK_SRC)/fps.h
-jigsaw.o: $(srcdir)/gltrackball.h
-jigsaw.o: $(srcdir)/grab-ximage.h
-jigsaw.o: $(srcdir)/normals.h
-jigsaw.o: $(HACK_SRC)/recanim.h
-jigsaw.o: $(srcdir)/rotator.h
-jigsaw.o: $(HACK_SRC)/screenhackI.h
-jigsaw.o: $(srcdir)/texfont.h
-jigsaw.o: $(UTILS_SRC)/colors.h
-jigsaw.o: $(UTILS_SRC)/erase.h
-jigsaw.o: $(UTILS_SRC)/font-retry.h
-jigsaw.o: $(UTILS_SRC)/grabscreen.h
-jigsaw.o: $(UTILS_SRC)/hsv.h
-jigsaw.o: $(UTILS_SRC)/resources.h
-jigsaw.o: $(UTILS_SRC)/spline.h
-jigsaw.o: $(UTILS_SRC)/usleep.h
-jigsaw.o: $(UTILS_SRC)/visual.h
-jigsaw.o: $(UTILS_SRC)/xft.h
-jigsaw.o: $(UTILS_SRC)/yarandom.h
-jigsaw.o: $(HACK_SRC)/xlockmoreI.h
-jigsaw.o: $(HACK_SRC)/xlockmore.h
-juggler3d.o: ../../config.h
-juggler3d.o: $(HACK_SRC)/fps.h
-juggler3d.o: $(srcdir)/gltrackball.h
-juggler3d.o: $(HACK_SRC)/recanim.h
-juggler3d.o: $(srcdir)/rotator.h
-juggler3d.o: $(HACK_SRC)/screenhackI.h
-juggler3d.o: $(srcdir)/sphere.h
-juggler3d.o: $(srcdir)/texfont.h
-juggler3d.o: $(srcdir)/tube.h
-juggler3d.o: $(UTILS_SRC)/colors.h
-juggler3d.o: $(UTILS_SRC)/erase.h
-juggler3d.o: $(UTILS_SRC)/font-retry.h
-juggler3d.o: $(UTILS_SRC)/grabscreen.h
-juggler3d.o: $(UTILS_SRC)/hsv.h
-juggler3d.o: $(UTILS_SRC)/resources.h
-juggler3d.o: $(UTILS_SRC)/usleep.h
-juggler3d.o: $(UTILS_SRC)/visual.h
-juggler3d.o: $(UTILS_SRC)/xft.h
-juggler3d.o: $(UTILS_SRC)/yarandom.h
-juggler3d.o: $(HACK_SRC)/xlockmoreI.h
-juggler3d.o: $(HACK_SRC)/xlockmore.h
-kaleidocycle.o: ../../config.h
-kaleidocycle.o: $(HACK_SRC)/fps.h
-kaleidocycle.o: $(srcdir)/gltrackball.h
-kaleidocycle.o: $(srcdir)/normals.h
-kaleidocycle.o: $(HACK_SRC)/recanim.h
-kaleidocycle.o: $(srcdir)/rotator.h
-kaleidocycle.o: $(HACK_SRC)/screenhackI.h
-kaleidocycle.o: $(UTILS_SRC)/colors.h
-kaleidocycle.o: $(UTILS_SRC)/erase.h
-kaleidocycle.o: $(UTILS_SRC)/font-retry.h
-kaleidocycle.o: $(UTILS_SRC)/grabscreen.h
-kaleidocycle.o: $(UTILS_SRC)/hsv.h
-kaleidocycle.o: $(UTILS_SRC)/resources.h
-kaleidocycle.o: $(UTILS_SRC)/usleep.h
-kaleidocycle.o: $(UTILS_SRC)/visual.h
-kaleidocycle.o: $(UTILS_SRC)/xft.h
-kaleidocycle.o: $(UTILS_SRC)/yarandom.h
-kaleidocycle.o: $(HACK_SRC)/xlockmoreI.h
-kaleidocycle.o: $(HACK_SRC)/xlockmore.h
-klein.o: ../../config.h
-klein.o: $(srcdir)/curlicue.h
-klein.o: $(HACK_SRC)/fps.h
-klein.o: $(srcdir)/glsl-utils.h
-klein.o: $(srcdir)/gltrackball.h
-klein.o: $(HACK_SRC)/recanim.h
-klein.o: $(HACK_SRC)/screenhackI.h
-klein.o: $(UTILS_SRC)/colors.h
-klein.o: $(UTILS_SRC)/erase.h
-klein.o: $(UTILS_SRC)/font-retry.h
-klein.o: $(UTILS_SRC)/grabscreen.h
-klein.o: $(UTILS_SRC)/hsv.h
-klein.o: $(UTILS_SRC)/resources.h
-klein.o: $(UTILS_SRC)/usleep.h
-klein.o: $(UTILS_SRC)/visual.h
-klein.o: $(UTILS_SRC)/xft.h
-klein.o: $(UTILS_SRC)/yarandom.h
-klein.o: $(HACK_SRC)/xlockmoreI.h
-klein.o: $(HACK_SRC)/xlockmore.h
-lament_model.o: ../../config.h
-lament_model.o: $(HACK_SRC)/fps.h
-lament_model.o: $(srcdir)/gllist.h
-lament_model.o: $(HACK_SRC)/recanim.h
-lament_model.o: $(HACK_SRC)/screenhackI.h
-lament_model.o: $(UTILS_SRC)/colors.h
-lament_model.o: $(UTILS_SRC)/erase.h
-lament_model.o: $(UTILS_SRC)/font-retry.h
-lament_model.o: $(UTILS_SRC)/grabscreen.h
-lament_model.o: $(UTILS_SRC)/hsv.h
-lament_model.o: $(UTILS_SRC)/resources.h
-lament_model.o: $(UTILS_SRC)/usleep.h
-lament_model.o: $(UTILS_SRC)/visual.h
-lament_model.o: $(UTILS_SRC)/xft.h
-lament_model.o: $(UTILS_SRC)/yarandom.h
-lament_model.o: $(HACK_SRC)/xlockmoreI.h
-lament.o: ../../config.h
-lament.o: $(HACK_SRC)/fps.h
-lament.o: $(srcdir)/gllist.h
-lament.o: $(srcdir)/gltrackball.h
-lament.o: ../images/gen/lament512_png.h
-lament.o: $(srcdir)/normals.h
-lament.o: $(HACK_SRC)/recanim.h
-lament.o: $(srcdir)/rotator.h
-lament.o: $(HACK_SRC)/screenhackI.h
-lament.o: $(UTILS_SRC)/colors.h
-lament.o: $(UTILS_SRC)/erase.h
-lament.o: $(UTILS_SRC)/font-retry.h
-lament.o: $(UTILS_SRC)/grabscreen.h
-lament.o: $(UTILS_SRC)/hsv.h
-lament.o: $(UTILS_SRC)/resources.h
-lament.o: $(UTILS_SRC)/usleep.h
-lament.o: $(UTILS_SRC)/visual.h
-lament.o: $(UTILS_SRC)/xft.h
-lament.o: $(UTILS_SRC)/yarandom.h
-lament.o: $(HACK_SRC)/ximage-loader.h
-lament.o: $(HACK_SRC)/xlockmoreI.h
-lament.o: $(HACK_SRC)/xlockmore.h
-lavalite.o: ../../config.h
-lavalite.o: $(HACK_SRC)/fps.h
-lavalite.o: $(srcdir)/gltrackball.h
-lavalite.o: $(srcdir)/marching.h
-lavalite.o: $(HACK_SRC)/recanim.h
-lavalite.o: $(srcdir)/rotator.h
-lavalite.o: $(HACK_SRC)/screenhackI.h
-lavalite.o: $(UTILS_SRC)/colors.h
-lavalite.o: $(UTILS_SRC)/erase.h
-lavalite.o: $(UTILS_SRC)/font-retry.h
-lavalite.o: $(UTILS_SRC)/grabscreen.h
-lavalite.o: $(UTILS_SRC)/hsv.h
-lavalite.o: $(UTILS_SRC)/resources.h
-lavalite.o: $(UTILS_SRC)/usleep.h
-lavalite.o: $(UTILS_SRC)/visual.h
-lavalite.o: $(UTILS_SRC)/xft.h
-lavalite.o: $(UTILS_SRC)/yarandom.h
-lavalite.o: $(HACK_SRC)/ximage-loader.h
-lavalite.o: $(HACK_SRC)/xlockmoreI.h
-lavalite.o: $(HACK_SRC)/xlockmore.h
-lockward.o: ../../config.h
-lockward.o: $(HACK_SRC)/fps.h
-lockward.o: $(HACK_SRC)/recanim.h
-lockward.o: $(HACK_SRC)/screenhackI.h
-lockward.o: $(UTILS_SRC)/colors.h
-lockward.o: $(UTILS_SRC)/erase.h
-lockward.o: $(UTILS_SRC)/font-retry.h
-lockward.o: $(UTILS_SRC)/grabscreen.h
-lockward.o: $(UTILS_SRC)/hsv.h
-lockward.o: $(UTILS_SRC)/resources.h
-lockward.o: $(UTILS_SRC)/usleep.h
-lockward.o: $(UTILS_SRC)/visual.h
-lockward.o: $(UTILS_SRC)/xft.h
-lockward.o: $(UTILS_SRC)/yarandom.h
-lockward.o: $(HACK_SRC)/xlockmoreI.h
-lockward.o: $(HACK_SRC)/xlockmore.h
-marching.o: ../../config.h
-marching.o: $(HACK_SRC)/fps.h
-marching.o: $(srcdir)/marching.h
-marching.o: $(srcdir)/normals.h
-marching.o: $(HACK_SRC)/recanim.h
-marching.o: $(HACK_SRC)/screenhackI.h
-marching.o: $(UTILS_SRC)/colors.h
-marching.o: $(UTILS_SRC)/font-retry.h
-marching.o: $(UTILS_SRC)/grabscreen.h
-marching.o: $(UTILS_SRC)/hsv.h
-marching.o: $(UTILS_SRC)/resources.h
-marching.o: $(UTILS_SRC)/usleep.h
-marching.o: $(UTILS_SRC)/visual.h
-marching.o: $(UTILS_SRC)/xft.h
-marching.o: $(UTILS_SRC)/yarandom.h
-maze3d.o: ../../config.h
-maze3d.o: $(HACK_SRC)/fps.h
-maze3d.o: ../images/gen/bob_png.h
-maze3d.o: ../images/gen/brick1_png.h
-maze3d.o: ../images/gen/brick2_png.h
-maze3d.o: ../images/gen/logo-32_png.h
-maze3d.o: ../images/gen/start_png.h
-maze3d.o: ../images/gen/wood2_png.h
-maze3d.o: $(HACK_SRC)/recanim.h
-maze3d.o: $(HACK_SRC)/screenhackI.h
-maze3d.o: $(UTILS_SRC)/colors.h
-maze3d.o: $(UTILS_SRC)/erase.h
-maze3d.o: $(UTILS_SRC)/font-retry.h
-maze3d.o: $(UTILS_SRC)/grabscreen.h
-maze3d.o: $(UTILS_SRC)/hsv.h
-maze3d.o: $(UTILS_SRC)/resources.h
-maze3d.o: $(UTILS_SRC)/usleep.h
-maze3d.o: $(UTILS_SRC)/visual.h
-maze3d.o: $(UTILS_SRC)/xft.h
-maze3d.o: $(UTILS_SRC)/yarandom.h
-maze3d.o: $(HACK_SRC)/ximage-loader.h
-maze3d.o: $(HACK_SRC)/xlockmoreI.h
-maze3d.o: $(HACK_SRC)/xlockmore.h
-menger.o: ../../config.h
-menger.o: $(HACK_SRC)/fps.h
-menger.o: $(srcdir)/gltrackball.h
-menger.o: $(HACK_SRC)/recanim.h
-menger.o: $(srcdir)/rotator.h
-menger.o: $(HACK_SRC)/screenhackI.h
-menger.o: $(UTILS_SRC)/colors.h
-menger.o: $(UTILS_SRC)/erase.h
-menger.o: $(UTILS_SRC)/font-retry.h
-menger.o: $(UTILS_SRC)/grabscreen.h
-menger.o: $(UTILS_SRC)/hsv.h
-menger.o: $(UTILS_SRC)/resources.h
-menger.o: $(UTILS_SRC)/usleep.h
-menger.o: $(UTILS_SRC)/visual.h
-menger.o: $(UTILS_SRC)/xft.h
-menger.o: $(UTILS_SRC)/yarandom.h
-menger.o: $(HACK_SRC)/xlockmoreI.h
-menger.o: $(HACK_SRC)/xlockmore.h
-mirrorblob.o: ../../config.h
-mirrorblob.o: $(HACK_SRC)/fps.h
-mirrorblob.o: $(srcdir)/gltrackball.h
-mirrorblob.o: $(srcdir)/grab-ximage.h
-mirrorblob.o: $(HACK_SRC)/recanim.h
-mirrorblob.o: $(HACK_SRC)/screenhackI.h
-mirrorblob.o: $(UTILS_SRC)/colors.h
-mirrorblob.o: $(UTILS_SRC)/erase.h
-mirrorblob.o: $(UTILS_SRC)/font-retry.h
-mirrorblob.o: $(UTILS_SRC)/grabscreen.h
-mirrorblob.o: $(UTILS_SRC)/hsv.h
-mirrorblob.o: $(UTILS_SRC)/resources.h
-mirrorblob.o: $(UTILS_SRC)/usleep.h
-mirrorblob.o: $(UTILS_SRC)/visual.h
-mirrorblob.o: $(UTILS_SRC)/xft.h
-mirrorblob.o: $(UTILS_SRC)/yarandom.h
-mirrorblob.o: $(HACK_SRC)/xlockmoreI.h
-mirrorblob.o: $(HACK_SRC)/xlockmore.h
-moebiusgears.o: ../../config.h
-moebiusgears.o: $(HACK_SRC)/fps.h
-moebiusgears.o: $(srcdir)/gltrackball.h
-moebiusgears.o: $(srcdir)/involute.h
-moebiusgears.o: $(srcdir)/normals.h
-moebiusgears.o: $(HACK_SRC)/recanim.h
-moebiusgears.o: $(srcdir)/rotator.h
-moebiusgears.o: $(HACK_SRC)/screenhackI.h
-moebiusgears.o: $(UTILS_SRC)/colors.h
-moebiusgears.o: $(UTILS_SRC)/erase.h
-moebiusgears.o: $(UTILS_SRC)/font-retry.h
-moebiusgears.o: $(UTILS_SRC)/grabscreen.h
-moebiusgears.o: $(UTILS_SRC)/hsv.h
-moebiusgears.o: $(UTILS_SRC)/resources.h
-moebiusgears.o: $(UTILS_SRC)/usleep.h
-moebiusgears.o: $(UTILS_SRC)/visual.h
-moebiusgears.o: $(UTILS_SRC)/xft.h
-moebiusgears.o: $(UTILS_SRC)/yarandom.h
-moebiusgears.o: $(HACK_SRC)/xlockmoreI.h
-moebiusgears.o: $(HACK_SRC)/xlockmore.h
-moebius.o: ../../config.h
-moebius.o: $(HACK_SRC)/fps.h
-moebius.o: $(srcdir)/gltrackball.h
-moebius.o: $(HACK_SRC)/recanim.h
-moebius.o: $(srcdir)/rotator.h
-moebius.o: $(HACK_SRC)/screenhackI.h
-moebius.o: $(srcdir)/sphere.h
-moebius.o: $(srcdir)/tube.h
-moebius.o: $(UTILS_SRC)/colors.h
-moebius.o: $(UTILS_SRC)/erase.h
-moebius.o: $(UTILS_SRC)/font-retry.h
-moebius.o: $(UTILS_SRC)/grabscreen.h
-moebius.o: $(UTILS_SRC)/hsv.h
-moebius.o: $(UTILS_SRC)/resources.h
-moebius.o: $(UTILS_SRC)/usleep.h
-moebius.o: $(UTILS_SRC)/visual.h
-moebius.o: $(UTILS_SRC)/xft.h
-moebius.o: $(UTILS_SRC)/yarandom.h
-moebius.o: $(HACK_SRC)/xlockmoreI.h
-moebius.o: $(HACK_SRC)/xlockmore.h
-molecule.o: ../../config.h
-molecule.o: $(HACK_SRC)/fps.h
-molecule.o: $(srcdir)/gltrackball.h
-molecule.o: molecules.h
-molecule.o: $(HACK_SRC)/recanim.h
-molecule.o: $(srcdir)/rotator.h
-molecule.o: $(HACK_SRC)/screenhackI.h
-molecule.o: $(srcdir)/sphere.h
-molecule.o: $(srcdir)/texfont.h
-molecule.o: $(srcdir)/tube.h
-molecule.o: $(UTILS_SRC)/colors.h
-molecule.o: $(UTILS_SRC)/erase.h
-molecule.o: $(UTILS_SRC)/font-retry.h
-molecule.o: $(UTILS_SRC)/grabscreen.h
-molecule.o: $(UTILS_SRC)/hsv.h
-molecule.o: $(UTILS_SRC)/resources.h
-molecule.o: $(UTILS_SRC)/usleep.h
-molecule.o: $(UTILS_SRC)/visual.h
-molecule.o: $(UTILS_SRC)/xft.h
-molecule.o: $(UTILS_SRC)/yarandom.h
-molecule.o: $(HACK_SRC)/xlockmoreI.h
-molecule.o: $(HACK_SRC)/xlockmore.h
-morph3d.o: ../../config.h
-morph3d.o: $(HACK_SRC)/fps.h
-morph3d.o: $(HACK_SRC)/recanim.h
-morph3d.o: $(HACK_SRC)/screenhackI.h
-morph3d.o: $(UTILS_SRC)/colors.h
-morph3d.o: $(UTILS_SRC)/erase.h
-morph3d.o: $(UTILS_SRC)/font-retry.h
-morph3d.o: $(UTILS_SRC)/grabscreen.h
-morph3d.o: $(UTILS_SRC)/hsv.h
-morph3d.o: $(UTILS_SRC)/resources.h
-morph3d.o: $(UTILS_SRC)/usleep.h
-morph3d.o: $(UTILS_SRC)/visual.h
-morph3d.o: $(UTILS_SRC)/xft.h
-morph3d.o: $(UTILS_SRC)/yarandom.h
-morph3d.o: $(HACK_SRC)/xlockmoreI.h
-morph3d.o: $(HACK_SRC)/xlockmore.h
-noof.o: ../../config.h
-noof.o: $(HACK_SRC)/fps.h
-noof.o: $(HACK_SRC)/recanim.h
-noof.o: $(HACK_SRC)/screenhackI.h
-noof.o: $(UTILS_SRC)/colors.h
-noof.o: $(UTILS_SRC)/erase.h
-noof.o: $(UTILS_SRC)/font-retry.h
-noof.o: $(UTILS_SRC)/grabscreen.h
-noof.o: $(UTILS_SRC)/hsv.h
-noof.o: $(UTILS_SRC)/pow2.h
-noof.o: $(UTILS_SRC)/resources.h
-noof.o: $(UTILS_SRC)/usleep.h
-noof.o: $(UTILS_SRC)/visual.h
-noof.o: $(UTILS_SRC)/xft.h
-noof.o: $(UTILS_SRC)/yarandom.h
-noof.o: $(HACK_SRC)/xlockmoreI.h
-noof.o: $(HACK_SRC)/xlockmore.h
-normals.o: ../../config.h
-normals.o: $(HACK_SRC)/fps.h
-normals.o: $(srcdir)/normals.h
-normals.o: $(HACK_SRC)/recanim.h
-normals.o: $(HACK_SRC)/screenhackI.h
-normals.o: $(UTILS_SRC)/colors.h
-normals.o: $(UTILS_SRC)/font-retry.h
-normals.o: $(UTILS_SRC)/grabscreen.h
-normals.o: $(UTILS_SRC)/hsv.h
-normals.o: $(UTILS_SRC)/resources.h
-normals.o: $(UTILS_SRC)/usleep.h
-normals.o: $(UTILS_SRC)/visual.h
-normals.o: $(UTILS_SRC)/xft.h
-normals.o: $(UTILS_SRC)/yarandom.h
-peepers.o: ../../config.h
-peepers.o: $(HACK_SRC)/fps.h
-peepers.o: $(srcdir)/gltrackball.h
-peepers.o: ../images/gen/iris_png.h
-peepers.o: ../images/gen/sclera_png.h
-peepers.o: $(srcdir)/normals.h
-peepers.o: $(HACK_SRC)/recanim.h
-peepers.o: $(srcdir)/rotator.h
-peepers.o: $(HACK_SRC)/screenhackI.h
-peepers.o: $(UTILS_SRC)/colors.h
-peepers.o: $(UTILS_SRC)/erase.h
-peepers.o: $(UTILS_SRC)/font-retry.h
-peepers.o: $(UTILS_SRC)/grabscreen.h
-peepers.o: $(UTILS_SRC)/hsv.h
-peepers.o: $(UTILS_SRC)/resources.h
-peepers.o: $(UTILS_SRC)/usleep.h
-peepers.o: $(UTILS_SRC)/visual.h
-peepers.o: $(UTILS_SRC)/xft.h
-peepers.o: $(UTILS_SRC)/yarandom.h
-peepers.o: $(HACK_SRC)/ximage-loader.h
-peepers.o: $(HACK_SRC)/xlockmoreI.h
-peepers.o: $(HACK_SRC)/xlockmore.h
-photopile.o: ../../config.h
-photopile.o: $(srcdir)/dropshadow.h
-photopile.o: $(HACK_SRC)/fps.h
-photopile.o: $(srcdir)/grab-ximage.h
-photopile.o: $(HACK_SRC)/recanim.h
-photopile.o: $(HACK_SRC)/screenhackI.h
-photopile.o: $(srcdir)/texfont.h
-photopile.o: $(UTILS_SRC)/colors.h
-photopile.o: $(UTILS_SRC)/erase.h
-photopile.o: $(UTILS_SRC)/font-retry.h
-photopile.o: $(UTILS_SRC)/grabscreen.h
-photopile.o: $(UTILS_SRC)/hsv.h
-photopile.o: $(UTILS_SRC)/resources.h
-photopile.o: $(UTILS_SRC)/usleep.h
-photopile.o: $(UTILS_SRC)/visual.h
-photopile.o: $(UTILS_SRC)/xft.h
-photopile.o: $(UTILS_SRC)/yarandom.h
-photopile.o: $(HACK_SRC)/xlockmoreI.h
-photopile.o: $(HACK_SRC)/xlockmore.h
-pinion.o: ../../config.h
-pinion.o: $(HACK_SRC)/fps.h
-pinion.o: $(srcdir)/gltrackball.h
-pinion.o: $(srcdir)/involute.h
-pinion.o: $(srcdir)/normals.h
-pinion.o: $(HACK_SRC)/recanim.h
-pinion.o: $(HACK_SRC)/screenhackI.h
-pinion.o: $(srcdir)/texfont.h
-pinion.o: $(UTILS_SRC)/colors.h
-pinion.o: $(UTILS_SRC)/erase.h
-pinion.o: $(UTILS_SRC)/font-retry.h
-pinion.o: $(UTILS_SRC)/grabscreen.h
-pinion.o: $(UTILS_SRC)/hsv.h
-pinion.o: $(UTILS_SRC)/resources.h
-pinion.o: $(UTILS_SRC)/usleep.h
-pinion.o: $(UTILS_SRC)/visual.h
-pinion.o: $(UTILS_SRC)/xft.h
-pinion.o: $(UTILS_SRC)/yarandom.h
-pinion.o: $(HACK_SRC)/xlockmoreI.h
-pinion.o: $(HACK_SRC)/xlockmore.h
-pipeobjs.o: $(srcdir)/buildlwo.h
-pipeobjs.o: ../../config.h
-pipeobjs.o: $(HACK_SRC)/fps.h
-pipeobjs.o: $(HACK_SRC)/recanim.h
-pipeobjs.o: $(HACK_SRC)/screenhackI.h
-pipeobjs.o: $(UTILS_SRC)/colors.h
-pipeobjs.o: $(UTILS_SRC)/font-retry.h
-pipeobjs.o: $(UTILS_SRC)/grabscreen.h
-pipeobjs.o: $(UTILS_SRC)/hsv.h
-pipeobjs.o: $(UTILS_SRC)/resources.h
-pipeobjs.o: $(UTILS_SRC)/usleep.h
-pipeobjs.o: $(UTILS_SRC)/visual.h
-pipeobjs.o: $(UTILS_SRC)/xft.h
-pipeobjs.o: $(UTILS_SRC)/yarandom.h
-pipes.o: $(srcdir)/buildlwo.h
-pipes.o: ../../config.h
-pipes.o: $(HACK_SRC)/fps.h
-pipes.o: $(srcdir)/gltrackball.h
-pipes.o: $(HACK_SRC)/recanim.h
-pipes.o: $(HACK_SRC)/screenhackI.h
-pipes.o: $(srcdir)/sphere.h
-pipes.o: $(srcdir)/teapot.h
-pipes.o: $(UTILS_SRC)/colors.h
-pipes.o: $(UTILS_SRC)/erase.h
-pipes.o: $(UTILS_SRC)/font-retry.h
-pipes.o: $(UTILS_SRC)/grabscreen.h
-pipes.o: $(UTILS_SRC)/hsv.h
-pipes.o: $(UTILS_SRC)/resources.h
-pipes.o: $(UTILS_SRC)/usleep.h
-pipes.o: $(UTILS_SRC)/visual.h
-pipes.o: $(UTILS_SRC)/xft.h
-pipes.o: $(UTILS_SRC)/yarandom.h
-pipes.o: $(HACK_SRC)/xlockmoreI.h
-pipes.o: $(HACK_SRC)/xlockmore.h
-polyhedra-gl.o: ../../config.h
-polyhedra-gl.o: $(HACK_SRC)/fps.h
-polyhedra-gl.o: $(srcdir)/gltrackball.h
-polyhedra-gl.o: $(srcdir)/normals.h
-polyhedra-gl.o: $(srcdir)/polyhedra.h
-polyhedra-gl.o: $(HACK_SRC)/recanim.h
-polyhedra-gl.o: $(srcdir)/rotator.h
-polyhedra-gl.o: $(HACK_SRC)/screenhackI.h
-polyhedra-gl.o: $(srcdir)/teapot.h
-polyhedra-gl.o: $(srcdir)/texfont.h
-polyhedra-gl.o: $(UTILS_SRC)/colors.h
-polyhedra-gl.o: $(UTILS_SRC)/erase.h
-polyhedra-gl.o: $(UTILS_SRC)/font-retry.h
-polyhedra-gl.o: $(UTILS_SRC)/grabscreen.h
-polyhedra-gl.o: $(UTILS_SRC)/hsv.h
-polyhedra-gl.o: $(UTILS_SRC)/resources.h
-polyhedra-gl.o: $(UTILS_SRC)/usleep.h
-polyhedra-gl.o: $(UTILS_SRC)/visual.h
-polyhedra-gl.o: $(UTILS_SRC)/xft.h
-polyhedra-gl.o: $(UTILS_SRC)/yarandom.h
-polyhedra-gl.o: $(HACK_SRC)/xlockmoreI.h
-polyhedra-gl.o: $(HACK_SRC)/xlockmore.h
-polyhedra.o: ../../config.h
-polyhedra.o: $(srcdir)/polyhedra.h
-polytopes.o: ../../config.h
-polytopes.o: $(HACK_SRC)/fps.h
-polytopes.o: $(srcdir)/gltrackball.h
-polytopes.o: $(HACK_SRC)/recanim.h
-polytopes.o: $(HACK_SRC)/screenhackI.h
-polytopes.o: $(UTILS_SRC)/colors.h
-polytopes.o: $(UTILS_SRC)/erase.h
-polytopes.o: $(UTILS_SRC)/font-retry.h
-polytopes.o: $(UTILS_SRC)/grabscreen.h
-polytopes.o: $(UTILS_SRC)/hsv.h
-polytopes.o: $(UTILS_SRC)/resources.h
-polytopes.o: $(UTILS_SRC)/usleep.h
-polytopes.o: $(UTILS_SRC)/visual.h
-polytopes.o: $(UTILS_SRC)/xft.h
-polytopes.o: $(UTILS_SRC)/yarandom.h
-polytopes.o: $(HACK_SRC)/xlockmoreI.h
-polytopes.o: $(HACK_SRC)/xlockmore.h
-projectiveplane.o: ../../config.h
-projectiveplane.o: $(srcdir)/curlicue.h
-projectiveplane.o: $(HACK_SRC)/fps.h
-projectiveplane.o: $(srcdir)/glsl-utils.h
-projectiveplane.o: $(srcdir)/gltrackball.h
-projectiveplane.o: $(HACK_SRC)/recanim.h
-projectiveplane.o: $(HACK_SRC)/screenhackI.h
-projectiveplane.o: $(UTILS_SRC)/colors.h
-projectiveplane.o: $(UTILS_SRC)/erase.h
-projectiveplane.o: $(UTILS_SRC)/font-retry.h
-projectiveplane.o: $(UTILS_SRC)/grabscreen.h
-projectiveplane.o: $(UTILS_SRC)/hsv.h
-projectiveplane.o: $(UTILS_SRC)/resources.h
-projectiveplane.o: $(UTILS_SRC)/usleep.h
-projectiveplane.o: $(UTILS_SRC)/visual.h
-projectiveplane.o: $(UTILS_SRC)/xft.h
-projectiveplane.o: $(UTILS_SRC)/yarandom.h
-projectiveplane.o: $(HACK_SRC)/xlockmoreI.h
-projectiveplane.o: $(HACK_SRC)/xlockmore.h
-providence.o: ../../config.h
-providence.o: $(HACK_SRC)/fps.h
-providence.o: $(srcdir)/gltrackball.h
-providence.o: $(HACK_SRC)/recanim.h
-providence.o: $(HACK_SRC)/screenhackI.h
-providence.o: $(UTILS_SRC)/colors.h
-providence.o: $(UTILS_SRC)/erase.h
-providence.o: $(UTILS_SRC)/font-retry.h
-providence.o: $(UTILS_SRC)/grabscreen.h
-providence.o: $(UTILS_SRC)/hsv.h
-providence.o: $(UTILS_SRC)/resources.h
-providence.o: $(UTILS_SRC)/usleep.h
-providence.o: $(UTILS_SRC)/visual.h
-providence.o: $(UTILS_SRC)/xft.h
-providence.o: $(UTILS_SRC)/yarandom.h
-providence.o: $(HACK_SRC)/xlockmoreI.h
-providence.o: $(HACK_SRC)/xlockmore.h
-pulsar.o: ../../config.h
-pulsar.o: $(HACK_SRC)/fps.h
-pulsar.o: $(HACK_SRC)/recanim.h
-pulsar.o: $(HACK_SRC)/screenhackI.h
-pulsar.o: $(UTILS_SRC)/colors.h
-pulsar.o: $(UTILS_SRC)/erase.h
-pulsar.o: $(UTILS_SRC)/font-retry.h
-pulsar.o: $(UTILS_SRC)/grabscreen.h
-pulsar.o: $(UTILS_SRC)/hsv.h
-pulsar.o: $(UTILS_SRC)/resources.h
-pulsar.o: $(UTILS_SRC)/usleep.h
-pulsar.o: $(UTILS_SRC)/visual.h
-pulsar.o: $(UTILS_SRC)/xft.h
-pulsar.o: $(UTILS_SRC)/yarandom.h
-pulsar.o: $(HACK_SRC)/ximage-loader.h
-pulsar.o: $(HACK_SRC)/xlockmoreI.h
-pulsar.o: $(HACK_SRC)/xlockmore.h
-quasicrystal.o: ../../config.h
-quasicrystal.o: $(HACK_SRC)/fps.h
-quasicrystal.o: $(HACK_SRC)/recanim.h
-quasicrystal.o: $(srcdir)/rotator.h
-quasicrystal.o: $(HACK_SRC)/screenhackI.h
-quasicrystal.o: $(UTILS_SRC)/colors.h
-quasicrystal.o: $(UTILS_SRC)/erase.h
-quasicrystal.o: $(UTILS_SRC)/font-retry.h
-quasicrystal.o: $(UTILS_SRC)/grabscreen.h
-quasicrystal.o: $(UTILS_SRC)/hsv.h
-quasicrystal.o: $(UTILS_SRC)/resources.h
-quasicrystal.o: $(UTILS_SRC)/usleep.h
-quasicrystal.o: $(UTILS_SRC)/visual.h
-quasicrystal.o: $(UTILS_SRC)/xft.h
-quasicrystal.o: $(UTILS_SRC)/yarandom.h
-quasicrystal.o: $(HACK_SRC)/xlockmoreI.h
-quasicrystal.o: $(HACK_SRC)/xlockmore.h
-queens.o: $(srcdir)/chessmodels.h
-queens.o: ../../config.h
-queens.o: $(HACK_SRC)/fps.h
-queens.o: $(srcdir)/gltrackball.h
-queens.o: $(HACK_SRC)/recanim.h
-queens.o: $(HACK_SRC)/screenhackI.h
-queens.o: $(UTILS_SRC)/colors.h
-queens.o: $(UTILS_SRC)/erase.h
-queens.o: $(UTILS_SRC)/font-retry.h
-queens.o: $(UTILS_SRC)/grabscreen.h
-queens.o: $(UTILS_SRC)/hsv.h
-queens.o: $(UTILS_SRC)/resources.h
-queens.o: $(UTILS_SRC)/usleep.h
-queens.o: $(UTILS_SRC)/visual.h
-queens.o: $(UTILS_SRC)/xft.h
-queens.o: $(UTILS_SRC)/yarandom.h
-queens.o: $(HACK_SRC)/xlockmoreI.h
-queens.o: $(HACK_SRC)/xlockmore.h
-quickhull.o: ../../config.h
-quickhull.o: $(HACK_SRC)/fps.h
-quickhull.o: $(srcdir)/quickhull.h
-quickhull.o: $(HACK_SRC)/recanim.h
-quickhull.o: $(HACK_SRC)/screenhackI.h
-quickhull.o: $(UTILS_SRC)/colors.h
-quickhull.o: $(UTILS_SRC)/font-retry.h
-quickhull.o: $(UTILS_SRC)/grabscreen.h
-quickhull.o: $(UTILS_SRC)/hsv.h
-quickhull.o: $(UTILS_SRC)/resources.h
-quickhull.o: $(UTILS_SRC)/usleep.h
-quickhull.o: $(UTILS_SRC)/visual.h
-quickhull.o: $(UTILS_SRC)/xft.h
-quickhull.o: $(UTILS_SRC)/yarandom.h
-raverhoop.o: ../../config.h
-raverhoop.o: $(HACK_SRC)/fps.h
-raverhoop.o: $(srcdir)/gltrackball.h
-raverhoop.o: $(HACK_SRC)/recanim.h
-raverhoop.o: $(srcdir)/rotator.h
-raverhoop.o: $(HACK_SRC)/screenhackI.h
-raverhoop.o: $(UTILS_SRC)/colors.h
-raverhoop.o: $(UTILS_SRC)/erase.h
-raverhoop.o: $(UTILS_SRC)/font-retry.h
-raverhoop.o: $(UTILS_SRC)/grabscreen.h
-raverhoop.o: $(UTILS_SRC)/hsv.h
-raverhoop.o: $(UTILS_SRC)/resources.h
-raverhoop.o: $(UTILS_SRC)/usleep.h
-raverhoop.o: $(UTILS_SRC)/visual.h
-raverhoop.o: $(UTILS_SRC)/xft.h
-raverhoop.o: $(UTILS_SRC)/yarandom.h
-raverhoop.o: $(HACK_SRC)/xlockmoreI.h
-raverhoop.o: $(HACK_SRC)/xlockmore.h
-razzledazzle.o: ../../config.h
-razzledazzle.o: $(HACK_SRC)/fps.h
-razzledazzle.o: $(srcdir)/gllist.h
-razzledazzle.o: $(srcdir)/normals.h
-razzledazzle.o: $(HACK_SRC)/recanim.h
-razzledazzle.o: $(HACK_SRC)/screenhackI.h
-razzledazzle.o: $(UTILS_SRC)/colors.h
-razzledazzle.o: $(UTILS_SRC)/erase.h
-razzledazzle.o: $(UTILS_SRC)/font-retry.h
-razzledazzle.o: $(UTILS_SRC)/grabscreen.h
-razzledazzle.o: $(UTILS_SRC)/hsv.h
-razzledazzle.o: $(UTILS_SRC)/resources.h
-razzledazzle.o: $(UTILS_SRC)/usleep.h
-razzledazzle.o: $(UTILS_SRC)/visual.h
-razzledazzle.o: $(UTILS_SRC)/xft.h
-razzledazzle.o: $(UTILS_SRC)/yarandom.h
-razzledazzle.o: $(HACK_SRC)/xlockmoreI.h
-razzledazzle.o: $(HACK_SRC)/xlockmore.h
-robot.o: ../../config.h
-robot.o: $(HACK_SRC)/fps.h
-robot.o: $(srcdir)/gllist.h
-robot.o: $(HACK_SRC)/recanim.h
-robot.o: $(HACK_SRC)/screenhackI.h
-robot.o: $(UTILS_SRC)/colors.h
-robot.o: $(UTILS_SRC)/erase.h
-robot.o: $(UTILS_SRC)/font-retry.h
-robot.o: $(UTILS_SRC)/grabscreen.h
-robot.o: $(UTILS_SRC)/hsv.h
-robot.o: $(UTILS_SRC)/resources.h
-robot.o: $(UTILS_SRC)/usleep.h
-robot.o: $(UTILS_SRC)/visual.h
-robot.o: $(UTILS_SRC)/xft.h
-robot.o: $(UTILS_SRC)/yarandom.h
-robot.o: $(HACK_SRC)/xlockmoreI.h
-robot-wireframe.o: ../../config.h
-robot-wireframe.o: $(HACK_SRC)/fps.h
-robot-wireframe.o: $(srcdir)/gllist.h
-robot-wireframe.o: $(HACK_SRC)/recanim.h
-robot-wireframe.o: $(HACK_SRC)/screenhackI.h
-robot-wireframe.o: $(UTILS_SRC)/colors.h
-robot-wireframe.o: $(UTILS_SRC)/erase.h
-robot-wireframe.o: $(UTILS_SRC)/font-retry.h
-robot-wireframe.o: $(UTILS_SRC)/grabscreen.h
-robot-wireframe.o: $(UTILS_SRC)/hsv.h
-robot-wireframe.o: $(UTILS_SRC)/resources.h
-robot-wireframe.o: $(UTILS_SRC)/usleep.h
-robot-wireframe.o: $(UTILS_SRC)/visual.h
-robot-wireframe.o: $(UTILS_SRC)/xft.h
-robot-wireframe.o: $(UTILS_SRC)/yarandom.h
-robot-wireframe.o: $(HACK_SRC)/xlockmoreI.h
-romanboy.o: ../../config.h
-romanboy.o: $(srcdir)/curlicue.h
-romanboy.o: $(HACK_SRC)/fps.h
-romanboy.o: $(srcdir)/glsl-utils.h
-romanboy.o: $(srcdir)/gltrackball.h
-romanboy.o: $(HACK_SRC)/recanim.h
-romanboy.o: $(HACK_SRC)/screenhackI.h
-romanboy.o: $(UTILS_SRC)/colors.h
-romanboy.o: $(UTILS_SRC)/erase.h
-romanboy.o: $(UTILS_SRC)/font-retry.h
-romanboy.o: $(UTILS_SRC)/grabscreen.h
-romanboy.o: $(UTILS_SRC)/hsv.h
-romanboy.o: $(UTILS_SRC)/resources.h
-romanboy.o: $(UTILS_SRC)/usleep.h
-romanboy.o: $(UTILS_SRC)/visual.h
-romanboy.o: $(UTILS_SRC)/xft.h
-romanboy.o: $(UTILS_SRC)/yarandom.h
-romanboy.o: $(HACK_SRC)/xlockmoreI.h
-romanboy.o: $(HACK_SRC)/xlockmore.h
-rotator.o: ../../config.h
-rotator.o: $(srcdir)/rotator.h
-rotator.o: $(UTILS_SRC)/yarandom.h
-rubikblocks.o: ../../config.h
-rubikblocks.o: $(HACK_SRC)/fps.h
-rubikblocks.o: $(srcdir)/gltrackball.h
-rubikblocks.o: $(HACK_SRC)/recanim.h
-rubikblocks.o: $(srcdir)/rotator.h
-rubikblocks.o: $(HACK_SRC)/screenhackI.h
-rubikblocks.o: $(UTILS_SRC)/colors.h
-rubikblocks.o: $(UTILS_SRC)/erase.h
-rubikblocks.o: $(UTILS_SRC)/font-retry.h
-rubikblocks.o: $(UTILS_SRC)/grabscreen.h
-rubikblocks.o: $(UTILS_SRC)/hsv.h
-rubikblocks.o: $(UTILS_SRC)/resources.h
-rubikblocks.o: $(UTILS_SRC)/usleep.h
-rubikblocks.o: $(UTILS_SRC)/visual.h
-rubikblocks.o: $(UTILS_SRC)/xft.h
-rubikblocks.o: $(UTILS_SRC)/yarandom.h
-rubikblocks.o: $(HACK_SRC)/xlockmoreI.h
-rubikblocks.o: $(HACK_SRC)/xlockmore.h
-rubik.o: ../../config.h
-rubik.o: $(HACK_SRC)/fps.h
-rubik.o: $(srcdir)/gltrackball.h
-rubik.o: $(HACK_SRC)/recanim.h
-rubik.o: $(HACK_SRC)/screenhackI.h
-rubik.o: $(UTILS_SRC)/colors.h
-rubik.o: $(UTILS_SRC)/erase.h
-rubik.o: $(UTILS_SRC)/font-retry.h
-rubik.o: $(UTILS_SRC)/grabscreen.h
-rubik.o: $(UTILS_SRC)/hsv.h
-rubik.o: $(UTILS_SRC)/resources.h
-rubik.o: $(UTILS_SRC)/usleep.h
-rubik.o: $(UTILS_SRC)/visual.h
-rubik.o: $(UTILS_SRC)/xft.h
-rubik.o: $(UTILS_SRC)/yarandom.h
-rubik.o: $(HACK_SRC)/xlockmoreI.h
-rubik.o: $(HACK_SRC)/xlockmore.h
-s1_1.o: ../../config.h
-s1_1.o: $(HACK_SRC)/fps.h
-s1_1.o: $(srcdir)/gllist.h
-s1_1.o: $(HACK_SRC)/recanim.h
-s1_1.o: $(HACK_SRC)/screenhackI.h
-s1_1.o: $(UTILS_SRC)/colors.h
-s1_1.o: $(UTILS_SRC)/erase.h
-s1_1.o: $(UTILS_SRC)/font-retry.h
-s1_1.o: $(UTILS_SRC)/grabscreen.h
-s1_1.o: $(UTILS_SRC)/hsv.h
-s1_1.o: $(UTILS_SRC)/resources.h
-s1_1.o: $(UTILS_SRC)/usleep.h
-s1_1.o: $(UTILS_SRC)/visual.h
-s1_1.o: $(UTILS_SRC)/xft.h
-s1_1.o: $(UTILS_SRC)/yarandom.h
-s1_1.o: $(HACK_SRC)/xlockmoreI.h
-s1_2.o: ../../config.h
-s1_2.o: $(HACK_SRC)/fps.h
-s1_2.o: $(srcdir)/gllist.h
-s1_2.o: $(HACK_SRC)/recanim.h
-s1_2.o: $(HACK_SRC)/screenhackI.h
-s1_2.o: $(UTILS_SRC)/colors.h
-s1_2.o: $(UTILS_SRC)/erase.h
-s1_2.o: $(UTILS_SRC)/font-retry.h
-s1_2.o: $(UTILS_SRC)/grabscreen.h
-s1_2.o: $(UTILS_SRC)/hsv.h
-s1_2.o: $(UTILS_SRC)/resources.h
-s1_2.o: $(UTILS_SRC)/usleep.h
-s1_2.o: $(UTILS_SRC)/visual.h
-s1_2.o: $(UTILS_SRC)/xft.h
-s1_2.o: $(UTILS_SRC)/yarandom.h
-s1_2.o: $(HACK_SRC)/xlockmoreI.h
-s1_3.o: ../../config.h
-s1_3.o: $(HACK_SRC)/fps.h
-s1_3.o: $(srcdir)/gllist.h
-s1_3.o: $(HACK_SRC)/recanim.h
-s1_3.o: $(HACK_SRC)/screenhackI.h
-s1_3.o: $(UTILS_SRC)/colors.h
-s1_3.o: $(UTILS_SRC)/erase.h
-s1_3.o: $(UTILS_SRC)/font-retry.h
-s1_3.o: $(UTILS_SRC)/grabscreen.h
-s1_3.o: $(UTILS_SRC)/hsv.h
-s1_3.o: $(UTILS_SRC)/resources.h
-s1_3.o: $(UTILS_SRC)/usleep.h
-s1_3.o: $(UTILS_SRC)/visual.h
-s1_3.o: $(UTILS_SRC)/xft.h
-s1_3.o: $(UTILS_SRC)/yarandom.h
-s1_3.o: $(HACK_SRC)/xlockmoreI.h
-s1_4.o: ../../config.h
-s1_4.o: $(HACK_SRC)/fps.h
-s1_4.o: $(srcdir)/gllist.h
-s1_4.o: $(HACK_SRC)/recanim.h
-s1_4.o: $(HACK_SRC)/screenhackI.h
-s1_4.o: $(UTILS_SRC)/colors.h
-s1_4.o: $(UTILS_SRC)/erase.h
-s1_4.o: $(UTILS_SRC)/font-retry.h
-s1_4.o: $(UTILS_SRC)/grabscreen.h
-s1_4.o: $(UTILS_SRC)/hsv.h
-s1_4.o: $(UTILS_SRC)/resources.h
-s1_4.o: $(UTILS_SRC)/usleep.h
-s1_4.o: $(UTILS_SRC)/visual.h
-s1_4.o: $(UTILS_SRC)/xft.h
-s1_4.o: $(UTILS_SRC)/yarandom.h
-s1_4.o: $(HACK_SRC)/xlockmoreI.h
-s1_5.o: ../../config.h
-s1_5.o: $(HACK_SRC)/fps.h
-s1_5.o: $(srcdir)/gllist.h
-s1_5.o: $(HACK_SRC)/recanim.h
-s1_5.o: $(HACK_SRC)/screenhackI.h
-s1_5.o: $(UTILS_SRC)/colors.h
-s1_5.o: $(UTILS_SRC)/erase.h
-s1_5.o: $(UTILS_SRC)/font-retry.h
-s1_5.o: $(UTILS_SRC)/grabscreen.h
-s1_5.o: $(UTILS_SRC)/hsv.h
-s1_5.o: $(UTILS_SRC)/resources.h
-s1_5.o: $(UTILS_SRC)/usleep.h
-s1_5.o: $(UTILS_SRC)/visual.h
-s1_5.o: $(UTILS_SRC)/xft.h
-s1_5.o: $(UTILS_SRC)/yarandom.h
-s1_5.o: $(HACK_SRC)/xlockmoreI.h
-s1_6.o: ../../config.h
-s1_6.o: $(HACK_SRC)/fps.h
-s1_6.o: $(srcdir)/gllist.h
-s1_6.o: $(HACK_SRC)/recanim.h
-s1_6.o: $(HACK_SRC)/screenhackI.h
-s1_6.o: $(UTILS_SRC)/colors.h
-s1_6.o: $(UTILS_SRC)/erase.h
-s1_6.o: $(UTILS_SRC)/font-retry.h
-s1_6.o: $(UTILS_SRC)/grabscreen.h
-s1_6.o: $(UTILS_SRC)/hsv.h
-s1_6.o: $(UTILS_SRC)/resources.h
-s1_6.o: $(UTILS_SRC)/usleep.h
-s1_6.o: $(UTILS_SRC)/visual.h
-s1_6.o: $(UTILS_SRC)/xft.h
-s1_6.o: $(UTILS_SRC)/yarandom.h
-s1_6.o: $(HACK_SRC)/xlockmoreI.h
-s1_b.o: ../../config.h
-s1_b.o: $(HACK_SRC)/fps.h
-s1_b.o: $(srcdir)/gllist.h
-s1_b.o: $(HACK_SRC)/recanim.h
-s1_b.o: $(HACK_SRC)/screenhackI.h
-s1_b.o: $(UTILS_SRC)/colors.h
-s1_b.o: $(UTILS_SRC)/erase.h
-s1_b.o: $(UTILS_SRC)/font-retry.h
-s1_b.o: $(UTILS_SRC)/grabscreen.h
-s1_b.o: $(UTILS_SRC)/hsv.h
-s1_b.o: $(UTILS_SRC)/resources.h
-s1_b.o: $(UTILS_SRC)/usleep.h
-s1_b.o: $(UTILS_SRC)/visual.h
-s1_b.o: $(UTILS_SRC)/xft.h
-s1_b.o: $(UTILS_SRC)/yarandom.h
-s1_b.o: $(HACK_SRC)/xlockmoreI.h
-sballs.o: ../../config.h
-sballs.o: $(HACK_SRC)/fps.h
-sballs.o: $(srcdir)/gltrackball.h
-sballs.o: ../images/gen/sball-bg_png.h
-sballs.o: ../images/gen/sball_png.h
-sballs.o: $(HACK_SRC)/recanim.h
-sballs.o: $(HACK_SRC)/screenhackI.h
-sballs.o: $(UTILS_SRC)/colors.h
-sballs.o: $(UTILS_SRC)/erase.h
-sballs.o: $(UTILS_SRC)/font-retry.h
-sballs.o: $(UTILS_SRC)/grabscreen.h
-sballs.o: $(UTILS_SRC)/hsv.h
-sballs.o: $(UTILS_SRC)/resources.h
-sballs.o: $(UTILS_SRC)/usleep.h
-sballs.o: $(UTILS_SRC)/visual.h
-sballs.o: $(UTILS_SRC)/xft.h
-sballs.o: $(UTILS_SRC)/yarandom.h
-sballs.o: $(HACK_SRC)/ximage-loader.h
-sballs.o: $(HACK_SRC)/xlockmoreI.h
-sballs.o: $(HACK_SRC)/xlockmore.h
-seccam.o: ../../config.h
-seccam.o: $(HACK_SRC)/fps.h
-seccam.o: $(srcdir)/gllist.h
-seccam.o: $(HACK_SRC)/recanim.h
-seccam.o: $(HACK_SRC)/screenhackI.h
-seccam.o: $(UTILS_SRC)/colors.h
-seccam.o: $(UTILS_SRC)/erase.h
-seccam.o: $(UTILS_SRC)/font-retry.h
-seccam.o: $(UTILS_SRC)/grabscreen.h
-seccam.o: $(UTILS_SRC)/hsv.h
-seccam.o: $(UTILS_SRC)/resources.h
-seccam.o: $(UTILS_SRC)/usleep.h
-seccam.o: $(UTILS_SRC)/visual.h
-seccam.o: $(UTILS_SRC)/xft.h
-seccam.o: $(UTILS_SRC)/yarandom.h
-seccam.o: $(HACK_SRC)/xlockmoreI.h
-shark.o: $(srcdir)/atlantis.h
-shark.o: ../../config.h
-shark.o: $(HACK_SRC)/fps.h
-shark.o: $(HACK_SRC)/recanim.h
-shark.o: $(HACK_SRC)/screenhackI.h
-shark.o: $(UTILS_SRC)/colors.h
-shark.o: $(UTILS_SRC)/erase.h
-shark.o: $(UTILS_SRC)/font-retry.h
-shark.o: $(UTILS_SRC)/grabscreen.h
-shark.o: $(UTILS_SRC)/hsv.h
-shark.o: $(UTILS_SRC)/resources.h
-shark.o: $(UTILS_SRC)/usleep.h
-shark.o: $(UTILS_SRC)/visual.h
-shark.o: $(UTILS_SRC)/xft.h
-shark.o: $(UTILS_SRC)/yarandom.h
-shark.o: $(HACK_SRC)/xlockmoreI.h
-ships.o: ../../config.h
-ships.o: $(HACK_SRC)/fps.h
-ships.o: $(srcdir)/gllist.h
-ships.o: $(HACK_SRC)/recanim.h
-ships.o: $(HACK_SRC)/screenhackI.h
-ships.o: $(UTILS_SRC)/colors.h
-ships.o: $(UTILS_SRC)/erase.h
-ships.o: $(UTILS_SRC)/font-retry.h
-ships.o: $(UTILS_SRC)/grabscreen.h
-ships.o: $(UTILS_SRC)/hsv.h
-ships.o: $(UTILS_SRC)/resources.h
-ships.o: $(UTILS_SRC)/usleep.h
-ships.o: $(UTILS_SRC)/visual.h
-ships.o: $(UTILS_SRC)/xft.h
-ships.o: $(UTILS_SRC)/yarandom.h
-ships.o: $(HACK_SRC)/xlockmoreI.h
-sierpinski3d.o: ../../config.h
-sierpinski3d.o: $(HACK_SRC)/fps.h
-sierpinski3d.o: $(srcdir)/gltrackball.h
-sierpinski3d.o: $(HACK_SRC)/recanim.h
-sierpinski3d.o: $(srcdir)/rotator.h
-sierpinski3d.o: $(HACK_SRC)/screenhackI.h
-sierpinski3d.o: $(UTILS_SRC)/colors.h
-sierpinski3d.o: $(UTILS_SRC)/erase.h
-sierpinski3d.o: $(UTILS_SRC)/font-retry.h
-sierpinski3d.o: $(UTILS_SRC)/grabscreen.h
-sierpinski3d.o: $(UTILS_SRC)/hsv.h
-sierpinski3d.o: $(UTILS_SRC)/resources.h
-sierpinski3d.o: $(UTILS_SRC)/usleep.h
-sierpinski3d.o: $(UTILS_SRC)/visual.h
-sierpinski3d.o: $(UTILS_SRC)/xft.h
-sierpinski3d.o: $(UTILS_SRC)/yarandom.h
-sierpinski3d.o: $(HACK_SRC)/xlockmoreI.h
-sierpinski3d.o: $(HACK_SRC)/xlockmore.h
-skytentacles.o: ../../config.h
-skytentacles.o: $(HACK_SRC)/fps.h
-skytentacles.o: $(srcdir)/gltrackball.h
-skytentacles.o: ../images/gen/scales_png.h
-skytentacles.o: $(srcdir)/normals.h
-skytentacles.o: $(HACK_SRC)/recanim.h
-skytentacles.o: $(srcdir)/rotator.h
-skytentacles.o: $(HACK_SRC)/screenhackI.h
-skytentacles.o: $(UTILS_SRC)/colors.h
-skytentacles.o: $(UTILS_SRC)/erase.h
-skytentacles.o: $(UTILS_SRC)/font-retry.h
-skytentacles.o: $(UTILS_SRC)/grabscreen.h
-skytentacles.o: $(UTILS_SRC)/hsv.h
-skytentacles.o: $(UTILS_SRC)/resources.h
-skytentacles.o: $(UTILS_SRC)/usleep.h
-skytentacles.o: $(UTILS_SRC)/visual.h
-skytentacles.o: $(UTILS_SRC)/xft.h
-skytentacles.o: $(UTILS_SRC)/yarandom.h
-skytentacles.o: $(HACK_SRC)/ximage-loader.h
-skytentacles.o: $(HACK_SRC)/xlockmoreI.h
-skytentacles.o: $(HACK_SRC)/xlockmore.h
-sonar-icmp.o: ../../config.h
-sonar-icmp.o: $(HACK_SRC)/fps.h
-sonar-icmp.o: $(HACK_SRC)/recanim.h
-sonar-icmp.o: $(HACK_SRC)/screenhackI.h
-sonar-icmp.o: $(srcdir)/sonar.h
-sonar-icmp.o: $(UTILS_SRC)/aligned_malloc.h
-sonar-icmp.o: $(UTILS_SRC)/async_netdb.h
-sonar-icmp.o: $(UTILS_SRC)/colors.h
-sonar-icmp.o: $(UTILS_SRC)/font-retry.h
-sonar-icmp.o: $(UTILS_SRC)/grabscreen.h
-sonar-icmp.o: $(UTILS_SRC)/hsv.h
-sonar-icmp.o: $(UTILS_SRC)/resources.h
-sonar-icmp.o: $(UTILS_SRC)/thread_util.h
-sonar-icmp.o: $(UTILS_SRC)/usleep.h
-sonar-icmp.o: $(UTILS_SRC)/version.h
-sonar-icmp.o: $(UTILS_SRC)/visual.h
-sonar-icmp.o: $(UTILS_SRC)/xft.h
-sonar-icmp.o: $(UTILS_SRC)/yarandom.h
-sonar.o: ../../config.h
-sonar.o: $(HACK_SRC)/fps.h
-sonar.o: $(srcdir)/gltrackball.h
-sonar.o: $(HACK_SRC)/recanim.h
-sonar.o: $(srcdir)/rotator.h
-sonar.o: $(HACK_SRC)/screenhackI.h
-sonar.o: $(srcdir)/sonar.h
-sonar.o: $(srcdir)/texfont.h
-sonar.o: $(UTILS_SRC)/aligned_malloc.h
-sonar.o: $(UTILS_SRC)/colors.h
-sonar.o: $(UTILS_SRC)/erase.h
-sonar.o: $(UTILS_SRC)/font-retry.h
-sonar.o: $(UTILS_SRC)/grabscreen.h
-sonar.o: $(UTILS_SRC)/hsv.h
-sonar.o: $(UTILS_SRC)/resources.h
-sonar.o: $(UTILS_SRC)/thread_util.h
-sonar.o: $(UTILS_SRC)/usleep.h
-sonar.o: $(UTILS_SRC)/visual.h
-sonar.o: $(UTILS_SRC)/xft.h
-sonar.o: $(UTILS_SRC)/yarandom.h
-sonar.o: $(HACK_SRC)/xlockmoreI.h
-sonar.o: $(HACK_SRC)/xlockmore.h
-sonar-sim.o: ../../config.h
-sonar-sim.o: $(HACK_SRC)/fps.h
-sonar-sim.o: $(HACK_SRC)/recanim.h
-sonar-sim.o: $(HACK_SRC)/screenhackI.h
-sonar-sim.o: $(srcdir)/sonar.h
-sonar-sim.o: $(UTILS_SRC)/colors.h
-sonar-sim.o: $(UTILS_SRC)/font-retry.h
-sonar-sim.o: $(UTILS_SRC)/grabscreen.h
-sonar-sim.o: $(UTILS_SRC)/hsv.h
-sonar-sim.o: $(UTILS_SRC)/resources.h
-sonar-sim.o: $(UTILS_SRC)/usleep.h
-sonar-sim.o: $(UTILS_SRC)/visual.h
-sonar-sim.o: $(UTILS_SRC)/xft.h
-sonar-sim.o: $(UTILS_SRC)/yarandom.h
-sphereeversion.o: ../../config.h
-sphereeversion.o: $(HACK_SRC)/fps.h
-sphereeversion.o: $(srcdir)/glsl-utils.h
-sphereeversion.o: $(srcdir)/gltrackball.h
-sphereeversion.o: $(HACK_SRC)/recanim.h
-sphereeversion.o: $(HACK_SRC)/screenhackI.h
-sphereeversion.o: $(UTILS_SRC)/colors.h
-sphereeversion.o: $(UTILS_SRC)/erase.h
-sphereeversion.o: $(UTILS_SRC)/font-retry.h
-sphereeversion.o: $(UTILS_SRC)/grabscreen.h
-sphereeversion.o: $(UTILS_SRC)/hsv.h
-sphereeversion.o: $(UTILS_SRC)/pow2.h
-sphereeversion.o: $(UTILS_SRC)/resources.h
-sphereeversion.o: $(UTILS_SRC)/usleep.h
-sphereeversion.o: $(UTILS_SRC)/visual.h
-sphereeversion.o: $(UTILS_SRC)/xft.h
-sphereeversion.o: $(UTILS_SRC)/yarandom.h
-sphereeversion.o: $(HACK_SRC)/xlockmoreI.h
-sphereeversion.o: $(HACK_SRC)/xlockmore.h
-spheremonics.o: ../../config.h
-spheremonics.o: $(HACK_SRC)/fps.h
-spheremonics.o: $(srcdir)/gltrackball.h
-spheremonics.o: $(srcdir)/normals.h
-spheremonics.o: $(HACK_SRC)/recanim.h
-spheremonics.o: $(srcdir)/rotator.h
-spheremonics.o: $(HACK_SRC)/screenhackI.h
-spheremonics.o: $(srcdir)/texfont.h
-spheremonics.o: $(UTILS_SRC)/colors.h
-spheremonics.o: $(UTILS_SRC)/erase.h
-spheremonics.o: $(UTILS_SRC)/font-retry.h
-spheremonics.o: $(UTILS_SRC)/grabscreen.h
-spheremonics.o: $(UTILS_SRC)/hsv.h
-spheremonics.o: $(UTILS_SRC)/resources.h
-spheremonics.o: $(UTILS_SRC)/usleep.h
-spheremonics.o: $(UTILS_SRC)/visual.h
-spheremonics.o: $(UTILS_SRC)/xft.h
-spheremonics.o: $(UTILS_SRC)/yarandom.h
-spheremonics.o: $(HACK_SRC)/xlockmoreI.h
-spheremonics.o: $(HACK_SRC)/xlockmore.h
-sphere.o: ../../config.h
-sphere.o: $(HACK_SRC)/fps.h
-sphere.o: $(HACK_SRC)/recanim.h
-sphere.o: $(HACK_SRC)/screenhackI.h
-sphere.o: $(srcdir)/sphere.h
-sphere.o: $(UTILS_SRC)/colors.h
-sphere.o: $(UTILS_SRC)/font-retry.h
-sphere.o: $(UTILS_SRC)/grabscreen.h
-sphere.o: $(UTILS_SRC)/hsv.h
-sphere.o: $(UTILS_SRC)/resources.h
-sphere.o: $(UTILS_SRC)/usleep.h
-sphere.o: $(UTILS_SRC)/visual.h
-sphere.o: $(UTILS_SRC)/xft.h
-sphere.o: $(UTILS_SRC)/yarandom.h
-splitflap.o: ../../config.h
-splitflap.o: $(HACK_SRC)/fps.h
-splitflap.o: $(srcdir)/gllist.h
-splitflap.o: $(srcdir)/gltrackball.h
-splitflap.o: $(HACK_SRC)/recanim.h
-splitflap.o: $(srcdir)/rotator.h
-splitflap.o: $(HACK_SRC)/screenhackI.h
-splitflap.o: $(srcdir)/texfont.h
-splitflap.o: $(UTILS_SRC)/colors.h
-splitflap.o: $(UTILS_SRC)/erase.h
-splitflap.o: $(UTILS_SRC)/font-retry.h
-splitflap.o: $(UTILS_SRC)/grabscreen.h
-splitflap.o: $(UTILS_SRC)/hsv.h
-splitflap.o: $(UTILS_SRC)/resources.h
-splitflap.o: $(UTILS_SRC)/textclient.h
-splitflap.o: $(UTILS_SRC)/usleep.h
-splitflap.o: $(UTILS_SRC)/utf8wc.h
-splitflap.o: $(UTILS_SRC)/visual.h
-splitflap.o: $(UTILS_SRC)/xft.h
-splitflap.o: $(UTILS_SRC)/yarandom.h
-splitflap.o: $(HACK_SRC)/ximage-loader.h
-splitflap.o: $(HACK_SRC)/xlockmoreI.h
-splitflap.o: $(HACK_SRC)/xlockmore.h
-splitflap_obj.o: ../../config.h
-splitflap_obj.o: $(HACK_SRC)/fps.h
-splitflap_obj.o: $(srcdir)/gllist.h
-splitflap_obj.o: $(HACK_SRC)/recanim.h
-splitflap_obj.o: $(HACK_SRC)/screenhackI.h
-splitflap_obj.o: $(UTILS_SRC)/colors.h
-splitflap_obj.o: $(UTILS_SRC)/erase.h
-splitflap_obj.o: $(UTILS_SRC)/font-retry.h
-splitflap_obj.o: $(UTILS_SRC)/grabscreen.h
-splitflap_obj.o: $(UTILS_SRC)/hsv.h
-splitflap_obj.o: $(UTILS_SRC)/resources.h
-splitflap_obj.o: $(UTILS_SRC)/usleep.h
-splitflap_obj.o: $(UTILS_SRC)/visual.h
-splitflap_obj.o: $(UTILS_SRC)/xft.h
-splitflap_obj.o: $(UTILS_SRC)/yarandom.h
-splitflap_obj.o: $(HACK_SRC)/xlockmoreI.h
-splodesic.o: ../../config.h
-splodesic.o: $(HACK_SRC)/fps.h
-splodesic.o: $(srcdir)/gltrackball.h
-splodesic.o: $(srcdir)/normals.h
-splodesic.o: $(HACK_SRC)/recanim.h
-splodesic.o: $(srcdir)/rotator.h
-splodesic.o: $(HACK_SRC)/screenhackI.h
-splodesic.o: $(UTILS_SRC)/colors.h
-splodesic.o: $(UTILS_SRC)/erase.h
-splodesic.o: $(UTILS_SRC)/font-retry.h
-splodesic.o: $(UTILS_SRC)/grabscreen.h
-splodesic.o: $(UTILS_SRC)/hsv.h
-splodesic.o: $(UTILS_SRC)/resources.h
-splodesic.o: $(UTILS_SRC)/usleep.h
-splodesic.o: $(UTILS_SRC)/visual.h
-splodesic.o: $(UTILS_SRC)/xft.h
-splodesic.o: $(UTILS_SRC)/yarandom.h
-splodesic.o: $(HACK_SRC)/xlockmoreI.h
-splodesic.o: $(HACK_SRC)/xlockmore.h
-sproingies.o: ../../config.h
-sproingies.o: $(HACK_SRC)/fps.h
-sproingies.o: $(srcdir)/gllist.h
-sproingies.o: $(HACK_SRC)/recanim.h
-sproingies.o: $(HACK_SRC)/screenhackI.h
-sproingies.o: $(srcdir)/sproingies.h
-sproingies.o: $(UTILS_SRC)/colors.h
-sproingies.o: $(UTILS_SRC)/erase.h
-sproingies.o: $(UTILS_SRC)/font-retry.h
-sproingies.o: $(UTILS_SRC)/grabscreen.h
-sproingies.o: $(UTILS_SRC)/hsv.h
-sproingies.o: $(UTILS_SRC)/resources.h
-sproingies.o: $(UTILS_SRC)/usleep.h
-sproingies.o: $(UTILS_SRC)/visual.h
-sproingies.o: $(UTILS_SRC)/xft.h
-sproingies.o: $(UTILS_SRC)/yarandom.h
-sproingies.o: $(HACK_SRC)/xlockmoreI.h
-sproingiewrap.o: ../../config.h
-sproingiewrap.o: $(HACK_SRC)/fps.h
-sproingiewrap.o: $(HACK_SRC)/recanim.h
-sproingiewrap.o: $(HACK_SRC)/screenhackI.h
-sproingiewrap.o: $(srcdir)/sproingies.h
-sproingiewrap.o: $(UTILS_SRC)/colors.h
-sproingiewrap.o: $(UTILS_SRC)/erase.h
-sproingiewrap.o: $(UTILS_SRC)/font-retry.h
-sproingiewrap.o: $(UTILS_SRC)/grabscreen.h
-sproingiewrap.o: $(UTILS_SRC)/hsv.h
-sproingiewrap.o: $(UTILS_SRC)/resources.h
-sproingiewrap.o: $(UTILS_SRC)/usleep.h
-sproingiewrap.o: $(UTILS_SRC)/visual.h
-sproingiewrap.o: $(UTILS_SRC)/xft.h
-sproingiewrap.o: $(UTILS_SRC)/yarandom.h
-sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h
-sproingiewrap.o: $(HACK_SRC)/xlockmore.h
-stairs.o: ../../config.h
-stairs.o: $(HACK_SRC)/fps.h
-stairs.o: $(srcdir)/gltrackball.h
-stairs.o: ../images/gen/wood_png.h
-stairs.o: $(HACK_SRC)/recanim.h
-stairs.o: $(HACK_SRC)/screenhackI.h
-stairs.o: $(srcdir)/sphere.h
-stairs.o: $(UTILS_SRC)/colors.h
-stairs.o: $(UTILS_SRC)/erase.h
-stairs.o: $(UTILS_SRC)/font-retry.h
-stairs.o: $(UTILS_SRC)/grabscreen.h
-stairs.o: $(UTILS_SRC)/hsv.h
-stairs.o: $(UTILS_SRC)/resources.h
-stairs.o: $(UTILS_SRC)/usleep.h
-stairs.o: $(UTILS_SRC)/visual.h
-stairs.o: $(UTILS_SRC)/xft.h
-stairs.o: $(UTILS_SRC)/yarandom.h
-stairs.o: $(HACK_SRC)/ximage-loader.h
-stairs.o: $(HACK_SRC)/xlockmoreI.h
-stairs.o: $(HACK_SRC)/xlockmore.h
-starwars.o: ../../config.h
-starwars.o: $(HACK_SRC)/fps.h
-starwars.o: $(srcdir)/glut_roman.h
-starwars.o: $(srcdir)/glutstroke.h
-starwars.o: $(HACK_SRC)/recanim.h
-starwars.o: $(HACK_SRC)/screenhackI.h
-starwars.o: $(srcdir)/starwars.h
-starwars.o: $(srcdir)/texfont.h
-starwars.o: $(UTILS_SRC)/colors.h
-starwars.o: $(UTILS_SRC)/erase.h
-starwars.o: $(UTILS_SRC)/font-retry.h
-starwars.o: $(UTILS_SRC)/grabscreen.h
-starwars.o: $(UTILS_SRC)/hsv.h
-starwars.o: $(UTILS_SRC)/resources.h
-starwars.o: $(UTILS_SRC)/textclient.h
-starwars.o: $(UTILS_SRC)/usleep.h
-starwars.o: $(UTILS_SRC)/utf8wc.h
-starwars.o: $(UTILS_SRC)/visual.h
-starwars.o: $(UTILS_SRC)/xft.h
-starwars.o: $(UTILS_SRC)/yarandom.h
-starwars.o: $(HACK_SRC)/xlockmoreI.h
-starwars.o: $(HACK_SRC)/xlockmore.h
-stonerview-move.o: ../../config.h
-stonerview-move.o: $(srcdir)/stonerview.h
-stonerview-move.o: $(srcdir)/stonerview-move.h
-stonerview-move.o: $(srcdir)/stonerview-osc.h
-stonerview-move.o: $(UTILS_SRC)/yarandom.h
-stonerview.o: ../../config.h
-stonerview.o: $(HACK_SRC)/fps.h
-stonerview.o: $(srcdir)/gltrackball.h
-stonerview.o: $(HACK_SRC)/recanim.h
-stonerview.o: $(HACK_SRC)/screenhackI.h
-stonerview.o: $(srcdir)/stonerview.h
-stonerview.o: $(srcdir)/stonerview-move.h
-stonerview.o: $(srcdir)/stonerview-osc.h
-stonerview.o: $(UTILS_SRC)/colors.h
-stonerview.o: $(UTILS_SRC)/erase.h
-stonerview.o: $(UTILS_SRC)/font-retry.h
-stonerview.o: $(UTILS_SRC)/grabscreen.h
-stonerview.o: $(UTILS_SRC)/hsv.h
-stonerview.o: $(UTILS_SRC)/resources.h
-stonerview.o: $(UTILS_SRC)/usleep.h
-stonerview.o: $(UTILS_SRC)/visual.h
-stonerview.o: $(UTILS_SRC)/xft.h
-stonerview.o: $(UTILS_SRC)/yarandom.h
-stonerview.o: $(HACK_SRC)/xlockmoreI.h
-stonerview.o: $(HACK_SRC)/xlockmore.h
-stonerview-osc.o: ../../config.h
-stonerview-osc.o: $(srcdir)/stonerview.h
-stonerview-osc.o: $(srcdir)/stonerview-move.h
-stonerview-osc.o: $(srcdir)/stonerview-osc.h
-stonerview-osc.o: $(UTILS_SRC)/yarandom.h
-stonerview-view.o: ../../config.h
-stonerview-view.o: $(HACK_SRC)/fps.h
-stonerview-view.o: $(HACK_SRC)/recanim.h
-stonerview-view.o: $(HACK_SRC)/screenhackI.h
-stonerview-view.o: $(srcdir)/stonerview.h
-stonerview-view.o: $(srcdir)/stonerview-move.h
-stonerview-view.o: $(srcdir)/stonerview-osc.h
-stonerview-view.o: $(UTILS_SRC)/colors.h
-stonerview-view.o: $(UTILS_SRC)/font-retry.h
-stonerview-view.o: $(UTILS_SRC)/grabscreen.h
-stonerview-view.o: $(UTILS_SRC)/hsv.h
-stonerview-view.o: $(UTILS_SRC)/resources.h
-stonerview-view.o: $(UTILS_SRC)/usleep.h
-stonerview-view.o: $(UTILS_SRC)/visual.h
-stonerview-view.o: $(UTILS_SRC)/xft.h
-stonerview-view.o: $(UTILS_SRC)/yarandom.h
-superquadrics.o: ../../config.h
-superquadrics.o: $(HACK_SRC)/fps.h
-superquadrics.o: $(HACK_SRC)/recanim.h
-superquadrics.o: $(HACK_SRC)/screenhackI.h
-superquadrics.o: $(UTILS_SRC)/colors.h
-superquadrics.o: $(UTILS_SRC)/erase.h
-superquadrics.o: $(UTILS_SRC)/font-retry.h
-superquadrics.o: $(UTILS_SRC)/grabscreen.h
-superquadrics.o: $(UTILS_SRC)/hsv.h
-superquadrics.o: $(UTILS_SRC)/resources.h
-superquadrics.o: $(UTILS_SRC)/usleep.h
-superquadrics.o: $(UTILS_SRC)/visual.h
-superquadrics.o: $(UTILS_SRC)/xft.h
-superquadrics.o: $(UTILS_SRC)/yarandom.h
-superquadrics.o: $(HACK_SRC)/xlockmoreI.h
-superquadrics.o: $(HACK_SRC)/xlockmore.h
-surfaces.o: ../../config.h
-surfaces.o: $(HACK_SRC)/fps.h
-surfaces.o: $(srcdir)/gltrackball.h
-surfaces.o: $(HACK_SRC)/recanim.h
-surfaces.o: $(srcdir)/rotator.h
-surfaces.o: $(HACK_SRC)/screenhackI.h
-surfaces.o: $(UTILS_SRC)/colors.h
-surfaces.o: $(UTILS_SRC)/erase.h
-surfaces.o: $(UTILS_SRC)/font-retry.h
-surfaces.o: $(UTILS_SRC)/grabscreen.h
-surfaces.o: $(UTILS_SRC)/hsv.h
-surfaces.o: $(UTILS_SRC)/resources.h
-surfaces.o: $(UTILS_SRC)/usleep.h
-surfaces.o: $(UTILS_SRC)/visual.h
-surfaces.o: $(UTILS_SRC)/xft.h
-surfaces.o: $(UTILS_SRC)/yarandom.h
-surfaces.o: $(HACK_SRC)/xlockmoreI.h
-surfaces.o: $(HACK_SRC)/xlockmore.h
-swim.o: $(srcdir)/atlantis.h
-swim.o: ../../config.h
-swim.o: $(HACK_SRC)/fps.h
-swim.o: $(HACK_SRC)/recanim.h
-swim.o: $(HACK_SRC)/screenhackI.h
-swim.o: $(UTILS_SRC)/colors.h
-swim.o: $(UTILS_SRC)/erase.h
-swim.o: $(UTILS_SRC)/font-retry.h
-swim.o: $(UTILS_SRC)/grabscreen.h
-swim.o: $(UTILS_SRC)/hsv.h
-swim.o: $(UTILS_SRC)/resources.h
-swim.o: $(UTILS_SRC)/usleep.h
-swim.o: $(UTILS_SRC)/visual.h
-swim.o: $(UTILS_SRC)/xft.h
-swim.o: $(UTILS_SRC)/yarandom.h
-swim.o: $(HACK_SRC)/xlockmoreI.h
-tangram.o: ../../config.h
-tangram.o: $(HACK_SRC)/fps.h
-tangram.o: $(HACK_SRC)/recanim.h
-tangram.o: $(HACK_SRC)/screenhackI.h
-tangram.o: $(srcdir)/tangram_shapes.h
-tangram.o: $(srcdir)/texfont.h
-tangram.o: $(UTILS_SRC)/colors.h
-tangram.o: $(UTILS_SRC)/erase.h
-tangram.o: $(UTILS_SRC)/font-retry.h
-tangram.o: $(UTILS_SRC)/grabscreen.h
-tangram.o: $(UTILS_SRC)/hsv.h
-tangram.o: $(UTILS_SRC)/resources.h
-tangram.o: $(UTILS_SRC)/usleep.h
-tangram.o: $(UTILS_SRC)/visual.h
-tangram.o: $(UTILS_SRC)/xft.h
-tangram.o: $(UTILS_SRC)/yarandom.h
-tangram.o: $(HACK_SRC)/xlockmoreI.h
-tangram.o: $(HACK_SRC)/xlockmore.h
-tangram_shapes.o: ../../config.h
-tangram_shapes.o: $(HACK_SRC)/fps.h
-tangram_shapes.o: $(HACK_SRC)/recanim.h
-tangram_shapes.o: $(HACK_SRC)/screenhackI.h
-tangram_shapes.o: $(srcdir)/tangram_shapes.h
-tangram_shapes.o: $(UTILS_SRC)/colors.h
-tangram_shapes.o: $(UTILS_SRC)/font-retry.h
-tangram_shapes.o: $(UTILS_SRC)/grabscreen.h
-tangram_shapes.o: $(UTILS_SRC)/hsv.h
-tangram_shapes.o: $(UTILS_SRC)/resources.h
-tangram_shapes.o: $(UTILS_SRC)/usleep.h
-tangram_shapes.o: $(UTILS_SRC)/visual.h
-tangram_shapes.o: $(UTILS_SRC)/xft.h
-tangram_shapes.o: $(UTILS_SRC)/yarandom.h
-teapot.o: ../../config.h
-teapot.o: $(HACK_SRC)/fps.h
-teapot.o: $(HACK_SRC)/recanim.h
-teapot.o: $(HACK_SRC)/screenhackI.h
-teapot.o: $(srcdir)/teapot.h
-teapot.o: $(UTILS_SRC)/colors.h
-teapot.o: $(UTILS_SRC)/font-retry.h
-teapot.o: $(UTILS_SRC)/grabscreen.h
-teapot.o: $(UTILS_SRC)/hsv.h
-teapot.o: $(UTILS_SRC)/resources.h
-teapot.o: $(UTILS_SRC)/usleep.h
-teapot.o: $(UTILS_SRC)/visual.h
-teapot.o: $(UTILS_SRC)/xft.h
-teapot.o: $(UTILS_SRC)/yarandom.h
-texfont.o: ../../config.h
-texfont.o: $(HACK_SRC)/fps.h
-texfont.o: $(srcdir)/glsl-utils.h
-texfont.o: $(HACK_SRC)/recanim.h
-texfont.o: $(HACK_SRC)/screenhackI.h
-texfont.o: $(srcdir)/texfont.h
-texfont.o: $(UTILS_SRC)/colors.h
-texfont.o: $(UTILS_SRC)/font-retry.h
-texfont.o: $(UTILS_SRC)/grabscreen.h
-texfont.o: $(UTILS_SRC)/hsv.h
-texfont.o: $(UTILS_SRC)/pow2.h
-texfont.o: $(UTILS_SRC)/resources.h
-texfont.o: $(UTILS_SRC)/usleep.h
-texfont.o: $(UTILS_SRC)/utf8wc.h
-texfont.o: $(UTILS_SRC)/visual.h
-texfont.o: $(UTILS_SRC)/xft.h
-texfont.o: $(UTILS_SRC)/xshm.h
-texfont.o: $(UTILS_SRC)/yarandom.h
-timetunnel.o: ../../config.h
-timetunnel.o: $(HACK_SRC)/fps.h
-timetunnel.o: $(srcdir)/gltrackball.h
-timetunnel.o: ../images/gen/logo-180_png.h
-timetunnel.o: ../images/gen/timetunnel0_png.h
-timetunnel.o: ../images/gen/timetunnel1_png.h
-timetunnel.o: ../images/gen/timetunnel2_png.h
-timetunnel.o: ../images/gen/tunnelstar_png.h
-timetunnel.o: $(HACK_SRC)/recanim.h
-timetunnel.o: $(srcdir)/rotator.h
-timetunnel.o: $(HACK_SRC)/screenhackI.h
-timetunnel.o: $(UTILS_SRC)/colors.h
-timetunnel.o: $(UTILS_SRC)/erase.h
-timetunnel.o: $(UTILS_SRC)/font-retry.h
-timetunnel.o: $(UTILS_SRC)/grabscreen.h
-timetunnel.o: $(UTILS_SRC)/hsv.h
-timetunnel.o: $(UTILS_SRC)/resources.h
-timetunnel.o: $(UTILS_SRC)/usleep.h
-timetunnel.o: $(UTILS_SRC)/visual.h
-timetunnel.o: $(UTILS_SRC)/xft.h
-timetunnel.o: $(UTILS_SRC)/yarandom.h
-timetunnel.o: $(HACK_SRC)/ximage-loader.h
-timetunnel.o: $(HACK_SRC)/xlockmoreI.h
-timetunnel.o: $(HACK_SRC)/xlockmore.h
-toast2.o: ../../config.h
-toast2.o: $(HACK_SRC)/fps.h
-toast2.o: $(srcdir)/gllist.h
-toast2.o: $(HACK_SRC)/recanim.h
-toast2.o: $(HACK_SRC)/screenhackI.h
-toast2.o: $(UTILS_SRC)/colors.h
-toast2.o: $(UTILS_SRC)/erase.h
-toast2.o: $(UTILS_SRC)/font-retry.h
-toast2.o: $(UTILS_SRC)/grabscreen.h
-toast2.o: $(UTILS_SRC)/hsv.h
-toast2.o: $(UTILS_SRC)/resources.h
-toast2.o: $(UTILS_SRC)/usleep.h
-toast2.o: $(UTILS_SRC)/visual.h
-toast2.o: $(UTILS_SRC)/xft.h
-toast2.o: $(UTILS_SRC)/yarandom.h
-toast2.o: $(HACK_SRC)/xlockmoreI.h
-toaster_base.o: ../../config.h
-toaster_base.o: $(HACK_SRC)/fps.h
-toaster_base.o: $(srcdir)/gllist.h
-toaster_base.o: $(HACK_SRC)/recanim.h
-toaster_base.o: $(HACK_SRC)/screenhackI.h
-toaster_base.o: $(UTILS_SRC)/colors.h
-toaster_base.o: $(UTILS_SRC)/erase.h
-toaster_base.o: $(UTILS_SRC)/font-retry.h
-toaster_base.o: $(UTILS_SRC)/grabscreen.h
-toaster_base.o: $(UTILS_SRC)/hsv.h
-toaster_base.o: $(UTILS_SRC)/resources.h
-toaster_base.o: $(UTILS_SRC)/usleep.h
-toaster_base.o: $(UTILS_SRC)/visual.h
-toaster_base.o: $(UTILS_SRC)/xft.h
-toaster_base.o: $(UTILS_SRC)/yarandom.h
-toaster_base.o: $(HACK_SRC)/xlockmoreI.h
-toaster_handle2.o: ../../config.h
-toaster_handle2.o: $(HACK_SRC)/fps.h
-toaster_handle2.o: $(srcdir)/gllist.h
-toaster_handle2.o: $(HACK_SRC)/recanim.h
-toaster_handle2.o: $(HACK_SRC)/screenhackI.h
-toaster_handle2.o: $(UTILS_SRC)/colors.h
-toaster_handle2.o: $(UTILS_SRC)/erase.h
-toaster_handle2.o: $(UTILS_SRC)/font-retry.h
-toaster_handle2.o: $(UTILS_SRC)/grabscreen.h
-toaster_handle2.o: $(UTILS_SRC)/hsv.h
-toaster_handle2.o: $(UTILS_SRC)/resources.h
-toaster_handle2.o: $(UTILS_SRC)/usleep.h
-toaster_handle2.o: $(UTILS_SRC)/visual.h
-toaster_handle2.o: $(UTILS_SRC)/xft.h
-toaster_handle2.o: $(UTILS_SRC)/yarandom.h
-toaster_handle2.o: $(HACK_SRC)/xlockmoreI.h
-toaster_handle.o: ../../config.h
-toaster_handle.o: $(HACK_SRC)/fps.h
-toaster_handle.o: $(srcdir)/gllist.h
-toaster_handle.o: $(HACK_SRC)/recanim.h
-toaster_handle.o: $(HACK_SRC)/screenhackI.h
-toaster_handle.o: $(UTILS_SRC)/colors.h
-toaster_handle.o: $(UTILS_SRC)/erase.h
-toaster_handle.o: $(UTILS_SRC)/font-retry.h
-toaster_handle.o: $(UTILS_SRC)/grabscreen.h
-toaster_handle.o: $(UTILS_SRC)/hsv.h
-toaster_handle.o: $(UTILS_SRC)/resources.h
-toaster_handle.o: $(UTILS_SRC)/usleep.h
-toaster_handle.o: $(UTILS_SRC)/visual.h
-toaster_handle.o: $(UTILS_SRC)/xft.h
-toaster_handle.o: $(UTILS_SRC)/yarandom.h
-toaster_handle.o: $(HACK_SRC)/xlockmoreI.h
-toaster_jet.o: ../../config.h
-toaster_jet.o: $(HACK_SRC)/fps.h
-toaster_jet.o: $(srcdir)/gllist.h
-toaster_jet.o: $(HACK_SRC)/recanim.h
-toaster_jet.o: $(HACK_SRC)/screenhackI.h
-toaster_jet.o: $(UTILS_SRC)/colors.h
-toaster_jet.o: $(UTILS_SRC)/erase.h
-toaster_jet.o: $(UTILS_SRC)/font-retry.h
-toaster_jet.o: $(UTILS_SRC)/grabscreen.h
-toaster_jet.o: $(UTILS_SRC)/hsv.h
-toaster_jet.o: $(UTILS_SRC)/resources.h
-toaster_jet.o: $(UTILS_SRC)/usleep.h
-toaster_jet.o: $(UTILS_SRC)/visual.h
-toaster_jet.o: $(UTILS_SRC)/xft.h
-toaster_jet.o: $(UTILS_SRC)/yarandom.h
-toaster_jet.o: $(HACK_SRC)/xlockmoreI.h
-toaster_knob.o: ../../config.h
-toaster_knob.o: $(HACK_SRC)/fps.h
-toaster_knob.o: $(srcdir)/gllist.h
-toaster_knob.o: $(HACK_SRC)/recanim.h
-toaster_knob.o: $(HACK_SRC)/screenhackI.h
-toaster_knob.o: $(UTILS_SRC)/colors.h
-toaster_knob.o: $(UTILS_SRC)/erase.h
-toaster_knob.o: $(UTILS_SRC)/font-retry.h
-toaster_knob.o: $(UTILS_SRC)/grabscreen.h
-toaster_knob.o: $(UTILS_SRC)/hsv.h
-toaster_knob.o: $(UTILS_SRC)/resources.h
-toaster_knob.o: $(UTILS_SRC)/usleep.h
-toaster_knob.o: $(UTILS_SRC)/visual.h
-toaster_knob.o: $(UTILS_SRC)/xft.h
-toaster_knob.o: $(UTILS_SRC)/yarandom.h
-toaster_knob.o: $(HACK_SRC)/xlockmoreI.h
-toaster.o: ../../config.h
-toaster.o: $(HACK_SRC)/fps.h
-toaster.o: $(srcdir)/gllist.h
-toaster.o: $(HACK_SRC)/recanim.h
-toaster.o: $(HACK_SRC)/screenhackI.h
-toaster.o: $(UTILS_SRC)/colors.h
-toaster.o: $(UTILS_SRC)/erase.h
-toaster.o: $(UTILS_SRC)/font-retry.h
-toaster.o: $(UTILS_SRC)/grabscreen.h
-toaster.o: $(UTILS_SRC)/hsv.h
-toaster.o: $(UTILS_SRC)/resources.h
-toaster.o: $(UTILS_SRC)/usleep.h
-toaster.o: $(UTILS_SRC)/visual.h
-toaster.o: $(UTILS_SRC)/xft.h
-toaster.o: $(UTILS_SRC)/yarandom.h
-toaster.o: $(HACK_SRC)/xlockmoreI.h
-toaster_slots.o: ../../config.h
-toaster_slots.o: $(HACK_SRC)/fps.h
-toaster_slots.o: $(srcdir)/gllist.h
-toaster_slots.o: $(HACK_SRC)/recanim.h
-toaster_slots.o: $(HACK_SRC)/screenhackI.h
-toaster_slots.o: $(UTILS_SRC)/colors.h
-toaster_slots.o: $(UTILS_SRC)/erase.h
-toaster_slots.o: $(UTILS_SRC)/font-retry.h
-toaster_slots.o: $(UTILS_SRC)/grabscreen.h
-toaster_slots.o: $(UTILS_SRC)/hsv.h
-toaster_slots.o: $(UTILS_SRC)/resources.h
-toaster_slots.o: $(UTILS_SRC)/usleep.h
-toaster_slots.o: $(UTILS_SRC)/visual.h
-toaster_slots.o: $(UTILS_SRC)/xft.h
-toaster_slots.o: $(UTILS_SRC)/yarandom.h
-toaster_slots.o: $(HACK_SRC)/xlockmoreI.h
-toaster_wing.o: ../../config.h
-toaster_wing.o: $(HACK_SRC)/fps.h
-toaster_wing.o: $(srcdir)/gllist.h
-toaster_wing.o: $(HACK_SRC)/recanim.h
-toaster_wing.o: $(HACK_SRC)/screenhackI.h
-toaster_wing.o: $(UTILS_SRC)/colors.h
-toaster_wing.o: $(UTILS_SRC)/erase.h
-toaster_wing.o: $(UTILS_SRC)/font-retry.h
-toaster_wing.o: $(UTILS_SRC)/grabscreen.h
-toaster_wing.o: $(UTILS_SRC)/hsv.h
-toaster_wing.o: $(UTILS_SRC)/resources.h
-toaster_wing.o: $(UTILS_SRC)/usleep.h
-toaster_wing.o: $(UTILS_SRC)/visual.h
-toaster_wing.o: $(UTILS_SRC)/xft.h
-toaster_wing.o: $(UTILS_SRC)/yarandom.h
-toaster_wing.o: $(HACK_SRC)/xlockmoreI.h
-toast.o: ../../config.h
-toast.o: $(HACK_SRC)/fps.h
-toast.o: $(srcdir)/gllist.h
-toast.o: $(HACK_SRC)/recanim.h
-toast.o: $(HACK_SRC)/screenhackI.h
-toast.o: $(UTILS_SRC)/colors.h
-toast.o: $(UTILS_SRC)/erase.h
-toast.o: $(UTILS_SRC)/font-retry.h
-toast.o: $(UTILS_SRC)/grabscreen.h
-toast.o: $(UTILS_SRC)/hsv.h
-toast.o: $(UTILS_SRC)/resources.h
-toast.o: $(UTILS_SRC)/usleep.h
-toast.o: $(UTILS_SRC)/visual.h
-toast.o: $(UTILS_SRC)/xft.h
-toast.o: $(UTILS_SRC)/yarandom.h
-toast.o: $(HACK_SRC)/xlockmoreI.h
-topblock.o: ../../config.h
-topblock.o: $(HACK_SRC)/fps.h
-topblock.o: $(srcdir)/gltrackball.h
-topblock.o: $(HACK_SRC)/recanim.h
-topblock.o: $(HACK_SRC)/screenhackI.h
-topblock.o: $(srcdir)/sphere.h
-topblock.o: $(srcdir)/topblock.h
-topblock.o: $(srcdir)/tube.h
-topblock.o: $(UTILS_SRC)/colors.h
-topblock.o: $(UTILS_SRC)/erase.h
-topblock.o: $(UTILS_SRC)/font-retry.h
-topblock.o: $(UTILS_SRC)/grabscreen.h
-topblock.o: $(UTILS_SRC)/hsv.h
-topblock.o: $(UTILS_SRC)/resources.h
-topblock.o: $(UTILS_SRC)/usleep.h
-topblock.o: $(UTILS_SRC)/visual.h
-topblock.o: $(UTILS_SRC)/xft.h
-topblock.o: $(UTILS_SRC)/yarandom.h
-topblock.o: $(HACK_SRC)/xlockmoreI.h
-topblock.o: $(HACK_SRC)/xlockmore.h
-trackball.o: ../../config.h
-trackball.o: $(srcdir)/trackball.h
-tronbit_idle1.o: ../../config.h
-tronbit_idle1.o: $(HACK_SRC)/fps.h
-tronbit_idle1.o: $(srcdir)/gllist.h
-tronbit_idle1.o: $(HACK_SRC)/recanim.h
-tronbit_idle1.o: $(HACK_SRC)/screenhackI.h
-tronbit_idle1.o: $(UTILS_SRC)/colors.h
-tronbit_idle1.o: $(UTILS_SRC)/erase.h
-tronbit_idle1.o: $(UTILS_SRC)/font-retry.h
-tronbit_idle1.o: $(UTILS_SRC)/grabscreen.h
-tronbit_idle1.o: $(UTILS_SRC)/hsv.h
-tronbit_idle1.o: $(UTILS_SRC)/resources.h
-tronbit_idle1.o: $(UTILS_SRC)/usleep.h
-tronbit_idle1.o: $(UTILS_SRC)/visual.h
-tronbit_idle1.o: $(UTILS_SRC)/xft.h
-tronbit_idle1.o: $(UTILS_SRC)/yarandom.h
-tronbit_idle1.o: $(HACK_SRC)/xlockmoreI.h
-tronbit_idle2.o: ../../config.h
-tronbit_idle2.o: $(HACK_SRC)/fps.h
-tronbit_idle2.o: $(srcdir)/gllist.h
-tronbit_idle2.o: $(HACK_SRC)/recanim.h
-tronbit_idle2.o: $(HACK_SRC)/screenhackI.h
-tronbit_idle2.o: $(UTILS_SRC)/colors.h
-tronbit_idle2.o: $(UTILS_SRC)/erase.h
-tronbit_idle2.o: $(UTILS_SRC)/font-retry.h
-tronbit_idle2.o: $(UTILS_SRC)/grabscreen.h
-tronbit_idle2.o: $(UTILS_SRC)/hsv.h
-tronbit_idle2.o: $(UTILS_SRC)/resources.h
-tronbit_idle2.o: $(UTILS_SRC)/usleep.h
-tronbit_idle2.o: $(UTILS_SRC)/visual.h
-tronbit_idle2.o: $(UTILS_SRC)/xft.h
-tronbit_idle2.o: $(UTILS_SRC)/yarandom.h
-tronbit_idle2.o: $(HACK_SRC)/xlockmoreI.h
-tronbit_no.o: ../../config.h
-tronbit_no.o: $(HACK_SRC)/fps.h
-tronbit_no.o: $(srcdir)/gllist.h
-tronbit_no.o: $(HACK_SRC)/recanim.h
-tronbit_no.o: $(HACK_SRC)/screenhackI.h
-tronbit_no.o: $(UTILS_SRC)/colors.h
-tronbit_no.o: $(UTILS_SRC)/erase.h
-tronbit_no.o: $(UTILS_SRC)/font-retry.h
-tronbit_no.o: $(UTILS_SRC)/grabscreen.h
-tronbit_no.o: $(UTILS_SRC)/hsv.h
-tronbit_no.o: $(UTILS_SRC)/resources.h
-tronbit_no.o: $(UTILS_SRC)/usleep.h
-tronbit_no.o: $(UTILS_SRC)/visual.h
-tronbit_no.o: $(UTILS_SRC)/xft.h
-tronbit_no.o: $(UTILS_SRC)/yarandom.h
-tronbit_no.o: $(HACK_SRC)/xlockmoreI.h
-tronbit.o: ../../config.h
-tronbit.o: $(HACK_SRC)/fps.h
-tronbit.o: $(srcdir)/gllist.h
-tronbit.o: $(srcdir)/gltrackball.h
-tronbit.o: $(HACK_SRC)/recanim.h
-tronbit.o: $(srcdir)/rotator.h
-tronbit.o: $(HACK_SRC)/screenhackI.h
-tronbit.o: $(srcdir)/sphere.h
-tronbit.o: $(UTILS_SRC)/colors.h
-tronbit.o: $(UTILS_SRC)/erase.h
-tronbit.o: $(UTILS_SRC)/font-retry.h
-tronbit.o: $(UTILS_SRC)/grabscreen.h
-tronbit.o: $(UTILS_SRC)/hsv.h
-tronbit.o: $(UTILS_SRC)/resources.h
-tronbit.o: $(UTILS_SRC)/usleep.h
-tronbit.o: $(UTILS_SRC)/visual.h
-tronbit.o: $(UTILS_SRC)/xft.h
-tronbit.o: $(UTILS_SRC)/yarandom.h
-tronbit.o: $(HACK_SRC)/xlockmoreI.h
-tronbit.o: $(HACK_SRC)/xlockmore.h
-tronbit_yes.o: ../../config.h
-tronbit_yes.o: $(HACK_SRC)/fps.h
-tronbit_yes.o: $(srcdir)/gllist.h
-tronbit_yes.o: $(HACK_SRC)/recanim.h
-tronbit_yes.o: $(HACK_SRC)/screenhackI.h
-tronbit_yes.o: $(UTILS_SRC)/colors.h
-tronbit_yes.o: $(UTILS_SRC)/erase.h
-tronbit_yes.o: $(UTILS_SRC)/font-retry.h
-tronbit_yes.o: $(UTILS_SRC)/grabscreen.h
-tronbit_yes.o: $(UTILS_SRC)/hsv.h
-tronbit_yes.o: $(UTILS_SRC)/resources.h
-tronbit_yes.o: $(UTILS_SRC)/usleep.h
-tronbit_yes.o: $(UTILS_SRC)/visual.h
-tronbit_yes.o: $(UTILS_SRC)/xft.h
-tronbit_yes.o: $(UTILS_SRC)/yarandom.h
-tronbit_yes.o: $(HACK_SRC)/xlockmoreI.h
-tube.o: ../../config.h
-tube.o: $(HACK_SRC)/fps.h
-tube.o: $(HACK_SRC)/recanim.h
-tube.o: $(HACK_SRC)/screenhackI.h
-tube.o: $(srcdir)/tube.h
-tube.o: $(UTILS_SRC)/colors.h
-tube.o: $(UTILS_SRC)/font-retry.h
-tube.o: $(UTILS_SRC)/grabscreen.h
-tube.o: $(UTILS_SRC)/hsv.h
-tube.o: $(UTILS_SRC)/resources.h
-tube.o: $(UTILS_SRC)/usleep.h
-tube.o: $(UTILS_SRC)/visual.h
-tube.o: $(UTILS_SRC)/xft.h
-tube.o: $(UTILS_SRC)/yarandom.h
-tunnel_draw.o: ../../config.h
-tunnel_draw.o: $(HACK_SRC)/fps.h
-tunnel_draw.o: $(HACK_SRC)/recanim.h
-tunnel_draw.o: $(HACK_SRC)/screenhackI.h
-tunnel_draw.o: $(srcdir)/tunnel_draw.h
-tunnel_draw.o: $(UTILS_SRC)/colors.h
-tunnel_draw.o: $(UTILS_SRC)/font-retry.h
-tunnel_draw.o: $(UTILS_SRC)/grabscreen.h
-tunnel_draw.o: $(UTILS_SRC)/hsv.h
-tunnel_draw.o: $(UTILS_SRC)/resources.h
-tunnel_draw.o: $(UTILS_SRC)/usleep.h
-tunnel_draw.o: $(UTILS_SRC)/visual.h
-tunnel_draw.o: $(UTILS_SRC)/xft.h
-tunnel_draw.o: $(UTILS_SRC)/yarandom.h
-unicrud.o: ../../config.h
-unicrud.o: $(HACK_SRC)/fps.h
-unicrud.o: $(srcdir)/gltrackball.h
-unicrud.o: $(HACK_SRC)/recanim.h
-unicrud.o: $(srcdir)/rotator.h
-unicrud.o: $(HACK_SRC)/screenhackI.h
-unicrud.o: $(srcdir)/texfont.h
-unicrud.o: $(UTILS_SRC)/colors.h
-unicrud.o: $(UTILS_SRC)/erase.h
-unicrud.o: $(UTILS_SRC)/font-retry.h
-unicrud.o: $(UTILS_SRC)/grabscreen.h
-unicrud.o: $(UTILS_SRC)/hsv.h
-unicrud.o: $(UTILS_SRC)/resources.h
-unicrud.o: $(UTILS_SRC)/usleep.h
-unicrud.o: $(UTILS_SRC)/utf8wc.h
-unicrud.o: $(UTILS_SRC)/visual.h
-unicrud.o: $(UTILS_SRC)/xft.h
-unicrud.o: $(UTILS_SRC)/yarandom.h
-unicrud.o: $(HACK_SRC)/xlockmoreI.h
-unicrud.o: $(HACK_SRC)/xlockmore.h
-unknownpleasures.o: ../../config.h
-unknownpleasures.o: $(HACK_SRC)/fps.h
-unknownpleasures.o: $(srcdir)/gltrackball.h
-unknownpleasures.o: $(srcdir)/grab-ximage.h
-unknownpleasures.o: $(HACK_SRC)/recanim.h
-unknownpleasures.o: $(HACK_SRC)/screenhackI.h
-unknownpleasures.o: $(UTILS_SRC)/colors.h
-unknownpleasures.o: $(UTILS_SRC)/erase.h
-unknownpleasures.o: $(UTILS_SRC)/font-retry.h
-unknownpleasures.o: $(UTILS_SRC)/grabscreen.h
-unknownpleasures.o: $(UTILS_SRC)/hsv.h
-unknownpleasures.o: $(UTILS_SRC)/resources.h
-unknownpleasures.o: $(UTILS_SRC)/usleep.h
-unknownpleasures.o: $(UTILS_SRC)/visual.h
-unknownpleasures.o: $(UTILS_SRC)/xft.h
-unknownpleasures.o: $(UTILS_SRC)/yarandom.h
-unknownpleasures.o: $(HACK_SRC)/ximage-loader.h
-unknownpleasures.o: $(HACK_SRC)/xlockmoreI.h
-unknownpleasures.o: $(HACK_SRC)/xlockmore.h
-vigilance.o: ../../config.h
-vigilance.o: $(HACK_SRC)/fps.h
-vigilance.o: $(srcdir)/gllist.h
-vigilance.o: $(srcdir)/gltrackball.h
-vigilance.o: $(srcdir)/normals.h
-vigilance.o: $(HACK_SRC)/recanim.h
-vigilance.o: $(HACK_SRC)/screenhackI.h
-vigilance.o: $(UTILS_SRC)/colors.h
-vigilance.o: $(UTILS_SRC)/erase.h
-vigilance.o: $(UTILS_SRC)/font-retry.h
-vigilance.o: $(UTILS_SRC)/grabscreen.h
-vigilance.o: $(UTILS_SRC)/hsv.h
-vigilance.o: $(UTILS_SRC)/resources.h
-vigilance.o: $(UTILS_SRC)/usleep.h
-vigilance.o: $(UTILS_SRC)/visual.h
-vigilance.o: $(UTILS_SRC)/xft.h
-vigilance.o: $(UTILS_SRC)/yarandom.h
-vigilance.o: $(HACK_SRC)/ximage-loader.h
-vigilance.o: $(HACK_SRC)/xlockmoreI.h
-vigilance.o: $(HACK_SRC)/xlockmore.h
-voronoi.o: ../../config.h
-voronoi.o: $(HACK_SRC)/fps.h
-voronoi.o: $(HACK_SRC)/recanim.h
-voronoi.o: $(HACK_SRC)/screenhackI.h
-voronoi.o: $(UTILS_SRC)/colors.h
-voronoi.o: $(UTILS_SRC)/erase.h
-voronoi.o: $(UTILS_SRC)/font-retry.h
-voronoi.o: $(UTILS_SRC)/grabscreen.h
-voronoi.o: $(UTILS_SRC)/hsv.h
-voronoi.o: $(UTILS_SRC)/resources.h
-voronoi.o: $(UTILS_SRC)/usleep.h
-voronoi.o: $(UTILS_SRC)/visual.h
-voronoi.o: $(UTILS_SRC)/xft.h
-voronoi.o: $(UTILS_SRC)/yarandom.h
-voronoi.o: $(HACK_SRC)/xlockmoreI.h
-voronoi.o: $(HACK_SRC)/xlockmore.h
-whale.o: $(srcdir)/atlantis.h
-whale.o: ../../config.h
-whale.o: $(HACK_SRC)/fps.h
-whale.o: $(HACK_SRC)/recanim.h
-whale.o: $(HACK_SRC)/screenhackI.h
-whale.o: $(UTILS_SRC)/colors.h
-whale.o: $(UTILS_SRC)/erase.h
-whale.o: $(UTILS_SRC)/font-retry.h
-whale.o: $(UTILS_SRC)/grabscreen.h
-whale.o: $(UTILS_SRC)/hsv.h
-whale.o: $(UTILS_SRC)/resources.h
-whale.o: $(UTILS_SRC)/usleep.h
-whale.o: $(UTILS_SRC)/visual.h
-whale.o: $(UTILS_SRC)/xft.h
-whale.o: $(UTILS_SRC)/yarandom.h
-whale.o: $(HACK_SRC)/xlockmoreI.h
-winduprobot.o: ../../config.h
-winduprobot.o: $(HACK_SRC)/fps.h
-winduprobot.o: $(srcdir)/gllist.h
-winduprobot.o: $(srcdir)/gltrackball.h
-winduprobot.o: ../images/gen/chromesphere_png.h
-winduprobot.o: $(srcdir)/involute.h
-winduprobot.o: $(HACK_SRC)/recanim.h
-winduprobot.o: $(HACK_SRC)/screenhackI.h
-winduprobot.o: $(srcdir)/sphere.h
-winduprobot.o: $(srcdir)/texfont.h
-winduprobot.o: $(UTILS_SRC)/colors.h
-winduprobot.o: $(UTILS_SRC)/erase.h
-winduprobot.o: $(UTILS_SRC)/font-retry.h
-winduprobot.o: $(UTILS_SRC)/grabscreen.h
-winduprobot.o: $(UTILS_SRC)/hsv.h
-winduprobot.o: $(UTILS_SRC)/resources.h
-winduprobot.o: $(UTILS_SRC)/textclient.h
-winduprobot.o: $(UTILS_SRC)/usleep.h
-winduprobot.o: $(UTILS_SRC)/visual.h
-winduprobot.o: $(UTILS_SRC)/xft.h
-winduprobot.o: $(UTILS_SRC)/yarandom.h
-winduprobot.o: $(HACK_SRC)/ximage-loader.h
-winduprobot.o: $(HACK_SRC)/xlockmoreI.h
-winduprobot.o: $(HACK_SRC)/xlockmore.h
-xlock-gl-utils.o: ../../config.h
-xlock-gl-utils.o: $(HACK_SRC)/fps.h
-xlock-gl-utils.o: $(HACK_SRC)/recanim.h
-xlock-gl-utils.o: $(HACK_SRC)/screenhackI.h
-xlock-gl-utils.o: $(srcdir)/texfont.h
-xlock-gl-utils.o: $(UTILS_SRC)/colors.h
-xlock-gl-utils.o: $(UTILS_SRC)/erase.h
-xlock-gl-utils.o: $(UTILS_SRC)/font-retry.h
-xlock-gl-utils.o: $(UTILS_SRC)/grabscreen.h
-xlock-gl-utils.o: $(UTILS_SRC)/hsv.h
-xlock-gl-utils.o: $(UTILS_SRC)/resources.h
-xlock-gl-utils.o: $(UTILS_SRC)/usleep.h
-xlock-gl-utils.o: $(UTILS_SRC)/visual.h
-xlock-gl-utils.o: $(UTILS_SRC)/xft.h
-xlock-gl-utils.o: $(UTILS_SRC)/yarandom.h
-xlock-gl-utils.o: $(HACK_SRC)/xlockmoreI.h
-xscreensaver-gl-visual.o: ../../config.h
-xscreensaver-gl-visual.o: $(UTILS_SRC)/visual.h
-
diff --git a/hacks/glx/README b/hacks/glx/README
deleted file mode 100644
index 1b7b3e8..0000000
--- a/hacks/glx/README
+++ /dev/null
@@ -1,9 +0,0 @@
-
-This directory contains various graphics hacks that requre OpenGL. These are
-independent from the xscreensaver program (in the ../../driver/ directory)
-but some of them use the utility functions found in the ../../utils/ directory.
-
-If you have compilation problems, check the parameters in ../../config.h.
-
-Writing a screen saver? Make sure you have read ../../README.hacking.
-
diff --git a/hacks/glx/antinspect.c b/hacks/glx/antinspect.c
deleted file mode 100644
index 913503f..0000000
--- a/hacks/glx/antinspect.c
+++ /dev/null
@@ -1,695 +0,0 @@
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Copyright 2004 Blair Tennessy
- * tennessy@cs.ubc.ca
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n"
-
-# define release_antinspect 0
-#include "xlockmore.h"
-#else
-#include "xlock.h"
-#endif
-
-#include "sphere.h"
-#include "gltrackball.h"
-
-#define DEF_SHADOWS "True"
-
-static int shadows;
-
-static XrmOptionDescRec opts[] = {
- {"-shadows", ".antinspect.shadows", XrmoptionNoArg, "on"},
- {"+shadows", ".antinspect.shadows", XrmoptionNoArg, "off"}
-};
-
-static argtype vars[] = {
- {&shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool}
-};
-
-static OptionStruct desc[] = {
- {"-/+shadows", "turn on/off ant shadows"}
-};
-
-ENTRYPOINT ModeSpecOpt antinspect_opts = {sizeof opts / sizeof opts[0],
- opts,
- sizeof vars / sizeof vars[0],
- vars,
- desc};
-
-#ifdef USE_MODULES
-ModStruct antinspect_description =
- {"antinspect", "init_antinspect", "draw_antinspect", (char *) NULL,
- "draw_antinspect", "change_antinspect", (char *) NULL, &antinspect_opts,
- 1000, 1, 1, 1, 4, 1.0, "",
- "draws some ants", 0, NULL};
-#endif
-
-#define Scale4Window 0.3
-#define Scale4Iconic 0.4
-
-#define sqr(A) ((A)*(A))
-
-#ifndef Pi
-#define Pi M_PI
-#endif
-
-#define ObjAntinspectStrip 0
-#define ObjAntBody 1
-#define MaxObj 2
-
-/*************************************************************************/
-
-typedef struct {
- GLint WindH, WindW;
- GLfloat step;
- GLfloat ant_position;
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
- int linewidth;
- float ant_step;
-
-} antinspectstruct;
-
-static const float front_shininess[] = {60.0};
-static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
-static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
-static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
-static float position0[] = {0.0, 3.0, 0.0, 1.0};
-static const float position1[] = {-1.0, -3.0, 1.0, 0.0};
-static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
-static const float lmodel_twoside[] = {GL_TRUE};
-
-static const float MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
-static const float MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
-static const float MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
-static const float MaterialBlack[] = {0.1, 0.1, 0.1, 0.4};
-static const float MaterialShadow[] = {0.3, 0.3, 0.3, 0.3};
-static const float MaterialGray5[] = {0.5, 0.5, 0.5, 0.3};
-static const float MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
-
-static antinspectstruct *antinspect = (antinspectstruct *) NULL;
-
-#define NUM_SCENES 2
-
-enum {X, Y, Z, W};
-enum {A, B, C, D};
-
-/* create a matrix that will project the desired shadow */
-static void shadowmatrix(GLfloat shadowMat[4][4],
- const GLfloat groundplane[4],
- const GLfloat lightpos[4])
-{
- GLfloat dot;
-
- /* find dot product between light position vector and ground plane normal */
- dot = groundplane[X] * lightpos[X] +
- groundplane[Y] * lightpos[Y] +
- groundplane[Z] * lightpos[Z] +
- groundplane[W] * lightpos[W];
-
- shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
- shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
- shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
- shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
-
- shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
- shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
- shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
- shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
-
- shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
- shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
- shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
- shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
-
- shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
- shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
- shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
- shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
-}
-
-static const GLfloat ground[4] = {0.0, 1.0, 0.0, -0.00001};
-
-/* simple filled sphere */
-static Bool mySphere(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
- gluSphere(quadObj, radius, 16, 16);
- gluDeleteQuadric(quadObj);
-#else
- glPushMatrix();
- glScalef (radius, radius, radius);
- glRotatef (90, 1, 0, 0);
- unit_sphere (16, 16, False);
- glPopMatrix();
-#endif
- return True;
-}
-
-/* caged sphere */
-static Bool mySphere2(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_LINE);/*GLU_SILHOUETTE);*/
- gluSphere(quadObj, radius, 16, 8);
- gluDeleteQuadric(quadObj);
-#else
- glPushMatrix();
- glScalef (radius, radius, radius);
- glRotatef (90, 1, 0, 0);
- unit_sphere (16, 8, True);
- glPopMatrix();
-#endif
-
- return True;
-}
-
-/* null cone */
-static Bool myCone2(float radius)
-{
- return True;
-}
-
-/* draw an ant */
-static Bool draw_antinspect_ant(ModeInfo *mi, antinspectstruct * mp,
- const float *Material, int mono,
- Bool (*sphere)(float), Bool (*cone)(float))
-{
- float cos1 = cos(mp->ant_step);
- float cos2 = cos(mp->ant_step + 2 * Pi / 3);
- float cos3 = cos(mp->ant_step + 4 * Pi / 3);
- float sin1 = sin(mp->ant_step);
- float sin2 = sin(mp->ant_step + 2 * Pi / 3);
- float sin3 = sin(mp->ant_step + 4 * Pi / 3);
-
- if (mono)
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
- else
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Material);
- glEnable(GL_CULL_FACE);
- glPushMatrix();
- glScalef(1, 1.3, 1);
- if (!((*sphere)(0.18)))
- return False;
- glScalef(1, 1 / 1.3, 1);
- glTranslatef(0.00, 0.30, 0.00);
- if (!((*sphere)(0.2)))
- return False;
-
- glTranslatef(-0.05, 0.17, 0.05);
- glRotatef(-90, 1, 0, 0);
- glRotatef(-25, 0, 1, 0);
- if (!((*cone)(0.05)))
- return False;
- glTranslatef(0.00, 0.10, 0.00);
- if (!((*cone)(0.05)))
- return False;
- glRotatef(25, 0, 1, 0);
- glRotatef(90, 1, 0, 0);
-
- glScalef(1, 1.3, 1);
- glTranslatef(0.15, -0.65, 0.05);
- if (!((*sphere)(0.25)))
- return False;
- glScalef(1, 1 / 1.3, 1);
- glPopMatrix();
- glDisable(GL_CULL_FACE);
-
- glDisable(GL_LIGHTING);
-
- /* ANTENNAS */
- glBegin(GL_LINES);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, 0.30, 0.00);
- glColor3fv(MaterialGray);
- glVertex3f(0.40, 0.70, 0.40);
- mi->polygon_count++;
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, 0.30, 0.00);
- glColor3fv(MaterialGray);
- glVertex3f(0.40, 0.70, -0.40);
- mi->polygon_count++;
- glEnd();
- glBegin(GL_POINTS);
- if (mono)
- glColor3fv(MaterialGray6);
- else
- glColor3fv(Material);
- glVertex3f(0.40, 0.70, 0.40);
- mi->polygon_count++;
- glVertex3f(0.40, 0.70, -0.40);
- mi->polygon_count++;
- glEnd();
-
- /* LEFT-FRONT ARM */
- glBegin(GL_LINE_STRIP);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, 0.05, 0.18);
- glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* LEFT-CENTER ARM */
- glBegin(GL_LINE_STRIP);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, 0.00, 0.18);
- glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
- mi->polygon_count++;
- glEnd();
- mi->polygon_count++;
-
- /* LEFT-BACK ARM */
- glBegin(GL_LINE_STRIP);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, -0.05, 0.18);
- glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-FRONT ARM */
- glBegin(GL_LINE_STRIP);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, 0.05, -0.18);
- glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-CENTER ARM */
- glBegin(GL_LINE_STRIP);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, 0.00, -0.18);
- glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-BACK ARM */
- glBegin(GL_LINE_STRIP);
- if (mono)
- glColor3fv(MaterialGray5);
- else
- glColor3fv(Material);
- glVertex3f(0.00, -0.05, -0.18);
- glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
- mi->polygon_count++;
- glEnd();
-
- glEnable(GL_LIGHTING);
-
- return True;
-}
-
-/* only works with 3 right now */
-#define ANTCOUNT 3
-
-static const float MaterialBen[4] = {0.25, 0.30, 0.46, 1.0};
-
-static const float* antmaterial[ANTCOUNT] =
- {MaterialRed, MaterialBen, MaterialOrange};
-static double antposition[ANTCOUNT] = {0.0, 120.0, 240.0};
-static const double antvelocity[ANTCOUNT] = {0.3, 0.3, 0.3};
-static const double antsphere[ANTCOUNT] = {1.2, 1.2, 1.2};
-
-/* permutations */
-static const double antorder[6][ANTCOUNT] = {{0, 1, 2},
- {0, 2, 1},
- {2, 0, 1},
- {2, 1, 0},
- {1, 2, 0},
- {1, 0, 2}};
-
-/* draw the scene */
-static Bool draw_antinspect_strip(ModeInfo * mi)
-{
- antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
- int i, j;
- int mono = MI_IS_MONO(mi);
-
- int ro = (((int)antposition[1])/(360/(2*ANTCOUNT))) % (2*ANTCOUNT);
-
- glEnable(GL_TEXTURE_2D);
- position0[1] = 9.6;
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
- glRotatef(-30.0, 0.0, 1.0, 0.0);
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
-
- /* render ground plane */
- glBegin(GL_TRIANGLES);
- glColor4fv(MaterialShadow);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlack);
- glNormal3f(0.0, 1.0, 0.0);
-
- /* middle tri */
- glVertex3f(0.0, 0.0, -1.0);
- glVertex3f(-sqrt(3.0)/2.0, 0.0, 0.5);
- glVertex3f(sqrt(3.0)/2.0, 0.0, 0.5);
- mi->polygon_count++;
- glEnd();
-
- /* rotate */
- for(i = 0; i < 3; ++i) {
- glRotatef(120.0, 0.0, 1.0, 0.0);
- glBegin(GL_TRIANGLES);
- glVertex3f(0.0, 0.0, 1.0 + 3.0);
- glVertex3f(sqrt(3.0)/2.0, 0.0, -0.5 + 3.0);
- glVertex3f(-sqrt(3.0)/2.0, 0.0, -0.5 + 3.0);
- mi->polygon_count++;
- glEnd();
- }
-
- /* first render shadows -- no depth required */
- if(shadows) {
- GLfloat m[4][4];
- shadowmatrix(m, ground, position0);
-
- glColor4fv(MaterialShadow);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
-
- glDisable(GL_BLEND);
- glDisable(GL_LIGHTING);
-
- /* display ant shadow */
- glPushMatrix();
- glTranslatef(0.0, 0.001, 0.0);
- glMultMatrixf(m[0]);
-
- for(i = 0; i < ANTCOUNT; ++i) {
-
- /* draw ant */
- glPushMatrix();
-
- /* center */
- glRotatef(antposition[i], 0.0, 1.0, 0.0);
- glTranslatef(2.4, 0.0, 0.0);
- glTranslatef(0.0, antsphere[i], 0.0);
- glRotatef(90.0, 0.0, 1.0, 0.0);
-
- /* orient ant */
- glRotatef(10.0, 0.0, 1.0, 0.0);
- glRotatef(40.0, 0.0, 0.0, 1.0);
- glTranslatef(0.0, -0.8, 0.0);
- glRotatef(180.0, 0.0, 1.0, 0.0);
- glRotatef(90.0, 0.0, 0.0, 1.0);
-
- /* set colour */
- glColor4fv(MaterialShadow);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
-
- if(antposition[i] > 360.0)
- antposition[i] = 0.0;
- draw_antinspect_ant(mi, mp, MaterialShadow, mono, mySphere2, myCone2);
-
- glDisable(GL_BLEND);
- glDisable(GL_LIGHTING);
-
- /* draw sphere */
- glRotatef(-20.0, 1.0, 0.0, 0.0);
- glRotatef(-mp->ant_step*2, 0.0, 0.0, 1.0);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
- mySphere2(1.2);
-
- glPopMatrix();
- }
-
- glPopMatrix();
- }
-
- glEnable(GL_LIGHTING);
-
- /* truants */
- for(j = 0; j < ANTCOUNT; ++j) {
- /* determine rendering order */
- i = antorder[ro][j];
-
- glPushMatrix();
-
- /* center */
- glRotatef(antposition[i], 0.0, 1.0, 0.0);
- glTranslatef(2.4, 0.0, 0.0);
- glTranslatef(0.0, antsphere[i], 0.0);
- glRotatef(90.0, 0.0, 1.0, 0.0);
-
- /* draw ant */
- glPushMatrix();
- glRotatef(10.0, 0.0, 1.0, 0.0);
- glRotatef(40.0, 0.0, 0.0, 1.0);
- glTranslatef(0.0, -0.8, 0.0);
- glRotatef(180.0, 0.0, 1.0, 0.0);
- glRotatef(90.0, 0.0, 0.0, 1.0);
- if(antposition[i] > 360.0)
- antposition[i] = 0.0;
- glEnable(GL_BLEND);
- draw_antinspect_ant(mi, mp, antmaterial[i], mono, mySphere2, myCone2);
- glDisable(GL_BLEND);
- glPopMatrix();
-
- /* draw sphere */
- glRotatef(-20.0, 1.0, 0.0, 0.0);
- glRotatef(-mp->ant_step*2, 0.0, 0.0, 1.0);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : antmaterial[i]);
- mySphere2(1.2);
- glEnable(GL_BLEND);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlack);
- mySphere(1.16);
- glDisable(GL_BLEND);
-
- glPopMatrix();
-
- /* finally, evolve */
- antposition[i] += antvelocity[i];
- }
-
- /* but the step size is the same! */
- mp->ant_step += 0.2;
-
- mp->ant_position += 1;
- return True;
-}
-
-ENTRYPOINT void reshape_antinspect(ModeInfo * mi, int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
- int y = 0;
- antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
- mp->linewidth = (width / 512) + 1;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- gluPerspective(45, 1/h, 7.0, 20.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLineWidth(mp->linewidth);
- glPointSize(mp->linewidth);
-}
-
-static void pinit(void)
-{
- glClearDepth(1.0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_POSITION, position1);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_NORMALIZE);
- glFrontFace(GL_CCW);
-
- /* antinspect */
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glDisable(GL_TEXTURE_2D);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
-}
-
-ENTRYPOINT Bool antinspect_handle_event (ModeInfo *mi, XEvent *event)
-{
- antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, mp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &mp->button_down_p))
- return True;
-
- return False;
-}
-
-ENTRYPOINT void init_antinspect(ModeInfo * mi)
-{
- antinspectstruct *mp;
-
- MI_INIT(mi, antinspect);
- mp = &antinspect[MI_SCREEN(mi)];
- mp->step = NRAND(90);
- mp->ant_position = NRAND(90);
- mp->trackball = gltrackball_init (False);
-
- if ((mp->glx_context = init_GL(mi)) != NULL) {
- reshape_antinspect(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- pinit();
- }
- else
- MI_CLEARWINDOW(mi);
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-}
-
-ENTRYPOINT void draw_antinspect(ModeInfo * mi)
-{
- antinspectstruct *mp;
-
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if(!antinspect)
- return;
- mp = &antinspect[MI_SCREEN(mi)];
-
- MI_IS_DRAWN(mi) = True;
-
- if(!mp->glx_context)
- return;
-
- glXMakeCurrent(display, window, *mp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
- mi->polygon_count = 0;
-
- /* position camera --- this works well, we can peer inside
- the antbubble */
- glTranslatef(0.0, 0.0, -10.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- gltrackball_rotate(mp->trackball);
- glRotatef((15.0/2.0 + 15.0*sin(mp->ant_step/100.0)), 1.0, 0.0, 0.0);
- glRotatef(30.0, 1.0, 0.0, 0.0);
- glRotatef(180.0, 0.0, 1.0, 0.0);
-
- if (!draw_antinspect_strip(mi)) {
- MI_ABORT(mi);
- return;
- }
-
- glPopMatrix();
-
- if (MI_IS_FPS(mi)) do_fps (mi);
- glFlush();
-
- glXSwapBuffers(display, window);
-
- mp->step += 0.025;
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void change_antinspect(ModeInfo * mi)
-{
- antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
-
- if (!mp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- pinit();
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void free_antinspect(ModeInfo * mi)
-{
- antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
- if (!mp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- gltrackball_free (mp->trackball);
-}
-
-XSCREENSAVER_MODULE ("AntInspect", antinspect)
diff --git a/hacks/glx/antinspect.man b/hacks/glx/antinspect.man
deleted file mode 100644
index ba5d06b..0000000
--- a/hacks/glx/antinspect.man
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH XScreenSaver 1 "March 2004"
-.SH NAME
-antinspect \- ant model inspection screenhack
-.SH SYNOPSIS
-.B antinspect
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
-.SH DESCRIPTION
-The \fIantinspect\fP code displays three ant-powered balls churning in a
-circle.
-.SH OPTIONS
-.I antinspect
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-shadows
-Draw shadows on ground
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2004 by Blair Tennessy. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Blair Tennessy <tennessy@cs.ubc.ca>, 15-March-2004.
-
diff --git a/hacks/glx/antmaze.c b/hacks/glx/antmaze.c
deleted file mode 100644
index fe9905f..0000000
--- a/hacks/glx/antmaze.c
+++ /dev/null
@@ -1,1611 +0,0 @@
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Copyright 2004 Blair Tennessy
- * tennessy@cs.ubc.ca
- */
-
-#if 0
-static const char sccsid[] = "@(#)antmaze.c 5.01 2001/03/01 xlockmore";
-#endif
-
-#ifdef STANDALONE
-# define MODE_antmaze
-# define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*fpsSolid: True \n"
-
-# define release_antmaze 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef MODE_antmaze
-
-
-#include "sphere.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-
-#define DEF_SOLIDANTMAZE "False"
-#define DEF_NOANTS "False"
-
-static int solidantmaze;
-static int noants;
-
-static XrmOptionDescRec opts[] =
-{
- {"-solidantmaze", ".antmaze.solidantmaze", XrmoptionNoArg, "on"},
- {"+solidantmaze", ".antmaze.solidantmaze", XrmoptionNoArg, "off"},
- {"-noants", ".antmaze.noants", XrmoptionNoArg, "on"},
- {"+noants", ".antmaze.noants", XrmoptionNoArg, "off"}
-};
-static argtype vars[] =
-{
- {&solidantmaze, "solidantmaze", "Solidantmaze", DEF_SOLIDANTMAZE, t_Bool},
- {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
-};
-
-static OptionStruct desc[] =
-{
- {"-/+solidantmaze", "select between a SOLID or a NET Antmaze Strip"},
- {"-/+noants", "turn on/off walking ants"}
-};
-
-ENTRYPOINT ModeSpecOpt antmaze_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct antmaze_description =
-{"antmaze", "init_antmaze", "draw_antmaze", NULL,
- "draw_antmaze", "change_antmaze", NULL, &antmaze_opts,
- 1000, 1, 1, 1, 4, 1.0, "",
- "draws some ants", 0, NULL};
-
-#endif
-
-#define Scale4Window 0.3
-#define Scale4Iconic 0.4
-
-#define sqr(A) ((A)*(A))
-
-#ifndef Pi
-#define Pi M_PI
-#endif
-
-#define ObjAntmazeStrip 0
-#define ObjAntBody 1
-#define MaxObj 2
-
-/*************************************************************************/
-
-#include "ants.h"
-
-#define ANTCOUNT 5
-#define PI M_PI
-
-#define EPSILON 0.01
-#define BOARDSIZE 10
-#define BOARDCOUNT 2
-#define PARTS 20
-
-#define checkImageWidth 64
-#define checkImageHeight 64
-
-typedef struct {
- GLint WindH, WindW;
- GLfloat step;
- GLfloat ant_position;
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- int focus;
- int currentboard;
-
- double antdirection[ANTCOUNT];
- double antposition[ANTCOUNT][3];
- int anton[ANTCOUNT];
-
- double antvelocity[ANTCOUNT];
- double antsize[ANTCOUNT];
- int bposition[ANTCOUNT][2];
- int board[BOARDCOUNT][10][10];
-
- int part[ANTCOUNT];
- double antpath[ANTCOUNT][PARTS][2];
- int antpathlength[ANTCOUNT];
-
- GLubyte checkers[checkImageWidth][checkImageHeight][3];
-
- GLuint checktexture, brushedtexture;
- double elevator;
-
- double ant_step;
- double first_ant_step;
- int started;
- int introduced;
- int entroducing;
-
- double fadeout;
- double fadeoutspeed;
-
- int mag;
-
-} antmazestruct;
-
-static antmazestruct *antmaze = (antmazestruct *) NULL;
-
-
-static const GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
-/*static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/
-static const GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
-static const GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
-static const GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
-static const GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
-static const GLfloat MaterialGreen[] = {0.1, 0.4, 0.2, 1.0};
-
-/* lighting variables */
-static const GLfloat front_shininess[] = {60.0};
-static const GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
-static const GLfloat ambient[] = {0.1, 0.1, 0.1, 1.0};
-/*static const GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};*/
-static const GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0};
-static const GLfloat position0[] = {1.0, 5.0, 1.0, 1.0};
-static const GLfloat position1[] = {-1.0, -5.0, 1.0, 1.0};
-/*static const GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};*/
-/*static const GLfloat lmodel_twoside[] = {GL_TRUE};*/
-/*static const GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };*/
-/*static const GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };*/
-
-#define NUM_SCENES 2
-
-/* filled sphere */
-static Bool mySphere(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
- gluSphere(quadObj, radius, 16, 16);
- gluDeleteQuadric(quadObj);
-#else
- glPushMatrix();
- glScalef (radius, radius, radius);
- glRotatef (90, 1, 0, 0);
- unit_sphere (16, 16, False);
- glPopMatrix();
-#endif
- return True;
-}
-
-#if 0
-/* silhouette sphere */
-static Bool mySphere2(float radius)
-{
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_SILHOUETTE);
- gluSphere(quadObj, radius, 16, 8);
- gluDeleteQuadric(quadObj);
-
- return True;
-}
-#endif
-
-/* textured sphere */
-static Bool mySphereTex(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
- gluQuadricTexture(quadObj, GL_TRUE);
- gluQuadricNormals(quadObj, GLU_SMOOTH);
- gluSphere(quadObj, radius, 32, 16);
- gluDeleteQuadric(quadObj);
-#else
- glPushMatrix();
- glScalef (radius, radius, radius);
- glRotatef (90, 1, 0, 0);
- unit_sphere (32, 16, False);
- glPopMatrix();
-#endif
-
- return True;
-}
-
-/* filled cone */
-static Bool myCone(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if ((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
- gluCylinder(quadObj, radius, 0, radius * 2, 8, 1);
- gluDeleteQuadric(quadObj);
-#else
- cone (0, 0, 0,
- 0, 0, radius * 2,
- radius, 0,
- 8, True, True, False);
-#endif
- return True;
-}
-
-/* no cone */
-static Bool myCone2(float radius) { return True; }
-
-#define MATERIALS 4
-static const float *antmaterial[ANTCOUNT] =
- {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange, MaterialGreen};
-
-static const float *materials[MATERIALS] =
- {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange};
-
-
-static void makeCheckImage(antmazestruct *mp)
-{
- int i, j;
-
- for (i = 0; i < checkImageWidth; i++) {
- for (j = 0; j < checkImageHeight; j++) {
- if(((((i&0x8)==0)^((j&0x8)))==0)) {
- int c = 102 + random()%32;
- mp->checkers[i][j][0] = c;
- mp->checkers[i][j][1] = c;
- mp->checkers[i][j][2] = c;
- }
- else {
- int c = 153 + random()%32;
- mp->checkers[i][j][0] = c;/*153;*/
- mp->checkers[i][j][1] = c;/*c;*//*0;*/
- mp->checkers[i][j][2] = c;/*c;*//*0;*/
- }
- }
- }
-
- glGenTextures(1, &mp->checktexture);
- glBindTexture(GL_TEXTURE_2D, mp->checktexture);
-
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
- checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
- &mp->checkers[0][0]);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-}
-
-static void makeBrushedImage(antmazestruct *mp)
-{
- int i, j, c;
-
- for(i = 0; i < checkImageWidth; ++i)
- for(j = 0; j < checkImageHeight; ++j) {
-
- c = 102+102*fabs(sin(2.0*i / Pi)*sin(2.0*j/Pi)) + random()%51;
-
-/* c = (i+j)%8==0 || (i+j+5)%8==0 ? 153 : 102; */
-
- mp->checkers[i][j][0] = c;
- mp->checkers[i][j][1] = c;
- mp->checkers[i][j][2] = c;
- }
-
-/* for (i = 0; i < checkImageWidth; i++) { */
-/* for (j = 0; j < checkImageHeight; j++) { */
-/* int c = 102 + pow((random()%1000)/1000.0, 4)*103; */
-/* checkers[i][j][0] = c; */
-/* checkers[i][j][1] = c; */
-/* checkers[i][j][2] = c; */
-/* } */
-/* } */
-
-/* /\* smooth *\/ */
-/* for (i = 0; i < checkImageWidth; i++) { */
-/* for (j = 0; j < checkImageHeight; j++) { */
-/* int a = checkers[(i+checkImageWidth+1)%checkImageWidth][j][0] + */
-/* 4*checkers[i][j][0] + checkers[(i+1)%checkImageWidth][j][0]; */
-/* a /= 6; */
-/* checkers[i][j][0] = a; */
-/* checkers[i][j][1] = a; */
-/* checkers[i][j][2] = a; */
-/* } */
-/* } */
-
- glGenTextures(1, &mp->brushedtexture);
- glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
-
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
- checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
- &mp->checkers[0][0]);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-}
-
-#if 0
-static void draw_wall(ModeInfo *mi, double x1, double z1, double x2, double z2)
-{
- float x = fabs(x2 - x1)/2.0;
-
- glBegin(GL_QUADS);
-
- /* draw top */
- glNormal3f(0.0, 1.0, 0.0);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x1, 1.0, z1+0.25);
- glTexCoord2f(x, 0.0);
- glVertex3f(x2, 1.0, z2+0.25);
- glTexCoord2f(x, 0.25);
- glVertex3f(x2, 1.0, z2-0.25);
- glTexCoord2f(0.0, 0.25);
- glVertex3f(x1, 1.0, z1-0.25);
- mi->polygon_count++;
-
- /* draw sides */
- glNormal3f(0.0, 0.0, 1.0);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x1, 0.0, z1+0.25);
- glTexCoord2f(x, 0.0);
- glVertex3f(x2, 0.0, z2+0.25);
- glTexCoord2f(x, 0.5);
- glVertex3f(x2, 1.0, z2+0.25);
- glTexCoord2f(0.0, 0.5);
- glVertex3f(x1, 1.0, z1+0.25);
- mi->polygon_count++;
-
- glNormal3f(0.0, 0.0, -1.0);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x1, 0.0, z1-0.25);
- glTexCoord2f(x, 0.0);
- glVertex3f(x2, 0.0, z2-0.25);
- glTexCoord2f(x, 0.5);
- glVertex3f(x2, 1.0, z2-0.25);
- glTexCoord2f(0.0, 0.5);
- glVertex3f(x1, 1.0, z1-0.25);
- mi->polygon_count++;
-
- /* draw ends */
- glNormal3f(1.0, 0.0, 0.0);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x2, 0.0, z2+0.25);
- glTexCoord2f(0.25, 0.0);
- glVertex3f(x2, 0.0, z2-0.25);
- glTexCoord2f(0.25, 0.5);
- glVertex3f(x2, 1.0, z2-0.25);
- glTexCoord2f(0.0, 0.5);
- glVertex3f(x2, 1.0, z2+0.25);
- mi->polygon_count++;
-
- glNormal3f(-1.0, 0.0, 0.0);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x1, 0.0, z1-0.25);
- glTexCoord2f(0.25, 0.0);
- glVertex3f(x1, 0.0, z1+0.25);
- glTexCoord2f(0.25, 0.5);
- glVertex3f(x1, 1.0, z1+0.25);
- glTexCoord2f(0.0, 0.5);
- glVertex3f(x1, 1.0, z1-0.25);
- mi->polygon_count++;
-
- glEnd();
-}
-#endif
-
-static void draw_board(ModeInfo *mi, antmazestruct *mp)
-{
-
- int i, j;
- double h = 0.5;
- double stf = 0.0625;
-
- glBindTexture(GL_TEXTURE_2D, mp->checktexture);
-
- glBegin(GL_QUADS);
-
- for(i = 0; i < BOARDSIZE; ++i)
- for(j = 0; j < BOARDSIZE; ++j) {
- if(mp->board[mp->currentboard][j][i]) {
-
-/* /\* draw top *\/ */
-/* glNormal3f(0.0, 1.0, 0.0); */
-/* glTexCoord2f(0.0 + stf, 0.0 + stf); */
-/* glVertex3f(i-0.5, h, j+0.5); */
-/* glTexCoord2f(1.0 + stf, 0.0 + stf); */
-/* glVertex3f(i+0.5, h, j+0.5); */
-/* glTexCoord2f(1.0 + stf, 1.0 + stf); */
-/* glVertex3f(i+0.5, h, j-0.5); */
-/* glTexCoord2f(0.0 + stf, 1.0 + stf); */
-/* glVertex3f(i-0.5, h, j-0.5); */
-
- /* draw top */
- glNormal3f(0.0, 1.0, 0.0);
- glTexCoord2f(0.0 + stf, 0.0 + stf);
- glVertex3f(i-0.5, h, j+0.5);
- glTexCoord2f(1.0 + stf, 0.0 + stf);
- glVertex3f(i+0.5, h, j+0.5);
- glTexCoord2f(1.0 + stf, 1.0 + stf);
- glVertex3f(i+0.5, h, j-0.5);
- glTexCoord2f(0.0 + stf, 1.0 + stf);
- glVertex3f(i-0.5, h, j-0.5);
- mi->polygon_count++;
-
- /* draw south face */
- if(j == 9 || !mp->board[mp->currentboard][j+1][i]) {
- glNormal3f(0.0, 0.0, 1.0);
- glTexCoord2f(0.0 + stf, 0.0 + stf);
- glVertex3f(i-0.5, 0.0, j+0.5);
- glTexCoord2f(1.0 + stf, 0.0 + stf);
- glVertex3f(i+0.5, 0.0, j+0.5);
- glTexCoord2f(1.0 + stf, h + stf);
- glVertex3f(i+0.5, h, j+0.5);
- glTexCoord2f(0.0 + stf, h + stf);
- glVertex3f(i-0.5, h, j+0.5);
- mi->polygon_count++;
- }
-
- /* draw north face */
- if(j == 0 || !mp->board[mp->currentboard][j-1][i]) {
- glNormal3f(0.0, 0.0, -1.0);
- glTexCoord2f(0.0 + stf, 0.0 + stf);
- glVertex3f(i+0.5, 0.0, j-0.5);
- glTexCoord2f(1.0 + stf, 0.0 + stf);
- glVertex3f(i-0.5, 0.0, j-0.5);
- glTexCoord2f(1.0 + stf, h + stf);
- glVertex3f(i-0.5, h, j-0.5);
- glTexCoord2f(0.0 + stf, h + stf);
- glVertex3f(i+0.5, h, j-0.5);
- mi->polygon_count++;
- }
-
- /* draw east face */
- if(i == 9 || !mp->board[mp->currentboard][j][i+1]) {
- glNormal3f(1.0, 0.0, 0.0);
- glTexCoord2f(0.0 + stf, 0.0 + stf);
- glVertex3f(i+0.5, 0.0, j+0.5);
- glTexCoord2f(1.0 + stf, 0.0 + stf);
- glVertex3f(i+0.5, 0.0, j-0.5);
- glTexCoord2f(1.0 + stf, h + stf);
- glVertex3f(i+0.5, h, j-0.5);
- glTexCoord2f(0.0 + stf, h + stf);
- glVertex3f(i+0.5, h, j+0.5);
- mi->polygon_count++;
- }
-
- /* draw west face */
- if(i == 0 || !mp->board[mp->currentboard][j][i-1]) {
- glNormal3f(-1.0, 0.0, 0.0);
- glTexCoord2f(0.0 + stf, 0.0 + stf);
- glVertex3f(i-0.5, 0.0, j-0.5);
- glTexCoord2f(1.0 + stf, 0.0 + stf);
- glVertex3f(i-0.5, 0.0, j+0.5);
- glTexCoord2f(1.0 + stf, h + stf);
- glVertex3f(i-0.5, h, j+0.5);
- glTexCoord2f(0.0 + stf, h + stf);
- glVertex3f(i-0.5, h, j-0.5);
- mi->polygon_count++;
- }
- }
- else {
- double tx = 2.0;
- glNormal3f(0.0, 1.0, 0.0);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(i-0.5, 0.0, j+0.5);
- glTexCoord2f(tx, 0.0);
- glVertex3f(i+0.5, 0.0, j+0.5);
- glTexCoord2f(tx, tx);
- glVertex3f(i+0.5, 0.0, j-0.5);
- glTexCoord2f(0.0, tx);
- glVertex3f(i-0.5, 0.0, j-0.5);
- mi->polygon_count++;
- }
- }
- glEnd();
-
-/* /\* draw elevator *\/ */
-/* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
-
-/* glBegin(GL_QUADS); */
-
-/* glNormal3f(0.0, 1.0, 0.0); */
-
-/* if(pastfirst) { */
-/* /\* source *\/ */
-/* glTexCoord2f(0.0, 0.0); */
-/* glVertex3f(0.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
-/* glTexCoord2f(1.0, 0.0); */
-/* glVertex3f(1.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
-/* glTexCoord2f(1.0, 1.5); */
-/* glVertex3f(1.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
-/* glTexCoord2f(0.0, 1.5); */
-/* glVertex3f(0.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
-/* mi->polygon_count++; */
-/* } */
-
-/* /\* destination *\/ */
-/* glTexCoord2f(0.0, 0.0); */
-/* glVertex3f(BOARDSIZE - 2.5, elevator, -2.0 - 0.2); */
-/* glTexCoord2f(1.0, 0.0); */
-/* glVertex3f(BOARDSIZE - 1.5, elevator, -2.0 - 0.2); */
-/* glTexCoord2f(1.0, 1.5); */
-/* glVertex3f(BOARDSIZE - 1.5, elevator, -0.5 - 0.2); */
-/* glTexCoord2f(0.0, 1.5); */
-/* glVertex3f(BOARDSIZE - 2.5, elevator, -0.5 - 0.2); */
-/* mi->polygon_count++; */
-
-/* glEnd(); */
-
-/* for(i = 0; i < BOARDSIZE; ++i) */
-/* for(j = 0; j < BOARDSIZE; ++j) { */
-/* if(board[j][i]) { */
-
-/* /\* draw brushed boxtop *\/ */
-/* glNormal3f(0.0, 1.0, 0.0); */
-/* glTexCoord2f(0.0 + stf, 0.0 + stf); */
-/* glVertex3f(i-0.5 + stf, h+0.001, j+0.5 - stf); */
-/* glTexCoord2f(1.0 + stf, 0.0 + stf); */
-/* glVertex3f(i+0.5 - stf, h+0.001, j+0.5 - stf); */
-/* glTexCoord2f(1.0 + stf, 1.0 + stf); */
-/* glVertex3f(i+0.5 - stf, h+0.001, j-0.5 + stf); */
-/* glTexCoord2f(0.0 + stf, 1.0 + stf); */
-/* glVertex3f(i-0.5 + stf, h+0.001, j-0.5 + stf); */
-/* mi->polygon_count++; */
-/* } */
-/* } */
-
-/* glEnd(); */
-}
-
-static void build_board(antmazestruct *mp, int b)
-{
- int i, j;
-
- for(i = 0; i < BOARDSIZE; ++i)
- for(j = 0; j < BOARDSIZE; ++j)
- mp->board[b][i][j] = 1;
-
-/* for(i = 0; i < BOARDSIZE; ++i) { */
-/* board[0][i] = 1; */
-/* board[i][0] = 1; */
-/* board[BOARDSIZE-1][BOARDSIZE-i] = 1; */
-/* board[BOARDSIZE-i][BOARDSIZE-1] = 1; */
-/* } */
-
-/* board[0][BOARDSIZE-2] = 0; */
-/* board[BOARDSIZE-1][1] = 0; */
-
-
- mp->board[b][BOARDSIZE-1][1] = 0;
- mp->board[b][0][BOARDSIZE-2] = 0;
-
- /* build the ant paths */
- if(mp->currentboard == b) {
- for(i = 0; i < ANTCOUNT; ++i) {
- int sx = BOARDSIZE-2;
- int sy = 1;
-
- for(j = 0; ; ++j) {
- mp->board[b][sx][sy] = 0;
- mp->antpath[i][j][0] = sy - 5.0;
- mp->antpath[i][j][1] = sx - 5.0;
-
- if(random()%2) {
- if(sx > 1)
- sx -= 1;
- else if(sy < BOARDSIZE-2)
- sy += 1;
- else
- break;
- }
- else {
- if(sy < BOARDSIZE-2)
- sy += 1;
- else if(sx > 1)
- sx -= 1;
- else
- break;
- }
- }
-
- ++j;
- mp->antpath[i][j][0] = BOARDSIZE-7.0;
- mp->antpath[i][j][1] = -7.0;
- mp->antpathlength[i] = j;
- }
- }
-
-/* for(i = 0; i < 20; ++i) { */
-/* int x = 1 + random()%(BOARDSIZE-2); */
-/* int y = 1 + random()%(BOARDSIZE-2); */
-/* board[x][y] = 1; */
-/* } */
-}
-
-/* compute nearness */
-static int near(double a[2], double b[2])
-{
- return fabs(a[0] - b[0]) < 0.5 && fabs(a[1] - b[1]) < 0.5;
-}
-
-static double sign(double d)
-{
- return d < 0.0 ? -1.0 : 1.0;
-}
-
-static double min(double a, double b)
-{
- return a < b ? a : b;
-}
-
-/* draw method for ant */
-static Bool draw_ant(ModeInfo *mi, antmazestruct *mp,
- const float *Material, int mono, int shadow,
- float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
-{
-
- float cos1 = cos(mp->ant_step);
- float cos2 = cos(mp->ant_step + 2 * Pi / 3);
- float cos3 = cos(mp->ant_step + 4 * Pi / 3);
- float sin1 = sin(mp->ant_step);
- float sin2 = sin(mp->ant_step + 2 * Pi / 3);
- float sin3 = sin(mp->ant_step + 4 * Pi / 3);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : Material);
-
-/* glEnable(GL_CULL_FACE); */
-
- glPushMatrix();
- glScalef(1, 1.3, 1);
- if(!((*sphere)(0.18)))
- return False;
- glScalef(1, 1 / 1.3, 1);
- glTranslatef(0.00, 0.30, 0.00);
- if(!((*sphere)(0.2)))
- return False;
-
- glTranslatef(-0.05, 0.17, 0.05);
- glRotatef(-90, 1, 0, 0);
- glRotatef(-25, 0, 1, 0);
- if(!((*cone)(0.05)))
- return False;
- glTranslatef(0.00, 0.10, 0.00);
- if(!((*cone)(0.05)))
- return False;
- glRotatef(25, 0, 1, 0);
- glRotatef(90, 1, 0, 0);
-
- glScalef(1, 1.3, 1);
- glTranslatef(0.15, -0.65, 0.05);
- if(!((*sphere)(0.25)))
- return False;
- glScalef(1, 1 / 1.3, 1);
- glPopMatrix();
-
-/* glDisable(GL_CULL_FACE); */
-
- glDisable(GL_LIGHTING);
-
- /* ANTENNAS */
- glBegin(GL_LINES);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.30, 0.00);
- glColor3fv(MaterialGray);
- glVertex3f(0.40, 0.70, 0.40);
- mi->polygon_count++;
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.30, 0.00);
- glColor3fv(MaterialGray);
- glVertex3f(0.40, 0.70, -0.40);
- mi->polygon_count++;
- glEnd();
-
- if(!shadow) {
- glBegin(GL_POINTS);
- glColor3fv(mono ? MaterialGray6 : MaterialRed);
- glVertex3f(0.40, 0.70, 0.40);
- mi->polygon_count++;
- glVertex3f(0.40, 0.70, -0.40);
- mi->polygon_count++;
- glEnd();
- }
-
- /* LEFT-FRONT ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.05, 0.18);
- glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* LEFT-CENTER ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.00, 0.18);
- glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* LEFT-BACK ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, -0.05, 0.18);
- glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-FRONT ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.05, -0.18);
- glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-CENTER ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.00, -0.18);
- glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-BACK ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mono ? MaterialGray5 : Material);
- glVertex3f(0.00, -0.05, -0.18);
- glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
- mi->polygon_count++;
- glEnd();
-
- if(!shadow) {
- glBegin(GL_POINTS);
- glColor3fv(mono ? MaterialGray8 : MaterialGray35);
- glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
- glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
- glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
- glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
- glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
- glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
- mi->polygon_count += 6;
- glEnd();
- }
-
- glEnable(GL_LIGHTING);
-
- return True;
-}
-
-static Bool draw_antmaze_strip(ModeInfo * mi)
-{
- antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
- int i;
- int mono = MI_IS_MONO(mi);
-
-/* glMatrixMode(GL_MODELVIEW); */
-/* glLoadIdentity(); */
-/* glPushMatrix(); */
-
- glEnable(GL_LIGHTING);
-/* glDisable(GL_BLEND); */
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
-
- /* set light */
-/* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
-/* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
-/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
-/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
-
- /* draw board */
- if(mp->elevator < 1.0) {
- glEnable(GL_TEXTURE_2D);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
- glTranslatef(-(BOARDSIZE-1)/2.0, 0.0, -(BOARDSIZE-1)/2.0);
- draw_board(mi, mp);
- glTranslatef(BOARDSIZE/2.0, 0.0, BOARDSIZE/2.0);
- glDisable(GL_TEXTURE_2D);
- }
-
- mp->introduced--;
-
- glTranslatef(0.0, -0.1, 0.0);
-
- for(i = 0; i < ANTCOUNT; ++i) {
-
-/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
-/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
-
- if(!mp->anton[i]) { continue; }
-
- /* determine location, move to goal */
- glPushMatrix();
- glTranslatef(0.0, 0.01, 0.0);
- glTranslatef(mp->antposition[i][0], mp->antposition[i][2], mp->antposition[i][1]);
-/* glScalef(1.0, 0.01, 1.0); */
- glScalef(0.6, 0.01, 0.6);
- glRotatef(180.0 + mp->antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
- glRotatef(90.0, 0.0, 0.0, 1.0);
- glDisable(GL_LIGHTING);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glColor4fv(MaterialGrayB);
-
- glScalef(mp->antsize[i], mp->antsize[i], mp->antsize[i]);
-
- /* slow down first ant */
- if(i == 0 && mp->part[i] == mp->antpathlength[i])
- draw_ant(mi, mp, MaterialGrayB, mono, 1, mp->first_ant_step, mySphere, myCone);
- else
- draw_ant(mi, mp, MaterialGrayB, mono, 1, mp->ant_step, mySphere, myCone);
-
- glPopMatrix();
-
- glDisable(GL_BLEND);
- glEnable(GL_LIGHTING);
-
- glPushMatrix();
-/* glTranslatef(0.0, 0.18, 0.0); */
- glTranslatef(0.0, 0.12, 0.0);
- glTranslatef(mp->antposition[i][0], mp->antposition[i][2], mp->antposition[i][1]);
- glRotatef(180.0 + mp->antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
- glRotatef(90.0, 0.0, 0.0, 1.0);
- glScalef(0.6, 0.6, 0.6);
-
- glScalef(mp->antsize[i], mp->antsize[i], mp->antsize[i]);
-
-/* glEnable(GL_TEXTURE_2D); */
-/* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
-
-/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); */
-
- /* slow down first ant */
- if(i == 0 && mp->part[i] == mp->antpathlength[i] && mp->elevator > 0.0) {
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- draw_ant(mi, mp, antmaterial[i], mono, 1, mp->first_ant_step, mySphere, myCone);
- }
- else {
-/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
-/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
- draw_ant(mi, mp, antmaterial[i], mono, 1, mp->ant_step, mySphereTex, myCone);
- glDisable(GL_TEXTURE_2D);
- }
-
-
-/* draw_ant(mi, antmaterial[i], mono, 0, ant_step, mySphereTex, myCone); */
-/* glDisable(GL_TEXTURE_2D); */
- glPopMatrix();
- }
-
-/* glPopMatrix(); */
-
-/* /\* now draw overlay *\/ */
-/* glDisable(GL_LIGHTING); */
-/* glDisable(GL_BLEND); */
-
-/* /\* go to ortho mode *\/ */
-/* glMatrixMode(GL_PROJECTION); */
-/* glPushMatrix(); */
-/* glLoadIdentity(); */
-/* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
-
-/* /\* translate to corner *\/ */
-/* glTranslatef(4.0-1.2, 3.0-1.2, 0.0); */
-
-/* glDisable(GL_LIGHTING); */
-/* glEnable(GL_BLEND); */
-
-/* /\* draw the 2d board *\/ */
-/* glBegin(GL_QUADS); */
-/* { */
-/* int i, j; */
-/* double sz = 1.0; */
-/* for(i = 0; i < BOARDSIZE; ++i) */
-/* for(j = 0; j < BOARDSIZE; ++j) { */
-/* int par = board[i][j]; */
-/* glColor4f(par ? 0.4 : 0.6, */
-/* par ? 0.4 : 0.6, */
-/* par ? 0.4 : 0.6, */
-/* 0.5); */
-/* glNormal3f(0.0, 0.0, 1.0); */
-/* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
-/* glVertex3f((sz*i)/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
-/* glVertex3f((sz*i)/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
-/* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
-/* mi->polygon_count++; */
-/* } */
-/* } */
-/* glEnd(); */
-
-/* glPopMatrix(); */
-
-
- /* but the step size is the same! */
- mp->ant_step += 0.18;
-/* if(ant_step > 2*Pi) { */
-/* ant_step = 0.0; */
-/* } */
-
- if(mp->ant_step > 5*Pi)
- mp->started = 1;
-
- mp->ant_position += 1;
- return True;
-}
-#undef AntmazeDivisions
-#undef AntmazeTransversals
-
-ENTRYPOINT void reshape_antmaze(ModeInfo * mi, int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
- int size = (width / 512) + 1;
- antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
-
- glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- gluPerspective(45, 1/h, 1, 25.0);
-
- glMatrixMode(GL_MODELVIEW);
-/* glLineWidth(3.0); */
- glLineWidth(size);
- glPointSize(size);
-}
-
-static void update_ants(antmazestruct *mp)
-{
- int i;
- GLfloat df[4];
- df[0] = df[1] = df[2] = 0.8*mp->fadeout;
- df[3] = 1.0;
-
- /* fade out */
- if(mp->fadeoutspeed < -0.00001) {
-
- if(mp->fadeout <= 0.0) {
- /* switch boards: rebuild old board, increment current */
- mp->currentboard = (mp->currentboard+1)%BOARDCOUNT;
- build_board(mp, mp->currentboard);
- mp->fadeoutspeed = 0.02;
- }
-
- mp->fadeout += mp->fadeoutspeed;
-
- glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
- }
-
- /* fade in */
- if(mp->fadeoutspeed > 0.0001) {
- mp->fadeout += mp->fadeoutspeed;
- if(mp->fadeout >= 1.0) {
- mp->fadeout = 1.0;
- mp->fadeoutspeed = 0.0;
- mp->entroducing = 12;
- }
- glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
- }
-
- for(i = 0; i < ANTCOUNT; ++i) {
-
- if(!mp->anton[i] && mp->elevator < 1.0) {
-
- /* turn on ant */
- if(mp->entroducing > 0 && mp->introduced <= 0 && random()%100 == 0) {
- mp->anton[i] = 1;
- mp->part[i] = 0;
- mp->antsize[i] = 0.0;
- mp->antposition[i][0] = -4.0;
- mp->antposition[i][1] = 5.0;
- mp->antdirection[i] = PI/2.0;
- mp->bposition[i][0] = 0;
- mp->bposition[i][1] = 8;
- mp->introduced = 300;
- mp->entroducing--;
- }
-
- continue;
- }
-
- if(mp->part[i] == 0 && mp->antsize[i] < 1.0) {
- mp->antsize[i] += 0.02;
- continue;
- }
-
- if(mp->part[i] > mp->antpathlength[i] && mp->antsize[i] > 0.0) {
- mp->antsize[i] -= 0.02;
- if(mp->antvelocity[i] > 0.0) {
- mp->antvelocity[i] -= 0.02;
- }
- else { mp->antvelocity[i] = 0.0; }
-
- continue;
- }
-
- if(mp->part[i] > mp->antpathlength[i] && mp->antsize[i] <= 0.0) {
- mp->antvelocity[i] = 0.02;
-
- /* if(i != 0) { */
- antmaterial[i] = materials[random()%MATERIALS];
- /* } */
-
- mp->antdirection[i] = PI/2.0;
- mp->bposition[i][0] = 0;
- mp->bposition[i][1] = 8;
- mp->part[i] = 0;
-
- mp->antsize[i] = 0.0;
-
- mp->anton[i] = 0;
-
- mp->antposition[i][0] = -4.0;
- mp->antposition[i][1] = 5.0;
-
- /* /\* reset camera *\/ */
- /* if(i == focus) { */
- /* started = 0; */
- /* ant_step = 0.0; */
- /* } */
-
- /* check for the end */
- if(mp->entroducing <= 0) {
- int ao = 0, z = 0;
- for(z = 0; z < ANTCOUNT; ++z) {
- if(mp->anton[z]) { ao = 1; break; }
- }
-
- if(ao == 0) {
- mp->fadeoutspeed = -0.02;
- }
- }
-
- }
-
- /* near goal, bend path towards next step */
- if(near(mp->antposition[i], mp->antpath[i][mp->part[i]])) {
-
- ++mp->part[i];
-
-/* /\* special first ant *\/ */
-/* if(i == 0 && part[i] > antpathlength[i]) { */
-/* if(fir) */
-/* first_ant_step = ant_step; */
-
-/* antvelocity[i] = 0.0; */
-/* /\* antposition[i][2] += 0.025; *\/ */
-/* elevator += 0.025; */
-
-/* /\* set light *\/ */
-/* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
-/* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
-/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
-/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
-
-/* /\* draw next board *\/ */
-/* if(elevator > 1.0) { */
-
-/* if(makenew == 1) { */
-/* int re; */
-
-/* /\* switch boards: rebuild old board, increment current *\/ */
-/* currentboard = (currentboard+1)%BOARDCOUNT; */
-/* build_board(currentboard); */
-
-/* for(re = 1; re < ANTCOUNT; ++re) { */
-/* anton[re] = 0; */
-/* antmaterial[re] = materials[random()%MATERIALS]; */
-/* } */
-
-/* makenew = 0; */
-
-/* } */
-
-/* /\* draw the other board *\/ */
-/* glEnable(GL_TEXTURE_2D); */
-/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6); */
-
-/* glPushMatrix(); */
-/* glTranslatef(-(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0), 0.0, */
-/* -(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0)); */
-/* draw_board(mi, mp); */
-/* glPopMatrix(); */
-/* glDisable(GL_TEXTURE_2D); */
-/* } */
-/* /\* reset *\/ */
-/* if(elevator > 2.0) { */
-/* antposition[i][0] = -4.0;/\*-= -(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0);*\//\*= -4.0;*\/ */
-/* antposition[i][1] = 5.5;/\*-(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0);*\/ */
-/* /\* antposition[i][2] = 0.15; *\/ */
-/* antdirection[i] = PI/2.0; */
-/* bposition[i][0] = 0; */
-/* bposition[i][1] = 8; */
-/* part[i] = 0; */
-/* antvelocity[i] = 0.02; */
-/* fir = 0; */
-/* antmaterial[i] = MaterialRed; */
-
-/* makenew = 1; */
-
-/* elevator = 0.0; */
-/* introduced = 200; */
-/* } */
-/* else { */
-/* part[i]--; */
-/* } */
-/* } */
-
- }
-
- /* move toward goal, correct ant direction if required */
- else {
-
- /* difference */
- double dx = mp->antpath[i][mp->part[i]][0] - mp->antposition[i][0];
- double dz = - mp->antpath[i][mp->part[i]][1] + mp->antposition[i][1];
- double theta, ideal;
-
- if(dz > EPSILON)
- theta = atan(dz/dx);
- else
- theta = dx > EPSILON ? 0.0 : PI;
-
- ideal = theta - mp->antdirection[i];
- if(ideal < -Pi/2.0)
- ideal += Pi;
-
- /* compute correction */
- {
- double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
- mp->antdirection[i] += dt;
- if(mp->antdirection[i] > 2.0*PI)
- mp->antdirection[i] = 0.0;
- }
- }
-
- mp->antposition[i][0] += mp->antvelocity[i] * cos(mp->antdirection[i]);
- mp->antposition[i][1] += mp->antvelocity[i] * sin(-mp->antdirection[i]);
- }
-}
-
-static void pinit(antmazestruct *mp)
-{
- glClearDepth(1.0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_POSITION, position1);
-
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05);
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.001);
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1);
-
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);
- glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.001);
- glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1);
-
-
-/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
-/* glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); */
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_NORMALIZE);
- glFrontFace(GL_CCW);
- glCullFace(GL_BACK);
-
- /* antmaze */
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
-
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glDisable(GL_TEXTURE_2D);
-
- /* setup textures */
- makeCheckImage(mp);
- makeBrushedImage(mp);
-
- build_board(mp, 0);
- build_board(mp, 1);
-
-/* makeCheckImage(); */
-/* glPixelStorei(GL_UNPACK_ALIGNMENT, 1); */
-/* glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, */
-/* checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, checkers); */
-/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); */
-/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); */
-
-/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
-/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
-/* glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); */
- glEnable(GL_TEXTURE_2D);
-
-/* glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); */
-/* glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); */
-}
-
-#define MAX_MAGNIFICATION 10
-#define max(a, b) a < b ? b : a
-#define min(a, b) a < b ? a : b
-
-ENTRYPOINT Bool antmaze_handle_event (ModeInfo *mi, XEvent *event)
-{
- antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, mp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &mp->button_down_p))
- return True;
-
- if (event->xany.type == ButtonPress)
- {
- switch(event->xbutton.button) {
-
- case Button3:
- mp->focus = (mp->focus + 1) % ANTCOUNT;
- return True;
-
- case Button4:
- mp->mag = max(mp->mag-1, 1);
- return True;
-
- case Button5:
- mp->mag = min(mp->mag+1, MAX_MAGNIFICATION);
- return True;
- }
- }
-
- return False;
-}
-
-ENTRYPOINT void init_antmaze(ModeInfo * mi)
-{
- double rot_speed = 0.3;
- int i;
-
- antmazestruct *mp;
-
- MI_INIT(mi, antmaze);
- mp = &antmaze[MI_SCREEN(mi)];
- mp->step = NRAND(90);
- mp->ant_position = NRAND(90);
-
-
- mp->antdirection[0] = PI/2.0;
- mp->antdirection[1] = PI/2.0;
- mp->antdirection[2] = 0;
- mp->antdirection[3] = PI/2.0;
- mp->antdirection[4] = PI/2.0;
-
- mp->antposition[0][0] = -4.0;
- mp->antposition[0][1] = 5.0;
- mp->antposition[0][1] = 0.15;
-
- mp->antposition[1][0] = -4.0;
- mp->antposition[1][1] = 3.0;
- mp->antposition[1][1] = 0.15;
-
- mp->antposition[2][0] = -1.0;
- mp->antposition[2][1] = -2.0;
- mp->antposition[2][1] = 0.15;
-
- mp->antposition[3][0] = -3.9;
- mp->antposition[3][1] = 6.0;
- mp->antposition[3][1] = 0.15;
-
- mp->antposition[4][0] = 2.0;
- mp->antposition[4][1] = -2.0;
- mp->antposition[4][1] = 0.15;
-
-
-
- for (i = 0; i < ANTCOUNT; i++) {
- mp->antvelocity[i] = 0.02;
- mp->antsize[i] = 1.0;
- mp->anton[i] = 0;
- }
-
- mp->bposition[0][0] = 0;
- mp->bposition[0][1] = 8;
-
- mp->bposition[1][0] = 9;
- mp->bposition[1][1] = 1;
-
- mp->bposition[2][0] = 1;
- mp->bposition[2][1] = 1;
-
- mp->bposition[3][0] = 4;
- mp->bposition[3][1] = 8;
-
- mp->bposition[4][0] = 2;
- mp->bposition[4][1] = 1;
-
- mp->part[0] = 0;
- mp->part[1] = 1;
- mp->part[2] = 5;
- mp->part[3] = 1;
- mp->part[4] = 3;
-
- mp->introduced = 0;
- mp->entroducing = 12;
- mp->fadeout = 1.0;
- mp->mag = 4.0;
-
- mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
- mp->trackball = gltrackball_init (False);
-
- if ((mp->glx_context = init_GL(mi)) != NULL) {
- reshape_antmaze(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- pinit(mp);
- }
- else
- MI_CLEARWINDOW(mi);
-}
-
-static void
-device_rotate(ModeInfo *mi)
-{
-#if 0
- GLfloat rot = current_device_rotation();
- glRotatef(rot, 0, 0, 1);
- if ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135))
- {
- GLfloat s = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- glScalef (1/s, s, 1);
- }
-#endif
-}
-
-
-ENTRYPOINT void draw_antmaze(ModeInfo * mi)
-{
- double h = (GLfloat) MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
-
- antmazestruct *mp;
-
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if(!antmaze)
- return;
- mp = &antmaze[MI_SCREEN(mi)];
-
- MI_IS_DRAWN(mi) = True;
-
- if(!mp->glx_context)
- return;
-
- mi->polygon_count = 0;
- glXMakeCurrent(display, window, *mp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- /* first panel */
- glPushMatrix();
-/* h = ((GLfloat) MI_HEIGHT(mi)/2) / (3*(GLfloat)MI_WIDTH(mi)/4); */
- glViewport(MI_WIDTH(mi)/32, MI_HEIGHT(mi)/8, (9*MI_WIDTH(mi))/16, 3*MI_HEIGHT(mi)/4);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
-/* h = (3*MI_HEIGHT(mi)/4) / (3*MI_WIDTH(mi)/4); */
- gluPerspective(45, 1/h, 1, 25.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- device_rotate(mi);
-
- glPushMatrix();
-
- /* follow focused ant */
- glTranslatef(0.0, 0.0, -mp->mag - 5.0);
- glRotatef(20.0+5.0*sin(mp->ant_step/40.0), 1.0, 0.0, 0.0);
-/* glTranslatef(0.0, */
-/* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0)), */
-/* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0))); */
-
- gltrackball_rotate(mp->trackball);
-
- glRotatef(mp->ant_step*0.6, 0.0, 1.0, 0.0);
-
-/* glRotatef(90.0, 0.0, 0.0, 1.0); */
-
-/* glTranslatef(-antposition[0][0]-0.5, 0.0, -antposition[focus][1]); */
- /*-elevator*/
-
- /* sync */
- if(!draw_antmaze_strip(mi)) {
- MI_ABORT(mi);
- return;
- }
-
- glPopMatrix();
- glPopMatrix();
-
- h = (GLfloat) (3*MI_HEIGHT(mi)/8) / (GLfloat) (MI_WIDTH(mi)/2);
-
- /* draw overhead */
- glPushMatrix();
- glViewport((17*MI_WIDTH(mi))/32, MI_HEIGHT(mi)/2, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- device_rotate(mi);
- gluPerspective(45, 1/h, 1, 25.0);
- glMatrixMode(GL_MODELVIEW);
-
- /* twist scene */
- glTranslatef(0.0, 0.0, -16.0);
- glRotatef(60.0, 1.0, 0.0, 0.0);
- glRotatef(-15.0 + mp->ant_step/10.0, 0.0, 1.0, 0.0);
- gltrackball_rotate(mp->trackball);
-
- /* sync */
- if(!draw_antmaze_strip(mi)) {
- MI_ABORT(mi);
- return;
- }
-
- glPopMatrix();
-
- /* draw ant display */
- glPushMatrix();
- glViewport((5*MI_WIDTH(mi))/8, MI_HEIGHT(mi)/8, (11*MI_WIDTH(mi))/32, 3*MI_HEIGHT(mi)/8);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- device_rotate(mi);
- gluPerspective(45, 1/h, 1, 25.0);
- glMatrixMode(GL_MODELVIEW);
-
- /* twist scene */
- glTranslatef(0.0, 0.0, -1.6);
- glRotatef(30.0, 1.0, 0.0, 0.0);
- glRotatef(mp->ant_step, 0.0, 1.0, 0.0);
- glRotatef(90.0, 0.0, 0.0, 1.0);
-
-/* /\* draw ant shadow *\/ */
-/* glPushMatrix(); */
-/* glScalef(1.0, 0.01, 1.0); */
-/* glRotatef(90.0, 0.0, 0.0, 1.0); */
-/* glRotatef(90.0, 0.0, 1.0, 0.0); */
-/* glDisable(GL_LIGHTING); */
-/* glColor4fv(MaterialGray6); */
-
-/* /\* slow down first ant *\/ */
-/* draw_ant(MaterialGrayB, 0, 1, first_ant_step, mySphere, myCone); */
-/* glPopMatrix(); */
-
- /* draw ant body */
- glEnable(GL_TEXTURE_2D);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
- draw_ant(mi, mp, MaterialGray35, 0, 1, mp->ant_step/2.0, mySphereTex, myCone2);
- glDisable(GL_TEXTURE_2D);
-
- glPopMatrix();
-
-/* /\* draw overlay *\/ */
-/* glPushMatrix(); */
-
-/* /\* go to ortho mode *\/ */
-/* glViewport(MI_WIDTH(mi)/2, MI_HEIGHT(mi)/8, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8); */
-
-/* glMatrixMode(GL_PROJECTION); */
-/* glLoadIdentity(); */
-
-/* glPushMatrix (); */
-/* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
-
-/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB); */
-/* glColor4fv(MaterialGrayB); */
-
-/* glDisable(GL_LIGHTING); */
-/* glEnable(GL_BLEND); */
-
-/* glBegin(GL_QUADS); */
-/* glNormal3f(0.0, 0.0, 1.0); */
-/* glVertex3f(4.0, 3.0, 0.0); */
-/* glVertex3f(2.0, 3.0, 0.0); */
-/* glVertex3f(2.0, -3.0, 0.0); */
-/* glVertex3f(4.0, -3.0, 0.0); */
-/* mi->polygon_count++; */
-/* glEnd(); */
-
-/* glEnable(GL_LIGHTING); */
-/* glDisable(GL_BLEND); */
-
-/* glPopMatrix(); */
-/* glPopMatrix(); */
-
- if (MI_IS_FPS(mi)) {
- glViewport(0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
- do_fps (mi);
- }
- glFlush();
-
- glXSwapBuffers(display, window);
-
- update_ants(mp);
-
- mp->step += 0.025;
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void change_antmaze(ModeInfo * mi)
-{
- antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
-
- if (!mp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- pinit();
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void free_antmaze(ModeInfo * mi)
-{
- antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
- if (!mp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- gltrackball_free (mp->trackball);
- free_rotator (mp->rot);
- if (mp->checktexture) glDeleteTextures (1, &mp->checktexture);
- if (mp->brushedtexture) glDeleteTextures (1, &mp->brushedtexture);
-}
-
-XSCREENSAVER_MODULE ("AntMaze", antmaze)
-
-#endif
diff --git a/hacks/glx/antmaze.man b/hacks/glx/antmaze.man
deleted file mode 100644
index cca7add..0000000
--- a/hacks/glx/antmaze.man
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH XScreenSaver 1 "May 2005"
-.SH NAME
-antmaze \- ant maze walker
-.SH SYNOPSIS
-.B antmaze
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
-.SH DESCRIPTION
-The \fIantmaze\fP code displays ants finding their way through a maze.
-.SH OPTIONS
-.I antmaze
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2005 by Blair Tennessy. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Blair Tennessy <tennessy@cs.ubc.ca>, 8-May-2005.
-
diff --git a/hacks/glx/ants.h b/hacks/glx/ants.h
deleted file mode 100644
index d0bef7e..0000000
--- a/hacks/glx/ants.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ants.h -- header file containing common ant parameters
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Copyright 2003 Blair Tennessy
-*/
-
-/* static const GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0}; */
-/*static const GLfloat MaterialPurple[] = {0.6, 0.2, 0.5, 1.0};*/
-/*static const GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};*/
-/*static const GLfloat MaterialGreen[] = {0.1, 0.5, 0.2, 0.2};*/
-/*static const GLfloat MaterialBlue[] = {0.4, 0.4, 0.8, 1.0};*/
-/*static const GLfloat MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};*/
-/*static const GLfloat MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};*/
-/* static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0}; */
-/*static const GLfloat MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};*/
-static const GLfloat MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
-static const GLfloat MaterialGrayB[] = {0.1, 0.1, 0.1, 0.5};
-/*static const GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};*/
-
-static const GLfloat MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
-static const GLfloat MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
-/* static const GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};*/
-
-typedef struct {
-
- double position[3];
- double goal[3];
- double velocity;
- double direction;
- double step;
-
- const GLfloat *material;
-
-} Ant;
diff --git a/hacks/glx/antspotlight.c b/hacks/glx/antspotlight.c
deleted file mode 100644
index 5c416bc..0000000
--- a/hacks/glx/antspotlight.c
+++ /dev/null
@@ -1,796 +0,0 @@
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Copyright 2003 Blair Tennessy
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*useSHM: True \n"
-
-# define release_antspotlight 0
-#include "xlockmore.h"
-#else
-#include "xlock.h"
-#endif
-
-#include "sphere.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-
-ENTRYPOINT ModeSpecOpt antspotlight_opts = {
- 0, NULL, 0, NULL, NULL
-};
-
-#ifdef USE_MODULES
-ModStruct antspotlight_description = {
- "antspotlight", "init_antspotlight", "draw_antspotlight",
- (char *) NULL, "draw_antspotlight", "change_antspotlight",
- (char *) NULL, &antspotlight_opts, 1000, 1, 1, 1, 4, 1.0, "",
- "draws an ant scoping the screen", 0, NULL
-};
-#endif
-
-#define Scale4Window 0.3
-#define Scale4Iconic 0.4
-
-#define sqr(A) ((A)*(A))
-
-#ifndef Pi
-#define Pi M_PI
-#endif
-
-#include "ants.h"
-#include "grab-ximage.h"
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLfloat max_tx, max_ty;
- int mono, wire, ticks;
- GLuint screentexture;
-
- Ant *ant;
- double boardsize;
- GLfloat spot_direction[3];
- int mag;
-
- Bool mipmap_p;
- Bool waiting_for_image_p;
-
-} antspotlightstruct;
-
-static antspotlightstruct *antspotlight = (antspotlightstruct *) NULL;
-
-#define NUM_SCENES 2
-
-/* draw method for ant */
-static Bool draw_ant(ModeInfo *mi, antspotlightstruct *mp,
- const GLfloat *Material, int mono, int shadow,
- float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
-{
-
- float cos1 = cos(ant_step);
- float cos2 = cos(ant_step + 2 * Pi / 3);
- float cos3 = cos(ant_step + 4 * Pi / 3);
- float sin1 = sin(ant_step);
- float sin2 = sin(ant_step + 2 * Pi / 3);
- float sin3 = sin(ant_step + 4 * Pi / 3);
-
-/* Apparently this is a performance killer on many systems...
- glEnable(GL_POLYGON_SMOOTH);
- */
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->mono ? MaterialGray5 : Material);
- glEnable(GL_CULL_FACE);
- glPushMatrix();
- glScalef(1, 1.3, 1);
- if(!((*sphere)(0.18)))
- return False;
- glScalef(1, 1 / 1.3, 1);
- glTranslatef(0.00, 0.30, 0.00);
- if(!((*sphere)(0.2)))
- return False;
-
- glTranslatef(-0.05, 0.17, 0.05);
- glRotatef(-90, 1, 0, 0);
- glRotatef(-25, 0, 1, 0);
- if(!((*cone)(0.05)))
- return False;
- glTranslatef(0.00, 0.10, 0.00);
- if(!((*cone)(0.05)))
- return False;
- glRotatef(25, 0, 1, 0);
- glRotatef(90, 1, 0, 0);
-
- glScalef(1, 1.3, 1);
- glTranslatef(0.15, -0.65, 0.05);
- if(!((*sphere)(0.25)))
- return False;
- glScalef(1, 1 / 1.3, 1);
- glPopMatrix();
- glDisable(GL_CULL_FACE);
-
- glDisable(GL_LIGHTING);
-
- /* ANTENNAS */
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glBegin(GL_LINES);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.30, 0.00);
- glColor3fv(MaterialGray);
- glVertex3f(0.40, 0.70, 0.40);
- mi->polygon_count++;
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.30, 0.00);
- glColor3fv(MaterialGray);
- glVertex3f(0.40, 0.70, -0.40);
- mi->polygon_count++;
- glEnd();
-
- if(!shadow) {
- glBegin(GL_POINTS);
- glColor3fv(mp->mono ? MaterialGray6 : MaterialGray5);
- glVertex3f(0.40, 0.70, 0.40);
- mi->polygon_count++;
- glVertex3f(0.40, 0.70, -0.40);
- mi->polygon_count++;
- glEnd();
- }
-
- /* LEFT-FRONT ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.05, 0.18);
- glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* LEFT-CENTER ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.00, 0.18);
- glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* LEFT-BACK ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, -0.05, 0.18);
- glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-FRONT ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.05, -0.18);
- glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-CENTER ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, 0.00, -0.18);
- glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
- mi->polygon_count++;
- glEnd();
-
- /* RIGHT-BACK ARM */
- glBegin(GL_LINE_STRIP);
- glColor3fv(mp->mono ? MaterialGray5 : Material);
- glVertex3f(0.00, -0.05, -0.18);
- glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
- mi->polygon_count++;
- glColor3fv(MaterialGray);
- glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
- mi->polygon_count++;
- glEnd();
-
- if(!shadow) {
- glBegin(GL_POINTS);
- glColor3fv(MaterialGray5);
- glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
- glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
- glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
- glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
- glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
- glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
- mi->polygon_count += 6;
- glEnd();
- }
-
- glEnable(GL_LIGHTING);
-
- return True;
-}
-
-/* filled sphere */
-static Bool mySphere(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
-
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
- gluSphere(quadObj, radius, 16, 16);
- gluDeleteQuadric(quadObj);
-#else
- glPushMatrix();
- glScalef (radius, radius, radius);
- glRotatef (90, 1, 0, 0);
- unit_sphere (16, 16, False);
- glPopMatrix();
-#endif
- return True;
-}
-
-/* silhouette sphere */
-static Bool mySphere2(float radius)
-{
-#if 0
- GLUquadricObj *quadObj;
-
- if((quadObj = gluNewQuadric()) == 0)
- return False;
- gluQuadricDrawStyle(quadObj, (GLenum) GLU_LINE);
- gluSphere(quadObj, radius, 16, 8);
- gluDeleteQuadric(quadObj);
-#else
- /* #### no GLU_LINE */
- glPushMatrix();
- glScalef (radius, radius, radius);
- glRotatef (90, 1, 0, 0);
- unit_sphere (16, 16, True);
- glPopMatrix();
-#endif
- return True;
-}
-
-/* no cone */
-static Bool myCone2(float radius) { return True; }
-
-static void draw_board(ModeInfo *mi, antspotlightstruct *mp)
-{
- int i, j;
- double cutoff = Pi/3.0;
- double center[3];
- double centertex[2];
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, mp->screentexture);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
-
- /* draw mesh */
-
- /* center is roughly spotlight position */
- center[0] = mp->ant->position[0];/* + cos(ant->direction); */
- center[1] = 0.0;
- center[2] = mp->ant->position[2];/* - 0.7*sin(ant->direction);*/
-
- centertex[0] = (mp->boardsize/2.0+center[0]) * mp->max_tx / mp->boardsize;
- centertex[1] = mp->max_ty - ((mp->boardsize/2.0+center[2]) * mp->max_ty / mp->boardsize);
-
-/* glPolygonMode(GL_FRONT, GL_LINE); */
-/* glDisable(GL_TEXTURE_2D); */
-
- /*
- the vertices determined here should correspond to the illuminated
- board. ideally the code adapts vertex distribution to the
- intensity and shape of the light.
-
- i should be finding the intersection of the cone of light and
- the board-plane.
- */
- for(i = -12; i < 12; ++i) {
-
- double theta1, theta2;
-
- glBegin(GL_TRIANGLE_STRIP);
- glNormal3f(0.0, 1.0, 0.0);
-
- glTexCoord2f(centertex[0], centertex[1]);
- glVertex3f(center[0], 0.01, center[2]);
-
- /* watch those constants */
- theta1 = mp->ant->direction + i*(cutoff/8);
- theta2 = mp->ant->direction + (i+1)*(cutoff/8);
-
- for(j = 1; j <= 64; ++j) {
- double point[3], tex[2];
- /* double fj = pow(1.05, j) - 1.0;*/
- double fj = j / 6.0;
- point[0] = center[0] + fj*cos(theta1);
- point[1] = 0.0;
- point[2] = center[2] - fj*sin(theta1);
-
- tex[0] = (mp->boardsize/2.0+point[0]) * mp->max_tx / mp->boardsize;
- tex[1] = (mp->boardsize/2.0+point[2]) * mp->max_ty / mp->boardsize;
-
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f(point[0], point[1], point[2]);
-
- point[0] = center[0] + fj*cos(theta2);
- point[1] = 0.0;
- point[2] = center[2] - fj*sin(theta2);
-
- tex[0] = (mp->boardsize/2.0+point[0]) * mp->max_tx / mp->boardsize;
- tex[1] = (mp->boardsize/2.0+point[2]) * mp->max_ty / mp->boardsize;
-
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f(point[0], point[1], point[2]);
- mi->polygon_count++;
- }
-
- glEnd();
- }
-
- glDisable(GL_TEXTURE_2D);
-}
-
-/* return euclidean distance between two points */
-static double distance(double x[3], double y[3])
-{
- double dx = x[0] - y[0];
- double dz = x[2] - y[2];
- return sqrt(dx*dx + dz*dz);
-}
-
-/* determine a new goal */
-static void find_goal(antspotlightstruct *mp)
-{
- do {
- mp->ant->goal[0] = random()%((int)(mp->boardsize+0.5)-2) - mp->boardsize/2.0 + 1.0;
- mp->ant->goal[1] = 0.0;
- mp->ant->goal[2] = random()%((int)(mp->boardsize+0.5)-2) - mp->boardsize/2.0 + 1.0;
- }
- while(distance(mp->ant->position, mp->ant->goal) < 2.0);
-}
-
-/* construct our ant */
-static void build_ant(antspotlightstruct *mp)
-{
- mp->ant = (Ant *) malloc(sizeof (Ant));
- mp->ant->position[0] = 0.0;
- mp->ant->position[1] = 0.0;
- mp->ant->position[2] = 0.0;
- mp->ant->direction = 0.0;
- mp->ant->velocity = 0.02;
- mp->ant->material = MaterialGray5;
- mp->ant->step = 0;
- find_goal(mp);
-}
-
-#define EPSILON 0.01
-
-static double sign(double d)
-{
- return d < 0.0 ? -1.0 : 1.0;
-}
-
-static double min(double a, double b)
-{
- return a < b ? a : b;
-}
-
-/*
-static double max(double a, double b)
-{
- return a > b ? a : b;
-}
-*/
-
-/* find a new goal and reset steps */
-static void reset_ant(antspotlightstruct *mp)
-{
- find_goal(mp);
-}
-
-/* draw ant composed of skeleton and glass */
-static void show_ant(ModeInfo *mi, antspotlightstruct *mp)
-{
-
- glPushMatrix();
-
- /* move into position */
- glTranslatef(mp->ant->position[0], 0.33, mp->ant->position[2]);
- glRotatef(180.0 + mp->ant->direction*180.0/Pi, 0.0, 1.0, 0.0);
- glRotatef(90.0, 0.0, 0.0, 1.0);
-
- /* draw skeleton */
- draw_ant(mi, mp, mp->ant->material, mp->mono, 0, mp->ant->step, mySphere2, myCone2);
-
- /* draw glass */
- if(!mp->wire && !mp->mono) {
- glEnable(GL_BLEND);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB);
- glColor4fv(MaterialGrayB);
- draw_ant(mi, mp, MaterialGrayB, mp->mono, 0, mp->ant->step, mySphere, myCone2);
- glDisable(GL_BLEND);
- }
-
- glPopMatrix();
-}
-
-static void draw_antspotlight_strip(ModeInfo *mi)
-{
- antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
-
- /* compute spotlight position and direction */
- GLfloat light1_position[4];
-
- light1_position[0] = mp->ant->position[0] + 0.7*cos(mp->ant->direction);
- light1_position[1] = 0.5;
- light1_position[2] = mp->ant->position[2] - 0.7*sin(mp->ant->direction);
- light1_position[3] = 1.0;
-
- mp->spot_direction[0] = cos(mp->ant->direction);
- mp->spot_direction[1] = -0.5;
- mp->spot_direction[2] = -sin(mp->ant->direction);
-
- glLightfv(GL_LIGHT2, GL_POSITION, light1_position);
- glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, mp->spot_direction);
-
- glEnable(GL_LIGHT2);
- glDisable(GL_LIGHT0);
- glDisable(GL_LIGHT1);
-
- /* draw board */
- if(mp->wire)
- ;
- else
- draw_board(mi, mp);
-
- glDisable(GL_LIGHT2);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
-
- /* now modify ant */
- show_ant(mi, mp);
-
- /* near goal, bend path towards next step */
- if(distance(mp->ant->position, mp->ant->goal) < 0.2) {
- reset_ant(mp);
- }
-
- if(random()%100 == 0) {
- reset_ant(mp);
- }
-
-
- /* move toward goal, correct ant direction if required */
- else {
-
- /* difference */
- double dx = mp->ant->goal[0] - mp->ant->position[0];
- double dz = -(mp->ant->goal[2] - mp->ant->position[2]);
- double theta, ideal, dt;
-
- if(fabs(dx) > EPSILON) {
- theta = atan(dz/dx);
- if(dx < 0.0)
- theta += Pi;
- }
- else
- theta = dz > 0.0 ? (1.0/2.0)*Pi : (3.0/2.0)*Pi;
-
- if(theta < 0.0)
- theta += 2*Pi;
-
- ideal = theta - mp->ant->direction;
- if(ideal > Pi)
- ideal -= 2*Pi;
-
- /* compute correction */
- dt = sign(ideal) * min(fabs(ideal), Pi/100.0);
- mp->ant->direction += dt;
- while(mp->ant->direction < 0.0)
- mp->ant->direction += 2*Pi;
- while(mp->ant->direction > 2*Pi)
- mp->ant->direction -= 2*Pi;
- }
-
- mp->ant->position[0] += mp->ant->velocity * cos(mp->ant->direction);
- mp->ant->position[2] += mp->ant->velocity * sin(-mp->ant->direction);
- mp->ant->step += 10*mp->ant->velocity;
- while(mp->ant->step > 2*Pi)
- mp->ant->step -= 2*Pi;
-}
-
-ENTRYPOINT void reshape_antspotlight(ModeInfo * mi, int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
- int y = 0;
- int size = 2;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- gluPerspective(45, 1/h, 1.0, 25.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLineWidth(size);
- glPointSize(size);
-}
-
-/* lighting variables */
-static const GLfloat front_shininess[] = {60.0};
-static const GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
-static const GLfloat ambient[] = {0.4, 0.4, 0.4, 1.0};
-/*static const GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};*/
-static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
-static const GLfloat position0[] = {1.0, 5.0, 1.0, 0.0};
-static const GLfloat position1[] = {-1.0, -5.0, 1.0, 0.0};
-/*static const GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};*/
-static const GLfloat lmodel_twoside[] = {GL_TRUE};
-static const GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
-static const GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
-
-static void pinit(void)
-{
- glClearDepth(1.0);
-
- /* setup twoside lighting */
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_POSITION, position1);
-
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, spotlight_ambient);
- glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
-
- /* setup spotlight */
- glLightfv(GL_LIGHT2, GL_AMBIENT, spotlight_ambient);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, spotlight_diffuse);
- glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, 0.1);
- glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.05);
- glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, 0.0);
- glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 60.0);
- glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 3.0);
-
- glEnable(GL_NORMALIZE);
- glFrontFace(GL_CCW);
- glCullFace(GL_BACK);
-
- /* setup material properties */
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glShadeModel(GL_SMOOTH);
-/* glShadeModel(GL_FLAT); */
- glEnable(GL_DEPTH_TEST);
-}
-
-#define MAX_MAGNIFICATION 10
-#define max(a, b) a < b ? b : a
-#define min(a, b) a < b ? a : b
-
-/* event handling */
-ENTRYPOINT Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event)
-{
- antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, mp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &mp->button_down_p))
- return True;
-
- if (event->xany.type == ButtonPress)
- {
- switch(event->xbutton.button) {
-
- case Button1:
- mp->button_down_p = True;
- gltrackball_start(mp->trackball,
- event->xbutton.x, event->xbutton.y,
- MI_WIDTH (mi), MI_HEIGHT (mi));
- return True;
-
- case Button4:
- mp->mag = max(mp->mag-1, 1);
- return True;
-
- case Button5:
- mp->mag = min(mp->mag+1, MAX_MAGNIFICATION);
- return True;
- }
- }
-
- return False;
-}
-
-static void
-image_loaded_cb (const char *filename, XRectangle *geometry,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- antspotlightstruct *mp = (antspotlightstruct *) closure;
-
- mp->max_tx = (GLfloat) image_width / texture_width;
- mp->max_ty = (GLfloat) image_height / texture_height;
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- (mp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
-
- mp->waiting_for_image_p = False;
-}
-
-
-/* get screenshot */
-static void get_snapshot(ModeInfo *modeinfo)
-{
- antspotlightstruct *mp = &antspotlight[MI_SCREEN(modeinfo)];
-
- if (MI_IS_WIREFRAME(modeinfo))
- return;
-
- mp->waiting_for_image_p = True;
- mp->mipmap_p = True;
- load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
- *mp->glx_context, 0, 0, mp->mipmap_p,
- mp->screentexture, image_loaded_cb, mp);
-}
-
-
-ENTRYPOINT void init_antspotlight(ModeInfo *mi)
-{
- double rot_speed = 0.3;
-
- antspotlightstruct *mp;
-
- MI_INIT(mi, antspotlight);
- mp = &antspotlight[MI_SCREEN(mi)];
- mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
- mp->trackball = gltrackball_init (False);
-
- if((mp->glx_context = init_GL(mi)) != NULL) {
- reshape_antspotlight(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- pinit();
- }
- else
- MI_CLEARWINDOW(mi);
-
- glGenTextures(1, &mp->screentexture);
- glBindTexture(GL_TEXTURE_2D, mp->screentexture);
- get_snapshot(mi);
-
- build_ant(mp);
- mp->mono = MI_IS_MONO(mi);
- mp->wire = MI_IS_WIREFRAME(mi);
- mp->boardsize = 8.0;
- mp->mag = 1;
-}
-
-ENTRYPOINT void draw_antspotlight(ModeInfo * mi)
-{
- antspotlightstruct *mp;
-
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if(!antspotlight)
- return;
- mp = &antspotlight[MI_SCREEN(mi)];
-
- MI_IS_DRAWN(mi) = True;
-
- if(!mp->glx_context)
- return;
-
- mi->polygon_count = 0;
-
- /* Just keep running before the texture has come in. */
- /* if (mp->waiting_for_image_p) return; */
-
- glXMakeCurrent(display, window, *mp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- /* position camera */
-
- /* follow focused ant */
- glTranslatef(0.0, 0.0, -6.0 - mp->mag);
- glRotatef(35.0, 1.0, 0.0, 0.0);
- gltrackball_rotate(mp->trackball);
- glTranslatef(-mp->ant->position[0], mp->ant->position[1], -mp->ant->position[2]);
-
- /* stable position */
-/* glTranslatef(0.0, 0.0, -10.0 - mag); */
-/* gltrackball_rotate(mp->trackball); */
-/* glRotatef(40.0, 1.0, 0.0, 0.0); */
-/* glRotatef(20.0, 0.0, 1.0, 0.0); */
-
- draw_antspotlight_strip(mi);
-
- ++mp->ticks;
-
- glPopMatrix();
-
- if (MI_IS_FPS(mi)) do_fps (mi);
- glFlush();
-
- glXSwapBuffers(display, window);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void change_antspotlight(ModeInfo * mi)
-{
- antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
-
- if (!mp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- pinit();
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void free_antspotlight(ModeInfo * mi)
-{
- antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
- if (!mp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- gltrackball_free (mp->trackball);
- free_rotator (mp->rot);
- if (mp->screentexture) glDeleteTextures (1, &mp->screentexture);
-}
-
-XSCREENSAVER_MODULE ("AntSpotlight", antspotlight)
diff --git a/hacks/glx/antspotlight.man b/hacks/glx/antspotlight.man
deleted file mode 100644
index f1c74b4..0000000
--- a/hacks/glx/antspotlight.man
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH XScreenSaver 1 "July 2003"
-.SH NAME
-antspotlight \- ant spotlight screenhack
-.SH SYNOPSIS
-.B antspotlight
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
-.SH DESCRIPTION
-The \fIantspotlight\fP code displays a single ant spotting out a screenshot.
-.SH OPTIONS
-.I antspotlight
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Per-frame delay.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2003 by Blair Tennessy. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Blair Tennessy <tennessb@unbc.ca>, 20-July-2003.
-
diff --git a/hacks/glx/atlantis.c b/hacks/glx/atlantis.c
deleted file mode 100644
index 05ea903..0000000
--- a/hacks/glx/atlantis.c
+++ /dev/null
@@ -1,578 +0,0 @@
-/* atlantis --- Shows moving 3D sea animals */
-
-#if 0
-static const char sccsid[] = "@(#)atlantis.c 5.08 2003/04/09 xlockmore";
-#endif
-
-/* Copyright (c) E. Lassauge, 1998. */
-
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The original code for this mode was written by Mark J. Kilgard
- * as a demo for openGL programming.
- *
- * Porting it to xlock was possible by comparing the original Mesa's morph3d
- * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
- * (look at morph3d.c) for his indirect help.
- *
- * Thanks goes also to Brian Paul for making it possible and inexpensive
- * to use OpenGL at home.
- *
- * My e-mail address is lassauge@users.sourceforge.net
- *
- * Eric Lassauge (May-13-1998)
- *
- * REVISION HISTORY:
- *
- * Jamie Zawinski, 2-Apr-01: - The fishies were inside out! The back faces
- * were being drawn, not the front faces.
- * - Added a texture to simulate light from the
- * surface, like in the SGI version.
- *
- * David A. Bagley - 98/06/17 : Add whalespeed option. Global options to
- * initialize local variables are now:
- * XLock.atlantis.cycles: 100 ! SharkSpeed
- * XLock.atlantis.batchcount: 4 ! SharkNum
- * XLock.atlantis.whalespeed: 250 ! WhaleSpeed
- * XLock.atlantis.size: 6000 ! SharkSize
- * Add random direction for whales/dolphins
- *
- * E.Lassauge - 98/06/16: Use the following global options to initialize
- * local variables :
- * XLock.atlantis.delay: 100 ! SharkSpeed
- * XLock.atlantis.batchcount: 4 ! SharkNum
- * XLock.atlantis.cycles: 250 ! WhaleSpeed
- * XLock.atlantis.size: 6000 ! SharkSize
- * Add support for -/+ wireframe (t'was so easy to do!)
- *
- * TODO :
- * - better handling of sizes and speeds
- * - test standalone and module modes
- * - purify it (!)
- */
-
-/* Copyright (c) Mark J. Kilgard, 1994. */
-
-/**
- * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
- * ALL RIGHTS RESERVED
- * Permission to use, copy, modify, and distribute this software for
- * any purpose and without fee is hereby granted, provided that the above
- * copyright notice appear in all copies and that both the copyright notice
- * and this permission notice appear in supporting documentation, and that
- * the name of Silicon Graphics, Inc. not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission.
- *
- * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
- * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
- * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
- * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
- * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
- * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
- * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
- * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * US Government Users Restricted Rights
- * Use, duplication, or disclosure by the Government is subject to
- * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
- * (c)(1)(ii) of the Rights in Technical Data and Computer Software
- * clause at DFARS 252.227-7013 and/or in similar or successor
- * clauses in the FAR or the DOD or NASA FAR Supplement.
- * Unpublished-- rights reserved under the copyright laws of the
- * United States. Contractor/manufacturer is Silicon Graphics,
- * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
- *
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
- */
-
-#define DEF_TEXTURE "True"
-#define DEF_GRADIENT "True"
-#define DEF_WHALESPEED "250"
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 25000 \n" \
- "*count: 4 \n" \
- "*showFPS: False \n" \
- "*cycles: 100 \n" \
- "*size: 6000 \n" \
- "*wireframe: False \n"
-# define release_atlantis 0
-# define atlantis_handle_event xlockmore_no_events
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-# include "vis.h"
-#endif /* !STANDALONE */
-
-#ifdef USE_GL
-
-#include "atlantis.h"
-
-
-static int whalespeed;
-static int do_texture;
-static int do_gradient;
-static XrmOptionDescRec opts[] =
-{
- {"-whalespeed", ".atlantis.whalespeed", XrmoptionSepArg, 0},
- {"-texture", ".atlantis.texture", XrmoptionNoArg, "true"},
- {"+texture", ".atlantis.texture", XrmoptionNoArg, "false"},
- {"-gradient", ".atlantis.gradient", XrmoptionNoArg, "true"},
- {"+gradient", ".atlantis.gradient", XrmoptionNoArg, "false"},
-};
-
-static argtype vars[] =
-{
- {&whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_gradient, "gradient", "Gradient", DEF_GRADIENT, t_Bool},
-};
-
-static OptionStruct desc[] =
-{
- {"-whalespeed num", "speed of whales and the dolphin"},
- {"-texture", "whether to introduce water-like distortion"},
- {"-gradient", "whether to introduce gradient-filled background"},
-};
-
-ENTRYPOINT ModeSpecOpt atlantis_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
-
-#ifdef USE_MODULES
-ModStruct atlantis_description =
-{"atlantis", "init_atlantis", "draw_atlantis", NULL,
- "refresh_atlantis", "change_atlantis", "free_atlantis", &atlantis_opts,
- 1000, NUM_SHARKS, SHARKSPEED, SHARKSIZE, 64, 1.0, "",
- "Shows moving sharks/whales/dolphin", 0, NULL};
-
-#endif
-
-static atlantisstruct *atlantis = NULL;
-
-#include "ximage-loader.h"
-
-#include "images/gen/sea-texture_png.h"
-
-
-static void
-parse_image_data(ModeInfo *mi)
-{
- atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
- ap->texture = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- sea_texture_png,
- sizeof(sea_texture_png));
-}
-
-static void
-InitFishs(atlantisstruct * ap)
-{
- int i;
-
- for (i = 0; i < ap->num_sharks; i++) {
- ap->sharks[i].x = 70000.0 + NRAND(ap->sharksize);
- ap->sharks[i].y = NRAND(ap->sharksize);
- ap->sharks[i].z = NRAND(ap->sharksize);
- ap->sharks[i].psi = NRAND(360) - 180.0;
- ap->sharks[i].v = 1.0;
- }
-
- /* Random whale direction */
- ap->whaledir = LRAND() & 1;
-
- ap->dolph.x = 30000.0;
- ap->dolph.y = 0.0;
- ap->dolph.z = (float) (ap->sharksize);
- ap->dolph.psi = (ap->whaledir) ? 90.0 : -90.0;
- ap->dolph.theta = 0.0;
- ap->dolph.v = 6.0;
-
- ap->momWhale.x = 70000.0;
- ap->momWhale.y = 0.0;
- ap->momWhale.z = 0.0;
- ap->momWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
- ap->momWhale.theta = 0.0;
- ap->momWhale.v = 3.0;
-
- ap->babyWhale.x = 60000.0;
- ap->babyWhale.y = -2000.0;
- ap->babyWhale.z = -2000.0;
- ap->babyWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
- ap->babyWhale.theta = 0.0;
- ap->babyWhale.v = 3.0;
-}
-
-static void
-Init(ModeInfo *mi)
-{
- atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
-
- static const float ambient[] = {0.1, 0.1, 0.1, 1.0};
- static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
- static const float position[] = {0.0, 1.0, 0.0, 0.0};
- static const float mat_shininess[] = {90.0};
- static const float mat_specular[] = {0.8, 0.8, 0.8, 1.0};
- static const float mat_diffuse[] = {0.46, 0.66, 0.795, 1.0};
- static const float mat_ambient[] = {0.0, 0.1, 0.2, 1.0};
- static const float lmodel_ambient[] = {0.4, 0.4, 0.4, 1.0};
- static const float lmodel_localviewer[] = {0.0};
-
- float fblue = 0.0, fgreen;
-
- glFrontFace(GL_CCW);
-
- if (ap->wire)
- {
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_NORMALIZE);
- }
- else
- {
- glDepthFunc(GL_LEQUAL);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glEnable(GL_NORMALIZE);
- glShadeModel(GL_SMOOTH);
-
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
- }
-
- if (ap->wire || !do_texture)
- {
- glDisable(GL_TEXTURE_2D);
- }
- else
- {
- GLfloat scale = 0.0005;
-
- if (!ap->texture)
- parse_image_data (mi);
-
- clear_gl_error();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- ap->texture->width, ap->texture->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- ap->texture->data);
- check_gl_error("texture");
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-
-# ifndef HAVE_JWZGLES
- {
- GLfloat s_plane[] = { 1, 0, 0, 0 };
- GLfloat t_plane[] = { 0, 0, 1, 0 };
- glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
- glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
- glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
- glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- }
-# endif
- glEnable(GL_TEXTURE_2D);
-
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glScalef(scale, scale, 1);
- glMatrixMode(GL_MODELVIEW);
-
- if (ap->texture) XDestroyImage (ap->texture);
- ap->texture = 0;
- }
-
- InitFishs(ap);
-
- /* Add a little randomness */
- fblue = ((float) (NRAND(30)) / 100.0) + 0.70;
- fgreen = fblue * 0.56;
- glClearColor(0.0, fgreen, fblue, 1.0);
-}
-
-ENTRYPOINT void
-reshape_atlantis(ModeInfo * mi, int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
- atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, ap->WinW = (GLint) width, ap->WinH = (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(400.0, 1/h, 1.0, 2000000.0);
- glMatrixMode(GL_MODELVIEW);
-}
-
-
-/* Fill the background with a gradient -- thanks to
- Phil Carrig <pod@internode.on.net> for figuring out
- how to do this more efficiently!
- */
-static void
-clear_tank (atlantisstruct * ap)
-{
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (do_gradient && !ap->wire)
- {
- GLfloat top[4] = { 0.00, 0.40, 0.70, };
- GLfloat bot[4] = { 0.00, 0.05, 0.18, };
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- {
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- {
- glLoadIdentity();
- /* glRotatef(current_device_rotation(), 0, 0, 1); */
-
-# ifndef HAVE_JWZGLES
- glShadeModel (GL_SMOOTH);
-# endif
- glDisable (GL_LIGHTING);
- glBegin (GL_QUADS);
- glColor3fv (bot);
- glVertex3f (-1, -1, 1); glVertex3f ( 1, -1, 1);
- glColor3fv (top);
- glVertex3f ( 1, 1, 1); glVertex3f (-1, 1, 1);
- glEnd();
- glEnable (GL_LIGHTING);
-
- /* Need to reset this because jwzgles conflates color and material */
- glColor3f (0.0, 0.1, 0.2);
- }
- glPopMatrix();
- }
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
- glMatrixMode(GL_MODELVIEW);
- }
-}
-
-
-static void
-Animate(atlantisstruct * ap)
-{
- int i;
-
- for (i = 0; i < ap->num_sharks; i++) {
- SharkPilot(&(ap->sharks[i]), ap->sharkspeed);
- SharkMiss(ap, i);
- }
- WhalePilot(&(ap->dolph), ap->whalespeed, ap->whaledir);
- ap->dolph.phi++;
- WhalePilot(&(ap->momWhale), ap->whalespeed, ap->whaledir);
- ap->momWhale.phi++;
- WhalePilot(&(ap->babyWhale), ap->whalespeed, ap->whaledir);
- ap->babyWhale.phi++;
-}
-
-static void
-AllDisplay(atlantisstruct * ap)
-{
- int i;
-
- clear_tank(ap);
-
- for (i = 0; i < ap->num_sharks; i++) {
- glPushMatrix();
- FishTransform(&(ap->sharks[i]));
- DrawShark(&(ap->sharks[i]), ap->wire);
- glPopMatrix();
- }
-
- glPushMatrix();
- FishTransform(&(ap->dolph));
- DrawDolphin(&(ap->dolph), ap->wire);
- glPopMatrix();
-
- glPushMatrix();
- FishTransform(&(ap->momWhale));
- DrawWhale(&(ap->momWhale), ap->wire);
- glPopMatrix();
-
- glPushMatrix();
- FishTransform(&(ap->babyWhale));
- glScalef(0.45, 0.45, 0.3);
- DrawWhale(&(ap->babyWhale), ap->wire);
- glPopMatrix();
-}
-
-/*
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- * Xlock hooks.
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- */
-
-/*
- *-----------------------------------------------------------------------------
- * Initialize atlantis. Called each time the window changes.
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void
-init_atlantis(ModeInfo * mi)
-{
- int screen = MI_SCREEN(mi);
- atlantisstruct *ap;
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- MI_INIT(mi, atlantis);
- ap = &atlantis[screen];
- ap->num_sharks = MI_COUNT(mi);
- if (ap->sharks == NULL) {
- if ((ap->sharks = (fishRec *) calloc(ap->num_sharks,
- sizeof (fishRec))) == NULL) {
- /* free everything up to now */
- free(atlantis);
- atlantis = NULL;
- return;
- }
- }
- ap->sharkspeed = MI_CYCLES(mi); /* has influence on the "width"
- of the movement */
- ap->sharksize = MI_SIZE(mi); /* has influence on the "distance"
- of the sharks */
- ap->whalespeed = whalespeed;
- ap->wire = MI_IS_WIREFRAME(mi);
-
- if (MI_IS_DEBUG(mi)) {
- (void) fprintf(stderr,
- "%s:\n\tnum_sharks=%d\n\tsharkspeed=%.1f\n\tsharksize=%d\n\twhalespeed=%.1f\n\twireframe=%s\n",
- MI_NAME(mi),
- ap->num_sharks,
- ap->sharkspeed,
- ap->sharksize,
- ap->whalespeed,
- ap->wire ? "yes" : "no"
- );
- }
- if ((ap->glx_context = init_GL(mi)) != NULL) {
-
- reshape_atlantis(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- Init(mi);
- AllDisplay(ap);
- glXSwapBuffers(display, window);
-
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-/*
- *-----------------------------------------------------------------------------
- * Called by the mainline code periodically to update the display.
- *-----------------------------------------------------------------------------
- */
-ENTRYPOINT void
-draw_atlantis(ModeInfo * mi)
-{
- atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
-
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- MI_IS_DRAWN(mi) = True;
-
- if (!ap->glx_context)
- return;
-
- glXMakeCurrent(display, window, *ap->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
- glRotatef(current_device_rotation(), 0, 0, 1);
- AllDisplay(ap);
- Animate(ap);
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glXSwapBuffers(display, window);
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * The display is being taken away from us. Free up malloc'ed
- * memory and X resources that we've alloc'ed.
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void
-free_atlantis(ModeInfo * mi)
-{
- atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
- if (!ap->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ap->glx_context);
- if (ap->sharks) free(ap->sharks);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-refresh_atlantis(ModeInfo * mi)
-{
-}
-
-ENTRYPOINT void
-change_atlantis(ModeInfo * mi)
-{
- atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
-
- if (!ap->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ap->glx_context);
- Init(mi);
-}
-#endif /* !STANDALONE */
-
-XSCREENSAVER_MODULE ("Atlantis", atlantis)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/atlantis.h b/hacks/glx/atlantis.h
deleted file mode 100644
index dce68ac..0000000
--- a/hacks/glx/atlantis.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* atlantis --- Shows moving 3D sea animals */
-
-/* Copyright (c) E. Lassauge, 1998. */
-
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The original code for this mode was written by Mark J. Kilgard
- * as a demo for openGL programming.
- *
- * Porting it to xlock was possible by comparing the original Mesa's morph3d
- * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
- * (look at morph3d.c) for his indirect help.
- *
- * Thanks goes also to Brian Paul for making it possible and inexpensive
- * to use OpenGL at home.
- *
- * My e-mail address is lassauge@users.sourceforge.net
- *
- * Eric Lassauge (May-13-1998)
- *
- */
-
-/**
- * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
- * ALL RIGHTS RESERVED
- * Permission to use, copy, modify, and distribute this software for
- * any purpose and without fee is hereby granted, provided that the above
- * copyright notice appear in all copies and that both the copyright notice
- * and this permission notice appear in supporting documentation, and that
- * the name of Silicon Graphics, Inc. not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission.
- *
- * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
- * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
- * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
- * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
- * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
- * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
- * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
- * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * US Government Users Restricted Rights
- * Use, duplication, or disclosure by the Government is subject to
- * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
- * (c)(1)(ii) of the Rights in Technical Data and Computer Software
- * clause at DFARS 252.227-7013 and/or in similar or successor
- * clauses in the FAR or the DOD or NASA FAR Supplement.
- * Unpublished-- rights reserved under the copyright laws of the
- * United States. Contractor/manufacturer is Silicon Graphics,
- * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
- *
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
- */
-
-#ifdef STANDALONE
-# include "xlockmoreI.h"
-#else
-# include "xlock.h"
-#endif
-
-#include <math.h>
-
-#define RAD 57.295
-#define RRAD 0.01745
-
-/* default values */
-#define NUM_SHARKS 4
-#define SHARKSPEED 100
-#define SHARKSIZE 6000
-
-typedef struct _fishRec {
- float x, y, z, phi, theta, psi, v;
- float xt, yt, zt;
- float htail, vtail;
- float dtheta;
- int spurt, attack;
- int sign;
-} fishRec;
-
-typedef struct {
- GLint WinH, WinW;
- GLXContext *glx_context;
- int num_sharks;
- float sharkspeed, whalespeed;
- int sharksize;
- int wire;
- Bool whaledir;
- fishRec *sharks;
- fishRec momWhale;
- fishRec babyWhale;
- fishRec dolph;
-
- XImage *texture; /* water distortion overlay bits */
-} atlantisstruct;
-
-extern void FishTransform(fishRec *);
-extern void WhalePilot(fishRec *, float, Bool);
-extern void SharkPilot(fishRec *, float);
-extern void SharkMiss(atlantisstruct *, int);
-extern void DrawWhale(fishRec *, int);
-extern void DrawShark(fishRec *, int);
-extern void DrawDolphin(fishRec *, int);
diff --git a/hacks/glx/atlantis.man b/hacks/glx/atlantis.man
deleted file mode 100644
index 1a77391..0000000
--- a/hacks/glx/atlantis.man
+++ /dev/null
@@ -1,78 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-atlantis \- draw swimming sharks, whales, and dolphins.
-.SH SYNOPSIS
-.B atlantis
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-whalespeed \fInumber\fP]
-[\-delay \fInumber\fP]
-[\-size \fInumber\fP]
-[\-count \fInumber\fP]
-[\-no-texture]
-[\-gradient]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-This is xfishtank writ large: a GL animation of a number of sharks,
-dolphins, and whales. The swimming motions are great.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-whalespeed \fInumber\fP
-Whale Speed. 0 - 1000. Default: 250.
-.TP 8
-.B \-cycles \fInumber\fP
-Shark Speed. Default: 100.
-.TP 8
-.B \-size \fInumber\fP
-Shark Proximity. 100 - 10000. Default: 6000.
-.TP 8
-.B \-count \fInumber\fP
-Number of Sharks. 0 - 20. Default: 4.
-.TP 8
-.B \-texture | \-no-texture
-Whether to show shimmering water.
-.TP 8
-.B \-gradient
-Whether to draw a gradient on the background, making it darker at the bottom.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Mark Kilgard. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Mark Kilgard.
-
diff --git a/hacks/glx/atunnel.c b/hacks/glx/atunnel.c
deleted file mode 100644
index f09684c..0000000
--- a/hacks/glx/atunnel.c
+++ /dev/null
@@ -1,314 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* atunnel --- OpenGL Advanced Tunnel Screensaver */
-
-#if 0
-static const char sccsid[] = "@(#)atunnel.c 5.13 2004/05/25 xlockmore";
-#endif
-
-/* Copyright (c) E. Lassauge, 2003-2004. */
-
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The original code for this mode was written by Roman Podobedov
- * Email: romka@ut.ee
- * WEB: http://romka.demonews.com
- *
- * Eric Lassauge (May-25-2004) <lassauge@users.sourceforge.net>
- * http://lassauge.free.fr/linux.html
- *
- * REVISION HISTORY:
- *
- * E.Lassauge - 25-May-2004:
- * - added more texture !
- * E.Lassauge - 16-Mar-2002:
- * - created based on the Roman demo.
- * - deleted all external file stuff to use xpm textures and
- * hardcoded path point values.
- *
- */
-
-#ifdef STANDALONE /* xscreensaver mode */
-#define DEFAULTS "*delay: 10000 \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_atunnel 0
-# define atunnel_handle_event 0
-#define MODE_atunnel
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef MODE_atunnel /* whole file */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include "tunnel_draw.h"
-
-#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined(STANDALONE)
-/* USE_XPM & USE_XPMINC in xlock mode ; STANDALONE in xscreensaver mode */
-#include "ximage-loader.h"
-#define I_HAVE_XPM
-
-#include "images/gen/tunnel0_png.h"
-#include "images/gen/tunnel1_png.h"
-#include "images/gen/tunnel2_png.h"
-#include "images/gen/tunnel3_png.h"
-#include "images/gen/tunnel4_png.h"
-#include "images/gen/tunnel5_png.h"
-#endif /* HAVE_XPM */
-
-
-#define DEF_LIGHT "True"
-#define DEF_WIRE "False"
-#define DEF_TEXTURE "True"
-
-static Bool do_light;
-static Bool do_wire;
-static Bool do_texture;
-
-static XrmOptionDescRec opts[] = {
- {"-light", ".atunnel.light", XrmoptionNoArg, "true" },
- {"+light", ".atunnel.light", XrmoptionNoArg, "false" },
- {"-wireframe",".atunnel.wire", XrmoptionNoArg, "true" },
- {"+wireframe",".atunnel.wire", XrmoptionNoArg, "false" },
- {"-texture", ".atunnel.texture", XrmoptionNoArg, "true" },
- {"+texture", ".atunnel.texture", XrmoptionNoArg, "false" },
-};
-
-static argtype vars[] = {
- {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
- {&do_wire, "wire", "Wire", DEF_WIRE, t_Bool},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
-};
-
-static OptionStruct desc[] =
-{
- {"-/+ light", "whether to do enable lighting (slower)"},
- {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
- {"-/+ texture", "whether to apply a texture (slower)"},
-};
-
-ENTRYPOINT ModeSpecOpt atunnel_opts = {countof(opts), opts, countof(vars), vars, desc};
-
-#ifdef USE_MODULES
-ModStruct atunnel_description =
-{"atunnel", "init_atunnel", "draw_atunnel", NULL,
- "draw_atunnel", "init_atunnel", "free_atunnel", &atunnel_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "OpenGL advanced tunnel screensaver", 0, NULL};
-#endif
-
-/* structure for holding the screensaver data */
-typedef struct {
- int screen_width, screen_height;
- GLXContext *glx_context;
- Window window;
- struct tunnel_state *ts;
- GLuint texture[MAX_TEXTURE]; /* texture id: GL world */
-} atunnelstruct;
-
-static atunnelstruct *Atunnel = NULL;
-
-/*=================== Load Texture =========================================*/
-static void LoadTexture(ModeInfo * mi,
- const unsigned char *data, unsigned long size,
- int t_num)
-{
-#if defined( I_HAVE_XPM )
- atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
- XImage *teximage; /* Texture data */
-
- if ((teximage = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
- data, size))
- == None) {
- (void) fprintf(stderr, "Error reading the texture.\n");
- glDeleteTextures(1, &sa->texture[t_num]);
- do_texture = False;
-#ifdef STANDALONE
- exit(0);
-#else
- return;
-#endif
- }
-
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture(GL_TEXTURE_2D, sa->texture[t_num]);
-#endif /* HAVE_GLBINDTEXTURE */
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- clear_gl_error();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
- check_gl_error("texture");
-
- /* Texture parameters, LINEAR scaling for better texture quality */
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- XDestroyImage(teximage);
-#else /* !I_HAVE_XPM */
- do_texture = False;
-#endif /* !I_HAVE_XPM */
-}
-
-/*=================== Main Initialization ==================================*/
-static void Init(ModeInfo * mi)
-{
- atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
- GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0};
- GLfloat fogColor[4] = {0.8, 0.8, 0.8, 1.0};
-
- if (do_texture)
- {
- glGenTextures(MAX_TEXTURE, sa->texture);
- LoadTexture(mi, tunnel0_png, sizeof(tunnel0_png),0);
- LoadTexture(mi, tunnel1_png, sizeof(tunnel1_png),1);
- LoadTexture(mi, tunnel2_png, sizeof(tunnel2_png),2);
- LoadTexture(mi, tunnel3_png, sizeof(tunnel3_png),3);
- LoadTexture(mi, tunnel4_png, sizeof(tunnel4_png),4);
- LoadTexture(mi, tunnel5_png, sizeof(tunnel5_png),5);
- glEnable(GL_TEXTURE_2D);
- }
- sa->ts = atunnel_InitTunnel();
-
- /* Set lighting parameters */
- if (do_light)
- {
- glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position);
-
- /* Enable light 0 */
- glEnable(GL_LIGHT0);
- glDepthFunc(GL_LESS);
-
- glEnable(GL_LIGHTING);
- }
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- do_wire = 0;
-# endif
-
- if (do_wire) {
- glDisable(GL_NORMALIZE);
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_TEXTURE_2D);
- glPolygonMode(GL_FRONT,GL_LINE);
- glPolygonMode(GL_BACK,GL_LINE);
- }
- else
- {
- glEnable(GL_DEPTH_TEST);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-
- /* Enable fog */
- glFogi(GL_FOG_MODE, GL_EXP);
- glFogfv(GL_FOG_COLOR, fogColor);
- glFogf(GL_FOG_DENSITY, 0.3);
- glEnable(GL_FOG);
-
- /* Cull face */
- glCullFace(GL_FRONT);
- glEnable(GL_CULL_FACE);
- }
-
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
-}
-
-
-/* Standard reshape function */
-ENTRYPOINT void
-reshape_atunnel(ModeInfo *mi, int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 2) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-0.1*(1/h), 0.1*(1/h), -0.1, 0.1, 0.1, 10);
- glMatrixMode(GL_MODELVIEW);
-}
-
-/* draw the screensaver once */
-ENTRYPOINT void draw_atunnel(ModeInfo * mi)
-{
- atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!sa->glx_context)
- return;
-
- glXMakeCurrent(display, window, *sa->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glLoadIdentity();
-
- atunnel_DrawTunnel(sa->ts, do_texture, do_light, sa->texture);
- atunnel_SplashScreen(sa->ts, do_wire, do_texture, do_light);
-
- glFlush();
- /* manage framerate display */
- if (MI_IS_FPS(mi)) do_fps (mi);
- glXSwapBuffers(display, window);
-
-}
-
-
-/* xscreensaver initialization routine */
-ENTRYPOINT void init_atunnel(ModeInfo * mi)
-{
- int screen = MI_SCREEN(mi);
- atunnelstruct *sa;
-
- MI_INIT(mi, Atunnel);
- sa = &Atunnel[screen];
-
- sa->window = MI_WINDOW(mi);
- if ((sa->glx_context = init_GL(mi)) != NULL) {
- reshape_atunnel(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- Init(mi);
- } else {
- MI_CLEARWINDOW(mi);
- }
-
-}
-
-ENTRYPOINT void free_atunnel(ModeInfo * mi)
-{
- atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
- if (!sa->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sa->glx_context);
- atunnel_FreeTunnel(sa->ts);
- glDeleteTextures (MAX_TEXTURE, sa->texture);
-}
-
-XSCREENSAVER_MODULE ("Atunnel", atunnel)
-
-#endif
diff --git a/hacks/glx/atunnel.man b/hacks/glx/atunnel.man
deleted file mode 100644
index 6debadf..0000000
--- a/hacks/glx/atunnel.man
+++ /dev/null
@@ -1,70 +0,0 @@
-.TH XScreenSaver 1 "12-Feb-03" "X Version 11"
-.SH NAME
-atunnel \- hypnotic GL tunnel journey
-.SH SYNOPSIS
-.B sballs
-[\-display \fIhost:display.screen\fP] [\-window] [\-root]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
-[\-light] [\-no-light]
-[\-wire] [\-no-wire]
-[\-texture] [\-no-texture]
-[\-fps]
-.SH DESCRIPTION
-The \fIatunnel\fP program draws an animation of a journey in a GL tunnel.
-.SH OPTIONS
-.I sballs
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-texture
-Show a textured tunnel. This is the default.
-.TP 8
-.B \-no\-texture
-Disables texturing the animation.
-.TP 8
-.B \-wire
-Draw a wireframe rendition of the tunnel.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Eric Lassauge.
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-
-The original code for this mode was written by
-Roman Podobedov <romka@ut.ee>
-and can be found at http://romka.demonews.com
-
-.SH AUTHOR
-Roman Podobedov <romka@ut.ee>
-Eric Lassauge <lassauge@users.sourceforge.net>
diff --git a/hacks/glx/b_draw.c b/hacks/glx/b_draw.c
deleted file mode 100644
index 1b789b6..0000000
--- a/hacks/glx/b_draw.c
+++ /dev/null
@@ -1,239 +0,0 @@
-#if 0
-static const char sccsid[] = "@(#)b_draw.c 4.11 98/06/16 xlockmore";
-#endif
-
-/*-
- * BUBBLE3D (C) 1998 Richard W.M. Jones.
- * b_draw.c: This code creates new bubbles, manages them and controls
- * them as they are drawn on the screen.
- */
-
-#include "bubble3d.h"
-
-typedef struct draw_context {
- /* The list of bubbles currently on the screen. */
- void **bubble_list;
- int nr_bubbles;
-
- /* When was the last time we created a new bubble? */
- int bubble_count;
-
- glb_data *d;
-
-} draw_context;
-
-void *
-glb_draw_init(void)
-{
- draw_context *c;
-
- GLfloat mat_specular[] =
- {1, 1, 1, 1};
- GLfloat mat_emission[] =
- {0, 0, 0, 1};
- GLfloat mat_shininess[] =
- {100};
- GLfloat ambient[] =
- {0.5, 0.5, 0.5, 1.0};
- GLfloat light_position[][4] =
- {
- {0, -1, 0, 0},
- {1, 1, 0, 0},
- {-1, 0, 1, 0}};
- GLfloat light_diffuse[][4] =
- {
- {1, 1, 1, 1},
- {1, 1, 1, 1},
- {1, 1, 1, 1}};
- GLfloat light_specular[][4] =
- {
- {1, 1, 1, 1},
- {1, 1, 1, 1},
- {1, 1, 1, 1}};
-
- /* Initialize the context. */
- c = (struct draw_context *) malloc(sizeof (struct draw_context));
-
- if (c == 0)
- return 0;
- c->bubble_list = 0;
- c->nr_bubbles = 0;
- c->bubble_count = glb_config.create_bubbles_every;
-
- /* Do some GL initialization. */
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, glb_config.bubble_colour);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
-
- if (glb_config.transparent_p)
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_LIGHT2);
-
- if (glb_config.transparent_p)
- glEnable(GL_BLEND);
- else
- glEnable(GL_DEPTH_TEST);
-
- glEnable(GL_AUTO_NORMAL);
- glEnable(GL_NORMALIZE);
-
- if (glb_config.transparent_p)
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
-
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position[0]);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse[0]);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular[0]);
- glLightfv(GL_LIGHT1, GL_POSITION, light_position[1]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular[1]);
- glLightfv(GL_LIGHT2, GL_POSITION, light_position[2]);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse[2]);
- glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular[2]);
-
- c->d = glb_sphere_init();
-
- return c;
-}
-
-static void
-delete_bubble(draw_context * c, int j)
-{
- int i;
-
- glb_bubble_delete(c->bubble_list[j]);
-
- for (i = j; i < c->nr_bubbles - 1; ++i)
- c->bubble_list[i] = c->bubble_list[i + 1];
-
- c->nr_bubbles--;
-}
-
-void
-glb_draw_end(void *cc)
-{
- draw_context *c = (draw_context *) cc;
- int i;
-
- for (i = 0; i < c->nr_bubbles; ++i) {
- delete_bubble(c, i);
- i--;
- }
-
- glb_sphere_end (c->d);
-
- free(c->bubble_list);
- free(c);
-}
-
-static int
-create_new_bubbles(draw_context * c)
-{
- int n, i;
- double r = glb_drand();
- GLfloat size, speed, scale_incr, x, y, z;
- void *b[4];
- void **old_bubble_list;
-
- /* How many bubbles to make? */
- if (r < glb_config.p_bubble_group[0])
- n = 1;
- else if (r < glb_config.p_bubble_group[1])
- n = 2;
- else if (r < glb_config.p_bubble_group[2])
- n = 3;
- else
- n = 4;
-
- /* Initial position of top-most bubble in group. */
- x = glb_drand() * 4 - 2;
- y = glb_config.screen_bottom;
- z = glb_drand() * 2 - 2;
-
- /* What size? */
- size = glb_config.min_size
- + glb_drand() * (glb_config.max_size - glb_config.min_size);
-
- /* What speed? */
- speed = glb_config.min_speed
- + glb_drand() * (glb_config.max_speed - glb_config.min_speed);
-
- /* Work out the scaling increment. Bubbles should increase by scale_factor
- * as they go from bottom to top of screen.
- */
- scale_incr = (size * glb_config.scale_factor - size)
- / ((glb_config.screen_top - glb_config.screen_bottom) / speed);
-
- /* Create the bubble(s). */
- for (i = 0; i < n; ++i) {
- if ((b[i] = glb_bubble_new(c->d, x, y, z, size, speed, scale_incr)) == 0) {
- /* Out of memory - recover. */
- i--;
- while (i >= 0)
- glb_bubble_delete(b[i]);
- return 0;
- }
- /* Create the next bubble below the last bubble. */
- y -= size * 3;
- }
-
- /* Add the bubbles to the list. */
- c->nr_bubbles += n;
- old_bubble_list = c->bubble_list;
- if (c->bubble_list == 0) {
- c->bubble_list = (void **) malloc(c->nr_bubbles * sizeof (void *));
- } else {
- c->bubble_list = (void **) realloc(c->bubble_list,
- c->nr_bubbles * sizeof (void *));
- }
-
- if (c->bubble_list == 0) {
- /* Out of memory - recover. */
- for (i = 0; i < n; ++i)
- glb_bubble_delete(b[i]);
- c->bubble_list = old_bubble_list;
- c->nr_bubbles -= n;
- return 0;
- }
- for (i = 0; i < n; ++i)
- c->bubble_list[c->nr_bubbles - i - 1] = b[i];
-
- return 1;
-}
-
-void
-glb_draw_step(void *cc)
-{
- draw_context *c = (draw_context *) cc;
- int i;
-
- /* Consider creating a new bubble or bubbles. */
- if (c->nr_bubbles < glb_config.max_bubbles &&
- c->bubble_count++ > glb_config.create_bubbles_every) {
- if (create_new_bubbles(c))
- c->bubble_count = 0;
- }
- /* Clear the display. */
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- /* XXX Draw the background here ... */
-
- /* Draw all the bubbles on the display. */
- for (i = 0; i < c->nr_bubbles; ++i) {
- void *b = c->bubble_list[i];
-
- glb_bubble_step(b);
- glb_bubble_draw(c->d, b);
-
- /* Has the bubble reached the top of the screen? */
- if (glb_bubble_get_y(b) >= glb_config.screen_top) {
- delete_bubble(c, i);
- i--;
- }
- }
-}
diff --git a/hacks/glx/b_lockglue.c b/hacks/glx/b_lockglue.c
deleted file mode 100644
index 5c74c80..0000000
--- a/hacks/glx/b_lockglue.c
+++ /dev/null
@@ -1,238 +0,0 @@
-#if 0
-static const char sccsid[] = "@(#)b_lockglue.c 4.11 98/06/16 xlockmore";
-#endif
-
-/*-
- * BUBBLE3D (C) 1998 Richard W.M. Jones.
- * b_lockglue.c: Glue to make this all work with xlockmore.
- */
-
-#include "bubble3d.h"
-
-/* XXX This lot should eventually be made configurable using the
- * options stuff below.
- */
-struct glb_config glb_config =
-{
- 0, /* transparent_p */
-#if GLB_SLOW_GL
- 2, /* subdivision_depth */
-#else
- 3, /* subdivision_depth */
-#endif
- 5, /* nr_nudge_axes */
- 0.01, /* nudge_angle_factor */
- 0.20, /* nudge_factor */
- 0.1, /* rotation_factor */
- 8, /* create_bubbles_every */
- 8, /* max_bubbles */
- {0.7, 0.8, 0.9, 1.0}, /* p_bubble_group */
- 0.5, /* max_size */
- 0.1, /* min_size */
- 0.03, /* max_speed */
- 0.005, /* min_speed */
- 1.5, /* scale_factor */
- -4, /* screen_bottom */
- 4, /* screen_top */
- {0.0, 0.0, 0.7, 0.3} /* bubble_colour */
-};
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 10000 \n" \
- "*showFPS: False \n"
-
-# define release_bubble3d 0
-# define bubble3d_handle_event xlockmore_no_events
-#include "xlockmore.h"
-#else
-#include "xlock.h"
-#include "vis.h"
-#endif
-
-#ifdef USE_GL
-
-
-#define DEF_TRANSPARENT "True"
-#define DEF_BUBBLECOLOR "random"
-
-static Bool transparent_p;
-static char *bubble_color_str;
-
-static XrmOptionDescRec opts[] = {
- { "-transparent", ".transparent", XrmoptionNoArg, "True" },
- { "+transparent", ".transparent", XrmoptionNoArg, "False" },
- { "-color", ".bubblecolor", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&transparent_p, "transparent", "Transparent", DEF_TRANSPARENT, t_Bool},
- {&bubble_color_str, "bubblecolor", "BubbleColor", DEF_BUBBLECOLOR, t_String},
-};
-
-ENTRYPOINT ModeSpecOpt bubble3d_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct bubbles3d_description =
-{"bubbles3d",
- "init_bubble3d",
- "draw_bubble3d",
- NULL,
- "change_bubble3d",
- "init_bubble3d",
- "free_bubble3d",
- &bubble3d_opts,
- 1000, 1, 2, 1, 64, 1.0, "",
- "Richard Jones's GL bubbles",
- 0,
- NULL
-};
-
-#endif /* USE_MODULES */
-
-struct context {
- GLXContext *glx_context;
- void *draw_context;
-};
-
-static struct context *contexts = 0;
-
-static void
-parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
-{
- XColor c;
-
- if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
- {
- fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
- exit (1);
- }
- a[0] = c.red / 65536.0;
- a[1] = c.green / 65536.0;
- a[2] = c.blue / 65536.0;
-}
-
-static void
-init_colors(ModeInfo *mi)
-{
- if (strncasecmp(bubble_color_str, "auto", strlen("auto")) == 0) {
- glb_config.bubble_colour[0] = ((float) (NRAND(100)) / 100.0);
- glb_config.bubble_colour[1] = ((float) (NRAND(100)) / 100.0);
- /* I keep more blue */
- glb_config.bubble_colour[2] = ((float) (NRAND(50)) / 100.0) + 0.50;
- } else if (strncasecmp(bubble_color_str, "random", strlen("random")) == 0) {
- glb_config.bubble_colour[0] = -1.0;
- } else {
- parse_color(mi, "bubble", bubble_color_str, glb_config.bubble_colour);
- }
-}
-
-static void
-init(struct context *c)
-{
- glb_config.transparent_p = transparent_p;
- glb_sphere_init();
- c->draw_context = glb_draw_init();
-}
-
-ENTRYPOINT void
-reshape_bubble3d(ModeInfo *mi, int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- h = height / (GLfloat) width;
- }
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45, 1/h, 3, 8);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0, 0, -5);
-}
-
-static void
-do_display(struct context *c)
-{
- glb_draw_step(c->draw_context);
-}
-
-ENTRYPOINT void
-init_bubble3d(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int screen = MI_SCREEN(mi);
- struct context *c;
-
- MI_INIT (mi, contexts);
- c = &contexts[screen];
- c->glx_context = init_GL(mi);
- init_colors(mi);
- if (c->glx_context != 0) {
- init(c);
- reshape_bubble3d(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- do_display(c);
- glFinish();
- glXSwapBuffers(display, window);
- } else
- MI_CLEARWINDOW(mi);
-}
-
-ENTRYPOINT void
-draw_bubble3d(ModeInfo * mi)
-{
- struct context *c = &contexts[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- MI_IS_DRAWN(mi) = True;
-
- if (!c->glx_context)
- return;
-
- glXMakeCurrent(display, window, *c->glx_context);
-
- glb_config.polygon_count = 0;
- glPushMatrix();
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- /* Portrait needs to be a little zoomed in or else
- the bubbles pop into existence already on-screen. */
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)) * 1.5
- : 1);
- glRotatef (current_device_rotation(), 0, 0, 1);
- glScalef (s, s, s);
- }
-
- do_display(c);
- glPopMatrix();
- mi->polygon_count = glb_config.polygon_count;
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(display, window);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-change_bubble3d(ModeInfo * mi)
-{
- /* nothing */
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void
-free_bubble3d(ModeInfo * mi)
-{
- struct context *c = &contexts[MI_SCREEN(mi)];
- if (!c->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *c->glx_context);
- if (c->draw_context) glb_draw_end(c->draw_context);
-}
-
-XSCREENSAVER_MODULE ("Bubble3D", bubble3d)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/b_sphere.c b/hacks/glx/b_sphere.c
deleted file mode 100644
index 38e3d79..0000000
--- a/hacks/glx/b_sphere.c
+++ /dev/null
@@ -1,219 +0,0 @@
-#if 0
-static const char sccsid[] = "@(#)b_sphere.c 4.11 98/06/16 xlockmore";
-#endif
-
-/*-
- * BUBBLE3D (C) 1998 Richard W.M. Jones.
- * b_sphere.c: Create a list of vertices and triangles in a
- * normalized sphere, which is then later used as the basic shape
- * for all bubbles. This code is run once when the program starts
- * up.
- */
-
-#include "bubble3d.h"
-
-typedef glb_vertex vertex;
-typedef glb_triangle triangle;
-
-struct glb_data {
-
- /* The list of vertices created. */
- vertex *vertices;
- int nr_vertices, nr_vertices_allocated;
-
- /* The list of triangles created. */
- triangle *triangles;
- int nr_triangles, nr_triangles_allocated;
-};
-
-
-#define EPSILON GLB_VERTICES_EPSILON
-
-/* Should be taken care of already... but just in case */
-#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
-#undef inline
-#define inline /* */
-#endif
-static inline int
-close_enough(const GLfloat * v1, const GLfloat * v2)
-{
- return fabs((double) (v1[0] - v2[0])) <= EPSILON &&
- fabs((double) (v1[1] - v2[1])) <= EPSILON &&
- fabs((double) (v1[2] - v2[2])) <= EPSILON;
-}
-
-#define INCR(n) ((n == 0) ? (n = 1) : (n *= 2))
-#define INCR_ALLOCATION(a, n, t) (a = (t *) realloc (a, INCR (n) * sizeof (t)))
-
-static inline GLuint
-save_vertex(glb_data *d, const GLfloat * v)
-{
- int i;
-
- /* Inefficient, but we only do this a few times. Check to see if there's
- * an existing vertex which is `close enough' to this one.
- */
- for (i = 0; i < d->nr_vertices; ++i)
- if (close_enough(v, d->vertices[i]))
- return i;
-
- if (d->nr_vertices_allocated <= d->nr_vertices) {
- if (d->vertices == 0) {
- d->vertices = (vertex *) malloc(INCR(d->nr_vertices_allocated) * sizeof (vertex));
- } else {
- INCR_ALLOCATION(d->vertices, d->nr_vertices_allocated, vertex);
- }
- }
- d->vertices[d->nr_vertices][0] = v[0];
- d->vertices[d->nr_vertices][1] = v[1];
- d->vertices[d->nr_vertices][2] = v[2];
- return d->nr_vertices++;
-}
-
-static inline GLuint
-save_triangle(glb_data *d, GLuint v1, GLuint v2, GLuint v3)
-{
- if (d->nr_triangles_allocated <= d->nr_triangles) {
- if (d->triangles == 0) {
- d->triangles = (triangle *) malloc(INCR(d->nr_triangles_allocated) * sizeof (triangle));
- } else {
- INCR_ALLOCATION(d->triangles, d->nr_triangles_allocated, triangle);
- }
- }
- d->triangles[d->nr_triangles][0] = v1;
- d->triangles[d->nr_triangles][1] = v2;
- d->triangles[d->nr_triangles][2] = v3;
- return d->nr_triangles++;
-}
-
-static inline void
-normalize(GLfloat v[3])
-{
- GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
-
- if (d != 0) {
- v[0] /= d;
- v[1] /= d;
- v[2] /= d;
- } else {
- v[0] = v[1] = v[2] = 0;
- }
-}
-
-static void
-subdivide(glb_data *d,
- const GLfloat * v1, GLuint vi1,
- const GLfloat * v2, GLuint vi2,
- const GLfloat * v3, GLuint vi3,
- int depth)
-{
- int i;
-
- if (depth == 0) {
- save_triangle(d, vi1, vi2, vi3);
- } else {
- GLuint vi12, vi23, vi31;
- GLfloat v12[3], v23[3], v31[3];
-
- for (i = 0; i < 3; ++i) {
- v12[i] = v1[i] + v2[i];
- v23[i] = v2[i] + v3[i];
- v31[i] = v3[i] + v1[i];
- }
- normalize(v12);
- vi12 = save_vertex(d, v12);
- normalize(v23);
- vi23 = save_vertex(d, v23);
- normalize(v31);
- vi31 = save_vertex(d, v31);
- subdivide(d, v1, vi1, v12, vi12, v31, vi31, depth - 1);
- subdivide(d, v2, vi2, v23, vi23, v12, vi12, depth - 1);
- subdivide(d, v3, vi3, v31, vi31, v23, vi23, depth - 1);
- subdivide(d, v12, vi12, v23, vi23, v31, vi31, depth - 1);
- }
-}
-
-#define ICO_X 0.525731112119133606
-#define ICO_Z 0.850650808352039932
-
-static const GLfloat vdata[12][3] =
-{
- {-ICO_X, 0, ICO_Z},
- {ICO_X, 0, ICO_Z},
- {-ICO_X, 0, -ICO_Z},
- {ICO_X, 0, -ICO_Z},
- {0, ICO_Z, ICO_X},
- {0, ICO_Z, -ICO_X},
- {0, -ICO_Z, ICO_X},
- {0, -ICO_Z, -ICO_X},
- {ICO_Z, ICO_X, 0},
- {-ICO_Z, ICO_X, 0},
- {ICO_Z, -ICO_X, 0},
- {-ICO_Z, -ICO_X, 0}
-};
-
-static const GLuint tindices[20][3] =
-{
- {0, 4, 1},
- {0, 9, 4},
- {9, 5, 4},
- {4, 5, 8},
- {4, 8, 1},
- {8, 10, 1},
- {8, 3, 10},
- {5, 3, 8},
- {5, 2, 3},
- {2, 7, 3},
- {7, 10, 3},
- {7, 6, 10},
- {7, 11, 6},
- {11, 0, 6},
- {0, 1, 6},
- {6, 1, 10},
- {9, 0, 11},
- {9, 11, 2},
- {9, 2, 5},
- {7, 2, 11}
-};
-
-/* Public interface: Create the sphere. */
-glb_data *
-glb_sphere_init(void)
-{
- glb_data *d = (glb_data *) calloc (1, sizeof (*d));
- int i;
-
- for (i = 0; i < 20; ++i) {
- subdivide(d, vdata[tindices[i][0]], save_vertex(d, vdata[tindices[i][0]]),
- vdata[tindices[i][1]], save_vertex(d, vdata[tindices[i][1]]),
- vdata[tindices[i][2]], save_vertex(d, vdata[tindices[i][2]]),
- glb_config.subdivision_depth);
- }
-
- return d;
-}
-
-/* Return the vertices list. */
-glb_vertex *
-glb_sphere_get_vertices(glb_data *d, int *nr_vertices_ptr)
-{
- *nr_vertices_ptr = d->nr_vertices;
- return d->vertices;
-}
-
-/* Return the triangles list. */
-glb_triangle *
-glb_sphere_get_triangles(glb_data *d, int *nr_triangles_ptr)
-{
- *nr_triangles_ptr = d->nr_triangles;
- return d->triangles;
-}
-
-/* Free up memory. */
-void
-glb_sphere_end(glb_data *d)
-{
- free(d->vertices);
- free(d->triangles);
- free (d);
-}
diff --git a/hacks/glx/beats.c b/hacks/glx/beats.c
deleted file mode 100644
index 67a6eb8..0000000
--- a/hacks/glx/beats.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/* beats, Copyright (c) 2020 David Eccles (gringer) <hacking@gringene.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation. No representations are made
- * about the suitability of this software for any purpose. It is
- * provided "as is" without express or implied warranty.
- */
-
-/* Beats changes the position of objects in time with a
- * synchronisation signal (or more correctly, based on the time
- * elapsed since the last synchronisation point). By default, the
- * system clock is used for this signal, with synchronisation
- * happening every minute. The location of objects is entirely
- * dependant on this synchronisation signal; there is no multi-object
- * state that needs to be stored, although there may be some styling
- * state required.
- */
-
-#define DEFAULTS "*count: 30 \n" \
- "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_beats 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "sphere.h"
-#include "hsv.h"
-#include <ctype.h>
-#include <sys/time.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_CYCLE "-1"
-#define DEF_TICK "True"
-#define DEF_BLUR "True"
-
-#define SPHERE_SLICES 16 /* how densely to render spheres */
-#define SPHERE_STACKS 16
-
-
-typedef struct {
- GLXContext *glx_context;
- Bool button_down_p;
-
- GLuint beats_list;
-
- GLfloat pos;
-
- int ball_count; /* Number of balls */
- int preset_cycle; /* Cycle to show (-1 for random) */
- Bool use_tick; /* Add tick for clockwise / galaxy */
- Bool use_blur; /* Motion blur */
- int ncolors;
- XColor *colors;
- int ccolor;
- int color_shift;
-
-} beats_configuration;
-
-static beats_configuration *bps = NULL;
-
-static int cycle_arg;
-static Bool tick_arg;
-static Bool blur_arg;
-
-static XrmOptionDescRec opts[] = {
- { "-cycle", ".cycle", XrmoptionSepArg, 0 },
- { "-count", ".count", XrmoptionSepArg, 0 },
- { "-tick", ".tick", XrmoptionNoArg, "on" },
- { "+tick", ".tick", XrmoptionNoArg, "off" },
- { "-blur", ".blur", XrmoptionNoArg, "on" },
- { "+blur", ".blur", XrmoptionNoArg, "off" }
-};
-
-static argtype vars[] = {
- {&cycle_arg, "cycle", "Cycle", DEF_CYCLE, t_Int},
- {&tick_arg, "tick", "Tick", DEF_TICK, t_Bool},
- {&blur_arg, "blur", "Blur", DEF_BLUR, t_Bool}
-};
-
-static OptionStruct desc[] = {
- {"-count num", "number of balls"},
- {"-cycle num", "cycle / pattern type"},
- {"-/+tick", "enable/disable tick for clockwise and galaxy"},
- {"-/+blur", "enable/disable motion blur"}
-};
-
-ENTRYPOINT ModeSpecOpt beats_opts =
- {countof(opts), opts, countof(vars), vars, desc};
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_beats (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-beats_handle_event (ModeInfo *mi, XEvent *event)
-{
- return True;
-}
-
-static Bool getFracColour (GLfloat* retVal, float posFrac, float s){
- /* top: red, right: yellow, bottom: [dark] green, left: blue */
- /* note: fixed point; align to 0.1 degree increments */
- int theta, h, v;
- unsigned short r,g,b;
- theta = ((int)(posFrac * 3600) % 3600 + 3600) % 3600;
- v = 100;
- if ((theta >= 0) && (theta < 900)) {
- h = (theta * 600) / 900;
- } else if ((theta >= 900) && (theta < 1800)) {
- h = ((theta - 900) * 600) / 900 + 600;
- v = 100 - ((theta - 900) / 18);
- } else if ((theta >= 1800) && (theta < 2700)) {
- h = ((theta - 1800) * 1200) / 900 + 1200;
- v = ((theta - 1800) / 18) + 50;
- } else /* if ((theta >= 2700) && (theta < 3600))*/ {
- h = ((theta - 2700) * 1200) / 900 + 2400;
- }
- hsv_to_rgb((int)h / 10.0, s, v / 100.0, &r, &g, &b);
- retVal[0] = r / 65535.0;
- retVal[1] = g / 65535.0;
- retVal[2] = b / 65535.0;
- return True;
-}
-
-
-ENTRYPOINT void
-init_beats (ModeInfo *mi)
-{
- beats_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_beats (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.02, 0.02, 0.02, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.2, 0.2, 0.2, 0.2};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glEnable(GL_LIGHT0);
- }
-
- if (cycle_arg > 3) cycle_arg = -1;
-
- bp->ball_count = MI_COUNT(mi);
- if (bp->ball_count < 2) bp->ball_count = 2;
-
- bp->preset_cycle = cycle_arg;
- bp->use_tick = tick_arg;
- bp->use_blur = blur_arg;
-
-# ifdef HAVE_ANDROID
- bp->use_blur = False; /* Works on iOS but not Android */
-# endif
-
- bp->ncolors = 128;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
-
- bp->beats_list = glGenLists(1);
-
- glNewList (bp->beats_list, GL_COMPILE);
- glScalef(0.71, 0.71, 0.71);
- unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
- glEndList ();
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-ENTRYPOINT void
-draw_beats (ModeInfo *mi)
-{
- beats_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- unsigned num_objects = bp->ball_count, oi;
- struct timeval tv, tvOrig;
- struct tm *now;
- Bool sineWaveTick = bp->use_tick;
- Bool motionBlur = bp->use_blur;
- size_t cycle, dist;
- unsigned int tmS, tmM, tmH, tmD;
- unsigned int timeSeed;
- int timeDelta = 0;
- size_t blurOffset = 10; /* offset per blur frame, in milliseconds */
- size_t framesPerBlur = 20; /* number of sub-frames to blur */
- size_t deltaLimit = (motionBlur) ? (blurOffset * framesPerBlur) : 1;
- float ballAlpha;
- float secFrac, minFrac, minProp, hourProp, halfDayProp,
- z, op, mp, m2m,
- theta, delta, blurFrac, oFP, pathLength;
-
- static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat bshiny = 92.0;
-
- GLfloat bcolor[4] = {0.85, 0.75, 0.75, 1.0};
-
- if (!bp->glx_context)
- return;
- gettimeofday (&tvOrig, NULL);
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_ALPHA_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
- glEnable(GL_BLEND);
- glEnable(GL_DEPTH_TEST);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glPushMatrix ();
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)
- : 1);
- glScalef (s, s, s);
- }
-
- /* timeDelta is in milliseconds */
- for(timeDelta = 0; timeDelta <= deltaLimit; timeDelta += blurOffset){
- if(timeDelta < blurOffset){
- /* glEnable(GL_DEPTH_TEST); */
- ballAlpha = 1.0;
- } else {
- /* glDisable(GL_DEPTH_TEST); */
- ballAlpha = 1.0 / framesPerBlur;
- }
- blurFrac = sin((1 - (float) timeDelta / deltaLimit) * M_PI_2) * ballAlpha;
- tv = tvOrig;
- now = localtime (&tv.tv_sec); /* This seems to be needed for seconds */
- tmS = now->tm_sec;
- tmM = now->tm_min;
- tmH = now->tm_hour;
- tmD = now->tm_yday;
- secFrac = ((tv.tv_usec % 1000000) - (timeDelta * 1000)) / (1e6);
- if(secFrac < 0){
- secFrac += 1;
- tmS--;
- if(tmS < 0){
- tmS += 60;
- tmM--;
- }
- if(tmM < 0){
- tmM += 60;
- tmH--;
- }
- if(tmH < 0){
- tmH += 24;
- tmD--;
- }
- if(tmD < 0){
- /* note: this won't be accurate for leap years, but the rare
- event logic is complex enough */
- tmD += 365;
- }
- }
- /* pseudo-random generator based on current minute */
- timeSeed = (((tmM+1) * (tmM+1) * ((tmH+1) * 37) *
- ((tmD+1) * 1151) * 1233599) % 653);
- cycle = timeSeed % 4;
- if(bp->preset_cycle != -1){
- cycle = bp->preset_cycle;
- }
- if(sineWaveTick && (cycle == 0 || cycle == 3)){
- Bool doTick = (timeSeed % 2 == 0);
- if(doTick){ /* choose to tick randomly */
- /* sine-wave 'tick' motion, converts linear 0..1 to
- pause/fast/pause 0..1 */
- secFrac = (1.0 - sin((0.5-secFrac) * M_PI))/2.0;
- }
- }
- minFrac = tmS / 60.0;
- /* now we have enough information to calculate our goal statistic,
- minProp: the position in the synchronisation cycle of one
- minute */
- minProp = (minFrac - trunc(minFrac)) + (secFrac / 60);
- m2m = minProp * 2 * M_PI;
-
- /* change colour based on the minute and hour */
- hourProp = tmM / 60.0 + minProp / 60.0;
- hourProp = hourProp - trunc(hourProp);
-
- halfDayProp = tmH / 12.0 + hourProp / 12.0;
- halfDayProp = halfDayProp - trunc(halfDayProp);
-
- mi->polygon_count = 0;
-
- for(oi = 0; oi < num_objects; oi++){
- glPushMatrix ();
- glScalef(1.1, 1.1, 1.1);
-
- /* Object Fraction Position - 0..1 depending on native Z order */
- oFP = oi * 1.0 / (num_objects - 1);
-
- /* set Z distance between [-3.5 .. 0.5] (common to all cycles) */
- z = (oFP) * 4.0 - 3.5;
-
- /* set colour (common to all cycles) */
- if(oFP < (1 / 3.0)){ /* "second" objects */
- getFracColour(bcolor, minProp, 1.0);
- } else if(oFP < (2 / 3.0)) { /* "minute" objects */
- getFracColour(bcolor, hourProp, 1.0);
- } else { /* "hour" objects */
- getFracColour(bcolor, halfDayProp, 1.0);
- }
-
- /* set x/y location */
- if(cycle == 0){
- /* clockwise */
- glRotatef(-minProp * 360 * (oi + 1), 0, 0, 1);
- glTranslatef(0, 5, 0);
- } else if(cycle == 1){
- /* rain dance */
- float y = 10 * cos(m2m * (oi + 1.0))/2;
- /* rotate around Y axis */
- glTranslatef(0, 0, -20);
- glRotatef(minProp * 360, 0, 1, 0);
- glTranslatef(0, y, 20);
- } else if(cycle == 2){
- /* metronome */
- theta = sin(-m2m * (oi + 1.0)) * 90;
- /* rotate around z axis at (-5, 0, 0) */
- glTranslatef(0, -5, 0);
- glRotatef(theta, 0, 0, 1);
- glTranslatef(0, 10, 0);
- } else if (cycle == 3){
- /* galaxy */
- mp = (num_objects - 1.0) / 2;
- op = mp - oi;
- dist = (int)(fabs(op)+0.5); /* dist from centre */
- /* make sure each object travels an integer number of loops in
- a path through one cycle */
- pathLength = (int)((60.0 / dist) + 0.5) * 720.0;
- delta = pathLength / 2;
- theta = -minProp * delta - 180;
- /* rotate around X axis after translating (0,-5,0) */
- glTranslatef(0, 0, -20);
- glRotatef(minProp * 360 - 180, 1, 0, 0);
- glTranslatef(0, 0, 20);
- glTranslatef(0, -5, 0);
- /* rotate around Y axis */
- glTranslatef(0, 0, -20);
- glRotatef(theta, 0, 1, 0);
- glTranslatef(0, 0, 20);
- }
-
- /* spread out based on Z position */
- glTranslatef(0, 0, (z - 0.5) * 10);
-
- /* set up colours */
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
- if(motionBlur){
- bcolor[3] = (timeDelta == 0) ? 1.0 : blurFrac; /* was ballAlpha */
- }
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
- glCallList (bp->beats_list); /* draw sphere */
- mi->polygon_count += (SPHERE_SLICES * SPHERE_STACKS);
-
- glPopMatrix();
- }
- }
- glPopMatrix();
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_beats (ModeInfo *mi)
-{
- beats_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->colors) free (bp->colors);
- if (glIsList(bp->beats_list)) glDeleteLists(bp->beats_list, 1);
-}
-
-XSCREENSAVER_MODULE ("Beats", beats)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/beats.man b/hacks/glx/beats.man
deleted file mode 100644
index 4fdab0b..0000000
--- a/hacks/glx/beats.man
+++ /dev/null
@@ -1,75 +0,0 @@
-.TH XScreenSaver 1 "2020-Feb-04" "X Version 11"
-.SH NAME
-beats - create offset beating figures
-.SH SYNOPSIS
-.B beats
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-count \fInumber\fP]
-[\-cycle \fInumber\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIbeats\fP program draws balls that move around at a slightly different rate from each other, creating interesting chaotic and ordered beating patterns. Each cycle / pattern is created such that it finishes as a single line of balls at the top of the screen, so that the patterns can smoothly transition between each other.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-count \fInumber\fP
-Number of balls. Default: 30.
-.TP 8
-.B \-cycle \fInumber\fP
-Cycle type to use (Default: -1):
- -1 - pseudo-random based on current time
- 0 - clockwise
- 1 - rain dance
- 2 - metronome
- 3 - galaxy
-.TP 8
-.B \-tick | \-no-tick
-Add a tick for 'clockwise' and 'galaxy' patterns.
-.TP 8
-.B \-blur | \-no-blur
-Add motion blur to the ball movement.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2020 by David Eccles. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-David Eccles (gringer) <hacking@gringene.org>, 2020-Feb-04.
diff --git a/hacks/glx/blinkbox.c b/hacks/glx/blinkbox.c
deleted file mode 100644
index 61531e7..0000000
--- a/hacks/glx/blinkbox.c
+++ /dev/null
@@ -1,614 +0,0 @@
-/* blinkbox, Copyright (c) 2003 Jeremy English <jenglish@myself.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* motion blur added March 2005 by John Boero <jlboero@cs.uwm.edu>
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_ball 0
-# define ball_handle_event xlockmore_no_events
-
-#include "xlockmore.h"
-#include "sphere.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define MAX_COUNT 20
-#define ALPHA_AMT 0.05
-
-/* this should be between 1 and 8 */
-#define DEF_BOXSIZE "2"
-#define DEF_DISSOLVE "False"
-#define DEF_FADE "True"
-#define DEF_BLUR "True"
-
-
-typedef struct{
- GLfloat x,y,z;
-} Tdpos;
-
-typedef struct{
- int hit;
- Tdpos pos;
- int counter;
- GLfloat color[3];
- GLfloat rot[4];
- int des_count;
- int alpha_count;
-}Side;
-
-struct Bounding_box {
- Tdpos top;
- Tdpos bottom;
-};
-
-struct Ball {
- GLfloat x;
- GLfloat y;
- GLfloat z;
- int d;
-};
-
-struct bscale {
- GLfloat wh; /*width Height*/
- GLfloat d; /*depth*/
-};
-
-static const struct Bounding_box bbox = {{14,14,20},{-14,-14,-20}};
-
-typedef struct {
- GLXContext *glx_context;
-
- struct Ball ball;
-
- struct bscale bscale;
-
- Tdpos mo; /*motion*/
- Tdpos moh; /*hold motion value*/
-
- Tdpos bpos;
-
- GLuint ballList;
- GLuint boxList;
- GLfloat des_amt;
-
- /*sides*/
- Side lside;/*Red*/
- Side rside;/*Green*/
- Side tside;/*Blue*/
- Side bside;/*Orange*/
- Side fside;/*Yellow*/
- Side aside;/*Purple*/
- Side *sp;
-
-} blinkboxstruct;
-
-static blinkboxstruct *blinkbox = (blinkboxstruct *) NULL;
-
-
-/* lights */
-static const float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
-static const float LightPosition[]= { 20.0f, 100.0f, 20.0f, 1.0f };
-
-static Bool do_dissolve;
-static Bool do_fade;
-static Bool do_blur;
-static float bscale_wh;
-
-static XrmOptionDescRec opts[] = {
- { "-boxsize", ".boxsize", XrmoptionSepArg, 0 },
- { "-dissolve", ".dissolve", XrmoptionNoArg, "True" },
- { "+dissolve", ".dissolve", XrmoptionNoArg, "False" },
- { "-fade", ".fade", XrmoptionNoArg, "True" },
- { "+fade", ".fade", XrmoptionNoArg, "False" },
- { "-blur", ".blur", XrmoptionNoArg, "True" },
- { "+blur", ".blur", XrmoptionNoArg, "False" }
-
-};
-
-static argtype vars[] = {
- {&bscale_wh, "boxsize", "Boxsize", DEF_BOXSIZE, t_Float},
- {&do_dissolve, "dissolve", "Dissolve", DEF_DISSOLVE, t_Bool},
- {&do_fade, "fade", "Fade", DEF_FADE, t_Bool},
- {&do_blur, "blur", "Blur", DEF_BLUR, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-static void
-swap(GLfloat *a, GLfloat *b)
-{
- GLfloat t = *a;
- *a = *b;
- *b = t;
-}
-
-static float
-get_rand(void)
-{
- GLfloat j = 1+(random() % 2);
- return (j);
-}
-
-static void
-swap_mov(GLfloat *a, GLfloat *b)
-{
- int j;
- swap(a,b);
- j = get_rand();
- if (*a < 0)
- *a = j * -1;
- else
- *a = j;
-}
-
-static void
-cp_b_pos(blinkboxstruct *bp, Tdpos *s_pos)
-{
- s_pos->x = bp->ball.x;
- s_pos->y = bp->ball.y;
- s_pos->z = bp->ball.z;
-}
-
-static void
-hit_side(blinkboxstruct *bp)
-{
- if ((bp->ball.x - bp->ball.d) <= bbox.bottom.x){
- bp->lside.hit = 1;
- bp->lside.counter = MAX_COUNT;
- bp->lside.des_count = 1;
- bp->lside.alpha_count = 0;
- cp_b_pos(bp, &bp->lside.pos);
- swap_mov(&bp->mo.x,&bp->moh.x);
- }else
- if ((bp->ball.x + bp->ball.d) >= bbox.top.x){
- bp->rside.hit = 1;
- bp->rside.counter = MAX_COUNT;
- bp->rside.des_count = 1;
- bp->rside.alpha_count = 0;
- cp_b_pos(bp, &bp->rside.pos);
- swap_mov(&bp->mo.x,&bp->moh.x);
- }
-}
-
-static void
-hit_top_bottom(blinkboxstruct *bp)
-{
- if ((bp->ball.y - bp->ball.d) <= bbox.bottom.y){
- bp->bside.hit = 1;
- bp->bside.counter = MAX_COUNT;
- bp->bside.des_count = 1;
- bp->bside.alpha_count = 0;
- cp_b_pos(bp, &bp->bside.pos);
- swap_mov(&bp->mo.y,&bp->moh.y);
- }else
- if ((bp->ball.y + bp->ball.d) >= bbox.top.y){
- bp->tside.hit = 1;
- bp->tside.counter = MAX_COUNT;
- bp->tside.des_count = 1;
- bp->tside.alpha_count = 0;
- cp_b_pos(bp, &bp->tside.pos);
- swap_mov(&bp->mo.y,&bp->moh.y);
- }
-}
-
-static void
-hit_front_back(blinkboxstruct *bp)
-{
- if ((bp->ball.z - bp->ball.d) <= bbox.bottom.z){
- bp->aside.hit = 1;
- bp->aside.counter = MAX_COUNT;
- bp->aside.des_count = 1;
- bp->aside.alpha_count = 0;
- cp_b_pos(bp, &bp->aside.pos);
- swap_mov(&bp->mo.z,&bp->moh.z);
- }else
- if((bp->ball.z + bp->ball.d) >= bbox.top.z){
- bp->fside.hit = 1;
- bp->fside.counter = MAX_COUNT;
- bp->fside.des_count = 1;
- bp->fside.alpha_count = 0;
- cp_b_pos(bp, &bp->fside.pos);
- swap_mov(&bp->mo.z,&bp->moh.z);
- }
-}
-
-ENTRYPOINT void
-reshape_ball (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 40.0,
- 0.0, 0.0, 0.0,
- 0.0, 2.0, 10.0);
-}
-
-static void
-unit_cube(int wire)
-{
- glBegin((wire)?GL_LINE_LOOP:GL_QUADS);
- glNormal3f( 0.0f, -1.0f, 0.0f);
- glVertex3f(-1.0f, -1.0f, -1.0f);
- glVertex3f( 1.0f, -1.0f, -1.0f);
- glVertex3f( 1.0f, -1.0f, 1.0f);
- glVertex3f(-1.0f, -1.0f, 1.0f);
- glNormal3f( 0.0f, 0.0f, 1.0f);
- glVertex3f(-1.0f, -1.0f, 1.0f);
- glVertex3f( 1.0f, -1.0f, 1.0f);
- glVertex3f( 1.0f, 1.0f, 1.0f);
- glVertex3f(-1.0f, 1.0f, 1.0f);
- glNormal3f( 0.0f, 0.0f, -1.0f);
- glVertex3f(-1.0f, -1.0f, -1.0f);
- glVertex3f(-1.0f, 1.0f, -1.0f);
- glVertex3f( 1.0f, 1.0f, -1.0f);
- glVertex3f( 1.0f, -1.0f, -1.0f);
- glNormal3f( 1.0f, 0.0f, 0.0f);
- glVertex3f( 1.0f, -1.0f, -1.0f);
- glVertex3f( 1.0f, 1.0f, -1.0f);
- glVertex3f( 1.0f, 1.0f, 1.0f);
- glVertex3f( 1.0f, -1.0f, 1.0f);
- glNormal3f( -1.0f, 0.0f, 0.0f);
- glVertex3f(-1.0f, -1.0f, -1.0f);
- glVertex3f(-1.0f, -1.0f, 1.0f);
- glVertex3f(-1.0f, 1.0f, 1.0f);
- glVertex3f(-1.0f, 1.0f, -1.0f);
- glNormal3f( 1.0f, 1.0f, 0.0f);
- glVertex3f(-1.0f, 1.0f, -1.0f);
- glVertex3f(-1.0f, 1.0f, 1.0f);
- glVertex3f( 1.0f, 1.0f, 1.0f);
- glVertex3f( 1.0f, 1.0f, -1.0f);
- glEnd();
-}
-
-ENTRYPOINT void
-init_ball (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- blinkboxstruct *bp;
-
- MI_INIT (mi, blinkbox);
- bp = &blinkbox[MI_SCREEN(mi)];
-
- if ((bp->glx_context = init_GL(mi)) != NULL) {
- reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- }
- else
- MI_CLEARWINDOW(mi);
-
- bp->ball.d = 1;
- bp->bscale.wh = bscale_wh;
- bp->bscale.d = 0.25;
-
- bp->mo.x = 1;
- bp->mo.y = 1;
- bp->mo.z = 1;
-
- bp->moh.x = -1.0;
- bp->moh.y = -1.5;
- bp->moh.z = -1.5;
-
- bp->bpos.x = 1;
- bp->bpos.y = 1;
- bp->bpos.z = 1;
-
- bp->des_amt = 1;
-
- bp->lside.counter = MAX_COUNT;
- bp->rside.counter = MAX_COUNT;
- bp->tside.counter = MAX_COUNT;
- bp->bside.counter = MAX_COUNT;
- bp->fside.counter = MAX_COUNT;
- bp->aside.counter = MAX_COUNT;
-
- bp->lside.color[0] = 1;
- bp->rside.color[1] = 1;
- bp->tside.color[2] = 1;
-
- bp->bside.color[0] = 1;
- bp->bside.color[1] = 0.5;
-
- bp->fside.color[0] = 1;
- bp->fside.color[1] = 1;
-
- bp->aside.color[0] = 0.5;
- bp->aside.color[2] = 1;
-
- bp->lside.rot[0] = 90;
- bp->rside.rot[0] = 90;
- bp->tside.rot[0] = 90;
- bp->bside.rot[0] = 90;
- bp->fside.rot[0] = 90;
- bp->aside.rot[0] = 90;
-
- bp->lside.rot[2] = 1;
- bp->rside.rot[2] = 1;
- bp->tside.rot[1] = 1;
- bp->bside.rot[1] = 1;
- bp->fside.rot[3] = 1;
- bp->aside.rot[3] = 1;
-
- bp->lside.des_count = 1;
- bp->rside.des_count = 1;
- bp->tside.des_count = 1;
- bp->bside.des_count = 1;
- bp->fside.des_count = 1;
- bp->aside.des_count = 1;
-
- bp->lside.alpha_count = 1;
- bp->rside.alpha_count = 1;
- bp->tside.alpha_count = 1;
- bp->bside.alpha_count = 1;
- bp->fside.alpha_count = 1;
- bp->aside.alpha_count = 1;
-
-
-#define SPHERE_SLICES 12 /* how densely to render spheres */
-#define SPHERE_STACKS 16
-
-/* bp->sp = malloc(sizeof(*bp->sp));
- if(bp->sp == NULL){
- fprintf(stderr,"Could not allocate memory\n");
- exit(1);
- }*/
- if( (bp->bscale.wh < 1) ||
- (bp->bscale.wh > 8) ) {
- fprintf(stderr,"Boxsize out of range. Using default\n");
- bp->bscale.wh = 2;
- }
- if (do_dissolve){
- bp->des_amt = bp->bscale.wh / MAX_COUNT;
- }
-
- reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- bp->ballList = glGenLists(1);
- glNewList(bp->ballList, GL_COMPILE);
- unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
- glEndList ();
-
- bp->boxList = glGenLists(1);
- glNewList(bp->boxList, GL_COMPILE);
- unit_cube(wire);
- glEndList();
-
- if (wire) return;
-
- glEnable(GL_COLOR_MATERIAL);
- glShadeModel(GL_SMOOTH);
- glClearDepth(1.0f);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
- glEnable(GL_LIGHTING);
- glClearDepth(1);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
- glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
- glEnable(GL_LIGHT1);
- if (do_fade || do_blur) {
- glEnable(GL_BLEND);
- glDisable(GL_DEPTH_TEST);
- }
-}
-
-static void
-CheckBoxPos(blinkboxstruct *bp,
- GLfloat bot_x, GLfloat top_x, GLfloat bot_y, GLfloat top_y)
-{
- /*Make sure it's inside of the bounding box*/
- bp->bpos.x = ((bp->bpos.x - bp->bscale.wh) < bot_x) ? bot_x + bp->bscale.wh : bp->bpos.x;
- bp->bpos.x = ((bp->bpos.x + bp->bscale.wh) > top_x) ? top_x - bp->bscale.wh : bp->bpos.x;
- bp->bpos.y = ((bp->bpos.y - bp->bscale.wh) < bot_y) ? bot_y + bp->bscale.wh : bp->bpos.y;
- bp->bpos.y = ((bp->bpos.y + bp->bscale.wh) > top_y) ? top_y - bp->bscale.wh : bp->bpos.y;
-}
-
-ENTRYPOINT void
-draw_ball (ModeInfo *mi)
-{
- blinkboxstruct *bp = &blinkbox[MI_SCREEN(mi)];
-
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i = 0;
-
- if (! bp->glx_context)
- return;
- mi->polygon_count = 0;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- hit_top_bottom(bp);
- hit_front_back(bp);
- hit_side(bp);
-
- glRotated(0.25,0,0,1);
- glRotated(0.25,0,1,0);
- glRotated(0.25,1,0,0);
-
-
- glPushMatrix();
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)
- : 1);
- s *= 0.5;
- glScalef (s, s, s);
- }
-
- glColor3f(1,1,1);
- glPushMatrix();
-
- if (!do_blur || MI_IS_WIREFRAME(mi)) {
- glTranslatef(bp->ball.x += bp->mo.x,
- bp->ball.y += bp->mo.y,
- bp->ball.z += bp->mo.z);
-
- glScalef(2,2,2);
- glCallList(bp->ballList);
- mi->polygon_count += SPHERE_SLICES*SPHERE_STACKS;
-
- } else {
-
-# define blur_detail 24.0
- float ball_alpha = 1 / blur_detail;
-
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glTranslatef(bp->ball.x, bp->ball.y, bp->ball.z);
-
- for (i = 0; i < blur_detail; ++i) {
- glTranslatef(bp->mo.x / blur_detail,
- bp->mo.y / blur_detail,
- bp->mo.z / blur_detail);
-
- /* comment the following line for quick but boring linear blur */
- ball_alpha = sin((M_PI / blur_detail) * i) / blur_detail;
-
- glColor4f(1, 1, 1, ball_alpha);
-
- glScalef(2, 2, 2);
- glCallList(bp->ballList);
- mi->polygon_count += SPHERE_SLICES*SPHERE_STACKS;
- glScalef(.5, .5, .5);
- }
- i = 0;
-
- bp->ball.x += bp->mo.x;
- bp->ball.y += bp->mo.y;
- bp->ball.z += bp->mo.z;
- }
-
- glPopMatrix();
-
- while(i < 6){
- switch(i){
- case 0:{
- bp->sp = &bp->lside;
- bp->bpos.x = bp->lside.pos.z*-1;
- bp->bpos.y = bp->lside.pos.y;
- bp->bpos.z = bbox.bottom.x - bp->bscale.d;
- if (bp->sp->hit)
- CheckBoxPos(bp, bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
- break;
- }
- case 1:{
- bp->sp = &bp->rside;
- bp->bpos.x = bp->rside.pos.z*-1;
- bp->bpos.y = bp->rside.pos.y;
- bp->bpos.z = bbox.top.x + bp->bscale.d;
- if (bp->sp->hit)
- CheckBoxPos(bp, bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
- break;
- }
- case 2:{
- bp->sp = &bp->tside;
- bp->bpos.x = bp->tside.pos.x;
- bp->bpos.y = bp->tside.pos.z;
- bp->bpos.z = bbox.bottom.y - bp->bscale.d;
- if (bp->sp->hit)
- CheckBoxPos(bp, bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
- break;
- }
- case 3:{
- bp->sp = &bp->bside;
- bp->bpos.x = bp->bside.pos.x;
- bp->bpos.y = bp->bside.pos.z;
- bp->bpos.z = bbox.top.y + bp->bscale.d;
- if (bp->sp->hit)
- CheckBoxPos(bp, bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
- break;
- }
- case 4:{
- bp->sp = &bp->fside;
- bp->bpos.x = bp->fside.pos.y;
- bp->bpos.y = bp->fside.pos.x*-1;
- bp->bpos.z = bbox.top.z + bp->bscale.d;
- if (bp->sp->hit)
- CheckBoxPos(bp, bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
- break;
- }
- case 5:{
- bp->sp = &bp->aside;
- bp->bpos.x = bp->aside.pos.y;
- bp->bpos.y = bp->aside.pos.x*-1;
- bp->bpos.z = bbox.bottom.z + bp->bscale.d;
- if (bp->sp->hit)
- CheckBoxPos(bp, bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
- break;
- }
- }
- if(bp->sp->hit){
- if(do_fade){
- glColor4f(bp->sp->color[0],bp->sp->color[1],bp->sp->color[2],1-(ALPHA_AMT * bp->sp->alpha_count));
- }else{
- glColor3fv(bp->sp->color);
- }
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glPushMatrix();
- glRotatef(bp->sp->rot[0],bp->sp->rot[1],bp->sp->rot[2],bp->sp->rot[3]);
- glTranslatef(bp->bpos.x,bp->bpos.y,bp->bpos.z);
- if (do_dissolve) {
- glScalef(bp->bscale.wh-(bp->des_amt*bp->sp->des_count),bp->bscale.wh-(bp->des_amt*bp->sp->des_count),bp->bscale.d);
- }else{
- glScalef(bp->bscale.wh,bp->bscale.wh,bp->bscale.d);
- }
- glCallList(bp->boxList);
- mi->polygon_count += 6;
- glPopMatrix();
- bp->sp->counter--;
- bp->sp->des_count++;
- bp->sp->alpha_count++;
- if(!bp->sp->counter)
- {
- bp->sp->hit = 0;
- }
- }
- i++;
- }
-
-
- glPopMatrix();
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-
-}
-
-ENTRYPOINT void
-free_ball (ModeInfo *mi)
-{
- blinkboxstruct *bp = &blinkbox[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (glIsList(bp->ballList)) glDeleteLists(bp->ballList, 1);
- if (glIsList(bp->boxList)) glDeleteLists(bp->boxList, 1);
-}
-
-XSCREENSAVER_MODULE_2 ("BlinkBox", blinkbox, ball)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/blinkbox.man b/hacks/glx/blinkbox.man
deleted file mode 100644
index 0dc2a3f..0000000
--- a/hacks/glx/blinkbox.man
+++ /dev/null
@@ -1,73 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-blinkbox \- shows a ball inside a box.
-.SH SYNOPSIS
-.B blinkbox
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-wireframe]
-[\-boxsize \fInumber\fP]
-[\-dissolve]
-[\-fade]
-[\-no\-blur]
-[\-fps]
-.SH DESCRIPTION
-Shows a ball contained inside of a bounding box. Colored blocks blink in
-when the ball hits the edges.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-boxsize
-Sets the size of the colored boxes. Should be between 1 and 8. Default: 2
-.TP 8
-.B \-dissolve | \-no-dissolve
-Boxes shrink instead of just vanishing.
-.TP 8
-.B \-fade | \-no-fade
-Boxes fade to transparency instead of just vanishing.
-.TP 8
-.B \-blur | \-no-blur
-Enable or disable motion blur on the ball. Default: blurry.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Jeremy English. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jeremy English. Motion blur by John Boero.
diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c
deleted file mode 100644
index ca29d87..0000000
--- a/hacks/glx/blocktube.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/* blocktube, Copyright (c) 2003 Lars Damerow <lars@oddment.org>
- *
- * Based on Jamie Zawinski's original dangerball code.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEBUG 1
-
-#define DEFAULTS "*delay: 40000 \n" \
- "*wireframe: False \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_blocktube 0
-# define blocktube_handle_event xlockmore_no_events
-
-#include "xlockmore.h"
-#include "colors.h"
-#include <math.h>
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_HOLDTIME "1000"
-#define DEF_CHANGETIME "200"
-#define MAX_ENTITIES 1000
-#define DEF_TEXTURE "True"
-#define DEF_FOG "True"
-
-#if defined(USE_XPM) || defined(USE_XPMINC) || defined(STANDALONE)
-/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
-#include "ximage-loader.h"
-#define I_HAVE_XPM
-
-#include "images/gen/blocktube_png.h"
-#endif /* HAVE_XPM */
-
-typedef struct {
- int id, r, g, b;
- GLfloat tVal;
- int age;
- int lifetime;
- GLfloat position[3];
- GLfloat angle;
- GLfloat angularVelocity;
-} entity;
-
-typedef struct {
- GLXContext *glx_context;
- GLuint block_dlist;
- int nextID;
-
- entity entities[MAX_ENTITIES];
- float targetR, targetG, targetB,
- currentR, currentG, currentB,
- deltaR, deltaG, deltaB;
- int counter;
- int changing;
- GLfloat zoom;
- GLfloat tilt;
- GLuint envTexture;
- XImage *texti;
-
- GLfloat tunnelLength;
- GLfloat tunnelWidth;
- int polys;
-
-} blocktube_configuration;
-
-static blocktube_configuration *lps = NULL;
-
-static GLint holdtime;
-static GLint changetime;
-static int do_texture;
-static int do_fog;
-
-static XrmOptionDescRec opts[] = {
- { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
- { "-changetime", ".changetime", XrmoptionSepArg, 0 },
- {"-texture", ".texture", XrmoptionNoArg, "True" },
- {"+texture", ".texture", XrmoptionNoArg, "False" },
- {"-fog", ".fog", XrmoptionNoArg, "True" },
- {"+fog", ".fog", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&holdtime, "holdtime", "Hold Time", DEF_HOLDTIME, t_Int},
- {&changetime, "changetime", "Change Time", DEF_CHANGETIME, \
- t_Int},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
-};
-
-static OptionStruct desc[] = {
- {"-holdtime", "how long to stay on the same color"},
- {"-changetime", "how long it takes to fade to a new color"},
-};
-
-ENTRYPOINT ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), vars, desc};
-
-#ifdef USE_MODULES
-ModStruct blocktube_description =
- {"blocktube", "init_blocktube", "draw_blocktube", (char *)NULL,
- "draw_blocktube", "init_blocktube", "free_blocktube", &blocktube_opts,
- 40000, 30, 1, 1, 64, 1.0, "",
- "A shifting tunnel of reflective blocks", 0, NULL};
-#endif /* USE_MODULES */
-
-#if defined( I_HAVE_XPM )
-static Bool LoadGLTextures(ModeInfo *mi)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- Bool status;
-
- status = True;
- glGenTextures(1, &lp->envTexture);
- glBindTexture(GL_TEXTURE_2D, lp->envTexture);
- lp->texti = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
- blocktube_png, sizeof(blocktube_png));
- if (!lp->texti) {
- status = False;
- } else {
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lp->texti->width, lp->texti->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, lp->texti->data);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-# ifndef HAVE_JWZGLES /* #### Sphere maps unimplemented */
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-# endif
- }
- return status;
-}
-#endif
-
-static void newTargetColor(blocktube_configuration *lp)
-{
- int luminance = 0;
-
- while (luminance <= 150) {
- lp->targetR = random() % 256;
- lp->targetG = random() % 256;
- lp->targetB = random() % 256;
- lp->deltaR = (lp->targetR - lp->currentR) / changetime;
- lp->deltaG = (lp->targetG - lp->currentG) / changetime;
- lp->deltaB = (lp->targetB - lp->currentB) / changetime;
- luminance = 0.3 * lp->targetR + 0.59 * lp->targetG + 0.11 * lp->targetB;
- }
-}
-
-static void randomize_entity (blocktube_configuration *lp, entity *ent)
-{
- ent->id = lp->nextID++;
- ent->tVal = 1 - ((float)random() / RAND_MAX / 1.5);
- ent->age = 0;
- ent->lifetime = 100;
- ent->angle = random() % 360;
- ent->angularVelocity = 0.5-((float)(random()) / RAND_MAX);
- ent->position[0] = (float)(random()) / RAND_MAX + lp->tunnelWidth;
- ent->position[1] = (float)(random()) / RAND_MAX * 2;
- ent->position[2] = -(float)(random()) / RAND_MAX * lp->tunnelLength;
-}
-
-static void entityTick(blocktube_configuration *lp, entity *ent)
-{
- ent->angle += ent->angularVelocity;
- ent->position[2] += 0.1;
- if (ent->position[2] > lp->zoom) {
- ent->position[2] = -lp->tunnelLength + ((float)(random()) / RAND_MAX) * 20;
- }
- ent->age += 0.1;
-}
-
-static void tick(blocktube_configuration *lp)
-{
- lp->counter--;
- if (!lp->counter) {
- if (!lp->changing) {
- newTargetColor(lp);
- lp->counter = changetime;
- } else {
- lp->counter = holdtime;
- }
- lp->changing = (!lp->changing);
- } else {
- if (lp->changing) {
- lp->currentR += lp->deltaR;
- lp->currentG += lp->deltaG;
- lp->currentB += lp->deltaB;
- }
- }
-}
-
-static int cube_vertices(float x, float y, float z, int wire);
-
-ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height);
-
-ENTRYPOINT void init_blocktube (ModeInfo *mi)
-{
- int loop;
- GLfloat fogColor[4] = {0,0,0,1};
- blocktube_configuration *lp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT(mi, lps);
-
- lp = &lps[MI_SCREEN(mi)];
- lp->glx_context = init_GL(mi);
-
- lp->zoom = 30;
- lp->tilt = 4.5;
- lp->tunnelLength = 200;
- lp->tunnelWidth = 5;
-
- if (wire) {
- do_fog = False;
- do_texture = False;
- glLineWidth(2);
- }
-
- lp->block_dlist = glGenLists (1);
- glNewList (lp->block_dlist, GL_COMPILE);
- lp->polys = cube_vertices(0.15, 1.2, 5.25, wire);
- glEndList ();
-
-#if defined( I_HAVE_XPM )
- if (do_texture) {
- if (!LoadGLTextures(mi)) {
- fprintf(stderr, "%s: can't load textures!\n", progname);
- exit(1);
- }
- glEnable(GL_TEXTURE_2D);
- }
-#endif
-
- /* kick on the fog machine */
- if (do_fog) {
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_LINEAR);
- glHint(GL_FOG_HINT, GL_NICEST);
- glFogf(GL_FOG_START, 0);
- glFogf(GL_FOG_END, lp->tunnelLength/1.8);
- glFogfv(GL_FOG_COLOR, fogColor);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
- }
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glClearDepth(1.0f);
-
- if (!do_texture && !wire) {
- /* If there is no texture, the boxes don't show up without a light.
- Though I don't understand why all the blocks come out gray.
- */
- GLfloat pos[4] = {0.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- }
-
- lp->counter = holdtime;
- lp->currentR = random() % 256;
- lp->currentG = random() % 256;
- lp->currentB = random() % 256;
- newTargetColor(lp);
- for (loop = 0; loop < MAX_ENTITIES; loop++)
- {
- randomize_entity(lp, &lp->entities[loop]);
- }
- reshape_blocktube(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glFlush();
-}
-
-ENTRYPOINT void free_blocktube (ModeInfo *mi)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
-# if defined ( I_HAVE_XPM )
- if (!lp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *lp->glx_context);
- if (lp->envTexture) glDeleteTextures(1, &lp->envTexture);
- if (lp->texti) XDestroyImage(lp->texti);
- if (glIsList(lp->block_dlist)) glDeleteLists(lp->block_dlist, 1);
- if (lp->envTexture) glDeleteTextures (1, &lp->envTexture);
-
-# endif
-}
-
-ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *lp->glx_context);
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0, 1/h, 1.0, 100.0);
- glMatrixMode(GL_MODELVIEW);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-}
-
-static int cube_vertices(float x, float y, float z, int wire)
-{
- int polygon_count = 0;
- float x2, y2, z2, nv = 0.7;
- x2 = x/2;
- y2 = y/2;
- z2 = z/2;
-
- glFrontFace(GL_CW);
-
- glNormal3f(0, 0, nv);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, z2);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
- glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(0, 0, -nv);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(1.0, 0.0); glVertex3f(-x2, -y2, -z2);
- glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, -z2);
- glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, -z2);
- glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, -z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(0, nv, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, y2, -z2);
- glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
- glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(0, -nv, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(1.0, 1.0); glVertex3f(-x2, -y2, -z2);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
- glTexCoord2f(0.0, 0.0); glVertex3f( x2, -y2, z2);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
- polygon_count++;
- glEnd();
-
- if (wire) return polygon_count;
-
- glNormal3f(nv, 0, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
- glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
- glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, z2);
- glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
- polygon_count++;
- glEnd();
-
- glNormal3f(-nv, 0, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0.0, 0.0); glVertex3f(-x2, -y2, -z2);
- glTexCoord2f(1.0, 0.0); glVertex3f(-x2, y2, -z2);
- glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
- glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
- polygon_count++;
- glEnd();
-
- return polygon_count;
-}
-
-static void draw_block(ModeInfo *mi, entity *ent)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- glCallList (lp->block_dlist);
- mi->polygon_count += lp->polys;
-}
-
-ENTRYPOINT void
-draw_blocktube (ModeInfo *mi)
-{
- blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- entity *cEnt = NULL;
- int loop = 0;
-
- if (!lp->glx_context)
- return;
-
- mi->polygon_count = 0;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *lp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (do_texture) {
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glBindTexture(GL_TEXTURE_2D, lp->envTexture);
- }
-
- for (loop = 0; loop < MAX_ENTITIES; loop++) {
- cEnt = &lp->entities[loop];
-
- glLoadIdentity();
- glTranslatef(0.0f, 0.0f, lp->zoom);
- glRotatef(lp->tilt, 1.0f, 0.0f, 0.0f);
- glRotatef(cEnt->angle, 0.0f, 0.0f, 1.0f);
- glTranslatef(cEnt->position[0], cEnt->position[1], cEnt->position[2]);
- glColor4ub((int)(lp->currentR * cEnt->tVal),
- (int)(lp->currentG * cEnt->tVal),
- (int)(lp->currentB * cEnt->tVal), 255);
- draw_block(mi, cEnt);
- entityTick(lp, cEnt);
- }
- tick(lp);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-XSCREENSAVER_MODULE ("BlockTube", blocktube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/blocktube.man b/hacks/glx/blocktube.man
deleted file mode 100644
index 1fbb241..0000000
--- a/hacks/glx/blocktube.man
+++ /dev/null
@@ -1,73 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-blocktube \- draws a swirling, falling tunnel of reflective slabs
-.SH SYNOPSIS
-.B blocktube
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-holdtime \fInumber\fP]
-[\-changetime \fInumber\fP]
-[\-no-texture]
-[\-no-fog]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Blocktube draws a swirling, falling tunnel of reflective slabs. They fade
-from hue to hue.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
-.TP 8
-.B \-holdtime \fInumber\fP
-How long to stay on the same color. Default: 1000 frames.
-.TP 8
-.B \-changetime \fInumber\fP
-How long it takes to fade to a new color. Default: 200 frames.
-.TP 8
-.B \-no-texture
-Draw solid blocks intstead of reflective blocks.
-.TP 8
-.B \-no-fog
-Do not make blocks in the distance be darker.
-.TP 8
-.B \-wireframe
-Only draw outlines.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Lars Damerow. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Lars Damerow <lars@oddment.org>
diff --git a/hacks/glx/boing.c b/hacks/glx/boing.c
deleted file mode 100644
index bf010be..0000000
--- a/hacks/glx/boing.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/* boing, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * A clone of the Amiga 1000 "Boing" demo. This was the first graphics demo
- * for the Amiga, written by Dale Luck and RJ Mical during a break at the 1984
- * Consumer Electronics Show (or so the legend goes.) The boing ball was
- * briefly the official logo of Amiga Inc., until they were bought by
- * Commodore later that year.
- *
- * With no arguments, this program looks a lot like the original Amiga demo.
- * With "-smooth -lighting", it looks... less old.
- *
- * The amiga version made noise when the ball hit the walls. This version
- * does not, obviously.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_boing 0
-
-#include "xlockmore.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPIN "True"
-#define DEF_LIGHTING "False"
-#define DEF_SMOOTH "False"
-#define DEF_SCANLINES "True"
-#define DEF_SPEED "1.0"
-#define DEF_BALL_SIZE "0.5"
-#define DEF_ANGLE "15"
-#define DEF_MERIDIANS "16"
-#define DEF_PARALLELS "8"
-#define DEF_TILES "12"
-#define DEF_THICKNESS "0.05"
-
-#define DEF_BALL_COLOR1 "#CC1919"
-#define DEF_BALL_COLOR2 "#F2F2F2"
-#define DEF_GRID_COLOR "#991999"
-#define DEF_SHADOW_COLOR "#303030"
-#define DEF_BACKGROUND "#8C8C8C"
-
-typedef struct { GLfloat x, y, z; } XYZ;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLfloat speed;
-
- GLuint ball_list;
- double ball_x, ball_y, ball_z, ball_th;
- double ball_dx, ball_dy, ball_dz, ball_dth;
- double ball_ddx, ball_ddy, ball_ddz;
-
- GLfloat ball_color1[4], ball_color2[4], grid_color[4];
- GLfloat bg_color[4], shadow_color[4];
- GLfloat lightpos[4];
-
-} boing_configuration;
-
-static boing_configuration *bps = NULL;
-
-static Bool spin;
-static Bool lighting_p;
-static Bool smooth_p;
-static Bool scanlines_p;
-static GLfloat speed;
-static int angle;
-static GLfloat ball_size;
-static unsigned int meridians;
-static unsigned int parallels;
-static unsigned int tiles;
-static GLfloat thickness;
-static char *ball_color1_str, *ball_color2_str, *grid_color_str,
- *shadow_str, *bg_str;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-lighting", ".lighting", XrmoptionNoArg, "True" },
- { "+lighting", ".lighting", XrmoptionNoArg, "False" },
- { "-smooth", ".smooth", XrmoptionNoArg, "True" },
- { "+smooth", ".smooth", XrmoptionNoArg, "False" },
- { "-scanlines", ".scanlines", XrmoptionNoArg, "True" },
- { "+scanlines", ".scanlines", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-angle", ".angle", XrmoptionSepArg, 0 },
- { "-size", ".ballSize", XrmoptionSepArg, 0 },
- { "-meridians", ".meridians", XrmoptionSepArg, 0 },
- { "-parallels", ".parallels", XrmoptionSepArg, 0 },
- { "-tiles", ".tiles", XrmoptionSepArg, 0 },
- { "-thickness", ".thickness", XrmoptionSepArg, 0 },
- { "-ball-color1",".ballColor1",XrmoptionSepArg, 0 },
- { "-ball-color2",".ballColor2",XrmoptionSepArg, 0 },
- { "-grid-color", ".gridColor", XrmoptionSepArg, 0 },
- { "-shadow-color",".shadowColor",XrmoptionSepArg, 0 },
- { "-background", ".boingBackground",XrmoptionSepArg, 0 },
- { "-bg", ".boingBackground",XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&lighting_p,"lighting", "Lighting", DEF_LIGHTING, t_Bool},
- {&smooth_p, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
- {&scanlines_p,"scanlines","Scanlines", DEF_SCANLINES, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&angle, "angle", "Angle", DEF_ANGLE, t_Int},
- {&ball_size, "ballSize", "BallSize", DEF_BALL_SIZE, t_Float},
- {&meridians, "meridians", "meridians", DEF_MERIDIANS, t_Int},
- {&parallels, "parallels", "parallels", DEF_PARALLELS, t_Int},
- {&tiles, "tiles", "Tiles", DEF_TILES, t_Int},
- {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
- {&ball_color1_str, "ballColor1", "BallColor1", DEF_BALL_COLOR1, t_String},
- {&ball_color2_str, "ballColor2", "BallColor2", DEF_BALL_COLOR2, t_String},
- {&grid_color_str, "gridColor", "GridColor", DEF_GRID_COLOR, t_String},
- {&shadow_str, "shadowColor","ShadowColor",DEF_SHADOW_COLOR,t_String},
- /* dammit, -background is too magic... */
- {&bg_str, "boingBackground", "Background", DEF_BACKGROUND, t_String},
-};
-
-ENTRYPOINT ModeSpecOpt boing_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-static void
-parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
-{
- XColor c;
- a[3] = 1.0; /* alpha */
-
- if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
- {
- fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
- exit (1);
- }
- a[0] = c.red / 65536.0;
- a[1] = c.green / 65536.0;
- a[2] = c.blue / 65536.0;
-}
-
-
-static void
-draw_grid (ModeInfo *mi)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
- int x, y;
- GLfloat t2 = (GLfloat) tiles / 2;
- GLfloat s = 1.0 / (tiles + thickness);
- GLfloat z = 0;
-
- GLfloat lw = MI_HEIGHT(mi) * 0.06 * thickness;
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->grid_color);
- glColor3fv (bp->grid_color);
-
- glPushMatrix();
- glScalef(s, s, s);
- glTranslatef (-t2, -t2, 0);
-
- glLineWidth (lw);
- glBegin (GL_LINES);
- for (y = 0; y <= tiles; y++)
- {
- glVertex3f (0, y, z);
- glVertex3f (tiles, y, z);
- /*mi->polygon_count++;*/
- }
- for (x = 0; x <= tiles; x++)
- {
- glVertex3f (x, tiles, z);
- glVertex3f (x, 0, z);
- /*mi->polygon_count++;*/
- }
-
- glEnd();
- glPopMatrix();
-}
-
-
-static void
-draw_box (ModeInfo *mi)
-{
- /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
- glPushMatrix();
- glTranslatef (0, 0, -0.5);
-/* glFrontFace (GL_CCW);*/
- draw_grid (mi);
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (90, 1, 0, 0);
- glTranslatef (0, 0, 0.5);
-/* glFrontFace (GL_CW);*/
- draw_grid (mi);
- glPopMatrix();
-}
-
-
-static void
-draw_ball (ModeInfo *mi)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int x, y;
- int xx = meridians;
- int yy = parallels;
- int scale = (smooth_p ? 5 : 1);
-
- if (lighting_p && !wire)
- glEnable (GL_LIGHTING);
-
- if (parallels < 3)
- scale *= 2;
-
- xx *= scale;
- yy *= scale;
-
- glFrontFace (GL_CW);
-
- glPushMatrix();
- glTranslatef (bp->ball_x, bp->ball_y, bp->ball_z);
- glScalef (ball_size, ball_size, ball_size);
- glRotatef (-angle, 0, 0, 1);
- glRotatef (bp->ball_th, 0, 1, 0);
-
- for (y = 0; y < yy; y++)
- {
- GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
- GLfloat thy1 = (y+1) * (M_PI * 2) / (yy * 2) + M_PI_2;
-
- for (x = 0; x < xx; x++)
- {
- GLfloat thx0 = x * (M_PI * 2) / xx;
- GLfloat thx1 = (x+1) * (M_PI * 2) / xx;
- XYZ p;
- Bool bgp = ((x/scale) & 1) ^ ((y/scale) & 1);
-
- if (wire && bgp) continue;
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
- (bgp ? bp->ball_color2 : bp->ball_color1));
- glColor3fv (bgp ? bp->ball_color2 : bp->ball_color1);
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
-
- if (!smooth_p)
- {
- p.x = cos((thy0+thy1)/2) * cos((thx0+thx1)/2);
- p.y = sin((thy0+thy1)/2);
- p.z = cos((thy0+thy1)/2) * sin((thx0+thx1)/2);
- glNormal3f (-p.x, -p.y, -p.z);
- }
-
- p.x = cos(thy0) * cos(thx0) / 2;
- p.y = sin(thy0) / 2;
- p.z = cos(thy0) * sin(thx0) / 2;
- if (smooth_p)
- glNormal3f (-p.x, -p.y, -p.z);
- glVertex3f (p.x, p.y, p.z);
-
- p.x = cos(thy1) * cos(thx0) / 2;
- p.y = sin(thy1) / 2;
- p.z = cos(thy1) * sin(thx0) / 2;
- if (smooth_p)
- glNormal3f (-p.x, -p.y, -p.z);
- glVertex3f (p.x, p.y, p.z);
-
- p.x = cos(thy1) * cos(thx1) / 2;
- p.y = sin(thy1) / 2;
- p.z = cos(thy1) * sin(thx1) / 2;
- if (smooth_p)
- glNormal3f (-p.x, -p.y, -p.z);
- glVertex3f (p.x, p.y, p.z);
-
- p.x = cos(thy0) * cos(thx1) / 2;
- p.y = sin(thy0) / 2;
- p.z = cos(thy0) * sin(thx1) / 2;
- if (smooth_p)
- glNormal3f (-p.x, -p.y, -p.z);
- glVertex3f (p.x, p.y, p.z);
-
- glEnd ();
- mi->polygon_count++;
- }
- }
-
- glPopMatrix();
-
- if (lighting_p && !wire)
- glDisable(GL_LIGHTING);
-}
-
-
-static void
-draw_shadow (ModeInfo *mi)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat xoff = 0.14;
- GLfloat yoff = 0.07;
- int y;
- int yy = parallels;
- int scale = (smooth_p ? 5 : 1);
-
- if (lighting_p && !wire)
- glEnable (GL_BLEND);
-
- if (parallels < 3)
- scale *= 2;
-
- yy *= scale;
-
- glPushMatrix();
- glTranslatef (bp->ball_x + xoff, bp->ball_y + yoff, -0.49);
- glScalef (ball_size, ball_size, ball_size);
- glRotatef (-angle, 0, 0, 1);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->shadow_color);
- glColor4fv (bp->shadow_color);
-
- glFrontFace (GL_CCW);
- glNormal3f (0, 0, 1);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
- if (!wire) glVertex3f (0, 0, 0);
-
- for (y = 0; y < yy*2+1; y++)
- {
- GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
- glVertex3f (cos(thy0) / 2, sin(thy0) / 2, 0);
- mi->polygon_count++;
- }
-
- glEnd ();
-
- glPopMatrix();
-
- if (lighting_p && !wire)
- glDisable (GL_BLEND);
-}
-
-
-static void
-draw_scanlines (ModeInfo *mi)
-{
- /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
- int wire = MI_IS_WIREFRAME(mi);
- int w = MI_WIDTH(mi);
- int h = MI_HEIGHT(mi);
-
- if (h <= 300) return;
-
- if (!wire)
- {
- glEnable (GL_BLEND);
- glDisable (GL_DEPTH_TEST);
- }
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- {
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- {
- int lh, ls;
- int y;
- glLoadIdentity();
- glOrtho (0, w, 0, h, -1, 1);
-
- if (h > 500) lh = 4, ls = 4;
- else if (h > 300) lh = 2, ls = 1;
- else lh = 1, ls = 1;
-
- if (lh == 1)
- glDisable (GL_BLEND);
-
- glLineWidth (lh);
- glColor4f (0, 0, 0, 0.3);
-
- glBegin(GL_LINES);
- for (y = 0; y < h; y += lh + ls)
- {
- glVertex3f (0, y, 0);
- glVertex3f (w, y, 0);
- }
- glEnd();
- }
- glPopMatrix();
- }
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
-
- if (!wire)
- {
- glDisable (GL_BLEND);
- glEnable (GL_DEPTH_TEST);
- }
-}
-
-
-
-static void
-tick_physics (ModeInfo *mi)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat s2 = ball_size / 2;
- GLfloat max = 0.5 - s2;
- GLfloat min = -max;
-
- bp->ball_th += bp->ball_dth;
- while (bp->ball_th > 360) bp->ball_th -= 360;
- while (bp->ball_th < 0) bp->ball_th += 360;
-
- bp->ball_dx += bp->ball_ddx;
- bp->ball_x += bp->ball_dx;
- if (bp->ball_x < min) bp->ball_x = min, bp->ball_dx = -bp->ball_dx,
- bp->ball_dth = -bp->ball_dth,
- bp->ball_dx += (frand(bp->speed/2) - bp->speed);
- else if (bp->ball_x > max) bp->ball_x = max, bp->ball_dx = -bp->ball_dx,
- bp->ball_dth = -bp->ball_dth,
- bp->ball_dx += (frand(bp->speed/2) - bp->speed);
-
- bp->ball_dy += bp->ball_ddy;
- bp->ball_y += bp->ball_dy;
- if (bp->ball_y < min) bp->ball_y = min, bp->ball_dy = -bp->ball_dy;
- else if (bp->ball_y > max) bp->ball_y = max, bp->ball_dy = -bp->ball_dy;
-
- bp->ball_dz += bp->ball_ddz;
- bp->ball_z += bp->ball_dz;
- if (bp->ball_z < min) bp->ball_z = min, bp->ball_dz = -bp->ball_dz;
- else if (bp->ball_z > max) bp->ball_z = max, bp->ball_dz = -bp->ball_dz;
-}
-
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_boing (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- h *= 4.0 / 3.0; /* Back in the caveman days we couldn't even afford
- square pixels! */
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 3/4;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- if (height > width)
- {
- GLfloat s = width / (GLfloat) height;
- glScalef (s, s, s);
- }
-
- gluPerspective (8.0, 1/h, 1.0, 10.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt (0.0, 0.0, 8.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-boing_handle_event (ModeInfo *mi, XEvent *event)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_boing (ModeInfo *mi)
-{
- boing_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- if (tiles < 1) tiles = 1;
-
- if (smooth_p)
- {
- if (meridians < 1) meridians = 1;
- if (parallels < 1) parallels = 1;
- }
- else
- {
- if (meridians < 3) meridians = 3;
- if (parallels < 2) parallels = 2;
- }
-
- if (meridians > 1 && meridians & 1) meridians++; /* odd numbers look bad */
-
-
- if (thickness <= 0) thickness = 0.001;
- else if (thickness > 1) thickness = 1;
-
- reshape_boing (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- parse_color (mi, "ballColor1", ball_color1_str, bp->ball_color1);
- parse_color (mi, "ballColor2", ball_color2_str, bp->ball_color2);
- parse_color (mi, "gridColor", grid_color_str, bp->grid_color);
- parse_color (mi, "shadowColor", shadow_str, bp->shadow_color);
- parse_color (mi, "background", bg_str, bp->bg_color);
-
- bp->shadow_color[3] = 0.9;
-
- glClearColor (bp->bg_color[0], bp->bg_color[1], bp->bg_color[2], 1);
-
- if (!wire)
- {
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- }
-
- bp->lightpos[0] = 0.5;
- bp->lightpos[1] = 0.5;
- bp->lightpos[2] = -1;
- bp->lightpos[3] = 0;
-
- if (lighting_p && !wire)
- {
- GLfloat amb[4] = {0, 0, 0, 1};
- GLfloat dif[4] = {1, 1, 1, 1};
- GLfloat spc[4] = {1, 1, 1, 1};
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- bp->speed = speed / 800.0;
-
- bp->ball_dth = (spin ? -bp->speed * 7 * 360 : 0);
-
- bp->ball_x = 0.5 - ((ball_size/2) + frand(1-ball_size));
- bp->ball_y = 0.2;
- bp->ball_dx = bp->speed * 6 + frand(bp->speed);
- bp->ball_ddy = -bp->speed;
-
- bp->ball_dz = bp->speed * 6 + frand(bp->speed);
-
- bp->trackball = gltrackball_init (False);
-}
-
-
-ENTRYPOINT void
-draw_boing (ModeInfo *mi)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- mi->polygon_count = 0;
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_NORMALIZE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (! bp->button_down_p)
- tick_physics (mi);
-
- glPushMatrix ();
-
- {
- double rot = current_device_rotation();
- glRotatef(rot, 0, 0, 1);
-/*
- if ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135))
- {
- GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
- glScalef (1/s, s, 1);
- }
-*/
- }
-
- gltrackball_rotate (bp->trackball);
-
- glLightfv (GL_LIGHT0, GL_POSITION, bp->lightpos);
-
- glDisable (GL_CULL_FACE);
- glDisable (GL_DEPTH_TEST);
-
- glEnable (GL_LINE_SMOOTH);
- glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
-
- draw_box (mi);
- draw_shadow (mi);
-
- glEnable (GL_CULL_FACE);
- glEnable (GL_DEPTH_TEST);
-
- draw_ball (mi);
- if (scanlines_p)
- draw_scanlines (mi);
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_boing (ModeInfo *mi)
-{
- boing_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->trackball) gltrackball_free (bp->trackball);
-}
-
-XSCREENSAVER_MODULE ("Boing", boing)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/boing.man b/hacks/glx/boing.man
deleted file mode 100644
index 510d307..0000000
--- a/hacks/glx/boing.man
+++ /dev/null
@@ -1,105 +0,0 @@
-.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
-.SH NAME
-boing \- draws a bouncing ball like the ancient Amiga demo
-.SH SYNOPSIS
-.B boing
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-smooth]
-[\-lighting]
-[\-scanlines]
-[\-speed]
-[\-no\-spin]
-[\-angle \fIdegrees\fP]
-[\-size \fIratio\fP]
-[\-parallels \fIn\fP]
-[\-meridians \fIn\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIboing\fP program draws a bouncing checkered ball on a grid.
-
-This is a clone of the first graphics demo for the Amiga 1000, which
-was written by Dale Luck and RJ Mical during a break at the 1984
-Consumer Electronics Show (or so the legend goes.) The boing ball was
-briefly the official logo of Amiga Inc., until they were bought by
-Commodore later that year.
-
-With no arguments, this program looks a lot like the original Amiga
-demo. With "-smooth -lighting", it looks... less old.
-.SH OPTIONS
-.I boing
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-The delay between frames of the animation, in microseconds: default 15000.
-.TP 8
-.B \-smooth
-Draw a smooth sphere instead of a faceted polyhedron.
-.TP 8
-.B \-lighting
-Do shaded lighting instead of flat colors.
-.TP 8
-.B \-scanlines
-If the window is large enough, draw horizontal lines to simulate the
-scanlines on a low resolution monitor.
-.TP 8
-.B \-speed \fIratio\fP
-Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
-.TP 8
-.B \-no\-spin
-Don't rotate the ball.
-.TP 8
-.B \-angle \fIdegrees\fP
-The jaunty angle at which the ball sits. Default 15 degrees.
-.TP 8
-.B \-size \fIratio\fP
-How big the ball is; default 0.5 meaning about half the size of the window.
-.TP 8
-.B \-parallels \fIn\fP
-.B \-meridians \fIn\fP
-The pattern of rectangles on the ball. Default 8x16.
-.TP 8
-.B \-wireframe
-Look crummy.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR bsod (MANSUFFIX),
-.BR pong (MANSUFFIX),
-.BR xscreensaver (1),
-.BR X (1)
-.SH COPYRIGHT
-Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 19-Feb-2005.
diff --git a/hacks/glx/bouncingcow.c b/hacks/glx/bouncingcow.c
deleted file mode 100644
index 29baa46..0000000
--- a/hacks/glx/bouncingcow.c
+++ /dev/null
@@ -1,648 +0,0 @@
-/* bouncingcow, Copyright (c) 2003-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Boing, boing, boing. Cow, cow, cow.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 1 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_cow 0
-#define DEF_SPEED "1.0"
-#define DEF_TEXTURE "(none)"
-#define DEF_MATHEMATICAL "False"
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-#include "xlockmore.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include "ximage-loader.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#include "gllist.h"
-
-extern struct gllist
- *cow_face, *cow_hide, *cow_hoofs, *cow_horns, *cow_tail, *cow_udder;
-
-static struct gllist **all_objs[] = {
- &cow_face, &cow_hide, &cow_hoofs, &cow_horns, &cow_tail, &cow_udder
-};
-
-#define FACE 0
-#define HIDE 1
-#define HOOFS 2
-#define HORNS 3
-#define TAIL 4
-#define UDDER 5
-
-typedef struct {
- GLfloat x, y, z;
- GLfloat ix, iy, iz;
- GLfloat dx, dy, dz;
- GLfloat ddx, ddy, ddz;
- rotator *rot;
- Bool spinner_p;
-} floater;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLuint *dlists;
- GLuint texture;
- enum { BOUNCE, INFLATE, DEFLATE } mode;
- GLfloat ratio;
-
- int nfloaters;
- floater *floaters;
-
-} cow_configuration;
-
-static cow_configuration *bps = NULL;
-
-static GLfloat speed;
-static const char *do_texture;
-static Bool mathematical;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- {"-texture", ".texture", XrmoptionSepArg, 0 },
- {"+texture", ".texture", XrmoptionNoArg, "(none)" },
- {"-mathematical", ".mathematical", XrmoptionNoArg, "True" },
- {"+mathematical", ".mathematical", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_String},
- {&mathematical,"mathematical","Mathematical",DEF_MATHEMATICAL,t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt cow_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-#define BOTTOM 28.0
-
-static void
-reset_floater (ModeInfo *mi, floater *f)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
-
- f->y = -BOTTOM;
- f->x = f->ix;
- f->z = f->iz;
-
- /* Yes, I know I'm varying the force of gravity instead of varying the
- launch velocity. That's intentional: empirical studies indicate
- that it's way, way funnier that way. */
-
- f->dy = 5.0;
- f->dx = 0;
- f->dz = 0;
-
- /* -0.18 max -0.3 top -0.4 middle -0.6 bottom */
- f->ddy = speed * (-0.6 + BELLRAND(0.45));
- f->ddx = 0;
- f->ddz = 0;
-
- f->spinner_p = !(random() % (12 * bp->nfloaters));
-
- if (! (random() % (30 * bp->nfloaters)))
- {
- f->dx = BELLRAND(1.8) * RANDSIGN();
- f->dz = BELLRAND(1.8) * RANDSIGN();
- }
-}
-
-
-static void
-tick_floater (ModeInfo *mi, floater *f)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (bp->button_down_p) return;
-
- f->dx += f->ddx;
- f->dy += f->ddy;
- f->dz += f->ddz;
-
- f->x += f->dx * speed;
- f->y += f->dy * speed;
- f->z += f->dz * speed;
-
- if (f->y < -BOTTOM ||
- f->x < -BOTTOM*8 || f->x > BOTTOM*8 ||
- f->z < -BOTTOM*8 || f->z > BOTTOM*8)
- reset_floater (mi, f);
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_cow (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-cow_handle_event (ModeInfo *mi, XEvent *event)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-/* Textures
- */
-
-static void
-load_texture (ModeInfo *mi, const char *filename)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = mi->dpy;
- Visual *visual = mi->xgwa.visual;
- char buf[1024];
- XImage *image;
-
- bp->texture = 0;
- if (MI_IS_WIREFRAME(mi))
- return;
-
- if (!filename ||
- !*filename ||
- !strcasecmp (filename, "(none)"))
- {
- glDisable (GL_TEXTURE_2D);
- return;
- }
-
- image = file_to_ximage (dpy, visual, filename);
- if (!image) return;
-
- clear_gl_error();
- glGenTextures (1, &bp->texture);
- glBindTexture (GL_TEXTURE_2D, bp->texture);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- image->width, image->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, image->data);
- sprintf (buf, "texture: %.100s (%dx%d)",
- filename, image->width, image->height);
- check_gl_error(buf);
-
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei (GL_UNPACK_ROW_LENGTH, image->width);
-}
-
-
-static void
-render_cow (ModeInfo *mi, GLfloat ratio)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int i;
- if (! bp->dlists)
- bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
- for (i = 0; i < countof(all_objs); i++)
- {
- if (bp->dlists[i])
- glDeleteLists (bp->dlists[i], 1);
- bp->dlists[i] = glGenLists (1);
- }
-
- for (i = 0; i < countof(all_objs); i++)
- {
- GLfloat black[4] = {0, 0, 0, 1};
- const struct gllist *gll = *all_objs[i];
-
- glNewList (bp->dlists[i], GL_COMPILE);
-
- glDisable (GL_TEXTURE_2D);
-
- if (i == HIDE)
- {
- GLfloat color[4] = {0.63, 0.43, 0.36, 1.00};
- if (bp->texture)
- {
- /* if we have a texture, make the base color be white. */
- color[0] = color[1] = color[2] = 1.0;
-
- glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glEnable(GL_TEXTURE_2D);
-
- /* approximately line it up with ../images/earth.png */
- glMatrixMode (GL_TEXTURE);
- glLoadIdentity();
- glTranslatef (0.45, 0.58, 0);
- glScalef (0.08, 0.16, 1);
- glRotatef (-5, 0, 0, 1);
- glMatrixMode (GL_MODELVIEW);
- }
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
- }
- else if (i == TAIL)
- {
- GLfloat color[4] = {0.63, 0.43, 0.36, 1.00};
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
- }
- else if (i == UDDER)
- {
- GLfloat color[4] = {1.00, 0.53, 0.53, 1.00};
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
- }
- else if (i == HOOFS || i == HORNS)
- {
- GLfloat color[4] = {0.20, 0.20, 0.20, 1.00};
- GLfloat spec[4] = {0.30, 0.30, 0.30, 1.00};
- GLfloat shiny = 8.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else if (i == FACE)
- {
- GLfloat color[4] = {0.10, 0.10, 0.10, 1.00};
- GLfloat spec[4] = {0.10, 0.10, 0.10, 1.00};
- GLfloat shiny = 8.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else
- {
- GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
- GLfloat spec[4] = {1.00, 1.00, 1.00, 1.00};
- GLfloat shiny = 128.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
-
- if (ratio == 0)
- renderList (gll, wire);
- else
- {
- /* Transition between a physics cow (cow-shaped) and a
- mathematical cow (spherical).
- */
- struct gllist *gll2 = (struct gllist *) malloc (sizeof(*gll2));
- GLfloat *p = (GLfloat *) malloc (gll->points * 6 * sizeof(*p));
- GLfloat scale2 = 0.5 + (0.5 * (1-ratio));
- const GLfloat *pin = (GLfloat *) gll->data;
- GLfloat *pout = p;
- int j;
- GLfloat scale = 10.46;
-
- memcpy (gll2, gll, sizeof(*gll2));
- gll2->next = 0;
- gll2->data = p;
-
- for (j = 0; j < gll2->points; j++)
- {
- const GLfloat *ppi;
- GLfloat *ppo, d;
- int k;
- switch (gll2->format) {
- case GL_N3F_V3F:
-
- /* Verts transition from cow-shaped to the surface of
- the enclosing sphere. */
- ppi = &pin[3];
- ppo = &pout[3];
- d = sqrt (ppi[0]*ppi[0] + ppi[1]*ppi[1] + ppi[2]*ppi[2]);
- for (k = 0; k < 3; k++)
- {
- GLfloat min = ppi[k];
- GLfloat max = ppi[k] / d * scale;
- ppo[k] = (min + ratio * (max - min)) * scale2;
- }
-
- /* Normals are the ratio between original normals and
- the radial coordinates. */
- ppi = &pin[0];
- ppo = &pout[0];
- for (k = 0; k < 3; k++)
- {
- GLfloat min = ppi[k];
- GLfloat max = ppi[k] / d;
- ppo[k] = (min + ratio * (max - min));
- }
-
- pin += 6;
- pout += 6;
- break;
- default: abort(); break; /* write me */
- }
- }
-
- renderList (gll2, wire);
- free (gll2);
- free (p);
- }
-
- glEndList ();
- }
-}
-
-
-ENTRYPOINT void
-init_cow (ModeInfo *mi)
-{
- cow_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_cow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (!wire)
- {
- GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
-/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- bp->trackball = gltrackball_init (False);
-
- load_texture (mi, do_texture);
-
- bp->ratio = 0;
- render_cow (mi, bp->ratio);
-
- bp->mode = BOUNCE;
- bp->nfloaters = MI_COUNT (mi);
- bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
-
- for (i = 0; i < bp->nfloaters; i++)
- {
- floater *f = &bp->floaters[i];
- f->rot = make_rotator (10.0, 0, 0,
- 4, 0.05 * speed,
- True);
- if (bp->nfloaters == 2)
- {
- f->x = (i ? 6 : -6);
- }
- else if (i != 0)
- {
- double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
- double r = 10;
- f->x = r * cos(th);
- f->z = r * sin(th);
- }
-
- f->ix = f->x;
- f->iy = f->y;
- f->iz = f->z;
- reset_floater (mi, f);
- }
-}
-
-
-static void
-draw_floater (ModeInfo *mi, floater *f)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat n;
- double x, y, z;
-
- get_position (f->rot, &x, &y, &z, !bp->button_down_p);
-
- glPushMatrix();
- glTranslatef (f->x, f->y, f->z);
-
- gltrackball_rotate (bp->trackball);
-
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- if (f->spinner_p)
- {
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- n = 1.5;
- if (bp->nfloaters > 99) n *= 0.05;
- else if (bp->nfloaters > 25) n *= 0.18;
- else if (bp->nfloaters > 9) n *= 0.3;
- else if (bp->nfloaters > 1) n *= 0.7;
- glScalef(n, n, n);
-
- glCallList (bp->dlists[FACE]);
- mi->polygon_count += (*all_objs[FACE])->points / 3;
-
- glCallList (bp->dlists[HIDE]);
- mi->polygon_count += (*all_objs[HIDE])->points / 3;
-
- glCallList (bp->dlists[HOOFS]);
- mi->polygon_count += (*all_objs[HOOFS])->points / 3;
-
- glCallList (bp->dlists[HORNS]);
- mi->polygon_count += (*all_objs[HORNS])->points / 3;
-
- glCallList (bp->dlists[TAIL]);
- mi->polygon_count += (*all_objs[TAIL])->points / 3;
-
- glCallList (bp->dlists[UDDER]);
- mi->polygon_count += (*all_objs[UDDER])->points / 3;
-
- glPopMatrix();
-}
-
-
-
-ENTRYPOINT void
-draw_cow (ModeInfo *mi)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glRotatef(current_device_rotation(), 0, 0, 1);
- glScalef (s, s, s);
- }
-
- glScalef (0.5, 0.5, 0.5);
-
- mi->polygon_count = 0;
-
- if (mathematical)
- {
- switch (bp->mode) {
- case BOUNCE:
- if (bp->ratio == 0 && !(random() % 400))
- bp->mode = INFLATE;
- else if (bp->ratio > 0 && !(random() % 2000))
- bp->mode = DEFLATE;
- break;
- case INFLATE:
- bp->ratio += 0.01;
- if (bp->ratio >= 1)
- {
- bp->ratio = 1;
- bp->mode = BOUNCE;
- }
- break;
- case DEFLATE:
- bp->ratio -= 0.01;
- if (bp->ratio <= 0)
- {
- bp->ratio = 0;
- bp->mode = BOUNCE;
- }
- break;
- default:
- abort();
- }
-
- if (bp->ratio > 0)
- render_cow (mi, bp->ratio);
- }
-
-# if 0
- {
- floater F;
- F.x = F.y = F.z = 0;
- F.dx = F.dy = F.dz = 0;
- F.ddx = F.ddy = F.ddz = 0;
- F.rot = make_rotator (0, 0, 0, 1, 0, False);
- glScalef(2,2,2);
- draw_floater (mi, &F);
- }
-# else
- for (i = 0; i < bp->nfloaters; i++)
- {
- /* "Don't kid yourself, Jimmy. If a cow ever got the chance,
- he'd eat you and everyone you care about!"
- -- Troy McClure in "Meat and You: Partners in Freedom"
- */
- floater *f = &bp->floaters[i];
- draw_floater (mi, f);
- tick_floater (mi, f);
- }
-# endif
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_cow (ModeInfo *mi)
-{
- cow_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->floaters) {
- for (i = 0; i < bp->nfloaters; i++)
- free_rotator (bp->floaters[i].rot);
- free (bp->floaters);
- }
- for (i = 0; i < countof(all_objs); i++)
- if (glIsList(bp->dlists[i])) glDeleteLists(bp->dlists[i], 1);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->dlists) free (bp->dlists);
-}
-
-XSCREENSAVER_MODULE_2 ("BouncingCow", bouncingcow, cow)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/bouncingcow.man b/hacks/glx/bouncingcow.man
deleted file mode 100644
index 328e7d1..0000000
--- a/hacks/glx/bouncingcow.man
+++ /dev/null
@@ -1,78 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-bouncingcow \- a happy cow on a trampoline in 3D. Moo.
-.SH SYNOPSIS
-.B bouncingcow
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-count \fInumber\fP]
-[\-mathematical]
-[\-texture \fIfilename\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-It's very silly.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-speed \fInumber\fP
-How fast the cow bounces. Larger for faster. Default: 1.0.
-.TP 8
-.B \-count \fInumber\fP
-How many cows! Default 1.
-.TP 8
-.B \-texture \fIfilename\fP
-An image file to paint on the cow's hide.
-
-Note that on most systems, GL textures must have dimensions that are a
-power of two.
-.TP 8
-.B \-mathematical
-Periodically transition to display mathematically ideal cows (spherical,
-frictionless).
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Moo. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-Moo. No representations are made about the suitability of this
-software for any purpose. It is provided "as is" without express or
-implied warranty. Moo.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>
-
diff --git a/hacks/glx/boxed.c b/hacks/glx/boxed.c
deleted file mode 100644
index ddc4af4..0000000
--- a/hacks/glx/boxed.c
+++ /dev/null
@@ -1,1360 +0,0 @@
-/* boxed --- 3D bouncing balls that explode */
-
-#if 0
-static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore";
-#endif
-
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- *
- * 2001: Written by Sander van Grieken <mailsander@gmx.net>
- * as an OpenGL screensaver for the xscreensaver package.
- * Lots of hardcoded values still in place. Also, there are some
- * copy/paste leftovers from the gears hack. opts don't work.
- *
- * 2005: opts work. added options -balls, -ballsize, -explosion
- *
- * 2006: opts work. added option -decay
- *
- * 2008: opts work. added option -momentum
- *
- */
-
-#include "boxed.h"
-
-/*
-**----------------------------------------------------------------------------
-** Defines
-**----------------------------------------------------------------------------
-*/
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 15000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_boxed 0
-# define boxed_handle_event xlockmore_no_events
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL
-
-# define DEF_SPEED "0.5"
-# define DEF_BALLS "20"
-# define DEF_BALLSIZE "3.0"
-# define DEF_EXPLOSION "15.0"
-# define DEF_DECAY "0.07"
-# define DEF_MOMENTUM "0.6"
-
-#undef rnd
-#define rnd() (frand(1.0))
-
-static GLfloat speed; /* jwz -- overall speed factor applied to all motion */
-static int cfg_balls;
-static GLfloat cfg_ballsize;
-static GLfloat cfg_explosion;
-static GLfloat cfg_decay;
-static GLfloat cfg_momentum;
-
-
-static XrmOptionDescRec opts[] = {
- {"-speed", ".boxed.speed", XrmoptionSepArg, 0},
- {"-balls", ".boxed.balls", XrmoptionSepArg, 0},
- {"-ballsize", ".boxed.ballsize", XrmoptionSepArg, 0},
- {"-explosion", ".boxed.explosion", XrmoptionSepArg, 0},
- {"-decay", ".boxed.decay", XrmoptionSepArg, 0},
- {"-momentum", ".boxed.momentum", XrmoptionSepArg, 0},
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&cfg_balls, "balls", "Balls", DEF_BALLS, t_Int},
- {&cfg_ballsize, "ballsize", "Ball Size", DEF_BALLSIZE, t_Float},
- {&cfg_explosion, "explosion", "Explosion", DEF_EXPLOSION, t_Float},
- {&cfg_decay, "decay", "Explosion Decay", DEF_DECAY, t_Float},
- {&cfg_momentum, "momentum", "Explosion Momentum", DEF_MOMENTUM, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-
-ModStruct boxed_description = {
- "boxed", "init_boxed", "draw_boxed", NULL,
- "draw_boxed", "init_boxed", "free_boxed", &boxed_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Shows GL's boxed balls", 0, NULL};
-
-#endif
-
-#define BOOL int
-#define TRUE 1
-#define FALSE 0
-
-/* camera */
-#define CAM_HEIGHT 80.0f
-#define CAMDISTANCE_MIN 35.0
-#define CAMDISTANCE_MAX 150.0
-#define CAMDISTANCE_SPEED 1.5
-#define LOOKAT_R 30.0
-
-/* rendering the sphere */
-#define MESH_SIZE 10
-#define SPHERE_VERTICES (2+MESH_SIZE*MESH_SIZE*2)
-#define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3)
-
-/*
-**-----------------------------------------------------------------------------
-** Typedefs
-**-----------------------------------------------------------------------------
-*/
-
-typedef struct {
- GLfloat x;
- GLfloat y;
- GLfloat z;
-} vectorf;
-
-typedef struct {
- vectorf loc;
- vectorf dir;
- vectorf color;
- float radius;
- BOOL bounced;
- int offside;
- BOOL justcreated;
-} ball;
-
-typedef struct {
- int num_balls;
- float ballsize;
- float explosion;
- ball *balls;
-} ballman;
-
-typedef struct {
- vectorf loc;
- vectorf dir;
- BOOL far;
- int gone;
-} tri;
-
-typedef struct {
- int num_tri;
- int lifetime;
- float scalefac;
- float explosion;
- float decay;
- float momentum;
- vectorf color;
- tri *tris;
- GLint *indices;
- vectorf *normals;
- vectorf *vertices;
-} triman;
-
-typedef struct {
- int numballs;
- float ballsize;
- float explosion;
- float decay;
- float momentum;
- BOOL textures;
- BOOL transparent;
- float camspeed;
-} boxed_config;
-
-
-typedef struct {
- float cam_x_speed, cam_z_speed, cam_y_speed;
- boxed_config config;
- float tic;
- float camtic;
- vectorf spherev[SPHERE_VERTICES];
- GLint spherei[SPHERE_INDICES];
- ballman bman;
- triman *tman;
- GLXContext *glx_context;
- GLuint listobjects;
- GLuint gllists[3];
- int list_polys[3];
- Window window;
- BOOL stop;
- char *tex1;
-} boxedstruct;
-
-#define GLL_PATTERN 0
-#define GLL_BALL 1
-#define GLL_BOX 2
-
-/*
-**----------------------------------------------------------------------------
-** Local Variables
-**----------------------------------------------------------------------------
-*/
-
-static boxedstruct *boxed = NULL;
-
-
-/*
-**----------------------------------------------------------------------------
-** Functions
-**----------------------------------------------------------------------------
-*/
-
-/*
- * Add 2 vectors
- */
-static inline void addvectors(vectorf *dest, vectorf *s1, vectorf *s2)
-{
- dest->x = s1->x + s2->x;
- dest->y = s1->y + s2->y;
- dest->z = s1->z + s2->z;
-}
-
-/*
- * Sub 2 vectors
- */
-static inline void subvectors(vectorf *dest, vectorf* s1, vectorf *s2)
-{
- dest->x = s1->x - s2->x;
- dest->y = s1->y - s2->y;
- dest->z = s1->z - s2->z;
-}
-
-/*
- * Multiply vector with scalar (scale vector)
- */
-static inline void scalevector(vectorf *dest, vectorf *source, GLfloat sc)
-{
- dest->x = source->x * sc;
- dest->y = source->y * sc;
- dest->z = source->z * sc;
-}
-
-/*
- * Copy vector
- */
-static inline void copyvector(vectorf *dest, vectorf* source)
-{
- dest->x = source->x;
- dest->y = source->y;
- dest->z = source->z;
-}
-
-
-static inline GLfloat
-dotproduct(vectorf * v1, vectorf * v2)
-{
- return v1->x * v2->x + v1->y * v2->y + v1->z * v2->z;
-}
-
-static inline GLfloat
-squaremagnitude(vectorf * v)
-{
- return v->x * v->x + v->y * v->y + v->z * v->z;
-}
-
-static inline GLfloat
-squaremagnitudehorz(vectorf * v)
-{
- return v->x * v->x + v->z * v->z;
-}
-
-
-
-/*
- * Generate the Sphere data
- *
- * Input:
- */
-
-static void generatesphere(boxedstruct *gp)
-{
- float dj = M_PI/(MESH_SIZE+1.0f);
- float di = M_PI/MESH_SIZE;
- int v; /* vertex offset */
- int ind; /* indices offset */
- int i,j,si;
- GLfloat r_y_plane, h_y_plane;
- vectorf *spherev;
- GLint *spherei;
-
- /*
- * generate the sphere data
- * vertices 0 and 1 are the north and south poles
- */
-
- spherei = gp->spherei;
- spherev = gp->spherev;
-
- spherev[0].x = 0.0f; spherev[0].y =1.0f; spherev[0].z = 0.0f;
- spherev[1].x = 0.0f; spherev[1].y =-1.0f; spherev[1].z = 0.0f;
-
- for (j=0; j<MESH_SIZE; j++) {
- r_y_plane = (float)sin((j+1) * dj);
- h_y_plane = (float)cos((j+1) * dj);
- for (i=0; i<MESH_SIZE*2; i++) {
- si = 2+i+j*MESH_SIZE*2;
- spherev[si].y = h_y_plane;
- spherev[si].x = (float) sin(i * di) * r_y_plane;
- spherev[si].z = (float) cos(i * di) * r_y_plane;
- }
- }
-
- /* generate indices */
- for (i=0; i<MESH_SIZE*2; i++) {
- spherei[3*i] = 0;
- spherei[3*i+1] = i+2;
- spherei[3*i+2] = i+3;
- if (i==MESH_SIZE*2-1)
- spherei[3*i+2] = 2;
- }
-
- /* the middle strips */
- for (j=0; j<MESH_SIZE-1; j++) {
- v = 2+j*MESH_SIZE*2;
- ind = 3*MESH_SIZE*2 + j*6*MESH_SIZE*2;
- for (i=0; i<MESH_SIZE*2; i++) {
- spherei[6*i+ind] = v+i;
- spherei[6*i+2+ind] = v+i+1;
- spherei[6*i+1+ind] = v+i+MESH_SIZE*2;
-
- spherei[6*i+ind+3] = v+i+MESH_SIZE*2;
- spherei[6*i+2+ind+3] = v+i+1;
- spherei[6*i+1+ind+3] = v+i+MESH_SIZE*2+1;
- if (i==MESH_SIZE*2-1) {
- spherei[6*i+2+ind] = v+i+1-2*MESH_SIZE;
- spherei[6*i+2+ind+3] = v+i+1-2*MESH_SIZE;
- spherei[6*i+1+ind+3] = v+i+MESH_SIZE*2+1-2*MESH_SIZE;
- }
- }
- }
-
- v = SPHERE_VERTICES-MESH_SIZE*2;
- ind = SPHERE_INDICES-3*MESH_SIZE*2;
- for (i=0; i<MESH_SIZE*2; i++) {
- spherei[3*i+ind] = 1;
- spherei[3*i+1+ind] = v+i+1;
- spherei[3*i+2+ind] = v+i;
- if (i==MESH_SIZE*2-1)
- spherei[3*i+1+ind] = v;
- }
-}
-
-
-
-
-/*
- * create fresh ball
- */
-
-static void createball(ball *newball)
-{
- float r=0.0f,g=0.0f,b=0.0f;
- newball->loc.x = 5-10*rnd();
- newball->loc.y = 35+20*rnd();
- newball->loc.z = 5-10*rnd();
- newball->dir.x = (0.5f-rnd()) * speed;
- newball->dir.y = 0.0;
- newball->dir.z = (0.5-rnd()) * speed;
- newball->offside = 0;
- newball->bounced = FALSE;
- newball->radius = cfg_ballsize;
- while (r+g+b < 1.8f ) {
- newball->color.x = r=rnd();
- newball->color.y = g=rnd();
- newball->color.z = b=rnd();
- }
- newball->justcreated = TRUE;
-}
-
-/* Update position of each ball */
-
-static void updateballs(ballman *bman)
-{
- register int b,j;
- vectorf dvect,richting,relspeed,influence;
- GLfloat squaredist;
-
- for (b=0;b<bman->num_balls;b++) {
-
- GLfloat gravity = 0.30f * speed;
-
- /* apply gravity */
- bman->balls[b].dir.y -= gravity;
- /* apply movement */
- addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
- /* boundary check */
- if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */
- if ((bman->balls[b].loc.x < -95.0) ||
- (bman->balls[b].loc.x > 95.0) ||
- (bman->balls[b].loc.z < -95.0) ||
- (bman->balls[b].loc.z > 95.0)) {
- if (bman->balls[b].loc.y < -2000.0)
- createball(&bman->balls[b]);
- } else {
- bman->balls[b].loc.y = bman->balls[b].radius + (bman->balls[b].radius - bman->balls[b].loc.y);
- bman->balls[b].dir.y = -bman->balls[b].dir.y;
- if (bman->balls[b].offside) {
- bman->balls[b].bounced = TRUE; /* temporary disable painting ball */
- scalevector(&bman->balls[b].dir,&bman->balls[b].dir,0.80f);
- if (squaremagnitude(&bman->balls[b].dir) < 0.08f) {
- createball(&bman->balls[b]);
- }
- if (squaremagnitudehorz(&bman->balls[b].dir) < 0.005f) {
- createball(&bman->balls[b]);
- }
- }
- }
-
- }
- if (!bman->balls[b].offside) {
- if (bman->balls[b].loc.x - bman->balls[b].radius < -20.0f) { /* x ondergrens */
- if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
- else {
- bman->balls[b].dir.x = -bman->balls[b].dir.x;
- bman->balls[b].loc.x = -20.0f + bman->balls[b].radius;
- }
- }
- if (bman->balls[b].loc.x + bman->balls[b].radius > 20.0f) { /* x bovengrens */
- if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
- else {
- bman->balls[b].dir.x = -bman->balls[b].dir.x;
- bman->balls[b].loc.x = 20.0f - bman->balls[b].radius;
- }
- }
- if (bman->balls[b].loc.z - bman->balls[b].radius < -20.0f) { /* z ondergrens */
- if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
- else {
- bman->balls[b].dir.z = -bman->balls[b].dir.z;
- bman->balls[b].loc.z = -20.0f + bman->balls[b].radius;
- }
- }
- if (bman->balls[b].loc.z + bman->balls[b].radius > 20.0f) { /* z bovengrens */
- if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
- else {
- bman->balls[b].dir.z = -bman->balls[b].dir.z;
- bman->balls[b].loc.z = 20.0f - bman->balls[b].radius;
- }
- }
- } /* end if !offside */
-
- /* check voor stuiteren */
- for (j=b+1;j<bman->num_balls;j++) {
- squaredist = (bman->balls[b].radius * bman->balls[b].radius) + (bman->balls[j].radius * bman->balls[j].radius);
- subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
- if ( squaremagnitude(&dvect) < squaredist ) { /* balls b and j touch */
- subvectors(&richting,&bman->balls[j].loc,&bman->balls[b].loc);
- subvectors(&relspeed,&bman->balls[b].dir,&bman->balls[j].dir);
- /* calc mutual influence direction and magnitude */
- scalevector(&influence,&richting,(dotproduct(&richting,&relspeed)/squaremagnitude(&richting)));
-
- subvectors(&bman->balls[b].dir,&bman->balls[b].dir,&influence);
- addvectors(&bman->balls[j].dir,&bman->balls[j].dir,&influence);
- addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
- addvectors(&bman->balls[j].loc,&bman->balls[j].loc,&bman->balls[j].dir);
-
- subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
- while (squaremagnitude(&dvect) < squaredist) {
- addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
- addvectors(&bman->balls[j].loc,&bman->balls[j].loc,&bman->balls[j].dir);
- subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
- }
- }
- } /* end for j */
- } /* end for b */
-}
-
-
-/*
-* explode ball into triangles
-*/
-
-static void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_num, ball *b)
-{
- int pos;
- float explosion;
- float momentum;
- float scale;
- register int i;
- vectorf avgdir,dvect,mvect;
-
- tman->scalefac = b->radius;
- copyvector(&tman->color,&b->color);
- explosion = 1.0f + tman->explosion * 2.0 * rnd();
- momentum = tman->momentum;
-
- tman->num_tri = ind_num/3;
-
- /* reserveer geheugen voor de poly's in een bal */
-
- tman->tris = (tri *)malloc(tman->num_tri * sizeof(tri));
- tman->vertices = (vectorf *)malloc(ind_num * sizeof(vectorf));
- tman->normals = (vectorf *)malloc(ind_num/3 * sizeof(vectorf));
-
- for (i=0; i<(tman->num_tri); i++) {
- tman->tris[i].far = FALSE;
- tman->tris[i].gone = 0;
- pos = i * 3;
- /* kopieer elke poly apart naar een tri structure */
- copyvector(&tman->vertices[pos+0],&spherev[spherei[pos+0]]);
- copyvector(&tman->vertices[pos+1],&spherev[spherei[pos+1]]);
- copyvector(&tman->vertices[pos+2],&spherev[spherei[pos+2]]);
- /* Calculate average direction of shrapnel */
- addvectors(&avgdir,&tman->vertices[pos+0],&tman->vertices[pos+1]);
- addvectors(&avgdir,&avgdir,&tman->vertices[pos+2]);
- scalevector(&avgdir,&avgdir,0.33333);
-
- /* should normalize first, NYI */
- copyvector(&tman->normals[i],&avgdir);
-
- /* copy de lokatie */
- addvectors(&tman->tris[i].loc,&b->loc,&avgdir);
- /* en translate alle triangles terug naar hun eigen oorsprong */
- tman->vertices[pos+0].x -= avgdir.x;
- tman->vertices[pos+0].y -= avgdir.y;
- tman->vertices[pos+0].z -= avgdir.z;
- tman->vertices[pos+1].x -= avgdir.x;
- tman->vertices[pos+1].y -= avgdir.y;
- tman->vertices[pos+1].z -= avgdir.z;
- tman->vertices[pos+2].x -= avgdir.x;
- tman->vertices[pos+2].y -= avgdir.y;
- tman->vertices[pos+2].z -= avgdir.z;
- /* alwaar opschaling plaatsvindt */
- scale = b->radius * 2;
- scalevector(&tman->vertices[pos+0],&tman->vertices[pos+0],scale);
- scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
- scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
-
- tman->vertices[pos+0].x += avgdir.x;
- tman->vertices[pos+0].y += avgdir.y;
- tman->vertices[pos+0].z += avgdir.z;
- tman->vertices[pos+1].x += avgdir.x;
- tman->vertices[pos+1].y += avgdir.y;
- tman->vertices[pos+1].z += avgdir.z;
- tman->vertices[pos+2].x += avgdir.x;
- tman->vertices[pos+2].y += avgdir.y;
- tman->vertices[pos+2].z += avgdir.z;
-
- /* bereken nieuwe richting */
- scalevector(&tman->tris[i].dir,&avgdir,explosion);
- dvect.x = (0.1f - 0.2f*rnd());
- dvect.y = (0.15f - 0.3f*rnd());
- dvect.z = (0.1f - 0.2f*rnd());
- addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&dvect);
-
- /* add ball's momentum to each piece of the exploded ball */
- mvect.x = b->dir.x * momentum;
- mvect.y = 0;
- mvect.z = b->dir.z * momentum;
- addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&mvect);
- }
-}
-
-
-/*
-* update position of each tri
-*/
-
-static void updatetris(triman *t)
-{
- int b;
- GLfloat xd,zd;
-
- for (b=0;b<t->num_tri;b++) {
- /* the exploded triangles disappear over time */
- if (rnd() < t->decay) {
- if (t->tris[b].gone == 0)
- t->tris[b].gone = 1;
- }
- /* apply gravity */
- t->tris[b].dir.y -= (0.1f * speed);
- /* apply movement */
- addvectors(&t->tris[b].loc,&t->tris[b].loc,&t->tris[b].dir);
- /* boundary check */
- if (t->tris[b].far) continue;
- if (t->tris[b].loc.y < 0) { /* onder bodem ? */
- if ((t->tris[b].loc.x > -95.0f) &
- (t->tris[b].loc.x < 95.0f) &
- (t->tris[b].loc.z > -95.0f) &
- (t->tris[b].loc.z < 95.0f)) { /* in veld */
- t->tris[b].dir.y = -(t->tris[b].dir.y);
- t->tris[b].loc.y = -t->tris[b].loc.y;
- scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */
- }
- else {
- t->tris[b].far = TRUE;
- continue;
- }
- }
-
- if ((t->tris[b].loc.x > -21.0f) &
- (t->tris[b].loc.x < 21.0f) &
- (t->tris[b].loc.z > -21.0f) &
- (t->tris[b].loc.z < 21.0f)) { /* in box? */
-
- xd = zd = 999.0f; /* big */
- if ((t->tris[b].loc.x > -21.0f) &
- (t->tris[b].loc.x < 0)) {
- xd = t->tris[b].loc.x + 21.0f;
- }
- if ((t->tris[b].loc.x < 21.0f) &
- (t->tris[b].loc.x > 0)) {
- xd = 21.0f - t->tris[b].loc.x;
- }
- if ((t->tris[b].loc.z > -21.0f) &
- (t->tris[b].loc.z < 0)) {
- zd = t->tris[b].loc.z + 21.0f;
- }
- if ((t->tris[b].loc.z < 21.0f) &
- (t->tris[b].loc.z > 0)) {
- zd = 21.0f - t->tris[b].loc.z;
- }
- if (xd < zd) {
- /* bounce x */
- if (t->tris[b].dir.x < 0)
- t->tris[b].loc.x += (21.0f - t->tris[b].loc.x);
- else
- t->tris[b].loc.x += (-21.0f - t->tris[b].loc.x);
- t->tris[b].dir.x = -t->tris[b].dir.x;
- } else {
- /* bounce z */
- if (t->tris[b].dir.z < 0)
- t->tris[b].loc.z += (21.0f - t->tris[b].loc.z);
- else
- t->tris[b].loc.z += (-21.0f - t->tris[b].loc.z);
- t->tris[b].dir.z = -t->tris[b].dir.z;
- }
-
- }
- } /* end for b */
-}
-
-
-/*
- * free memory allocated by a tri manager
- */
-static void freetris(triman *t)
-{
- if (!t) return;
- if (t->tris) free(t->tris);
- if (t->vertices) free(t->vertices);
- if (t->normals) free(t->normals);
- t->tris = NULL;
- t->vertices = NULL;
- t->normals = NULL;
- t->num_tri = 0;
- t->lifetime = 0;
-}
-
-
-/*
- *load defaults in config structure
- */
-static void setdefaultconfig(boxed_config *config)
-{
- cfg_balls = MAX(3,MIN(40,cfg_balls));
- cfg_ballsize = MAX(1.0f,MIN(5.0f,cfg_ballsize));
- cfg_explosion = MAX(0.0f,MIN(50.0f,cfg_explosion));
- cfg_decay = MAX(0.02f,MIN(0.90f,cfg_decay));
- cfg_momentum = MAX(0.0f,MIN(1.0f,cfg_momentum));
-
- config->numballs = cfg_balls;
- config->textures = TRUE;
- config->transparent = FALSE;
- config->explosion = cfg_explosion;
- config->decay = cfg_decay;
- config->momentum = cfg_momentum;
- config->ballsize = cfg_ballsize;
- config->camspeed = 35.0f;
-}
-
-
-/*
- * draw bottom
- */
-static int drawfilledbox(boxedstruct *boxed, int wire)
-{
- /* draws texture filled box,
- top is drawn using the entire texture,
- the sides are drawn using the edge of the texture
- */
- int polys = 0;
-
- /* front */
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f(0,1);
- glVertex3f(-1.0,1.0,1.0);
- glTexCoord2f(1,1);
- glVertex3f(1.0,1.0,1.0);
- glTexCoord2f(1,1);
- glVertex3f(1.0,-1.0,1.0);
- glTexCoord2f(0,1);
- glVertex3f(-1.0,-1.0,1.0);
- polys++;
- /* rear */
- glTexCoord2f(0,1);
- glVertex3f(1.0,1.0,-1.0);
- glTexCoord2f(1,1);
- glVertex3f(-1.0,1.0,-1.0);
- glTexCoord2f(1,1);
- glVertex3f(-1.0,-1.0,-1.0);
- glTexCoord2f(0,1);
- glVertex3f(1.0,-1.0,-1.0);
- polys++;
- /* left */
- glTexCoord2f(1,1);
- glVertex3f(-1.0,1.0,1.0);
- glTexCoord2f(1,1);
- glVertex3f(-1.0,-1.0,1.0);
- glTexCoord2f(0,1);
- glVertex3f(-1.0,-1.0,-1.0);
- glTexCoord2f(0,1);
- glVertex3f(-1.0,1.0,-1.0);
- polys++;
- /* right */
- glTexCoord2f(0,1);
- glVertex3f(1.0,1.0,1.0);
- glTexCoord2f(1,1);
- glVertex3f(1.0,1.0,-1.0);
- glTexCoord2f(1,1);
- glVertex3f(1.0,-1.0,-1.0);
- glTexCoord2f(0,1);
- glVertex3f(1.0,-1.0,1.0);
- polys++;
- /* top */
- glTexCoord2f(0.0,0.0);
- glVertex3f(-1.0,1.0,1.0);
- glTexCoord2f(0.0,1.0);
- glVertex3f(-1.0,1.0,-1.0);
- glTexCoord2f(1.0,1.0);
- glVertex3f(1.0,1.0,-1.0);
- glTexCoord2f(1.0,0.0);
- glVertex3f(1.0,1.0,1.0);
- polys++;
- /* bottom */
- glTexCoord2f(0,0);
- glVertex3f(-1.0,-1.0,1.0);
- glTexCoord2f(0,1);
- glVertex3f(-1.0,-1.0,-1.0);
- glTexCoord2f(1,1);
- glVertex3f(1.0,-1.0,-1.0);
- glTexCoord2f(1,0);
- glVertex3f(1.0,-1.0,1.0);
- polys++;
- glEnd();
-
- return polys;
-}
-
-
-/*
- * Draw a box made of lines
- */
-static int drawbox(boxedstruct *boxed)
-{
- int polys = 0;
- /* top */
- glBegin(GL_LINE_STRIP);
- glVertex3f(-1.0,1.0,1.0);
- glVertex3f(-1.0,1.0,-1.0); polys++;
- glVertex3f(1.0,1.0,-1.0); polys++;
- glVertex3f(1.0,1.0,1.0); polys++;
- glVertex3f(-1.0,1.0,1.0); polys++;
- glEnd();
- /* bottom */
- glBegin(GL_LINE_STRIP);
- glVertex3f(-1.0,-1.0,1.0);
- glVertex3f(1.0,-1.0,1.0); polys++;
- glVertex3f(1.0,-1.0,-1.0); polys++;
- glVertex3f(-1.0,-1.0,-1.0); polys++;
- glVertex3f(-1.0,-1.0,1.0); polys++;
- glEnd();
- /* connect top & bottom */
- glBegin(GL_LINES);
- glVertex3f(-1.0,1.0,1.0);
- glVertex3f(-1.0,-1.0,1.0); polys++;
- glVertex3f(1.0,1.0,1.0);
- glVertex3f(1.0,-1.0,1.0); polys++;
- glVertex3f(1.0,1.0,-1.0);
- glVertex3f(1.0,-1.0,-1.0); polys++;
- glVertex3f(-1.0,1.0,-1.0);
- glVertex3f(-1.0,-1.0,-1.0); polys++;
- glEnd();
- return polys;
-}
-
-
-
-/*
- * Draw ball
- */
-static int drawball(boxedstruct *gp, ball *b, int wire)
-{
- int polys = 0;
- int i,pos,cnt;
- GLint *spherei = gp->spherei;
- vectorf *spherev = gp->spherev;
- GLfloat col[3];
-
- glPushMatrix();
-
- glTranslatef(b->loc.x,b->loc.y,b->loc.z);
- glScalef(b->radius,b->radius,b->radius);
- glColor3f(b->color.x,b->color.y,b->color.z);
- col[0] = b->color.x;
- col[1] = b->color.y;
- col[2] = b->color.z;
- glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
- col[0] *= 0.5;
- col[1] *= 0.5;
- col[2] *= 0.5;
- glMaterialfv(GL_FRONT, GL_EMISSION,col);
-
- if (!gp->gllists[GLL_BALL]) {
- glNewList(gp->listobjects + GLL_BALL,GL_COMPILE);
- glBegin(wire ? GL_LINES : GL_TRIANGLES);
- cnt = SPHERE_INDICES/3;
- for (i=0; i<cnt; i++) {
- pos = i * 3;
- glNormal3f(spherev[spherei[pos+0]].x,spherev[spherei[pos+0]].y,spherev[spherei[pos+0]].z);
- glVertex3f(spherev[spherei[pos+0]].x,spherev[spherei[pos+0]].y,spherev[spherei[pos+0]].z);
- glNormal3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
- gp->list_polys[GLL_BALL]++;
- glVertex3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
- if (wire)
- glVertex3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
- glNormal3f(spherev[spherei[pos+2]].x,spherev[spherei[pos+2]].y,spherev[spherei[pos+2]].z);
- glVertex3f(spherev[spherei[pos+2]].x,spherev[spherei[pos+2]].y,spherev[spherei[pos+2]].z);
- gp->list_polys[GLL_BALL]++;
- }
- glEnd();
- glEndList();
- gp->gllists[GLL_BALL] = 1;
- } else {
- glCallList(gp->listobjects + GLL_BALL);
- polys += gp->list_polys[GLL_BALL];
- }
-
- glPopMatrix();
- return polys;
-}
-
-
-/*
- * Draw a single triangle
- */
-static void drawtri(triman *t, int wire, int i)
-{
- const vectorf *spherev = t->vertices + i*3;
- const vectorf *loc = &t->tris[i].loc;
-
- glNormal3f(t->normals[i].x,t->normals[i].y,t->normals[i].z);
- glVertex3f(spherev[0].x+loc->x,spherev[0].y+loc->y,spherev[0].z+loc->z);
- glVertex3f(spherev[1].x+loc->x,spherev[1].y+loc->y,spherev[1].z+loc->z);
- if (wire)
- glVertex3f(spherev[1].x+loc->x,spherev[1].y+loc->y,spherev[1].z+loc->z);
- glVertex3f(spherev[2].x+loc->x,spherev[2].y+loc->y,spherev[2].z+loc->z);
- if (wire) {
- glVertex3f(spherev[2].x+loc->x,spherev[2].y+loc->y,spherev[2].z+loc->z);
- glVertex3f(spherev[0].x+loc->x,spherev[0].y+loc->y,spherev[0].z+loc->z);
- }
-}
-
-
-/*
- * Draw all triangles in triman
- */
-static int drawtriman(triman *t, int wire)
-{
- int polys = 0;
- int i;
- GLfloat col[3];
-
- glPushMatrix();
- glColor3f(t->color.x,t->color.y,t->color.z);
- col[0] = t->color.x;
- col[1] = t->color.y;
- col[2] = t->color.z;
- glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
- col[0] *= 0.3;
- col[1] *= 0.3;
- col[2] *= 0.3;
- glMaterialfv(GL_FRONT, GL_EMISSION,col);
- glBegin(wire ? GL_LINES : GL_TRIANGLES);
-
- for (i=0; i<t->num_tri; i++) {
- if (t->tris[i].gone > 3) { continue; }
- if (t->tris[i].gone > 0) {
- glColor3f(t->color.x,t->color.y,t->color.z);
- col[0] = 1.0f;
- col[1] = 1.0f;
- col[2] = 1.0f;
- glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
- col[0] *= 0.8;
- col[1] *= 0.8;
- col[2] *= 0.8;
- glMaterialfv(GL_FRONT, GL_EMISSION,col);
-
- drawtri(t, wire, i);
- polys++;
-
- glColor3f(t->color.x,t->color.y,t->color.z);
- col[0] = t->color.x;
- col[1] = t->color.y;
- col[2] = t->color.z;
- glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
- col[0] *= 0.3;
- col[1] *= 0.3;
- col[2] *= 0.3;
- glMaterialfv(GL_FRONT, GL_EMISSION,col);
-
- t->tris[i].gone++;
- continue;
- }
-
- drawtri(t, wire, i);
- polys++;
- }
- glEnd();
- glPopMatrix();
- return polys;
-}
-
-/*
- * draw floor pattern
- */
-static int drawpattern(boxedstruct *gp)
-{
- int polys = 0;
- if (!gp->gllists[GLL_PATTERN]) {
- glNewList(gp->listobjects + GLL_PATTERN, GL_COMPILE);
-
- glBegin(GL_LINE_STRIP);
- glVertex3f(-25.0f, 0.0f, 35.0f);
- glVertex3f(-15.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-5.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(5.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(15.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(25.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(35.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(35.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(25.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(25.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(35.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(35.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(25.0f, 0.0f, -35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(15.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(5.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-5.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-15.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-25.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-35.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-35.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-25.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-25.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-35.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-35.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-25.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
- glEnd();
-
- glBegin(GL_LINE_STRIP);
- glVertex3f(-5.0f, 0.0f, 15.0f);
- glVertex3f(5.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(15.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(15.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(5.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-5.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-15.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-15.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
- glVertex3f(-5.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
- glEnd();
-
- glEndList();
- gp->gllists[GLL_PATTERN] = 1;
- } else {
- glCallList(gp->listobjects + GLL_PATTERN);
- polys += gp->list_polys[GLL_PATTERN];
- }
-
- return polys;
-}
-
-
-/*
- * main rendering loop
- */
-static void draw(ModeInfo * mi)
-{
- boxedstruct *gp = &boxed[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME (mi);
- vectorf v1,v2;
- GLfloat r;
- int dx, dz;
- int i;
-
- GLfloat dgray[4] = {0.3f, 0.3f, 0.3f, 1.0f};
- GLfloat black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
- GLfloat lblue[4] = {0.4f,0.6f,1.0f };
-
- GLfloat l0_ambient[] = {0.0, 0.0, 0.0, 1.0};
- GLfloat l0_specular[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat l0_diffuse[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat l0_position[] = {0.0, 0.0, 0.0, 1.0}; /* w != 0 -> positional light */
- GLfloat l1_ambient[] = {0.0, 0.0, 0.0, 1.0};
- GLfloat l1_specular[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat l1_diffuse[] = {0.5, 0.5, 0.5, 1.0};
- GLfloat l1_position[] = {0.0, 1.0, 0.0, 0.0}; /* w = 0 -> directional light */
-
- mi->polygon_count = 0;
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glRotatef(current_device_rotation(), 0, 0, 1);
- glScalef (s, s, s);
- }
-
- gp->tic += 0.01f;
- gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed);
-
- /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */
- r = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->camtic/CAMDISTANCE_SPEED) * speed);
- v1.x = r * sin((gp->camtic/gp->cam_x_speed) * speed);
- v1.z = r * cos((gp->camtic/gp->cam_x_speed) * speed);
- v1.y = CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
-
- v2.x = LOOKAT_R * sin((gp->camtic/(gp->cam_x_speed * 5.0f)) * speed);
- v2.z = LOOKAT_R * cos((gp->camtic/(gp->cam_x_speed * 5.0f)) * speed);
- v2.y = (CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT)/10.0;
-
- gluLookAt(v1.x,v1.y,v1.z,v2.x,v2.y,v2.x,0.0,1.0,0.0);
-
- if (!wire) {
- glLightfv(GL_LIGHT0, GL_AMBIENT, l0_ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, l0_diffuse);
- glLightfv(GL_LIGHT0, GL_SPECULAR, l0_specular);
- glLightfv(GL_LIGHT0, GL_POSITION, l0_position);
- glLightfv(GL_LIGHT1, GL_AMBIENT, l1_ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, l1_diffuse);
- glLightfv(GL_LIGHT1, GL_SPECULAR, l1_specular);
- glLightfv(GL_LIGHT1, GL_POSITION, l1_position);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
-
- glFrontFace(GL_CW);
-
- glMaterialfv(GL_FRONT, GL_SPECULAR, black);
- glMaterialfv(GL_FRONT, GL_EMISSION, lblue);
- glMaterialfv(GL_FRONT,GL_AMBIENT,black);
- glMaterialf(GL_FRONT, GL_SHININESS, 5.0);
- }
-
-
- /* draw ground grid */
- /* glDisable(GL_DEPTH_TEST); */
- glDisable(GL_LIGHTING);
-
- glColor3f(0.1,0.1,0.6);
- for (dx= -2; dx<3; dx++) {
- for (dz= -2; dz<3; dz++) {
- glPushMatrix();
- glTranslatef(dx*30.0f, 0.0f, dz*30.0f);
- drawpattern(gp);
- glPopMatrix();
- }
- }
-
- /* Set drawing mode for the boxes */
- glEnable(GL_DEPTH_TEST);
- if (!wire) glEnable(GL_TEXTURE_2D);
- glPushMatrix();
- glColor3f(1.0,1.0,1.0);
- glScalef(20.0,0.25,20.0);
- glTranslatef(0.0,2.0,0.0);
- mi->polygon_count += drawfilledbox(gp, wire);
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
-
- glPushMatrix();
- glColor3f(0.2,0.5,0.2);
- glScalef(20.0,20.0,0.25);
- glTranslatef(0.0,1.0,81.0);
- mi->polygon_count += drawbox(gp);
- glPopMatrix();
-
- glPushMatrix();
- glColor3f(0.2,0.5,0.2);
- glScalef(20.0,20.0,0.25);
- glTranslatef(0.0,1.0,-81.0);
- mi->polygon_count += drawbox(gp);
- glPopMatrix();
-
- glPushMatrix();
- glColor3f(0.2,0.5,0.2);
- glScalef(.25,20.0,20.0);
- glTranslatef(-81.0,1.0,0.0);
- mi->polygon_count += drawbox(gp);
- glPopMatrix();
-
- glPushMatrix();
- glColor3f(0.2,0.5,0.2);
- glScalef(.25,20.0,20.0);
- glTranslatef(81.0,1.0,0.0);
- mi->polygon_count += drawbox(gp);
- glPopMatrix();
-
- if (!wire) {
- glEnable(GL_LIGHTING);
-
- glMaterialfv(GL_FRONT, GL_DIFFUSE, dgray);
- glMaterialfv(GL_FRONT, GL_EMISSION, black); /* turn it off before painting the balls */
- }
-
- /* move the balls and shrapnel */
- updateballs(&gp->bman);
-
- glFrontFace(GL_CCW);
- for (i=0;i<gp->bman.num_balls;i++) {
- if (gp->bman.balls[i].justcreated) {
- gp->bman.balls[i].justcreated = FALSE;
- freetris(&gp->tman[i]);
- }
- if (gp->bman.balls[i].bounced) {
- if (gp->tman[i].vertices == NULL) {
- createtrisfromball(&gp->tman[i],gp->spherev,gp->spherei,SPHERE_INDICES,&gp->bman.balls[i]);
- } else {
- updatetris(&gp->tman[i]);
- }
- glDisable(GL_CULL_FACE);
- mi->polygon_count += drawtriman(&gp->tman[i], wire);
- if (!wire) glEnable(GL_CULL_FACE);
- } else {
- mi->polygon_count += drawball(gp, &gp->bman.balls[i], wire);
- }
- }
-
- glFlush();
-}
-
-
-
-/*
- * new window size or exposure
- */
-ENTRYPOINT void reshape_boxed(ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(50.0,1/h,2.0,1000.0);
- glMatrixMode (GL_MODELVIEW);
-
- glLineWidth(1);
- glPointSize(1);
-}
-
-
-static void
-pinit(ModeInfo * mi)
-{
- boxedstruct *gp = &boxed[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME (mi);
- ballman *bman;
- int i,texpixels;
- char *texpixeldata;
- char *texpixeltarget;
-
- glShadeModel(GL_SMOOTH);
- glClearDepth(1.0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- /* Load configuration */
- setdefaultconfig(&gp->config);
-
- /* give the decay parameter a better curve */
- if (gp->config.decay <= 0.8182) { gp->config.decay = gp->config.decay / 3; }
- else { gp->config.decay = (gp->config.decay - 0.75) * 4; }
-
- bman = &gp->bman;
-
- bman->balls = (ball *)malloc(gp->config.numballs * sizeof(ball));
- bman->num_balls = gp->config.numballs;
- bman->ballsize = gp->config.ballsize;
- bman->explosion = gp->config.explosion;
-
- gp->tman = (triman *)malloc(bman->num_balls * sizeof(triman));
- memset(gp->tman,0,bman->num_balls * sizeof(triman));
-
- for(i=0;i<bman->num_balls;i++) {
- gp->tman[i].explosion = (float) (((int)gp->config.explosion) / 15.0f );
- gp->tman[i].decay = gp->config.decay;
- gp->tman[i].momentum = gp->config.momentum;
- gp->tman[i].vertices = NULL;
- gp->tman[i].normals = NULL;
- gp->tman[i].tris = NULL;
- createball(&bman->balls[i]);
- bman->balls[i].loc.y *= rnd();
- }
-
- generatesphere(gp);
-
- if (!wire) {
- glEnable(GL_CULL_FACE);
- glEnable(GL_LIGHTING);
- }
-
- /* define cam path */
- gp->cam_x_speed = 1.0f/((float)gp->config.camspeed/50.0 + rnd()*((float)gp->config.camspeed/50.0));
- gp->cam_z_speed = 1.0f/((float)gp->config.camspeed/50.0 + rnd()*((float)gp->config.camspeed/50.0));
- gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0));
- if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed;
- if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed;
-
- /* define initial cam position */
- gp->tic = gp->camtic = rnd() * 100.0f;
-
- /* define tex1 (bottom plate) */
- gp->tex1 = (char *)malloc(3*width*height*sizeof(*gp->tex1));
- texpixels = 256*256; /*width*height;*/
- texpixeldata = header_data;
- texpixeltarget = gp->tex1;
- for (i=0; i < texpixels; i++) {
- HEADER_PIXEL(texpixeldata,texpixeltarget);
- texpixeltarget += 3;
- }
-
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
- clear_gl_error();
-#if 0
- i = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 256, 256,
- GL_RGB, GL_UNSIGNED_BYTE, gp->tex1);
- if (i)
- {
- const char *s = (char *) gluErrorString (i);
- fprintf (stderr, "%s: error mipmapping texture: %s\n",
- progname, (s ? s : "(unknown)"));
- exit (1);
- }
- check_gl_error("mipmapping");
-#else
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0,
- GL_RGB, GL_UNSIGNED_BYTE,
- gp->tex1);
- check_gl_error("texture");
-#endif
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-}
-
-
-
-ENTRYPOINT void
-init_boxed(ModeInfo * mi)
-{
- int screen = MI_SCREEN(mi);
-
- /* Colormap cmap; */
- /* Boolean rgba, doublebuffer, cmap_installed; */
- boxedstruct *gp;
-
- MI_INIT(mi, boxed);
- gp = &boxed[screen];
- gp->window = MI_WINDOW(mi);
-
- if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape_boxed(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- if (!glIsList(gp->listobjects)) {
- gp->listobjects = glGenLists(3);
- gp->gllists[0] = 0;
- gp->gllists[1] = 0;
- gp->gllists[2] = 0;
- }
- pinit(mi);
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-
-ENTRYPOINT void
-draw_boxed(ModeInfo * mi)
-{
- boxedstruct *gp = &boxed[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!gp->glx_context)
- return;
-
- glDrawBuffer(GL_BACK);
-
- glXMakeCurrent(display, window, *gp->glx_context);
- draw(mi);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(display, window);
-}
-
-ENTRYPOINT void
-free_boxed(ModeInfo * mi)
-{
- boxedstruct *gp = &boxed[MI_SCREEN(mi)];
- int i;
- if (!gp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), gp->window, *gp->glx_context);
- if (glIsList(gp->listobjects)) glDeleteLists(gp->listobjects, 3);
- for (i=0;i<gp->bman.num_balls;i++)
- if (gp->bman.balls[i].bounced) freetris(&gp->tman[i]);
- glDeleteLists (gp->gllists[0], 1);
- glDeleteLists (gp->gllists[1], 1);
- glDeleteLists (gp->gllists[2], 1);
- free (gp->bman.balls);
- free (gp->tman);
- free (gp->tex1);
-}
-
-
-XSCREENSAVER_MODULE ("Boxed", boxed)
-
-/*********************************************************/
-
-#endif
diff --git a/hacks/glx/boxed.h b/hacks/glx/boxed.h
deleted file mode 100644
index fd9b5e1..0000000
--- a/hacks/glx/boxed.h
+++ /dev/null
@@ -1,4116 +0,0 @@
-/* GIMP header image file format (RGB-only): /home/shag/build/xscreensaver-3.33/hacks/glx/thebox.h */
-
-static unsigned int width = 256;
-static unsigned int height = 256;
-
-/* Call this macro repeatedly. After each use, the pixel data can be extracted */
-
-#define HEADER_PIXEL(data,pixel) \
- pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
- pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
- pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
- data += 4;
-
-# ifdef __GNUC__
- __extension__ /* don't warn about "string length is greater than the length
- ISO C89 compilers are required to support" when including
- the following constant data... */
-# endif
-static char *header_data =
- "!FY'\"&Q#!&M!!VM-!6Y(!&M##6Q&\"69%\"FU'!FE!!VM$!VI$!&M!!FM#!VU&!'!!"
- "\"&M%#&M!\"6Q$\"')#!FY#\"FY%\"6Y\"\"&Y#\"6]$\"&U!\"G%!\"7%&!G)!!'-!!')!\"'=!"
- "!G!##G5\"\"75$\"W9#!G5#!G9!!WA$#'=\"!GE#\"'A%#GI$!GI!#'A!!'E##GQ&%7Q#"
- "#WU%#W=%\"W]#\"GY\"%WQ)%7Y\"\"H-!\"W]&\"8!$%8%#$8-&\"8%!#81%$85)#H!##H-&"
- "$H1(#H)#\"X5#$XA%\"X9##H9#\"89#\"89!\"HA\"\"8A!\"8A!\"X=#$8E&#(I!\"8I&$HM!"
- "#8I%\"8M!!HM#!HM!!HU!$(M($8Q)!H])!XQ!\"8Y!$(]'$(Y'$8Q(\"XY%#XQ#\"I!$"
- "\"XY\"#Y)##)%#%(]%$Y!!#I%\"\")!%#Y!$#9%!#8]!#I%\"$)%$%HY%#HU\"$91($9-("
- "$))$#95!%8]&!9-\"$X](\")!#!)%!%)-\"#9-$#)-&#I5\"$Y%!#)-)\"I-!#91!\"Y-\""
- "\"(]\"$I-'#IA\"\"I-!#Y-&#)-##Y-##)1#!I-##)-#\"H]!#)5#\"Y-\"!)-!\"Y!&$)-!"
- "#)1#\"Y%##(]!$9-)\"I)!#)1#$Y%'\"XY\"\"91#!)1!#I)\"$)%%%(]&#HY\"#(]!#I)\""
- "&8]%!(]!\"Y!##H]%#X]!#)%##(Y&\"I)!$X]!#Y!#\"(Y\"\"HY!#Y%'\"8Y!%(]+#XQ&"
- "\"8M#!XQ$\"Y%%\"8M!#XU!#HI\"$XQ$#XI&\"HI!#8A\"$8E\"#(5!#8A$$(A%\"8=#$(5("
- "#X='$89##H=\"#(=!\"XA#\"(-#\"H1\"\"81!\"8-!!(5!\"X-##8!#\"H1%$(!&#X1&%X1$"
- "#(%$\"G]\"!8%\"\"7M!\"7U!#'Y$\"7M!#7Y##GI$#WI%!'M#\"7A!\"GI\"!G9!!GI&!GE!"
- "\"GE%!W=\"!'E#\"W!\"!G%%!W5&!G9!!W)\"\"'-#!7-'\"V]&!W1\"\"'%\"\"'%#\"&]\"!'1%"
- "\"&Y##FQ%!&U!\"FU!\"&Q#!&I!!FU#!&Y!!6M\"!FM%!FI!!&M!!VM\"!VM\"!FI%\"6Q$"
- "!&E#!VQ&!&E!\"FM!\"FM#!&Q!\"&I%#&I%\"&M*\"VM(!6U\"!6A\"!&I'!FM#!FM!\"6M\""
- "!FE##FU%#V]$\"&Y#\"FY!\"F]%!F]!!V]\"!G1!\"7%\"#75(!G%!\"71$\"'-#\"'1!!G5&"
- "!W5$!G=!\"7)\"\"G=%\"7M#\"GM'!WA\"!'A!#7A*\"7I!#7Q&#X!*$'I!#'I\"$'U(\"7U!"
- "#7Y%!GY!#GY&\"7]!!H)!$H!+\"WY##X!'#X%'\"H1!\"()#\"H=\"\"X1(%X-(!H1!#X5!"
- "\"H5\"$8-&%X5'\"8-!#X-'\"XE%#H=&#XA'#XA$\"XE#\"XE#\"H=!#HE%\"XI\"!HM##(I'"
- "\"8A!#H=#\"H]!#(Q#\"8Q##(Y#!HE#\"HU!\"))%$(Y$#(Q#$H]&#X]!#X]#\"HU!!)%!"
- "\"Y!\"#I!&$)%%$)%$#Y-#$XQ*#95!#9)!&9%($)1'!Y)!\"Y-\"#9)$%I%'#)-#\"I-!"
- "$9)(!YA'&)-*!I%#!Y5!#Y)#%I-$$I5#\"Y1%#I)%#YA&$I1)#))#!Y5!#9-$#)1#"
- "\"I1!\"I1!!)1$\"I-!#I1%\"Y!#\"H]!#I)%#9)!#))#$9)&#9-$$)='#Y1##I9\"!Y1$"
- "$)-'#Y)##I-%#99$!)-!#)-&!)-'$Y-+!9-\"%9)#\"X]\"$))'\"9=#$Y)!#Y%#$Y%("
- "!I%&#Y!##(]!$I!'#9!!%I)!!Y!\"$H]#\"9!##8I(#8]$$(Y'\"I-!$8U##(Q##8I$"
- "$(U'!HU#$HU!#(Q!%(I)#H](#HU\"$(E(\"XM\"\"HI!\"XA#\"HE!\"(I%&(A(#HE%#XI!"
- "#H9##8=!\"HA$$8=#!H1##(=!%(1&\"H1!#85%\"X1#\"8-!$(-#\"8-!\"X-\"\"X%#\"X%!"
- "!H!#!H!!#8-%!'I!\"8%!\"GY%$7M)\"GM\"!'M!\"GU\"\"WU#\"WM!\"'I#\"8!!!75\"\"'I#"
- "\"79+\"G5\"\"'5!!GA#\"'-\"#'=\"!G%!#')'\"'=,!W5$\"'-#\"G!#\"')#\"'%#\"6U#!W!\""
- "\"6]#\"G!%#'!$!VU\"!&Q!\"&Q#\"6]$!FM!!&]##&Q'!&Q!!6M$!6M&!&I!!69\"!G!#"
- "\"6I$!&E!!6Y\"!FI#!6M&!&M!!F='!&Q&!&M!!VE$!VI$\"&I'!6M\"\"&I#!FE!\"6E&"
- "#&Y%\"W)(!VU\"\"G!)!FU!#V]&!G9!!79&\"G-\"\"7)$!G1!\"G-$!W5\"\"71$\"'5#\"'5!"
- "!71\"\"'1\"!G9!!7A%\"'A#!G1&\"GI$\"'A!#7I%\"'E'#H!&\"WY#\"WM&$GU%\"']\"!GY!"
- "!WY!$H!+#W]'\"8!!\"X!#\"'Y#\"W]!!H)##X1'#H-##(5##89\"#H-!\"81!\"89##H1&"
- "%HE%\"8=!$(9%\"X9\"!X9!\"XA#\"HI$\"XE(#(I#$(Y*$8I(\"8I!#85!#XM!!HM!$8M&"
- "#(Y##(Q!#XQ!#XY##8Q$#(Q#$9%%#HY%\"X]\"$H]&!H]!\"8Y!!Y5!$I!)'I!'$)!!"
- "#9%!\"9!$%95#\"9%&#I1(#9)$\"9-#!Y%!\"Y!#\"))\"!HQ!\"I)!$91\"\"I-!#9!!$9))"
- "!)-'\"I-!$I5##)9#\"I5$#8]!#Y)##)1##)1#\"I9!$I-##9=!\"YA%$9-%\")5%\"I)!"
- "\"I5!$)-'$)1!\"9=#$Y5!\"Y)\"#Y5&!)A!\"Y-\"#I=!#91$#I%\"#)-#%I5!#)5##9)$"
- "#)1&!9-\"#91$\"I1!\"I1$\"Y9\"#I)%!I-#!I-##)-#\"I-!\"Y5\"#I)\"!))$\"))\"!)%!"
- "!X]!$)!(\"Y%#$9%\"#I%\"#I)\"$Y-'#I%#\"I!!#Y-##I%)!Y%!\"8]!#I-%#)%#$(Y'"
- "$)%%#XY#\"I!!\"8]!#(U#\"HA$#HU\"&HQ)&(Q*\"HU!#8M$\"8M!#8Q$#8Q$$(E(\"8E#"
- "#(A#\"HA!%85'#(=!%(=#\"H5\"#H9\"\"89!\"85!\"H-'!H5#\"8=!$85$\"8-!!X)!#'U$"
- "\"8%!\"8!!$H!$#(1!\"(%#!GU#!WY!\"WU#\"7U!$GU#\"7Q!#GI$\"7M!\"7M#\"GI%\"GI\""
- "#WE*\"'E#\"WA&#'A'\"'I\"!')!\"G9\"\"W5$#W-#\"'1#\"'-#!7-\"\"&Y%\"G5\"\"'!#!'%#"
- "\"'%#\"F]'\"VY&!&Q!#&Y\"\"&U!\"&Q#!FQ!\"FQ%$VU*!&E!!FM%!VM&!VM$\"F9)\"&U)"
- "!&M#!&Q!!&I!!&M!!6Q\"\"6]&!&A!!FQ#!VQ$!6=\"!6Y&!6M\"$6M&#FM)!FQ!\"&Q#"
- "\"6M,\"6Y$#&]$\"V]*#FY)!F]!!G!!!&]!\"')\"!W)!\"7-&!G5!!'-!\"75#!G5!!G9!"
- "\"'A#!G5!!GA#\"WA#\"GA)!'E!#'A\"#GU!#WM%#7M%\"7M!#WY'#7Y%\"7Y!\"GM\"#7]%"
- "\"X)##']$\"8%!#8%$%(=&\"8%!\"8)$$X)#$()#$8%)\"8-!&X1(\"X=\"$H='$(=\"%H1&"
- "!HE#\"X=#\"89!!X5'$8A##XI&\"8A&#(I!&(Y##HI(#(]#\"8M!#8Q$!HQ!\"HQ!$(Y'"
- "\"XU\"#9!$$X](\"XM%#HU%\"XQ(#XU&\"8Y!#9-!#8Y$\"8Y!#I!\"\"9)#\"H]!\"8]!#8U!"
- "$9%##X]!\"X]\"\"I%!$Y!*!I)##9-$$914\")1(#I-%#)-#!))$$)5$$Y1*#91$\"Y1%"
- "$9=\"!Y9!\"9-#$9%)\"Y5\"&)-&$)5'\"Y%#\"I5!\"I='#)9##99$#)=##I9%\"YI!#)9#"
- "#)9#%I9.\"II!#Y9#\")=\"\"I9!%)1($Y9$\")E\"#Y9#\"Y9\"!YA$$I9)\"I5!#95$\")5("
- "$)1'#Y=##Y9&$I5##Y9&\")9\"#Y5##)9##9=$#9-$!Y9!$)A'\"Y-\"&9-+!)-!\"Y-\""
- "\"I)!\"I-!#91'#))##9)$\"XY\"#9)$#9%!$H]#!I)#%I)!&I%&$9!%%I1!!X]!\"8]!"
- "\"8]!\"I!\"$HU'!XY!\"XU\"#(Q##(U#%(U)$XE%#8I$!(U#\"8M#\"HU$#(Q!\"HM!#HU\""
- "!XE$\"8M!\"85!!H9!\"XA\"#(=$\"X=##HI%$89##X5&\"89#!H=&#(1&\"85!\"(5\"#H-%"
- "$(!&#H)%#(5#\"()#\"8)$!G]#\"']\"#W]'#8!##WY'$X!)#7U#\"WQ#\"7Q!\"WM##'Q!"
- "\"7I!\"WI#\"G=\"$7E$#W5*\"'=#!G=!$75,#W='\"'5\"!79\"#71(!W%\"\"G%#\"')#\"'%#"
- "#G%$\"7)$!'!!\"'!#\"G%\"\"&Y#!VU\"!6M\"!FQ!\"6]&!6=\"!F]#!VM$!&U#\"FQ#\"&E#"
- "!&M#!VI$!VU*\"VU&!6M(!6Q\"\"FQ%#6M$!FQ#!FI#!VM&#6M(\"&M#\"&U#\"&M#!F]&"
- "!FY(\"6Y$!7)\"#6U\"\"W)&!G!!\"G%##G)'!W)\"!'9!\"7-$#W5#\"'-#\"'9%!W-\"\"'=\""
- "!'=!\"G9%#7Q##'E$\"GI#%'I'!GE#\"WQ!\"'Q\"\"WM##GY$#WY)\"7Y##8!%#X%!\"X%#"
- "#H)$\"H%\"%(5!#'Y!$8))#7]%#H-#$81$\"H5\"#89$#(=!#85!$(5($H-$#XM&#89\""
- "$(E%!(M!#89\"$HM'\"(E\"\"HM!!(I!\"8I!!(I$#8]$#(E#%(Q)$HQ)#XQ'$(U'#8A$"
- "\"HI!#XY#\"8Y!#(]##9!!#8]$$)!(#Y%$$9%%$9%#%(]\"#9!!\"Y%##Y)##I-\"#8Y-"
- "\"I1!$9-\"$)5'\"I1!#))#\"I1!!))!#9%$!I)#\"I1!%)5\"\"95##91!$)5$$I5)#95!"
- "$9=%\"I1!\"YI\"\"I9!#99$\"I9!\"Y5\"#I=%$)9!$I=#$)='!YI!\"I9!%I='!)5!#Y9#"
- "$I=#!)A$\"I=!#I=%#9=$\"YQ!#)=##)A#\"YA\"\"I5!#I=(#Y9&\"II!!IA#\"9=##Y5#"
- "#)9#\"I1!\"IE!#Y9&\"YI\"#Y-&\"Y=\"\"I=!#I9%#)9##I9\"$Y1'&9A&#I1%\"I!'#)1#"
- "\"91#\"Y1\"#Y1&$))$$I5#!I%(\"I!$\"I)!#))#$Y)!#I1\"#I%##8]$#(]!$8Y\"#Y-#"
- "#HQ(\"XY\"\"I!!#(Y#\"Y1\"#8Y$$(Y(\"HU!\"XM\"#8U$%(I#\"XQ\"\"XY\"#(M!!HI&\"(I\""
- "#HE#!HI!#HM(#8=$\"X=\"#XE'!(9&\"XE#$X=&#(A'\"81!\"H1!#8=$\"81$$81&#(-$"
- "#H-%\"8%!#H))$H)\"\"8%!\"X%!#8)%\"']%#(!!\"7U!\"'E#\"WU#!GM!\"GQ\"\"7Q!#WI%"
- "!WM$\"GA$\"WA!\"WE#!'A!\"'A#!7A\"#GA$!G5!\"G5$\"W5#!G5!!'1!\"W)$\"G5\"#&Y#"
- "\"'%#\"'%#\"F]##6M!!F]!#6](!G!!\"FU#\"6I$!VQ\"\"FM)!&Q!!&Y!!FM#!&=#\"FM%"
- "!6U\"!6M$!6M\"!FQ##&E%\"&M*!VM$!6Q\"\"6U(\"6M$\"6Q$\"6E\"!VM\"!FY#!VU$\"&]\""
- "\"FI%!&U&\"'%#\"'!\"!W!\"!G!!\"W%#\"71$\"'-#\"7%$!G-!!F]!!G=!\"'-\"#GI#\"7A#"
- "\"7=$!WI\"\"GU\"!GE#\"GU\"#'Q$\"7Y&!'Q#\"W=$#7Y%$GY#\"GY%!G]#\"H)\"\"H!\"\"(!\""
- "\"7Y!$(%%\"8)$$H-%\"X-\"\"X%#$(-(#H1##81%\"85!#(A#\"89!#(9##H=%#(=!!H=#"
- "\"XA%\"HE$#H=%!HI!$XQ+#(I#\"8E!#(Q#\"8M#\"XQ\"\"HI$#I%%%9%*#8Y$#(U#%)%\""
- "\"X]%\"Y-\"\"8Y!\"I!!!Y!$#(U!\"I!!$))!!Y-!%I-+%9%&\"I)!\"I!!\"I-!$)-$#I1\""
- "\"Y!%#)1#!91\"\"I-!#HY%\"I1!$Y-+#95!$I5&#Y=&#IA%\"I9!#Y9&#I=%\"I9!\"I9!"
- "#9E#$)M&\"I=!!9=\"$I=#\"Y9%#Y5)$)A!$)=$#I=\"%99\"%II&#Y9##YA#$IA##Y9&"
- "!)E!\"I5!#9A$$Y=!$9A$\"YM!#IA\"$YI&$IA%#I9\"$YA'#Y=#$)9$#9E!$9=%\"IE!"
- "\"Y5\"\"I9!\"IQ!#I=%%9I%\"I=!#)M#\"99&!)=!#YE%#99'$I9#$Y5'#)9##)9##)1#"
- "$I=#\")-%\"Y)\"!I1)'))'\"I-!\"I)!$9-%$)-!#H]%#9)!$I)#\"Y)\"#I!#\"I-!$)!$"
- "#I%\"#8Y$$8U##(Q#!X]!\"X]%%H]-\"(Y\"\"H]!\"XQ\"#XQ$#(Q&%(Q)#(Q#!HQ!\"8U#"
- "\"HQ!#XY&\"8Y!!HI&\"X=##(M#!(=!#8E%\"H9\"!H9#$()##8I$%(5&#()!#H9&!(-!"
- "#8-%#H-%#H9##']$\"8)!\"(%##X%!\"81!!(!$$H)(!(!$\"GY)#WQ'#7U#\"7Y#!GY#"
- "!'Q!\"WM#!'Q!\"W9#\"'E#!WE!\"GA%\"G=%\"'=#\"G9$!G1!!W5\"!7-\"#71(!W1'\"'%#"
- "\"F]%!7%'\"&]#!6Y$\"W-&#&]'!FY!\"&Q#\"&M#\"FI%$VY%!6M*\"VM&!&M!!&M#!FM#"
- "!&Q!!&U%!FM#!6M\"\"6M$!&I!\"&M%!&M!#&U%#&M'!7%$!FQ!\"VY&#&U%\"6Y&!W!$"
- "!6M$!FY!!&]#\"'%%\"'1\"!G1#\"V]\"\"W1&\"W5(!G9!!G9!!79\"!'5#!'=!\"GA\"!GA#"
- "!GE!#79\"\"WI!\"'I!#WE#\"GQ\"$'Q##7U#!GQ!\"X)\"\"7Y!\"'Y\"$'Y%!H!!\"8)!#(%$"
- "$H-%\"(%#%(!$#X-'\"X%#\"H%!#X1$#(5#\"89#\"X9\"#XQ&\"X=#\"89!#X=!#(E#\"HE$"
- "#HA##(E&#(M#\"XM%$(M!\"HI!$XM(#HQ%#HY%$H]&#)!#$9!+#H]\"%Y!#$(]$%I!+"
- "\"8]!#9!!#9%!!Y)$#9-!#9-!\")%\"\"I!\"#9-$\"I-!\"I-!\"Y9\"&)9##8]!$91%#)1#"
- "#9=$\"Y1\"#I9%#Y5##Y5&\"I5!$)='!Y1!#I1($9=(#)9#\"Y9\"\")=\"!YI!!Y=!!Y=!"
- "#Y%$$YA&#YA\"%9E%#9=!#95!#YA##99!$)5$%Y9%$YA&%9I)$)E$%9E)#)5##9E$"
- "#YM\"$IE%$YI$#9A!%)E!#9E!#9=!#Y=#$95%&)M\"$I5##I=!$)I$$YA&$IA%$9M!"
- "#Y5##YA\"$9=\"#YI#$)A$#)A#$)5$&9A.$IA($)1$#9E#\"I=!!I9##)A#!95\"\"II!"
- "\"99##Y1&!)9!\"Y!##Y=#$Y5.#))#\"(]\"\"I1!\"I5!\"9)#!Y-!$Y%*$))$\"I)$\"I)!"
- "$)%!$I)##9!!#9!\"$HE!$(]$#8]$\"8Y!#(]##HY%\"8U#!HY!#XU&\"XU\"\"HY!\"89!"
- "\"8M!#HI##XM'#XA&#8Q$\"XI\"!H5##(9#\"XA#!H5#$X=%\"H9%$X9#%(=#$X5&#(5&"
- "$H1*%X%'#(-!$(-%#8)%#H-&\"8%!#()$$(!#\"8%!#X%!$']&\"WU#\"W]#\"7U!$'U#"
- "\"WQ!!GU!#'I$!'I#\"GI\"!GM!\"'I#!'E#\"WM#!W)!#'9&!G9!#'5\"!G5#!')!!7%&"
- "\"G-%\"W)&!79%\"')#\"7)$\"7-$#&]&\"&U!$6Y%!FQ!!W%!\"FY%!VM\"#6E\"!V]\"\"6M&"
- "!FU#!&M#!&Q!\"6M(!6M\"!&=#!VM$\"VE(\"VM$!V]\"\"&Q#\"&U#!6U$!FM!!&Y##'%%"
- "!G%!!W%!\"7%$!')#!')!\"G-%#'1&$'I!!G9#\"79+!75\"\"W9&\"71$\"W-&#'U\"\"7E#"
- "!WM$!'E#!GU##7I#\"WM(!G]!\"7U!#'A\"\"X!#$7]*#X!'\"8!!\"WI##(!$#H%&!H!#"
- "$8)$\"X)%#8-'#(5#!H5!!(=!%XE)\"89#!X9$\"H=!\"X=%#H5&\"HE!#(M#%8I'#HE#"
- "$HY)%(E+\"8]!\"8M!#(Q#\"XY\"!HI&!8I\"$8Y&\"8I!\"HI'\"XU\"#HY%#(])#8Y$#I!#"
- "#9!!#H]\"#I%\"\"Y-\"!))!$))!$9=%$9-)#I)\"#9-$\"I1'\"I1!%Y=(#))&$95\"#)5#"
- "$I9)#)5)$I9)&91'\"I5!%Y=$!)='\"Y-\"$Y-!#95!%9=)$IA\"$9=%%)A(#9A!#91!"
- "$)E#\"IA$#9E!#IE\"\"II!$9E$%)A%%)E$&IE.#)=#$)='$IA\"$)A!#9E!%IM&$)E$"
- "$)Q#$9I\"$)=!$IA#&9I'#9I$$9I$#9I!$9M!%)A+#IE$\"IE!$IA%%9=\"$9=%$Y=$"
- "$)I#!)E!#YQ##9E!#YE#&)A(!YA$%)A(#YA#&)A\"&9I&#IE\"$Y=!$9=(\"IA!\"Y1\""
- "$9)\"!YA!#I9%#)%$#Y%#%95\"\"I)!$)5'\"I1!\"9%$\"I1$#Y)&#)-#$91(\"Y-%%)-%"
- "\"8]!#99'#)%#%Y%,\"I-!$)!!#9-!#9!\"!Y!!$HY##(U#\"I!$#(Y##(Y#%(]%#XU#"
- "#(Q#!XQ!#(Q##8I$#HQ%#8Q!#HQ\"\"XE#\"8I!#XE&\"XQ%#X9$\"XA0\"X5#$8-)!H9!"
- "#(=!\"XE#\"X=#$(1#\"7]#!X1!#8%\"#H)$!(%!#H%&\"H!\"\"X%#$8-'\"H%\"\"7Y!$(!("
- "\"GQ$\"7E!!H%!#WM'\"7M!#7M#!GI#!WY$\"GA#!WE!!GE!#7I(\"W=!\"G9%\"')(#71$"
- "#G%\"!'%!\"'A'\"G1\"!G%#!'!!!G!#\"G1#!FU#!FY)#&U%!&U#!VY\"\"VQ$\"FQ%!FM*"
- "!VM$\"FI'\"&Q#\"&M#$&M)\"6M$!VM$\"&M##&M!\"&U##VU,\"&U!\"&U#\"FU%\"&]#!FY&"
- "#')%\"G)%!FY!$7-%\"')\"\"G1%!W1(!G5%\"G9$!'9!!G=!\"'=#!G1!!W=\"!GA!\"7I!"
- "\"7M!$'M(\"7M!\"7I!#WQ%\"WY#$GY%$'U#!7Y\"#W]$\"X!#\"X%#$(%%\"8)!#()!!X-$"
- "\"X-#&H9'\"H5'!H5!#H)&$8=##89$\"X9#\"X=#\"8A!%8A-#(9#\"HM!#XE##HA&\"(A\""
- "\"8M!\"HA!!HI!#HQ%#HM&!XQ$$8U##XI#\"8Y!#XY##9%!#Y)&#HY%#9%!!X]$$9!&"
- "$I%'#)%$%)9%$I!*$Y%!!)-!#Y1#$8](#)9#$I5,\"Y1%#I5%#95!\"I1$$95(%II&"
- "$)A!\"I9!!)=!\"I=!\"Y5\"$9=%$IA#%9E\"#Y9#$9=+$)=$$)A$!Y=!$YI&#YA\"$Y=#"
- "$IQ%%IE$&)I,$)I#%9I%#YM#\"II!#YI\"#)Q\"#9I!#YM\"$)I#%IQ)&)I,$9Y!%II#"
- "#9M!#9M!%IA*%YA$%YQ!$)I#\"YM!#)=#\"IM!#9A!#YM#$9U$#IM\"%)I(%)M!#9E!"
- "#)I&#)M##Y9#'YI*#II\"#9E!#Y=\"$)E#&9E#%YE+%YE+#9I!#9A!%IQ#%9A\"$)=!"
- "#99!#Y1#!9=%#)9#%9=\"$)5!\"Y=\"\"Y=\"#I=%\"Y-\"!I%##)1#\"I1!%)=$#))&!(]#"
- "\"Y1%!I-##9)$#Y-&$91(#Y))#Y)##H]\"$I)#%I!!$X]*#9)!\"X]\"!8U%$8Y\"$(Y$"
- "\"8U!%HI%!XM!$(Q(\"8M##Y!'#(M&#(I'#(E$\"(U\"!(E!\"HE!!HI!$HA'!H=!\"8-!"
- "$89#\"HA!#89%#(9#\"81!\"(1\"\"(-\"#(5#$8).$()(\"8%!#7U%\"8!!\"GY$\"7]!#GY&"
- "\"GY\"\"WU##GQ&!GM#!GI#\"GM\"\"GI\"#7I%\"GE$!WA!\"'A%%'9#\"7=#$'A&\"'9#!W5\""
- "\"79&!W-\"!G1!!W)!\"G)%!'%##G%\"\"&Y#!VY\"!&]!\"6Y$!FU!!VU\"\"&Q##6]#!FM%"
- "!FQ!!6Q$!6M$!6Q\"!6E\"\"W!&\"VM$!&I!!VM\"\"VQ##FQ)\"6Y#!W%\"\"7!\"#7)##'!%"
- "\"'%\"\"'1#\"G%##G-)\"71(\"W1!\"G-%\"79$!W9\"!G9!\"W=##7A#$'E(!'I!\"GU\"\"G=%"
- "\"W=#\"7=$!GE(\"WU##'U$#'I!#8%%$W](%8)(#'Y&!(!!\"']#\"(-#%'Y$#H-##X-'"
- "\"X9#\"(5\"#X=#\"8)(\"X=##X5'#X=!\"8=$\"8A!!HE!$XE%!HA!\"8I!$8I)$HE*#8M$"
- "#8Q2#8Y$$XQ*$HU&\"HM!$(]'\"(U\"#(]#\"H]!\"8]!$Y!!#9%!\"I!!#)1#\"9%$$))%"
- "#9-!#(]!#))#\"8Q!$9A(\"I5!$99($I-##)I##YE&!I1&$99(#IE$\"I9!$I9\"\"I5!"
- "\"IQ!\"IE$#9=$#9A!%IE$!YA!$)-$$II%$IE&$YA&$IQ\"$)I!\"IM!#YI#\"II$#9A!"
- "\"I9!#YM#%9M)#9I#\"II!#9I!#IM\"$I=##)Y#$9I!#IE\"#IM+#YU)#Y=##9Q!#9M!"
- "#9M!#9I!\"9U#$)Q'%)U'%)Q*$)A!$YU#%9M)#9Q!%IE##9M!#9E$$IQ&$)M#%YE$"
- "#)M%#IM!!YM$$II##YM#\"IU!$)E#%)A!$)Q$$)I'$II##9I!$IE#$9A!$II&$IE%"
- "$9A%#YA##IE!$YE*#9=!!)A!#9A'#9=!\"I9!%99#\"95#\")1%\"I-!!Y5!#Y%'$I5)"
- "$(Y'#91$#9)!$9-%!)!!\"95##9)!\"8Y&%9-#$)!%%)%&\"Y!\"#(]!#(]#\"9!#\"H]$"
- "$(M%#8M$#(M#$(Q(!XQ!#(Q#\"8U!\"9!##8M$!(=!#8E%\"XI\"#(I##(='\"XA\"\"8=#"
- "\"8A#!(=!$(9\"\"X=\"$(=\"$(1(\"X%#!8-(#H-&!H%%$8%$\"8-!\"W]#\"8%!#7Q&\"W]#"
- "#7Y#\"WY!&'E$#7U##'Q$\"7M!\"WQ#\"'A!#7M%!WE\"!WQ\"\"79\"#G=$\"GA%\"G)!!W9\""
- "\"GM$%7)'#'-&!'-!\"7!$!W-!\"'%#!FU!\"&U#!F]!!W!\"\"&U#\"&Q#!FU#\"FU!\"&I)"
- "!FM!!6M\"!&]!!&=!!&M!#6M\"\"6]$$&Q'#6Y(!&U!\"&M#!F]!\"6Y#\"6Y$#'!'\"'1#"
- "!G)!!')$!'-#\"G-%#G5'!G5#!GE!\"'=##G9\"\"W=%!GA%\"7A!!'M#\"WM!\"GA#\"GU\""
- "$GY*\"7Y!\"WY!#7Q\"#8!%\"7]!#']!!WY&\"7U!\"7U!$(-%\"X!##H)#$(!*#H9&$X-\""
- "#X-!#85\"#H)&\"X9#\"H5!#(='\"8E!!H9!$8A##(Q#$8M##XI&\"8=!!)!$#HI#!XQ!"
- "$HU$\"(Y%\"XU\"!X]!#(U!$I1##I!&#)!&$))$#8]!$9%#'I%'\"I)$!I-##9)!$I9#"
- "!Y)!!Y-!\"I1!\"I1!#))#$I5&\"I5!!I5#%I9#\"Y9%#)=&#Y9&\"II!\"I=!$I1&$YE#"
- "$9I%')5*#9E!!YE!$IE&$IE%&YQ($IE#$YM#%)I/$9M!$YA$$IE##YM##YU\"%)U'"
- "\"IM$$IQ)#II!%YM.#9Q!$)Y##IM!$IQ&$IU\"$)U##9Q!$IQ&#YQ##9Q!$)U#$)Q#"
- "\"IU!$YQ##YQ#$9Q!\"II!$)M$')Q*$9I!$)M#$II%#YQ#'9I(#IU!$YY&\"Z!\"#9U!"
- "#YQ#!YE!$)U#\"IU##9I!$YI$$9M$#9M!%IQ'$IM\"#YI#%)5!#9M!#II\"#YI#%9E)"
- "#YE#\"IE!%9M)%9=*$99%#YI#\"YA\"$Y1!#Y=##99!#9=$\"9I&$9=%$Y5*#)9#\"Y=\""
- "%9E)#)1#&)5##I1%$)5*%Y)\"$9-(#X]&!Y)!#(Y&#I!\"$I)'$))!$9!%#I%\"\"8]!"
- "\"X]\"\"I%!$I!##(U&\"HU!#(U#!XY$#8U$#9!$\"8E!\"(Y.#XI'$(I!#(A!#(M!\"XE#"
- "#(A##8=$%(=)\"X9##X9!$(1&#(5#\"89!#(1$$()%\"()%#8)%%8%#\"H!\"\"8!!$'Y%"
- "#7]%$(-#\"7Y!#(%$#7U##WU\"#7M%#'E+\"GE\"\"GE\"!GE!\"'E#\"'9!$'=&\"'9\"#'9+"
- "\"'E#\"W5#\"'1'\"71&!71$\"&U#\"'-!\"&Y#\"W%$\"G%!!F]!\"F]#!&]#!FU!\"&U#!6Q'"
- "!VQ$!VM\"\"VQ*!&Q!\"6M$\"&U#\"&I!\"&U#!G!!\"&]'!V]\"\"W!&!G!!!71\"!')!!')!"
- "\"'-\"\"'-!\"'-#!'!%\"W1##GI#!'5!!GI!!'E!\"G=%!WE)\"7=$#7I!!WM\"#'M$\"'M\""
- "$7Y$\"GE#!X%$\"GY\"\"7]!\"8!!\"89!\"(!%#(%'\"H)\"\"8)#$X1&#X%$\"X1#\"(-($(1#"
- "#X5!\"89##89%#85%!8=\"\"H5\"$HA!#8=$%8]#\"XE\"\"XI\"\"(I\"#XE!#(Q##HI%!HU!"
- "\"HQ!\"8Y)!HM#\"8]!\"8U!\"X]\"$9%%%Y9!\"Y!\"$)%%$Y!'\"Y=\"$))!#Y-#$I-)\"I-!"
- "$Y1*\"Y1\"\"95#$)1'\"I5$#95$#95$\"I9!#)9#\"I=!%)=(\"I9$#IE\"!Y-$#9A!#9I!"
- "#I9\"#IE%\"I5!#)I#\"IM$$II&$9U$#)A#$IQ&&IM(%)M!%9E&#9Q!#YQ#$YQ'%)Q!"
- "%9Q($YY#%9Y\"&)Q(&IM$%)Y'!YU$#YM#%)U($9U($9U$%9Q($9U!&YY%%)Y$$9U$"
- "\"IU'\"9M#%YE!#)]#!YQ!$YM##I]!&Y]$#)Y&\"YU$$)Y##II\"#9Q!%IU&\"9Y##IY!"
- "&9M-#YQ&$Y]&$YQ'$YQ##9Q!\"YQ!#9U!#9Q!\"YQ\"$IM&$)A-#YI\"#9Q!$II%#IM$"
- "\")A%\"YM\"#9I!$Y=!$9E\"$)5$#YA#%)9%!YA!#9=!#9A!#99!#)A#%IY*\"I9!\"Y9\""
- "!Y-!\"I9!&)=&!)1!!91+\"I1!#91$#I5\"#I-%$H]##9)!#))#\"I1!\"Y-\"$9%&\"I)!"
- "$8U\"#(]#!(]!\"I%!#8U$\"8Y!#XU&#HE#$HQ&#HQ%#(Q##(M#$HI'#(I##(U##(E$"
- "\"X=#$XA(\"8=##(9#\"(9%\"X5\"!H5#\"X5\"#89%#85$$(!(#8-*!G]#!X!$\"X%\"#8)%"
- "\"X!#\"GY'!'U!\"7U!\"7U!!']#\"WQ#!WQ!$'U##7I!\"7E!!GE!#WA%\"'A*\"'A#!79\""
- "\"75(\"W9#\"G5%!W5$!G=%\"7-$#')'!G)!#7)&!G-%$7!#\"&Q#\"7%$\"FY%#FU\"#FA#"
- "!&M!!&M!!VI$#&M#\"FQ!!&M!!G%!!6U$!FU!\"&Y#\"&]#\"'!\"!F]!!G!!!W)\"#W!!"
- "\"'-##'1&!'1!!G9!!G5!\"7A!!GI!\"7A$\"7Q#\"7A$\"W9!#7Q%\"7Q!#'U$$'Q&\"GQ\""
- "!'M!\"7Y!\"7Y!\"7]$\"7]!\"'Y##'Y$!X%!\"X)&#8-%$(9(#8-%#H9#!(I$#85%#(E$"
- "#89$#H=%!HA##(I#\"XA%#(A#$89!\"(I\"\"HI$!(I)\"Y!#$8Q(#HQ&&HM*#(Q#!HM!"
- "$(Y!!Y!'#)!##X]&\"9)#$9)\"#XU#!Y%$!Y)!$)1'!X]'$91%\"I-!$Y1!\")-\"\"9%#"
- "\")5\"$I1)#IE%#Y-&$I=)#)9#\"Y5%#Y9#\"IE$%)A%&91$#IA!#YE\"#9E!#)E##9M!"
- "\"II!#)I#\"9E##IM\"$YE*\"9I#%YQ'#I]!$)U##9Q!#9I!#I]!#9U!%)Q$%IY)#Y=\""
- "%IQ*%9Q($)Y#%I=#%)U'$)U#\"IY!$)Y##9U$#9U!%I]#'J!'$)Y#$9Y$$*%&$IY&"
- "!YY!$)Q#$Z!##Z%)$I]%$YY##YY\"\"YM\"$IY&%YI!#IU\"\"IY!$)M$$9Y$\":!#'9]+"
- "%9Y(&YU$#YI#')Q%$IU%$IU%$)U##J)!\"9E##9U#$J%%!YQ!$9E\"$IY\"$)I#\"9M#"
- "\")I\"#9I!$YE&#9U!$9A$$I]\"#99!#YI##9E!#IE!#YA#\"IE!#9A!#Y9##I9\"!)5!"
- "\")E%#)9##Y=&$)1'#)5##)5##))#\"I1!\"Y1\"%)I!\"I-$\"I-$$)%'#9)$\"Y%#$))$"
- "$Y%%$I)##X]!'I%*&(]&%HY$#8Y$#(Q#\"HM$#8U$#(]&\"H]!\"(=\"#XQ##(I#\"8Y#"
- "$(A(!(A!#8A$\"H%!#X='#H=##(9!#X=$#H5&\"X-#!(9!\"H)\"$H-*\"8!!\"8A!\"8%!"
- "!H!#\"(!#!GY#\"W]!#WY$\"7U#\"7Q!\"WU#\"7Q!\"WM#\"G9\"\"WY##7]%\"'I#!7A$!'9!"
- "\"'=##'I$\"75$!G5!!71\"\"'-#\"'-#!'!!\"7-$!G!!#'!%\"VU#\"&]#!FE!!F]!\"&U!"
- "!&I!!FM#!VE&\"6Y&\"&Q#\"6=(\"'!#!F]!\"&]##'%'#6]$!W%$!7)%!G)!\"G-%\"W1#"
- "\"'1##'5\"\"75$!'9!!G1%!G=!\"'1#$79%!GE!\"WQ#!7E\"%GU&!GE&\"'=!#X)'\"7U#"
- "\"GQ\"#'Y$\"WQ#\"8!!\"W]#\"X1#\"(%*\"()*\"8%!#81%$X-+#H!!%(=)!85\"#H=%#(=!"
- "#XI'#8A$!HA#\"X=\"\"8E!\"XQ\"$HM*\"XQ%\"8A!#H]\"\"8Q##XQ#\"XE#\"8U!\"8Y!\"Y-\""
- "$H]&\"I-!#(Y!\")!##9)!#9%$\"9)&\")1\"#I)&$9)(\"Y1(#)9##))##91!!Y5!#I5\""
- "\"I9!!Y9!\"I9!!Y=!\"II!#Y=##YA##Y9#$IA#&I=(&IE$%)E(#IA!'9E+%II##99!"
- "!)Q!#9M!#9=!'9M'$)M$#YQ#%II#$)Q$#IM\"#J!!%YE!$)Y##IY!#IQ!$9Y$$I]&"
- "&IY.$:)!%YM.%)M($Z!&\"Z!\"%9])$:!$$I]&$J%&%)]($:-#&)Y!$:!$#I]!$:)!"
- "#I]!$9]$%IY*#J)!#J)!%YU!$IQ%#IY!&*!$%*-'!I]#$9U$#Y]\"#YU\"\")M%\"I]'"
- "$)Y##Y]\"#IY!#9U!#9Y#\"YY!$9]$')Y\"$)Y#\"YQ!#9I!#9U!\"IE$%)M!#IY!$IQ&"
- "#9Q!#)Y&#YQ#%)M($9Y$%9I%$9E%#YI#\"YM\"!9I\"#IA\"%9E\"#Y=\"$)A!\"9E&#91!"
- "#9A!&9=&%Y=!\"I=!\"IE!#Y5##I9\"\"I9!#Y=\"#I-%\"Y-\"#91$#9%$!)5!!Y)!\"I)!"
- "\"8U!$Y-(!Y%!$)!$\"I!!\"H]!!Y!!#XY!&HY)#)!##8U$#8Q$!(Q!#XI##HQ%#HY%"
- "#8I$#8M(\"XI\"#XA!!8E\"#(A!#85%#X5'\"89&\"85#!(5#%(1$\"(1##H5&$8!)!(5!"
- "#(%$#85\"\"8-!\"WQ#\"7Q!#GU$\"X%\"\"WU##WU%\"WY#$'M!#'Y$#WQ'\"WM#!G=!\"'A#"
- "#'I'!W=\"#G1$\"79&!71\"!W%$!W1&!'-!#')\"!79\"!W%\"\"'5#!W)(#F]'\"&Y!!FU!"
- "!7!%!FY#\"VI&!FU##&Q#!6U\"\"6Y#!F]!!F]!!6]\"\"&]\"!G%!\"'5\"#G-)!'9%\"'%#"
- "\"G1#\"75,!W9\"!G1!!W5\"!W5\"!GQ!!GE!#7Q#\"'Q##8%*\"7U!\"WQ#\"WU#\"GY\"!WM)"
- "\"W]#!G]!#()$\"'Q\"#(%&$(%(#H))\"(1\"\"H-!!X)!\"HA\"\"85!\"85!\"XA#\"X=##(E$"
- "\"X=#!HA!\"8A!\"HE!\"(I%#HE%%8M'#HQ&#8M$#(U#!)!!$)%!#(I##XY&#(]#&)%*"
- "#8]$#91!$Y%!$I!$$I%'$Y)(!Y%!#I-\"#I-%#)9##I%%#)-#%I9.#)9##)A&$I9#"
- "\"I=!\"I9!!YE!!Y9!$YU'#9M!$IE##9=!!IA&#YM&$)I$%)E!%)A$$9A%$9M!%)Q$"
- "%)M(%YQ$!YU!#YM)$YI*$)]&#9Q!#IY!#IU!$Y]&$9U!$)]#%*%'#IY!$IY\"#:!#"
- "#Z!\"#Y]\"#I]!$Z!\"%)]$$9Y$$*%##J%!$Y]'$:!$%J)*&*%!$J%&&*!($9U($I]%"
- "$:%$%*-'#YY\"#J%!$*!#$9Q!#J%!\"YQ!\"J%!$:-$#IY!%*1##J!!!*!!\"J!!$J!%"
- "%)](#9]$#I]!$9U$%)Q!!YQ!#J)$$YM#$)Y#$9U$$IY\"%)Y!#9M!&)](#9I!$)U#"
- "$9M!&)U$#)U##9Q#$*%##J%!\")M,$IU%$)M##YM&$YI&\")E\"\"II$$YE##YE#%)-("
- "%)E$#IA!&9M&\"I1!\"YM\"\"I=!\"99#!)9*#9-!\"I1!#95!\"I9!#))##I)&#95$\"I)*"
- "#(Y!!Y-!!)-!#I%##I%##I!#%)1(\"I)!$8]\"#8Q!#(U#!(U!!8U(!XQ!\"8Q!!HE#"
- "\"8E!$HI$\"8I!\"XE(#XY#!XA!#H5&#(I##(5$!(9!#(5$$85&#H)#$X1#$8-&\"X-\""
- "#85'!WQ'\"8!!\"X!#\"WY!#GY!\"X!#\"(%%#']$#'U'\"WM##WA'\"WM!!GQ%#'I$!GE#"
- "$'A&\"7A$\"'=!!W%\"!G=!!WA!#W=%!G1!\"7%$!'E%!G)!!FY!!F]!\"6Y$!F]!\"6Q$"
- "!&M'!FM!!FY!\"&U#\"&U#\"&Y\"!FU!!V]$!'!!#&]'!'%##7-#\"75&!G-!#7)#!G1!"
- "#'5&!G-!\"GE#!WA!#7A(!GM!\"7I##GM&$'Y(\"WA!\"WQ%!GQ!!WQ$#7Y%!W]!\"7]!"
- "!'U!#W]%\"X-##85%#()$\"85!\"(%#\"8!!#(1!$(9(!H-!\"89!\"X)#$(E'\"(=\"#XA'"
- "\"8A#\"X=#\"HE!#XY#\"XM\"\"H9!#(I#\"(I%\"8U!#9!!#8I\"$XU$\"(]\"\"Y%##XI!%)))"
- "#9)!$)-$$Y-$\"I-!\"Y%##)1##Y5##9=!\"I5!\"Y1\"!Y-$\")5\"$I1&#Y)&$9I%\"I9$"
- "#)5##YI##99!#)E##IE\"#IE%!YI!$9A$#9E!$9M!\"YM\"#9U!$)A$#YQ##9A!#9U!"
- "$9I$#)U#$9]!#II\"$99%#9]##J!!%9Q)&9Y\"$Y]'$9]$\"I]#$:!$%YI!#9U!#Z)\""
- "\"9]\"$J!%$JA!#J!!#YY\"#Z!%$:!!\"Z%$\"YY$!Z-!$Z)##J-!$IY&#J!!%)]!%Y]'"
- "$J!&$*%##J1!%*!#%J-%!*%!%)I%!*-$$I]\"#Y]\"#9U!$*-#\"J%!#J)!\"YY\"$*!#"
- "$*!#$*%##J!!!YY!#J!!!YQ!$*%#$J!%$)]##J!$#J)!#)]#$)]#&:!&#IU!#YY\""
- "%Z%+%9U\"$9U$#IU\"#IM%\"J%$#9Q#&II($9]'$9Q!$YM#$YU#$II%#9Q!#YE\"#9I!"
- "$)=$$)A!$II&#)A&$YA$$IA\"\"I=!$YE&\"I1!#))##)9#\"))\"\"I5!\"Y-\"\"XY\"!Y-!"
- "\"91##)-##))#\"Y-\"#)5##Y)##(Y!#9!!&Y!.\"X]\"\"I!!\"HY!#8]'$(Y'#XI'!8U%"
- "#XQ&\"8Q!!H]!\"8Q!&(M!#H5#!HE!!8M%\"HA!#H9&\"H=\"#81%#X5'#(5!\"X-\"#8-\""
- "$(-(\"8%!$(5&#H%&!H!#\"8!!$GY#$(!%#'U$\"WU#\"GA#\"GQ\"\"7M!#7M%\"7]!#7I%"
- "!WU\"#'5'\"'E#!G=!\"'9\"#'9$\"'5#\"7-$#71%\"G5$\"'-!!G)!!G%!\"G%#\"FM#!FY!"
- "\"'!##&Q$#&U'!FU!!&]!\"&Y\"!F]!!G!!\"'!#\"'-#!')#\"W)\"#7)#!G1#\"'1\"!G=!"
- "!W9\"\"7M#\"'=#\"'Q#\"W=%#GM(\"GI#\"'E#\"WQ#!'Q!#'Q$!'E%\"7U!!'Y#\"W]#\"W]!"
- "\"WU#!X%$\"8%!#X%'#81%%(-'#X1&\"81!$(5(%(=&#(=!\"H9!#(=##HA\"\"XQ\"%8=$"
- "\"8E!!HM!\"8E!!89\"#(M#!XM!#(U##(Q#\"XU\"%8Y&%)!+!HY!#(E$$XU%%)!##Y1#"
- "#)%#\"Y)\"\"X]\"!)1!#I5%$)9$\"Y1\"#Y9#!Y5!#YE%#Y5##I=%$9=%\"IM!#YQ)$)A#"
- "#YE#%9Q)%9A\"!YA'#YI##YQ%$)U#$YA$#YM\"#YQ)%)=!'9M+$9Y!#9U!#IY!#)Y#"
- "\"IM!!IY#%YU*#YY\"$*%'\"J!!#)]##I]!%9])#9Q!$*%#$Z!#$:!$'Z!%!J!##Z!\""
- "#Z%&#J%!#Z%\"#J%!!Z%!%IM&$J1%#J!$\"J%!$*)#%:1!$J)\"#J1!$Z!\"#Z!\"$Z!#"
- "#:1##I]!%Z)##J)!#Z)\"\"J!!%J)\"%Z-#$J%!#Z-\"$:-$#*5\"$:%$#J-!#I]!$*!'"
- "%*%##J5!$:%$$:%$$*1#\"Z-!#)]##Z!\"$)]#$*%#$9U!$*5#$Z%&$)]#$)Y#$)]#"
- "$I]%$)]#\"YU\"$9Y!$I]&%9Q(%*!!\"IQ!$IE%$9Q!%9Q($Z%#$9Q%%IQ##9I!#9I#"
- "%II*#9=!$)I!$95%$9U!#Y5#$IA%%99##Y=#%9A#!9I)\"Y1\"$Y5*\"9M#\"I5!\")5%"
- "#I5\"$I-'#)5#\"Y-\"#Y)&\"I%%%9!&$I)&#9!!#Y!#&(Q'\"I!!#HU%#8U$#(M##8M$"
- "\"8Q!#8U$#XI'\"XM\"#(I#!HI!\"XA#\"XE\"!HE!#(A$#(I#\"XA#!(9'#X5&#81\"\"(1#"
- "\"X1#!8-\"#H)%#H)%%'U\"!GI!#7Y\"\"G]\"\"W]#\"'Y%\"WU##7Q&!WE$\"7U#\"7E!$'M&"
- "$7M&\"'M#\"'9\"!7A$#'5&\"G9\"\"71&\"W5+\"'1!!'-!\"G-\"!G-#!G)'\"'%!\"7%$#VY$"
- "!&Q!\"W%#\"&U%\"F])!VU\"\"F]%!V]&$FU)!G%%#7)%!W1\"!G)!\"71#!G%'!W5\"\"G=#"
- "\"G-$\"'E!!G9!\"'A#!WA\"\"'A!#GM$$'M!\"8%!#7Q(#GU&!GY!#'Y$!WU$\"7Q&$H!\""
- "#(%$$X%#!X!!\"8)!!8-%#(5#\"89!!(5!\"X5##XI##(=#\"H=!#8A!$(=%\"XE#!(9#"
- "\"XY%#(U##XM!\"X]\"$9!($(]!\"8M!\"HM!!HM#\")!##(]#\"I!!#Y%$$I!'!Y!!#I!%"
- "\"I)!\"9-#$Y1!#I)\"\")=%$I1#\"Y5\"$)9!#95$%I-$#9A$#Y=#\"IE!$)I#\"I=!$9M$"
- "\"Y=\"%)I%$9Q!#9Q!')I*\"YQ$\"9M&&)I\"#YQ\"\")Q\"$9I\"#I]!%)E$$YY#$)U#%)Y!"
- "$)Y#%)I%#IY!$)]#%I]*$I]%$J%!$9]$#Z!\"#Y]\"#J)!$Z%&#Z%\"#Z)\"#YU\"%:)%"
- "%*-#%:)($*-*#Z!\"#Z)\"$*)#!:)\"#J-!#Z-\"#Z-\"%*-'$:-!\"Z1!$:-!#Z1\"\"J-!"
- "&*-'#*)\"%Z5-#J1!$:-#$:-!$*%##Z5\"$Z1&#J!!#J%!%Z-#!*-!\"*)%#Z1\"&:%%"
- "%*)'!:-%#J)!&:5)!Z)!$Z%&#J)!#J!!%:%!#J%!#J=!#J%!$:!!#:5#$Z%&$:!$"
- "$*%#$J!%#9U!#9]$$*!##IQ\"\"9I&$YU'%IY&#)A##IQ!$9]$%)U(#YM#&)]($)U#"
- "#9U!%9=)\"I-!#YI#\"YQ\"$IE#!YE!#YI&\"9I#%YQ!#Y=#\")=\"\"Y=\"$)9!#)9#!)1!"
- "#)-#$I9##I1%#)-##I-%#))#\"Y)\"\"I)!$9%%$I5&#I!%#(]##XQ'!Y%!!9-\"#X]&"
- "\"XM\"#X]&$8I#%8M*#(M#\"HY!%(I#\"89#$8E&#(A#$(E$#H9#!H=+%HA##X1'$X5+"
- "!H1#$(-%#GY#\"8)!#X-'\"8!!\"X!#\"7]!!G]!\"7Q!\"WU#\"GY\"\"7U$!'Q##7Q%%7I("
- "!GM#\"WA#\"'Q\"\"7A##'9$\"7=!!GA!\"'9!\"'-!\"79$\"GA%\"71$\"6]$#&]\"#7!&\"&Y#"
- "!FE!\"&M#!6Y\"#&Y#!F]!!F]!\"7!$!VQ\"!G!!#7)'\"'-#\"G1\"!'5$!G5#!G9!!WQ$"
- "\"'=#\"GA##'9'\"GU\"\"GU$\"'I!!'M&\"'A!!WQ!#7U%\"W]##8!%!7U\"\"WU#\"X)#\"H-\""
- "\"8!!!H-!\"(!##(5#\"X-##(5$#H5&\"HE!#(5&$HE*#8Q$#(I#\"8A!\"8E#!(A#$(U!"
- "#HM&%(Q##(Q#\"8M##(U##(U#\"Y%#\"XE\"#XY&$))!#9%!#(U!!9)\"#XQ#$))$#9%$"
- "\"I1!\"8]#$Y%'$)1$#95$#I5\"$I=&#Y9#\"IE!\"9A#%)M!$Y=#%)A(#9E!$9E%#9I!"
- "!YE!#II!#9M!$YU&#9M!$IQ\"$)U#$IQ%%*!$$IY%$IQ&$:!!%)Y'\"IY$#Y]\"!9]&"
- "!9U\"$9U!#J!!%:!$$J!&#Z!\"%:%!\"IY$&J%&$J))%*5#$*%##Z1\"%Z)'$Z1&\"Z)\""
- "#Z%\"!:-)#J-!')]&$:%$#J%!!:1\"#Z)\"#J-!!Z-!'J1*$*)#$Z1&$:!!$Z-#&:1%"
- "$J5!$:1##J5!\"*5\"%Z1&$:1!#J1!#J-$&:--$:1$#J!!&*-!\"J!!!Z-!%J-\"#Z)\""
- "%:%!#J9!%J-\"#Z-\"#Z!\"$:%$#Z)\"#YY\"$I]\"$:1##J)!$:)!#Z%\"!*!!#Z%\"$)U'"
- "$YU#%)Q$#Z!\"#Z%&$J%%$)]##Y]\"$9Y$$)M##:!#$*!#%)Y+&)I\"#I]!%*)$#Y=\""
- "%)Q!$9Y$$)A#$*)#$)Q##YI##IQ%#YE#$)E$%9M%$YE'#YE\"#9-!\"IA!$95(#Y5#"
- "$)9!!Y1!\"I9!\"Y1\"#)=#!Y=!#)-##)%$$))$%9%*$)!!#Y-##I!%#)%##(]#$8U\""
- "&)%*#XQ!\"8Y!\"(Q%#I)%!H]!#XE&\"I!!#XE&\"8E!#89!#(I$#89%#(A##(9!#XA!"
- "#(5!\"X)#\"81!\"X-#!H1!#H%(\"X)#$X5%\"H%!$'U#\"8!!!GY!!X%'\"GY\"$'U#\"7U!"
- "#WI%\"7I!\"GI#\"'9#\"GE%!G9!\"G=%\"'5\"\"W9(!G1!\"G1%\"7-$#'-%#'!'#W)##'!'"
- "!G)!!&Q!\"F]#\"&U!\"7!\"\"6](\"'!#!W)\"!G1!\"'!!!'5#!71\"\"'5!!G9!\"G9\"#'-'"
- "#G))!'=!\"GA$\"7Q&#WE%\"WM#\"WQ##7E(\"WU!\"7U!#G]!!WQ$\"(!#\"H!!#(!$#G]!"
- "\"8!!\"8M!\"X1#\"85+!X=&\"X=#\"X5\"$H9$\"XE\"\"XI\"#(5$#(E##XM$\"HI!$(I%#8M$"
- "#8E$#)!#\"(I\"\"8Q#$(Y(!HY#\"HY$#X]##)!'$XU!$8]\"!Y)!#I%\"#I)%#)-#$)1!"
- "#Y1##I5%$)5'\"I5$!9E\"#)5#\"Y-($)5!$9=\"#)M#\"9=#$YE&&9A-%YE!!IE)#9A!"
- "#IM\"$9E\"#YA##YQ\"#YE#%YM$$)U#$)U#$9U!#IY!#YM%$:%$%Y]-#I]!%Y]#%YU("
- "$)]#&*!!%:!!%:-(#J)!#I]!'*-!#Z9\"$:)$$J1%&J-'%J%&$9]!#J1!&*-+$*%#"
- "#Z1%$:)$$:1##J1!$J1!\"Z1!$Z=&#:1##Z1\"%J1\"$J5%#J1!#J9!$:E##Z5\"%*5'"
- "#J1!$*5\"%Z5&!:5\"#J5!#J5!#*9\"$:5#%*5##J-!!ZI!%:5(#J9!$Z1\"\"J1##Z-\""
- "#J1!$Z1\"#J%!%*1##Z5\"\"J1!#Z-\"$:-!#J-!$*-'#Z5\"#Z-\"$*-#%:)!#I]!$Z%\""
- "\"J)!#J-!$J5!&Z)+#:-#$J-\"\"J%!':-*$)]##YQ\"#J!!\"YY$$IY%$*!##9U!%IQ'"
- "%9Q)#9Q!%I9!#YQ##IE(!YY$#9I!&)I,$9M!#YE\"!YI!#9E!%I1'&)E&#I=!#Y=#"
- "!I9)#95$\")5\"%9-'#Y9#$9-%#)5#\"I-!#)-##))#!Y-$%)%)%I%!#I-\"\"I!!\"Y1%"
- "\"XU\"\"HQ!$9!#\"HU!!8U\"#8U$#(U#\"XM\"!(E!#(I#$8E)#HE#\"HE!\"85!#H=\"\"X9#"
- "!()!\"X5\"\"8)!!8-\"#H-#\"81!#8)%\"X%\"\"GY\"\"7]!\"8%##'Y$\"'Y#!W]!\"W]#\"WQ#"
- "\"WQ##GQ!!GE#\"G=\"!7Y%\"GE%\"W=#\"'9\"#W1%!W9&\"G9%#'1&!W5\"\"7%\"#'!'\"G)%"
- "!FI!!VY\"!G!!\"&Y!!W!$!G%!!G)!!'9#\"G-%\"G1#!W1\"!W5$!W9!\"'I!!G1!#79'"
- "\"WA%\"'E##GI&#'A$\"7M!\"GQ\"#'Q$\"WU#\"WY##7],#(!$#X!!#8!\"#(!$\"8)!#(9!"
- "\"8)!\"X-\"\"8-!\"(5%#X-$\"X-\"$HA$$H-$#8A%!8=\"\"(=(#HM)#8Q$\"X]\"#XU##(Q!"
- "#(Q##(]##XY#\"8]!$XI%$(]'#H]%$X]$'9%/#I!#\"I)!\"I)!!95\"#9-!$)1'\"I5!"
- "!Y9!#95$$9)%$99\"!Y1$\"YE\"$)I$$95\"$)A$$YA$$)E#&9E##9I$$9Q!#9M!%)E("
- "#YQ\"&)Y,%)Q$$YY&$IU%%)I($IY%!YY!$IY(%I]*$IY)$I]\"$I]\"\"9Q#$*!#&*)!"
- "%J%\"$:%$%J)\"$J)%%*5'%:%!#Z%\"#J)!#J5!$:-#!*-!#Z-\"$*5\"%:1)#JA!\"J1!"
- "'J-'%J9\"#JA!#J9!$J)%$J5!#)]#%:5!$*A#%Z=#$J5!\"Z5!%J9)$JE%#JA!#J9!"
- "$*=##*9\"\"Z%\"#Z9\"\"*1\"#J9!\"Z9!%*=#\"*1\"#JA!%:E(&*9+\"Z5!$:)!\"J%!%:1!"
- "!:-\"#J1!!9Y%#J)!#Z5!#Z9!!Z!!#Z%\"$J1($*5##Z!\"\"Z1!!*-%%:)!#J-%!:-\""
- "%Z5#%*)##J)!!Z)!#J-!#Z-\"#J%!$J%)#I]!#Z!\"':)&%J))$I]\"$Z!##9Y'$)Y#"
- "#9M!#YM\"#9U!#I]!#IQ+$9M%#)Q\"%)Q!$)I##IE!$II##9Q!!IA)%IE$!)A!&)-#"
- "#Y9#!)=!!)1$\"I-!!)1!#)-#\"Y5\"$Y5$\"Y1\"#)-#%)!\"#Y)&$Y%+$)9!\"I%!#9)!"
- "\"I)!\"8Y!$(]$#8]!#(I$#8]$#HU%\"HQ!#(M!\"8M##HI%\"XE\"!HA!\"HE!#HE\"%8=%"
- "\"85!!H=!!(5!#85\"$H1*#H-#$(-##81\"\"H!\"$H%(\"8)!#(!$\"7]!$H!*\"8!!\"7U!"
- "#GM&#WU'#8%$!GI!\"GI\"\"'E!!7A\"\"GA.\"G-'\"'9\"\"G9\"$79$\"'=\"\"71$\"79#\"7!&"
- "\"&Y!\"&Y#!&U!\"W!(\"&Y!\"'%#!'1!!W-!$'-(\"G)'\"G9$!79\"!W=\"\"7I$#'A%\"'A#"
- "!GA!\"'9!#7I%\"7Q!\"GI#$GQ\"%'Y'$'Q!$7Y'\"GQ\"$7]$#W]%!H1!\"8%!#(%$\"(-\""
- "#8-%#(5!\"X5#\"85!\"8=!\"X=##(9!\"XA#\"XE\"\"89!\"(I\"\"8A!#(I##HM%!XU$$(U%"
- "\"8Q!$I!'#HU%#(U#\"I!!$(U'&)5&\"H]!$)!!!Y)!\"9-##I-%$9-+#9-!\"I-!!Y9$"
- "#)5##99$$99%#)1##)A##9A!$IA&\")E\"%IE*#9M!$IU\"#YM#$YM&$YU'$9Q%#99!"
- "$)Q$#9Q!$IE&%9U%#)Y\"%)U!%IY'!YM!$9]!$*!#%:)($*1#$*1#$*%#%:%(#J1!"
- "$Z%##J)!#Z)&%:-!%YY$#Z-\"%:-!%*='!Z5!%*5'\":5\"%:5+(*9!#J5!#J)!#J1!"
- "$*A&#JA!#J9!#Z9\"$JA!#Z5\"':1\"\"JI$$Z9\"!*9$$*M\"#ZA%\":E\"#ZA\"$J%&$J=%"
- "$:=$&*E(#J=!\"Z=!#J9%\"Z=!&:=,#J9%$ZA\"\"ZU!#Z9\"%JM)\":5*$J9!%:=!$JA!"
- "$J9!%:5(\":5\"!*%!%ZM\"#J5!$J5!#:5##J5!$Z5\"#Z-\"#J1!\"J1!!Z9!!*5!\"Z%!"
- "#Z-\"#J1%\"Z-!#J-!#Z)\"&Z%!$IU\"$J)\"$J-!%*)'#Z%\"$J!&#*!&$)U#%9Y%#I]!"
- "$)]#\"IY!!)Y!#9Q!$9]$%)U!%IQ##YE#$)E#$IM\"\"IM!#9M$$)9!$)E#\"9E#$IA#"
- "#IA!#YE#$I=&#99$#9)$#)9)#I-(\"Y5\"%91&\"Y=+\"I-!\"I!!#9%%\"Y!#$Y%$#))#"
- "$I)&\"H]!\"8]!$)%!!HQ!\"8Q!#(]##(Q#\"HQ!#(A!\"X=#\"8I!#HI%#8E%$(A($8A)"
- "\"8A!\"X1#$H5*#(1$\"81!#81%#81\"\"H)%#H)##8%%$H%'#H!&#H!$#X%'\"GM\"\"WU!"
- "#WQ'\"GQ\"\"WQ%#7E%!'Q#\"GI\"#7A%!'A!#'E'!G%!\"WM&\"'-\"\"W5%\"'1#\"'1'!W-!"
- "\"'!#\"V]&\"G%\"!W)\"\"7)$\"7%(\"W-(\"71#!V]\"!G-#\"75(#W9\"#7=&\"7=$\"7A$!G9!"
- "!GI!#7M%#WM'\"WU#\"WQ#\"7Y$#7Y%\"7Y!#'Q\"$WU&#8!%!H!!\"8)!#85%$8-!\"85!"
- "\"81!\"X5\"\"85!!(9!#81\"\"XA#$H9%!HA&\"8E!$XI%#(I!#(M&!Y!$!HQ&\"(Q%!HE&"
- "!HY!$8Y\"\"8]!\"Y%#$)1!#9%%#I!#\"I%!#))#\")-(#Y1##)1##)-#$I5#\"Y1\"\"Y%\""
- "%)9(\"Y=\"#9M$$)A$#I=!#9A!#YE##IE$$YI'%99)#IE!$9E$#9Q$%)Q!$)I!$YI#"
- "%YU*#J!!$)Y##9]$$IY&!YM!%YU#\"Y]$%Z5\"\"Z!%\"J!!&J)*#Z)\"#J1!#Z)\"$*)#"
- "$Z1&#J)!#J-!\"*-\"\"J)!%*1#$:!!#*9\"$*5#&:9($J5!$:E#$J5!#Z)\"$*9##ZA!"
- "#*=\"#ZE\"$J9!#J=!#JA!#JA!$Z=%#ZI\"%*9'%:=$$:9#$J=!$*A#$ZA&&Z5#&:E!"
- "%*A'!:A\"$JE$$JI$$*A#(:9.%ZQ%$JQ!&*=($JA$&Z=.\"Z9!#J9!#Z=\"#Z=\"#Z9\""
- "#Z=\"%ZE\"#JA!$J-\"$*=#%:=($*5\"#J=!#J1(#JE!#J=!#*9\"#Z5!$:5$#ZA!\"Z-!"
- "$:9#\"J1!#:-##JE!#J1!#*-\"%J))%:)!$IQ&$J1\"%*1+%J!\"#J%$%:!\"$9Y$$IY%"
- "\")Q\"$9]!$Z%\"#)Y-$)Y#$YM'$)]#$9Q$$IU\"#YQ#$)Q$\"J)!#9Q!#9A!$)I$$IA&"
- "$I9#$9=%$I=#$)9$!I5#$9=%#9-$%)A\"\"I5!#Y5&%)1(#9)$\"I-!\"9-##H]\"\"I!!"
- "#9)!#)-##I!\"#XY!%(M)#8Y!!8U\"#(]#\"9!#\"XQ\"%XE##8M$#(M##XM!!HI&$8=("
- "!HA!\"X=#\"8=##(5#!(9$#H5&$(%(\"WY!#X-$#(-$\"X)#!H%!!H!!$'Y!\"8!!\"7Y!"
- "#'E$\"WU!#']$#7I##WM\"\"7Q!\"WI#\"'E#\"7I)!G=(\"W9!\"G5%\"79&\"WI#\"')\"!G1!"
- "!6]\"\"6]&\"'%#!7!\"#'))\"W-&#7%*\"'1!\"'5##W1*!W9!!W=!\"GA%\"'9\"\"GE\"!GM!"
- "$'Y&\"WY#\"GI#$'M#\"7U!\"WY%$GM#\"'Y%#GY$\"WY#\"7]##X=$!(%!#()!\"81!#(1#"
- "#H-##H5#!HA&\"8E!\"X=##(A##XE!%8E$!(E!\"XI\"!XI!#(I$\"HQ!#XU!#(I#%(Y\""
- "!HU!#H]\"\"Y!##9-!\")!#&)%'#9)'!Y)$#9-!#9-!$9-%$Y=*#91$%I9$$95\"\"I9!"
- "#9=$#Y=#%I9.$9E$\"IM!#YQ\"#YI##9=!$9M!#YM#%IQ*$YU##YI#$YY'$)U#$YY'"
- "$)Y##YY\"#I]!#YE#&:!*\"J!$$Z!'$*%##J%!%J-\"$J-\"\"Z)%#*%#$J-%#*-\"$J-\""
- "$*)#$:-#\"J1!#Z5\"$J9%#Z)\"%J5)#J5!#J9!&:9%#:5#\"*=\"%J1\"#J9!$JA!!:E\""
- "$Z1&#Z=\"!Z%!#Z5\"$JE!&JA-#JA!\"ZI!#JA!#JA!$ZA\"$*=)#Z=\"%*I#$*Q\"%JE("
- "!ZM$#ZI\"$ZI&\"ZE!#*A\"#ZQ!%ZE\"\"ZM!#ZI\"#*A\"#J=!$ZM!#ZA!#ZA!$JQ!$JQ%"
- "#JA!#J=!$*A##ZA!#J5!&JE)#J=!$JA!#ZE\"#J1!#J9!$:!$%:E$#J9!\"Z9!#Z5!"
- "#Z-\"!:%\"%:9!$J1\"\"Z1!$*!##Z-\"!:-%#Z-\"$:-!%Z-&&:))$:)$$:%$%*!($9]$"
- "#)]\"&J!#%J!&$J-%$*)#$9Y!$9Y$%YM!$)U##YU\"\")Q\"!9M%#9M!$)]#%IA'#9M-"
- "#YM\"\"9I#$YU#%)=(#9E!#Y=&\"9=##)A##9A!!9-\"#)5#\"I!!!91%\"I-!$9E%!Y)$"
- "&)9\"#HQ\"#I!#$9!##)!##(M##9!*$(I'#I-%$(M%\"XU\"#(U&!(=!\"HQ!!8E%$(E%"
- "!HM#!HI#\"X=\"\"X=\"\"(!##85%$8=##(=!#H-#!(9!\"H)\"\"X!!#(%$!X!$$H!%\"W]#"
- "\"7U!\"WY!!GU!\"7Y!\"WU#!WE$\"'I!\"GE\"!GQ%\"G1$!GA!!'A$\"7M!!G)#\"W1(!G1!"
- "\"'!%!6]%\"'%#!W)\"\"G5\"!G-#!W-!#75%#'5%\"G5%!W=$\"GA%\"'E#!'A$#'E$\"7]!"
- "!GM#!W]\"#'E$\"WU##WY\"#W]'#7M#\"X%#$(%(#X1&!X)\"#H)#\"89!$H1'\"X)#!HA!"
- "#(9$\"8=!$8=##8-%#H=%\"XE\"\"8E!#HI\"\"HI!$XM+$8Q)\"HI!#HU%#HU%$(Y'#I)%"
- "\"I!!#I)\"#9)!\"I)!#9!!$9)+\"I1!#Y%$#Y)'#Y)#\"Y5\"#Y%'#Y5#\"I9!\")A%$9=!"
- "$)E#$)I!\"9E#$)A#$)A!%IA*%YI!#9=!#IE\"#IY!!YU!$9M!$*!##YY\"#Z%\"#9Q!"
- "\"IY!$YU#$:!$$*!##)U#\"Z%!%I]*$*)##J-!$J%!!J-#\"Z9!%JA%$9]!#Z!\"$J1!"
- "#J1!#Z1\"&JE)%*9#%*I'#JA!$:9$!Z-!&J9\"#Z9\"#JI!#J=!$:E$#J5!\"ZA!#*A\""
- "#ZA\"#ZQ!#JA!$:)$\"J1!#ZI\"#JE!$JE!$ZE&#JE!#JE$\"ZE!$JI$':E%$*I\"%:U'"
- "$ZI&%*I#\"*Q\"#*]\"%:I$%*Q'$J=!#ZI\"#JM!%JE)$ZE\"#JE!\"ZE!$:Q##JA!\"ZI!"
- "#*M\"#JE!$ZE\"%*M\"#J=!%:A(#JE!#*=\"&:E!$*=\"$:=##JA!#Z=\"%*9&#JE!#*9\""
- "!Z9!!ZA!#J5!$Z-&\"ZE!&*)(\":1##J9!!:9\"%:1!#Z)\"$Z!\"#*-\"%:)!#J1!!YU!"
- "#J%!#J%!\"J!!$Z!'$*%#%9U)$Y]&#9]##Y]\"#IY$\"IU#$IU%#IQ$#IU!#)Q#))U,"
- "$9I\"%YI+$9A$\"I5!\"IA!#II!#9A!#)=##)A#\"YA\"\"I9!$9)(\"I5!\"Y1\"%Y=,!9-\""
- "!Y9!#HQ%#91!#Y%##Y-&\"9%#$(U$#X]##X]&#(Q#!8Q\"$8Q\"\"HQ!\"XQ\"$XI+\"HM!"
- "\"XE%\"89!!8E%\"X1#$8E&#H9&\"HI!\"(5\"#X1'#(=!!X-!\"8)!$85)\"H%!\"H!'!()!"
- "$7M$\"W]##7U%#(%&\"WQ!$WQ+#GM&#'E$#GE&\"'A#!7A$\"GA#!GA!!75'\"G1)\"'E%"
- "!G)!#G%\"#W%#\"71#!G-!\"71$\"W5#\"'5\"\"'I)\"'E#\"WA!!G5!!GM!\"'E!#7A!!GQ!"
- "\"WU!\"GU\"\"7U#!7]$!GM%\"8!$\"GU\"\"X)%#X%$!H)#$89(#HE\"\"X5\"#85'\"X5#\"89!"
- "\"(1##8I$\"XA\"\"(I%$8M#\"(A\"#HM##(M#!XM$#(A$\"8U!#95!#I%%!HY!\"X]\"#XY&"
- "$HQ##I!\"'9%%#I%\"#9-!#91!!Y)!$)1'!I=##)5##95!%9A&#)5#$Y9'%9E\"\"I=!"
- "\"YU$\"IE$#)9#$9U$#Y9##9Q'$IM&$IQ\"#9Q!#9U!%IY##9U!$)Y#\"IY!$Y]'#*!#"
- "\"J%!$*!#%)]!$:!'(:%+\"Z)!#J)!#J)!$9Y!$J-%$J-!%J%\"$J5%#J1!$:5##J5!"
- "\"Z9%\"ZE!&:9,$J5%$J=!!Z9!$*9\"\"ZE!$*9\"$:I$#ZA\"#ZI\"#ZA\"$ZE%$ZE&$*E\""
- "%:E!#J=!!:E&\"Z=!\"ZI!#JI!$ZI%$:I##ZM!#JE!\"Z]$&:Y,#:A#$ZI!$JI!#JA!"
- "#JE!$Z9&!ZA!!*Q!!ZI!%*9&#ZU!#ZQ!#:A##ZE!&*E($*9##:U\"#ZM!%:I'&JI!"
- "$JE!':E1#:U#$*E\"'*U#\"Z5%#JM!$J=!#JE!#J=!#J=!\"Z=!$ZI\"#JA!#:=&\"Z-!"
- "\"ZE!$*I\"#JE!#J5!#Z9!#Z9\"$J5%#Z5\"#J!!$JI$#J1!\"*1%#J-!#J-!$*-#!:-\""
- "#J1!#J%!#J%!&:-)#J!!$*!##J!!$9Q!$I]&#Y]\"\"IY!%)Y!#)]#$)Y##9Q!$YQ#"
- "$)U#$)I#$9A$#IU\"#YE\"$9I!#Y=#&)A,$)A$#)M#\"IE!\")=\"!Y)!%Y1+\"I)!\")9\""
- "\"I-!#Y5&$)-$\"8U!#9!!#(Q!%91)!)!!$(]$\"(M\"#I!)\"HU$$HM*#(E$\"8]!!8M\""
- "!XI!\"8Q!%8E'#8I$%XE#\"81!\"85!\"89$\"X)\"!(1!$X5%#85%!H9(\"H-\"#X%'!G]!"
- "%']'#W]'!GU#$'Y(#7Q%\"7Q!\"'Q#\"7M!#'I%#7I%\"GA$\"GE%!W=$!G=#!'-#\"G5%"
- "!W%\"!W%\"!7)\"!G)#\"W5%#'5$#G5&!'=!!G9!\"'=#!GI!\"'E##'A$\"'E!\"7U!#7A#"
- "\"7Q!!GU!\"7Y!$GE#\"WY##GU&!G]!\"G]\"#(%$\"8)#$7])#(I$\"81!#8A\"#(A#$H9*"
- "#X-'!H=!#8A%#85\"!HA!!8I\"$8Q(\"(M\"\"8Q!$HM)\"XU\"#XY#\"XY\"#(]#\"8]!$I)'"
- "%Y!&#9%!\")!##))#\"I-!\"Y5\"$I)#\"I5!$I-&#)=##Y9&#IQ$$Y9$!YA!#9E!#YQ#"
- "$IE&$)E$#IE\"#9U!#9M!&)Q(&9M.$)U#$IQ&$9Y$%)]!&9Y&%)]!$I]%%:!$%Z%*"
- "$*)#$:1!#J1!#J)!&J-'\"I]!%J5%'Z-('*9%#J1!$:1#%:=!#Z=!\"J5##J9!#Z-\""
- "\"*9\"#*5\"#ZE\"#*=\"%*9&%JA%&:A!#JI!#Z9!%:A!#JM!#ZE!%ZE*$ZE\"#ZE\"%*I#"
- "#*I\"$:I#&:E$%JQ!':9\"#JM!$:E#%*M&#JM!#JA!%JI)#Z]!$J]$%*Q*$JM$#JA!"
- "\"ZM!#ZM!(:M*#:M\"$:M$#:I#%JI!#ZY!#JM!#JM!'JI&#JM!$ZI&#ZE\"$JI$#JM!"
- "#JM!#JI!$JI!#JE!%JY(%*E'$ZA\"%ZM*#JE!\"*A!\"*I\"%*A+#J=!&*9+$:A##ZA!"
- "#:A##JE!':Q(#J1!%:E!#Z-\"$Z9&&*1!#Z9\"\"Z5!%J1-#J1!\"J)!#I]!#J%!$J-%"
- "!Z5!#*!##J)!%Z9*\"9]&$*!'#Z%%$*!#%IY'$)Q$$IY%&IY$$IY%!Z!!#YQ##YQ#"
- "\"II$$9M!$9M(#9Q!$IM%#YE\"!9Q\"%9E%#9A!&IE($)1!#9I#\"IE!#)9#$)='#)5#"
- "$I9)\"Y1\"&9-*#Y%$#9%%\"I%!$9%##(Y!!)%$#(Y##XU'#Y!&\"8Y!\"8M!#8U$!HM!"
- "$(M'\"XA#\"XU\"\"8I#\"8A!\"(5\"\"XI\"\"H9\"\"X=\"\"H)\"\"(1\"!X%'\"8-!$()(\"7]!#7Y\""
- "#H)%$(%##H%##()$#G]!\"7Y!\"G]\"\"7Q!\"'Q#\"WI!#7Q'\"'E#\"G=%\"'A#\"G9\"!'1%"
- "\"G-%\"'%#\"G-$!G-!\"G1$\"WM&!GE!!7A\"#'5$!WE!!WM!!7I\"\"7I!#GY!$'I)\"GA\""
- "\"H%\"\"G]%\"W]#\"G]\"#GY##H!&%8%#\"8%!\"(-#$(9%\"81!\"X%\"#(9##X='\"8)!\"8=!"
- "!8A\"$8A(\"81!#(I#\"(M\"#HM\"\"XU\"%8U*#8]!$8U%\"8Y#%I%+\"8]#\"HY$#9-!\"8]!"
- "$)%%$Y)+#99$#Y)'#91!#)9#!Y5!#99$#9Q#$)M&\"I5$#9E!&)A%$Y=!#9A!$YM#"
- "%)9(#9M!\"YI!$IU%#YQ#%*!#!YU$$)Y##IY!#IU\"#YQ#%)]'$*%#%9U)&*%!&J%#"
- "#J%!$:%$$Z9\"$:%$(Z-&$:-##J1!#*1\"$J5!#Z9\"$J9!#ZE\"#J5!#Z9!$*=&!*=!"
- "#J9!&*-+#JA!%:1(%JU!$JA!#Z=\"#JE!#JE!$*5##JI!#JE!#ZI!$JM%$*U\"#JM!"
- "$:E$$JM!\"ZM!\"ZM!#J=!#ZQ!%JQ(#ZQ!#ZQ!$JQ!#ZQ!$ZI%#JM!$:U##ZY!!ZQ!"
- "#JM!&:Q($JE%\"ZQ!&JU%\"*Q\"\":Q\"%*I#&*Q#!Z]!$:Q#%JQ)$+)\"$*Q)#ZU!\"*Q\""
- "$:Q#%JM)$JM!$*U\"$[!&':M!%JQ!&ZM+%ZM&&:I%#ZE\"$J5!#ZY!%:E!\"Z=!\"ZE!"
- "$*M\"$ZA%\"*A!%:A($*9\"#J9!!:=%#J-!#JE!%:9%#Z-\"$J5!$J=!#Z)\"#J=!\"Z)\""
- "%*1''*9)#Z9!$:-$\"Z!\"\"Z)!$*%#!Z)!%:)($*!#%Z!'#J!!$IU%$YU'!Z%!#9U!"
- "\"IU!%)Q'\"9Q##YQ##9I!#9M!$IA##IQ!$)E&!)E!#Y9##Y=#\"IM!\"I-!!I5&$Y5$"
- "#9A!#9=*%I1$#)-##91!#91!$9!%#9!!#9!!!Y!!#8]!\"(U\"\"I!!#(Y#\"8I#\"XQ\""
- "!(9$\"HI!\"XM\"#(I#\"HE$#(M##(=$!HE!#X1%#89%#(=!!()!$HA*#()'\"81!$(%&"
- "\"X%!#']&\"8!!#8!$#GY$#'Y$!GU#\"GQ%\"7Q!#7M#$7I'\"'E\"!'Q#!7A%\"75#\"'E#"
- "#')%!'-!#'5'\"W5&!G5&\"75$\"7=$\"'=#!GM!\"WE%\"'E#\"WE##7Y%\"GI#\"GQ\"#7Y#"
- "\"X%##GY!\"7]!\"H%$$8%&#8%\"\"WY#\"H)!!X-!#H1&\"H1\"\"89!%89%\"85!\"HQ$#H=\""
- "\"8E!!HE&$HI'\"XE#!(A!\"XE#\"HQ'\"8U!#XU&#8Y$#HI#\")!(%9%,$8]%#9%!!)-!"
- "#))&!Y9!\"I-!$Y)(\"I!!$I5#\")5\"\"I9!!9I%$Y=!#I9\"$)I$#YE%&)E)$9I%#9I!"
- "$IM%$*)##J!!%YQ'#*!&$IU%%9Y(%IY\"\"I]!#I]!#J%!$I]\"#J)!%:1($Z!&%:%!"
- "%)]!#J-%%J-\"%:1(%*=+#J1!#Z)\"#Z5!$J9!#JA!#J5!#J5!#*5\"&*A+#ZA%%*A&"
- "$Z-\"$Z9&#JA!$JI(%:E!#JE!#Z9!#ZI\"$JM!\"ZI!!*M!#JI!\"ZM!#ZU!\"*M\"%Z])"
- "&:I!$JM!%JM!$*Q\"#JA!%*U\"#ZQ!!ZM!#Z]!#ZU!#ZU!\"ZU!**U)$*]&#ZY!\"[!!"
- "%JQ!$[!!#ZU!#JI!%ZU)#JI!$J]!$ZQ%#ZU!#[)!'*U#$JI!$*]\"$Z]%%+)\"\"[!!"
- "$JU!#JM!%*M\"%:Q$!*Q$%JQ!#ZU!#Z]!#:M##JM!#JM$&ZU\"$ZM\"!:Q\"#ZE!#JI!"
- "%*I\"&:A,$J9!#JI!$Z=\"$*=#$JQ!\"ZA!#J5!#*=\"%Z1&#J9!$J9!#Z9%!*5!#J5!"
- "#J%!#J=!#*9\"#JA!#J-!%*1'%Z)+#Z-\"\"J!!%:%(#:%##Y]\"$*!#!)]!%:%!%9Y,"
- "#IU!#IU\"$)]#%9U%#9U!&IM$\"YM\"$9I$$YI&&Y9/#IE(#9A!$IA%%9=%\"I=!!I=#"
- "\"I1!\"(]%$9-(#9A$#9)!\"I-!$))%#))#%I%$%)!%\"8]#$X]$\"Y%##)%##))##8Y$"
- "$(]$%(M##8M$\"H-*!HQ!\"XI\"#(A##8A%%H=&#(E!\"8M#\"8=!\"X1\"\"X9#\"8)!\"8)!"
- "\"X=%$()(\"X!#$8%)#']$\"H!!\"WQ#!'M!\"7Q!\"GM\"\"GY\"#7I%#7I%!W1\"!GE%!WA&"
- "!G-!\"7=#\"G1$#'9'#'5\"\"'5#!W9&\"79#\"W1&$7E$\"GM\"#']$#WA#!GU##7Y#$8)&"
- "$'Y#\"G]!\"W]##(!$\"(!#\"8)!\"H)!\"X-#\"X-#$(9%#(9!#H1!#X5&&(=%%(E##(A$"
- "!HE#!XI$#(M!#8M!\"XE#$(Q!#(U#%8Q$#(Y!#(]##HU\"#XU&#(]!#I5\"\"I1!\"I5!"
- "\"I)!#))##9-$$Y1'!)1$#I=%\"I9!#9A!%Y=(%)E!#)A#\"IE!$)E#\"IA!$9U!#YM\""
- "%YM$#YM#$IU\"!9Q\"$)U#$*!#$:!!&)]$#Z!\"\"J%!\"Z%\"%Z%'%*%'$J-\"#Z!\"#J-!"
- "!Z-!#*9\"'*1%#J1!#J5!$J5!!Z1!$Z9\"$:9##J=!$Z5\"#Z=!#J=!%:E!#JA!#Z=\""
- "&:I,\"JM#\"ZE!$JM$!ZY!%*I\"$:Y#%ZQ&$ZM\"$*U\"#:Q##;%&#ZQ!#ZQ!$J]!$*Y\""
- "%*I\"#:U#$JU$#*]\"%:U$$J]!#ZU!\"ZU%#[)!#[%!$*U\"$ZY%$*Y\"$*Y\"#[)!$JU$"
- "$;%\"\"Z]!&[%\"\"JY#\"[!!$ZU%(J].#ZU!#*]\"%JY)\"*Y\"\"ZM!$ZY)\"ZQ!$ZY%$:Q#"
- "#ZU!$JQ!#ZI!$+!\"$*U\"#JM!$*U\"\":]\"#*Q\"$*M\"!ZM!#ZQ!#:]\"%ZE*$JA%%ZU)"
- "$:I#$*I\"$J9%(JI#\"*E!#ZA\"#JE!$JM!$*A\"\"JM#%JA)#ZA%#ZQ!\"*9!#:5##Z=\""
- "\"Z5!&:5!#J9!$*%##J)!%J-\"%J5\"\"J%!%:-!$:1!$:)!#*%#%J!*$:!!#J%!&9Y&"
- "%YY$$)Y#$)Y##IU!#YU\"#YQ#%9U%#9U!#9A!#YI##)M#$IU%$YI'$)A!$)=$#)5#"
- "#I=!#9=$\"Y=\"!Y5$%Y5%\"9-##9!*\"H]!#Y9##)%##Y-#%Y1($)%%$(]'!HY!#(E!"
- "#XU##8Q$\"8Q+#8M$#HQ\"#(I#\"HU$%(E#\"XA\"!(I!\"85!\"8=#\"H=!\"8=#\"8-!\"X%#"
- "!H)!\"(!%#8%$#(!$\"8)!\"(%%#WY$!7U\"!GQ#$7M'\"7Q$\"GM%#7M&!GE!\"'9##GI$"
- "\"7=$#'-'!W1!!79\"\"G1'\"7=#!WA$#7A##'A'#'E$\"WQ##'E'\"WQ&\"GU\"#GU!\"W]#"
- "#']$!GU!#H!&$(%(#H)!$8%)\"X)##(A$#(1&#X9$\"(9\"$(=!$XA&#(I##(A$#XI!"
- "!XI$#HI#\"8Y!\"8M##XQ&#(U##(U!\"XY\"#H]%$I)##9!!!8Y\"%I!(\"I)!\"I)!$Y1$"
- "$H]#$)5'\"I1$#I1%$I9&#9I##I1%#IA%#)A##IA\"#9E!$)Y##)U\"\"IU!#YQ#$9Q!"
- "#YE%$)U#$IQ\"$J!&#9Q!#9]'%:!\"\"IU!#J)!$J%)$*%#%9])$J)%&*-($Z-&\"J-!"
- "#Z-\"'Z1)$J5!$J9!%*A#$J9!$J9!#J)!#J5$#J=!%:5(#JA!%J9\"%JE(#JM!#ZA!"
- "#J9!&ZM\"\"ZI!%*Q\"#JE!#JM!&ZI\"$JQ$!K!#'+!#![!$$JU$#ZQ!#[%!#[)!#JI!"
- "%:M(#[)!$[%%#[-!#ZY!#[!!$*Y\"$[)!$ZU%$J]$#Z]!\"*]!$:]*$[%!#[-!#ZQ!"
- "\"ZM!$:M$%J]%&;!#$[%!#;!#&ZY.#JM!#*]\"';!,$*]\"#Z]$#Z]!\"+!\"#ZY!%Z]\""
- "%ZU\"$*U\"'*Q+#*Q\"#JE!%K)(#*Y\"$J]!%*U'$JE$$JM!&J]!#ZQ!#J9!!ZY!$JQ$"
- "%ZM\"$:M$\"JM$%ZE\"$:I$$:I$#J=!#J=!\"*E%$:E##JM!$JM!$*I\"#*A&#J1!$:=$"
- "#*9\"#J9!\"J9#%:5!$JA$$J!\"%J1\"#Z-\"%J5)$:-!#J)!#J-!#Z%\"#J!!'*!0&J-\""
- "#IU\"#J)%#IY+$IY%#YQ##J)!$9Y!#9Q!#9M!#)M#%YI(%I5!#YA#$9E(#9I!$)A#"
- "#)A#!Y9!&99*%)5%!Y5$$Y-'\"I5!#)%#!Y1!\"I1!$9%&$(]$\"8Y!\"Y)\"\"8U##(I'"
- "!8M($(U$#(=$\"HQ!$(E(\"8I#\"8I!#HE##(=$\"HE$\"8E!$X5,#8=%$H5\"\"8-!$(-#"
- "#8-%!(-!\"(5'#X%'\"8!!\"8-!\"H!!\"WY!$'Y)#7]%\"7Q!\"7M!\"7M!\"7I##'E+!G=!"
- "\"7)$\"G-$\"'1\"!'1$\"'5%#79!\"'I##'E'!7U\"$7E*\"WM##7Q#\"GY\"!7Q\"!GM!\"X!#"
- "$H!'$X!)#(%!\"8-!\"8%!#85\"\"H1!\"81$\"(9\"$81!#(1!#8=$!HI!$8I&\"(E\"\"8I!"
- "!HE!$8M&\"(Q\"\"XE\"#)!$\"X]\"$(Y!#H]%$(]*#H]\"#Y)#$))$#I-\"\"9-##I)&$)!("
- "!)1$#)5#$95%!Y=!!Y=!\"I=!$YA&#IA\"$IA&#9A!#YI\"#YY\"%IQ'%)Q$#IU\"%)Y$"
- "$YU'#IM\"#J!!\"I]$$Y]&$*!#$9]$!J%#$)Y#$:)!&*!(#Z-\"\"J!!\"Z9!$:%$$:5$"
- "#J1!#J9!%J-\"#J=!#J9!\"J=##JE!#J5!%ZE)&:M(\"ZM!$ZM%#ZE\"$JQ(#ZI!#ZU!"
- "%JM!&:A$&*=+%*M&&*I'$ZQ%#ZY!#[!!$JU!$+%\"$:U$#ZU!$ZM\"$:Y'#Z]!&*Y*"
- "$Z]%$K%(\"ZY!!Z]!#;%#%K!)#*]!#Z]!%;)+#[!!#[%!$Z]%#[%!$*U\"$ZY%%;!'"
- "&K%!!+!$$K!$#*Y%\"[!!\"[1!#[!!#+)&$:Y*$+-\"$+!\"#ZY!#[9!$;!##[!!#[)!"
- "%K)$$ZU%\"*]!$JY!#ZU!%J],$:Y#![!!\"JQ$$*U\"':I%#ZU!\"ZU!%*I'%:]#%K!)"
- "$ZQ%!ZU!$*Q\"&JY!%JQ$$*M\"#*M\"$JI!#JE!%*E'\"*Q!#JE!$*E\"$Z=\"\"*I\"\"ZA%"
- "#J=$#J5!$:9##Z9\"$*1&#J1!$J5!\"J1!$*-##J=!\":-\"$:)!#*1\"$:!$$J5%$:)$"
- "\"J!!#Z!&\"IU!$:%!#)M%&)Y%!IQ##YQ&$)Q$#)Q#$YU#\"IM$$YI&%Y1%#9E!%)5\""
- "&)I\"!95\"#9=$#I5%#99$#)9##I9\"#Y9#!Y-!\"Y-\"$I-)#9%!#Y%$$9!&\"I1$\"8]!"
- "\"(Y\"\"8Y!\"(]%\"HQ$#(]#!XU!#XI!#(I#\"8A!$XE\"\"8A!\"X=#%(1'\"X9\"#()!\"85!"
- "\"89&!()#\"X!#\"G]\"\"X%#$WY!\"(%#!']!#X!\"#7Q#$'M##GQ&\"GM\"$'E!\"'E\"!W=\""
- "!71'\"'%#!'=#!W5!\"G=\"!WQ\"!WE\"$'U($GI&\"GM'\"7M!#7M&\"GQ\"\"WY##7Q%!WY$"
- "!(!#$8%$\"X%##(!$&(-+\"8-!$(A\"\"(%#\"HE$#85$\"X-#!HA!#8A$\"(5%#89$#8]$"
- "\"8I!\"8A!!HQ!#(Q#\"XY\"$8M#\"X]\"\"I!!%Y!#%XY\"!Y!!#Y%&$))$#Y-&!Y1!\"91#"
- "#9I$$I9&#)5&#Y5&#9=!#)=#!YE!\"II!#)A##9I!!YM!#9Q!%9Y%$9U$#)]##IM\""
- "#)Y#&)Y!#Y]\"$YY&$)Q$%:%+!Z)!$J!%&*-!&J-\"$:-#&*-+$:1!$Z1&$Z5\"#*5%"
- "%:1%#J9!#J=!#J=!#Z=\"#JA!$*A\"%*M&%*E\"&:Q,&*E$!*I$#JE!%*M*#JM!$:E#"
- "!ZM!#Z]!$*M\"\"*Q!#ZU!$*M\"$:]##[!!$*I\"'JY*\"ZU$$*Y&#[%!&+)\"&:M!%:U$"
- "$[!!#[!!$;%\"%[!)#;!\"$+!\"%[!&%[%)$[!&$[%!%+%&$K%$#[%!\"ZU!$+!\"$*U\""
- "#[%)#[%!$;%\"$+)\"#[%!!ZY!$K%$$[%!$[1!%+%&#[%!$+%\"#ZU!$K1$#*]!$K%$"
- "\";5&%;%'%JY!#[!!![!!&:]+#[!!#:]\"%;!$%ZY\"$[!&%*Y*%:Y#$*M\"%JY($K!$"
- "&;)'&JU)&JQ%$*U\"$:M$$*M\"$:Q$$*M\"%*M&%JM!%*I'$:M'%JI!\"ZM!#ZA\"#JA!"
- "#JA!#JA!$:=$$*9)%*='$J%&$Z-&$JI!#J9!#J1$$:1!#Z-\"%:-%!Z%!$Z)\"#J=!"
- "%9]!#J%!#YQ##Z!(#9Q!#J1!$)]#$)]#$)U#$)Q$$IQ&\"IQ!#IQ\"#YE%#Y]\"&9=$"
- "#9A!#9E!#I5\"%Y=,#YA\"\"Y9\"\"I5!\"I=!\")9%$)5'#Y%'$I%&#9%!$I%'#XU##(Q!"
- "\"X]\"\"XI\"\"8Y##9!!#(E!\"HM!#XA#\"8I!\"8E#\"X=#!X=!\"8A!\"81!\"89!\"H9!#HM&"
- "#']$#85%$X1#\"X)##(!'#8-%\"G]\"\"WY#&(%)#'Q$!GU!#7]%\"GE\"\"7Y!#7=%#'I\""
- "$'5&#G1$!G=%!G=!!W1&\"'E#!WE\"\"GA\"\"WM#\"7=!\"'Q#\"8%!$GY*!G]%#W]'\"7]!"
- "\"X)##8!\"!(%!$H1%#(1!\"81!\"X5%\"W]##8=$%(5#\"XE#\"H-$#8E%#(I#\"XU\"\"8Q!"
- "\"HU!\"I!\"\"XU\"\"XE\"!X]$!XY$\"I!!$Y!'%I-!\"XY\"\"8Y!$)5!\"I)!$Y1*\"IA!#)1#"
- "#)-#!YA!\"IE!$)-$$)I$$YE$#IE!\"9I##9Q'#)]##9I!#99!\"YU!#IY!#YU\"$)Y#"
- "#Z!\"$)Y#%*%'\":!\"!Z!!$9Y!%Y]'#Z%\"$Z1&&*%(#J-!$:1!#J5!#JI!\":A#%*9'"
- "#JE!%:=(%:=$$ZE&%*=&$J5!&:I,$:Q#%:M$#JI!#*E\"$JY!$*M\"#ZI!#Z]!$:I#"
- "#ZQ!\"*Q\"%:Q$%*Q##[!!%ZY\"%*Y\"#ZQ!$+!\"$;!#$[!!$*]\"&:],%K!)%;!#\"[)!"
- "&;)#![%!#[%!\"K!$#JY$$[)!\"+!\"&+%\"$[%!\"ZQ!$[)%\"K)#'[)\"$+1\"#[1!#[)!"
- "\"Z]$#+)\"%;)+$+)!$+!\"$+)\"%+).#+!\"#;)\"$[)!#[%!#[)!%+-&$[%!![1!\"[%!"
- "$+!\"$;)\"#Z]!#[%!#[%!#[1!$;)'#ZY!%K!!'K%,%Z])!*]!#JI!#Z]!#Z]!%:M'"
- "$:]##+%!$JU!$:Q#&:Q$$ZU\"#ZE\"$JQ!$JQ($ZE%$ZM%#ZY!$JQ!#JI!#Z5\"&:E%"
- "\"ZM!#JE!%*=*$*A#$Z=\"#Z=!#JE!#ZA\"#Z5!#*5\"&*1!!*5$%Z1#$Z9&#J-!\"J)!"
- "#J1!#J-!#I]!$:!$#IU\"$Y]#$)U##IY!#IU!$:!!#9]$#)Y#\"I]!#9I$$)U##)9#"
- "!YE!#YE\"#9A!#II\"!I1#\"I9!#)-#\"Y5\"\"IE!#Y!'#9-$!Y5!\"(Y($HY$#I%\"#I%\""
- "!Y1!\"XM\"\"HY!#HM%\"8Y!!I%##XA$#(M!#8M$$8M\"#XE&\"XA\"#(A$#(A!!H9##H9#"
- "$81)!H=!#(-!#(!$\"85!\"H)!\"W]#%8%%!7]\"\"7]#\"X!#!WQ$#WQ'\"WU#\"7]!#7I\""
- "\"'=##79!#7=(\"'=%\"W=%\"75&\"7I!\"7M!#'Q$#WQ'\"7U!\"7U!#']$#7Y%!']!!X)$"
- "!H)!#H)#$H-*!XA!#X-'!H5!#X!(!H9!!X1!#(I!\"HI'\"8=!\"HA!#8Q!\"8M!$(Q("
- "%(U,#I!%#XY&#XU&#(]##9%!$9!&$X](#9%!\"I)!!)9!\"9%#!Y=!#)=&#Y-#\"I=!"
- "#I9%\"I=$$9=%$Y9'$9E%$)E#$9I\"#9M!%)I!$IQ&&)]($)]##YY\"$IY&%9Y!$9U$"
- "$Z!##9U$#I]!&*!!#Z1\"&J)*#Z1\"#J-$$*9\"#J1!$Z5\"#Z5\"#ZE\"#J9!#J5!%:=!"
- "%*=##Z9\"$*A##ZE\"!ZI!!ZQ!#ZQ!#JI!#J=!\"ZU!!ZI$!ZQ!%*Q'':Q!\"ZU!':U%"
- "!:U\"\"ZU!#ZY!#ZY!&*Y#%ZY\"(*](\";%\"%ZU)%K%!\"[!!\"[!!#[!!#[!!!:Q\"#*M\""
- "$[)!$+-\"#K)$$K9#$[)!$;!#%+)\"$+-\"$+)\"&[-.\";-&\"+1%$+-\"%+!\"$K5$$;1#"
- "$[-$&;-+$;-\"%[)!$+5\"%+9&$+-!$+1\"$+)\"$*Y\"$[)!#[I!%;-'$+)\"%+)&\"[1$"
- "\"[!!$+1\"#K)#%[)%\"[5!#[!!#[!$#:]\"$*]\"$+)\"#JM!%[-&$JU!%K%!#JM!$+-&"
- "\":]&$Z]!$J]!%:Y$\"ZY!#Z]!&ZU*%ZU\"#;%'$:I$#ZQ!$*M\"%:M$#ZY!$J]!#JM!"
- "#ZU!#JM!$ZA%%ZA&$ZE)#:=##J9!%:=(%:=($J=!$J5!$JE%$J!%$Z1&#Z9\"$J%&"
- "\":)#%JA)\":%#$*%#$:-#&*!!#Y]&%*%+$9Y!'YQ*#IU!$)U##)Q##IY!\"9Q##IQ!"
- "#9Q!#YE%$IE#$YA!#)9##)A#\"IA!\"95##95$\"I5!#)5##)9##I5\"#I)&#Y-##Y!$"
- "#9%$\"Y!#\"X]\"#8Y$#XY!!XU'#(Q#$XQ*$(Q!\"8I!#XM#$X=+\"(E\"$8A&$H=!\"85!"
- "#85!\"X5##(1&!H%#\"(-#&()(#(%&\"X%\"\"']#\"8!!#'Y$#'Y$#7U\"\"WM#\"WQ&\"WE!"
- "!79%\"'9!\"'E\"\"7I!#GM!\"W=(\"WM#$'Q!\"7Q!!GU!\"7Y!\"7Y!\"G]\"#7Q##W]'#GU#"
- "#(!$#H)&\"(9\"\"X5##X5&#(5)%(=##8I%$8A&#XA'\"HE!\"8Q!!(=!\"8M#\"XM\"\"XM\""
- "#HQ&\"Y%#\"I!$#(]##9-$#Y!$$I!&$))!#)1#$)A!#)1##Y1&!Y=!#)5##Y-##9=$"
- "\"I=!#IA%')I\"$)E#!)U!$)I$$9M!$YM#!IQ#$YU&$IQ&$)U##II\"#Y]\"#9Q!%YU("
- "#Z!\"!*%!$J)\"!Z1!\"J1!#J-!\"*1\"#J!$#J5!#J5!$*5#$J=!'*5(#J1!%Z9##JA!"
- "%Z1#\"*A\"%JE(!:E\"#*I\"$JI%$*Y\"$*M\"!ZM!#JA!#Z]!#Z]!#ZQ!&*U*#ZU!$;!\""
- "$*Y\"'JQ%$JY!#[%!#[)$#ZQ!%[!&#;!#%+!\"%Z]*#JY(&+%*%;!'#[=!&;)'#[-!"
- "%JY%#[%!#[)!%+-&%K-$$+)!#[-!#ZY!#[-!$+-!#[-!$[-!%;E\"%+5!#[=!#+1!"
- "#[1!\"K)#$+M!#[5!$+1\"#+1\"#[-!%K1($+1\"#[-!!;=\"$J]!'[1-%+1&%+-\"$;-&"
- "$[5$#[%!$[)%\"[1!$K)$%;-\"&K)!&+)\"$+)!$[)%%[%&\"ZU!%:Y$#;%*$[!!%ZY\""
- "\"Z]!%Z])'*]+$:Q#$:]#$:Q$#ZY!%;%'#*U\"$*Q\"#*Y\"#ZQ!$*Q\"$*Y\"\"ZM!!ZY!"
- "%:I'!:I%#JI!'JA\"#JE$%:M$$*A\"!*9!#J9!#Z%&#Z5\"$J1%\"Z5+#J5$#Z-\"$:9#"
- "#Z%\"%:1!#J9!#Z5\"\"J%!$J!\"$YY#&J!#$)]&$*%#$Y]&$9M!#IU$$9M%%YI!$)A#"
- "$9M!#YE\"#YI\"$9E\"$)A#$)=!!YA!#9Q#$)=!\"I5$$91(#I1%\"Y1\"\"I-$\"I-!\"Y)\""
- "\"Y)%#I-\"#)%#\"I-!#(Y##(A$$8Y%\"HU!\"8Q!!HM!#(9##(Y!\"8M!\"X=#\"81!\"8-!"
- "#89%#X5$\"81!#()$$(9(\"7]!$X)&$8%)\"8%!\"WY%\"WI#\"WY#\"X-##WU!\"WU%\"WQ!"
- "!W5\"\"W=*#'9$\"'A\"#'E$#G9$!GM!\"WQ##'I$#7U%#7Y%#H!$$(!+\"7]!\"W]#\"8!$"
- "#()$$(-(#(5##(=!#H-%%H9,#85$\"H=\"#(A#\"H=!$(Q'\"8M!\"(M\"!(Q!!HQ#\"8Q!"
- "#(Y#$(Q%!H]!\"8]!#9!!%I%'\"Y)\"$)%!#I)%\"I%!\"I-!\"99&\"I9$#99$#)I##Y=#"
- "$)=$$)A#%)9($9Q!#YQ\"$9U$$)M##YQ#\"IU!#J%!%)E%#IY!$*!#$9]$&:)-!Z%!"
- "$Z)#$*)&#*1\"%J-\"&*5,$:A#$ZI!$:5##J=!#J9!#JI!#Z5\"&:9!$J5!%JA)&:A!"
- "#ZE!&JE)':I!!*A$$*M\"!*U!#JM!$*Q\"$:M#\":A\"$ZU\"#ZU!%[!&$*Y\"\"ZE!$J]!"
- "#ZY!#Z]!#[%!$J]!\"K!'#[)!$+%\"#[%!%K%)#[)!#[-!$[5!$;-\"$+!\"#+-\"$;-\""
- "!+)!&+1\"#;)\"&[1&#[1!\"[1!#[1!$;1\"%+9\"#K1$$[9!#[1!$+9\"#[1!&K5$\"[%!"
- "$;A\"\";5&$;5\"$;5\"#[5!$K9#\";5\"%+5!$;-\"%+9&$[5!\"[1!#[1!$[-!$+1\"$+1\""
- "#[1!$[%!$;9\"#[)!#[%!#[-!$[!!$;)\"'K-!#[5!$+)\"#[9!&K5,#[)!$+)&#+)\""
- "$K9'\"ZQ$#ZY!![%!$JU!#Z]!#Z]!#[!!%*M'$*]\"#[%!$ZU%%*U&$JY!%*U'$:Q$"
- "$*M\"\"ZM!#ZM!#JM!%ZI'%:I$&:E!%:A(%ZA\"$JE$!Z5!#JA!$*9#\"Z=!&*=+#J9!"
- "$Z1\"$*-'#Z-\"$:-!#:)'$J)%#J%!$*%#$J%%&J%&$)]##9U!\"J%!#I]!#9U!#YQ%"
- "$9I$%)A'%)I!#YI&$YA&#IA\"\"IA!\"9A&$91\"$)5'#Y5&\"I=!$Y1*!)-$#I!##))#"
- "$9)%#8]'#H]\"%)!)\"I!!\"I!!%(U##(U#!(Y!#8M$\"XM\"#(I##(E#\"8=!\"H9\"\"8A#"
- "!81\"#X=)$85)#HA+\"(5#\"8)$\"(%\"#(9!\"()\"\"8!!!X!!\"']#\"WU##WY\"\"(!%\"7Q#"
- "#'A$!G9#\"'I!%WM+#GI'#'I%#'I&\"7E#\"'E!\"7Q$\"GQ\"#']$\"X%#\"X!#\"(%\"$()#"
- "\"89##(1#$H9'#H1&#(9!!H=##HA&#8='\"8M!#81\"#8I%$XU+\"HQ!$HM!\"XU\"%(M#"
- "#8U!\"9!$%9!*$))!$9!&\"I)!\"Y-($I-)#)1##I9+#I1\"#Y=\"%)Q*$)9'#YE#$)A!"
- "#9M!#YE##9A!%)=$%)Q!#IQ!#9Q!$)Y##YI\"$)Y##9Q!%*!!$:!!#IY!&Z%$%:%!"
- "$J)%$I]&#*)\"\"J)!$J5!#J1!#Z=!'*5%%J9)%:5!\":=\"&*=+#JA!#:A'#*A\"#JM!"
- "\"ZE!$JQ$$:M$$JM(#ZM!#ZQ!#JQ$$*U\"\"Z]!$JU!'[-)%*Y&#Z]!#;5\"%*]&$[%%"
- "$;-##ZU!$:U#$[)!#[)!$J]!#[)!$+5!%:]+%[))\"[1!#K5$$;)#$[-$%JY)&;)+"
- "%[-)%+)&$+!\"$+1\"\"[%!$+9\"%;1+$+%&$[5!&[5!![1!$;)\"$+-\"#[=!%+=!%+)\""
- "%[A%%+=%%;9\"%[9!#K5'$[-!%+9\"&;9\"%K9$$[9!'+1+'[1!&[1)%;5\"&[9!$[=$"
- "#[5!\"[5!#[-!$[5$\";1\"#[-!#[-!$;1\"#+1\"\";-\"$K-(![-$#+-\"$[)!%K)(%Z]%"
- "$[1$$[%!$*]\"#[%!%K!$%;-\"%K!)%K!$#Z]!$*]\"$*]\"#ZY!$ZY%$ZU%%*U\"$*U\""
- "&:Q$#JM$&JE-$*M\"#ZI!\"ZM!#JI!%:E!#Z9\"%ZE\"#J=!\"JE$%J5)#J9!#Z5!#J1!"
- "#*9\"%J5%#J1!#J-!\"J-!\"Z)%#J)!$:%!$*!##I]!%IQ)$)]&%I]&$:!!\")Y\"$)Q$"
- "\"J!!#IY!#YM#\"YI\"!Y=!$Y9'#95!#)E##95!#95$\"I9!!IA#\"I9!\"91#!8]%#9%!"
- "$I%)#I%#$HY&#(Q!!I%&#(U##XY##(Y##XU!\"HU!#XQ!!HQ!!HI!#HI&&H9*\"HA%"
- "\"81$$(A(#(9##89%\"XE(!H=!\"X)##H!&#H))\"8%!\"X!#\"7]!!W]!\"WY#\"7U!#H!$"
- "\"'E#%WI(!GM##'I$#GM$\"WQ&\"GQ\"#'I$!(!#%H1&\"7]!\"()##8%$#8)%\"85!$H9!"
- "$X1(#XE!#(5$#X=!#H=#\"89!#8A!$(M'$HQ'\"8I!%HI&#8A%%HQ!!HU!%)!($HE!"
- "\"H]!#Y)'!H]!\"Y%##))#$)-'#Y-##I)%\"9A#\"I=!\"I9!\"IA!\"I='%YE!$)M'\")E\""
- "#YE#$IA%&9A&#9M!\"IU$#YQ\"%)U'$YY&#J5$$I]&$Z)&\")]\"\"J!!#*%#%J)\"$*)#"
- "$*-##J)!%*%'\"J1!#*5\"#Z9\"$9]$%*='#ZI\"#Z5\"!:=\"$Z=)#JE!#*E\"#JI!#JI!"
- "#ZE\"$K!$%*M'$:Q$$*Q\"!ZQ!$ZU\"\"Z]!!*U(#ZY!$;!#\";-\"$JY$#[!!%+!\"#[)!"
- "$*Y\"#[!!\"+)%#[-!$+)\"#[-!#+)\"\"[-!#[!!$[)!$+1\"#[)!#[%!\";1\"%K=##+5\""
- "$+9\"%;9''+5\"#[5!%+=\"#[9!$[9!%K9$%;=\"\"[9!$[9!$[9!%;-\"&;I&$[9!&[5*"
- "%+=!'[E!'+1&$[A!%+5\"%+=%$[I!%+M!#[5!%;5#&[=!#[9!%;9\"$[1%$[9!%+1\""
- "$[A!%+1!$[E!&[=)#[9!'[5&\"[5!&K1$%;%#%+9!$+-!\"[5!#[%!\";)\"$+9!&+-&"
- "!;5)$+5\"$K-$$K!$%;%'#[!!$+-\"$[!!%J](%;!#$*Y\"#Z]!#[%!%JY!':U)#Z]!"
- "\"ZU!#ZQ!#ZU!$*I\"#JM!#JM!$*M\"#JM!$ZI%%JI(\"ZE!$ZI\"$ZA&\"Z)!$J-)#J9!"
- "#*9\"#J1!#:1'\"Z9!%ZE)#Z)\"&*)!#Z-\"%:5(%Z5#$9]$%9Y(%)U+$YM'$)Y##Z!&"
- "#9Q!#)Y&#YQ)$IM%')M)#YQ##I9\"#YE\"'Y=#$Y=$\"I=!#)9##YE#\"I5!!)1!$Y1'"
- "#)-##Y%'$I)##9%!\"Y%\"\"9%##8]$#(]##(I$#8U!#(Y!#8M!#(E$#8=%\"X=#!8E\""
- "#(A#\"85#$(=(\"X=##85%\"X1##X-$!H1##X-'!8%\"!W]\"#8%(\"W]##7Y%\"WQ#!GU#"
- "!7M%!WE\"\"7M!#WM'$WQ)$X%&\"7U!#'Q!\"G]$\"'I!\"GU\"\"8%&!(!$!H)!\"X-#\"8!!"
- "!(%!!H9!#(1$\"H-\"\"H9!!HM!\"8M!\"8I!!8M\"$(E(#(Y!!HM!\"8U#\"HU!#(U#\"8]!"
- "!Y%!#9-!$9-%$I%'#HY%\"I1!%)1(%91&#I5%\"I9!!99\"#I=%#9=!#9=!#YE#$YI'"
- "$YY##9U!$)U#&IE+\")M\"$IU(#J%!$)U#%Z!+\"YY!#Z%\"$:%!%Z%'#Z%\"$J%%\":)\""
- "$J5%\"*1\"!Z5!%Z9&$J9!$:-#$ZE\"$J=!%JA%#Z9\"$ZE%!ZI!!:E\"#JM!$:M##JM$"
- "\"*M!#ZU!$:]##ZY!#ZU!$*Y\"#[!!#ZY!#:]\"%J]!&ZQ*#[!$%+!\"%[!\"#K%$#[1!"
- "#[1!'+)+#ZY!#[)!$+-&$+-\"&;A&\"[1!%+9&$KE##[1!$+1\"#[=!$K=$#[5!%+M!"
- "$[E!$[=!%[=!#[9!%[9%%[E!$[=!%[5%'KI$%[9%%;9\"![=!%;E\"%[=!\"[=!$[5!"
- "%;5#%K1$&KA$$[A!#+1\"$[=!!+E!\"[9!&KA(&[=!%;I\"%+=\"![I!&K9((+1\"%[-%"
- "$[A!$[=!'+9\"'+9&%KE$%+=\"&[5!#[9!%+5\"$[1!$+E!#[5!#+1%$K1(%[1!$;%#"
- "#;!'%+)&#[-!\"K!#$+)\"\"[)!!*]!#ZQ!\"[%!$+)\"&+!+$JU!$J]$\";)&#ZY!(ZY+"
- "\"ZY!%ZY\"&:Q$#ZY!&:M+$:Y##ZU!!ZM!#*=%#JE$$JI!$JA$\"Z=!\"*A\"&:A%%*='"
- "$J-%&:5%$:9##J5!$*5\"$:=$%J-\"#J%$$Z)#$J!)$Z%#\"YY\"\"YY!#J!!\"IY!#9M!"
- "$YQ##YU\"&)Y)$)M$%IM##YM##9I!$9M!#9I!#Y=\"#9A!#)1##99!\"I5!\"I5!\"Y1\""
- "!)1!#I)\"#I!#\"Y%\"$9%#!(U!\"(Y%$(]'$8M#\"8M!$HU-#XQ#$(9'#HA\"\"HI!\"89!"
- "#HM%\"HA\"\"8=!$(9'\"(9\"!H5!#H1&#85$$X-%\"X-##H-&#H-&\"7U!$W](!GQ!\"7Y!"
- "#G1'#'E\"\"WQ#\"'M\"#7M%\"7U!#7E#$'Y(#(!$#8!$#(!&#7M#!X)\"#X)\"#H-!\"85!"
- "%HE\"#(=$\"(5%$(A%$8A(%HA\"$(E'#(I!\"(M\"#(I#\"(M\"$)%'\"8U#$8Y)#(]#$(]'"
- "#I!#$)%$!Y)!%9))\"9%#\"9-##)%$\"9A#\"I9!\"I-!$)5$$)E$#IA!$)E!#9Q!\")E\""
- "#9M!#YM#$)U##IU\"$YY&$J%%#IY!#YY&#YY\"%J!##J%!#9U!!ZA!$J)\"&*-+#J1!"
- "\"*5\"%J1)%:9($*9\"\":9#%J=\"$Z9\"#J1!%JA\"\"ZE!!ZA!$ZI&%J=%%JM!$ZM\"$*Q\""
- "&ZQ*#ZQ!$ZA&#JI!#ZY!%:U(%*]&%Z]!$*Q\"(;!-$K!$$J]'$;%#\"Z]$\";)\"$+)-"
- "%[5!$+-\"![-!$;-\"$+1!$K=#\";1\"\";1\"$[-%&;5'\"[5!%+9\"#+9!$[=!$[9!%[1!"
- "$[=!)[=*&;A\"'[A!$[-!(+=\"%+M!%[=!$[=!'KE,#;A\"(+A&$;M\"%KA$\"[A!$[A!"
- "%+A!&[A)%+E!%[A%$[=!%+9\"%KA$%+U!';1,&[=$#;E\"%K-$&+A!$[A!%K=$'+A*"
- "\";5\"$+E!';=\"&[9!\"[A!&[=!%+I!#[9!%[=%&;E\"%+=\"&K1$&+=\"$;=\"'K-!%[5!"
- "#K1#$[1$%;1'&K=,#+-\"$K-$\"[-!#[%!$*]\"$;%\"#[%!&+-&%+%\"$*U\"&J]!#+!\""
- "$*U\"$JM!#*Y\"$;!\"$[%%$[!!%*Q'%JM%%JI((ZU/#JI!%*9&&JY%#:E#%:A!#JA!"
- "!*5!%ZI*#J9!$J9!\"*5\"#J5!#J5!$:1$#J5!#J)!#Z%\"$*1\"$*-#&*!$#:)#\"J!!"
- "')])$IQ\"')I\"\"YU%#9Q!$)9*$YM##II\"$Y=!#YA#&)=-#I5%\"Y=\"\"Y%#\"YE\"\"Y-\""
- "\"Y5\"#)-#!91+!))'%9)&#9%!#9%!!)-$$I!&\"Y%%%)!)#(U!\"XQ%$(Q!#(U#$HI$"
- "#89%\"XA##8A%#XE!$(5%\"H5\"\"(5#$H1$\"X1#\"H-'$8)!$8%)\"H!!\"8!!\"G]\"\"WY!"
- "#GE)\"7M!\"8!!!H!!\"GE\"\"7]!\"WU#&'Y&\"G]!&(!,#X%\"#8%$#H%&#(-!!(9!!(9#"
- "\"(%%\"89!\"85!$HE$\"HE$#HI&\"XM\"#(I$\"XY\"#(Q##XU&\"8A!&8Y(#(Y!\"Y%\"%I%'"
- "&I%)#HU\"\"I)!$Y-!#I5%!Y5!#)5##))##)A#&91'$IE)#9=!$9E%#YE\"#9M!$IQ%"
- "#YA#&)Q(#IQ\"#9U!$J!&$)Y#$YU*$Z%*%IU)$IY%$*%#\"Z)!\"J-!%J-\"#Z-\"%*1'"
- "%Z)'%*5'%:A!#J5$!ZA!#JA!#JA!%:9$#ZM!'ZI'\"ZA!'*M'!*Y$'*Y,%:M$#ZU!"
- "%JY!#ZU!#ZY!$+)!!ZQ!&JU%#Z]!$*Y\"#+%&$[%!\"[%!$JY!#[)!#ZQ!%+)\"#[9!"
- "%[-&&;9+%+1\"$[9$#[1!&;5#%;5#&+5\"#;9\"%+)\"$[9!#K=#)K11%+M!![I!$[E!"
- "%+9\"%KA$&;=&%[9!%;=\"%;A&%;M\"&;E'&[9)$[I!(+5\"$+U!'[A!&+E!';M/&;I\""
- "![E!%+M!%;A\"$[A!%;A\"$[I!$[E!&[E%$[I!$[E$%KE#%;M\"$[I!![A!$;I&%+9\""
- "$;E\"%;A\"#+A)'+E*&+9*$[A!&+A\"%;=\"&;A'$+=!%;='%+U!#[9!'+9\"%;I\"%[9!"
- "!+1!#[1!$;=\"#[%!'+-\"%[-)&;-$$[1!#[-!#[%!%[1)%;-\"#[)!\"[)!$+)\"';-,"
- "%[!\"#ZQ!&+)&$:Q$%*U'#ZQ!#ZY!#ZY!#ZQ!&JQ-$JI!$JM!#ZE\"#JI!!ZE!#Z=\""
- "#ZQ!%:=(#:=#\"Z=%\"Z9!\"Z)\"#J5!$J1($Z5&&Z!$$*1#%:)!#J-$!*)!%:!(#YI&"
- "$IM%#IY!\"I]!$IQ&#IU\"#9I!#IY!#J!!%)I$#IQ!\"9M##9A!!YM!!)9!#)1#$I5&"
- "!95\"\"Y1\"#91!#)-#!))!!I!##9)!%)%&\"8M##8]$\"8I##HU\"#(M#\"Y%\"#XI#$(I$"
- "#8=\"#8I$$HE*!(I!#(=$#X=$\"X%#\"H5\"\"X1#\"8-!!H%##H)!#7U%\"W]#\"7Q!\"(%%"
- "%7A$$WM$\"7U!#H-!\"WI%#7Y#!()!#8!\"#7]##H!&$H-$!H1!#X-!\"8=!\"H1\"%H-$"
- "#8=$\"8=!$X=+\"XI\"\"8I!\"8A!#(M#$HM#%HI%#(Y##HQ%\"8U!%XQ&#Y%&#9)!#I)\""
- "#9%!#I-%#I%)#)1#\"I1!#)5##)9#\"9=#!)9!$)E!$9I%\"I9$%)I!#)I&%Y=+&99'"
- "#I]!#YU\"#9M!$Z-&!YY!#J)!#J!!%Y]$#J%!#J)!$Z)&$:A#\":%##Z5\"\"Z%\"#Z=\""
- "$*9\"\":1#$J=!%J9!#ZE\"#ZI!%*E'#J1!$JQ%$ZI\"#:M\"$*M\"$JI!$*I\"$*Q\"#ZU!"
- "&JY,#ZI\"%K!$#Z]!$ZY\"%+%\"#[%!%[9$';%$#[-!$;)#%+)\"%[-&#K-$$+9\"$;1+"
- "%K1('[9&$[5$%+5\"\";=\"$[=!%[)&\";5\"'+=*%KI#%[=!$[A!&KA(%;A\"&;U\"'+A\""
- "%;5\"'KE($[E!%;A\"%;E\"%;E\"&;I&&[M)%+Y!$[E$%;E\"%+Y!);E($;I\"$[I!%;I\""
- "$[I!$[E!#[E!%[I$&+I%%;M\"%;1\"$+U!%;E\"%KI#%[=$$+Q!$[9!%+I%$[E!%[I!"
- "%[I$$[E!&KE(&KA(%+I&$;E\"%[A$$;A\"%+U!#[A!$[=!%;A\"&[=!&[=$%+1\"%[9%"
- "&[9!$+9\"#+1\"%[5!#+-\"\"[9!$[=)$;1#\"[1!%;1'$ZU!%+!\"$;-\"#[%!%[%)\"[%!"
- "#[-!$[-$$+%&$;%#!JU##*]\"&:Y$$*]\"#JY$\"*E\"$*Q\"\"Z=!\"JU$%J9\"$JM$$JA!"
- "#ZQ!$*M\"!ZA!&:9!%J5\"#*!#$:=$%J1&!Z1!%Z%*%*='\"ZE!$J)%#J1!$J%%#*%#"
- "':!\"%9]\"\"I]!$IU%#YM&#Y]\"$Y]##9Q!$)Q$\"9Q##IE\"#9E#$)E##IA!$)9*$9=%"
- "#Y=##I1%#95$&Y1-\"Y1\"#9!\"#I!#$Y%!#Y!$#(]##(]#\"XY\"#8U$$8Q(\"I!!\"XM\""
- "$(E(!(I$\"HE!!(E!\"X=(#8E%#85\"\"H1\"\"HA%\"X!!\"X%#!(-!#8)'#X!!#7Y%!']!"
- "#GM$\"7E!!'U!!'U!#X%'\"7U!#H!$\"8%!#X%'#(-!\"X!##(-$!H1#\"8=#\"(-#%(9&"
- "#8I$#X='\"XA&#XE!%HI%\"8I##8M$\"XQ\"$HM#!HU#%(M#%)!\"!H]!!)!$%9)&%9%*"
- "\"8]!#)-#$)-'\")A%%I1$!YA$$)5!\"I5!%IA*$9U!$)=$%)E$#YI##YQ#$)I$$YY#"
- "&)U!!)Q!#9U$&I]*$IY&$:!!$YY&$*%#%*!!\"Z)\"#Z-\"\"J--#J1!\"Z5!$J5!#Z=\""
- "#J1!#J=!#J=!%:Q$#ZQ!$:I#&:=%$:E$$JM%%JQ$#ZQ!$JA%&JY,$*U\"$*Y\"&*]&"
- "&JY!\"ZY!$K!$#[!!%*Y&(;5($;%\"%JY(%;1#$[-%#;-\"%K-(\";=\"#+1\"%+1!$;I\""
- "&[5!\";9&$[5!%+1\"\"[5!&+=&%+A!%KE$$+E!&+A\"&;Q'&+9\"'[E!%;I\"$;E\"%;A\""
- "'KE,&[M$%;I\"';A+$[I!&+Q%%KM#$+Q!$[U%%+M%$KQ#%[5)&[]$#[M$$+M!%+M!"
- "$;M\"$[M$$+M!!+Y)#+Q!$+M!&;A/#[A!%+M%#+Q!\";]\"#[E!$+U%#[I!%+M!(,!)"
- "%;I\"%[E!$[A!%;M\"%;Q&$[E!%+E)'[E)&;E'$[=!$+Q!%+M!%[A$$[A!$[9!%+=!"
- "$KI#$;5&%[9$%+5\"$[9!&*Y'$[1!$;-#%+1!$+1\"%+1!$;-#$;%\"%+=&#ZU!%K1$"
- "\"ZM!&;!,#ZY!';5#$:U#\"+%!$J]!&J]!&*U+$:U#!ZQ!':A%$*M\"\"*A\"#JE$$ZM%"
- "#*I\"%ZI\"$ZI&!ZQ!#Z=!)*%'#Z9!#ZA!%Z5\"$*5\"#JE!#Z-\"%J-%!:-&#J!!$J%\""
- "%*%'%*!$\"*!%!YU!#I]!$9U!#9U!%IQ&$9M%&9M#$)E!#9E!#9E!\")E\"\"Y=%!Y5!"
- "$Y1*!)9!%95,$)1'#I-%%9-)#))&#Y%#$)!!#)5#%8]#!H]##XY#\"HU!\"HQ$#(U#"
- "%X])!H1#\"8I#$8E#\"81!!(=!$(E(#X9'\"(A\"$81&#H1&$8-)\"X)#\"X%!\"X)##'Q$"
- "#7M#\"'I!\"7U!#GY#\"GU\"\"WM#\"GU\"\"G]!\"H%\"\"H%'#7]%#8=%\"H5\"#(5#\"(1##89$"
- "#8Q$\"8M!\"XE#!HM&!HI!!XQ!\"XM\"%HQ(!XU$#8Y$\"8Y!#Y%*#X]&$Y%!#I%#\"Y%%"
- "#I-%\"I)!\"I1!!Y-$#)5#!Y9!\"IA$%)E'#Y=#$)A##9Q!#9E!#9I!%IY\"$IM\"%YY("
- "\"YU\"\"J%!$9]'&I]#$*!#\")Q\"\"J)##I]!$*!1\"Z-%\"J1!$:1!#J-!#J1!%*9&#ZA\""
- "%*9'$JE%$*A\"\"*Q\"#ZQ!\"ZE!%:I'$*E\"%:E$%JQ!$JI%#ZQ!&JY,#ZU!\"ZY!#ZU!"
- "$J]!#[)%$JY!%+5\"$+%\"%+)\"$;5\"%;-#!+1$#[!!#[1!%+1&&;E\"%;5#\"[)!#[5!"
- "&[)\"&K9$'+=*$[5!#[=!$[I!&;I\"%[A!%[=$&;I&&;E\"%[E$$;=&%+I%&+A&$+A%"
- "%;M\"$[E$#;Q\"%+E!$;Q\"%;M&$KY#$+Q!\"+U!$+I!$+Q!$;M##[=!&[M%$+U!#;Q\""
- "&;Y\"%+M%%;U'$<%\"$+Q!$+U!$+U%$+M!%;U&&+Q%$;I\"&[],$+]!&+=!$[U$$;U\""
- "%+M%&+M!$KE#%[M1$;Q\"$KE##+I!'+=\"$KY'&[I$![A!&;A&#[A!#+I!%[E!$[A!"
- "%KA$$;M\"%[9$%;A&%[E$$[9!%[=!$[A!%;=\"#[5!&K)($Z]%$[E$$[)!$;1#&+%'"
- "';!$#Z]!!+%!$[)!#[-%&;!#$*Y&\"*U\"$:Y#&*Y\"#[!!$+!\"#ZE\"#*]\"$JE!\"ZM!"
- "%:I'#ZA\"%*E'#JE$#JA!#Z=\"$J=!#*9\"%*9&#JE!$:5$%:-!%:-($*)#$J%\"$*)#"
- "$:1!#J%$#IY!\"IY#$9Y!!9Y\"\"IE!$IY%#)M\"#II$$IM&!YU!'9E+#)A#$IA%#9A!"
- "!I=&!Y9!\"Y5(#Y=&!)=$!Y)!#I9\"\"I)!$I%'$I1##I!#\"Y!##XY&#99$$HQ'\"XU\""
- "\"8Q##(I##8M$#(A$#(E#\"H=!!H=!!X-)\"81!\"(9\"#(9&#8!$!8-\"\"H%'\"7U#\"7]!"
- "#7Q#$7M%!'Q!\"8!!#']!#H)&#()$\"81!!(5!\"X)\"#G]!\"X-\"#(5$!H5%#85$$85&"
- "#HA%\"8A!!(M!\"8I!$8M(#(M##8Q$!(U!#HY%!XY*#9)!\"8Y!#9!!$)%$#9)$\"IA!"
- "$)-$#91$\"91#$IA)$Y1'!Y=!\"I=!\")=\"#)E#$9I\"!IE##IY!$YM##IY!#9Q!#Z!,"
- "\"IE!$9Y!$J%\"$Z!#$:1!#Y]\"%:-(':%#\"J-!%*1#%Z1#\"J1!#J5!!Z9!#ZA!!ZM!"
- "%:-!\":A\"#ZI\"\"ZI!#JA!$+)\"\"*Y!%ZQ\"!ZU!\":U\"#JM!$[!!#[%!#[!!#ZU!$+%\""
- "%+!\"#;)\"(K%*%ZU\"#[!!$[-!$K-($[-!#+%\"#K9$!+5$#[%!'KI#%;I\"%[=(%+1\""
- "%[I!$[A!$[A!\"[5!$[A!%+A!$+Q!$+M!$[E!$+M!&[I!#;I\"$KI#%+M!#+M!$+M!"
- "$;M\"\"+U!$;M\"$KI'$+U!$;Y\"%+Q!$;E\"&[])%[U%%+U!\"[I$'+M!$KY#%+Q!&;I\""
- "$;Y\"%[Y$*;I'%KQ#$[U%$+M!'+Q*%;U\"%KY#&[U%&;E\"([I!#K]#%K]#&KU#$[Q$"
- "&[Q$$;M'$+Q!&;I+%;Q+\"[Q%%+M%\"[E!%+=&%+Q!%KM#%[I!#KE#![I!&[E)%[E!"
- "#;E\"#;=&%;A\"&+9\"&;A\"'[=!%+I%$[9!$[9!&;9#%;1#![5!#[1!$[5(#*]\"$[%!"
- "$J]$#[-!%+)&%[5%!+)$$ZY\"#ZU!$:]##[%!!:]*#ZY!#Z]!#ZU!\"ZY!\"ZQ!$*Q\""
- "(JM.#JM!$JM!$ZA%#ZQ!&:I!$ZA&#J9!#Z9\"$:1!\"J-!#:1#$Z1\"#Z1\"%:-%!*-!"
- "#J%!#J%!#J%!$)M$()]*!)U$$II##9U!$9U$%)Q$#YE#&IQ(\")I\"$IE%$9E$#Y=\""
- "$9A$#9M$&9-.\"Y)\"#)-#\"I1!$)%!&9%.\"Y-%$)9$#H]%\"Y!#$))!\"8Y!#(Y#$(Q'"
- "#HU%$8E##(Q#\"HM$$(E$\"H9\"\"XA\"!(=!\"X=#\"X5#$(!#\"8)!$8-#\"H%\"\"GU%\"7Y$"
- "\"WU!!GQ%#8-%\"7Y$\"GI\"#G])#()!#8%$\"8!!!H-&#(1##85$!H9!$XM%\"X=#\"H9\""
- "#XM!$HE*\"H5\"#(M)#XM!$8E&#(U##HU\"!(Y!#HU-#(]!\"9-##X]!$Y5*\"9A#\"9)#"
- "$)1$#Y5##95$$IA&#)-#\"I9!#)I##9I!%YU#$)U#%II##9U!#9E!\")U%#I]!&*%$"
- "#YU\"#9]##Z!&$*!##IY!%J1&#JA!&:-)%:1!$Z1\"\":5\"%:5!\"*5\"$J-%!Z5!#ZE!"
- "$Z5&$JE$#*M\"#JI!$JI$$JM%#:Q\"$JQ%$ZU\"$JY$$*Y\"#[%!\"*]\"%[!&$;)\"\"K!#"
- "!Z]!%+1&$[)%%K%!$+-\"%+-&$[1!%K)$&[5!$+9\"%[5!$[9!\"[9!$;=\"$[=!#;=\""
- "%;M\"![9!$[A!%K5$%+M!'KI,$[I!%;E\"%[Q(#[M%$[I!\"KM'%;M&$KQ#&+M&(+Q%"
- "\"+Q!$;I\"&KM#%+U!%+Y%&KU,%+U!%KU#%+Q!&[E%#+Q!%KY#\"+M!%+U!%+Y!%;]!"
- "%;Y\"%[Y$\"KU#$;Y&%KY#%\\)($+Y!'KY+(+Y!%+]!%+Y!$+Y!%+Y!'<!&&+U%%<%\""
- "%+M!'+U!(+U!&;Y'\"+U!$+Q!$+Q!%+]%&[E-$+]!\"+M!%;M\"$+M!#+U!$[A$(;I/"
- "$[I!%;Y\"&KI,'+Q)$[=!&[A)'+A!'+A\"&[=!&[-!$[9!$;9\"%[9!#[9!%K9(\"K)$"
- "$+1\"%;-'%[-!$[)!#:Y\"![!'$K%$%[-!';-/$[)!\"ZM!(K%&$JU!$:M$\"ZU!$:Q$"
- "%ZM\"#ZQ!$:I$#JI!#*I\"#JA!$:E$$*A#\"Z5!$:A#$J9!%J5&%:9$#Y]\"#J1!$J-!"
- "#J1!#Z)\"!Z%!%:)!#I]!\"Y]!$)U#$9U!\"IU$#YE#\")Q\"#YM#$9Q$$)I#$)E#%)I%"
- "#IA\"$)=!!)=!$Y=+#Y-##9=!\"Y-(\"Y%\"$)-$\"I)'#H]\"#91!$)5!\"H]!#(Y!\"X]\""
- "!H]!#XU!\"XM\"#(M#'8Q)\"HE!!(U##X=$#(5!#H9\"$(E%\"85!#85%!X-!\"8!!$8%)"
- "$'U&\"7Y!!GY!\"8!!$X!)#G]$\"8-!\"H%\"!8-%!H)!$(1%\"H=!\"89!\"8-!#(I#\"8A!"
- "$HA$#(E$$HM*$(=%$(Y'\"XQ%#XU!#(]#\"(I\"\"8U!#Y!#$)1$\"))(!8Y\"#)-#!Y5!"
- "!I=#$I9#!)A!#Y=##YE#$I=&$)A'#YE##9I!$)M'$9M%%)Q!$YQ#!YU!$*%#$J!&"
- "$Z-&#J%!#J!!#Z-\"$:1##J-!#J1!#J-!%J1)&Z5+%*=##JE!'*1,%ZE'&*A(#JE!"
- "#JA!$JM!#ZQ!%JM%$JM!':M(!*I%$+5\"&*U#$ZY-!ZY!$*U\"$;%\"$;!\"%[!%#[-!"
- "$[1!$;1\"#;-\"![1!\"[1$$[1!$[5!#[5!'+A&$[=!$[9!%;I\"$[1!%+9!$[I!&+E%"
- "\"[E!$[I!%[E!$[9!&KI(&;Y&$+Q!'KQ,%KE'$;I\"%+Q!&KQ#%;I\"%[Q)%+U!'+U!"
- "$+U!&+U!#[Q$#;U\"%,!!(+]!'+Y!#+U!%,%!'<!+%[U%%;]!%[Y$%[I!$;]\"%[]$"
- "'K]#';]*\",-!$+U!(;]\"%L%#%+Q!'K]'&[U%#;Y\"&KU#%+]!%+Y!$<-\"$+I%\"+Y!"
- "$+]!%+Y!&KY#%+Q!$KY#'+Y%$+U!%KU#&+U!!KQ#';Q\"\";Q\"$[Q%$KQ#%;M#&+M)"
- "#+]!&[M$%[5$%[I!%;A\"%KE#%+]!';I'$[A!%K=$$[E!$+M!#[5!%K-(%+5\"#K5$"
- "$K=#$+!&%+5!![%!$;1#%;-'#[)!![9!#[%!#[)!&JY-\"Z]!%Z]\"#JY$\"ZY!$*]\""
- "$JU$%ZQ*#[!!$:M'&ZA+&ZM&$:M#\"ZE%#JA!$Z5\"#J9!#J5!$Z9&$Z5\"\"Z5!#Z9!"
- "#J-!!:)\"$Z-)#J%$$:!$$YU#$)Y##9U'#IY!#J-!#IU%#Y]\"%)M(%)Q'#Y]\"#YE%"
- "\"IU$\"IA!#I=%\"IA!%9=)#Y9##)-#%9%&\"9-#%9%'!)1!\"I-!#9-!$I-*#(]#$(I'"
- "$(U%#(M#\"XQ\"\"8M!$(M+!XI!#HE\"#(5#\"8=#\"X1#\"XI\"$(5\"\"H1!#X1&\"8-!\"X=\""
- "\"GY\"#(%'\"X!!!']!\"'I!\"']*\"8)!\"X-#!H-!\"H-\"\"X1&\"(9%!X9)#89%\"(E-#(Y#"
- "#HQ%#(I#$HI'!XQ!$(I'\"H]!$HU#$)-$\"H]!#)%$$)%%!95\"#I)&#Y1&#Y1&#Y1&"
- "\"IE!#99!#Y=&#Y=##I5%!I1##Y=##9I!%9M)#YI#$9E%$)]##YU%#IY%#)Y#%Y]+"
- "%9]\"\"J%!#J-$\"I]!$Z5\"&Z1'$*1\"#J9!\"Z5!%:9(#*E\"#J=!#JM!#ZA\"$ZE\"#ZE\""
- "#ZA\"#:Q#%*9##ZU%#:Q#%*Y&&:Y$#[%!$Z]%$*]\"%Z]*%;%##[)!!+)!#+-\"$+)\""
- "\"[-!$+5\"#[1!#[1!$;=\"$K)$$[=!%[A$%[9%%[9$&K=$&+Q!%+M!$;=\"$+=%$[E!"
- "&+E&%+I!&;I&'[M)%+M!%;M'&L!'%KQ'%KQ'$+Q!$[I!'+U%$KQ#%[U$%K]#&+]%"
- "&;Y&&;Y\"%;Y\"&+Y!&+]!%+]!%+]!&+]!%,1!%;Y\"(+]!#;Y\"\"L)#%KY#$+]!%,%!"
- "%,!!&[])$+Y!&;Y\"%,%!&L=&%<!!%,%!(,!.%L)\"&L!#&\\!(&<-!#;I\"*K],$;U&"
- "%;Q\"%K]#%+]!*KY#%;Q\"$KU#%;Q\"$[I!%KY#&KY'%;U\"&\\!$%;Q\"%<%&%;Q'$+Q!"
- "%+I)$;I\"&[E%%;M\"%;A\"&;E&#[E!%[A!%KQ#$[A!%+A!$;M#$+=!&;E'%+9\"&+9\""
- "$[5!$K5$#[A!!+5!%K1(%*Y\"$[%!#ZY!$+)\"$[%%#[%!%ZY!%*M''+!/#[!$$*Y\""
- "$ZU%'ZU'#JM!#ZI\"%*A'#ZI!&JM-#:E#$ZE\"#:A##ZM!%:9$#Z9!#Z)\"#Z9\"\"Z5!"
- "$*=#\"Z5!#J-!$J9!#IY!$9Y$#IY!#)U\"!Z)!')M#&IY+#9U!#YQ##IM\"\"9A#%9I)"
- "\"Y5%$YE#$YA'#9=$\"Y9\"\"I9!%Y-\"#91$$)%(!Y-!\"I!!#Y))#9%!$8U\"$8Q(#8]!"
- "\"8Y!\"H]!#HM&$8E&$XY*\"HA\"#XE&\"XE\"\"XA#\"8=##(9)!H5!#H%&\"81!$H-*\"8-!"
- "\"WY%\"WQ#\"W]#\"8!!#8%%#7U#\"H)\"%(-$#(-!#(5$#(1$$89&#H)&#(1!%(='!H9!"
- "!XM'\"XM%\"XQ\"\"8I!\"HU!\"91,#(Y##XU)#I%#&95$%9)##H]\"\"I1!#Y1##Y1&#)5#"
- "')M&%99)#)A&%9E)#9A!#YU\"!II#$9M%$IU%&9I&$YU#!9Y\"#YM#\"IY$%9]$!)Y!"
- "#J-!#Y]\"#9M!#J-!&:5%$:=##*5\"$J5%\":9&$J9!$*=#$JA!#J-!#Z=!#[!!\"*U%"
- "%ZM\"$JY$#JM'#ZQ!&ZM\"![!$#ZQ!%K!(\"[-!#Z]!$Z]%%+-\"$+%\"\"[)!!;)\"%+5\""
- "$*Y\"%+1&$;1#$[!!&[5!(;A0$[5!#[=!%;I\"%;M#%+M!$+E!%[E$%[I$!;A\"%KI#"
- "&[I!%+U!#KU#$+M!$;A\"$+]!%KM#&KU#%+U!&KU+(;U&&+U%%[M%&<!&&+]%%+Y!"
- "%K]#'[])#;U&$+Y!%\\)##<!\"#<%\"%,!!&,1$&L-#&+Y!%L)\"&L1&$+M!&\\%(%,%!"
- "#<)&&\\%$%L-\"'<!*&,%!%L!#'\\%$\",%!!<%\"$<%!%<%\"$<-!*<!&%L)\"%+Y!&+U!"
- "#+Y!(L!'$\\)#!+]!$KY#%+U!%KY#(<)!%,)!&+M!$[U%%\\!#'+M!$[I!$[I!&[I!"
- "$;M\"$;U&$;E\"%+M%#[I!%;I\"%;A\"&+I!&[E!%;E&%+5!';-,%[I!&+Q%%+M!'+=&"
- "$[A!&+E&$+5\"\"[5!%+1\"&;1#$+-!%[-&%;)'&K)-$+%\"%+%&#ZY!$+!\"\"Z]!$ZY%"
- "\"ZY!$:]#)ZU'$[!!&ZU*!ZI!$ZM\"$JM!!ZI!#ZE!$JA!%JA\"$:9##J9!\":1\"%J1)"
- "%:5!&:%&#J%!$Z-&%J-\"#Z%\"\"J!!&*),!Z%!$IU%#9M!$IU\"%Y]+#9Q!#YM##YM#"
- "$IE%#9E!#)I##YE#$)9'$9A+#I9%#91!!Y5!#))#$I9#\")%\"$)!!\"I)!$)!%#(]#"
- "#XY#$9!#\"XM\"\"8M!#HM\"!HQ!\"(E\"\"8E!\"XA#\"X%!\"8E!#(=!!XA!\"H9\"$8)#$(9\""
- "#GU(\"8!!\"8!!#(!'\"81#!GY!\"X5#$8=##81!#(5#%(9!\"X=\"$8=&#8A!#(E$\"XU\""
- "$HI'\"8M!#HQ%\"I!!#XI&#XY&%(]%\"X]\"\"8]!$)-!%)%%\"Y!\"#I%&#9=!\"I1!$9=("
- "$99%!Y5!\"I=!\"IA$#IY%$)I#$YM&$9I%%9M%$IU\"$)U##9U!%)Q($:1!#)U##J%!"
- "#Z-\"$:5$$Z5\"$:%$#*1\"$JI%%:A$$*E\"#J5!#ZI!#JI!!ZA!%*M'#ZI!$:I#&:I("
- "#ZQ!$*Y)#ZU!$*U\"!:]\"#[!!$K%$$;1##Z]!$[%!$[%!#K)##[)!$K9$$K9(%+9!"
- "&;)'$+5!%;5\"%[=!$[9!%;5#$KQ#$[A!%[I!%K9$%+Q!%;I\"%+I!&;E\"'+A!!+M!"
- "%+Q!$+Q!&;A+%;E\"&+Q!$KY#(;U!'KY#%+U%$<!!%+Y!&+Q!%;]\"#,%%%+]!%;]\""
- "&+]!%<!!&,%!&L!')<)%&L%\"&+]!%,)!&,%!%\\!#&,5%%;]!%,%!%+]!#,)!%,)!"
- "),))'L1&%L%#&L)\"%<1!&\\1#%,1!#;Y\"%L)\"&L%#$\\!$%\\)$!+]!%\\)$$+Q!%,-!"
- "\"<!&%L5\"$<)\"%,!!(;U'%<!!&<!\"%,-!%\\!#&;U&&\\%($+Q!%KQ#%+Y!%+]!$[I("
- "$;Q\"%;Y\"%;U\"$+Q!$+Q!\"+Q!$;I\"#[A!$[A!&+I&$[I!&KI#&;='%KA$$[A!&KE("
- "&K9$(+=!$[9!#[9$%+-\"#[1!$[1!#[1!%;)'\"[-!\"[)!%;%'!Z]!$+-\"'K!!%+!-"
- "!JU#&*U\"$*Y\"#Z]!$*U\"$*Q\"#JQ'%JM!#ZI!%*M'%ZE\"#Z=%#JE!$*=\"$*E\"$:=#"
- "!*)!#Z5\"&*=$\"*=\"$:)$%:)!\"Z-%#J%!\"Y]\"$)]#!Y]!\"9U&#Y]\"$J)%\"YQ!$J!%"
- "#9E!&9I&$9E$%)A$#IA!#)=##99$#I9\"#95'#95!!Y)!$I%##9%%#Y!##I!\"%8Y$"
- "$(U(\"8E##(M##(M##XM'$XU'#(9'\"8Q!#(E#\"HA!#8=$\"8A!#X9/\"85!%7]+#(%$"
- "$'Y)#GU&\"8!!\"8!!#81!\"H5\"\"7Y!\"(1\"\"85##(9!#X1'#X-'#(E##8A!!(E!\"8I#"
- "\"8U#\"HU'#(U#$)!'\"XY%#(Y#!Y!$#Y!$#)%##9)$\"I)!#I5%$91%#Y9#\"I5!!Y9!"
- "#)=#\"IA$')A&#Y=##YU\"%IQ#$YM&#IY!#IM(#YU&&YY!$)]#%)]($J%\"':%\"%Z)'"
- "$*)'$:-#%I]##J5!\"*5\"%:5!$Z5&$J=!\"Z=!&*A#\"ZE!#JA$%JI)$*I\"&:U$#ZQ!"
- "&JQ%\"[!!%JQ(\"*]\"$J]!'K!&$K%$#[!!%ZY!#K%$$[1!$+-!%[-!'[9!#[)!\"[9!"
- "#[5!&+9&$+5%%+=\"%;=\"$[=!'+A&%[E$$;I\"&;M\"%+Q!$[E!%;I\"$+M!%+U!%+Q!"
- "#KQ#$+Q!#;Y\")+U%%+Q!&+Y!';U+&;Y.%;]!(;]\"%,)!#,%!%,%!&,%!(\\%,'\\-,"
- "'<!&$,)!&<%%$,%!&L)+$,)!%\\)#&L%'&,%!)\\!2$,)!%;Y\"$,%!%,1!%L-\"%\\-#"
- "$L%#%,-!%,-%#+]!$,)!$\\-$%<9!%L-\"&,%!%L5\"%;Y\"%L5#'L)\"%L)##<%&%L)\""
- "%,)!&,)%%,)!%;M#%L)'&;]\"$,1!)K]#%L!#&K]'%+]!$;]\"%;]!'[],&\\!$%;M\""
- "%+]!$,!!';I\"%;U\"%;Q\"$;Q\"$KQ#$;Q\"$+M!$[E$%;I\"%[=!#[I!$[=!&;Q\"%+A!"
- "%+9\"'+=!$;A\"$[5!#K9##;=\"%+1\"#[9!$+1%%[9)$+-\"$;-\"$+)\"#[%!%;%#&*]#"
- "%K!)%ZY&#ZU!#[%!$:U$!K%#$ZU%$ZY%$JM%#*I\"\"*E!#:A#$JE$'*=(#J=!#J9!"
- "#*5&$*-#$Z5&$:-$#Z-\"%*E*\"Z!!%:%!%*%'$*!#&)]%!)]!$9]!#9M#%)M$$9Q!"
- "\"YM!\"YA%$)E$#Y-#%I=$#IA!#)A##I9%#I5\"#Y5&#Y9#\")-(#9)$$9)\"#Y1##(Y!"
- "!Y)!#8]$#(Y#\"8Q!#XU##8E%\"XI\"#8A$#HE&!HA(\"8A#\"8E!#H9\"$H-!!X5$\"81!"
- "!7U\"#(!$#H1(!H!#$()(#(-$\"81!!X5&#H1&#X9$\"XI\"#(A!\"HA!#XE!#XE$!HM#"
- "\"HI!#HY($8Q#\"XY\"#H]%$H]#%I%-#99!\")!#$9))\"(]\"\"I1!!Y5!$95\"!I9#\"I=!"
- "$)=!%9E\"#9E!#IU!%)Q$$IQ%$9Q!#9M!%IU*#J!!%J%*$9]!#*%\"%:%!'*1!%*)'"
- "$*-#%J-&#J5!#J-!$J5!#J5!%*=#$ZE&$*A&#ZQ!$:I$&:M+#ZU!$:M#%*U\"%*A&"
- "\"[!!':U!#ZU!#[!!$JQ!#ZY!#*Q\"%[-!![)$#[A!$K-$!Z]!$;9\"%K1(%;=&$[%!"
- "%[E!![-!$[5!%;9\"&[E!%[=%$[E!%+E!%;I\"%;E\"%;I\"$+M!$+M!\"+U!$;Q\"&KU#"
- "&KQ#'+Q!%;Y\"&L)#%;]!$+]!&;Q'$+Y!%,!!',!!&+]!#<%*'<-*',-%%<5!%+U!"
- "\"<)\"%,!!&,1$'<5!(<-*%\\)$%L5#&<-!&<=!',-%&,%!(L!\"%\\-#%,-!',5$(<%!"
- "',5$$L1'&\\1(&<=!',1)%<5!%<5!(,1-&L-\"%L-#%\\=#%\\9#%,)!(L)\"#,-!%,-!"
- "'<9!%,)!%\\)$&,)%%,)!&L-\"%L1\"$\\%#&<%&\",5!%\\%#&\\!(%;]\"&L!'%+]!$\\)#"
- "%KY#'+Y!)+U!%+Y!&+Y%%+U!%,)!#[I!$+Q!$KQ#$+E!$KM#%[5$![I!\"[E$#[9!"
- "&+1&$;A\"$[A!\";E\"#K1$'[E-$[1!$[1!$+5!$+)\"#[1!#[-!$[)!$+)!#[9!#[)!"
- "$[!!%+!\"&*]\"\"ZU!&J]%\"ZQ!#JA!%:Y$!ZM!%JM!\"ZM!\"ZI!%ZE\"#:E##ZE%%:=("
- "#Z=!\"Z9!\"ZM!$*%##Z1\"#Z-\"#J)!$)]'%*%'#J%$$II%\"J-$!YQ(#IY!$9M(#9Q!"
- "#9Q!#II\"$9M%\"II!\"I9$%YE($II)$99!$I-)\"95&$I-&#)-#!)!!$))$%9)&#I%#"
- "$Y!$\"I%!\"8]!\"8U!%(Y%#(Q##(I$!XE'#(I##(E$\"X=\"\"X5#\"8M!#(9$\"85!#85$"
- "\"()\"$GQ\"\"H%%#X-$#(-$#H-#\"(5\"#8M%\"85!#8I$$89##8A$$HE'$85##(='!XM$"
- "#(M!\"HU!#(I!#9!$#8U$!Y)!#I%%%I1$\"I%!#95!#Y-&$)A'\"I5$\"IA!\"IE!%)9("
- "#YE\"%9Q\"!YE$#9Q!&9M##YQ#$IQ%#YY\"#IY!$9]$#IY!$:!$%*%'#IU(\"*)\"#Z)\""
- "$*-#$ZE&$ZI\"$Z9&#J9!$J=!$J=!#JA!%JQ!&*E+#JI!&ZM&$*Q\"#ZE!#*M\"$*Y\""
- "$JI!#JQ$$+-\"$+-\"$K!$#[%!&;%+#+-\"#[)%#[-!$K%$'+)'\"[5!$[=!%[9$'[5!"
- "%K=$#+5\"#;=\"$[1!#[I!&+E&&[M%%+I*%+I&\"[E!\"[E!\"[M$#+M!%+U!';Y\"&[U("
- "&+Y!%;]\"%+Y!&+Y!%+M!(L9!$<!!&\\%#\"\\-$%\\%$&K]'&<!\"%<)!&<1!%\\=#%<%\""
- "&<9!%,-!&L9&&<1%$LA\"%L-#$,1%&\\1(%L-/&L-\"%<5!$<1%(L9/&+U!$\\9#)<%!"
- "*<-!&,5$',5)%,%!$,1!'L5'&<5!%L5\"&,5(&\\1(%\\1#%,%!&,9$%<1!\"L1#&<1!"
- "&L-#$,-!'\\=\"%<1!%<A!%L1\"&L1'&<1!$<!\"&L)\"$<%\"),!%$,)!',%!\",!!(L!0"
- "',!)&,!%&[M)'+Y)%K]#%[I$#;Y\"&+U!%[U%$+Q!);U&#[E!$[U$$+M!&;Y\"%[M$"
- "&[A!$[A!'[E!$[I!(;5(%+=\"#[A!$[9!%;5'&K!%#[-!$K9$%;5\"$KA''+5\"\"K1#"
- "#[5!$;)#$*Q\"!*]%#[)%$JU$!*Q!#:U#$:Q#$JM,#JM!#*M\"$*M\"%ZE\"%ZE&$:A("
- "#Z=%$JA!$J9!$*9#$:9##Z-\"#J-$$Y]&%:-!#Z)\"$Z%&#J%!\"I]#!YY!$9Y!!9Q\""
- "\"YM\"$9I$!II#!9I\"#)U)$)E#$9A$%9=##Y9&\"IA!$YA$#95!\"Y1\"#))#$9!(#9!!"
- "#I%##Y)#$9!##8Y$$X]+#)%#\"8Y#$HI*\"8M!#XM&#(I#\"8A!!H-#$(A\"$(9\"#(%$"
- "#8!##(%$\"H=!\"X-\"\"8-!#H5#$(5%#(9$\"X9\"#(M##8A%!XA$#(A!$(E\"!HI#\"HM!"
- "$XQ!\"HU!\"HQ!#9-$\"X]\"#8]'#H]\"$Y9'!Y1!#I5%#91$%)-+\"I=*\"IA!#)M\"#9A!"
- "#9E!#YE##9I!$)M$#IY(!YI!#9U!#I]!#Y]\"#9]$&*!,#J5!%*1'#J!!%*)$%*1+"
- "#J1!#J5!#J5!%J9)#ZI\"$Z=%$:=##ZQ!'*E(!ZQ!%:E(#JI!$*]\"$JE$$JQ$%+%&"
- "$JM$\"[%!&ZU&$:U'#[!!$JY$$[)!!+%!&;!/&[1)$;)#![5!&;9'$[5!'+A*%+=\""
- "#K=$&+5&&+9&%;E\"&[E!(+Q!'KY'$[I!$[E$&KQ(%;U+$L!#';Q'$;U\"&KQ(%[M$"
- "%,!!%,!!%;]\"(\\%(%K]#$,-!$L!#%,)!%\\%$%,)!'\\),$,)!%,%!(\\11%<%!$\\-$"
- "$,1!&L9'%,1!&,1$&L5*%<9!%\\9#'<9!#,9!%L5\"$<E!#\\=($L5''\\5#*,%.%L1\""
- "%<9!%,%!!,1!*,9-(\\9(%<!\"%<9!#\\5#%<1&#\\5#&\\)((,)-%,)!%,5%%<9!%<9!"
- "$,5!%L=\"%<5!%<=!%,1!$,5!%,-!%L)\"%L-\"&,-$%,)!%L1'\"<-\"#,%!%\\%$(<-!"
- "$\\%$%;]\"!,!!$\\1#&[]#'L!,#<%\"(,%)$+U!'+U%#[U$%[U($+M!&;M'#+A%$[M$"
- "%;M\"$[I$$[=!&KQ#%[A%'[E)$;=\"%+9!%[9!%;A\"%[5$%K-$\"[1!#[)!$+-!'[9!"
- "#ZM!\";%\"#Z]!$Z]%$+)!$:Y#\"[1!$*]\"$*U\"$*]\"$JA!&:M$#ZU!#JI!#JE$#JE!"
- "%JA)#ZI!$J5!#J=!#Z5\"%*E'%:1!%J-*$J1\"%Z!'$Z)&\"J!+$:%$#IY$#9Q!%9]("
- "\"IY##IQ\"#9M!#YM#$)M#%Y9\"\"I=!#Y=#!Y=!%)I($)-'\"Y-\"#Y1&!H]!!I)#\"I-!"
- "#9%'#9-!%(I\"$H])#HY%#(U##(I!\"8Y!#(I#\"8A!#X9$$89)\"8I##H=\"\"X)#!H=!"
- "\"X)#\"H-!\"H%\"\"X%##85!\"X9##H5&#85%\"XI($(A!!(=##(I'\"HE!#HM%#HQ%$HE'"
- "$(U'#8Y$\"Y%\"\"X]%&9!($)!$\"I)!#9-$#8]$#Y9)#Y5#%9I&#)A#\"IE!#9A$%YI!"
- "$)M$$9U(\"9Q#$II&#9U!#YY\"%)U(#9Y#&*!+\"YQ\"$)]##I]!%*)#%*-##Z1\"$J1\""
- "%:5!#J-!#JI!#*=\"$J5%#J=!':=&\"Z=!&*I+#JE!#JI!$*Y\"#ZU!#ZY!%JU!$+!\""
- "%:U+#[!!&Z]\"#[%!#;1\"%+)&#[-!$[1$%+=%%;%'*+1+$[=!$[9!%[E$%[5$&;M'"
- "';E+%;E\"'+E&%+Q!%[=$$+M!\";A\"$;A\"$+Q!%KI#%;Y\"%<!\"%+Y!'[Y$%,!!%KU#"
- "'<)!'L%+%\\!##<5!'L%+%,)!%,)!\"<%\"%K]#%L-#(L1&%,-!&,)!',5(',)%%<9!"
- "%,)!&\\5#\",1!%<A!%<A!%<5!'L-\"%\\5#&<9!%,1!&<9%&L9\"%<9!%<9!'\\-##<5!"
- "%<=!%<A!%L=\"%,A$&L9\"%<=!&<A!'<9!%<1&#\\9$%<5!%L9\"%<A!',I)%<5!&<5!"
- "&,9$$,5!&\\9(&<-*%,5$&<5!#<1\"#\\1$*L5!*,-)'<1!&,)%%<)%'L1\"'<)!&[]$"
- "&<!\"%,%!&L5''L%,#<%\"'+]!%;]!*,%*%,)!%\\%$&+Y%#<!\"%+U!&;Y&%[M)#;U\""
- "%+E&$+U!$[I!%+Y!%[U$\"+M!([=&%KE$#[9!'+A\"%[5$%K1$#[5!#[1!$;-#$[)%"
- "$+1!$[5%(+=\"%Z]\"$[!&\"[)!$;!#$*Y\"$*]\"\"ZM!#Z]!#ZQ!#:Q\"$ZA\"%*M&$JE("
- "#ZA\"\"ZI!\"Z9!#:9##:=#$*1\"#Z5\"#J9!#J)!!ZA!#J-!$*)#$*!#\"J!!$:%$#)Y\""
- "%)U!#Y]&$9M%\"IQ!\"II!\"I5$#IU!#9I!#9I!#I=\"\"YI!\"9=##I1(#95!#)1##Y=#"
- "!Y)$$9%#\"8Y!\"8I!$(]!!(U!\"8U#\"8Q!$(Q'\"XQ\"#XM&#85%%(A&$(A\"!8=\"!H9&"
- "!8!%\"H%!\"X1\"#H-%\"X5#$8=&#X5&\"X=#$(=!%8E$!XI!#8I%\"8Q!$(M\"#XI!\"(U%"
- "!Y%!\"I!\"#(]!\"Y%#$Y)!!9)\"#I)&\"9-#$91(#)A&\"I5!#)9&!IA#!Y=!#9M#%9E)"
- "#YA#%95##9Q!!)Q'!YU!%IU##IY!$J!%#Z!\"\"Z!!$J5%$J5!\":-##J)!$Z1&&Z5'"
- "#J)!$Z9&\"*E\"!:A\"#JA!\"ZE$%ZI\"$ZI%#ZI\"#JM!#ZQ!$*Y\"!*E!$ZM\"$*]\"$*]\""
- "%*]\"%J]!$*]\"#;%#%+)&#+-\"$+9&$K1$%;5&\";E\"$+9\"$[9!%K5$#[=!&+1\"%+5\""
- "#;I\"$[E!\"[I$'[I!$;U\"$[Q%#[Q$%+Q%%;U\"&;M##;Y\"%<!\"$,!!&[]#%KY##,!!"
- "',!!)L9%%L%#'<)!$[]$$<-\"%,%!#,-!%,-!\",5%'<1!%<1!'L9\"%L)\"&<9%),5-"
- "$,5!&<5!'\\9(%<A!&<9*%<=!&\\9($<)!%<=!%<=!%L=\"$LA\"'\\=(%<E!#,)!&<E!"
- "%<1!(<E$\",A!'\\A\"'\\=,'<=!(LI.%LE\"&<M!$,9%%L5\"&,=$&<5!%<=!',9$%<=!"
- "#<9!$<1!$,9!&<I!%<9!'<1*%<5!%L5\"&\\-($L-#&L)\"\"L1#%<5!$,-!%<9!'\\-("
- "%L1\"%,-!%L5\"&\\%(%KY#&<)&\",9!&L%''+])&+]%%;]\"%+Q!#+Y!$+Y!&+])#;Q\""
- "$+U!&[]$$;M#%K=#&+5\"$[E!&[E!&[=%&[9!$+=!$[-!%+9\"%+1\")+5'%;5\"$[1!"
- "#[-!#[),\"[%!#Z]!#[%!#[!!#[!!%JY(#Z]!$K%($ZU%%*Q\"&JQ!%JQ!#*]\"$J=!"
- "$ZQ!!ZI!&JA\"#*=%\"*=!#J9!#J=!%:5!\"Z5!$J-%#J-$&*)!#Z!\"#Z!)%*%##I]!"
- "$9M!&IQ##9U!#)M\"$9E$#9M!%IQ#$)E!$99\"$YA!#9=$\"I=!$91(#95!\"91#\"I5!"
- "!I%#\"X]\"$9%#\"Y!#%I!$#I!&\"XQ\"\"XU\"!H=!\"8M!$(I!#(I##(=$\"XA\"!H=!#X=#"
- "#H!&\"(1\"#()$\"85!\"8A#\"H5$!X9&!(A!!H9(\"XE##XE&#(I#\"85!\"XQ%$(U(#8I\""
- "#I-\"\"I%!$)!'#8U!%)!#\"I9!!)1!!I%#\"I1!\"9-#&Y5#!YA!\"YE%#IA\"#IA!\"II$"
- "$)E!\")E\"#YE#$IQ)%)U'&II+$IY%$*!#$YU&$*!#!*-!$J)!#J1!%*5#&*5$\":1)"
- "\"Z5!$*=\"#Z=\"$JM%&*=(\":A\"$ZM\"%ZI*%*M\"%*Q\"$JU!#JI!#JE!$+-\"%J]!%+!\""
- "#ZY!$[1!%[)%#;%\"$[-%&;5\"%;5&\";=\"$[9!%;5#%K-(%KI##[I!#;I\"%+M!%[E$"
- "$[I!$[A!%+E!%;U&$+Y!'KQ#%+U!'+M!%<!\"%;]!&+]%%,!!&;]&$+]!%,%!&L%'"
- "([]$%,)%$L!#'<)!%L-\"#,-!\",1!%,1!',-$&,1$(,A-)LA*%L5##,5!&<9!&L9\""
- "$,9!'<)!%\\E#&\\=(%L9\"%L=\"&<9!!<=\"&LM&%LE\"&<A&%<A!%\\A#%<A&'<=!+<E."
- "%LI!#,E!#,A!(LM/%<9!&,M$%L1\"',A($<E!&\\1,'<A*'LA&$,A!%LA\"%L='%,1!"
- "$L=\"#,9!%,-!%L=\"&<=!\",9%%,9$$<I!#,9!(L9&&L5+'<=)$\\A#%,%!'L1\"(<%!"
- "%L-\"&,)!$,!!%\\%#&\\)'&L)'',%!&<)%%<!!$L!#%+]!&,!%%,!!&;Y'%+Q!'+U%"
- "&+M!'+A&$[Q%#[I!$[M$&+I&%;Q\"(+U)&KI(%+E!([E$!+-!&+=&&;9#(K)%#[5!"
- "$K!(#[-!$;-\"#+1\"#ZY!$;%#&J],#[%!#[!!#*]\"\"ZY!$:Q#%;!'%:E$#JM$#ZM!"
- "%*I\"$:1$%*1#$JA%#J=!$:=#$J9!$J5!\"Z=!$Z1&$J9!$*-#$:-!!J!#!IY&#IU\""
- "#IY!$IY&$)U#!YU!%IM*!YE!#9A!'IA&$)U#$YA##Y=##Y1&#I1%\"Y5\"\"I1!\")E+"
- "!Y-!#I)&#))#!)%$$9)%$H])$9!&#Y!&\"8Y!\"I!!#(M#!HI##HE\"\"8A!#(M!$8=&"
- "#(1'%85+#(-!\"8-!$85&\"8=!\"X=#\"X9#$(9%#(E!#8I%#HU\"#HQ\"#(Q#\"8U!#(]&"
- "#(U#!9%\"#9!!%)!)\"Y)\"$I5##Y-&$91(#IE!\"IE!#)9#!YA!$9A\"%IM*$)I!\"9I&"
- "#9M!#)M\"$9Q$!IQ&$)]#$:-#\"IU!#Y]\"$*%##J)!$J%&$Z1&#*9\"#*1\"$:9#\":9\""
- "\"ZE!%*=&&*E+#JE!#ZE\"$*M\"\"ZE!#ZI!&J])#ZU!$ZY\"#:U\"\"ZY!$*Y%&J]-%[%)"
- "#ZY!$[%%$[)!%[-)$+5\"\"[-!$K5$%;-#%+9!$[5!&;A\"#[A!'+A*'[E!&KE,%KQ#"
- "$+M!$+M!$;M\"#;I\"%[Y$&;U&%+]!\"K]#%+]!$+]!%;Y\"$+U!&K]##,9!%+]!%L!#"
- "$<)\"&,)!),1$'\\-,&L!'\"\\1$%L1\"%<5!&L5'$L5\"$,5!%\\1(%\\5#'<E%&LA&&\\E#"
- "(LM%&\\=(&\\Q\"%\\A,%LI\"%<A!%<A!'<A*$<I!'<=&'LE!%LE&&\\E#%LE\"&,I$%<E!"
- "%<I!%LA\"&LA&&<E!',I#&\\E''LE!$,=!%\\I##LA#%L=\"%<I!'LE&&,E#%<I!'LA+"
- "&,=$%<A!(\\E!(LA/'<=*$\\=#%<9!%LM!&\\='%<=!'<5!%\\9#%LE!&\\1#%<5!&,I$"
- ")<)&%,1!$L1\"%,)!&<-&%,)!&<1*%L)\"'[](%,1!!,!!%+U!'+]!&<)%'\\!#&+Y!"
- "$+Q!&[U(%+I!$+U!$KY'%+M!)+E*$[I!';I\"'+M!%+1\"&;A'%KA#$[E!&KI'&+A\""
- "%;1#$[-!$+1\"#[%!#[)!%K%!#[%!%[%)$*Y\"%J],$JY$&JY)%ZI'$:U#$JM!%JQ!"
- "$*Q\"&:M!$:E$#ZE\"%ZI*#J=!\"Z=!%:E($:-$#Z=!#:1#%:A$$:-!$:)!%*%'#J!!"
- "$:1!#J!!#YY\"#IY!#YQ%&IQ'$)E$\"9I#$YE&$)E$$YA'#9A!\")9%\"Y9\"\"I1!#Y1#"
- "#9-!\")-%\"I-!%(I&\"8]!#))#\"Y!&$XY$#(M##)%#\"HU!!XM$\"HE!\"HA\"#(I#\"8A#"
- "$8!)#X5'\"X1##X5&$8A(\"X1##8E\"\"8E!#XE!\"8M!#(I$#H=&$H]'#H]%#X]#\"8Q!"
- "#(]#$Y!!\"I%$#9!!#I%%#Y-&#I1%#I5%\"95#\"I9$#99!$)9$#YA\"&IQ(#9I!%)Q("
- "$9Q$$:%$#I]!#9U!#Y]\"$I]%$:!$$Z1&#Y]\"%Z1*\"Z5!#:1#$J=!$Z=\"#Z5!#Z5!"
- "!ZI(&*=$!ZQ!%ZA&#JI!$:Q#$ZM%$*]\"#ZU!$:I$$JY!&+%\"\"Z]!\"ZY!#ZU!$Z]%"
- "%;%'$+-!$[A!$[1!![1!#[E!%+9\"$[1!%[A(&[A!'[I!$[M)'KM,\"[I!%+Q!&+Y!"
- "\";E\"$KQ#$+Q!&[U(%;U\"#+Y!%+Y!%<!\"(<%%%+M!%,!!&+]!&L-#%;Y\"%<5%&<5!"
- "',1)(<1%(\\-(%<9!$L)#%,1!!<5&%\\=#%<9!&<9!#,9!#,1!%<E!'\\9#(,A#%<A!"
- "%,=%&\\A#\"<M\"&<I!$<E!#\\=##LE\"$LI\"%,Q#&\\9(',U(&LI&&LI&&\\E'%<I!$<Q!"
- "%<9!&LM!%<M!'LI!&<]$&LI&%\\U\"%\\A#%,=%%LM\"%LI!%LM!%<9!%<M!%LE\"'<9!"
- "%<I!%<A%'<M$(,I-&<5%&\\E\"%<I!#LE#&<1!(<5!(<1!$<E!#,=!$,9!&L9&%<5!"
- "(<1!%,5$%,1!'<1!%<5!%,1!&,-%%\\)#%\\)#$\\)$%<%\"%<%!&\\)('+Y!)<)%&;Y\""
- "&;Y'%;M\"&+U!%+U!\"[M%$+Q!#[A!&+M!&KE($[I!%;E\"%;=&$;=\"#[9!%;9#&+A\""
- "'+-*%+5&#[1!#K5#!+-!$:]#$+)!'ZY\"%Z]\"%+%\"#Z]%#Z]!$Z]%$ZU!$JU!#JI!"
- "$J9%#JM!$*E\"#ZA\"$*A\"#JA!#*A\"$:9#$J5%#J=!%*1'$*1##J-!#J-!#J%!%Z%#"
- "!)]!#:)#$)]#$)]#$)U##Z)\"&IY##9A!%)=(#9A!#99!$IA%#Y=&\"I1!#)9#\")5\""
- "#95!#I!%#I)(!I)#$9%&%9!##8]$\"8M!#(U##XI'$)!(!8M\"#(I!\"8U#\"HE!\"X=("
- "\"8!!\"H=$#8%%\"X5#$X=+\"8=!#HA\"#XA##(E$\"XI\"\"8Y!$(U%\"8]!!HU!$8Y(%I%'"
- "\"Y!#!9-\"#Y)#!)!!\"I!\"\"I1!#9-$!YA!#)5##Y=&#YA\"#9A'&)E)$)I#\"YM%#IM\""
- "#9M!%YU(#YY\"%)E$#J!!$)U#$J)%#YY\"#Z)\"#J-!#:-#$:1##J1(#J9!!:9%$J9!"
- "%*9*$JE!\"*9\"\"ZI%!:I\"%ZU)%:U#\"ZY!$*Y\"$;!#![-!#[!!$ZU!$;!#$[)!![9!"
- "&K5(#[-!%[1*$+5\"$[5!%[9%%;E\"&+M!%[9!%KA#&;I&%;I\"%[U%&+M)%+Q%&+])"
- "!+Q%%;M\"';Y*'KY+%KU#'L!,&+]!&,%!%\\!$$<%!%,1!%<!&%,-!%+Y!'<9%&<9%"
- "&<1!$<-!'[])$,5!'<1!%L-#%<=!$<9%%<=!%<=!'<9!%<9!%<A!&LI&%\\9#\"<I\""
- "%<M!'LQ!&,E#%LI\"&\\Y!%LE\"$\\I#(<E%$<E!',U#%<M!%<M!'\\Q+%LE\"%LE\"$<M!"
- "$<E!&<M!&\\M0%LM\"',Q#%\\Q\"$LM\"&<I!%<Q!&LY&'\\M'#,I!&<U$&\\M\"'<Q$%<I!"
- "%<I!%LI\"%L=\"%<A!%LE\"$<M!!<M\"'<M%(,A#%L5#&<M!&<A!%<A!%<A!%,-!%L=&"
- "&<9%$L9\"'<-!&L5&'L)\"$,)!\"L1#&L-\"(,%%'<1!$,1!$,)!$+]!&,%!$;]\"%<%\""
- "&<-!%<%\"%+]!$;Y\"%;Y\"&[U-#+Q!$[Q%&;M\"%[E$%+U!%[=!\";=\"#[A!$[=!#[E$"
- "%;9\"%+A!&[9!&[1!#[1!$+1\"$[-$$+-\"$[%%$[!!%*]\"#Z]!#J]$#J]$%ZI*#Z]!"
- "#*]\"%JE%$[-$&*I+#Z9\"#JI!#ZE!$J=!'ZA#&*E$$JA$&*-+#J1!$:-!#J%!!Z%!"
- "#J%!$:%$#I]!$9Y$#IU\"\"IU!$YY'%)Q!#YI##YI%$IE%#)5#\"I=!\"I=!%95&\"Y5\""
- "!YI!\"I1!#I!&#I%%\"9%##(Y#$(]'!(]!\"Y%\"#HI#$(Q'\"Y)\"#(M#\"8I!#XA&#HA("
- "$(!&#(1&\"X5#\"XA\"#89$#(5$\"89!\"HE!#HI##(I##(U!\"XE\"$8U%!HY!\"Y%\"#I%("
- "#9!!\"8Y!\"Y1\"\"I1!\"H]$#95$\"I5!\"I=!$IA&$I5&#9A!%)M(&)5,%9U($IU%!YU!"
- "%YU(#9Y#%9Y!#Y]%#Z!\"$II##*%\"#J)!#*-\"!*1!\"J1!%Z5&\"ZE!$J9!$JQ%$*A&"
- "#ZA!$*A##J5!#JE!&JM\"%*Q'$JU!#*Y!%:Y$#Z]!#[)!$[%!$;%\"\"K)$$+)\"#[5!"
- "$+!\"#[1!&+9*'+=&%+5\"%+=!$[=!%[M%\"[A!%;E\"';E\"&[I)$KY#\"[9!$[Q$$+Q!"
- "$KU#%;U*$[Y$&KY#&+]%%;U\"%+Y!%+]!$<%\"&\\)#&,)!%\\1#%,)!%L%'&,A$&L%'"
- "(,5)%<5!%L-#%<9!$\\-$#\\1#%\\=#%<=!\"LI#!,A%%LA\"&<E!$,=!&<M!%LI\"$\\E#"
- "&\\I+#LI#%<I!&<E!(,M,(<=)&\\U\"$LU!%LM\"&\\M\"$\\M''<E)%<E!%<Q!%<U!%<Q!"
- "%<]!%\\U\"%LY!%<=!%LQ!&\\M#&LQ&%<M!%<Q!$LU!%\\Q\"(<M$$<U!%\\Q\"',Q('L]!"
- "&,A$&,U#)<U#%\\A#&\\M\"$LI\"%\\I#%LA\"&<E!&,I$%LA\"&\\5#%<A!%LE!&<-&#<5\""
- "&<)!%<9!%L5\"'L=+$<5!%<5!&<9!'\\1,&,!%%L=+%,)!$,!!$,)!&L!'%,%!%L!#"
- "!,!!$[I!%;M\"%,-!\"K]#$+U!!;U\"$+U!$;U\"$+M!\"[Q$%+I!%+5!%KE$#;A\"&;I&"
- "&+5\"$;9&'[1*%+5!#[5!&+-\"%[-!#[-!$+)\"$[)!#;%\"!ZM!\"[)!%K%!&ZY.%*M#"
- "%JY)#ZQ!\"ZM!#*I\"$ZM%$ZE&#JE!#Z9\"#J-!%:A#%*1'#J5!$J-\"#J-!#*-\"\"J%!"
- "$:!!$*%'$:-##Z!\"!IY'%Y]+&9M&$YM##9M!&YY!!YM$#)E#\"I9!%)=$#9I!\"Y9\""
- "\"YA\"\"I-!#I1\"#I-%\"Y)\"$)1$#Y5#\"I!%#HI%\"I!!\"X]\"!XY!#XM#\"8M!!XM!#XA$"
- "#(1#$81$#HA%#XA!\"8)!\"XM\"#H=##XM'\"8A!\"8Y!\"XQ(#XU#$8U\"\"I!!#8U$!Y!!"
- "$)1$$))!#8]!\"I9!$YM#!)=!%95##9=$#9E#&9A#%I1$\"YI%'9U'#Y9#$)Y##YM\""
- "$)U#$)Y##YQ#%YM$$Z!#%:%%$:)!%Z)#$*-#$Z1\"%Z5&$*5\"$J5!$ZI!#J9!#J9!"
- "!ZE$\"ZI!$*5##ZQ!&*9##J]$#ZU!\"*]\"%JY$&JY!#[!!#[%!%+%\"!;1&#[-!#[%!"
- "$+5\"\"[1!%[1!%+9!([I$'+=*&+Q!&K=(&[A)%KU#$+M!$+Q!$;A\"\";Y\"#;]\"!+U!"
- "%;Y\"$L%#%+]!$[I!&,!-%+]!&KI($\\)$&[])&\\!-&,5($<-%%L5&%L1\"$,!!$\\9#"
- "&,1$\",)!&L9!)\\=\"%<=!'LM*&<9%$<I!#,A!%<A!%<E!%<E!$\\I#'LM+%<I!%LE\""
- "&<M!&\\I\"$LE'#,I!(LU*%<I!&\\I'%\\I'&LU!(,],#\\U#$<U!)<Q#%,U#%\\Y\"%\\Y#"
- "%<U!(<U)%LY!!<U\"%]!\"$LU\"%M-!$\\U(&,M$%<Q!&M!!&,M#%<U!#,U!%<Q!%\\Q\""
- "%<I!&LY!)LQ*\"<M\"'<I$),M'%<U!#\\I#$<I!%LI\"&\\I'$\\E#&L9&%<E!)\\=\"#,5!"
- "',A#',A$%\\E#$,5!!,5!%<9!%<9!%<-!&,)!(\\5,%,1!',1%'L-&&K]'&L)\"%L!#"
- "$\\%#%,)!(<5!&,!)&+])%[Q$%+]!%;U\"%KM'%+Q)\"+Q!\"+M!&+I%#;I&%+5\"%;E\""
- "$[=$\"[9!%;5#&[E!%+)\"$K5$%;5&#[))%K-($;-'$;%#!;)\"#Z]!\":]*#ZU!#ZY!"
- "%ZU&#ZU!%:M$\"ZY!$*A\"$JM!\":=\"$ZA\"%J9%\":E&#ZA\"#Z9\"#J5!$:1!&Z9($Z5\""
- "$J-\"#:%#$J!%#J!$#)]##*!##YQ##9Q!$9Y$#9I!#9I!#YI%$IA&#IA\"!)=!\"I%!"
- "\"I5!\"Y1\"#91$$Y-'!I!&!I!#&X]!$))!!HY!\"8U!#HU%#8U$\"XQ\"\"HI$#XE&#XA$"
- "\"81#\"81!!HE&\"8=##89$\"X9#\"XM\"#(I#%HE+\"8E!#(U##8Q$!XY$#(]#$I%$$IA#"
- "#I!#!))!#9!%\"I5$\")=\"#Y=#$9E\"\"9=#$9=\"%9A(%II&#)Q##9Q!%IE#$)M#\"J)$"
- "%IY&#YI%$J)%#J!!$*5#%:)!%*)$%*-'%Z9\"#Z-)$:5#$JA$%Z=&$:='$:E#\"ZI!"
- "$ZI&#ZE\"$:U$#JM!#ZQ!\"JQ*&:Y$#[5!#[%!%;!+\"[!$#ZY!#;)\"\"+-%%K-$\"[1!"
- "%[5)%+1\"%[9)'+A&$[A!$;A\"%;=&%KE#%;E\"&;M'$+M!$,!!$;Q&&KQ'%;I\"%[I!"
- "&+Q!%+]!$KY#'<-!#<!\"(L%0(<)*%,%!';Q'&<-!#;Y\"%\\5##\\5#%<5!%<9!&,9$"
- "&<9%%<=!%,1!&<=&&\\A'%LA\"%LI!\",E!%<=!$\\E#$<I!#,I%$<E!&<M!%\\Q\"*<M)"
- "%<Q!%LM!&<I%%\\=#&\\Q&&,U)%<]!%<I!%\\U\"',Q#%<I!%\\Y\"$<Y!$LQ\"%<]!#,Y)"
- "(,],&]!!%<Y!%LM\")LY2%M%!&-!$%<]!&,Y#&<Q$%<U!'LQ!%\\Y#&\\U\"%<I!'L]!"
- "&<U%%LU!$<Q!&\\Q&'\\Q\"'<Q)%\\]\"!,M!',E('LI*%<U!%<I%%LI\"%<Q!&LM&&<A%"
- "%<A!'<A!%,-!$,=!%<U!$<E&%\\)##,9!',5(%<5!$\\5((,9(%<=!%L)\"&L-'$\\),"
- "%<5!&<%&%\\!$%,!!&+Y!&[](*<-%$;Y\"%,!!&+U!$,!!&;U\"$+M!$[I!%;I\"%[5!"
- "%K9$%+A!$[9!(+E.$[=$%[1!$;1\"#;5\"%+)&$[-$\"[-!#[1!%ZU\"\"[!!#Z]!#Z]!"
- "$JM%%:M$&*E+#ZY!!ZU!#ZQ!$JE%$:E$\"*A!(J=#%:M$$:M$$J5!#JA!#J1$%:1!"
- "$:-##J-!$Z)#$)Y##Z!\"#9A!#Z%&%IY*'YU&%YI!#9M!#9E!#IU!$I5&#99!$9=!"
- "$9-%#95'!91%\"I9!#)-#\"I)!%9%&$)!!$(]*!(]#$HM'#XI#!(Q!#(E$$(M'\"HE!"
- "$89)\"(5##(5$\"85!$8A&#8A$\"XE+!(M!\"HI!#HM##XU&!8Y%#(Y##XY/#(]!#9)!"
- "\"8]!#I)\"\"Y5\"!)1!#95$#)M#\"I5!\"I=!\"IA!\"II!%9I\"%YI!#)E##J!!$)Y##IQ\""
- "#J!!#J-!\"Z!%#J%!$9Y$%9]$#:1#$J1\"#J1!$J5!&:=!\":A#%:=($*A\"!JI#$ZA&"
- "#*I\"%*U'#ZQ!$*M\"#[%!#ZY!$*Y\"$JU$%K!($[%!![%!%+%\"![-!$+)\"$+-\"&;1+"
- "\"+1!%;=\"!+=!$[9!'KA$#[A!%;E\"$[I$$;I\"$+U!$[M$\"[A!%+U!$+U!$+Y!&KE("
- "'L!\"%,!!%\\-#%\\-(&,%!'L-&%<5!%L9\"'L5!'\\-#$\\5#%L5#&,5$(\\5(&+]%%L=\""
- "%L-#%<=!$<A!$\\I#'LE&(,I,&<A!'\\E#&<E!'LI!%\\5(%\\A#$,9!#,Q$&,Q#&LU!"
- "$<Y!'<I$&LU&$L]\"%<]!%<]!$\\]#$LY\"&]!\"',]#%\\]\"&M!!\"<Y\"'<])$L]!&\\Q\""
- "&<M!\",U!'L]!&,Q#(])!&M!!%<]!%\\Y\"']!&%<]!$=)!%<Y!%<U!(<U-$<Y!&,Y#"
- "%M!!%\\M'%<U!%LM\"&,Y#&<U$%LY!%<M!),M-%,U$'\\]!'\\='%]!\"'\\A''LE+'<A%"
- "),I,(\\I!$\\A##\\9#'<=)$,1!$L9&&<1%%<A!'LE!$\\5#%L5#&L-\"&<-%$,)!%L-\""
- "%<)!&<1!%<%!%L)\"$[I!%,!!$K]#'KU0$K]+)KU-&;U\"#[I!%KQ'$+M!&;I\"%[E!"
- "%+M!'+=!%[A!$[=!&+=\"$[9!$[=!&[5!%;9&#;=\"$;-\"%+)\"$[-!%;!$#[%!$J]!"
- "\"ZY!$JY!$ZM\"#JI!$:Y'$ZM%\"ZE!\"ZE!#ZQ!$:=#$:=#%:=(#Z=!#J9!%J5!!*1!"
- "#J1(\":-##J)!#:1#%:-%\"Z)\"$9Y$#I=!$9U!$YM'$IE&$9I$#9A!#9Q!\"IE!\"YA%"
- "%9A(\"Y9\"\"Y5\"$Y1'\")%\"#9)$$X]'#Y-##9!\"$(Y(\"X]\"$9!%\"(U\"\"8U!\"8M!\"XE#"
- "!(5$\"XI%%(=##H=&\"XE#\"XI\"!XI$!8U\"!(]!$XU%\"8]!#(Y&\"X]\"&)!$\"8U!#9)!"
- "\"91#!I%##I1\"$)1$%)5%#)9##9='$)A#!YI!#9I!#YI\"$9M$$YQ#&)Q%#YQ#%)Y'"
- "%IM#\"J%!%J-)\"J)!$J%\"#J1!\")U\"#J5$%J5\"#Z9\"#J5!#JI!\"JE'#ZI\"&*Q'&*E$"
- "#ZI%#ZY!#ZQ!$+)!#ZY!$+)\"$*]\"$*]\"#[!!#Z]!#[)!#[-!$[-!$;1#&+5&&K)("
- "&K5$$[9!&+=&&;A'&+E&(;A\"#[A!\"[E!$+M!$+M!$+Q!%+U!&+Y%';Q')<!*'L!\""
- "%L)#'<-!#L%#%L-\"&,1$&<-!$<)\"%\\A'%<9!&L5\"&\\5('<9!$L-#&\\A($,=!%LA\""
- "(\\A0$<A!!,E!#LQ'%\\M#%\\A#%<I!',E(%<M!&\\Q'%<I!&LM&(,Y,&,]#$<U!'<Q)"
- "%\\U\"#,Y!%<]!%\\Y#%<Y%&\\]&#LU\"%M!!%\\U#%]!\"$]%\"&]5!%<Y%%,Y$']%+',]'"
- "%])\"&\\]!']!'%M!!#,U!%M!!&<Q%&])'$M%&&M!!'=-(%<]!',]''LY!&]-'$<])"
- "&=)$&L]&%<Y!%LY!&,Y#&,U(&<U%%<I!%LU&&\\Y'%LE\"$]-\"%LQ!)LM*$LM\"$<M!"
- "%LI\"$<E!&\\I#%<A!&,M$%<A%%<A!%\\=#%<5!%<=!'L9+%\\9#%\\9#&\\-(',9)%,)!"
- "&L-#%,-!%,!!'L%+&L%\"%,!!$+U!&<-*%K]#';]*(+])%+Q!';Q+%KY#$+M!#+Y!"
- "%;I\"%;I\"%+M!$KA$$[A!#;=\"$;A\"%+-&![5!$+9!\"[-!\"K-#'K!1#ZY!$K!$#;!#"
- "#[%!%ZQ*%JY!#ZU!#ZQ!#JI!#ZQ!%:U'$Z9\"$JE%#JA!$ZA%#Z=!$*5#(J-,\"J1!"
- "%:1!#*5\"#Z)\"$:%$$*)#&*)%#Y]\"#9M!$*%#$)Y#&YQ\"$IE\"%)I($)A#&Y1)#9A!"
- "\"95#!99\"$)5$!)1*#)1#!Y%$\"I%!#Y%#$I!'#9%%!HY!%)%+#XU&\"8Q!#HQ&\"(E("
- "$85)!(5!$HA$$X5+$8E#$HI!\"8E!#HM&!XU'#(Y!\"HE$$X]$#Y!'#8Y!%9%&$9%#"
- "#))#\"9-#\"I=!\"I5!#95$#I9%$)5$#IA\"$IA%$YA'&)Y$\"YU!$9M$\"Z!\"#IY!!Y]!"
- "#J%!$*!#$9]$%:%%#J%!#J5!#J1!\":5\"!*1!%*1##ZA\"$JE$#JA!#*E\"#ZU!$:M$"
- "$:]#$ZY\"&*I$#ZQ!\"*Y!$Z]%$J]$$;)\"#+)!$;-\"#Z]!$+-!\";1\"$K5$%+%\"$[1!"
- "$[E!%;=\"'K=($[=!%+Q!%[I(&;I\"$+M!#+Q!$;U\"&[U$%[U%#,!!%K]#%,%!%,)!"
- "),-$%,!!',9)$,!!&\\-(%,-)%,-!$,5!)L5!#,1!%<A!%<9!$<A!&<=&+,9(%LE\""
- "&<I%%LE\"&<U%&<9!%<I!&,Q#%LI\"',5('\\Q'&,U#$LQ\"&,U#(\\U!%<Q!),Y0$<Q!"
- "&,]##\\]#%<]!$<U!&LU!&M)!%\\Y#%M!!%<]!%\\]\"&M!!$=!%%M)!(M-$%M%!%]!\""
- "%M%!(=%(%M%!&=%$(M-)(,U'%=%$%M-!&M!&&M%!%M!!%LU!'=!$%<U!(=!#$M!\""
- "(-!'%<]!'=-(']%+$<]!&L]&%]!\"$LY!#=%!&<M%%\\U'%<U!%<U!'\\A#&,M$%<E!"
- "%LM\"%LE\"#\\I#$,9!(LE+&\\A'%\\U\"$\\A#&<9%$,=!$,9!&\\A'&L9\"'L5\"%<5!$<-\""
- "%L1#%\\)#%,)!'<)%$K]#$,!!%L-'#,!!%;I\"%+]!&+Y%'+Y%$[Q%$KQ#$;M\"%;M&"
- "#+Y!$[I!$;I\"%[A!&+1\"%K5$&+9&'+5+%;5\"$[9!#[1!'+-\"#+-!%+-\"#[-!%;!$"
- "'*]'%JY!!:Y&$;5\"#ZU!$JY!#ZQ!#J9!&:I($*9\"#*A\"&:9%#J5!'JE\"$J9%\":5\""
- "#Z5%#Z)\"&*)!%:%!%:)(%*!(#Z!\"$)]#$*!##YU%!IU#$YE##YM#$)I!#9E!#I1\""
- "#9=!#)=#$I5)\"91##IA!%I-(#))#!)!!%9-##I!#\"I)!\"I!!!(U'!(U!#(M#!HI+"
- "\"X9\"%(=##H=&\"X=\"#XE##(M#$(M%\"HQ!$(M'!(A##(U!#HQ%\"Y)\"#Y%$$95\"#H]%"
- "#)-#$)!('9M.!)E!$)9*\"I=!$)A#$)5!$)M#$9I%#YU\"#YQ##9Q!$9U!#YY\"$*!#"
- "#J!!#*%#\"I]!\"J)!#J-!#:)#\"*1\"#Z5!%Z9*%JU!$:A#\"ZA!$*E\"#ZA%#J=!#JM!"
- "%*U&\"*M\"$*]\"$*Y\"#K)#$;!\"&+1*%Z]!#+1\"#+=!![-!$+1\"$[5%#K9$%[9!%[=$"
- "&K9,)[A!&[E%%[E!#+U!'[Q$%KM,#+M!#;M\"&,%!%+]!&K]'%K]#%,%!&,%!),1("
- "%+Y!%+U!$<!!%<)!%<1&%,-!%<E!%<5!%,!!'<9!(L=!&<=!$L5\"&\\I\"#,9!$LE\""
- "'<9%%<M!%L9\"),M#%LM!%,U$&LY!&<M%%\\U\"%LU!&<U$%<Y!&<Y$(M!%&,]#&-!#"
- "*M!$%\\U\"%M%!%M%!&<M!$M!\"(=!-%M%!'-1\"--!*%<Y!%]%\"&M)%),]&']%!%M1!"
- "&=-$(M9$&=)$%M1!%<Y!)]5$&]!'\"=5!&]5!%M%!(=-#%])\"'M)%$]1\"$LU\"'=%)"
- "%--$&\\Y&%M!!&M!%'-!,&LY!%M!!&,]#$LY\"%M-!%\\Y\"%,]$$LU\"&<I!(,Q('\\Q!"
- "\"\\E$%,Q#%LM\"#<M&%\\U\"'<5*&,E#)\\M!$<M!$\\A(&,9$#,5!%L=\"'L=&%LA\"%<5!"
- "'<1*&\\=(&\\=(%+]!#,)!%+]!%L-\"',5)%,!!(\\-($+Y!&+Y%&+Y!%+]!$+U!',!."
- "$+M!'+M*%KE#$;E\"%;A\"'[I$#K1#$[E!![I!$K1$%[5!$;1\"'+-\"\"[)!!K)#$[%!"
- "%*]\"$+%\"\"ZA!#*Y\"#ZU!%:U'\"JQ##ZU!$JE!$JI$#JE!#JA!\"Z=!&:=%#J-!$:9$"
- "#*1\"$:%!!:5\"$:%!#J%!(J-)&9Q#\"9]#%9Y($YE-!YU!#9Q$\"YQ\"$YI##YA##IE\""
- "%YE'#)=##)9##)-#%95#\"Y-\"!Y-!\"Y%##9%$#9-!#)%$\"8]!\"8A!#(U#!XM!\"8U!"
- "\"89$\"81$\"X9\"#XM&$8I&\"8I!\"8M!#(Q#\"HY!#I%\"!HQ&\"Y)\"#XU##I)\"#I)%!)9$"
- "#I1%#91$\"I9!\"IA$\"Y1\"&YQ$#)9##YA#$YM&%)Q!$YQ'$)Y#$YU&$)Y#$9]'!)]!"
- "'YU-#J%!$:)!$Z1&$:%$\"Z1!%:9(#Z9\"\"ZE!#:='\":E#$J9%#JM!$ZY%$JM(#ZQ!"
- "$:U'&ZU.&*Y'#ZY!\"J]##+!\"#[%!&ZY\"#K)#'JU%&K1,%[1)&[5)'+5+%[=$#[-!"
- "%KA$'[E!%+5\"%;]\"!+M%$+M%#+Q!%;U\"%+Q!%;Y.%,%!&;U+\",-!%,%!%,-!&L%\""
- "&<-!%<-!%L1#%<9!#,)%(<A*&<1!',)%%<E!%\\=#(,=-$LA\"'LE!%<I!#,E!&\\Q\""
- "&LI&&,M$%LM\"%\\Q\"*<5/'\\U,$\\Q#$<U%'\\Y+%<Y!%<Y!%<Y!&,]#%\\]&&\\Y\"%M!!"
- "'<Y$&\\U\"&=%$$=%!%M%!%M%!$]%\"#M)\"'])!&M)!%M-!(])%*=!\"&]-'&]5&&]!'"
- "%M-!'--\"#M)\"$M)&#==!#=%!&]9!%M!!!-%!%M!!%M1!&=)$(]!!$]%#'M1*%])\""
- "%]%\"#-%$&-%$%M5!$=)!'=%(&,U)\"=!\"#=%!%M!!%<]!%<]!%\\Y\"%\\Y#%\\Y\"#<M!"
- "%<Y!$<E!'<E*#,I!&\\A#%\\Y#&\\E\"%\\I#&,E##\\I(%,5)%LA\"%<9!&<A!#,9!%\\=#"
- "%<%%&<5!%,1!',A(%,)!%<=!#<9&%L)\"%,%!%L%'$,!!';]\"+\\!(%L)\"!+U!$KU#"
- "#+Q!$;E\"$+M!%;I\"&+E%);U\"&;A&&+5\"%[5$\"K9#&[!)&[A%%+-&$+-\"![9!(K)&"
- "#[)!$ZU%#Z]!&Z]\"$*Y\"#ZU!$:U$$*U\"$:M##JI!%ZI\"#ZE\"#:A#$J=%%:9!\"Z5%"
- "%Z5\"!Z-!$J-)$Z%\"\"Z)\"#Z%\"#J)!%)]'$*!##J%!\"J%+#J%!#YQ#$Y9!#II\"&)M%"
- "#9A!#I5\"#I5%!)5!\"Y1\"\"YM!\"Y%%\")%\"$9)($Y!\"#9!!#9!!$9!\"\"HU!\"HU!#(Q!"
- "\"89!$(=(#8A'\"HQ!\"XI\"\"8M#\"8M!#XQ##XQ&$8I(#(Y#!X]!!Y)!$)%$#))##I%\""
- "%95,\"IA!#Y9#\"I9!#)=#$)A#$9E!#9I!#99!$IM%#9Q!%YU.')Y)#9U!$Z%##IY!"
- "&*%$$J)\"#J)!#J-!&:5,%JI!%:E!%:9(#J=!$*Q%#ZU!\"*A\"#ZI!%ZM*%*Y&$J]$"
- "#ZY!%+%&%:]##Z]!$[%!%K%$#[-!$K1$$;)#%;-#$;-\"$[9!%+A!&K9(%+1\"%;A\""
- "&[9!%+=!$[M(([M%%+M!$+Q!(;I\"%[U$$+Y!#,!!%KY##,!%%+]!&\\%(&L%'%,-!"
- "%,-!#<5\"%<9!#L5#(,9#&L1\"%L9\"&<E!$\\=#%\\=(%L=/%LI!&L=\"%<I!(LM*),M#"
- "&\\I'&LQ!'LI!(\\Q0\"<M!%<U!#,Y!%LY!%<Y!(]!!&\\]&&M!!&\\]!(]!&%=%$&-)#"
- "%M%!!-)!%<]!%M)!%M%!(-)'$=)%*=-''=9#&]1!#=-!*=-1%]-!'-1\"(-)\"\"]-$"
- "%M5&']1*&=E$&=1$%=5$%]-!'-1'(=!$%M)!+-5%$=!!)--!'])!$=%!&M-!%]-\""
- "&--(%M1!$])\"%M-&%M%&&-1#&-%#'])!%M!!&<]$(<]($M!\"$=%!%,U#%\\M#%<M!"
- "%\\]\"',U(%<M!(LQ!%<]!(,Q,%<M!%<Y!%<A!%<A!',Q#%\\9#'<A!'\\A,%L1\"%<9!"
- "'L=!$,A!%<5!%L-#&<%%(\\)#&<-&%\\)$&L)'&L%'%+Y!',!!%KU#$+Q!%;U\"#<!\""
- "#[U(';Q\"$+M!$;Q\"%;I\"&;=#%;E\"%+A%#[=!%[A!![I!%[5!';5'$+1\"#[-!$K)("
- "%+)&%;%##Z]!!;!\"#Z]!$JY$%:U#%:M(%:Y$$ZQ%$:M##J=!#ZE\"!ZA!%*=#%*9'"
- "#*=\"\"J1!!:5\"$Z=\"#J)!$:-#!Z%!#IQ\"#I]$'9Y#!)M$$IY%#IY!#9U!$Y='%)Q$"
- "$)U#$IA%\"I=!#)1#\"I9!\"Y9\"\"I%!!Y-!\"Y)\"$I)#$Y-!$Y!(#XU'$8Y%#8U$#8Q$"
- "\"X5#\"HA\"\"(E(#XI$$HI*!XI$%(]\"$XY!#XY&\"XQ\"\"X]\"#H]\"#9%!#9)!\"Y9\"$9)%"
- "#Y-##)5#\"Y9\"\"9A##)A##Y1#\"YE\"#YI##99!&9Q&#9U!%)U!\"J)#%Y]+$J!%#:-*"
- "#YY\"#Z)\"\"Z5!%:1($:5#&*5($Z9\"#Z9!#*I\"$Z=%#JI!$JE$#*U\"$:I#$*Q\"#*U\""
- "$*Y\"$*Y\"$[)%$;!#$J]!#[%!#[)!&+1\"$K9#%K=(%[5!%+9\"!;5\"%K=#$[A!#[A!"
- "&[I!)+Q!'[E2#[=!%;]\"%+]!%L!#%;Y\"$+]!$L!#$,!!$,-!$<%\")L)+%<5!%L5\""
- "%,-!#L-#&,5)$,A%%,-!%L-\"%<=!%<9%%\\A#%<E!&L]!%\\A#(LY)%LU&%<U!$<Q!"
- "%LY!%,Q$&LU!%<E!&<Y%$<U!&L]%\"<Y!'-!'%,Y-']%0&]!\"']-!&=%$$])#'-)'"
- "%]-\"'-%#&-)#(--+%M-!*]=$'=-)%M1!'-1'%M=!'-%\"&]1!$=5!$=-!*M1'%M)!"
- "%]1\"'-9\"&]5+'=9('-5\"#M5!%]1\"&-!#'==(&M5%%]-\"&=%$%M-!%]1\"'-9\"&==$"
- "%M-!%M9!%]-\"%]-\"&-)((\\Y/%M)!%=)$&M!!(=%(%]%\"&-!$&M!!%\\]\"',]'%]5\""
- "%M%!&LU!']%!$<Q!%<Y!'LI+%<U!),M'%LI!&LM&#,Q%%<5!',9$%,1%$\\I'&\\='"
- "%<=!&<A&&LI&#,1!'<5!#,1!%+]!#,-!%,%!'<-!',%*'+Y!%K]#%,%!%,!!'K]'"
- "$+Y!%;Q*$[Q$%;Q&$[M$$[E!\"+M!%+5\"&+9*%;E\"%K=($[A!#[5!\";1\"$+)!&[1%"
- "#[-!$K-$$;%\"#[)!![!!#Z]!'+!.%JU!#*Q\"#ZI\"#JM!$ZI\"$JE!\"ZA!$ZE\"%*5'"
- "%J9%$:1!#J1!\"*1\"\"J-!\"J%!#J!!#Z%&$*%##IU\"#9A!#9U!!YU!#IU\"#YQ#%)E%"
- "#IE!#9I!$)9$#I=\"#)9#!Y5!#91$#)-#\")1\"#Y)&#Y!#%)%)!HY#\"8M!!H]#\"HQ$"
- "#X='\"8=!\"8E##8I(\"X]\"\"9%#\"XQ%#(Y#\"HY$!HU&#)!#$Y%!!)!!\"XY\"#9-!$)=!"
- "%I5.#)=##9)!#Y1##9M!#YE#$YI$()I+\")M\"%9M\"$IQ&!YY!!Z!!$IY&#J%!$Z%&"
- "#J)!%:%!#J-!#J=!%Z5##J9!#J=!#*=\"#ZA\"#*A\"%JI!$*I\"$JQ%$[1,\"ZU!#ZU!"
- "$*Y\"$J]$$[!!#Z]!#[!!![)!#[1!\"[%!$K1$$K5+%;9\"$[5!%;A\"&;=&%+E&$[E!"
- "%+Y!$[E!%;E\"%K]'&<-!%+Q!%,!!'KY+&KU#'<)%'+]!%+Y!$\\)$%,)!&KQ(%L1'"
- "(<1.',5('L1\"&L9'&<=*(L=!%,9%%<E!!\\E$#,E%&LI&%<I!&<E%'LQ&#,Q!&<U$"
- "%<U!&L]!*LY)%M!!%<Y!&M!&']!!*-)&'M%*&-%$)<]#&-!$(-),&])&#=%&&-%#"
- "%M-!&-1#%]=!$=1!'=1$&MA$&=5$'-5'&=%-$-5$)-5!(]5%'-A\"']5!$M=!%M5!"
- "&]5!&]1&&]9&%M-!&-1#'-!#&]5!$=5!%M9!\"-5!)=5'&=5$%M5&&M5%&=1$%M1!"
- "%]1\"'-9'(]5.%]5!$=1!%=%$(-)\"#]%,'--#&])&)M-)'-!(%]!\"$=-!%M)!%]-\""
- "\"<Q!#\\](%<]!&M!!',Q('<U$%<M!'\\I+%<Q!$\\Q#(\\U!%<M!$,A!#,Q$(L=!%<=!"
- "&LE!&<=!%<=!%L=\"(L5/$\\A#&L%'&<1!&,-$%,)!$<!\"&,%%(,!!%,%!&+Q)#;Y\""
- "'+Y%%KU#)+]*$KA$%+M!![I!%+M!%[A!$;A\"%;A\"%;I\"#[1!$[A!$+5\"$+1\"%;5\""
- "%K-(#[-!\"[!!%[%!#JY$\"Z]!\"ZU!\"ZU$$ZE\"#ZQ!%:]'#ZE\"#ZA!#ZA!%*A&#Z=\""
- "#ZE%$*-##Z5\"$:9$&*E(#Z-\"$J)\"$)]#%:!%#J%!%IY*$9]!%)U!#9]'#9Q!#YA#"
- "$)I!$IE#$)Q$#9=!#)9##)=##)5#$9)(\"Y!\"\"9%##9!%$)1$$HY#\"I)!\"8Y##HY%"
- "#XI!\"X-#$(Q(\"8I##(E##XQ&#HY%#HY%#9!!!Y%!#H]\"!I%#!)-!%9)'#)9#!Y5!"
- "$)5$$)1$#)=#$)=$#Y-##9E!#YQ#%)Q!#9M!$YY'%)U!#YM#$I]%$*%##J!!!YU!"
- "\"Z)\"&*-$#Z%\"#J5!$J5!$*1-$J-!#JE!#JE!#JE!$ZA\"%JQ!%ZQ\"$*Q\"\":U\"%*]&"
- "$K!$$;!\"#+!\"#+!\"&+)+#;%#%[-)$[1%$+5!%+=\"%;-\"$[=!$[A!$[E!%+A%#KE#"
- "%+I!'KM(![I!$+Q!';Y\"%;Y\"%,%!&<!\"(<1%&<)%&<%%$,-!%L-\"$,-!&<-!&,)%"
- "%<9!$,)!'L9\"%L-\"$\\E#\"<M&%<A!%\\E#$LI&%<U!(,I,\"M-\"),U,$<Q!%<U!%<Q!"
- "&-)#'<]#(LY%%<Q!%<Q!$<U!%\\Q#%<]!$=!!$=%!(M%)%M%!'M)%(M-.&--#&=1)"
- "%M-!&M1%&M5%%M-!&-9\"%MA!$=5!%M5!&==$&]A!&M=$%M9!*]=$&]-&\"M=\"&M9$"
- "%M9!!-1!(MA(%M5!%]9'(-9'%=A$'-='%-9$(==\"&M9$&]E%&]9!&M-!%M-!&L]!"
- "%M5!&-5#&-9\"']1!%M1!'-1\"&M1%%<]!']-!%]-\"$=1!'<U)&])&&=%-%]%\"%M9!"
- "(]!!&LU!&-%(!]!$(]!+%<Y!'<U)',U#%\\U#%<U!%<E!%\\U\"%<Y!#LA\"%<E!%<A!"
- "%<=!'\\=('<=)%<A!$\\-#&<1!%\\A#&<-&%<A!%<)!%,-%%,)!&<)%&+Y!%+]!%<%\""
- "%+U!%+Y!#[E!$KU#$+Q!%[U(%;9\"&;A\"%+=!\"[=!'K5$$+=!$[9$%;9\"%+5&#[=!"
- "$[-$#[-!#K9#'*Y'$[)!#ZQ!#Z]!#Z]!#ZU!%ZE\"#ZU!$JU$$:Q$%JM!#ZA\"$JA!"
- "#ZQ!#Z9\"#Z1\"#:5#%:9!\"J%!$:%$#I]!#J-!#J!!#:)#!YY!&9U##YY\"\"IU!#9E$"
- "$)U##YE#%9=*#YA\"#I=\"#Y9&!Y9*\"I5!$YA#\"Y-\"\"I-!\"I%%&9!.$(]'#X]!\"8Q!"
- "!X9!#(I!$XA+#8=$#8M%\"XQ\"$XA\"#8]$$HU)\"I!!$)1$\"Y-\"\"I1$$)1$!Y9!\"Y5\""
- "!9E\"!YE!$IE\"%IA##YE##IA\"$)=$!YM!%)U(\"IU!$9U!%*)#%Y]#%:-!$*%##:)#"
- "#J1!#*5\"#*1\"$:-$$*!#%:E!$ZA%$ZA\"%:E!#JM(&*A'%*I'$:=$$*Q\"$*U\"#ZU!"
- "%Z]\"&+%\"$*Y\"#[1!#;1\"%+-\"%;='$K-($+5\"#[9$$+=%%+5\"\"[A!&[9!&+Q!%KE$"
- "$;=\"$KI##KQ#%[U$%+]!#+]!'L%\"%+U!%\\)#$<)\"%,!!(\\)1'\\-,&<9%'LA&&<1%"
- "&L9&&,1%&,9$'LE!),E#%<A!$LM\"%<I!%\\M#&,M##<I!%<Q!%<I!%\\Q\"%<Q!%\\]'"
- "',Q($<U!\"-)!'-)\"\"=!&&-)#&-1'$=)!&]-!&M-%&]-&%])\"&M=$%M1!&=1$(MQ\""
- "!-5!%]-!'-1'']9!$]=\"%]A!%M5!%-9#%M1!&=5$)M=-&=A$#M1\"(M=-&-=\"%MA!"
- "%M5%(M=#&M=$%M5!&-=\"(=5''==#&-U\"'-=\"&M=%#M=\"'-A\"&M9$&M=%$M=!%]I!"
- "$=5!)-9+%M=!(=1-&M1%&-5#%M1!%M5!%M1!'--\"&--#']%+%M%!$M)!%M)!$<U!"
- "&]5!#,]$&M!!)<]-%<]!%M-%%<Y!%,U#&\\M'#L]\"(,M#'\\5#&LM&&<Q$'LE&%<I!"
- "%<I%(LE+%<9!(\\A\"%\\I#&L9\"&<5!%\\1#&,-%%,1!$,=!%\\)$&<%!&;M\"'L%,&[Q)"
- "$K]#%K]#%<%\"(K]'#;]\"\"KI#!+A!#[E!([5*$[E!$[A!#[=!%[9!'+9\"%[9$#+5\""
- "$;-\"$+5\"$K)+#K)##[)!$[!!$*Y\"#Z]!$+%\"$*U\"$JM$#JM!#ZA\"#JI!'JM%%:5$"
- "#ZQ!%*='#J=!$J=!$J1\"#J%!\"Z=!&*)%&*)!#9U#$*%#%IY\"%IY#$YU&&)Q%#YE#"
- "!9Q\"%IQ#%YE!\"YI!#Y=##Y=##99$!YE!!Y!!%9-##)%&$Y)$$99%#I%\"\"XI\"#8Y!"
- "%8Q$$HE*#8I$\"8Q!#HQ%!Y!)$(U$!H]!#HM&%I%!#9%!\"I)!$Y-*#95!$))!!Y5!"
- "!Y9!#IQ$#Y=#%9U(\"IE!#YI\"%YQ!$IU%#Y]\"$)Y#&)U%!Y]($Z!'\"I]!#J)!#J%!"
- "$Z-\"\"J1!#J-!$J9!%:9+%*1#$*Q\"$JE$$JE!#ZI\"$JM%\"ZM$\"+!\"$;!#\"*Y\"\"J]#"
- "$*]\"$+9!\"[%!!+)!%[-&$K5#$[1!&*]\"$[1!&KA(%[A$'+=*%;M\"$[I$#+M!#+M!"
- "%,%!%[M$%+]!%+Y!&+Y!);U\"#,!!&L%\"%+Q!'K]'%,1!&<1!(<5!%<5%%<1!&<-%"
- "(LE!&<5!$,9!%L9\"&\\A'#LA#%<E!$\\A#&<I!'LQ!#LQ#%\\U\"'<Q$)M!.%<M!$\\]#"
- "&<A!%M!!(=!-&]%'%M!!']5!&--#&M%!&=-$(-='%M-!#M-\"%M)!'-5\"$=1!%MA!"
- "%]I!$M9!(=5'$=9!$M9!'-=\"%M=!&]5!'-9\"&-=#)MA-']=%'=E,%]A!&]Q!\"-5!"
- "&]A%%MA!&]9&%MA!%MA!$MQ!'-A\"&-A##=Q!'MA$%MA!)]A3'-9\")-A/']5&%]E!"
- "&-1#&]E!%M=!%M9!%M5!%]Q!%ME!\"MA\"&]5!%M9!'-1\"'M1*'LY*&--#(=-'&=)$"
- "$]-\"$\\]#'--\"&,Y#']!!'<]$&-!$\"<Q+%M%!%\\Y##,Q!&,U,$,=!&LQ!&\\A'%,U#"
- "&\\Y\"%LA\"&<A&%<E!%<A!%<=&(,9#&<9!%,=$%<1!'L5*%L-\"&L%\"'<)%(<%&%;]\""
- "(+]%%,!!%KY#'KU#&+U%%+M!%+Q!%;M#(+M!&+I)$[I!&+A\"%K=#%+=!$[-!$+9*"
- "$;1#%+1&#[-!$;)\"$[!!#[%!$K!$%*]\"(*U,$ZY%$JY$$ZU!$*M\"(*E)$*I\"#ZI\""
- "#ZA%%:5!#Z9\"\"Z=$#J-!$J1(#Z-\"&Z9##Z)%$*1#\":%#$*%#$:-$$)Y#$*)#%YI!"
- "$)A!\"Y9\"#9E!#IA%#YA#%)9+\"I-!\"I5!&Y1)%9)##)9#\"99#%9%$!Y!\"$HY'\"8]!"
- "$8Q##XI'#8M$%HQ+#XQ&#8U!#8]$\"H]$#Y%##9%!\"Y%\"#))#$9-\"$I1&#)1#\"Y9%"
- "$)=$%I5!\"IE!#IE\"$)]#(9M(#YI\"$IQ\"')Q'#9U!#I]!\"Z%%!*!!#J%!$:%!%*1'"
- "$Z-&#J9!#J5%#Z5\"$JE%'*A(\"ZA!%ZM*$*I\"%ZU\"%JQ!#ZI\"#:U\"$:Y#'J]*#[%!"
- "$JQ$%;1\"%ZU\"$+)\"#+)\"%K1$&K9$%[9!$[9!$[9!%K=#&+E%%[E$%+I%$+M!%+]%"
- "%K]#%+U!&<!&(KQ0%;]\"%L!'',!)'+Y!',9$%L)\"&<-!&<5!&<-&%<9!%L5\"&\\5#"
- "%L=\"%<I!'LE!&<E%%LE\"',M(&<M!',E('LQ&'\\Q\"'-!'%\\Y\"%<M!*-!''LU*&-%#"
- "#,]!']!!%<]!'M1$%])\")-%!(-1,%M)!$=1!&M%%%M)!$MM!&==$%==$'=9#%M1!"
- "$]9\"#=9!&M=$&]%'&ME$(-A!*-I*#=A!$MA!$M9!&=M$%]I!&=E$%]9!%MA!(-I!"
- "$ME!&MI$%ME!%ME!'-I'&-],'-=\"$ME!$=9$%]I!%ME!&-A#*MI'$MI!#==!%M9!"
- "'-I&\"]A##M9\"&M1*%MA!&-=#)=1\"&==$$M5&%]-\"']5&&--#(M1.&-9\")=11'M1)"
- "(-1!&-)#(=%#%])\"&-!#'=!$&M!!%<]!(LU)%M)!%M!!%])\"(]%%'<Q)%<M!%L=\""
- "',]'$\\M#%<M!%,1!%LA\"$,A!%<=!'L9\"%<5!%,)!#<-\"%<=!#<-!&\\%#%,-!#,%!"
- "%<5!$,-!',!!$+Y!&<%%%+U!'+]%$+M!#[I!%+=\"&;A\"%+M!$[A!&K1$$[9!'+=\""
- "$+1\"#[)!#[-!$;-#$+-!#+)\"#JM!#[-!#ZY!#JI!$*M\"$*Y\"%JA%%:M'#ZI\"$*E\""
- "#ZE!#ZA!$JE%$:9$#Z5\"#*9\"$:)$$*5&#J!!#J%!#I]!$Z)&$*%#\"IU!$9U!$IU\""
- "#9Q!#9M!$YQ#\"YA\"'9A'$Y='#9=!\"I5!\")9\"\"I!!%)1%\"Y5\"$)%$#Y%$$)1$#8Y$"
- "#(E!#(I!!HI!#HQ)!Y!\"#HY%\"XY%#X]!\"8Y!\"H]!#9)!\"Y1\"$91\"!Y-'$)-!$I)*"
- "#Y1#$9=%#YI##9I!&)U($9]$#YQ#\"IQ!#Y]&%YY'#YU%#J!$%Z)'!*%!#Y]\"#J9!"
- "#J9!#*=\"$*9##Z9%#Z1\"\"ZA!%ZE\"':I)$JM$#JM!$*Q\"$*U\"%J]!$J]!$ZU%#[)!"
- "#[-!$[5$#[5!$[5!#+)\"%+1\"%+=!![9!&[=!&[I)$[9!$[-!%[I$#[I!$;I\"\"[I!"
- "'[U)%+Y!&;M\"&+]!%+Q!&KQ,&,%!%,%!%\\)'%L-\"%<5!%,1!&<I%&,5%&<9!%<9!"
- "%LA\"%<M!\",E!'=!)%<9!%<M!&\\M\"%<]!+L5+%<Y!\",Q!'<I$$<Y!&,]#&=))%LY!"
- "'=!)(M%.'=)(%]%\"$,]$']%*%]-\"&-9\"%M1!%])\"&=9$%MA%$=9!%M9!%M5&&-=#"
- "(-=&$-9$'=A((]=$)=I!'-I!!-E!%ME!'MI)$=1!&MM$%]M!%M9!'=I((=Y!%ME!"
- "%]I!(-I!%ME!%ME!&]E!$MM!$MQ!%]I!'=I('-I!)-Q*%]Q!'=E(%MA!%]M!%MA!"
- "%]E!)=E!&-9\"$=1!'=A(&MA$+=91']1!'-5'']1&&M9%&-E\"&-I\"$]=\"(--,%<]!"
- "'-1\"%M1!%]-\"#]!$'])!%M%!&]%'(-!''=!$%<]!%<]!%\\Q\"&LY!%<E!'=!$(,M,"
- "'<M$)\\M&%LI\"&<M!&L=&&<=&#,)!%<E!&\\9#&,=$%<=!&L5\"%,1!%L-\"%,1!%\\%$"
- "'<-%)+Y%&,!%#+Y!%[Q$&+Q!&+Q!%+Q!$KM##+M!$[I!%+M!$KA$\"[E!%[=!\"[9!"
- "%[5!&[5!#[)!$[5!\"[%!%[)!$K)$\"[1!#*Y!$;)\"$ZY\"#JE!%K!$$ZM%$ZM!\"ZI!"
- "%*I*#JA!#Z=\"$JI!#J-!#J9!#*-\"$:!!#Z-\"&*),\"J)$#J!!!YY$#9Q!$9M!#IQ\""
- "!IQ)#99!#I=\"#IM\"%9A(!Y9$#)5#\"I9!#Y%$\"Y9\"\"91#\"Y-\"#)-#&9)!$95%#H]%"
- "#(E!\"XM\"\"XQ\"!HE&\"8U#\"8]!\"XY\"%H]$$(]'#9!!%8]#\"I%!#)A&#)5#$)=!$IE&"
- "#9=!%I5'$IE&%9M\"%)M$%)Q($)M$%)U'\"I]!%9])!Z%$$J%&$J%&$J)\"$*)#$*1\""
- "#J9!&*5,%Z9*#JA!&:=!$JQ%\"ZE!#JA!&ZI#$JI%#ZM!'JY%#Z]!$;)\"$;!#&[%!"
- "%+%\"\"+!\"#[5!#[-!#[1!$[5!$[9!&+=\"&[=)&[=-%[I$$+Q!#+U!$[Q%$+Q!&;U&"
- "$+Q!%+Y!&L%#$[Y$%+]!%L%#$,)!'+]%%L-\"%,%!(L1&&<5!%L9\"$<5!%<A!&<A!"
- "%<I!%\\Y#&\\I'%LE!%LM\"'LM+%=%$&LU&&LU!%LQ!%<U!%<Y!%\\]\"%<Y!%M%!%<]!"
- "$<Y!%M)!)M-)'M-$$]5\"%M5!)=5\"&]5!%M1&$=5!']9+%M1!&]A&%]Q!,M=1%ME!"
- ")-=%%]A!%]Q!%-Q#%MA!&-A#)-A!&]9!%]M!%]I!%]I!%]M!&]Q!'-U!%]M!&]M!"
- "#=U!$MM!%ME*%]M!'MI)&]5!%]M!'=Q(%MA!&=M#'-M&%M=!%]I!%]I!%=I$&-U!"
- "%M9!%ME!%M=!$MM!'M=)%MA!%M9!#]Q#'=E\"%M9!%MA!'=9(%]9!%]5\"&=-$%M-!"
- "&]-!&]1!'=-)%M-!']1*&=%$#,]!%M%!(-%\"%M!!#=!!(--!'L]!&<Q$#,Y$%\\U\""
- "%<]!$,I$%<E!&<I!#,I!%LA\"%<A!&<A!%<=!&<E!'\\A'%<9!'L%+%,1!',)%&,5$"
- "%,)!&,%%%\\!#%,!!'+]%%K]##+Y%%+U!#+]!$+I!%KM+%[A%%KQ#%[A!%KA#(+=&"
- "\"+5!#[5!#K-#\"[-!\"[-!$+)!#Z]!#[)!#+%!$*U\"$*Y\"#ZQ!#Z]!#JM!#ZE\"#ZQ!"
- "'ZE($:E$%*A&\"Z=!#Z9\"#Z%\"%:5!$J5%\"*5%\"I]!&*%+#:-#\"IY!#YY\"$)Y##IM!"
- "'IM,':%&$)E##IE(%IE$$I5#$9A\"!Y=!\"I9$$)9!!Y1$#)-##))##I%##9%!$I-'"
- "\"81!#HM\"#(Q##(U#\"X]\"%9)#%XY&!(U!&I5\"\"I)!\"99&!I5##Y)'%YA!$99($9=("
- "#9A!%)I%#YA\"#YE##IE!$)E!#YY\"#J%!#Y]%&*-%%:!!#J1!$:%!%:5!#J-!$:1!"
- "#J!!\"*9!$J=!#Z9\"$JA$$ZQ\"%JI!$ZM\"#ZY,&:Q(%:U$$K%$#K%'%J]!%;)'!;%\""
- "%[1!#K1#$[5!$+9\"'+I*\"+1!$K=#&+A&&[A$$[I!%[I!%;I\"\"[=!$[]$&[M)%<!!"
- "%;Y\"&[I!'KY''+Y!&\\-(%<)!&,)!%<)%'L5*&\\9#%<%\"%L9\"(<%!%\\=#&<A%%LM!"
- "%\\Y\"(,U,'\\I\"&,M#%\\Q\"%<=!%LM\"%-!$)\\Q!&L]!%]%\"']%!%]5\"&M%&%]%\"%M)!"
- "&]1&&M-%%--$&--#%-1$&])'&=)$%]%\"&M9%#=I!%MA!']E*$]M\"&ME$']1!(-E!"
- "#=E!%ME!%M1!&]M!%]I!']5!%]M!%]M!$=9!&-M\"%ME!$MQ!%]Q!'=]'%]M!%=Q$"
- "(]Q.&-U!&==$&]I!%]M!%]Q!(-I+&]M!%]M!'-Y!%]Q!(-Q!*-I$#MM!%]Q!%]U!"
- "&]M!%]I!%]U!%]I!%M=!%ME!&]M!%ME!$=9*)-A!&-A\"%]5\"%=E$&M=%%=A$%M9!"
- "&=5$%]5!#=!!'-)\"\"-%!%M5!%]1\"&=%$(-),&=%$%M!!$=!!&,]#(<]-)\\Q!%<Q!"
- "'<Q.#LM&&LQ!%\\Q\"$<M!%LI\"(LE!(<9.&\\='%<=!%<A!%L9\"'<)&\"L1#%L)#'<)&"
- "'L9\"'\\),',%));M\"#;Q\"%;Y\"'+Y)',!!&;Q'&+Y!#[I!%[I!$;I&![E!#[A!%;I\""
- "(+M&%+A%#[-!%K5(%[5!$;-&\"[)!#[1!#;%#$*]\"$Z]%!ZY!&:Y'#ZQ!$ZM%%JM%"
- "$ZI%#*E\"#ZA!#JA!#ZA\"#J9$$:-#$*1#%*-'$*-#$*)#%J%*#)U#$)Y#%)]$#I]!"
- "$9]$#IQ\"$Z!&#Y=##9=!$YA'$YI#\"I9!\"I5!$))$\"I1!$91(#)=#\"I5!$))$#Y)#"
- "!(5)!HM!#8M$\"H]!\"I%!#XU&!9-\"!Y%!$I%##))#$)='$Y-$!)5$#I9%\"I9!$)-$"
- "!YA!%YE+%YE%#9M!#9M!$9U$#9U!$)Y#!Z)!%:%+#:%#&*%,#J-!$*)'%:5$#J5!"
- "%:9%%J9%#Z=\"#JM!\"JE*#J=!$ZI\"\"Z]!!ZQ!$JU!%*I##ZU!#ZQ!$+%\"#[-!%;)'"
- "$K)'&+-\"$[1!&;)'%;1\"$;E\"%+=!%[I$&+A\"%;I\"&;I\"&+M!\"+Y!%+Q%&;U\"%KY#"
- "%K]##KY#'L!#%\\1#%\\)$&+U!'\\5(#\\9$$,-!%,-!&<9%&<9!&LA&&,9)%<9!&<=%"
- "&\\I\"%<E!$<I!&,Y#$\\Q#&LU&\",]!(\\U/#\\]#&\\E#%M!!%M!!&M%!%]!\"%M)!)=%'"
- "&]1!$=)!%]A!']=+&=)$%M1!'M9$$MA!)]E()-=0'-=!#MI+#=A!&-A#&]E!%ME!"
- "%ME!%M=!\"-I!%]A!&]M!'MM(\"-M!%]Q!#-M$'-Q&']E$%]Q!'-U&'-Y!'-U!&]Y%"
- "\"-U!%]U!%]U!'-Y&%]]!&MU$%]Q!'MY)%]U!%]U!%]U!(=]!']Q.%]Q!%]U!#=M!"
- "%ME!%]I!)=I''-I&%]I!(-I!(]E$%M9!%]M!&]Q!$MM*(-I!$MA!$M=!&]=&%M1!"
- "%]=!$=1!(]5.&]5&%])\"'-)\"%M-!%]-!)<Y(#=9%%]!\"&L]%$=%!&L]!%M!!%<Y!"
- "%,Y$'-!'*LQ)&<Q%$<I!)\\I!%<I!&,E$',A(%<A!%<A!%,)!&<9%$,=%!L5#\",-!"
- "'<-%%,%!%,%!%+Q!&,!!%;]\"&L%'%;Y\"&KU#$KU#([=!$KM#&[Y,(;A''+E&$[A!"
- "%+=!';-(&K9(&K9$$K5##K9(#[%!$;-+#[!!$K%$#[!!$J]!&ZU*$+!\"$JQ$%ZM\""
- "$*Q\"#JI!%:E(&:E$$*9\"%Z9#%:A!\"Z5!$:1$$J-%#Z)\"$)]'%*)'#J!!%:)!\"YU\""
- "#YM\"#9M!#IQ!#II\"%)Q($YE'#)A##I=%#II$#)9##95!\"I-!\"9-##I-%\"Y%\"#9)!"
- "!HA##XQ&#XU)\"XU\"#HU%\"9!##I%#%I)'#Y)##9-$#9-$#9)$#IE!#9A$$I=&%IA*"
- "#9M!$9M%$95%&IE$#9Q!#YU\"#IY!$)U##I]!$:!$!J1#\"9]##J-!$J)%#JA!!Z5!"
- "%*5'&Z9'#JE!#J=!&:U$#JI!#JE!$JQ%\"Z]!#Z]!#[-!#Z]!$+5%$K)$\"[!!%K-$"
- "#+)\"$+9!%[-!&+5\"$[5!%+-\"$KA'%;A\"!+A!#;I*&[]$%+U!&+Q!&;Y&%+U!&[M)"
- "%[]$'<%.$L1\"&<)!%\\-#$<-\"&<5%%<5!&,5$%\\=#%<9!&,=$&<A%%,1!%<5!&<I!"
- "&<M!&<9!(,Q#%<Q!\",U!(LU)&\\U\"&-)#%<]!%<Y!%M%!(=!$']!!)=!1'M-$$<]!"
- "&-A#(--,%]1!*==+%M5!%]9!%M=!%]E!'=9()-A!\"-=!$=5!&-I'%MA!#=M!%]M!"
- ")-M$%]I!&-U!&]M!$MM!%^!!%]M!&]U%%-Y\"&>%#&]A&$]Y!%]Y!'=U(&-U!$MY!"
- "%]Y!'MY#%^!!%^%%%]]!%]Y!(-Y+%N)%%^!!&-Y!$MU!%]U!$>%%(-Q+%]U!$MU!"
- "%]M!#MY!%]M!&]M!#=E!%]Q!(=I,%M=!&N!$%]Q!&]E!&]E!&=A$#MA!&-A\"'-=\""
- "(=1(&M9%$=9!&]1!%]=!%M1!&=1$']-!'M)%%]9!&M)!'M%$%]%\"$=!!%<Y!&M!%"
- "#LU\"%<Y!',Y('LQ&(<Q)%<Y!%<I!#LE\"(<E.%,E$)<=*%L=\"&<9%%,9$&\\-(&<-*"
- "$<-!%L)#%<1!%<%!&L5+%+U!$,%!&[Y(%+Y%&KU#';M+![A!\"+M!%;=\"$KE#$+A!"
- "&[1*&+=!%+=\"#K-$&;9'!+1,#[-!'+1/#[)!';%(%*]&#JI!#JY$#Z]!%JU!#ZU!"
- "\"*I\"$JM%!:E\"$J=!#Z9\"#Z9\"#J9!$:)$#J-!#Z1\"%:-!#Z1\"%*1'\"IY!$J%&#9Y$"
- "$YY##9U!$YQ#&9M-$)U#$)I!#Y=&\"Y=\"$9=(%)5%#)5##9)$#)-#$I))\"Y!\"#I!\""
- "!HM##HQ(#(Y&!XY!%X]+#XY&#I!\"%X],\"Y!#\"I-$$)1$#91$\"9)#%)9(\"IA!$)=$"
- "#YE\"$)=$#9Q!&9I#$IQ%$IU%%)Y$$*%#%*%'$*!##J-!%J-\"#Z-\"\"*1\"#J5!%Z1#"
- "\"*9!#J=$#ZA\"$:E##J=!\"*M!$*M\"$JQ$#ZU!#ZY!#Z]!#ZY!$;!#%*]\"&[-.#K-#"
- "%[1!&+1&%;5&%;A\"$[=!$[9!&;A&)+E&\"+Q!%;A\"\"[E$$+Q!%+U!%,)!&KA(&,!)"
- "%\\!#%\\%$%,-!&,5)%L-\"'<=)',I)%\\5#%L5\"&<5!'<E%%L=\"%L5\"\"\\9#&LI&&<M!"
- "%<]!%<Q!%<Q!&LM*%<U!(\\Y&%LM\"%=!$(])!%M-!%]%\"&M%&&=)$'=-(%M5!$M1&"
- "$]%#$M-!&]9!'=5(\"-=!'-9\"&=I#&=A$%]E!&=E$*=E!%MM%%]Q!%]]!+=U$&]=!"
- "%]Q!(-E!%]I!%]M!&M]$'-U!%]Q!%]Y!#]Y\"(=Y!%^%!'MY)%]I!(>!!%^%!%]]!"
- "'-]!&]Q!&N!$&MU$&=]#%]M!%]]!(-]%$N%!%]]!(-Y+%]Y!%^%!)]Y(\"-Y!(-Q!"
- "%]U+%]Y!%]]!&=Q#&-Q\"'-U!)-U%%]Q!&]M!*=M+&M=$'=A($ME!%]Q!&]E!#]E#"
- "'-E!$MA!'==(*=5+(]=$$]5\"&-=#)-E+&]I!']-*%]5!\"M1\"&M1%(])/%M1!&-!#"
- "%<]!%<Y!%]!\")L])&\\I'*LQ/%LM\"&<I!#,I!%<I!#<-!%<A!%<A!%<%\"(,9#'<9!"
- "%LI\"%,-!\"<)\"$L-#%,%!',%!&L%'%K]#&+Y!%+Y!%+U!!+Q!$KQ##[I!'[]#%;E\""
- "%[=!#[=!$[9%%[9!$+9!#[1!#[-!%[E!$[)!%K%!#:]#%K%$$:Q#$JY$#ZU!$JI$"
- "#ZI!':U!$JM$!:E\"#J=!#ZA!%Z9*#J=!&ZA'#JA!#Z5\"$Z)&$*%#!Z%!#I]!$Z1*"
- "$)Y##9Q$#9Y$%)]'#9A!$9E\"#YI#$)A$$Y='%9E&!Y9!%9=\"#)A#\"I%!#9)!%))%"
- "!HI!$8I&!(U!#HI&$))*#9%!%I%(%I9.!I!%$I-)#)5#&9-$\"I1!#)=#$)A##9I'"
- "$YE&$)I!\"YM!#9Q!$)]##YQ#$)Y##Y]\"#Z!%%:%(#J1!#Z9!\"J-!$:-!$:1!%:9("
- "$J5!#JA!%ZA)$JE%$:E$\"ZM!#ZQ!$:U+\"ZM!$*]\"#[!!$K%'$;%#&[-%#[)!&K)-"
- "![)!![5!%+5\"%;9#'+=\"%[9%)KQ#';U+([U$%+A!%[Q)%;M\"%+U!(+]%%+]!%+]!"
- "%K]#%,%!&,1$%\\9#%,1!$,5!$<-\"&,5$%L5#%\\=#%\\A#$,A!%LI\"',Q#&LE&#,U%"
- "%<I!%<I!'\\]&$<]!%\\Q\"%M!!&LU!&M!!&]-'&]!!%]5\"%--($]-\"%M5!$M1!%M1!"
- "%M)*&=9$%]5!%M9!%M9!&MI$&M5$#=I!%]M!%]M!$M=!(=Y!&=U#']M$$MU!&=Q#"
- "#=Q!\"-U!&]Q!#=Q!)MY!)-]/&-Y\"%]Q!%]Q!\"-Y!%^!!&=]('-]!&>%(%^-!(=Y!"
- "&-]!$^!!'-M''>)''.!%$N!!'.!!'.!+&>%#&-Y\"&-]!%]]!#]]\"$N%!%^!!%^%!"
- "%=Y$'-Y!%]M!%]Q!$M]!'-U&(>%!&]A!\"-Q!%=E$%]I!%ME!%M=!%=I$)=I!'-1'"
- "%M9!%MA!%]-\"#=9!(M=$&]9&%]9!'-5'&]A!%]1\"%M%*(M-$'\\]&%])\"$=)!%<]!"
- "%M5!'<E)&LY!'LU!%\\U\"(\\Q/&<M!%LM!%LI!%<A%%LI\"&<=&\",9!%<=!$L1\"&<5!"
- "'LI*(,9##,)!$<)!%\\)$#L!'%,!!&<-&\"+Y!(;Y!%;Y\"$+Q!!+Q!%KY'$[I!&KI#"
- "#+M!&[E!&;=&#[5!%;5\"&[=!%[1!!;%\"$+%\"%[)!#[-!$+)\"$+5&$;)\"%K%($*E\""
- "$*U\"$;!#$:I#$:E$&*A'$J=!#J1!!Z9!$Z1&#Z1\"#Z5\"#J9!'J%$#Z)\"$IY%$9U$"
- "#Y]\"%9U(&)U%\"IQ!#IM\"$)A$#9E!#IA\"#I=\"$)1'\"Y9+%)5+\"I5!\"I!!\")-\"!)!!"
- "\"HQ!#(M!#(Y#&(])$8]\"\"))\"$)%(!I!%#I)%#Y=&#9-!!91%\"IA$!Y-!\"I1!%9E%"
- "#YI#&9M\"$J%%#9A!#YQ\"%9U%\"9])#*!##J!!&J-'#Z%\"$:5$\"Z)\"#J5!\"*=\"#Z9\""
- "#J=!&:A!%:E!$ZA\"#ZQ!#JM!#:Q\"#JA!#ZQ!#Z]!$+!\"$[!&$+%\"#[)!$;1#$+=!"
- "$+1\"%[5!$[9!&+=!';U&%;5#$[=!%;M\"%;A'$;Y\"&+Q!';I\"*;]'%+U!%;Y\"\"+U!"
- "&,%!',)$%,)!%,-!%L5\"'<5!#\\9$'\\5(%<A!',A$&<A!'LQ!%LM!%<M!(,M,%LY!"
- "&,E(%<Y!%<Y!'\\A\"'<Y)%M!!$L]!%M!!&]-&'=%)&LU!$=1!']%!'--'']5!&=)$"
- "(MU-%M)!&==$#=A!%M1!'=E(&==$%]U!$MM!#]Q#&=Q#&]Q%(-Q!%]]!%]U!'-U!"
- "&=M$%]Y!$N!!%^!!&=]#&-]!$MY!%^%!(>)!!^!)%^)!&.!!'-]!&-U\"'N-\"%^!!"
- "&.!!%^-!'.%!%]Y!$N)!'-Y!$N!!$N!!)]U)%]]!&]]%#>!!%^-!%^!!'^-$$MY!"
- "%]Y!#=Y!%]Y!%^!!%]M!'.!!%]Y!%]Y!$M]!*MY!%]Q!%]Q!$=9!$MQ!&]E!&]I!"
- "%]Y!&-=#'=E\"#]9#%M5!&=9$#=A!&=9)\"=9!)--!\"-)!#=)!#M%\"(M%$#=5!\"-)!"
- "%=!$&M!%&M!!&\\Y'&LY&%,U#$,M)%<U!%<U!$<Q!&,I#%<E!+<=#%<A!%<I!%\\A#"
- "&L5&$,5!#<)\"#\\1$)L)\"%,)%$\\1$#,)!(+Y!&KY'$<)\"$[Y$$;M\"%KQ#$;M'%;M#"
- "%[1%&[9!$[A!$[-!%[-!$[5!\"[9!%+1&%[)&&+)+$K!'%:Q$$;!\"&*]#%*Y&&K!!"
- "$JY!$:I$#JM!':E!#ZQ!%:A!\"ZE(%JE)#J9!#J9$#Z5\"#Z)\"&Z)##Z%\"!Z%!$:!("
- "$J!%$)U##9U#&Y](#IE!$IA%%)I%$IE##)E##)1##Y9#\")5\"$I1)#)5##9-$$HY)"
- "!HM!!(M!#I!(\"X]\"\"8U!#Y9&$))$#)%#\"IA!#Y1#\"Y=\"%IE-%)=!#9A!#Y=##Y5#"
- "#9A!!YU!$YU#$9Y$#I]!$:!$%9])#J!!$*!##Z1\"$*)&#J!!#JE!$Z5\"#Z9\"!ZE!"
- "%*A##Z=!$*E)#ZI\"'ZM+\"ZQ!%JY!&*Y'$JY$#Z]!$;!##[%!$[!!!+)!'+1+$+!\""
- "%[1!\"[9!&+-\"%;=&%[A!&+E!&[E%\"+M!$[Q%$+U!#;U&$[Q(%<!\"%+]!%,!!%<!\""
- "#<%\"&,!%%L5#%,)!#\\1#%<5!%<9!%L9\"%<=!%<A!*,=((,I)'<I%$LY\"&<M%&,U#"
- "(<Q.$=!!$\\]#%L]!%]-!$L]\"%]5\"%M-!%<]!%M1!&]-+%M5&%M-!$M5!'-9\"&]A&"
- "%M=!']9%#MA\"&MM$(=E(&-U!$MM!&]Q!$MM!%]M!$=Y%#=U!%]U!$]Q!%]Y!&-U!"
- "'-Y&!-Q!&-]\"'-M&'.%%%]Y!&>!-%^!!(M]'%^!!%^%!!.-&%^)!%^%!#>%!&^%%"
- "&.9!%^!!$N-%%^%!$N%!%.9\"$M]!%^!!'.%!%]]!%^%!%^%!'N%('.%&%]Y!$>1$"
- "*^!!%]]!']])%.!(&-U!(=]!%^%!)>!*)-U*%]Q!%]M!&=U#%]Q!%^!!%]M!$MM!"
- "%]I!%ME!'-=!']E$\"-E!'=A(&-E\")=9!%M-!&])&%M5!%M%!%]1\"(-1+%]!\"&=)$"
- "'<Y)%M!!&=!$(LY%)<Y(&LU!&<U%%<Q!&,U#$<M!%<M!&,=$%L9\"&<A&&,1%%<E%"
- "%L1#',1)%\\1#)<1*%L-#$,)!&\\%(#L%#%,!%$+]!%[I!$;U\"%<!!$[M%%+M!$[I!"
- "$[I!\"[E!(K1$$[=!&+5&&[1&$;)#%[-)$[-%%K-(#[)!$[)!$Z]%#ZQ!!*Y!%JY!"
- "%ZQ&%*Q#%:M$%JI!$:E$#JI!#ZA\"%ZE\"\"J9##Z=!$*9\"!J-'$Z-&&Z)$#J!!\"J%!"
- "#I]!$9M$#)Q\"#YM#$)U##YM\"#II($)E'#9A!#9M!\"I=!$99(\"8]!\")!#%)-\"#I)\""
- "#8Q$\"HQ$#(U#$8U#$8U#%)))#91$#9-$\"Y-(#)-##)9#!Y-!\"9A)#Y9##YE#$9I%"
- "#IM!$)Y#$)Y#%)A'%J!#\"YU%$*)#\"IU!%:9($:)$#Z-\"#Z5\"\"J1!#JA!$:9$#J1!"
- "$JA!#JA!$JI$#JM!$*Y\"#:I#!ZU!'ZY.'[%2$J]$$JU$$K%$$;-#%[5!\"[9!$[=!"
- "%K=$%;%#$[=!$[9!&KA$%;Q\"%[E!'+A\"#;I\"'KU#%+Y%#+Q!'+Y)&\\)'%,%!'L)#"
- "%<)!%<5!#;U\"%,1!%L5#&<9!%L=\"*,5)%\\A#(LM!&<E%%L9\"#LI\"%\\Y\"%LM\"%<U!"
- "%<Y!%<Y!%]!\"%M!!(-!\"%])\")]1*&])&&M-%(-1,&M5%%M1*%M-!$MI!%M=!(==("
- "&]=!%MA!&]E!%MA!&]M!&]I!(]Q)$]M\"(-I!)=U!(-U!$MQ!%]]!%MQ%(=Y!(^%."
- "#>1!'-]!%^!+%]Y!%]Q!!.5!&>!#(>%!*^!!&.=!%^!!'.)!%^)!%^)!&>)\"%^!!"
- "&.5!%^5&$^5!%^-!#>%!%^)!%^-!%^)!,N)**.%)'.%&%^!!#^)\"&.)&*.%#%]U&"
- "&N!$\"-]!&>1\"%^)!%]Y!%]]!&.5!%]]!#MY+%MY%*-Y)%^%!&=Q(%]U!%]Q!%]I!"
- "&-9\"%]M!&]A!&]E!\"-A!(-=!(]A)%]I!&-=\"*-I4&M5$%M5!&-E\"%\\]&']-!$]!'"
- "'-)\"%]%\"$=!!&=!$)-!\"(\\Y!%<Y!%M!!&<M!%\\Q''<U)#,M!'LM+%L5\"',A(%<I!"
- "%L5#%\\9#'<A%%L1\"&<1!%<=!&L-\"'<-*%\\!$%L-\"'+]))+U!$,!!'KU'$KU##[I!"
- "$[I!&;M#%;I\"&KM'$[A!%[9!$;1##K5($+5!#[%!$*]\"#:]\"$;)\"';%$!*Y!#ZY!"
- "\"ZY%#*]\"$JE%\"*Q\"$*Q\"#JE!\"Z=!$ZA&$J9!'*9!$:-!%:1!$Z)\"$:-!!Z%$#9U!"
- "&Z!!$)]#\"J!!#9U##9U!$)M#!YE!\"IQ!#YE#$)A!\"Y=\"#)9##I5\"\"Y!#!Y!!#I-%"
- "$(Q'#8Y$$(Y'\"HU!#XY##XU!\"Y!\"\"Y!#\"I1!#Y=&\"I9!\"YE\"#9E!#IA!$)M##9M!"
- "#)Q#$9M!!YQ!#)U&!IQ#$*!#%:!(!Z%!\"J)!$:%!!:%%$:1!#Z5!#J5!$Z=\"#:A#"
- "#JA!$JI!#JI!'*Q$%JQ!%[!\"$JU!$ZQ\"$*]\"%:]'%;%'%+5\"$K5$#+!\"$+1\"$;5\""
- "$K9#%;=\"#[9!$[A!%+A!&KI'$[M$&+Q!&KQ#%,!!&;Q\"%;Y&$;]\"&<!\"$K]#&+Y!"
- "&<)!%<A!(L1\"\",5!%,1!$<E!$L=\"'\\E\"&<E%&LQ!%LE\"'L]!%LQ!$<U)%<E!%<Y!"
- "(L]$&=!$']!!%\\Q\"&]%!%M-!#M)\"&M!%&=%$'=5$&-5,'-5''ME)%]=!%-=#'-A'"
- "(-=!&]E!&]Q!%]A!$MM!%ME!'=]'%]Q!&=Q(%]Y!)>!%&=]#'-Y!#=]!&M]$$N%!"
- "%^!!%]]!'-Y!(>)!'^!)'.-!%^-!&N1#%]]!&>1\"%^)!)>-%'.!!%^1!&.9!$N-!"
- "&.=!'>)'%^-!%^)!&.-!'-]!'>5&(=]!%^!!'>-!'>9!%^1!&N1$&N)#%^%!'>5!"
- "$N)!(>%!%^%!'-Y!$N!!%^%!'.-!%]Y!'-]!%]]!'-Y!%]]!%]Q!&-U\"%^!!#]1#"
- "(]I$%]M!\"-U!%MM%(-I!&]E!&]A!%MA!$MQ!&]=!%-5#%]=+&M5$(MA$&M-!\"M5\""
- "'=%)$]5\"'M%*%M!!#\\](%LU!%]!\"&LM!$<E!#\\Q#%<A!%\\U#&<Y%$LE\"&<E%&L9\""
- "'<=&%\\5(%<9!&L1&%,1!(\\-#%,5$%,)!&,!%%,)!%,%!)KQ(&+U%%;M\"$K9$%+U%"
- "&;M+&KI$%;M#$[A!&;A'$;A\")K5)#K5$#[1!$[!!#[%%&+-\"&K%)#[!!![!!$J]$"
- "$ZU!\"ZI!!:Q\"#ZU!#Z1%#ZI!#JA!&*A+#ZE\"#J9!$Z1&#J1!#J-!%*)$%Z%#$)Y#"
- "%I])$)]#$9Y!#9U!\")Q\"#9M!$)M#$YI'#9U!#YA#%99&$I-#\"I9!\"I1!\"I5!\"I)!"
- "$8U##(Q##I%&!HY!#9!!!I1#\"HY!!))!$)1'!)5!#)-#\"I=!$9=\"%)=$&IE!#YE#"
- "#YM#()I.!IU#$YY'#Z!%!Z)!#Y]\"#I]!%:%(#J-!%*1#(*5!#J=!#Z9\"\"ZA!#JA!"
- "#Z=\"#J=!![!!(ZI(#ZQ!%*Y&$:U#'[-&$+!\"#[!!#[%!$ZY\"$*Y\"$*]\"%;5'%[5!"
- "%;9*&[=!%;A\"$[E!$[E!%+A!$KQ#&+Q!&[I(\"+Y!$;U\"%K]#',%!%L)#%+Y!%<5!"
- "%\\5#%L1\"%<A!$\\9#%L-#%<5!'<A!&,M$%<M!%L=\"$LM\"%LU!&LM&$LU\"&<Y%$<M!"
- "&L]&$\\I#%M)!(=%(%<Y!(-)'%]-!(=1')-9+%M=!#=9!&-9\"#=9!'-=!&]A!&ME$"
- "$ME!$MM!&-A\"$MM!\"-Q!%]Q!%]U!%]Q!$MU!']Y$&N%$%^!!&-]'#>!!$N!!%^!!"
- "%.%\"'^)$'-U!%^)!&.%!'.)!'.)!%^-!%]]!%^)!'.1!&^5%'^1)'>1!#>-!%^1!"
- "&>1($N-!(.9*'.1!).1#)^9,&>%#(.1%(^--'>1'&^5*&.5!#>!!#N-!(^)#$N1!"
- "(^-#'.)!\".!!#N)&&^)%'>9!'.!!'.)%%]]!(>%+%^!!&]]%'.!!'N%#&-U!$ME!"
- "&=Q#$MQ!$MQ!&]Q%%]I!%]Q!&-=\"$MI!#=I!(-A!$]-\"&M9$$-1$&]1!)=-\"$]1#"
- ")--&%M-!&=)$'M)$(\\Y!'-!,&=)$%\\Y#&=%$*<Y#%<M!',U#%<E!%L]!'LE!&\\A("
- "&\\A($L9\"%<9!%,!!&,5$&\\9#&L9\"%<%!%,)!%,%!&<!&%+M!%+Y!&;]\"&KU#(+Q!"
- "$[M(%;E\"!+]%%[I!'[A%%+=\"%+9!$+5\"![E!%K1$![-!$+5\"%+%\"$;)##[1!&:]+"
- "$*U&&*]\"$:U$%JM)&:E!$*U\"#ZE\"%:=!\"*=%\"J1!&:5!\"J-!\"J1!%:9!$:)!%:)!"
- "!Z!!$)]##Z%\"#IY!%IU#%YU#$II#%)Q'#Y9#\"9E#$Y=!\"I=!%I9*#Y5#&9A&#91!"
- "!(I!\"8Y!$(]$#9!!$9-%#9)$!Y)!#9-$#)1##91!#9='!YA!#IA\"\"IE!%)I($II&"
- "$)M$#9Q!#IY!%I]&#J!!\"Z!\"#IU%#Z)\"$J)%$:!$$*1#!Z5!$*1&(*9%#J-!$JA$"
- "#ZA\"$:I##ZQ!$JQ!#ZU!#ZU!$*Y\"\"[!!&K!!#[%!$+)!\"[-!#[)!&;-$$[5!#[1!"
- "#;I\"$[A!&[9!#[9!%+A!$[I$$KQ#$KQ#%;]!&,-%&L)'&+M!(L%,%;]\"$,)!(,%%"
- "(,1$%,1!$,5!'<5%$L=''<1*&<A!$<E!%<9!&\\M\"*<Q-%<Q%&-!$#=%!%M%!),]\""
- "%]-!&M!!$-)$&M)!#=)!%M1!&M-*'M)%'=5((-5')-90'-A\"%]A''-A'%]I!$MM!"
- "%]I!%]M!%ME!'MY#&]Q!&-A#&-U!%^!*'-]!%]U!'M])&]]%%]Q!#>%!$]Y!&N%$"
- "%^%!(>)!'.)!%^-!%^-!%^%!&.9!$N1!%^)!'.%!&N1$$^5!&>)\"'>5!%^-!&.5!"
- "'^E#%]]!)^5&&.5!(N9!&.9!$^A!,^1*%^1!'.)&&>5\"&>1\"$^5!&>=\"&N)$%^1!"
- "'>1!%^-!%^-%&.9!%^)!'.)!%>)$'^1$&^!%&>!#$N!!$N!!%]Y!#=]!$MY!&>!#"
- "&]M%&-Y\"'-U&'=E((-Q%%]M!&-I\"&]E+'ME(%MA!%]5\"&MA$&=1)(=9#%]%'&-1#"
- "%MA!&M-!%M%!&=5((M!%$<]!&M!!'L]!%<U!&<]$%<U!%LQ!%<M!%LE\"%\\Q#%<A!"
- "%<A!%<=!#,5!'\\1##\\5#%<9!%L1#$\\%##,-!%\\%$&,!!%+Y!'[]-&+M!$[Q)%;U&"
- "%+M%%+M!(KM('[M-$[A$$;Y\"'+I&%[E!$+9\"'[1%'+-'$+%\"$K)$%;%'$;%##ZY!"
- "#JY$$*]\"&*U+&ZQ*#JE!%JI(#JE!#*A\"#JI!#Z=\"$:9##Z-\"!Z1!%Z-'$Z)\"$Z%*"
- "$*1##J!!%I]#%J!\"&)U%$Y]#$9M%#9M!%YI$#YE\"#YA#%9=##9=!\"95&\"I5!#Y5&"
- "\"8]!\"8]!#HY%!(U!%)1%$I!'\"I1!#I1\"#Y5##I9%\"95##Y=\"#9A!&9A#$)I##9M!"
- "%IQ)#I]!%IU\"#YY\"\"I]!!J%#\"Z%\"#J)!$J-%$J5)#J1!':1\"$:9$$:=#!ZI(%ZE'"
- "#ZQ!&ZM*#JM!&*U'$Z]%%*Q'\"Z]!'J]-\"[!!\"[1$!;)\"$+%\"#[1!!+5(%K=$%;-#"
- "%K=$)K5*&+Q!%;U\"'KQ(\"[E!%;U&&\\!(%+Y!'+]%$[I!%\\!#%,%!%\\-(%<!\"%,-!"
- "\",1!$,5!%\\=#!<9&&\\E($\\A#%<E!\"<I!(,A-%<M!%\\Q,%M!!%M%!%<Q!$,A!'-%\""
- "%M!!%M)!&]9+$=%!&--'&]=&'M5)#=9!']9+$M1!&==$%ME!%MA!#M9\"(MA#%]I!"
- "%]M!)-Y%$]U!%]Q!%]Q!%]U!%]Y!#=]!%]Y!*.-)'^!$&N-$%^-!$N)!%>-#'.)%"
- "%^-!%^)!(>-!&.9!%^1!&.9!%^!!&.5!&N-#\">5!&>5-&.=!&.9!).9)&.9!&.9!"
- "$^E!&.A!%.=\"&.9!%^1!&N9#&NA#'>9!&N-##N9!%^1!'^9)%^)!&.9!*NI$'.-!"
- "'>5!%^-!(>)&&^-%%^-!%^-!(N9!&>%#%^1!(^)\"%]]!)=M,%^)!)=Y%%]]!&N!$"
- "\"^!#%]M!%^%!%]M!'-U!%MA!(-M!(=I!%]M!(=U!%MA!\"-=*'M5$%==$%ME!%]5'"
- "%M1!%M1!%M-!%=%$%M)!%=-$$-!)&M%%(,Y,%\\Y\"&LU!%<M!&\\M\"',Q($\\A#%\\E#"
- "(LE&(LA!%<A!&LI+$,9!$,-!%L5#%,-!%L-\"%,-!%;]\"&,!%&K]'$;Y\"*,-$';U\""
- "%+Q!'+Q*&KM#$[I!\"[I$#[M$%+5\"%;=\"&K5$$+9\"#[!!#+5\"#K)##+-!$+)\"$+!\""
- "$JQ%':]$#Z]!\"ZQ!$:M*%*E\"#JI!%Z=&$ZA&$:='$:9$#JI!$:-!#J-!$J-%#J)!"
- "#Z-\"%:%!$I]%\"YY!$IU%%:-!%IU#\"IM!%YI$%9M%\"9A#$95%\"Y9\"\"I1!\"Y9\"#)-#"
- "#(Q#\"8]#$8Y\"\"9!$#I%\"$))$$95(\"I5!#9A$$Y9$#Y9&#9E!\"I=!$9E\"#YI&#)M#"
- "#)U#\"IM!#IY!#I]!&*!!\"J%!#Z%\"$J)\"$Z-&!J1'%J1%&:9!#JI!(*I,\"ZA!$:=#"
- "$JA$$JI!$:M#$*Q\"$JM!$J]!#:]#$K=#&[!\"%+-)&K),#[!!$[1$$[9%%[9!'K=$"
- "%;A\"$[A!%+U!$[I!$+M!$+U!$KU#%+Y!$;]\"%<!\"%<)!%L-\"!,-!%+Y!',-%%<5!"
- "$,5!%<=!%<9!\"<=\"&<-&%<Q!#LE\"%LI\"$,A!%\\Q\"&,I#&]!\"&]!\"&,](&LY&'=%$"
- "$L]!']!!%]%\"%]-!%M)!&=E$(-=!%ME!%M-!&M=$&=E#&MA)'=U'(-E!!-A!%]M!"
- "&]I!%]U!%]U!#=Q!\".!!)]U#%]Y!&MQ$'>!!&^-%)N%!%^-!)N%&&^-%$.!$(>-%"
- "(^)($^!!%^1!'.%!\".-!&.5!$^5!&.I!(>-!&.5!&.9!&.5!&.=!%^)!&.=!&.=!"
- "$^E!&.M!'.1!&.=!'.1%&.5!#N=!&.=!&.9!&.=!%N9$&.9!'>M&#NA!$^5&*.9\""
- "&.9!(.9%(^-(%^-!%^1!&N-#$^5!'.-!+.A,&>)\"%^%!%^%!%]M!%^-!'N)('-U!"
- "(=]!'MY-%^!!(MY\"%]Y!%]I!+-M#(-M+(=U&(-=!&]M!(MQ,&MA$'ME(']=/%M1!"
- "'M5*(-1'']5&'--\"&M=$$=1!%M)!%])\"$<]!%<Y!&-!#&\\U'%LQ!&<M!%<I!$,=%"
- "&LY!'LA&&<A%%<=!%<5!%L5\"%<1!&<1!\",)!%,)!$,-!$<-!&<!\"&+]!$<%\"$+U!"
- "'KQ#!;I\"$[E!%;I\"'[A%$[=!%[A%%;9\"%+9!$[5!\";5\"%+A%$K%$$K!$#Z]!$*U\""
- "%J])#ZY!$ZQ\"%JQ!$ZU\"#JI!\"JY+$JU!$J5!$Z9\"$:9$!ZA!\"*A\"$J1%#Z-\"&*)!"
- "#J%!#I]!#J!!#J%!#YQ##9U!$)M'$)M#$)I!\"9M#$9E%')9*\"IA!#I)\"$Y9*%)-\""
- "#HQ\"$Y%+#)-#%(]\"\"Y%\"!9=\"\"I1!#)!$#I5\"#9-'$)M&$YE&#YA##91!%)Y($9M$"
- "%)Q'#Z%\"$9Y$\"Z%!$Z!#&:%%#Z)\"$:%$#Z!\"$:1$!Z1!%*=#%JA\"$*Q\"\"ZA!$*E'"
- "#JI!\"ZU!$JU!$ZI!$*Y\"$J]$#*]\"#Z]!\"+!!([)&$[5!%+-&'+5\"&+-&%+1&%;M\""
- "%[A!([A*!;=*$[I!%;I&$;U\"&;U'%+Q!#K]#'<)!'<!&#<!\"'\\),&L-\"%;Y\"!<-&"
- "%<A!&,A$%<=!%<E!$<=!'\\Q,$LQ\"&\\M\"&LU&%<U!'LU!%<]!&LY&'-!(%<]!'M)*"
- "&\\]&&=)$#=9!&M!%%]-!%M-!$-9$$M9&$-=$&]E!%]I!$ME!%M5!']E$(]I.%]M!"
- "(-Q!#>!!%]Q!#=Q!%]Y!%]]!#>-!%^)!!>-\"$N)%#>)!(=Y!(>-!'>1&%^-!&N%$"
- "'N9(&.9!%^1!&.=!&.5!&.9!)^Q&&>5\"(NA,)>=/&.=!&.5!$^=!$^A!&.A!(NA!"
- "&.A!&.A!'N=\"\">A!&.=!&^A$&.U!&.=!(N5!'NI'&^A$%N=$&.A!(N=!%>-$$^9!"
- "&.9!$^5!&.I!+N9*&.5!&>5\"&.5!$>1$%^)!%^-!%^-!(N!!$N%!%^%!%^%!&.!!"
- "!.!%'=]\")M]!'-Y!%]U!$MU!&MQ$(-M!%]M!%]M!%]I!(]E.$MA!'M=$#=5!%MA!"
- "&M=)#=5!%M1!%]5\"'M-*(-)\"&M%%$=1!(\\]!%\\]\"&,]#&L]!%<M!%\\Q\"&-!$%]%\""
- "%LM\"%<E!'LA+%<=!'<=!%<=!%L5#%\\9#%<%\"&L5'#<=&$,%!%L!'%+Y!%;]\"%;U\""
- "&KQ#%;M\"$;I\"$[Q$$[E!%;=\"%+Q!%+=\"&K5$$[5!#[5!$;1##+)\"$[1!#;%\"%:Y#"
- "$J]'%;!'$JY!$J]$$*Y\"\":U&!:I\"&:E!$ZM%#JA!#ZA!#JE$\"*1%$Z-&&YY!%J-)"
- "#YY\"#J-!$J!%#)]#$9U$#9U!\"YE\"$II&#YM\"#YI#%9M%\"IA!$95(#99$!9=\"$91("
- "\"8]#\"8I!&)1-#HU\"!9)\"#9!$\"I1!!I9#\"IE!#I=%#IA\"!IA#&9E&&)I\"$IM\"#9Q!"
- "#J!!$YU'$)Y#$9M!#J%!\":!##Z-\"$J5!#J%!#J5!$ZE&#J-!&JI!$ZA%#ZQ!#J9!"
- "&ZM&$ZI%$:Q##JU'\"Z]!$*Y\"$+!\"%:]##K)$#+%!\"[-!#[-!%+5\");9(&;A'%[A$"
- "$[E!%;=\"&[E!$;Y\"$+Q!&+U!#+U%(+I.%[]$%,)!&L%#$<%&&L1\"%L1+%<5!%L)\""
- "'<5!%,9$%<=!%<=!%<E%#,I!%LI\"%\\I#&LQ!%\\U\"&\\U'$<Y!&<Y%%M!!&]!!&]%'"
- "%-)($=)!&M-%)-)!(=5\"&-E\"&]9!)=A'%MA!%MA!&M9$%]M!&]I!(>!!#M]!(-Q!"
- "(-U*&-Y\"%^)!(=]!$M]!%^!!)=U0&>!\"%^%!%^-!%^)!'M](%^-!(N1!(.-*%^1!"
- ").9)'>9!'^9#'>5&(>%!(N=!'NM'&N9#*.A''NA''>A!'>9!(NM!&.E!&>E\"(^='"
- "'>E&#^M'&.9!).E#*.M!&.Q!'>A!&.E!\">M!&.E!&.]!&>A!&.=!#^A\"&.A!&.E!"
- "&.=!#>=%&>=\"&.9!(>1!&.=!&.5!'>9!&.5!(>1%&>-')N10%^%!&N)$&.)!#>1!"
- ")>)%%>%#(-U!(=Y&$MQ!(=U'%^%!%]Q!$MM!&MQ$%M1&)=M!*-=$&]E!%M9*$]E\""
- "%=9$#=A!%M9!$<]!%]-\"(=5-#=1!$=%!(M%$%LU!'--\"&]!!%LM\"%\\U\"%<A!%<M!"
- "%LI\"&<M%'LE&&,9$(\\90&,)!$LE\"$,5!(<9%$,1!#,)!%\\5#%,!!%<!!%L)#%;M\""
- "%;M\"&L!'%+Y!%;M'&[I($[A!%KM#$[-!$[A!&+9!$[5!\";-\"#[1!$[-!#[)!%K!!"
- "#*]\"$*]\"#:Y\"$ZY\"#Z]!$*Q\"%*M##Z=\"$JA$%:A!':9&$*M&$J1\"#Z=)#*1\"&*5("
- "$Z)&#*%##*!#%*-'$IY&$)Y#$YU'$)I##YM\"#YI##YI#&IA$')=##91!$)I#\"I1!"
- "#XU&#I)\"#91!$Y%!#I)&%I-+#)1#!Y!!\"I9!\"I='$)A$#9E!%)E!$9I$\"IQ!$J!%"
- "\"IU!$:)!$:!'%J%)#Z5\"$)Y##J)!\"Z%\"%*-$!:9\"\"Z9!#*9\"$JA!\"ZA!'*A$%JI!"
- "$JQ!\"ZY!#ZY!\"JY$$;!\"$ZY\"#+%%$K-$$K)$#+%\"#[9!%[9!\"[I!'K5)&[5!$+A!"
- "%;E&%[I!&[I$%;Q'&KU,%KI''+Y%%;]!)K]\"%L!#%<%\"&\\)#&,-$%<A!%<5!&<9!"
- "%\\M'%<=!%,=(%,1!%LE\"(<M$$,A!'LQ!%<Q!&\\U\"&\\Y&%\\Y#&M%&%M%!$M%!%])\""
- "%M)!'-%#'-5\"%]1\"%M5!%M9!&-=#%MA!&]A!%MA!%]Q!%ME!&]M!&=E$%]Q!%]U!"
- "&MM$%]Y!%]]!%]]!(>!&%^!&%^%!%^)!'.)!%^1!$N%!*^!!'.1!%^1!$^=!%^1!"
- "$^E!&.E&&.=!&.5!#NA!'>9!'>E!&.5!%>U\")NQ0%^A*&NQ\"'.I%(^M'(NI!'.=%"
- "(>I+&.I&&.A!&.M!&^I)&.E!)^E!&.A!'>I,'>A!&.=!$^E!&.E!&>I!%.Q'(NI&"
- "'>A!&.A!&.=!&.=!$^E&&.9!#^5\"'N9'#>-!%^)!$N1!%^-!&>!\"%^)!)N)&'.%!"
- "$N!!'.)!%ME!$]M!$MY!)-Y)$M]!(=Y!%]Q!']Y))-A+$MQ!&]=!'ME)$ME!(-=!"
- "$MA!*=9!%M9%#M9\"&M%!%]-\"%M)!%]=!&-%$']%!%-%$'=!)%\\]\"%<Q!(,Q(%<Q!"
- "%M!&&<=%(\\E0%<A!\",A!%<=!%<9!'<-!%,1!%L5\"&,)!&\\)'%L%#%L!#&[Y$$+M!"
- "%+]!(+I!&;Y+$+U!%+Q!%+Y!%+E!%;A\"$+5\"%+9\"#K=$\"[=$#[)!$[%%#;-\"$JY!"
- "#:M#\"[%!#[)!#;%##JI!#ZQ!#ZI!$*Q\"$JM!$JY$$Z)&#J9!#JE!$Z1\"#J1!#J9!"
- "$J9!$J%!#*%#!J!#!YQ!!YU!#Z%\"$9]$%IQ*#YI##IM\"#IE\"#9A$$Y5'#I9%#)))"
- "$(]*#H]\"$(Y$#91$#(U##I%%\"I1!\"I5!#99$\"Y5(#IM!#YE#$)I#&9I'$)A##9Q#"
- "#)Y##YY\"#YQ)$:-##*!\"#Z)\"#J1!#Z)\"\"J1!!*1%%J9)\"J%!%JI!#J9!%:M$!ZQ!"
- "&:Q($ZE\"#ZU!$*Y\"%*]\"%*]\"&*Q'%+)\"#[)!%+9!\"[1!#[I!\";9\"%[9!'+=\"(;=0"
- "$;E\"![I!'KM($[Q%$+Q!%+U!&+]%%+]!%<!\"%,!!%\\%(%L)\"&L1&&,1%%<=!%<=!"
- "&,)!&<=&&<A!%<E!%LI!&\\M\"%LM!&<M!*,U'&LY!%<Q!!-%%%LY!&\\]&'-)\"#M1\""
- "&]1!%M-!&=1$)-9!&]9&#=A!*-=+*]A('-='%M9!%]]!%]M!%]Q!&MY$%-Y#%]U!"
- "'.!%(M]-'-Y!%^!!'-U!&.=!%^-!'.)!&.%!&^-%%^)!'>1'$^I!&.5!&.A!$>)$"
- "(.5*&.=!&>E'&.A!&NA#'>E!'NA''>=!'^I\"(^A\"'.I%#NI!&.I!+^M#'NM'$^M!"
- "%^M%*.A'&.M!'>M!&.I!&.M!&.M!&^I$\">M!'>E!'>I!&.M!&NI()^I,$^E!(^E'"
- "&>E!#NI!\">E!)^A!'>E!%^1!&.=!&>5\"#N5!'>5!%N5$&.9!(.A*'^5)#^1'&.)!"
- "'>-'%^1!$N%!'N!)'.!!$M]!&-Y'*MY&&]M%#ME\"%]I!%]I!%]I!%M=!'-Y&$MI!"
- "&-=#'-5\"%M9!%M5!\"M=#']-*%]9&$=)!'-%#&M-%&\\Y&&L]&$\\]#$=!!&\\U&%<I!"
- "%<M!&\\Q\"%<I!',E(%L=\"&<=&!,9!%<9!%,%!\"L1#&\\1(&L1'$<!!&<%%&;]!'[Y-"
- "%;Q\"*[M%'KQ#$+U!!;=*%;I\"#[=!#;A\"$;=\"#;I\"';9\"%+9\"$[1!%+-&#[)!$*]%"
- "%ZU)%[1!%:]##+)!#ZU!#JM!$ZI\"$*Q\"!*I!#JA!(*A%#J5!\"Z5!%JA\"$J5!#J-!"
- "$*-#$I]&&*-($J!!#IY!%)]!$)M#$YQ#$IQ&$IM&$)I$#9A!\"I=$\"9=#\"YM!\"9)#"
- "$H]##8Y!#(Y!\"I1!#9-$#91!#95$$)9!#9A!#Y9#\")E\"$9E%#9I!%9U!#9E!#J)!"
- "#J1!$)Y##YQ\"&)Y!!J5&#J)!!*-!#Z9\"#J5!#J=!$Z1&$:=$#Z=\"&ZA+#JI!$*I&"
- "#ZU!%*Y*#ZU!'+%.#:Y\"$:U$%+%&'J]%$+-!%;9&#[5!%[5!#[=!([=!\"[=!%;E\""
- "%KU#%[I!$KE#$[I$$+Q!%+]!&;U'&KY'&,!!%,%!$;Y\"&L5'$L5\"&<-!%L%#&<1!"
- "'<=!$LM\"$\\M#&,E#%<E!%\\M#%\\Q\"&L]!',U##,Y!&L]%\"-%!'L]!)=!-%M-!&M)!"
- "']-!'-1\"'--\"&-9\")M=-%]9&#=A!!-U!&]5!&MQ$%]Y!&MQ$(=Y!&-]!$MY!%]Y!"
- ")>!0&]Y%%^%!%>%#(>1!'>1,%^)!*N-%&.5!%^)!'.1!+.5'#^9\"&^9%$.A#'.=%"
- "'>Q!&^A$&>=\"'.A&(>A+&.M!%.9\"&.=&&.M!#NM!&.I!&.Q!&.I&&.Q!$_)!\"^Q#"
- ").Q-&?!!(NM!'>Q!&^I$'^U\"'>M!&.]!#^Q!'>U!).I.(N=!&.M!'>I&)^I!'>I!"
- "&^I$(NA!)^A!&.M&&^9$'^9#&.A!&.I!$^=!'>5!'>5!'>9!%N-%&.5!&.5!&>1\""
- "'>-&'-Y&#^)\"$^!&'.!!'.!&&-]\"&]=!'=Y'&-Y\"%]Q!&=M#%]Q!%ME!$MA!%ME!"
- "%]M!%]E!&M9$%M9!(-E!'-1'&=1$%M-&'])!%M%!&M)!%])\"&L]!$=!!),]!%\\U\""
- "%LM!%<M!%<I!&<E!&\\E'$\\Q#%<E!$,9!%,-!%,1!%,-!%L-##\\5$'<-*#+]!%<!\""
- "%+]!%+Y!'L!\"'+M*#KU#%;U\"#;M\"\";E&%[A!(+=\"&[5!$[A!&;-'\"[=!#[%!%[!&"
- "#ZU!\"ZY!$Z]!\"[!!#ZU!#ZQ!%ZU*%:A!%JI!%ZE\"#ZA%$*=\"#*9\"$J=%$J=%#J5!"
- "#J)!\"Z5!\"Y]%!)]$$9]$&J!*#I]!&9M#!YU!#YM##YI\"$)E!%YE!%)E%%)),\"Y9\""
- "\"I%!#X]#\"I%!\"I-!\"I%!\"IE$#)5#$)='!)=!#Y=##)1#$IE#\"YE\"%)I!\"IQ!$YQ#"
- "\"IY!#I]!\"J!!#Z)\"#Z%\"#J%!#J-!$:1!#Z1\"\"Z9!#J=!#J=!$*E\"$JE!!*E($*M\""
- "%*Q\"\"JY$![!!\"J]#%*]&$+%&#[)!*[)'#[1!&[5-#[5!&;E\"'[9!%+=\"%K=$&KA("
- "$[I!%;M\"&+M%%;Y\"$;U\"(;E\"&,%%#K]#$[M%#,%%&,!%&\\9#%L1'%<5!'L9&$LA\""
- "%L=\"%<A!%<A!(,U,%<Y!',I(#,Q!'<U-&,Y#&,M#'-)#$=-!$=%!%])\"%]-!%M-!"
- "%=-*(M5)&-9\"*-A+%]1'$ME!%ME!%M9!%ME!&MQ$'-M'%ME!%]Q!#>%!%]Q!'M])"
- "%^!!%]U!\"^!#$N1!'-]+$>)$'.-!'.1!&>1\"&.%!&^9%)^=!(.5$$^=!&.A!&.Q!"
- "$^E!&.E!$^Q!&.Q!(^Q!'^I#&.A!(>M*$^M!'^E#+NY.\">U!'NM''>Q!(N]&(>U$"
- "(>U%&.U&&.Y!'.]$(/)().I#(>Y*(^U'&.U!'>I!&.Q!(>U/&.Q!&.I!)^I!&.M!"
- "&>I!$^A!*.M!#>=%&>I!&NM#$.A#*^E%'>9!(NA!'.=%&.9!(NA!&.=&&>-\"&N1$"
- "(.1*#^-\"&.-!%]]!)>)*'^!)%^1!#>1!%]Q!%]Y!(-M!&]I!'-A!#=M!$MM!%M=!"
- ",]E!']9+$MM!#M5\")-9!%M5!(]5$)--!'=-$&]-'%M)!%-9#%M)!&]!'%]%\"(LU%"
- "'LU!&,U#$LM\"(<I)%<E!&<A%&<)%&<=!*<9)&,5$$,1!%,)!%K]##,%!%L-\"%,%!"
- "([U-%[Y$&,!)'+Q!$KQ#$;I\"%KE'*;E'%[5!%KE$&[9!%+=\"\";1\"%[1)!;-)\"K)$"
- "$;%#$K%$#[%!%+!\"$JU!#JQ$\"ZM!$*M\"'ZI##ZA!&*=+&Z9'#J=!#JA!&*5+%:=$"
- "\"J-!#J-!#9U!$)]##J%!&)]($YY#%9Q%\"II$\"9A#$9I$#9=!%)I+\"IE!#9=$\"I=!"
- "!(]!#9-!\"Y)\"\"I)!\"I-!\"9-#\")A\"\"IE!\"IA!\"IE!!9Q\"&9M\"$)Y#$9Q!$9Q$%YQ("
- "#J!!\"J1!#Z!\"$J1!$IY\"#Z-\"%*-'\"*-\"#Z5!#ZA\"#J9!\"ZI!$*E\"#*I\"!Z](%*Y'"
- "\"ZU$$JY!$+%\"$[)%\"*Y\"&+!'#+%\"&;)$#+1\"$[-$'[5&%;5\"&;='%KU#'+E&&[I!"
- ")+I&%[M%%;U'&KU#&+Y!$;]\"%KU#%L)#%,!!%\\)#%,-!$,-!%<5!&,1%#<9\"'\\A\""
- "&L=&$,9!%\\E#(,I-!,I!$LQ\"#\\U#&L]%',Y#&L]!$=%*&M%!%=%%%]-\"%M!!']%!"
- "%]1!&==$(-1\"&-=\"&MA$#MA!%ME!'MI)%-Q#%ME!%]]!#=Q!$N!!)>%/%]]!*^%!"
- "!-M!&.%!$N1!$^9&(>)!'>)'%^1!&.1!\"N1'(N9+$^9!(^1-(>5+&.A!'NE''.I%"
- "&NE#&NI\"&^=$&.Q!&>Y!&>Y!&NQ\"*.Q'&^U)$^Y!'^]\"&^Y#'NM!'>=!&.U!'NY'"
- "'NY!(^U!*.Y'&.U!&.Q!'^Y\"&.Y!%/!!+>U'!.U!'>E&&>Q!).U''.Q%&.E!$^M!"
- "'>M!(^Q!&NI#(>M%'.Q%&.A!#^E\"&.A!$^5!)^Q&$^=!'>-&$^A!$N)!'>5!&^5%"
- "&.5!%^1!).-$'.)%%^)!%^-!'N5(%^!!%-]#$MQ!'-Y!'-U!'-M&'-M!%ME!'-M'"
- "%]A!%]I!&-M\"%MA!%M=!%M5&\"-1%&-=#%M-!'\\M'$=)!&<]$%M!!(,U#%<Y!(,U#"
- "%<I!&LY!&\\E\"%LI!%<E!%,=%%<=!&L=!&<-%%L5\"&L5\"%L5\"&<E!%<!!&+]!%<!!"
- "'+]!#+]!$[A!$K]#&;Q&&[M-\";I\"'[A!$[E!'+A&$[9!&+9\"$[1!$K)$$;1\"$+)!"
- "#+)\"%[!)#[!!$*]\"$JY!%*M&#JE!%*U&#JM!$*Y&$JI!$:1$#J5!\"Z9!#Z5\"#*1\""
- "$J-%$J-%#J-!!Z!!#YM#$)]#\"YY\"#)U##9U!&)](#9I#\"YE(\"I9!#IE\"!YA!!Y9$"
- "!9!\"$I!&#))##)-&\")-\"#9-!#I9\"\")9\"#IA\"#Y=##IA\"&)I,$)I$$)Q$#9U!#9U$"
- "#)Y\"$*!##J%!%:5!#Z)\"#J-!\"J1!$Z5\"$:9##Z9%$J=!\"Z=!#J=!#JI!&ZA##ZI!"
- "#ZY!$ZU!$Z]%%*]*%*Y&$[%%%K-$$+)\"$+9!%K)$%[5$#[9!#;=\"#+=)%+M!#[E!"
- "$KU#$,!!%+Y!%;Y\"%<%\"&;]\"&\\!(#L%#%L)#%<-!',-)'L1+#\\5#%L5\"'<9!%\\9#"
- "%<I!$<I!%<I!(,I#'LY!'<U)&L]!%<Y!$<]!%M%!&]!\"%M%!$])#&-1#%]1\"&=)$"
- "&-5#'M9)%M9!&]A!%M=!&-E,%ME!$MU!#=Q!)MU,&]E!&=U#(=Y!(=]!'^!))>!%"
- "%^%!).1$'>)'%^-!&>!##N=!$^5!'>1&(.9*#NI!%N=$&.9!$^A!#N9!&>E!*NM4"
- "&.A!&.Q!&.M!#^=\"$^Q!#NE!(^Q!)O%#$^Q!&^U#&.Y!'NY!'^Y\"&.Y!&.Y!*>]-"
- "'_)(*.]!&.]!&.]!&?%!*?!(&.U!&?!!$^U!\"^Y#&.Y!*?!!&.U!&.]!&N]\"&.I&"
- "&.]!&.Q!'>U!&.M!&.M!'>I&%.Q!'>A!&.I!&NI\"&>A!&.A!(NA!%^)!&.A!'N-\""
- "#>-!$N%!%>-$&N-#%^%!&.5!%]]!%^!!$N!!']])%]Y!%]M!)-]%#=Q!%]]!&MY$"
- "%-=($MI!$M9!&-A\"%]5\"&-A\"&-A#%M-!%]1\"'--#$]%\"%M%!'\\M\"%M)!$,Y$'L]%"
- "%LU!&\\Q&%<Q!$\\M#%LI\"%LE\"%<=!&L=!%<M!%<9!&<5%&\\1#%\\%#'L5!&,!%%,%!"
- "',!!$+Q!&[E(%+]!%+Q!#[I!)+M*(K9$&[A)%[=!$[I!%K=$'[5%$;=\"#+1\"$K1$"
- "&K)!$K!$#[)!\"*]\"$+!&$*Y\"\"[!!$JU!$ZU)#JM$#ZQ!#JA!#J=!%:9%&*=(#Z%\""
- "%J1&#*9%&*)(!*1$%:%($YY#$9Y$$)U##9Q!%9M%#9M!$Y='#YE#$YA&#)5##99$"
- "\"I!\"$HQ'\"I=$#))#!I1&\"Y1\"!Y9$\"Y5\"#91!$)A$$)=$$9I%#II\"$IQ&%Z)'$Y]#"
- "#9]'\"J!!%J!&#J)!#J5!$:%!#J5!$J9!#J9!#JE!$ZE&#:Q#$JE$#JE!!ZM!'*Q/"
- "!*U!%JY!%*Q\"&K%!%+%\"#[!!$+)\"$+-!$K5#!+%!&;=\"$[=!&[I,$[A!&+E%%KI#"
- "%+M!&;E&%;U\"$+U!%KY#%K]#%,%!$<)!$\\)#&\\5(&\\1(&L)#$,5!&\\1(&,I$'\\A,"
- "%LE!(<M.&,I$%<U!&,Y#%<U!&L]&)--!'L]!%\\U#%M%!%M-!&M9*$]1\"']1*&M)%"
- "$MA!'ME$$]9\"%MA!&ME$'-I!#MQ!&]M!'=Q\"&=I#%]U!%.%\"(>!!%]]!%^-!%]]!"
- "(>!!$>)%%N5%'^-)'>1&!.9!$N1!'>9&(.=$&.I!&.=!%^A&&.I!&.E!&.E!&.E!"
- "(NM,'>=&&NQ\"(>A+&?!!)^U,&.U!&?1!*^Y$$.Q#-_-+$^]!&?!!&.]!&.]!&.]!"
- "&?!!$_!!'O-!&^Y#&?-!(_%!'O-!&?!!'^]'%^]%$_!!%N]$*.]!&.Y!&?!!&.Y!"
- "(^U!$^U!(^Y!'NQ'*NQ##.Q)*.M!&.I&(.E)*NA0&.I!&.=!$^9!(^-\"%^1!&^9%"
- "&.=!&.9!#N9!$N1!%.9\"+^)+%^)!&.%!%^!!&N-)'.!%&=]#$MQ!&-]!(-U!&=E$"
- "'-A'%]I!(]A$%MA!&-=\"#=-!&-E\"$]9'']1*#=A!%]-\"%-1$#M%\"%<U!&--#&<Q%"
- "'\\Q+'\\]&%<Q!#\\M#%<A!&<A&%LE\"$LA\"&LE&#L=#%,1!(,5(&,1$$L%#\"\\)$%+Q!"
- "#[Y$'\\%,#<!\"&+M!$,!!\"[Q%$+Q!)+M!&[=)'[A%$+1\"%+=\"&+=\"!+5!$;1\"%;1\""
- "#[1!#[)!#K1'#ZU!%*U&$Z]%#ZU!#ZQ!#JM!$:M$\"ZE!$:Q#%:5(#Z=!%:)!%JM)"
- "#J9!#:-&#J)!#Z%\"$:!$$YY'$IM&%9Y)$9U!\")Q\"&IQ.#9=!#IQ!$9M$#9A!#I=%"
- "$)%$$)!!\"I)!#)1#$)%!!)1'#I=%#Y9&$IA%$IE##Y9#\"IE!%IM#$YY#$9I$&9Q'"
- "\"Y]$#)]\"$Y]'#J-!%JA)#J1$$Z5&$:1!#ZA\"%JA)!*M!%*E+'ZM+$JM!$JE%$*M\""
- "#ZQ!#Z]!\"K!$&+)\"&ZY\"$K)$\"*Y\"#[5!#[1!$[)!%K=#%+5\"%[M)%+Q!%;I\"%;A\""
- "$+M!$;I\"([M)$+Y!%K]#&;].%,%!&,%!&\\5($+]!#<5%%<9!%\\5#%<=!%<A!%,9)"
- "%<=!%LI\"%<I!&<E!#,Q!%<U!'<Y)%LQ!&=-$\"-%!%M-!%M)!%]-!%M-!%M5!%M1!"
- "%]5\"%==$$M=+&-E\"%]]!$M=!\"-U!'-Y!&MQ$&.!!'MY#%]]!%M]%%>!$'.1!&N-$"
- "%^%!#^!\"&.5!$N1!)>5*&>E\"&.A!&.=!%^1!'.=%$^M!&NA#).I\"&.M!&.U!)^M1"
- "'>Q+'>Q&(.U)&.M!&.Q!$_%!&>]!&.Y!&N]\"&.Y!'O!!&_!)&?!!(_!!&?-!#O1!"
- "'_)(&O!\"'N]!'?%%&_9\"&O%\"&?!!&.]!&_!#%O!#$.Y#'/!*%_%$&.Q!'N]!&.]!"
- ").]-+NU'*.U!&.Y&&.Y!%>Q#$^Y!&_!#'NI!'>I!&NI\")NA%&.E!'^)*(.A$(.=$"
- "&.9!&N-#'>9!&^1%%^)!#>-!&>)\"\">!!%^)!%]]!%]]!%.!\"%]Y!(-U%(=Y!%]]!"
- "%ME!%]I!+M5'%M9!#M9!(==\"&-5#%M5!&-9\"%]I!&]=!%M%!,M=&'LM!(]!!&\\]&"
- "&<Y$%\\U\"%<E!$\\I'$<M!#,M!',I(&\\E\"$LA\"'L9\"%\\=#\",5!&,5%%<1!!L!#&\\%("
- "(<%!%,!!$+Y!%+Y!#KU#%+Q!!;I\"$[I!%+M!([A*%KA#%+M!$[-!%[5!%;1'\"Z]$"
- "$+-\"$JY!%;)#$;!#!*]!%Z]%%*U'$*U\"\"ZY!'*M$$*=##JE!$*A\"%:=(\"J9$#J1!"
- "#J1!$J-%\"*1\"$:)!'*%-$Z!\"$:!$&Y],$)U#$)Q$$9M!%)I$#9I#$9A$$YE#$)A#"
- "&)1#\"Y%#\"Y-\"\"I5!!Y9!\"I1!\"II!!9A\"#YA##YE#!YU!!YM!$)Q#&)Q%#)M#&IY'"
- "#Z!\"$9Y!#J%$$*%##J5!$:!!\"ZE!#Z5\"$Z9\"#ZA!&:9!#ZI\"$:I$#ZI\"$ZM\"!:Q\""
- "#*]!#ZU!#Z]!%*]\"$;%\"$+!\"#[1$%K9$$[5!%K9$#[9!%K=($[I!\";A\"%+U!$;M#"
- "$+U!%[M$%,%!#;Y\"';M#%+]!#\\!$%\\)$%,%!'<9*\",=!%<5!%L5#&<1!(LA!&\\M'"
- "$,A%&,M(%LM\"%\\Q#$\\U#%<]!%\\]\"'L]!%<]!%M!!$]-\"$M-!']-!&M1%&]1&&M9$"
- "%M5!(]9.%ME!%M=!$MI!'-]&%]U!'-U!%]Q!#]M\"(=Y!*MY!'.!%&.)!%^!!#N%&"
- "'.%!%^-!%^-!&^5%&.=!'>9!'^=(+NE4$.I#&.E&'^M\"'^=(!>I''>M&#^Q\"'NY!"
- "&.Y!&.]!$_!!&.Y!&.]!'^U(&^Y#&NU\"'O!'!/!!&.]!&?!!%/-!(_)!&?%!*>Y3"
- "&?%!&?%!$_)!'O)!*_%#%_%%&?)!'/)$&/9%&?)!'O1!'O)!&?!!&O!\"&?!!&^]#"
- "%/-!&.]!'>Q!&.Q!'NY!*.U!*^M**.M2)?!('NE!#NE!&.I!$^A!'^E\"#NA!&N=#"
- ")>=/'.=&$^9!'.!!#>1!%>-$'>-!&N%$$N)!%^-!$^%!%^!!%]Y!%]M!%]Q!%]Q!"
- "'MM.%]M!&-I\"#=E!&]A%%M9!&-=\"$]9\"&-A\"(=1#\"M-#(])&&=9$%M%!'\\Y!%M%!"
- "%\\]\"$L]\"%LQ!&LM&%,]#%<M!$<M!$\\E#%<A%$<E!&L1'%<5!%<%\"%,%!%\\%#$,!%"
- "%,%!%+Y!(;U+%;M\"&+Y%%KY'#;Q\"$KI#%+I%%+M!&K=(&KU'#[9!&[9!&+)+%;1\""
- "'+)'$+)!%;%#$;!\"#Z]($+!\"!*Y!$*U\"\"ZM%\"JQ##JI!%:E$#ZA\"$*A\"'*9$%:5%"
- "#J9!\":-\"#J5!$J1%#J1!%*!$$:-'$9Y$$9U!$9]!$9Y!%9Q\"#YQ%#IE$$)I#\"IA!"
- "#I%#\"9-##)-#%I)!$Y5'!Y9!%9A,#9E!#YI#$9E!$)E#!Y=!%YQ$$YU'$9I%$)Y#"
- "!Y]!\"YY\"#*%\"#9U!$J)%%:-!#JA!#J-!&ZM+#:9#\"ZA!#ZA\"#ZE\"#ZE\"\"JQ$#JM!"
- "#ZQ!![5!#[!!%+!*$[%%'[)&#[)!$+1\"%+5\"$K9#!;=&&[=!%;5#$;M\"&KI($;I\""
- "$KU#(;U\"%+M!%+]%%KU#%+]!%<%\"$,)!%L-\"$,5!$,5!%<=!%L9\"%<E!\"<=\"#LE\""
- "%<Q!%<M!%<Q!%]%\"(LU%%<Y!&\\U\"%M!!%M)!&M!%&])&%M)!(-A!&-9\"&]1!&-%$"
- "&-=\"%]A!$=A$'-A\"&MI$(]M$%]M!$MU!(M]-&]I*'=M#'>!!'=U''^%)'.%!%^%!"
- "%^-!'>)'%^-!(^)(&.)'&.=!&.5!\"N5\"\">I!$^A!$^I!$^E!&>A')NY$&.Q!+NU!"
- "\">U!)>Y)%^A&).U-(_%!&.]!'/5$&.Q!$_%!&?)!&?%!&O-!&?!!#O-!&?)!$_)!"
- "(_%!&_)#&?-!#O!!&?)!&?)!&?%!(/A!*?)!'O),(_)!(>Y*'_%((^U!#O%!+>Q!"
- "(O!%(_%!%?%\"&.]!&.]!&?!!'.M%&>U!$^U!'NM'\">M!*NM)'>I!(^Q!&.E!-NA&"
- "%>=(&.A!&.9!%N5%&>5\"%^1!$>-$%^)!%^-!'.!!#>)!,>!)&=]#$]Y!&=E#$MM!"
- "(=Y&&=U#\"MU\"#=I!'-I&&]=!&-A\"(]A$%]5!%M5!%]5\"(--'&=)$\"-%!(LQ!%]!\""
- "&LY!&<Y$%\\U#'\\U\"#,Q!%<M!(LI%%<E!(\\=(%,1!&<E!'<5!%L5\"%L1\"%<%!$,)!"
- "'\\%,&KY##,!!%L%#(+Q!%+Y!$+Y!%[Q)%[E$$[E!$[A!&+=!%;-\"#[9!#[5!&[=%"
- "#+-\"\"[)!%K)$%[)!&+!&$Z]%$K!$#*U\"#ZQ!![!!#ZM%\"*U\"!ZE!#ZE%#J=!!*9!"
- "\"J5#(:1'\"Z%$#Z)\"%J)\"\"Z!!%9]%$:)!#)Y#$)Q'&IY.%9M\"#YE\"#IA!$)A$#Y5#"
- "%9)&#))#\"Y-\"\"I!!\"Y=\"\"I9!#99$$)=$#9A!$)Q$$IQ%$IE&#IQ!#YQ\"#9Y#\"I]!"
- "$:1$(:%.#J)!%Z1#\"*1\"#J%!#J1!%Z=##*=\"$*9#$:E#$JQ!#ZU!%JQ%$*M\"$ZQ!"
- "%:Q$#ZU!#[!!![!!#[)!#[-!$+%\"#[9!$[5!%+9!%+=\"%;I\"%;E\"&[I$#;M##KM#"
- "(;U&&K]+&[Y$%,!!&+U%',)%&,)%%,)!#,-!',1%)\\%-&<9!%<9!%<=!&,E#&,E("
- "$LM\"%<M!&=)$&M%!'<U)&<Y$',Q(%M1&%]%\"'-1'$]5'&]5!(=5\"%]5\"$])#(==\""
- "$]A\"%]I!'-Q&$M=!$MM!']M)\"-Y!&-U!%]U!(-Y%(N!!$MU!%^-!'.-!$N1!$N-!"
- "&^1%)^5,&.5!&.9!&.=!\"^=(#N9!$^E&'>5&&.Q!&.Y!&.M!&.Q!+>A'$^Q!&.U!"
- "(^Y!)^U,'>U!&?)!'N]'#N]!(_%!$_)!&NU\"&.]!'O)'&?%!&?5!&?1!'/9$%/5!"
- "&_-#$^]!%/5!'_A''O-!&?1!'/1$'/5$*_1)+O-!&?-!%/-!'O)!&?)!)?5\")?%("
- "$O!%*O!/&?%!&.]!'O!!%/!!$^Y!'>U!'.Y$'NY!(^Q!&.M!$^M!&>1\"&.E!+>M!"
- "&>A\"&.9!&.9!&>=\"&.5!&.-!&.9!&N-)(.1*'.-!&>%\"&]]%%]Y!%]]!'>!')^!("
- "(-M!%]Q!$]M!%]I!\"-E!#MA!'-1'%M=!%M9!%=-$&=1$(=1('=!)%]%\"%M%!'=%("
- "']!!%LU!%M!!*<A-%LU!&,I#'<I)%<A!%<U!*<=)'L-\"&<E*%<5!&\\-(%,!!%L)\""
- "%L)\"$,%%$,)!&<!&%KU#%,!!&[Q-$+M!%[Q%';I+%;E\"$[5!%KA#\"[5!%[5!&+1&"
- "\"[)!%K9(%K-(![)!#[!!#;!\"'*Y'#ZU!$ZQ\"$:E'#J=!#ZI\"$J9!$*E\"#ZE\"\"Z=!"
- "%:1$#:9'#J-!%J)&#Z%\"$:%$$*!#$I]\"%)Y!#IU$$9Q$#9A!#9I!$9A%#I=%$)=!"
- "'(U)$Y)%$))'#)9##)E#\"99##9=$$)=$#YA#$II\"%9=)&)U,%9Y&&)U%!)Q!$I]%"
- "\"Z-!&:%)\"J%'#J%!$:)$!Z1!\"Z9!$Z9&#J9!':I)$:E#$JA%%*M'%JQ!$ZY%\"Z]!"
- "#Z]!#ZY!%+)\"%K!!\"[-!%+1&#[5!\"[5!)+5+$[E!%KA$%[A%'[A!'+E\"%;M'%+U!"
- "$;Y\"%,%!%,%!%+]!#,!!&,!%(,%.&<-!&<-%$KY#%<5!&\\5#$,A!%LA\"%LA\"#\\Y#"
- "%\\U\"%LI+!\\A$\"<U\"%<U!%LM!'M!*%M%!&,Y,#=)!%M1!&-A\"$M5!#M1'%]='%M9!"
- "%M=!%]A!&]M!'=M(%]M!'-U&%]Q!'-Y!&-Y'&-Y!%^-!'^%$%^)!$^5!%^)!%>1#"
- "&.5!&N5#&.9!'.I/&.A!&.=!%.I!&.E!%NI$#^M!&.E!'NU!&.Y!&^A$&.Y!#>Y%"
- "'N]''^]!&.M!%O%#&?%!$O5$%/-!&?)!(_!!%/-!)/5-%/-!&?1!'O)!#O1!&?1!"
- "$?1#*_-)&?-!&_1#(?))'_1!&O-\"*?1'&?!!*?5''O1!&?9!(O9$&?%!'?)%&?)!"
- "'/)$#NY!&?5!&?!!&.U!,/)/'O%!'/!$&.Y!&.Q!&.M!(NQ&&.M!'O!!(.E)&^E)"
- "&.=!&.A!&N=#&.=!'^5#&.5!(^1-%^1!$.-#$N)!&MU$&]]%%.!\")M]!%]]!(=],"
- "#=Q!%MQ$%]Q!\"-Q!%ME!%MA!%ME!$M=!%M9!&-=\"%]=!$]=\"%]5!#=)!'])+#]%#"
- "&M!%(]%!)\\Y!&LQ!%LM\"%\\Q\"$<E!%\\I#&LE&',A(&\\E(%\\9#&<A%&\\5#%<9!%,-!"
- "%,-!'+]!&L!#%,!!%+Y!%+Y!&+U!&[Q)$;M\"%[E!(+=&'K=$'+=\"$[1!'[9!%+1*"
- "$+9\"#[1!\"[)!#[%!%+!&%:A!#ZQ!$:Y#\"*]!&ZM##ZI%#ZQ!\"Z9!#JI!%:5!#J9$"
- "!Z5!#J%!#J1!$J9%\"J)!#J!!$:)$$)]#\"IY!&)]$#YM#\"YM!!YI!$)A!#I9\"\"9I#"
- "$H]&#I%%\"I-!!Y-!#)5#!)9!#)=&#9A!#YE)\"YA\"%)E'#)Q&$IQ%#9U!$Z!&#I]!"
- "\"*!\"&:%&#J%!%J5)!Z=!%:5!%Z9*$:M#'*=%#J9!#ZA!%*I\"%*Y'$*Q\"#ZQ!$*]\""
- "$ZY)\"*]!$[%!![!(\"[)!$+-!$+9%%[5$$[5!$;M\"%+=!%K1$$[E!&;I\"$;E\"!+]%"
- "\"+U!%+M!(+]!#+]%%L%#&<%&$L1#)L-!#,%!'L5\"%<A!&<=&%<=!%<A!&\\A(%LE\""
- "%<M!&<U$%<U!'<Q)$,Y)',](&<]$',]'%])\"*==&%M1!%M5!(=M,#M-\"&]=&'=I#"
- "%]E&%ME!%]U!%]A!%M9!%]U!%]U!'.%%%^!!$N!!&-]\"&>%\"'.%&'N-('>1''.1!"
- "%^)!)^9&&>9\"\">=!'>=!'>E!&.E!#^5\"&^Q#\">Y!'.Y%#NM!->Y*'^Y\"#NY!&.U!"
- "$_%!&?!!%/5!&?1!#O)!&?)!&.Y!&/)&'_-(&?-!)/1!(?1$&_5\")/1!(/=\"(O5*"
- "&O%\"&?A+%/1'%/5!&?9!&?5!)?5(&O)\"&?5!&?A!&?5!&?9!&?9!#O)!&?)!)/-!"
- "&?)!)/)''/!$&?-!'NY!(_%!&?!!)/!-'>Q!$^Y&&.M!&?!!&.U!).A#'NM'(NI!"
- "&.A!&.I!%N=$+>9((N5!'.A%&.5!%.-\"'.1%%^-!&>%#&=Y#%^%!*^!''-]!%]I!"
- "%]Q!'>%'&-Q\"$MM!%]M!&M5%$=9!%]I!&-9\"&-E\"'=5(&-)#&-A\"%M5!&]5!%]-\""
- "&-%#']%&%<Y!!,Y!),Q#$LY\"%LM\"&LY!'\\M\"*<%+&L9'&,I$%<9!&L)'$,-!&,-$"
- "&,)!#L!#',!!%,!!&[])%;]\"&+Y%$[Q$%;I&%[M%%+E!%[=%&;A&&+=&&K=($;5\""
- "%[!&#[)!%;)'#[%!$;!\"&;-$#Z]!\"ZU!$K!$!ZM!#ZU!$JI$&*U\"#JA!&J=*\"Z9!"
- "$*1\"#JM!#Z5\"#J1!$J1%%9])%J!#\"YQ\"%J%*$Z)&$)Q#%)Q$$9U!$)A'#9E!%)A'"
- "\"I%!\"Y%#!)-!\"I1!$9E!!Y9!$9A($IA%#Y1#$IE%\"YE\"\"YQ!$9U$$)Y##9U!$)]#"
- "#J)!\"Z%\"$:-$%:-)%*)##J9!#ZA\"$*A\"$*A#$ZA\"#ZE\"%:I$%JM)%ZU!%:U##ZY!"
- "(J]&![!$$[)!!+)!#[%!#[9!%;1\"%[1!%K%!$[=!$;E\"%KE#%;Q\"!;Y&#[I!%;M'"
- "$+Q!%;Y\"%+Y!%+]!$\\)#$<)&%L)#$<%\"%L-\"#<5\"%,1!%,-!$<A!#,E!%<M&&<M%"
- "(LU/&<M!%<Q!\"<Y!%M!!'-!('-!'%<Q!$])\"&M)!,-9$%M-!(]9$%]9''M=$&]A!"
- "%]I!$ME!$MI!&-M\"\"-Q%%]U!#=Y!*-])%]Y!%^)!$N%!(>%&$^1!$N%!%^1!\">5!"
- "\"N)\"&.5!&>9\"&.A!&.I!$^E!&.Q!&.Q!&.I!'NY!$^U!&^U$(^U!(^Y!(_)!&.]!"
- "#NU!&N]\"&.]!&O1!%/5!&?-!*/!!&?=!%?1\"%/1!'O9&%_9*&?1!*?9!&?9!%/-!"
- "&O1!%/=!)O9\"'/-$&O5!'_5'&_9\"&?E!&_M\"#OA!&_5#&?-!,_5&&?!!'O1!)_A*"
- "&?5!(_-+'O)!&?)!%O)#'?-%&?!!%_!$\">]!&?)!&.Y!#NU!'>U!&.M!'>I&&.M!"
- "&.I!'.E+&.A!&.A!&.9!&.A!$N1!#N=!'.1!%^-!'^))'.)!\"-Q!&>%#%]]!&.!!"
- "$MU!\".%!'-A\"%]Q!%-M#']=%'-E''=A(%M=!&-9\"$]1\"%M5!(])/+M%3%M%!%]!\""
- ")=='%]!\"\",M!%\\E##\\U#$\\E#%<M!&L]&%LI\"&LE!%<A!&\\A#%<9!$L=\"'L5&%L-\""
- "&<A%%,)!&L1\"&+]%%L1\"&;U\"(+Y!';]!$+Q!%KI'$[I!'+=*%;A\"%;M\"%K1,%;5\""
- "&+1&&+-.\"K)##+5!!:U\"%JY$#[!!%;!$#ZQ!&JM!%:M$#JI!\"Z=$$:M#$JQ!$*=#"
- "#ZI\"&ZI\"#Z1&$:1'\"J1!#J)!$:!!#I]!$)Q##YY\"#Z!\"$)I##*!##9E!$9A%#9A!"
- "#Y-#\"))\"\"91#\"I9!!YE!#Y9&#I5\"$95%$II#\")A\"#YU\"#:-&%YM(#)Y)\"I]!#Z)\""
- "#J!!%*%##J5!#J-!$J-%\"Z9!$:=#$JM!#JA!&:=(&*M'&ZE'#*I\"$*M\"$:U$$[)!"
- "$Z]%#:Q#%+%&#[-!#;-\"%;5#!;1\"#;9\"$[=!$+1\"$[I!%[E$#[A!$+Q!%KE'$<%!"
- "$+U%&KU#&,!!)<!!\",)!&<)!%K]#&,!%&L-'&LI&%<9%(,I,'<A*(\\Q!),A(%<M!"
- "%<Q!*,Q'%<E!),]\"%<M!(-!-%M!!#=9!)-9!%=-)'-1'&==(&]=!&-A\"*MI'&-I("
- "%MA!&ME$&MQ$(-M+'-M'%^-!$MY!&-]!&.=!'-M&'.)!%^-!%^)!(.5*&.5!&.9!"
- "$N-!&N5#&.I!&.=!$^9!'.I%%.M!&.Y!&.U!'>U!#NU!(>]$$_%!'?!%'.]/#O%!"
- "&?-!&?)!&O)!#O1!\"?9!&?=!&O1(&?1!'?=%&_5\"&O=')/E!&?5!&?5!(/M!&?=!"
- "%/=!&?A!'?=%&O=!'O=&&?=!&?9!)/A,&?=!)?=(%/9!&?9!&_9)(OA+'/1$&?)!"
- "&?1!&?=!)/-!#O-!(?))%/-!$/%-&?%!&.U!#O)!#O!!(^]!&.I!'.Q*(.Q$&.U!"
- "&.I!&.I!&>E!'.-%&.=!&.9!(N9!%^-!'NA!$>5)*N)%%]Y!'.-!(>%!)M]!%^!!"
- "'MY#$]]&%]U!&=Q#%]M!$=E$\"-I!#=A!%]A!%M=!+M=!%]I!(-1+'-)\"'])+'--'"
- "%]-!%M!&\"<]\"',Q#$\\I#'<=!$\\I#%LQ!\",I!%LI\"%\\A#%L=\"$,=!&<1!%L5'&LA\""
- "%,!!%\\)##<1\"#+Y!&+]!'+Y!&L!'%[E!$[E!%+]%%;E\"%[E$'KE($[=!$[5!&[M-"
- "#[1!%;5\"%+%\"$;5\"%[%%%;!$#[%!#[!!$:Q$#JI!\"JM##ZA\"%ZI*\"ZE!%*=&$JE("
- "\"Z9!$J9!$J5!#J%!$*!##J1!%I]\"#J!!%:%(#)M#%9]%#9Q!$9M%#YM##IE\"#I=!"
- "%I)(\"Y1\"%I5*%)-%&9A*$Y=#\"II!%IA##9A!#II!#YI#%9U%$)Y##IY!$:-#$IU\""
- "$:5$#J-!$J1%#Z)\"#J-!#J%!\"Z9!#Z=\"\"ZA!%ZQ&%*Q'$ZM\"$:I$'ZU\"!:A\"#[!!"
- "\"Z]!#[!!#[%!#[%!![9!$+=!$+5!%[9!&+M%%+A%&;A&![I!$[I!'+M!$K]#';U+"
- "%KM#&+]!&\\%#$,%!%<9!$<)\"',5-%\\9#%LM\"'<5*&LA\"%\\A##,5!$LA\"$LA\"&\\Q&"
- "%<E!&\\Y&%\\U##,]!&,]#%<Y!%<]!'-1\"(=1(%]5\"&M5$%M-!(=9,$MA&%M9!%]M!"
- "%]I!%]Q!%]Q!%ME!'-U!%]Y!%^!!%^)!&]Y%'>)'%^%!%^!!%^1!\">-!(>%!\".1!"
- "&^9$&.I!&NE#%^I%'>E&&.M!&>M!$^Q!%>]\"%>U((.Y)'O!!&.U!&.]!&?)!&?-!"
- "&?-!#O)!&?)!$_!!)/%!)/E!&?5!%/9!#O=!&?9!&?E!&?=!&_E\"&?=!%/E!&_M("
- "&_A\"&OE!'_A!'/U#&?5!'?E$(O9$)_A#&?9!&?A!&_A\"&?=!)?-.&?9!&?=!&?5!"
- "&_%#'?5%&?1!(/1)&?1!'O)!&?)!&O%\"$.Y##/1$&.]!'>E!$^Y!&.U!)NU/\">]!"
- "*.M!&.Q!&.I!&^I$&.M!(.A*(^-.&.A!'N5'&.=!&>%(&.-!\".%!%^!!&-]\")]]("
- "$MY!']Y%&-U\"'-U!']M*%]I!&-I\"%ME!%ME!$]-\"%M=!#=5!%]5\"'M-.%]1\"&M%!"
- "%]!\"'-!'%L]!%M%!'M!*$<U!&LQ&'\\I\"'\\I\"&<I!%<A!\",A!#,=!$\\A#%<=!%L5\""
- "',-$%<%&%,%!&;Q/#,%!(;]\"&L!'%;]\"&KQ+$;M\"%+U!$;E*&[A$$[9!$+=&%+E!"
- "$+1\"%+1\"#[9!%;)#%K)$#+!\"#ZY!#ZI\"%JQ)#ZU!$*A\"#ZI!#Z9\"#JE!!ZA!\"*E!"
- "!*=!#J=!$:5$$:%$&J-&\"J-!#J%$$*!#$)]##)Y\"#YQ##IU!#9E!$)I#$IE&$I=\""
- "!Y)!\"Y-\"#Y=&#)%)#Y9#!)=!&99*#IE%%)A'$9E\"%)Y!#J!!$)U#%)U$$J)\"#J!!"
- "#IU\"#:)#$J1\"':1\"&:5!&:=,$*5\"$JA!\"ZA!#JE!%ZQ*$*M\"$*M\"$*E\"#ZY!#*U\""
- "#*Y\"#ZU!#[%!%+%\"';5(#[5!$[5%%[=!&[=!$[5!&[I!%;E\"%+E!$KM#$+Q!%+U!"
- "%+]!&+M&&\\%($<%\"%<!!%L)\"%L1\"#,1%%L-\"%L-\"%L9\"&L=!%,1!%LI!%\\M#%<M!"
- "&<M!$<U&'=!$%<Y!&M%&%M)!'])&%\\Y#&-A\"']9+'=5#%=M$&-=#(M=)%MA!&-E\""
- "%ME!!-E&%^!!%]U!%]M!&]U%!-]!%]]!%=Y)(=Y!%^-!'>A!'.)&&.5!$^9!&.9!"
- "&.9!(^A!)^E!&.I!&.U!&.A!&^U#'.Y$#^I\"&?!!'NY!'.]%%/-!&?)!'O%''O)!"
- "'O-!(_)!&?-!)?1))?5!'_9!&?E!)?I!&?=!#O1!&/E%'/A##OA!)?E'*OA!*_U("
- "&OI')_A*'_E!)/9!#OA!(/A!+_E!'_I!)/A!*O=!'_A!&_=\"%/=!&?=!&?-!'/9$"
- "#O9!'?5*%?5\",_1&&_1)'>Y&'/-$&O-!&.Y!&?)!$_%!'>]&$^M!$^]!&.U!+.Q,"
- "&.U!(NI!)^I&&.Y!&.E!(.A)&.9!&.9!'>1&'N%\"%^1!$N)!%N-%'.%!\".1!'.!!"
- "&=M$%^-!&]Q%'-]!%]U!#=E!(-M%&=E#$ME!)MA-(=I,%M9!'=9('=1-$=-!']5!"
- "%-=#%M)!'-!(%<]!&LY&$<U!%\\Q\"%,U)$LM\"&\\U\"$<I!%LA\"%<=!&L9&#<!\"&,1%"
- "&<1!$\\-(&L)'#<%\"&+]%%+Y!%[Y$%+U!#[E!%[E!#+9!#[I!%[=!%;=&%;=\"(+9\""
- "&[5%$[9$#[-!$;=\"#[%!#[-!%K!!\"+!\"%JQ$&[%!%JY)$ZA&$*M\"#ZI\"#ZE\"$J5!"
- "#J9!#*1\"#J=!$:1!#J5%!Z)!%IY&\"YQ\"%9],%:)%%IU\"$)Y#%9A\"\"II!$Y1'\"9E#"
- "\"I-!#Y=&#)9#!Y9!$Y9'#YE#&YQ!#YE\"#95!#)I##)Q#!)Q$&9U-$IE%$*!&#Z%\""
- "$:%$$J9%\"*%\"#*=\"$J5!#J9!$J=%!ZA!#JA!\"ZI!$:I'%JE!#ZQ!#[!!#ZU!$*Y&"
- "&+!&#[%!#[)!&+5&%K%!$[1($[=!$+9\"%+5\"%KE#%KI#%;E\"&+M*!KU#&KQ#\";I\""
- "%+U%%+]!&\\!(%,!!&,)!&L-\"&,1%%<9!&L5&&<9!$,=!&<=!&\\E,%LI\"%<M!+\\Y*"
- "'<])*,U,%<I!%=%%$=!!&M%%%M1!#]!$&-1#(]9$$=1!(M5.)M9-\"-1!%]A&(=I!"
- "#MM!%]Q!!=Y'*MU!&-Y!'-Y!%^!!(.%%'.)!$N-!%>-$&N=#'N5').5/*^A%(>5+"
- "(^A-(^E-$>1*&.=!&^M$#^E\"&.Q!(NU&(N]+&NY'\"NU!*_!#&.]!&?-!&_)#&?-!"
- "(_1,&O1!&?-!&?=!&?=!&O9!&?=+%?A!%/=!&?E!'_A!*_Y!'_A!*O=!*_E(&OI!"
- "&_I\"+_=!'?I$&?E!%/]!&OI!'_I!&OU!)/E!&?A!*OE!'_E!-?I!#O=!'_A!'_A!"
- "#O=!&O-\"&OQ!&/Q$)/5!&?=!&?)!&?E!%/)!%/%!$_!!&.]!&.]!&?%!(/)('>U!"
- "(^Q!'_!(*>U\"&.M!&>E!)^E!(>A&'.5&'>=&'.I*(N5,&.5!%^%!$>)*%^)!'^%)"
- "\".!!'.!!%^!!\"-U!&]M!%]Q!&=Q(#=I!$=9!%MA!$M=!$]9\"'-9\"%]M!$]1\"']-!"
- "%M%!'M)$*-!!$L]\"&,Y(%-%$%\\U\"%\\Y\"%LM\"&<I%&\\I\"%\\A#$L=\"&<A%&LA&#L1#"
- "%\\%#$,)!$<1%$,)!\"KY#&KI#&[I!%+U!$+Q!#+Q!&+M)&;I\"&;E\"&[I!%KQ#(;9#"
- "%+5&$+1\"$+-!$;)#%+!\"!+-!$;%'\";!*$*Y\"#ZU!\"JQ$'*Q,!Z=!&:9%#JA!%:5$"
- "#JI!$:1##*5\"!*1$#J-!!*5$$*%#$9]$#9U!$9Y$&)]!#9A!#91!#YA\"%YM+#9A!"
- "!Y1!!)1!\"I-!&Y)&#Y9##IE$()=(%9=##)M&&YU!$9Q$#)U##J!!%)Y$$*%#$J9!"
- "#YY\"#J1$$J-%#Z-\"%*1##J%!%J5)%*9&%JE!#J9!%*E\"#ZQ!$*Q\"#ZU!$:Y*%+)\""
- "$JQ!#[!!#[-!$[1!%+1&#[I!(+5'&+5\"&+=**;=(%[I!$KE#&KU+)+M&)[I!$;Y&"
- "&+Y!$+]!%;]!%,!!%,-!&,1%$,A!',1)%<5!%<A!&,=$#LE\"%LE\"',I)$L=\"&<M!"
- "&LM&',Y#&,]#%]-\"']!!$M%!'-!'&M-!%M5!'M5)'-%-%M=!&-=\"\"M1\"$ME!(]I."
- "%]I!%]M!\".!!(]M$(M]')MI(%]Y!&N)#(>!!&N5#%^-!%^)!#N=!$^E!&.A!&.I&"
- "(NE&'^A('NM''^Y('^U(&.Q!(NA,'N]!&?-!'O!!&?1!&?-!&?1!&N]\"&_%#)/=!"
- "&?5!!O9#$_%!&?9!%/9!)/5!&?=!%/Q!*OA!*/E%*/E+*OM!,_E+#OE!&OI!%O=#"
- "&OM!'_Q!&OM!'_M'(_E+(/Q!&_=\"'OM%\"?E!'/M#&?E!'_I!)/9!)/E!'_I!'_I&"
- "&_I\")/=,(?9)&_9\"\"OE!'_5'&O)!(/=(&?-!'_!!)O%#$_%!$_!&&N]\"&>]!&.U!"
- "'NY!&.Q!&.M!$>Q$&.M!(NM!%^1!%^-!%^%!&N9#&>-\"'N1('^-#%^5&).-$%^!!"
- "'-U!&]]%$MY!'=Y((=Y!%]U!!-I!%]I!!-E!'=U\"&]=!!]A$']5!%M5!'-%#\"--!"
- "(])&&-%$%M!!&\\]&&-!($<Y!&LU!&<M!&,U#&<5%#<E!&,A(%\\=('<=!&<9!'<5!"
- "#,5!$,)!(L1\"%<%\"%L%#%<%\"$[I!%+Q!%+U!$KQ#$;M#%[I!&KQ#%;1\"*K9%&+I&"
- "#[9!![9!$[=,%K)$&;-'&:]+$[!!\"+!\"%*A&%*Q\"%JQ!\"*E\"#JE!%*E'$JE$#ZA%"
- "$ZE%#J5%$:1!#Z-\"#J%!$:)!%*)'$:9$%:!$%I]\"#Z1\"#9M!%9M%$9M%%)I!&YE/"
- "#I-%#Y)#&)A(#)-##)9#\"I=$\"99##)E#%IM&&)U($)=$$9U($IY\"#IY!#Z5!'Z!("
- "#I]!#J-!!Z)!$:1!$:=#':1&#Z=\"$*A\"#JE!!ZI$&:Q,#ZM!$*I&#ZQ!$*]\"#Z]!"
- "&K-)&+%\"%+)&\"ZU!#[E!$;)&$[9!%;1#&;=&%+U!%;I\"&KU#$KQ#'+Q!&[U($+U%"
- "&,!!$,-!%,!!&\\)'&L)\"$<-!%<5!%L5\"%<=!%<A!%<=!%<E!&\\M+%\\M#%LU!$LU!"
- "&LQ&%<U!)M-$%M!!']1&&=5$%M)!#]-'$=5!*=9+%M9!%]=!)-Y*%ME!&]I!%ME!"
- "$]I\"*>!%$MQ!&MY$%]U!$MU!&-Q'-N%.&M]$'.-!$N1!&>5\")^9'&.9!)>5%&.M!"
- "&.E!(.M)&.M!&.Q!&.U!&.U!$^M!(NI!'N]'(?!)&?%!&?%!'?)%&?-!'/-$+O1'"
- "(?5#&?5!&?A!'O5!&?=!'/E#+OI%+_E!&_E(%/I!&OM!&OQ!&OI!&O]!)?M!&OQ!"
- "&OI!%/E!&OU!!/Q!*OM''_U!&OU!&OQ!&OM!)OM\")OM((_I+&OI!'_E!'_A!\"?5!"
- "*?E&&?9!&OM!&?=!'?9%!/5!&?%!&?)!&?-!&?E!#O)!'?-%'_-'&.]!(/)(&.Y!"
- "'^U(&.Q!&.Q!'>M!(NE!&.I!&>-\"+NQ-\">I!(^='(.=$$^A!+>E!(>-&#>)!)>%+"
- "#^!\"&-]!&>!\"'MQ#%]Q!&]M!%]M!%ME!)=I!$=9!%ME!&-9#$M=!&M)!%<])&M-!"
- "%M)!&]5!',Q#%=%$%\\]\"%\\]\"(-!-'LI+&<M!'\\M&&<M%%<E!%\\5#'\\M+$L1'&<5!"
- "&\\1#%L)\"'<)!'KU#$,%!%,!!%+]!%+U%&;U+$[I$';M\"%+I%([A%$[A!&;='#[5!"
- "%;9&%;E&#[)!$+5\"#[-!$K!$\"[!!#*]!$:Y'&JY!$JQ$$JY!$JA!#JA!#ZE%%:A("
- "':=%$J=!#J5!#J%!\"Z5!!*%$$J)%$:!$#J!!$I]%#Z)\"')U%$9Q!$IA##IU\"#YE#"
- "\"9)#\"Y1\"!)%$#I-%#Y9#%Y9+%IA'!IA#!YI!#9Q!#IQ\"%:)+$YU'%I])$*%#$I]\""
- "#J)!$*%#$:-$#Z5\"\":5&#Z5\"&*1$%ZA\"%JI%$:I$#ZU!$*Q\"$*U\"'*]#$;!##Z]!"
- "$[!&\";%\"%+)\"![-!#[=!$[1!$[A(#[1!#[A!)KQ#%+=\"%;I\"%[I(\"[E!$KU#'+]%"
- "&<!!%+Q!)\\%(#+Y!&\\9#(L1&%L9\"&<1!%\\9#'<=!%LA\"$,A!#LE\"&<]$%<Y!%<U)"
- "',U(&,U($=!!&]!\"%M-%#=%!%]1!'M1)&-9\"&=5$$=5!%M9!%MA!&MI$(=I1%]I!"
- "$MM!)=Y!%ME!#=Y!%]M!'.)%(>%!%^)!$^9!$N-!'^9#&.9!$^9!&.=!$^A!&.E!"
- "&.M!&.U!$^M!&^Q#&.M!&?1&&.M!&N]\"&?!!&?!!&?)'&?)!'O%!'O-&&?%!,O9%"
- "'O)!#O9!(_=%'OA&#OA!'_=!&OM!&?E!%/E!&OI!&OM!'?]$'_M!%_U#&_U\"&OI!"
- "#_M!-/Y,&OM!&OY!'/U)&_U\"(OM$%_M#(?Q)&/U$'_Q!&OY!&OI!#_Q!%/=!*_A\""
- "'_E!(/A\"$/Q\"&?=!&OE!&?9!&?9!'?-%%/1!&?5!,?A\"'O)&'O%!$_)!._!1&.Y!"
- "#.U)&.Q!$^Q!&.Q!%^M%&.Q!&.A!&^=$&NM\"(N=!%^1!(>5&'.-*$]U''.-!&=]#"
- "$N-!%]U!'-Y!%]Y!'-U!%^!!&-U\"%]M!%]I!']E$%]A!&M=$&M9%(]%*$M5!%M-!"
- "(M1)%]-!&=-$&\\]!%<Q!%,Y$%LY!%LU!)<A2%\\Q\"\"<E\"&\\I\"&LA\"#<9\")L9!'L5\""
- "&L1\"'<-%%,-!'<)!%<%!&<-!%K]##+M!&+]!$+M!%[M$';E\"%+=!\"+E!%+E!\"[=!"
- "$[9$%[-!$+9\"$+9\"%+%&%;=&#+!!$K%$#JY(%ZY\"(Z]/%*Y\"&*M$\"ZI!$ZE\"$*A\""
- "#Z5)(J5$#Z%\"\"J1$#J-!#J%!#J)!#J)!$J%&\"Z!$%)Y!#9U!#YM\"#YQ#\"YM\"$)E#"
- "$I!&#9)$#Y=&\"Y5\"\"IM!$YI&#I5%%Y=$$9I$$IM)#9U'#9U!$YY'\":-##Y]\"$)]#"
- "#J%!!Y]!\"J-!%:-!$Z5&#*9\"$JI!#JI$%:E+$ZQ\"#JA!%*I#$*U\"$*U\"$:Y'$;!#"
- "$[!!#Z]!&:Y'%+5&%;1'$+1!$[I!%[=%&+A\"$[E!(+Y-#[=!#+M!%;I\"(KU#&+Y%"
- "$+Q!(;U\"!\\)$#+]!$<-\"&\\1($,5!%L5''<)%',E(%\\A#&,E$&\\]\"%LM\"(LI/(<=."
- "%\\U\"'LQ/%<U!$=!!&\\Y\"(])&%]-\"%=1$%M5!%M9!&]=+&]A!,M=,%M=!*MI,)MM\""
- "'-U!%]U!'-Q'%]]!%^%!'=Y''>5!&N)$%^-!%^1!&>1\"&.9!'>9&'>A!&^Q#'>I!"
- "%.I!&.M!&.E!+>U!&.E!&.U!(_!&&.U!'_!\"\"N]!$^]!#O%!'O1!&?1!'O1!)/5!"
- "&?5!'_E!'_=!)?M!'_E!'_A!)_I*'_Q!&OI!%/E!'/9#+_Q&&?E!\"OM!&OU!)_Q#"
- "!/]!&P-!&OY!&P)!(/]!)?I!'_Y!)/M,(/]!&OU!&OU!(_Q$&OY!(_U+'_M!(?=)"
- "%/=!-/M&)/=!&OA!%?=!'O=&&OI!'O1!'O%!'/5$(O9*&?1!(/-)&?!!&?%!&.Q!"
- "&.Q!'^Y'(NE!$^Q!&.M!%.Q!+^M)&NI#'NA'&.=!'>9!&^9$&^5%(>A+%^-!%^)!"
- "$^%!%^!!%]]!&]U*&N)#&-U'%=I$'-U!%M9!*=A&#=A!&]A&(=9,'M5)&M5%'M5)"
- "%]%\"%]!\")-1&'-%\"$<U!$\\]#%LY!%\\I#'<Q)$LQ\")<U2%LE!&L=!%LE\"-<5/&\\1#"
- "$LA&&,-%)L-!%\\)$$,%!(K]'&;U&#<%\"%[U$(+Q&$;I\"&KM'%;I\"%+A%%;A\"#[9!"
- "%+5\"%[5!&+1&\"[-!#;%#$+)!';)(#[!!%+)&&:E!#ZU!$JQ!!ZQ!\":M\"$:I$#JI!"
- "$Z=\"#:=#$Z9\"$:1!%*!!#Z-\"%:1!$*%&&Z!(%Z%##IM\"#9M!\"9U)#YM\"$II%#I9\""
- "$IA#$Y5*\"IE$!Y=!\"IA!%9-)#)A#\"II!#9I!$9M!#)E#$9Y!#IQ!%)Y($:)$$Z%*"
- "%J))%:)(#Z5\"&J5-#Z9\"&*A(#J5!$JA%#J5!\"*M\"$JA!':Q!!ZM!%JY)$[-!%;!#"
- "%;%'#[)$'K)-#[%!$+-!%K1$$[A!![=!&+A\"$[I!'KA(%+I%$+Y!#+U!%+U!$;M#"
- "&+]%&K]#'<9%$<)!&\\-(%<9!$,5!%<5!&<=!$<E!$,A!&LE!'<I%#LQ\"%<Q!&-%$"
- "&LY&(])**-%!%M!!&--#%])\"#=-!(M1.%]5\"&]E&$M=!&]A&%]Y!'MQ#$ME!&]M!"
- "%]U!&-Y!!]Y$&N-#%]Y!#>!!'>9!'>5!'^-#'N1\"'>5+&NE#$^I!&.A!'>A&'^E#"
- "&.I!#^E!%>M\"*NY\"(NA,&.U!'O!!$^]!&?%!&?%!'O)!&?9!&?1&'_A''O5!)?9!"
- ")/=!'?=$)/A!*OM!&?5!#/I#(OI$)/E!)?M!&OI!$/U(&_U!&OU!'_Y!%_Y#'_U!"
- "&OI!+?]*&P!!%/]!%0!!(/]!&O]!&_Y!'/]\"(OY*(/Q')?U!$/U\"#_M!\"_I\")OQ\""
- "'_U!(?E)%/I!'_E!&OM!&?=!+OA7$_Q%*O=!'?-+(?1#&?1!$/1\"&?=!&?%!'O)!"
- "(^M-&?!!#NU!&.U!&.]!(>I+'>U!(NI!&>I!&>E\"%^)!&.!!&.I!%^-!%^!!'.)!"
- "(>!!'.%!$N1!%]Y!)-]*%]Y!']Q$%]Q!&]M!%]U!%ME!'-=\"%M=!&-5#%-5#&=12"
- "(M)$%M)!$M-!(]%!%-!$&-%$%L]!'LQ!%<M!&\\Y!',I#',=(%<A!%<A!',9)$<Q&"
- "$<5&%,1!&L-#\",)!&,)!&;U'%;M&%+U!';U\"&+Y%%+Q!#[E!%[E!%[E$&+A&&KE$"
- "#K9$%+1&#+1\"#ZQ!#[5!\";%&$+%\"#[!!$K)$$JY$$*U\"#ZQ!#ZM!\"ZQ!#ZE\"\"ZE!"
- "%:9(%:9!%:1!$*5\"#J1$#J1!#Z)\"%J%*\":!-!Y]!#J!!$YQ'#9Q!#IM$%YI$$9I!"
- "\"I)!$Y-$#I5\"%)5(#)9#$9A$#Y5&#IM!#YE\"#YI#&IQ'$:%$$)Y#%*%'$Z!&$:%$"
- "\"J%!#Z-\"\"*9!#Z1\"$:9#%:9!$Z=\"\"Z9!$JE!$ZM%#:M#%JQ!#Z]!\"JY$$J]!$;-\""
- "#[!!\"[)!'+-\"#[)!%+1*%+9\"$[9!%+=\"%+I!&KE#&;I&!;I&$KM##+]!$[I!%[]$"
- "%+Y!'+]%%<%\"%<!\"(,1$'L1\"'L5&',=#&<=%)<A-%LI!&LA\"&,A$&<M%),Q'']!!"
- "%LY!#,]!#=-!&M!!&LY!)=9'#M1\"#M5\"&=-)&]9!$=5!&MA$&=E#%]I!#=I!#=Q!"
- "%]Q!#-Y%$MY!%]Y!&.5!%^)!'.)*%^%!'>1&'^1)(N5!'>A!&>A\"%.I\"&.I!&.]!"
- "(NI!%>I()NQ*(>I%$^Y!(_!,&/!&&.]!)/-(&?)!$_%!'/1$'^]!%/5!'O1!'O9&"
- ")_A/)/A!-?1)+/E#&OI!&OM!$/Y!'OU%&_Q\"&P!!\"?U!#_]!'?Y$&OU!(/]!#_]!"
- ")/],(_Y$'@!#%`1\"&P)!%0!!&P%!&O]!&OU!'/]/'/Y#&OU!&OY!&OU!'P!%(/]'"
- "#_M!%/]!'_E!(/I!'_=!&?=!%/A!&?A!'O1!&?5!&?1!&?A!%/-!&?)!&?%!'>Q&"
- "%NM$+N]'(NM!'>A!'>Q!'>M!&.E!&>Q!'>E&+^=+&.=!%N1$%N9$(>-!&N-#$^9!"
- "&^)%'>!\"%^!!%]U!$MY!%]U!$MY!%]Q!%]Q!%]I!%ME!%]I!#]E#%M1*%M5!']-*"
- "'-9'']-!'])+%M1!'=))'<Q)&,Y#$LU\"%<Q!%<Q!(<I$%LI!#,E!'L9!%<=!(L5&"
- "%\\9(',1$&,=$%,)!&,1%&,!!&,%%#,!!&+Y!%<!\"&KQ(#+M!%[I!$[E!%;E\"&[Q$"
- "$[9!%[5!%;5\"![1$$[-$$[!%%:Y$#K!$&:Y$$;!\"#ZI\"$JM%#JM!$:I'$ZE&$:E#"
- "#ZA!$*5\"%*E'\"Z5!#J1%$*-#$J)%%Z%'#*!&$)]#&)Y$#IQ\"$IQ%$9M!&9M&!YI!"
- "#Y-&\"Y1\"\"Y1%\"Y9\"%9A#$9A!%Y1(#YM#%9I%$)Q#!)U!$IQ)#YU\"#IY!$Z!'\"J!!"
- "#J%!#J)!$J-%\"Z5!#J1!#J=!%:A!%JE%#:M#%ZI*$ZY\"#*Q\"%ZU\"%:Y'#JM!%+!\""
- "%+1&%[)!$;=\"\"[1!#[9!&KE$&+9&';=#$KA'%+E!!+M!&;Q'$+M!$;U\"&+Y!\";U\""
- "'L),!<%&%;]\"&,)!\",)!%L5\"%L1#$,5!!LE#%<5!%<E!&\\I'#LM#%<M!&<I!&LU!"
- "&<Y%%\\U#%]%\"&]%'$LY\"(=-#&-1#&-9\"'-1\"%M9!&]=+%MA!%]A!$MI!&]A!%MA!"
- "#>%!%]U!#MM!%]]!&-U!%^%!)N)1(>)!'.%!&.=!&.9!&.=!'>E!&>A!&.Q!$^I!"
- "&NA##NY!,.]$&.M!&.U!&.U!&?)!$_%!'O)!&_1\"&?1!'O1!(/9(%?9\")/=!&?=!"
- "&OI!'_E!*_E\"%/M!'OI%(_Q$'OM%&_U\")/U,&OU!&OY!&_]!&O]!&OY!)P-!(@!\""
- ",@%!&OQ!(0!!'`!,-`1!(?]\"'_U!'0-\")@!!(O]))OU.&`%'&_Y!'@!$&_U!&/Q%"
- "'_Q!&_M\"#_E!%/M!,/E!'_9!&?1!\"?1!%/9!&?9!&_5#)/1!&O)!&?-!$_)!&?%!"
- "&O!\"&.Y!*?%!&.Q!&^U$\">Y!$^M!'^Q\"&>M!$^=!&>A!&.9!(NI!$^5!*.-.&.)'"
- "%]Y!&^-%%^!!$M]!\".%!%]A!%]U!$MQ!%]M!&]I%%M5!%]I!'==#&-A\"%-=$(-A!"
- "'-1'#M-\"$=%!$]%#&,]#%<]!%LQ!%\\Q\"&<Q$',U#%,=%$,=!),E($<I!%<=!$L=\""
- "'<5.&<=%$,%!%<5!&,%!&<%&&+Y%%K]##+Y!'+Y!$;Q\"#[E!$KA$$[E!%;E\"&+M!"
- "%;1\"#;-\"%+9\"\";-\"\"[!!$;-\"\"[!!'+%'$J]!\"ZQ!$:Q'$ZM\"$JA$!ZE!#J=!$ZM%"
- "!*A$\"JA##J5!%*A'%9]($Z)&$J)\"#9Q!#Z!&$I]&#*!##9U!#*)&$)M#%9M%$II)"
- "#9-$%I=-\"I5!\"Y%#\"9E##)=#$IE#$)Y#$9]!%)Q($Y]##YY\"#I]!#I]!#J!!$J-("
- "%Z)*$:-!$Z1&#J9!#J5!%:9%$JA$#ZQ!%JU!$:A(%*E\"'*Q$$*U\"$;!\"\"ZY!$*]\""
- "%;%'![-!#[-!!;1\"%;5\"';=#$[5)%[A!%+5\"$+Q!\";5\"$+M!#[A!%KY#%[]$%;U\""
- "%,!%%<5!&\\%$&<-!%,1!%<9!'<-*(\\A0%L1#%<A!&\\E'&,I#%,Q$&-!#'<I%%L]!"
- "%M-!\"LU#%]%\"$M!\"%M)!&L]&&]1!%M5!'=1(#]I\"(M=)#MY!$ME!%ME!'-M!%]U!"
- "'-I'$MY!%-]#(>)!%]Y!'N-(#>)!'>5!$N1!'^-#'N9'&.9!%^1!&.E!#NU!&.M!"
- "&NI#%>Q\"#NY!*.U!(^]1!/%!(?!$&?5!&_1\"&?1!&_1\"'_5'&?=!&?-!+_=!(?9)"
- "'O-!'_A!*/M$%OE#(OM$(?M\"'_Y!)?Y!(@!\"&OU!-0-#%O]\")@-&(0)!*`)!,@-'"
- ")`%)&P%!(0!!'_U!(@%!)P-!(/]!(0%!(OQ#,@!!)@!!&O]!&P1!&O]!%/Y!&OU'"
- "%/]!&/Q%&OM!)?M'&OI!,?E/'_E!\"?Q!'_=!&?A!&O1!*O=-%?1\"%?!($_)!(/1)"
- "&O!\"&.]!&.]!$^Y!&NU\",NQ!&.]!'N]!'>M!&.E!\">A!&.5!%^-!%^)!&.-!%^)!"
- "%>1#$N)!&.%!&.)!'-Y!%]U!)=Y&%^!!&]A!$MI!']9%'-U!$MA!%M=%%M9!&M5%"
- "'-9,&-A\"%]-!#=%!&,M#%M!!%<]!&,Y#',Y##LI\"%<I!'LI!%<9!%\\A#&\\=('<9%"
- "#\\-(%L1#%<1!%,!!%,!!(L-\"%+U!$+]!$[Y($KY##[E!#+Y!%+M!&;M\"';I+%;M#"
- "%;5#&[=)![A!#[1!#[-!$[)%#[%!&:]+$*]\"$ZY%#[%!$*Q\"$JM$#ZY!!ZA!#J9!"
- "#ZA\"#Z5\"#Z9!$9]!$:=##J-!#J)!#Z!\"%)Y$$)]##IU$#YY\"$)U#$9I%#99!$)M$"
- "$))$#I1%\"Y5\"!I1##)%$!YM!#II!$)Y##Z!\"!)I!$YY'#:)##I]!\"J!!$J)%#Z%\""
- "\"IU!!Z)!$J1\"$Z5&%ZE\"$Z)&$:='$*Q&$:9$#JM!&ZQ&$:U#%*M&#;!&$;%\"$[%!"
- "$K!$$+-\"#[5!$K)'$+5\"$[A!'+A*%+E!%KE$&+I!%[I$$[E!$;Q\"';Y+%;]\"'L)\""
- "$K]'%+]!&+Y!%,-!'L-\"'\\5(%,1!$L9\"&LI&%<A!%<M!$\\E##,M!%<E!&,Y#'LU!"
- "%]1\"%\\]&%<Q!&LM&'-)#\"-1!']-&(M)$%M9!&-=\"%]Q!%ME*&=I(&]M!'-Q&%]I!"
- "%]I!%ME!&]]%%.!\")]]\"(>-!%^)!(>1+*^1%&>5\").93#NA!'^A(&.Y!$^I!)^E!"
- "'NQ'%NY$*.Q!$^Y!&.]!(NQ&%?%\",O),'/-$&?!!&_5\"'_E!(?%*)/5!'_5'&?=!"
- "&?E!(/9(&OI!)/Q&&OM!&_Y!(/Q-)_Y.)?]!&P!!(0!!,?Y4(09!'_I!(@!\"(09!"
- "(0-!(0)!+0-!(@)!-`)!)@!!(0)!(P9\"(0-!)0%%)P)!(@!\"%0!!&OY!&O]!&OY!"
- "(_Q+-OY!&OI!$?M#$OE$(/E!*OI!'?=%'_I&%OM\"&O9!#OA!&?1!(/=((/%#'_)!"
- "$^Y!&.Q!&?%!$^U!'>U!&.Q!&NQ\"'>M!&.9!&^Q$$^A!&>=\"%.9\"&.5!&>5\"%^1!"
- ",.%-&N1##>!!\".!!&-]'&-]!&]U%'-]!&-M\"&=I#'=I('=E\"&]A!%M=!&M9$%M-!"
- "&]1!&]1+%M%!%M%!*-%&%M)!)-!,%<Y!%]-\"%,Q$%<M!\"<9\"\"<M\"%<=!&LA\"#\\9$"
- "&<=!&,5$%,1!&L1\"&,)%%\\-#(L!\"%<%!#[Y$%+U!$[Q$&+M!(;I&&+I&%[E!$[A!"
- "%[=!&+E%$+5!$+1\"#[-!#+)\"$[%%%;!'%:]#%JU)\"ZI!#[!!'*I$%JM!$*I\"&*Q*"
- "#ZA!$JU!$*=\"#J5!#JE!#Z-)$*!#$YY#$*!##Z1&!*!!$9]$#I]!$YE'$9M$\"YE\""
- "$)-'!I1##)E#\"I9!#I-\"#9A!\")E\"&)E,$9I$#YM##J%!\"J)!%Y]#%YQ*#J)!%*-'"
- "$Z5&#J-!$J1%#J1!#J=!%*1#&:E$$JM!#J9!$JM!$*Q\"\"ZU!&JY!%J]%$J]!'J]%"
- "#[)!#[%,#[1!#+-\"%;9#%[=$$[5!(;A0&KE#%+M!%+M!%+M!$;Q\"%+U!%;Y\"%;]\""
- "%<)!'L!#&<)%'<-!%,-!&,E$$<%\"%<M!'L1'%<A!(,U($,A!&<M!&LY&'LU!$=%!"
- "#M!\"'--#']!!%]%\"%M5!%]-\"&M-!&-9\"%]5\"$M=!%]I!%]M!%]E!%]Q!(=Q!&-U\""
- "&-]\"%]Y!%]]!(>)!%^%!'N5(%^-!%^-!(>)!&.=!&^9%'^=#&.5!&NM\"&.=!&.U!"
- "&.I!+>U!&^Q#&.]!#^]!&_)(&?)!$O1$'O)!&?1!'/=#'O5!(/5((?=#*OA!'_I!"
- "(?I#%?I!)?I!'_Q!%/]!'_Q!%@%!(?M\"'P%$(/]!(0)!$0)!(0)!\"@!!)@!!(09!"
- "(0-!/?Y)(@A!(0-!(0%!+@-),@-!)01%)@!!)P)!+@-/#`%!*?Y,'_Y!'?U$(_]+"
- "&O]!)O].)?Y'\"?Q!&OI!&OI!'_Q!)?Q!&?A!&?=!&?-!&?-!%_5$&?1!&O-\"'_)!"
- "&?5&&?!!&.]!&.I!\">]!$^Q!&.Q!&.M!'.=%'>U&&.=!$^=!\"N=\"&.9!%^-!&>5\""
- "&.5!%>-$%^!!$N%!&]]%%]Q!$MY!(=U!!-Q!&]M!%ME!)-=!&]A!&]A&&-E\"$=A$"
- "%M1!%M-!%]5\"$<]!$=%!%\\]\"%\\Q\"%LY!&\\]&'LI*%<M!%<E!%<5!'\\9#&LA\"%L=\""
- "%<=!%,1!&L)#$,-!%,%!%;]\"&<!\"&+]!%+U!$[I!$[Q$&K-$&;Q&#[9!$[E!%+A!"
- "#;=\"![=!#[=!&+5*#[)!!;-\"$K%$$*]\"#[1!!*]%\"*]\"#ZU!$*Q\"!ZI!$JQ!%:E("
- "%*E'!Z1!$J=!$J5%#Z=\"#J-$#Z%\"!:!\"#IQ%$:)!$)Y#%IY&#9U!#IQ(#)I\"#9M!"
- "$9A(#9)!#99!#I9%!Y1!$IA##IE!$)I#$)U##)M#$YU#')U&$)]#%I]*\"IY!%Z)'"
- "#J-$%:1!!*9!$*1\"#J=!%:=!\"ZE!$:5$):I+&JI-\"ZQ$$+!\"\"ZY!\"ZY!#[%!#[!!"
- "$[%!$+-\"';)'$+)\"$+1!%KI#\";9\"%;A\"#[A!\"[I!$+M!\";=*#;U\"%+U!%,!!&[M$"
- "%<!\"&,%%#\\-#(,1($,-!&,5%%LA\"\",5!%<A!%LA\"%,-!&<E%&<I!#,Q!%<Y!),Q'"
- "&<Y$&\\]\"%]%\"$=)!'-%\"'=-()M9(&M5$&M9$)-A!%M9!$N!!'-9'&]M!$MQ!%]]!"
- "%]Q!%]Y!%^!!%>!$%^%!%^-!$N%!'.)!%^-!&.9!$^I!'NE!(>E%'>A&)^I!&.I!"
- "&.U!&>I!'^Y'*.Y!&?!!'O!!$_)!&O)!(O5%'/-)*?5,&?9!'_=!*OI!!/A!)/A'"
- "(?E#&OI!&OQ!(_9%!/U!%OY('`!&&P!!(0!!(`!$(0!!(@!!(05!(0-!-0)1&01$"
- "#`1!\"@1!'01\"(01!(01!(/]!(P)\"*`%!&`-!*0-**P-,'0)\"(_U%(@%!+/]!)@!!"
- "&O]!*/U+(/Y'%/U!&OQ!'_]&&?=!'_M!%/I!#_I!&_A\"&?9!&?5!&?1!&?1!#O-!"
- "+_)(\"?%&$_!!'N]!&^U#'NU'&>I!&>M!#NI!&.E!$^E!&.A!'.A&)^9!)N1!#N9!"
- "%^)!'.-!%^%!&.%!$N!!$M]!$]M\"%]U!'MI)(-E&%M5!%]M!&MA$&-=\"$=9!%]5\""
- ")MA(']1/%M1!%M5!#M%\"&,]#%-!$&L]&$\\Q#$LA\"'<I$$<I!%<9!'LE!%\\A#%\\=#"
- "$\\I#%,1!&<1%'<)!&,)!%,%!&,!!%+Y!%;Y\"&[U(#+I%$+Q!%+]%$+M!&;E'$[I!"
- "$+=%(;%)$+5\"\"[5!&K-)$;)#&+%&$;!+$*]\"(J].'JY!#*M\"%JA%\"ZM!#ZI\"\"ZI!"
- "#JI!$*Q\"$Z=&%J5&%*1#$*5#$Z-&'*))\"Z!!%*!($Y]&$IQ&#J!$%)Q$$)M#!YI!"
- "!)1$#)9#\"Y9\"\"I9!#99!%YA%#Y5##YI\"#9U!$9Q(!)U!$9Q($)]#\"Y]\"&*%$#J!!"
- "$*5##Z-\"%J5\"#J5!#Z1\"$:I$!Z=!%:I$#JA!$*M\"\"ZQ!!JE&#[-!#;%##+!!#[!!"
- "$+%\"!;)\"%K)$%[1)([5!$[9$$[=!\"[-!%+=!%+Q!$KM##+M!$+Y!&[M%'+]!&<%%"
- "%,!!%<!\"'<)&%L-\"%+])$L5\"%\\=##,A!&<E!$LE\"&<E!'LE!(LI+'LU!$\\M#%<]!"
- "(,]#%M!!&<Y)(])!$=5!(-)'&-E\"'M-%&-=\"&M5$'M9$%]=!%=A$%]M!%]Q!(-Q!"
- "'-Y!%]Y!%]]!&>)\"(^)(%^%%'^-#$^5!%^-!(>1!&.=!)^9''>A!&.I!&.M!%.Q!"
- "*^U5'.Y$(^Y!#NY!%/%!)?!#(?-#&?-!%/1!&_1##/5$&?9!&?=!)/A!&?9!&OQ!"
- "&?E!&OM!&?9!'/Y\"&OM!&OQ!+0!!*0)0#?]$&P%!'@1#&P-!(09!&`9!(01!)`-("
- "&P1!)@A%'`-%#`5!%`5#&`5!%@%!)@A%+01!(0-!)P-!,@9&+0!!%@1!%@%!(0!!"
- "%?]!(0!!*OY&&_U!&P!!&?A!)_I*&?E!'_=!)OA.(_5&&?5!&?%!&O1('_A!&N]\""
- "*/!2\"?=!*>]''O%!&.Y!(/%('^Y\"#NQ!$N=%-.E0#NA!&>=\"(.%*&.A!&.9!'>5!"
- "&^!%&N)#%^)!&.5!%]Y!$]Y!&]Y*&-U!(-Q%%]M!%]Q!&=A($MA!(]A/%]='(-9'"
- "'-5'$]1\"%M-!%M1!(M%$&-%#&M!%'LY!&,U#%LQ!$<M!'\\Q\"%\\I#)<E$',=('\\=\""
- "%\\5#$L5#$,-!%,-!%<1!%,%!%<%\"%;]\"'L%#%,!!%+U!!;Q\"$[M$%KI'$;I\"$[A!"
- "$[A!$[)!%K-(#;-&\"+1!$;)#\"ZM(%JY)$[!%%K!!$JY!$*U\"$*U\"%ZQ\"%JU!!:A\""
- "$ZA\"%J9!&*9+#Z5\"%*1##J-!%:9$%*)'#J%!#J!'%:-(&:!)$YM##IY$$)M#\"YQ\""
- "\"Y=\"\"9%$!)9!#Y9&#Y=#$IA#\"YE\"$9M!\")E%$YM#\"I]!'YU)$:%!#J%!#Z%%\"9]\""
- "%*%+$J9!#:1##J5%#J=!#J=!#ZA\"$*E\"#JA!#JI!%+)&$JI!%J]!%K!!$;!#$[!!"
- "%[%%%K1(!+1!$[-!#[5!%;5\"$[A!'[A!$;M\"$;A\"#[M)(;Q+%+U!#;Y\"(+Y!'KU#"
- "%;]\"%+]!%;U\"%+]!%,1!%<5!&L9!&\\E##,9!%<Q!%LI\"',M)'<U$%<Q!%<U!%\\Y\""
- "%L]!']!&&,]#'-)'\"M5#,=%1(=5#)M1.#==!&]I!%MA!(=E!'-I'%-Y(%]Q!%]U!"
- "'=Y''-]!&.!'&-Y\"%^)!%^-!!^-$'>5&&N5#&.9&!.=!(NA&)>A$&.E!&.Q!(NM!"
- "'>Q!'.U%'^]\"&.U!'O!!(_%&&O-!'_-!&?9!#_9!\"?=!#_-!*_9))?I!)?E')?M'"
- "&?E!'/U#&P!!-?E'(/]!\"_]((/]!+@)/)0%%(@)!(09!)@1&+`11&01$)P1!'P5$"
- "+P90(05!&`9!'@A)(09!&`5!&`9!%P5!'05\"#`5!,P5!)01%&P-!(0%!)P)!(0%!"
- "(0!!(0-&&OU!&OU!&OU!'_I!&_I\"\"?Q!%/U!'_A!#OA!&O=!&O9!%/5!'/1$)_)*"
- ")/5!'^]\"#O!!'N]!'.]%'?%&*>E)&.Y!&.I!&NI\"&.=!\"^A#(N=!&.A!&.5!&^9$"
- "&.5!&N1#(>)+).-)%^!!%^!!(-M+'=I(#]U#%]M!%=A$)-9+)=M!&-A\"(MI-!==\""
- ")\\]%#=1!%M)!%LY!\"=!\"%,Y,',U#$L]\"%<U!'LU*&<Q%&<M!&,M$$<E!$<M!$L=#"
- "',I#'\\5,'\\1#%L1\"%<5!&L%'%,%!%,!!'+M%#;M\"\"KU#$;Q\"'+U!(KI#%;A\"%[9!"
- "$[=!%;9\"%;9&&[!.!+-!$K-$$[)!$;%##[1!#Z]!#JI!%ZU*\"J]##ZQ!#JI!#ZQ!"
- "&ZI##:A#%*1'$JA$%*=##Z=!#J-!#Z-\"#J%!&:%)$J!%$9U!#9U!\"YQ!\"YI%\"9M#"
- "#)1##91!#)=#!)9!$)=$\"IA!#YE#$9I%#9E!$)Q##IU!#IY!#J!!$9]$%J%\"$9]$"
- "#J-!#J1!%Z1##ZE\"#J=!#Z5\"#*E\"&:E!!ZI!$ZY!\":Q\"%*U'\"ZY!#*]\"$[!&#[1!"
- "$;)\"#[-!![9!%+)\"#K9#%[A$$[=!$[I!&+A&(;I&\"+M!#;M\"$+Q!%,!%%+]%%L)#"
- "%,%!'\\%#%<%\"%,)!#L-##L5#%\\9#$,9!&LA\"%LM\"#,I!$\\M,#\\M((<Q.$<Q!%\\]\""
- "%M!!(,],$M!\"&])&'])&\"==!%M-!+=-'(=A\"'=M\"$]9\"&-I\"*==&%]M!']Q)(-M!"
- "$]Q\"'MU)'.!%%^!!%^!!$N-!%^1!&.5!&.9!(NE,,.I%(.A)'NE'&NE#(.M#&.I!"
- ").U-&.Y!(_!!'>]&'O!'$^]!$_)!&?-!&?5!(/A('?E$&?=!'_=!(?I#&/E%&OI'"
- "&OM!+/Y)\"OU''OY%)/Y&&O]!(0%!'P)$(0!!.@A/&P%!*0-#&P-!$`A$&`9!'01\""
- "%@9!&`9!\"P-'&`5!(05!&`5!!0=!(`9#&`9!&`9!&`5!)`5((0-!&P!!(0)!'_U!"
- ",/]!&O]!&_]!)?]'%/U!&OQ!'?I$&OI!'_E!'_E!%/9!&?=!&?9!(_)!&?-!&?%!"
- "$^]!'/%$%/5!(^]!#NU!(NY&&.]!'O!!\">Q!&.]!&.A!&NA#&N=#&>=')^9!&.5!"
- "(.5*%>-(&>-\"&.!!\"-]!(>!,$MY!&MU$%]U!&=M#&-Q\"'MA$$MI!'M=$&-E\"&-9\""
- "%M-!*=1,$]1\"%=)%%]%''=%$$<]!(<U$%<Y!&<Y%',Q(%<Y!&L5&%\\E#%<9!&<1!"
- "%<9!'\\-(&<5!%,1!%L)\"%[Y$\"<%\"',!%%;Y\"%L)#\"+U!$;Q\"#+Y!(KE(%;I\"$[=!"
- "(+9.%;M\"&;)'#[5!#[-%#+-!%[)!#Z]!&[1!%+%\"\"ZM!%JY!&*Q'%:M'%*A&%:I("
- "#ZE\"$*5\"$Z9\"#Z5\"\"J5#\"J1!#J)!\"J)!%:%(%)Y($9M$$)]#$IM%!YQ$#9Q!#YE#"
- "#)5&\"Y)\"!Y5!$99%$9A%#YI##9A!')U\"#IY!#YQ#%)M$$)Y#$)Y#$*)#!Y]$'J)$"
- "#J)!#J5!!Z)!#J1!#J=!#*Q\"!ZI!#*9\"%JI)$:Q$\"ZQ!$*I\"!:M\"%:]'#[%!#Z]!"
- "%[)!\";)\"\";=\"$[%!#;5&%+1!%[E$'+A*\";5\"&[I($K]#&;U*%[U$#KY#\"<!\"%+U!"
- "%<!\"&<-!%,-!'<1*%L5#%,-!&,=$%<9!%<M!%L=\"%\\E#%<Q!%\\I'%LU!%<U!$<]!"
- "#]!$%<Y!%M%!'-)\"'=1#$=1!)]=)%]E!$]9\"(M=$'=E#&]E!%]M!%]Q!'MU)%]Y!"
- "#=Y!'-]!&-],%^%!#>)!%^-!%^)!)>-%&.9!'.M%*.U!%^1!$^E!&.I!&.U!%.Q!"
- "'>U!&>A!$?!#$^]&&?%!'?!&%NY#&?-!&?)'&?5!&?5!&?9!&?E!)/E!#`!!!/M!"
- "(/Q('?M$&OU!'/Y#(/]!&OU!(0!!(`!$)0%%)_]))P5!(0)!'P1$'01\")P=!&`A!"
- "(@=!(@A!+0A')`A!*@A*(PI!&`-!&`=')0=*'@1#(P5\"(@1!&P1!(0)!)@!!(P)\""
- ")`%\"(_Y$%/U!(0!!'_U!&OM!$/U\"&OQ!&?A!'_=!&?A!&?9!'O5!(O5$&?-!&?1!"
- "&O-!&?!!&.Y!%>]($_%!&?%!%NQ))>Q#(NM!&.M!$^9!'>I!$^A&(.=$(.9*%^%!"
- "%^1!&>%#(^92&>1\"%^%!(>!!(-M0+-U#(>!!%M=!%]M!&=I#%-=#$]=\"$M=!%MA!"
- "&-=\"'-A\"&-=#)M!.*-%!'-%\"'-!'\"<Q\"'\\]&%\\U\"*\\M!%LM\"'<I%#<A!!,A!%L9\""
- "%<=!',=(%<=!'L%+%L-\"'<)!%L)#$<!\"'\\!-%+M!%[I!%+Q%$;M\"$[I$&;M'&;A\""
- "%K=($[9!%+=\"#[=!%[1%$*Y\"$+5%%;!'$+!\"\"J]$&JU%$JU$#JM!$ZQ%%:I(\"*E\""
- "#JA!\"Z=!\"Z=!$JA!#ZI!#J)!\"J)!#J)!$*)##Y]\"$I]&$)Y#$IQ,%IM&#YM#$I5&"
- "#)1#\"I5!$I9#$IM)$91%\")E\"$9Q!#YQ#$*-#'9Q($YU&%IQ'!)]!$J!%$Y]##J)!"
- "$Z5\"#Z1\"':I)#J9!$J9%$ZA\"#*5\"!*M!#JI!$*U\"#ZQ!%;)'#J]$&J]!#*Y\"':Y)"
- "#[!!$;=\"$+=!%+-\"&K1$%;1#&;5'&+A&([I-$;I\"%+Q%%KI(%;U\"%[M%',!)#+Q!"
- "$,)!'\\9'%,-!(<1*%L1#$,1!&<9%%<A!%<A!%\\9#%<I!$LQ\"%<U!%<U!&LY!&LU!"
- "&=))%M%!&-1'%M)!%M)!$M1!&-A\"%M5!%]I!&-A\"'-E!%M9!(MU-%]]!(=Y&%-Y\""
- "%]Q!#=M!%^!!&.5!%^1!(.1*&>5\"&.5!&.9!&.I!&.Q!&NI().U\"&>E!(N=!&.Y!"
- ")O!*(N]+&^]#&.Y!\"?)!$_!!'O1&&?5!&O)!&?9!'_9!&O=!(OE$)?Q!%/M&&OM!"
- "*OQ!&OU!(/Q!%/]!'?]#)/]%(0!!(09!-`9'*@1+(`5#'P1$)P1-%@=!(@=!(@=!"
- "&`A!'`I%(@Q!(@E!*PM*)@E%&`A!)`Q!(@A!&`Y!&`=!'PA*(01!)`%)(01!(`=#"
- "(0)!'_Y!#_Q!)/Y&#_I!(?]('_Y&&OM!#_M!(?M\"&?A!(_=&#/9)&?9!&?5!&?1&"
- "'O-!%/-!&?%!'NY'&NY\"*?!!*>U\"'.U%$^E!&.I!(.E)'>A!&.A!$N1!(>9+(^-#"
- "#N!!$N-!'.)!(>!!&^!%$M]!&=I#%]Y!%^!!$=U%%]M!%]I!*]Q!'=E(\"])$$=5!"
- "&-9\"%]1!&LY!$M9!'M%%%=%%&=!$%M%!&M!%%<I!%<Q!%LM\"%LI\"%<U!%LI!'\\=("
- ")L9!&<1%$<1!%L1#&<-&&<%%$,%!%+]!&+Y!#+Y!$KQ#%;]!#[A!%[E$%+M!$[1%"
- "%;9\"'+1*'+E*#;A\"$;-\"\"[-!%K1$#[-!$+%\"%+)&#ZY!\"ZU!%*M'$*]\"&:M%$*A#"
- "!*9!$:E#%*=&\"Z=!$:1##Z1\"#J-!#J)!#J%!#Z!\"$9]$&YY,%)Y!%IE'$IM\"#IE!"
- "#)-##)9#\"I9$$I=#$)A$$I9&$IA#%)I!%IQ*$)Y'\"IE$%IY)%Y]$#J)!&*%!&*-$"
- "#Z-\"%*-#$Z=\"$:=$$ZM\"#ZI\"#ZE%\"ZQ!$:I##*M,$JY!%*Q\"$JY!&:Y$$+!\"#[!!"
- "$:]#([-.$+1!#[%!%KE(%[=!$;5\"&[-%#[E!%;I\"$+M!!+Q!&[U($+M!#K]##<!\""
- "$,%!%,)!%,-!%,1!%<A!(<5/%L5#%\\9#$\\A#(<E)',I#$<M!&<Q$$<Y!%<Y!#\\U#"
- "%M-!&-%$'M5*&M)!%])\"&-1#%]1!)M92$MM!%M9!&]E!%-Q('-Y!$MQ!%]Y!#=I!"
- "'-Y!'.%%&.=!%^%!).).&.1!&^=$$^5!'N='%^1!).I\"&.I!&.=!$^M!$^U!(^U'"
- ").Y!)^Y0(?-#*>]'&?5!(_)!'O)'&?!!%O-#&?9!(?9*%/E&)OE\"'_E!(?I\"'_=!"
- "%/U!(`%*%/]!+`)%&P)!(0)!+P96,@)!+0-!(0--'P5$)`9.'05\",P=!(@=!(`I\""
- "+@E')`A!&`Q!+@A!)0I$#0U#&`9!(@E!(@I!+01!&`9!&`A!#`5!+`%2(0-!(/]!"
- "(0)!)P%!&P%!(/]!#_]!#`%!$?Q#&OI!&?A!'_E!*?9&(_I%&OA!'O5&*?5!'/1$"
- "&?-!).U\"&?%!'/!$#N]!%NY.&.]&$^Q!'>Q&#NI!&.A!'>E!&>A!&^1%&.5!'>9!"
- "%^%!%^-!$>)%%.)\").!%'^%*)M]!%]I!%-U#&]M!&]M%']I$&MQ$&]A&*-=%$]9\""
- "%M9+(-%,$]1\"']%!&]-&#\\]#&\\Q\"$\\E#'\\Y+',U#&<Y$#LM#'L1&*<U##,9!)<A%"
- ",LA*#,1!\",1!$<-\"%,1!';Y&%<%\"&,!!%;]!$;Y\"&[U$%+Y!!+M%$[I$%[M%%[A$"
- "%+9\"(+A*$+9%&+=\"#[-!%[-&#+!\"\"[)!$[-%#Z](#:A#\"[)!#Z]!$ZM\"$*A\"%JQ!"
- "$JE$&:A($JA!&:5%&Z9#$J%\"$:1!#Z%\"#J%!&9M&$)M$$)]##9U!$)M$&)M%$9U$"
- "\"I1!\")5\"&)9\"\"I9!#)A)%YE$#9Q!$9E$$YM##Y]\"$YA'%Z%'$Y]#%:%$#Z%%\"J-!"
- "!*9!!Z)!#Z5\"%:!,#J=!$K!$$JI$#ZQ!#J5!!*Q!#ZI\"$*Q\"$*]\"&JU!#ZY!%;9&"
- "#[5!%K%$#+5!$;E\"#+A!%+A&&+A&$[I!%;E\"\";I\"$+M!$;I\"&KM'$KY'&,%!',!!"
- "%,)!#,)!&,-$$L1\"&<5!'<5!#\\-,)<1!#<-!%LM\"(LA!',M-+<Q)&<Y%%LI\"%LI\""
- "%]9!'M%%&])!'=-)&L]!%]1!%]M!#M5!']=+%]E!(-E!&-E\"']U)&]M!%]U!'.%!"
- "%]]!&.!!(-Q!).%*'.)%&N=#&^A$#NE!(N5&&.9!&>A!&.E!'>A!&.M&'^U($^A!"
- "$^U!&.]!$>]$&.Y!&?=!&?)!&O-!'O9&)/A&'O1!&?E!&?A!+?=+&_I\"&OM!#OE!"
- "&P!!%_U)'O]%)P)'#`%!(0%!&P%!+@-\"&P1!#`1!,P5!(`1#(@=!(@A!+@]!(`A#"
- "(@E!*PM$)`M!&`E!%@M&(@I!'P9*'0E((@E!*PE+&`9!*@9#%@A!,@-!(P-)(0-!"
- "+P)1,@)!(0!!'_]&(/E!&OM!%_U)&_M\"&?A!'_Q&'_E!&_A\"&O=!'O=&#O5!%/5!"
- "\"?9!#O!!)_%%*O-!(^U!$_!!&.Q!%>Q($^=!&.E!$^Y!(NE!&N-$&.A!&.I!'.5&"
- "$N%!%^)!)>-*)>%0(-U+&N!$%^%!%^!!'=Q\"#]Q##=M!%]I!'=A#&M=%'-5'$=5!"
- "%M5+%M1!&=-$$=-!%])\"$=5!'<])&])&%M!!$<U!&\\Q\"%\\U\"!LI#),M,%<Q!&L)\""
- "%<9!&,)%(<5*$L=#&\\-,%<!\"&L%\"#,%!$+Q!%L1\"%+U!%[I!#[E!%;I\"%KI#%[A$"
- "#K5'$[=!%[I$$+5\"$+9\"%*Q'#;)\"#[!!&K!,%Z]%$:Y#%ZU\"$*Q\"&ZQ\"#:I##ZE\""
- "#ZQ!#Z9!$Z=&#ZA\"$J5!%J%&#Z-\"!*)$%:))#Z!\"%)]!#9]'%9U)%)Q$#9U!\"IM!"
- "\")1%#95!$)9'\"I5!#9A!%IA&'YI&$)E!%)I!#II!#YQ#$9Y$#Z)\"#J%!$Z%##J)!"
- "#J-%!Z1!$J1%!*1!#*5\"#ZA\"&:=%#JI!$*A&$:M$%ZQ\"&:U$%K!!$ZY%$;!\"(K1*"
- "![)!&[5-'+1\"&[5!&[9!%[=!&[A)$[1!&+E%&[Q)#+Q!&+M!%+Y!%;Q\"&,)!);Y+"
- "#,)!$\\)#%\\!#&,)%%<A!&<1!)<A)%<=!%\\9#$\\E#(LA+(L]%$<Q!%LU!$<Q)%<Y!"
- "&]%'&-%#&M)!%M-!(]1%)]13#==!'=5(&-9#'=A##=E!$MI!%]M!#=M!'-U!%ME!"
- "(.!%&N!)(N%,'.)!'.)!&>1\"*^-!$^5!&.I!&.=!&.9!*.I-#^I\"&.M!'>Q!).U\""
- "&.]!'O!')/!-&.Q!'/9##O-!'O-!'O1&&.]!'_9!&?A!&?E!(?M\"&OM!$/Y\"%OQ\""
- "&P-!%/9!%/Y&&_]!*@!$(0-!(0%!)P9!(01!&`9!(09&)`9(+P5*(09!)`I!(@I!"
- "&`M!)`E!*0]!'@Y\",@M%(@I!%@M!(@A!#`9!(@Q!+@=/&`M!(`A#&`9!(@1!(0-!"
- "*0)))@%&%/]!'_Q!+?Y#)OU!&OU!&OQ!&_M\"&OE!&OE!&?A!)/='$OE$*/1+)/9!"
- "&?5!$O1%'/%$)/%!&?!!$^]!&?)!#O!!%.U!&.Q!$^E!).I.$^A!&N1#&N1$%N1$"
- "&.%!$^I!&.)!&.9!'.%!'.!%%]Q!$MU!&-U!%]U!'=M\"'-Y!)-9&(-A!'=5##M9\""
- "%])\"&M1%#=-!&]-!%M)!%]%\"%]!\"%M!!&\\Y!#<U!&LY!%<I!&,Y(&<E!%L9\"$,=!"
- "$<=!'\\E,(L5/%<1&%<5!',))%;]\"%L)\"&[]$%KU#&KQ#$+Y!$[M$%[I!'+=\"&;Q\""
- "'K=(%;I\"%;9\"%;9'&;9'$+5\"#[1!%K%)$K%$%Z]%$*]\"\"ZU!#ZQ!#Z]!#JE!$ZU%"
- "!*E!$*A\"&*1'#ZA!$*-#$J1!\"J)!#J-%&*)+$J%%$9]!$)Y#\"Z)\"#9Q!\")M\"%)M!"
- "!Y)!%Y5(!)9!\"I1!%IY-#9E$%)I%$9M%#9Q!#YM#$YU'\"IE!\")Y\"#J)!%Y]+#J)!"
- "$:-#\"Z5!$:9#&*1!#ZI\"#ZA!#:E#$*U\"#JM!#ZQ!$:Q#!*]!$ZY%%J]!!+!!#;!\""
- "&+-*%;-##;9\"!K5#'+=!%+9\"#[A$([9!#[E!&;I&';M\"$+M!%KM#%+Y!',9)%+Y!"
- "$\\1($,%!$<-!&,-%%L5\"$<-\"&<M!)L=&&<I%%<A!',M)%<E!%<Q!%]%\"',I(%M!!"
- "%LI\"',M)#]!'%-%$%M5!']9%%M5!&]5!&]9&$MQ*&-E\"&-U!$MU%%]U!&-Q\"%]Y!"
- "%]M!'^1#%^%!#=]!%^)!(>)+(>A%&.5!%.A!'>5!'>9&#NA!*>I\"&.M!$^I!(^U!"
- "(_%!&?!!)/!($_%+'O%'&?9!&_1\")/5!'?-%&?1!\"?=!&?9!'_E!'OM%&OM!&OQ!"
- ")_Y\"&OY!&_]!&P)!(0!!*_Y!%@)!\"@-!(0-!%@5!&`9!&`I!,0E$)PI&&`A!(@E!"
- "(@M!)0I$+0Q,(@]!&`Q!+`Q\"(@]!*@I)(@M!&09#&`M!+PM/(05!(P1)(01!(@-!"
- ".P)$'_Y!(/]!&OQ!&OY!(?]/&OQ!&OQ!'_M!)_E/+_E,&?A!&?=!&?5!'O!!&_5#"
- ")/-!'/)$(/%((_!!&O%\"&?!!'>Q!&.I!&^M)&.U!'>E&'>M!&.A!&.I!'NA'&>5\""
- "(N1,'.-*(>-!*>%*,.%-%]Q!%^!!'=U\"'-U!(-U*(=Y!'=I()=E1$MA!'-=!&M9$"
- "'M5$$]A\"&]1&&M-!&]-!'M%%\"-%!'-%''LY%),Q'#,M!&,I#%\\A#$LA\"&,I$&\\9("
- "%L=\"%\\=#%<5!%,1!$,5!%+Q!%,)!%<!\"%;]\"&;M\"%;Q'#KE#$+U!%KU#';Q/\"[A!"
- "%[E!#;9\"%;9+%+1&$[=!$+1\"$*]\"$+%&%;!#\"ZY!#ZY!$K)$#ZA\"#JQ$#JI!#ZU!"
- "\"ZE!$*E\"%*5'\"*5!#Z=\"$J1%\"J1##Z-\"\"J-!$9Y$#Y]\"#9U!%:-)#YQ\"$Z!\"%Y=$"
- "$))'&)9#\"I%!\"I5!$IM\"$I=#$IE\"$)I!#II$$IU%\"IU$#9Q!$*!#\"J)!$:%!#J%!"
- "#Z-\"#Z)\"#J!!#J=!#ZA\"%J=)#JE!':I!\"Z=!%:Y'#ZM%%*Y&&;!+&;)##[%!$[1%"
- "%K)(%+5\"#;)\"(;5#\"[=$$KM#%[A%#[5!&KA##[9!%;I&#+U!%\\!#%<!\"%KY##L)#"
- "%,%!&+]))\\-(&<1!&LA\"',5)\",9!%\\A#'L1\"%LA\"%LI\"%<M!%LA\"),Q'%M%!%M!!"
- "%M1!\",Y!&M)!$]-'%])\"$]9\"%M5!%=9)%M9!%MA!&=E#&-A#%]Q!%]Q!&MY$)MY1"
- "&^%%'-Q''>9!%^)!'-]!%^!!&>1\"&.5!&N9#&>-\"#N=!&.=!%>=#(NQ,'^Q(#NU!"
- "$.Y#$^]!&?!!&O)\")O!)(/)(&?-!%/9!&?=!&?9!&?5!$_5*+?5+&OI!*_M(*@!%"
- "\"?U!&OY!&P)!&`-!/0!!)P%!(0%!&P-!(/]!(`=#(`9#%@=!(@I!(@E!,@U+&`U!"
- "*0U!*`Q+(@Q!)0Y#)`Q!+@I!/`Q!(`E\"(@I!)@E%*PY*(P-\"&`9!%@9!(01!(`-$"
- ")?]&(@)!(O]#&P-!&P%!&P%!&O]!&?U%&/E%'_M!'_E!&/A%#O9!*OA!)?=('O1!"
- ")_-%%/1!'_1''?!&+O!!(/%\"%^I%\">Q!$^U!'>E!$^I!%.E\"'NA'$^=!&.=!#>1!"
- "$^-!&^-%%^-!%^%!#>%!$N!!%]]!(>-!%]U!'-Q&(-M!%=I$'ME$(-=!'-5'$=-%"
- "%M-!&=5$%M1!%])\"&M-!&=)$',U##,U!*\\Y*$<Y!&LQ!%LE\"$<I!%<E!#LE\"%<=&"
- "$,5!!L9#%<1!$,9!&<)%%L)\"%;U\"%L)\")<%.'KY#%KU#$+Q!#[=!&[I!&[I!#[I!"
- "#[=!$[=!&K9(#[5!#K1'$;-\"\"[)!#+%\"\";!&#[1!$Z]%#ZU!$JU!#JI!#ZU!%:A#"
- "%*I'#:E#$*5##J%!#J=!#J1!#Z-\"#J9!\"J-!#J%!%9U\"$*%#\"9M#%IQ##YM##IE$"
- "\"Y1\"\"II!#I1%\"I5!\"YE\"%)A(#)I#$IM&#II!%)Q!'YY%#IY!$YY##IY!$IQ&#Z)%"
- "$J1%#Z9!%*9&#Z5%#J=!\"ZE!%:E$$JM!#JI!%:Q'#Z]!%JM!%:Y'$*]\"$[%!$;%\""
- "'K))'+-\"%K1($+1!%+A!%[=!%+=\"$[E!$[=!(;E/\"[9!$+Y!#+U!&[I$&L)\"%<%\""
- "#,%!&L-\"%,)!%\\A(&<9!&<9!#<5\"%L=\"#,E!#,I!'\\A'$<M!),M\"%\\U\"%\\Y##,Y!"
- "$=!!%M%!'-1\")-9+%]-\")M5#$=9!'-9'%]I!(-=!%ME!&]A!'MM(&]Q%&]Q!!]U$"
- "#-].#>!*'.-!&^5$(>)!$^1&(.1*'.-!&^5%'>A!&.A!'^E\"&.A!&.Q!'>U!'NU,"
- "&.Y!&?!!(?!)&?)!%/1'#O)!#_1!\"?-!'/!$&?9!%/=!&?E!%/A!&OI!'OM%)OI)"
- "#_U!'O]%)?]!$P%#(/]!(0-!(0)!(05!+01!&`5!,P9!%@5!&`A!(PI!*0I\"(@M!"
- ")PQ&(@U!+@Y!+P]!(@]!)PY%-@]\")`M!)`E')`I!&`=!%@A!%@9!#`9!)01$(01!"
- "(P)\")P%!(0!!(/]!+@!0&OY!&OU!*OM!#OE!)_Q)&OM!'_=!'/=#'_9!+O1!\"?1!"
- "(>]*)?)()_-1'/9$&?%!&_!)&.Y!'?)%&NY\"&.M!)^E!$^I!'^=)(N5!'>=!&.=!"
- "%N5%&.5!%^!!%N5%'.%!%^!!%]]!#-Y$)-=!'-M&#]M(&=E$&]E&&M=%'-E'%M9!"
- "&M%&&M5*%M%!']-!%M)!%<U!&L]%&L]&%<]!$<Q!&\\M#%\\I#&\\I'&<E%$\\A#(LI!"
- "&<9%$L9#%<5!%<5!%<=!$,5!#<%\"%,!!%[U$#+U!%+Q!(,!!$[I!&[E%$[E!#[E!"
- "$[5!#;9\"&[5!#[9$&[1%';-/$;1&$J]!#[!!#:]##Z]!$J]!#Z]!$ZM\"%:I($JE%"
- "$:E##Z=\"#JM!%*5#$:5##JI!%J-*#Y]\"$J-%\"J!##9M!&)U,%9A&!YQ!$II&#)1#"
- "\"I5!\"95#$Y=$\"I)!#9A!#9E!$9=%\"YM\"$YU'$IQ%')U%$9Y!$9]$$*!##J%!#J5!"
- "$Z9&#J9!#J5!#JI!#ZA!$*A\"&:E!$*Q\"#JI!%ZM\"%ZQ*'*U,%:U$\"[%!#ZY!%+)\""
- "$;%##[5!$+1!\"[1!%[=%(K=(';A,&[E%&+E&'+I%$;M\"%KQ#$,!!$KY#%;Q\"&;]\""
- "$,)!$<)\"%,)!'<9!$\\M#%L1#(,=-$<=&%<A!$L9\"%LM!#<=&#,M!%\\U#'LA!%L]*"
- "&M!&%M%!%]5\"$=5!%M-!&-9#%M5!%]I!%M=!%=A$%]I!'=9(%]M!%]U!'.!!%]Y!"
- "(M]-&]Q!%^!!'.)!&>1\"&>!\"%^-!(^M'(.9$'>A!'N='*N5+&.I!'NM''>Q!%^U%"
- "+>Y-'O!!&O-\"%_!$(/%#(_!!'/1$(/1\"&?9!$?1#&OI!)_A#'_M!(_I%&OM!&P!!"
- "(OY*&P-!%?]'*_]!(0)!%0!!,@)!)@5&%@-!(05!%@=!&`E!(09!(@E!'@I\")`A!"
- "(@I!)`U!&`U!*@E)(@M!.@]!*`]+(@M!/P=!&`M!,`A!(@=!)P=!&`5!+05!)P-'"
- "(P)\"*P%,*`!-&P!!&O]!&OY!%OU\"&?E!&OM!*OM!(_Q$./A%&OA!&?9!&?9!&?1!"
- "&?1!&O)!*O)($_!!)?%.&>]!'NY!&>U'&.Q!&^Q$&.I!(.U##N=!$^=!&.A!(N1'"
- "#NA!%^1!%^-!$MY!(=Y!%^!!%]]!%-Y\")=Q!(=M'%ME!)=I!&M=$%MA!&-=#(=9,"
- "&]5&%]5!+])4*-1%%]-\")=%\"$=!!&\\Y!%<U!&-)#'LQ!(\\U!#,E!&,E#%<E!&<=!"
- "#<=!$,5!$,5!'\\1#%L-#&,%%$<%\"&,!!&<!!%+Y!%+U!$;]\"%+1&#;A\"\"[E!(+=!"
- "$;M\"$[=!&+9&&[%&$[1$\"[-!#[%!%K%$$*U\"#ZY!$*Y\"#ZQ!$:M$%:I$\"Z5!#ZE\""
- "$JE!#ZA\"\"Z=!#Z9\"\"ZA!$J-%#Z-\"$:%$&J%+\"I]#$)Y#&9])#IM!#IY!'IY$#IE\""
- "!Y!!\")9\"$)1'$)E$$9I%#YE\"%IE##YA\"#9U!$)Y#\"I]!%)Y$#:1#%Z1*$*%##J)!"
- "$J)\"#J1!$J=!\"Z9!%:5!#J=!%*I\"':Q$!*M!#JE!%ZE*$:]#&[!*\"ZU!#Z]!'+1+"
- "$[-!$+-!#+5!#[5!%K9(%;=\"&KA#%[A!$[1!%;I&%+Y!';E+#KY+%+U!$+]!&,!%"
- "$<1!%K]#\"L-'$<-\"%<9!&<Q$%<=!%LE\"%<A!'LE&&<Q$&,M#%LM\"%<M!#,Y!&L]&"
- "&M%!&=%$)])%&]-&&M-%%]5\"(=9,#=9%&]A!(-A+%M=!%^)!&=M#&-U!&>!#(=Y!"
- "&MU%%]M!\">5!'>)!&^-%%^)!&.9!'.)!&.9!'^=#$^=!'>E&'>I!&.A!'.U*&N]\""
- "%O!)&.]!%O-#+O%!&.Q!'O%!&_5\"&?-!(O5*%/-!&?=!&?9!#OE!&OM!&OM!)?Q'"
- ")?Y!&OY!*@)+'?Y$&OY!&OQ!(/]!(P-\"&`5!&`5!%`)#&`A!(@A!(@I!&`E!(@I!"
- "(@A!(@Q!*0U!)0M#(@E!)`M!&`Q!%@Q!(@E!)P5')0E$&`=!,@1-&`5!#`!!(@)("
- "(0!!(0%!&OY!(P))%@)!&P!!&OM!&O]!\"_U\"%/A!(/M!&OA!%/=!'_9'*O5-%/1!"
- "&?)!(_-&$_%!&?%!&.Y!&>Y!&?%!&?!!$^Q!)>M.#^M\"&.M!&.=!$^=!%N=$&.5!"
- "&.9!'^%)(.-%%>1#%^!!)M]!%]Y!$M]!&]]%%]U!%]Y!'-A\"%ME!$ME!#=9!$=1!"
- "%,]#&M5*']5!#,]!%M1!&-!$&=%$&,]#$<Y!'\\I+',]#%<Q!)<I$&<M!',=((\\=("
- "%<9!%<=!%,-!&<9%%L5#\",)!#\\5#%<%!'K]+$+Y!&KQ($;I\"%+E)%+M!'[I$&KA("
- "(+A&&;U\"$[9!$;5'$+1!$+-\"%K1$$[%%#[!!$+)\"#JM!%:U$$Z=\"$*U\"#ZA\"#JE!"
- "#JE!%ZA\"$*=)%*A&#J=!$:)!#J-!#*5&$J%%%Z!*&9U'$9Y!#IU!#IQ!#YI#\"IM!"
- "#)1#$)5'#)9#\"I!!#9A!#)=&$9I$$)M##9M!#9U!#J!!#YY\"\"9Y##IY!$Z1&#Z1\""
- "#J-!$*1##*9\"#Z9!#*9\"#ZQ!%JE%#JM!%Z5##JE!\"ZU!#ZU!\"ZY!#JQ$$[!%\";%&"
- "$[)!&[-!%[1!$+5%&KE$$[=!'KA,&;A&*;M,(;I\"$KU#!+Q!%+M!%+Y!$+Y!%KY#"
- "%,%!$,)!%,1!%L1\"%,)!%<9!&,9$&<=&)<A)%<E%%<]!&,Q#'\\Q\"'\\]!'LY&&]!'"
- "$M!\"%M%!'\\Y!%--(']1!$=1!'=9(%M5!$M=!%MA!&=A$(MI#%]M!&]Q!#=Q!%]U!"
- "&>!\"$^)!*>!%%^)!&.=!'.-!'.-!'>E!'>=!%^1!&.=!'^I-'.I%'.Q%#NU!&.U!"
- "&^Y#*.]1$_!!&O1!&.Y!(_%'&O-\")/-!&?5!!/5!&?A!'?9*'_E!%/I!&OM!)?Q-"
- "'?M*&?E!&/M%%/Q!(0)!(`)$,@-!)P)!'P1$%`1\"&`9!&`I!(@=!(PA!+0I-(@E!"
- ")`M!(@M!+@Q'(@Q!(PQ!(@Q!(@M!&`=!)PQ&#`9!$@9\"&`=!(09!%@5!&P1!\"`-\""
- "(0%!(0%!(`%$&OY!&OM!&OU!*/U+&OQ!&O]!&?=!)?E(&?A!&?E!#/9#%O5#&?)!"
- "'_-'%/-!&.Y!\"NY!$_!!,/%#%NY#&.U!#^Q!&.I!).A($^E!%.Q!(NA,&N9#'>=!"
- "(^!)$N!!%^)!%^1!&-U!%]Y!%^!!%]U!'-Q'(MQ\"%]I!&]Q!%ME!%M=%&]A!*-=/"
- "&=5$(M1.%]5\"&=-$%M)!%]%\"%<U!%\\Y#$LU\"&<Q%%\\U\"&LQ&%<I!%LE\"%<=!'<=)"
- "&,5(%LA\"$L9\"&\\1#%\\-#$L)'%<%\"#<)\"&;]\"&+M%\"+]!$;Q\"#[M(%;E\"&[=!%[A$"
- "(;U'%[=!$[9!%+9&\"[1!#[-!&;)#%+!\"#[!!$Z]%%JI!%*I#'ZQ+&:](#JI!#*I)"
- "\"ZE!$:A($JA!$Z9\"$*5##Z5\"#Z-\"\"J%!#:)'\"J)!$9]$#9I!#I]!&9Q&#YM#&9I-"
- "$99(#Y)#\"I9!#99!#)5&#9I!%YI+%)U$#IY!$J!%%*!!&:)\"$)Q$\"J-!$Z5)#*1\""
- "&*-$#J=!#J5!!Z9!\"Z=!$JA!$JQ!$ZE\"#JI!#ZM!%[!%$*Y\"%ZY%&J]$#[%!#[%!"
- "#[%!#ZY!$*]\"#[)!#K9$&;5#$[=!%KA#&KE,#;U\"$;I\"$[]$&KU'&+Y%&\\%#%\\%$"
- "&<1!&,)!%,-!&\\=##LA\"'<=!%<A!$,=!%LA\"%LE\"&<U$#\\I#$<Y!%<U!&\\U&&M%&"
- "%<U!#=%!%]1!#]%#$=-!'-5'&-1#&-A\"'-A'$ME!&]E!(-E!$MM*(-U!#=Y!%]Q!"
- "%]U!'.!!$N)!#>-!$^5!%^%!'>-&$N-!'^5)%^=&'>9!$^E!#^I\"#NM!(NE!+^U4"
- "*NI$(.Q#$>Y$&^Q##O!!(_-,&?-!#O-!%/-'&?A!&?=!#OE!'_I!'/I#'OU%%/A!"
- "(/M(&OU!&OY!'_U!(0%!(P)\"(@)!-0)2)P9&(01!'`5%(@1'&`9!)P9!(@M!(@=!"
- "(@U!)`I!*0M((`M\"*@I#(@E!&`E!)`E'#`M!,0A2+@1)'@5#&`A!)@!!)P1'(0-!"
- "'`)&+/U\"&P!!'P-$)?]!*_M4'_M!&OM!'OE&)?M-(_9%&OA!'_9!%/1!&?)!)/A!"
- "&?5!&?)!\"?)!#O%!#N]!&?!!&.Y!&^M$&.Q!'>M+&^E$'.E%&.9!'>=!&^9$$^5!"
- "%^-!*^)!'>)!\"-]!&^5$'.!!(=]!'-Q&%]M!$MI!&]=!#=I!)-E+#]I\"'=E\"%M=!"
- "$=9!(=9\"%]!\"%M%!']-!&M)!&]!\"%M!!'<]$(,Y#$<Q!'\\A#$LA\"$,A!%<=!&LI&"
- "%,1!$<E!&<5%&L1\"#,1!%+]!&\\%#%+Y!$;]\"%+Y!%;I\"$+U%&;Y\"%[A%&;E&$[9!"
- "%[-!%;A\"';A'&[-!#[5!$[%!\";%\"$[%!!ZY!#+!\"$*]\"%JM!%*Q&%JE!#JM!%*E'"
- "&*9+'JM\"$J5!#Z9\"#J5!#J1!#Z%\"#IQ!#Z%\"$:!!#9M!%)]!%)Y'$)]#$9M!#9M!"
- "#)1#\"I5!#YQ#&)A(#YI#%Y9%$YM'#YM)#Y=##IM!#)U0\"9]#$)U#!Y]!%:1($:!!"
- "%JA\"#J1!$J=%#J9!#*E\"\"ZA!#JE!$*E\"%JQ!#ZM!%ZQ\"!JY##ZY!#Z]!!;%\"$+-\""
- "#[5!%[-)#[A!$[5$$;=\"%;=*$[E$&[A!%+M!%;I\"$+M!&+Q%%+Q!#KU#([]-&,!."
- "$\\!$%L)\"&<-!%,-!%<=!)<!!%<5!\"<M\"&<A%%<I!&<M!\"-!!&<Q%%\\Y''=%($<]!"
- "%M5!'=)(!-!!&M)!(-1,$=1!%M9!%]1\"$==$%M=!&=U#$MM!&]M!#=E!'-U!&]]%"
- "#=M!'=]!'.!!%]Y!'=Y\"&.5!)N-!'.)%&.9!&^=$(>A&&NM\"&NI\"$^Y!$^Q!&.U!"
- "$NU%(^Y!'O%'&?!!#O%!&?)!'O5!*O-(+_9!%/1!%/I!#?A%)OA\"&/=%'?M$&_M\""
- "&OU!&_Y!&P1!&`%!(/]!)@)&)P%!)0)%(0)!)P1!&`5!%@I!)`A!)`=')@5%(@E!"
- "(@E!(PI!(@U!(@I!(@A'*0=)(01!(@E!'P5$(09!%@A!'09!&P1!(@1((P-\")01$"
- "(0-!,@%!)P!'&O]!%OI\"&OU!,OQ*&OM!%/I!)?I'&?=&'_I!*O=3&O=!)/5!&_1#"
- "$_)!(/)#%/1!'/!$&.Q!'NY!$^U!'>U!%^Q%&.M!(>M+'.A%&.I!'.9&'>9!$^=!"
- "%^-!#N=!%]]!(>)!'-Y!(N!-%]]!%]Y!(=Y,*MQ,&MY$&-I\"$-A$&]I!&]5&%M9!"
- "'M5*#]-#&M5$)\\Y!(=5''-)\"&=1.%<]!&\\Y+&LU!(,U(*-!!$\\I#)<E.%<U!%LA\""
- "\",=!(L-!#L-'%,1%',1$)\\-#\";Y\"',!!%+Y!&;Q\"$+]!\"+Q!%;M&%;I\"&;E\"!K9#"
- "%;A\"%K=$\"[=!%[5!#[5!%;1'';E+$+)!%+1!#Z]!!ZY!#ZU!#ZY!#JM!\":I#$Z=%"
- "#ZY!$*A&%:=!%Z5'$J9%#J1!#J%!#*5\"$*%#!Z5!$:!'$)Y#%IU##)Q#$IM%#IY!"
- "\"91#!Y5!!Y9'#9E!$IE%%IE##II!#9I!#IU!#YY\"$)U#$9Y!$J%%!J!#$IQ\"!Z)!"
- "#:-#$J1!%Z5&%J9\"$J9!%ZA\"#Z=%\"ZI!#JE!$JE!$*Q\"$*U\"![!!$[!%\"ZQ!#+%\""
- "$+)!#[5!#K1$#+-\"&+A\"%;1\"&+A\"&+=\"$[Q%&+I!';U'%[E)%;]\"%;Y'%K]#&,!!"
- "\",)!&<%&'<1!%,-!%<5!&L5&$LA\"$\\1#%<A!&<E%&LE&'\\M&$<E!%LU!%\\Q#&M-%"
- "%]-\"%<Y!%]%\"'M!*&=-$$-1$%M5!'M9$%MA!%]Q!(-M!&M])%MA!&=U-%]M!&N))"
- "\".!!'MY#'>!\"%^%!%^)!%>-#'>5!&.5!%^-!(NA!'>9!'>I!%.I!&.M!'^U'&.Q!"
- "'_!('.]*(^],$^U!(O-*&_=\"&O-\"&?1!#OA!(_1+)/A!&?9!#OA!'_I!&OU!&OY!"
- "'_Q!&OM!#_Y!&P%!&OQ!)/Y%(0!!(01!'@1#(01!(P%\"%@-!'0=!%@=!(09!$@E\""
- "&`5!(@E!(@E!*PE+(@A!)`M!(@=!(@A'\"@A!&`=!'@=#+05!)P-!(05!(0-!)@%&"
- "&OU!/0!!)0%%%/]!&OU!&OU!(_U%#_]!)?I!)/A!*_5)&_Q\"'_9!&O5!'?5%&/-%"
- "'O5!'?)%'O1!&?%!&.M!&.A!&.Q!#^Q!$^M!$^M!#NI!&>M!'>E!&.=!&>=\"(>Q%"
- "&.)!%^)!%^%!'.-!%^!!'N%()M]!%]Y!%]Q!&-U!%MA!&]E!']5!%MA!'M-*)==!"
- "%]1\"%M-!$]1\"%M%!#,Y!&-%#']-*(,Y,%M!!%\\U#%LM!#<M!%LE!%<A!%LA\")<=$"
- "!L9#'L5'%<1!&L1&'L1+%,%!),)%&L!##\\)#%+M!&KU#$KQ#\"+M!$[I!$[I$$[9!"
- "%+A!%[1%%[A)%+9\"![=!%[))#[)!%;%##Z]!$JY$$:Q#$:U#\":M\"$*M\"\"ZY!$*M\""
- "#J=!$:I##:A##Z5\"\":5\"#J-!\"J-!#JA!!Z%!$*!#\"IU!#)U\"!YY!#)M##9M!$)=$"
- "$)1$$)1'%9=%#I=\"#IA!#9=!#9A!#YI\"\"YM!#9A!\"II$#IQ!%:%$#Y]\"%J-&$:1!"
- "$:%!#J=!'J1'$Z9\"#ZQ!$:1#%*M'&*E##ZM!$:9##ZY!&;!#%J]!#[!!$*]\"$[%)"
- "&[%&$+%\"\";1\"$+A!'[-&$K=$$[1!%+9!$KE#$[I!#+M!$;Q\"'+M!#KU#&<!&%,)!"
- "&<1!%\\)$$,-!'<!&#,!!'\\5($<-&$\\=#%<A!\",M!&<I!$\\=#(LQ!$<U!%LY&%-!$"
- "(=!)$]-\"#=!!&,]#%=%*%M1!%]-\"%M5!&]A%$=9!&]A!'=A(#=E!%]Q!&MU$#=M!"
- "&]Y%$N!!%]Y!$N%!(N5&&.9!&>1\"'N1()^91&.E!)>E$&.E!&.I!'>9!&.M!&.U!"
- "$^E!&.Y!&.]!&?5!(?-)&?-!$_)!%/1!$?1#&?=!$_)!&?E!%_E$+OA%%/Q!'/Q#"
- "(_Q%&OQ!'_U&&O]!(/]!(0!!&`)!(@%!)P)!)0-%)P5!&`5!(P5)'/Y\")PA&&`9!"
- "&`=!(`A#(@9'#`A!(@=!(@A!(P=\"&`=!(09!#`9!)@9%(05!&`=!(05!(0%!+01!"
- "(0%!)@!&&OY!&P-!&OU!(OQ*)?Q!*OM!)/I,'_5!%/9!(/=\"*?9!(/5(%/1!&?1!"
- "&?A!#NQ!&.U!'O!'&.U!(.Y)$_!!$^I!%>A#$^I!'>E&&>E!&.A!$^5!&.1!$>-$"
- "#>1!'.1!%N)*%^-!#=Y!%]]!$MU!'-U!\"MU''=U'&N-$#=I!)=5\"&-A(%]I!$]A\""
- "&M)!%MA!%MA!%=)$%M)!%]!\"#=)!%<]!%<U)&<U%%<Q!',Q-'<Q)%<E!#,A!%LI\""
- "&,9$%LI\"%L1\"'[]$$,-!'L),$L!#%<!!&;Y''L%,%+U%$KQ#%+M!%;A\"$[5%$KA$"
- "$[-%$[E!#+1\"$+=!%+1&$K)$#[!!#[)!#Z]!#ZY!%*Y'$*U&!*Q!$*Q\"#JI!\"ZE!"
- "&JA*#Z9\"$Z)&#Z9\"%J9\"%Z)#\":-#\"Z%\"#)M#$J-%%J!#%YY(#IU!&:%\"%9U%%9I)"
- "#9=$\"X]\"\")9\"#Y=&#9A!$)A!#IE%#YI#\"IM!#9U!%)U($IY&'I](#Y]\"$J%&#J)!"
- "#:-##JA!%Z5&#Z9!#Z1\"%J5\"#*9\"%*E'$ZU%$*M\"&[!*#ZQ!$*Y\"$*]\"#ZQ!$;-#"
- "\";1\"&K9($K5$#[1!#+1!'K9$#+=!&+A\"'+E.$[I!$+Y!$+Q!%+M!&KY'%;]!%,!!"
- "(+Y!&<-!%,%!$\\-$&,1%%<5!$L5\"%,=%&<M!$<=!%LA&(<M$&,]##,U!&LY!&-%$"
- "']%!&-%$%<Y!%M1!$-9$)--!%M)!$=9$%M1&&]=&$ME!$MY!#=A!%]M!$MQ!%]Q!"
- "#]Y\"%M])$MU!'^-#(>)!'N-\"%^1!$N1!&.9!'>=!&>=\"$^E!&>E\"&.]!&.M!$_!!"
- "'>M!$.Y\"&.]!'NY!&?!!&?!!%?5\"#O-!&?=!&?5!$?=#)/=!&?A!'_A!)OI('_I'"
- "*OM!%/Q!&?E!&_Y!(/]!%?]!(@!!'_Y!)P)!)0-%+P5*)@1&&P)!*P)2(P9\"*050"
- "&`9!(P=\"%@9!&`9!&`A!(`9#&`E!(`5#&`9!!0A!(@-!&P1!)P%!)P-!%@%!(0%!"
- "&P!!&O]!&OM!)_Y\")?U!&OU!%/M!#_M!)/E!*OI!'OE&'_=!(O9*%/5!$_)!#_-!"
- "%/1!&_%(#O-!#O%!(/!(&^Q#$^Y!+NY'&^U$+NQ(&.=!#NI!&.9!&.=!&^E$&.-!"
- "'>1!%^!!'.=&&-]!&.!!$N)!%]Q!'=I(%]Q!%]M!%]M&&]M+$MA!&-E\"$=1!&M9$"
- "(-)'%])\"%M-!%M1!$])#&M!&&,]#%])\"'\\Y!%<U!(LM&%<E!&\\I'%LE\"(LA&&LA!"
- "&,9$&,-$&<1!%L)#'\\),$,!)%,!%'+Y!&+M%%KU#%+U!\"[A(%+=&$[I!$[E!#;A\""
- "$[I!';9(%+5\"&K=$%:]'([1\"$JY!\"[%!$+!\"%[!!$*]\"'ZQ/$JI$$ZM%\"ZI!%:E$"
- "$*-##J=!\"Z5!%Z9*#Z9\"%:A(#J-!$Z%&$:!!#J!!%)]$&)I%$:%$\"YQ!$IQ&%YM("
- "\"Y-\"%95&\"Y=\"\"YA\"#91!$Y9'$IE%%9M%$99%\"IM!%Y]+#*!\"#YU\"#J!!%J-%#J)!"
- "$:-##*5\"$:%$#J5!$JM!#JA!$:E#$:M$$JI$#ZQ!#JM!#ZU!#ZY!#[)!'*Y'!;1\""
- "$;-\"#[%!#[9!%+5&%;5\"%;9\"%[=%$[1!$[A!$[I!$;M\"$+M!%;U\"'KY+&+]%%,!!"
- "%;M\"',!!&<!!%,-!*L!'%\\=#%<5!%<=!%<U!&\\Q\"%LI\"#LQ#&<Q)%\\U#(<U$#,U!"
- "%]!\"'LY!&=)$&M%%)])*%M1!%M5!&-A\"#M=&(-A!$MI!(-E!%M=!%]I!&MQ$'MU-"
- "']Y$'=Y-%^%!&^%*%^)!%^-!'>A!#NA!&N5#$^9!&.=!&.E!&>I!$^Q!&^M$\">Q!"
- "'_%!'O%!(O!%#^E\"&?!!*?)!&?)!)/%((O)*&?9!&/1%%?1\"&OI!'_E!)/E!(OE$"
- "&OM!#_Q!#_Y!&P!!%?U!&O]!)@!!'_Y!)P).&P1!&P1!(0-!)01$(05!'@-#%@=!"
- "(09!#`9!&0E#&P1!&`9!(09!)P5!(`5#*`)!(P1\"+01!,`-)*P%%)P)!-`%!+0)("
- "(0%!&P%!(OY*(O]#&OU!'_I'&O5(&?E!'_E!\"?9!'/E)&?=!(?A)&?9!)?5.$_-&"
- "#O-!&?!!$_%!&.Y!\"NY\"$.Y\"*>M((.Q)&.I!&NI#&.M!'>E&#NI!)^A!%^1!#>-!"
- "\".1!%^)!%N-%'N)#&^%%!]]$%]U!%]Y!&MQ$&=M#)]]\"#=E!%MA!%=A$']=%&-A\""
- "&M-!%M=!%=!*'])!&M%&%M!!&<U%$<Y!\"<U!%\\U\"#LQ#!LI#'L5+&\\E\"%<E%(\\=\""
- "$,9!%\\E((L1'&<1!$L)#%,-!&+]%%<!!(KU#%+Y!%;Y\"&KM+#[M%%[I!%;E\"%+A&"
- "&+=!'K5(%;5#%;5##[1!#[-!#K)$$+-\"#[-!!*Q!#Z]!&*M+%*Q\"!ZM!!ZI!\"ZM!"
- "\"Z9!$*=#%*5##*1&#Z5\"$*%##*5\"#YQ\"%I]#$:!!$)]#\"IY*#YM##IQ!$)M$\"I5!"
- "#I5%$Y5*#I9(\"Y9\"$)9$\"YE%\"II!!YY$$)E$#9U!%IU&#)I#':%&$:-$$*%##J1!"
- "\"*5\"#J1!\"J1!#Z9\"&:=,$JA!$:A#$*E'$JU$%:A!$:Q#&JU)%JY!(+%'%;!'$J]$"
- "$+)\"\"[)!\"[1!![%!%[5!%+M!%+=\"&;=''[E$&+M%!;U\"$;Q\"$+M!&+]!&[]#&+]!"
- "&L!'%<%!)<-%%<-%&<!!'L1\"$\\9('<9!$,A!&\\E'\",M!&,Y#(<=.%LQ&%<U!\",Y!"
- "#L]\"&]!\"%<Y!'=-(&-%#%M1!&-=#%]M!%]I!&-=\"+MA&'-E''ME)%]M!%]Q!'MI("
- "\".-!%^!!&]]%%^)!'N-\"%^1!%^1!%^A&#N5!&.E!'.A%\".1!&NI#&.I!&>E!&.Q!"
- "'>Q&'>U!&?!!&.U!\"?!!)?!\"&?)!&?1!&?1!&?9!&?-!$O)$'_=!'_E!%?A!$/U("
- "&_U!&O]!'_M!&OU!'/Y#'_Q!&O]!'0!\"(/]!(0!!(`-$(01!)/Y&&P%!,@1!(0-!"
- "&`9!&`5!(0-'#0-#&P1!(P5)&@1%+P=0(01!)PE&(`-$*`)!*`)!&P%!(@1'*_Y!"
- "%/]!&OU!'/]\"&OI!&OQ!\"?U!&?9!)?I!'?I$)/A!'_=!&_A\"\"?5!&^]#&?-!&.Y!"
- "(/=.#O%!'O%!&_-#(.Y)&NU\"&.Q!$^M!&>Q!%NI$'>E!&.A!'>9!'^9#)>5%&.9!"
- "$^A!$M]!#N)!\".%!'>!\"(M]'%^-!&MU$%^!!']M*%ME!#=E!%MA!&]=!%-=#%M9!"
- "&]5!%]1\"%M1!(--+*M%$']!!*-%!(\\Y&%\\Y#'\\Q+%<I!&LU!%LI!'<E*$,=!%L5\""
- "&<)&%<=!%,1!';U&$+]!&;]!(,%.%+]!%;]\"&+Y%%L)\"$[I$$[M$\"+U%%+=\"%;9\""
- "%;M\"%+=\"%;9\"&+5&%[1!&[5!#[!!$+)!&+!+%*Y&\"ZY!%*A'$*Q\"':A%#ZI\"#J9!"
- "$ZA\"#*=\"$J9!#J5!$J5!\"Z9!!*-!\"IY!#Z%\"#J!$#9U!$9Q%#YM#$IQ%'9M'$)I!"
- "\"I-!\"95#$I5&&)5)$9A(#9I!#YM#$YA'#YM##YI#%)Y!!)Y!$Y]#%Z-#!*-$#J-!"
- "$*1\"$:-!#J-%$J9!%:5!#Z=($:E#':E)$ZI)!ZM!#JM!$JY$\"JY##[)!#[!!![!$"
- "&+)\"$;)#$+)!#[9!&JY!$[9!(;I&'[A!%[E!%;Q\"&KM($+]!%+Y!'[U$%+Y!%KY#"
- "'<-!$\\!$%\\)##\\1$%,1!&<5!&<A&'\\9#$LA\"&<E%$\\Y#&LA&&<M!&LY!$<E!#,Y$"
- "$L]!&M!!%M%!(=-(\"]%$%]1!%=I(\"-5!&-9#%M=!#]=(&]I%%]Y!%]U!%]I!%]U!"
- "&=I#(>%!%]Y!#=]!$N%!&N1#%^-!&.1!$.9#)N%!&.=!%^=%'>E!$^I!$.U\"$^M!"
- "'NU'$^U!'.Y%$^]!'O!!&O%\")/-!&O)\"'O-&#O5!'/!$(O9*$/9\"(O=**O=!)/E!"
- "'?I$#_Y!&P!!%/Q!\"_U\"(/U'&`!!(/]!+05!(0%!'@)#)P)!*`%!)P1!(@-!&P1!"
- ",@-!(P)#*@1++01!%@1!%`1)(0-!(01!(`-#(P5\"&OY!(01!(`%$(P-\")?U!&OQ!"
- "&O]!&O]!&_U!&OQ!%/Q!&OM!)OA)*_M-(OA$&?E!%/9'&O-\"'O5!(O9$#O-!&?)!"
- "$_%!&.Y!&?!!)?%('NE!'>A!$^U!&.M!&.E!(.I$'>E!&.Q!&.=!(>A+(>1!&.9!"
- "*N-%%^-!&.%!\".-!%^!&%]Y!$MY!(]U#&>!#']E*&-I0%MA!%M-!'M5$&=9$%-9$"
- ")]93%M-!%M%!$=%!&,]#%M!!%<Y!',Y#(<U-',Q#&LQ&%<I!#<E&$L=\"%\\A#$,5!"
- "!,A!%<-!$<-!%<5!%,)!%\\)#%<!!%+]%#+U%&+U%%;U\"$KU#\"[I!&+Y%%KE#%+Q!"
- "$;=\"&K9$$+5\"%+)\"#[-!#[)!$[)!#[!!$;!\"%:]$$*Q\"%ZQ*$*I\"#ZY!\"ZE!#Z9\""
- "\"*A!%Z=#%*1'#J5!$:1'!*9!$Z)#$*-#$Z%\"#I]!\"I]!$IY\"#9I!#9Q!#IY!!YE!"
- "#Y1#\"I1!\"I5!!)=!$I=#\"9A#$I=*$9I$#9M!&IQ.$9Y!$IQ%%J!)$Z!&#J%$$J-\""
- "\"J)!#J-!!Z%!%:5!!:9\"#*9\"$:U$$ZE\"#JE!#ZQ!&JQ*#+)\"\"ZY!%+!&#[-!#[)!"
- "#Z]!#+%!\"[-!%[5!$KE#$K=#%+5\"&[=!$[E!%;I\"&KM,'+M!!+Q%&;Y&%+Y!'[]$"
- "$+]!&L-'%L)\"&\\-()L5+%<5!%<-!',9)%<E!&\\9(%<=!%\\I#%<M!(<Q$&LQ&&\\Y'"
- "%<Y!&LQ!%\\U\"'M)*%M)!&]-&*-!!(=5,%M9!&]=!&]E!&]E!&=E##==!'-I&%]I!"
- "'MY#%]Y!%]Y!#>!!'>%'&.)!'.-!'>)''-]&&.5!&N=#&.=!&.A!%^=&'NI''>M!"
- "&.Q!&.I!&?!!&>Y!&?%!)O!$&?%!$_)!%?-\"%/1!&?9!&?5!'_M&(/=(&?A!)/E!"
- ",?E\")_U\"*_Y!'OI%&_U!)?U!&?E!'?]#&OY!(0%!&OY!+01!,`)#)`-\"$`-%,@-!"
- "&`5!)P)!&`=!+@5('`1,.@-6(@-!,0-&'@)#(0)!*P)%'_U!+O]$(0!!\"?Q!(P!)"
- "!/E!'0!\"&OQ!&OU!%/M!%O]\"\"_E\"'OE&'?I$'?=$&?9!%/5!%O5#&O1!'O)&&.]!"
- "&?%!(?!$(^]!&_!#%.Y!&.Y!'NQ'&.Y!#NE!&^A$&.A!$^=!(>A+&.9!&.9!#NA!"
- "'.)!'.%&$N)!(=],&-Y!'-Y&&-]\"'=U(%]Q!%^!!%]I!&=I$\"]A#'-='%M9!%M-!"
- "'=%(&-)#'=5$*-)!%M%!&=!$%,U)&<]$%LM&%\\Q#',M#$LI\"&,I#\"<1\"\"L=#'<=%"
- "%<9!&<5!%\\1#%,%!%K]#%,%%%<)!%;]&#,!!%;U\"$+U!\"[I(\";=\"%[A%%[E!\";A\""
- "%KA#$K=$%+1\"&+1*'+-/%[))$[-$#ZY!#J]$&JY!$*U\"#ZU!$*I&$ZA\"$K!$#J9!"
- "\"ZA!%Z=#%Z9\"$J5%&:1!%:-(\"J!!#J%!%J-&#J!!%*%$%YY#$)M##YU\"#9A!&9I*"
- "#Y-#\"I5!$)='\")%\"#9=!!IA##Y=#\"II$$9I$\"IQ!#)]&#IM%$9]$%:!$$Z-&#J%!"
- "#*%\"#J-!%J5\"#J9!#JE!$*=\"#JI!#:M#$JM%\"ZQ!#[!!%:]'#*Y\"$[!)\"Z]!\"ZU!"
- "![1!#K5#%K1$&+%'%K9($[=!%;A\"%K=#&[I!';I\"\"KQ#$+M!$+Q!'L!#$;Y\"%+U!"
- "'[Q-%<%\"&,%)&L1&&\\1(&<5%#<1!%\\%,&<=!%\\A#%LI\"&,Q#&\\M\"%<I!%\\U\"'\\Q&"
- "$L]\"%M!!&M%!'-)\"&])&%]%\"'=5(%M)!$]9\"%M=!%]A!)=E!%]I!&=Q(%]Q!'MU)"
- "%]Q!&-Y')>%%%^%!$N%!%^)!'^-$&N1#&.)!&^5%&^%%&.=!'NM'(>E+'>I!&NI("
- "(^Q!(>I%&.Y!&.Y!(^Y!'_!!&?!!'/))%^Y%'_A!#O1!&?=!&?=&&O=!(?=**/5+"
- "(/E!#_M!&OE'&OQ!)?I!&OQ!'OM%&OU!&O]!%?]!)@%&*_Y!%@%!*`%!)P-!(0)!"
- "*@1$(/]!\"@9!&P-!*`1&,@)!(0-!&P!!)P%!*`%!&/]$(/]!*@!%&_I\"(/]!#_Y'"
- "\"?]!%/U!&OQ!*_Q(&_I\"%/I!'/E*(_A%&?A!&?=!&?9!'O5!&?1!)/-!(?-)\"?)!"
- "'/%$*/!!&.U!&>]!&.Q!'NY'&>Q!'.M%&>Y!&.E!#NI!&.9!'>9!&.%!&.=!'>-!"
- "%^-!'.%%'.%%$N!!%]Y!%]E!&MU$$MM!(-U*+-I)$MI!%ME!%ME!#=5!%-5$&-1#"
- "&-=\"&M5%%=)%#=%!(-)\"%M!!'-!(%\\Q\"#LE\"&LQ&$<I!%<U!(\\A0'\\I&'<=&$L9&"
- "(\\=,&<)*$,1!'<)!%L%'\"<1\"%\\%#%+Q!%+U!%;U\"$KY#)+M!$[I!%[I!%;U&%+A!"
- "$+=&$;5\"\"[=!\"[!!#[!!&;-(%;%'#Z]!%:]'#ZY!$K%'$*Y\"&*Q'&JI*&*A(#:M#"
- "$J5!#Z=!$:9#$J5!#Z)\"\"Z9!$*1\"%)]!#9U!#J%$%)]'\"9U#\"I]!$9Q!%9M%#I9\""
- "#)1#$(]$\"Y5\"#YI#&91'#YA#$9Q!#9Q##YM#&9Q*%YU+$Y]#$)]##J%!#J!!%:1$"
- "$Z)\"#*5\"\"J1!#J5!#J-!$*)#%ZA*$JE!'+!/%JA%$:E$!ZU!#ZU!&[!&$J]!$[-!"
- "$K!$$+)\"#;9\"$;1\"#+5\"$[%!$[-!%;A\"'K9$#[A!$[E!$[Q%$;Q'&;U'%;Y\"&;]\""
- "!+Y%%\\)#$<%!%\\%$&L1\"%,1!&L)#%<9!$,=!$<)\"%L=\"%\\I##,E!&<M!(\\U&&,Y#"
- "$<U!*-%&%M!!']%+%M)!%M1!&=1$&M)!%M9!%]Q!*MA,%]I!%]Q!%]Q!$MM!%]I!"
- ").!%%^%!%]]!#>!!%N%%\".%!&-U!'.!!&^1%&NE#&.9!'.=&&.A!&.E!)^E&(.Q$"
- "+>M!'NQ!&.M!&NY\"&?!!#N]!&?!!'/-$(_)!'O-&%O1#+/%%&?5!#O=!$/E\"*OA!"
- "'_A!(?U\"&?E!'_E!&OU!&OQ!%/U!#_M!$@!\"'_Y!&O]!\"@%&&`-!&P)&#_]!(0!!"
- "(0%!(0%!(0!!&/U$&P1!*0%*(0!!)P%!(01!+/]((0%!&`!!(/]!&OY&%?]!!/]!"
- "&OY!$OU$&_M\"&OQ!%/E!)/A!+/A#%O9#&_9)&?5!&?-!&?5!&/-&$_%!&O)(&?%!"
- "(/!.&.Q!&.]!&>Y!&.]!&.Q!&.M!).I\"'>I!&.I!&.A!#N=!).=#$N1!#>)!&.=!"
- "'>9!%^%!%^%!&]]%%]Q!%]U!#]]\"$MQ!$]E,#=U!&]A!$MQ!%ME!%M5!#-9$%M)!"
- "%M1!$]9')M)2&=)$#=)!&<]$%<]!&,I#&<U$'LU!'L]!&<A%&\\E\"%<I!&<E%&<9!"
- "%<5!%\\A#%,%!'<-!#L)#%,!!$+U!\"[M$$KY'%;U\"\"+Q!$KM#%+U!&+E&%;E\"$+1%"
- "$[E!&+9*#[E!$;)#$+-)#[!!#[%!!+!$$*]\"#[%!$:M'#ZI!$ZM%!ZY!#JI!!ZU!"
- "$:E##J5('*9)%J1\"$J1%&*-%#J!!%*)'$*%#%)Y''*1-\"J)##)Q%#9Q!$*!#$II%"
- "#9)'\")5\"#Y=#\")=\"$9=%$Y='\"9M##YI&#IY!%I]&!YQ!#*!#\"IU$#YQ#&J!#$*-#"
- "$J=!#Z-%$:)(#Z-\"$J9!$*M\"$:=#$Z5\"#JE!\"ZI!%:M+$*A\"%J]!#ZU!$Z]%#+!%"
- "$*U\"\"[!!%;-'#+1\"$[I!&K1(&K9('[=!%+E!%;M\"%[I$$[I!&+U!&[U)$<%\"&,!!"
- "%,!!(,)-$<)\"%<%\"#<)\"&,1%(<1*%<9!%<=!&<A%%,9%'LE!$LU\"'<Q)%<Q!$<M!"
- "$=!!#<]!%M!!'=%$%M%!%M-%%])\"&=1$&]A!$M=+&=E$&-A#&=A$&]E!%]I!$MQ!"
- "'.!%)=Y!&]M!(-]*%^!!&.)!'N-(&>!#&N-$%^-%\".%!&.=!&.5!%N=$&^=$&.E!"
- "&.Q!&.Q!).]-'^U().Y!(^]!$^]!&?!!&?%!&?-!&_-#&O1!'O%!'_5''O-!%O-#"
- "&_A\"*/U+&?E!&OI!'OE&&OQ!(/]!%/]!&_U!&OU!&OY!&OQ!&OY!*0!#)?]!&OY!"
- ")`!))@!!)?]!(/]!)P%!%`%#)?]')@!!(_Y$&O]!,P!0*?Y1&_Y!&OY!&_Q!(/Y'"
- "&OU!&OI!\"?I!&OQ!'_9''_9!&?E!%/=!&_1\"&_5#+?1%&^]#&?-!&?)!*?1!&?%!"
- "'.]%'O%!'NY!*N]\"'.Y%&.M!(^Q!$.M##NE!&.A!'>A!#NE!&.5!&>E\"'^-#%^)!"
- "%^1!%.1')M],%]]!#^!\"(=Y!&]M!%]I!%]M!$MI!&]E!)-Q*%M1!%M5!)-5&%]5!"
- "#=1!$=-!'-1''])!'-!(%<]!%\\]\"&LU!%<Q!%]%\"%<=!$,9)$<M!%<A!$L=\"$,=!"
- "#<-\"$,A!&<)&%L1\"%L)\"(<%/$<!\"%KY#%+Y!&+U!&+Q!#KU#&[E!$[E!&KA(#[=!"
- "%+9\"'+=&$+5\"$;1\"%K1((+)'$;%#$+!\"\"ZY!$JY!#ZU!#ZQ!$*M\"\"*I!\":E\"$ZU%"
- "#:E#$:M'#*=\"\"J1#\"J!$#J-!$:%!#Z)\"&Y]!')Q'$9M!$)U##IU\"\"IQ!\"IY!#YI#"
- "\"Y=\"%95&\"I9!#Y9&$YQ#$)I!$9M!#YM#%IQ'%IU-$)M$!IU##IY!\"9]#$)]##J!!"
- "$J)\"#Z1\"#Z1\"$:1#$Z9\"!*9$\"Z=!$:=##JI!$ZE\"%*I\"$*U\"%[)!#ZQ!!ZQ!&+!*"
- "&[%&#[1!%[1)\"[=!\"+%!$[5!%;5\"%+=\"$;A\"%;I\"%KI');M+$+Q!#+U!%+Q!%<!\""
- "',))*+Y%&,%!$\\)#%,-!%,-!%\\5#%L-#%<1&&<A%%<E!%<I!&\\M'%L5&&<M!#LY\""
- "#<M!%\\]\"$LU\"#=)!%<U!\"-5!']9+%]1!%]A'%M1!&-=#$]5'#=I!&]Q!%-]#%]M!"
- "'-M'%]U!%]]!%]Y!%^!%%>%#)^)!%.)\"$^9!%^1!%N5%&>E\"(NA!&.A!&.E!\"^E#"
- "'>M!$^M!&.Q!'>M!*NU.\"_)\"*.]!(^U!,/%/'?)%'_-(%/=!&?5!'/9#&?9!&?9!"
- "*OA!&?A!%/E!&?A!&OM!)OU.'OE%'?M$#_I!,?Q\"'_U!&P!!\"?Y!\"?Y!*/]#&O]!"
- "(O]*(?](&P!!(0%!(0!!'@!#*OM!)P!!&O]!'P%$*OU2&OY!&OY!&OU!'@!##_Q!"
- "*OQ&&OI!%OM\")/A!(/E!&_Q!#OA!'O5!'/A#*?)!&?-!&O-\"&>Y!&?%!&_1\"(/!("
- "(_%!%.Q!'NY!&^M$(NQ+(>I*(NM!&NI#)^E!%^1!)N%!%^)!&.5!(>%!&>5''>-'"
- ")=Y!'.)!%^!!&.%!'MU#$]M!%]U!%]U!&-I\"%]I!&-E\"'-A!$M=!%MA!&=5$'M=$"
- "%]5\"&=-)$<]!%M9!%<Y!(,]\"$<Y!%M!!&<Q$%<M!%L9\"&<=&%<E!\"\\=$%<=!$,A!"
- "'<5%%<5!%L!#%;Y\"&L%')<!%&;]\"$<)!%+U!$+U!$[Q$$KM#%;5\"%+9\"#KA#&[E!"
- "#[9!'K=-%+1!#[1!&+%\"\"[)!#[-$\"[)!#+!\"$ZY%%+%&$ZQ!$JE!#*A%#JE!#Z=\""
- "#JM$!JA'#J=!#ZA\"!:-\"#J%!#Z-\"\"J%!#J%!&YY(!Y]!\"YU%#YQ#!)E!\"YI($)I!"
- "#99!\")%\"#95$\"I9!%9=&#9A$#YE#\")A\"#IQ\"%9M%#)Q\"&YQ$%:!!%I])$Z!'#Z%\""
- "$:-#$*-&#J1!#J=!#J5!%J5)&:=,#*E%\"Z5!$*M\"%JU$&*U'%:U($+!\"\"ZY!%;)#"
- "#[1!#[-!$+-!$[-!%+1\"&+5&%+=\"$[9!'+1\"%+A!$+I!$+M!'+Y!#+U!$,!!#+Y!"
- "%+]!%[](!,-%&\\-(%\\%$%<)!%L5\"#<=\"%L=\"&<Q$%<]!%LE\"'LI*&\\M'%LE\"$\\U#"
- "&LY!'<I)%<U!%]%\"%M)!'=9#%-%$&=-$&-E\"(-1!%M=!&-A\"$ME!(-I!']I*%]M!"
- "&-M\"'-]!&-]!%]Y!&.!!%]Y!(>)!$N-!(>)%%^1!'>5!'>-'&.A!'>I!)^A!$^=!"
- "&.Q!&.M!&.M!&?!!&.Q!&?%!&?!!#O!!&?!!'?1*#O-!&?)!#/5$)/5!'?1*&O9'"
- "(_M0(/=\"&?A!)?E!)_9*'/I#&OI!&_M\"#_Q!(/]!*_U!'_Y!)?U-&P!!(0-'(/]!"
- "'?Q$$?]\"&O]!'P)$(/]!'@!$+OU+&OY!&O]!'OQ%&O]!&OY!'_U!)?I!&OQ!(OM*"
- "+/I)+OA+&?=!)?E('_E!%/=!&_=\"%_=$*/5%&?1!'?)%&?-!(O)0'O!!&?)!'.]$"
- "&>]!&N]\"&^U#$^M!$^Q!&NE#'O!!*.E2&.Y!'>A!'N=,%^-!&.5!%^1!'.1!).)*"
- "%.!\"(^-#']Y$%]]!%^%!'-U!%]Q!&=Q#&]A!'MI))-A+%=A$(==\"$=5!%]-\"%]1\""
- "$=1!&-5#%-)(\"])$&M!%$L]\"%<U!%,U$$<M!(,Y\"$<A!)\\I+%LA\"#LI#%,-!%,-!"
- "'<%&%,1!$<-!'\\-##<!*#,!!#,%!%,%!'+]!&[U(&+U%$[Q%%[I!&+U%$[5!%[I!"
- "$+9\"$[A!&+1\"$[1!![%!$;)\"#[%!!Z]!#Z]!$JE($*Q\"$*Q\"%JM%$:M$%JE%#ZA!"
- "#ZA!#JM!\"*1\"$JA$#ZI\"%:5!#Z%\"&J%#$I]\"$)]#%)]$$YY'#IY!!I]##9I!$IU%"
- "\"I%!!)%'$)9!$)9!#9A$#)=#$9A!$9E!#II!$YM&#YM#$II#%IY'#IY!$)M#!*%!"
- "#:%'#J-!#Z-\"%*1'&ZI'$J1%#J=!%*A&$*U\"#ZQ!\"*Q!#JI!#:U\"\"*Y\"$[!!$[!!"
- "#[!%&[!&&K)!$K1$$;)#&;A'&[5!%[=!%+E!%[A!%[U$&+I)$+I)&+Y!%;U\"$[Y$"
- "&[M)%;]\"),%%#,)!#,-!&<1!%<=!\",5!&<9%)<=2$,=!%<E!&<=!&,U#%\\Y\"&,I$"
- "&LY!$=!!&=!$%M)!%<U!%M9!'-1'%=5$%M)!%M9!%]A!)]E)%ME%%]I!'-Q!%ME!"
- "&=M#&=Q#']Y$'=]'(>%!(N!()N%!%^)!'N%.(.1*%^1!'>9!(NA!$^I!'>E&%>E#"
- "$^I&(.M)&^Y#(NU&(NQ+#>I%*?1!&^]#&?!!&.]!&?1!&N]\"%/=!'?)%&?5!'O)'"
- "&?5!*?9')/=!&?A!'_A!'_E!*O],&?=!'_Q!'_I!)/Q,&OI!%?Q!(0-!&OY!'/M#"
- "!0!!)?U!,OY*&OU!'_Y!(_Q+(?Q\"$/U!%/U!&OY!&_I\"&OQ!&OQ!$OE$'_I&#_9!"
- "%/=!'_I!'_M!-/A'&OA'(/A!&?9!&_5\"&?9!&?1!&?-!&?-!&.]!$_!!&O!\"$^Y!"
- "$^]!'?%&&>Q'&^U$'.M%$^M!)>M#(NI!)^E&&.A!&.=!(N9&&.5!&.9!%^)!&N%$"
- "&N1#%^!!&-]!&M])%]Y!(>!!+=U*%]I!#]I#%]I!%MA!'-A!&-=#$]9\"$M1!%M)!"
- "&M)%$=1!&-%$%<Q!%M-!%M-!%\\Y##LU\"\"LU#%\\U#(\\I\"%<=&$<=!%<A!&<Q$%<A!"
- "%<5!&L1&&<%!'<)!&,%!'[U%#;]&\"+Q!%+Y!\"+M!$[I$$[M%&+A&$[5!%[A$$[I!"
- "&;5\"%;!'#[1!#[1!$;)#![1!#;%&$+!\"$JU!\"ZY!$K!$%*M\"$JM$!*E$$JA!%JM("
- "#J=!#*9\"#*9\"$J5!#:1##J-!!J)#$*!##J!!$)]'$IU%$Z%\"#II(\")I\"#9Q!\"IE!"
- "#9)!\"I-$#Y-&#YI%#YE&$99%\"YA%#9A!\"I=!#YE#%IM&&IU$$9Y!&9])$)Y#$J)!"
- "\"J-!!*%!$Z-&$*9&%:-!#ZA\"#Z=!':A)$:A#%:5!#JI!#JI!#ZU!$*Y\"%*U&\"Z]!"
- "#:]\"#[%!$+5\"$;-#&+1&#+5\"$[5!#[E!$[I$#[A!$[E!%[5!\"+M!$+Q!$+Q!',)%"
- "%,%!%,%!&,%%%,!!&<)%%,)!&,1$#,-!#\\9(%L9\"$LE\"&<M)%<1!&,E(%\\]\"#,]!"
- "&<U$',U#$=%!*<Y#%]!\"&M)!%M!!%M1!%M1!&==$&-=#%]I!%MA!%MA!%]M!%]M!"
- "'-U!&-]!%]Q!)=Y&%]Q!'.!!%^!!%^)!%^1!\">-!&N-$'.)!'>9!(^=!$^5!'^A("
- "'>A!&.E!$^Q!%>Y\"(^Q!'>U!&>Y!&.]!'O!!#_!!$_)!#O9!&O)!&?)!)O9#&?1!"
- "&?9!&?5!%OM\"'/=#&?E!)/=!'_E!'_A!(O=$*OI!%?M!'?M$%/=!'?Y$&OQ!(/Q("
- "(_U+&OU!&_U\"#OY%&OI'&?A!&_U!#`!&(_Q%&OQ!&OQ!&OM!&OI!'_I!%_I*)/E!"
- "&?E!%OA#)?9!&?=!\"?Q!+/5*&?5!#O5!&?1!&?-!(?-/'O)&&?)!&?!!&?!!&.]!"
- "'.]$(.U#&.Q!(^Q'&.M!&.I!&NI#&^U)&NI#&.=!$^9!'N9'&.5!%^-!&>-\"$N!!"
- "+.)(&>!\"$N%!%]]!%]U!%]U!(-Q%&-Y\"%ME!\"]E#$MA!%]1\"(=9\"'M=$&=5$%]A!"
- "'--#%M!!&-%$'<]$$\\U((LY*',Y#%\\Q\"*,U&%LM\"%<M!&,M#'<A!&L=\"$\\-#',9)"
- "&<1!&KY'&,1$#,)!%+M!'<1!%,%!%+Y!&;U&$+Q!$;M\"%+I%%;M#&K-$&[I!'[=%"
- "%[9!#[-!#[5!%K1$%J]!#[)!\"[!$$J]$$JQ%$ZU%%:Q$$JM$%*E'%JA)$JE!'*=("
- "#J=!#ZA\"\"Z5!#JA!\"Z)!%:%(%Z)##J%!#J!!!Y]!#IY!%)U$\"9M)#9E!#9I!%)E$"
- "#I-%#9%$$9A%\"I5*!I9&\"YA%$Y='$YI&#IA!\"YE\"$)Q$#IY!#IY!$*%#$*!#$:!$"
- "\"J%!#J)!#J-!!Z1!$:)!#JE!#JI!#J9!%:Y#$*I\"%ZM*$ZI&#*E&$ZY\"$Z]%#ZQ!"
- "#[!!#[)!%[)!#[-!$[-!#[1!%[9!)[E!#+Q!%;A\"%KQ#%+E!$;M\"$+]!'L%#%+]!"
- "(+]%&L)'%,%!%L5#);]'\",%!%,1!$,)!&,5%%,A$%\\=#%<E!%<I!$,E%#,M!$<I!"
- "(-%''LE&%<Y!$M!&%-%$&M)!$])\"%M5!$=9!&-5#'-9\"'=9(&ME)'=E\"%]I!$MI!"
- "%]M!(-U%&]U*\"-Y!&]]%%]]!$MY!'>!!*.!$'.%!&N1$\"^)#)>9/&.9!$^=!&.A!"
- "&^=$&^I$%N]#&N=#(^U!$^Y!'>M!&.Y!$^]!$_)!&_)#&O!\"&?)!$/!\"%/-!'_A!"
- "(/5)#OA&'_9!'_=!'?=$#OA!(O9$&?=!'_E!*_E)&?9!&OQ!)?M!&?E!*/M+&OM'"
- "%/I!'_Q!%/U!'OQ%'0%)&OQ!&_U\"(/E(&OU!&OY!&OM!\"_I\"(?I#'/E#'_E!'_E!"
- ")/A&&?A!'?E$&?=!&?9!&?E!&?9!&/A%&?1!%/=!&?)!%/1!&>Q!$_!!&.]!'>M&"
- "&^Y#&.U!&.Q!'O)!&.E!&.I!'NE!$^M!'^9)'^1#&.9!%.5\"%^1!(N-!%^)!%]]!"
- ")=Q,%^!!&=]#&]Q!%]Q!\"=Q!%]M!(]I$(M9)$MA!%M=!&]=!%M9!%M)!&=1$%M)!"
- "(-)\"'=-)\"M-\"),]\"%L]&#,Q!$<U!),Q($<M!&\\I+%<M!(,=-)<E3&<=!',9(&L-'"
- "%L1#(\\-(&,)%&<-!',))$<!!%+]!%;Y\"$+U!#+Q!$KY#%;A\"'[E$&KA(%[=!&[9*"
- "%+%\"\"[5!$[%%#[1!#[-!&+%+$[!&$*Y\"$JY$%*U&#:U#%ZQ*&:Y,$JI$$*=\"'*A#"
- "$*M\"$J9!$J5!!*%$#J5$#Z)\"$)]##9Q!$)]#$IY%%9Y(%9M\"#YQ\"$IM%\"Y=%%YE!"
- "%I)!\"I5!#I5\"#9A$\"9E##)E##95!&9M#!)Y!%9M%#IQ\"#YU\"$9Y!')]0%*%$$Y]&"
- "#)]#$*)##:5#'J1.%:1(#J%!&:=!#JA!#ZE!#J1%!JA##*E\"\"JQ#$*U%$JY!$*]\""
- "$*U\"$[5%$+5\"#;5\"%Z]\"$+-!$+5\"%;5\"%+E!$;E\"%[E!%;A\"$[I!$;Q\"%[U%&[Y)"
- "&KY'%;]\"%\\!#%<%\"$<%!$\\)$&L)\"%<5!(<A%%\\=#%L1\"%\\9#!LE#%<I!%<I!$<Q!"
- "%<]!%,Y-$=%!&-!((<U)'L]!%M)!(=-#$=)!$=5%'=5##==!&]A!(-=!(]E/&]E!"
- "'=A(%]Q!$MU!%]U!$MY!&-]\"'N!($N%!(.%%%^-!%^)!%^1!%]Y!)>I/%^9&&.A!"
- "&.A!&.E!*^Q+&.U!&.Q!&.M!$^=!&.Y!'.U%&.]!&_!#$_%!(?%*'O-!&?-''?%&"
- "+?5+(O5*&?A!&?5!(/%(&?A!&?=!'?E$'_A!&/E%(/I!'_E'&OQ!)OE\"&_9.&OM!"
- "&OM!&OI!&OM!%/U!&OQ!%OM)&_U\"%/M!'_I!$?I#&OU!&?E!%?E!&?A!'_E!)OM\""
- "%/=!'_A!%/A&&?1!&?5!'O5!%/-!$_)!&?1!%_-$#O!!'/!$&?!!&?%!&.M!$_%!"
- "\"_%#(.M)&.Q!'>M!'^E#'.Q%'>A!&>A\"&NA#&^=$&.A!&.5!(>-&&>)\"'>5!'.A&"
- "%^!!%>%#&-Y!&]Y%(=I'%]I!%]I!*MI!%]I!&]E%%]5!%M=!'M5$&-1#%M1!&]5!"
- "(=9'%M%&%M1!']!&%L]!%\\U\"%<Q!%<Q!&<Q%%<5!&,E#$<A!&<9%&,E-\",1!%,1!"
- "%,1!'<)!',!)&\\!#(<)!%,!!%+Q!&,!)\"+U!'KQ'$[M$$[9!&;E\"%+M!(;='&K9("
- "%+-\"!+1!$+1\"#+-\"#[)!$;%#\"[!!#:M#$ZU\"\"ZU!#ZQ!$*M\"#*I\"#ZE\"#ZI!%:I$"
- "#*=\"$*5##*5\"#J1!%:%(#J%!$:1!%Z1#\")]%$IY&$)Y##9M!%9Y&#YM#%)E(%)E("
- "!Y)$\"I-!$I9#\"I9!\"I9!$I%#$I=&#9A$#9I!%)M$$9Q!$:%!%)=%$9Y$\"J!!#Z!\""
- "!:%&&*)(#J-!&:5)%*9##:9##*=\"!*1!\"ZA!$*A##JI!$JM%$*Q\"%JQ!&:I$!Z]!"
- "\"[!!#[%!%+%&#K)$\"[-!\"[1!$[5!$[9!$[5%%;A\"%+M!$;E\"#[I$%[E!#[Q(&<!\""
- "%+Y!%;]\"'<!*%,1!%,)!'<%%&L1&%,)!%<5!(<9%%<A!&\\I\"#<=\"'LM!&\\E#&M!%"
- "&<Q$&<U$&,]#']-&$L]+$]%\"%<]!(--\"&])'&--#'--'&-9\"%M=!&MA$'-Q&&]Q!"
- "%]Q!&]E!&]M*)=U!)=Y!%]Y!$N%!'.%!%^%!%^)!$^-!)N1!(>-%&.9!%^-!(N=!"
- "&.A!&.Q!&^=$)^Y+&.M!%.E\"&.M!%>A#'.Y%'NY!'N]!'?!%&?%!)?%(&O)!'O-!"
- "-_),*/1+&_=\"&?5!$?9#'_=!'_=!'_=!&?=!'OA&%OA#)?E'\"_E\",?E6)?I!)?U!"
- "&/I0'_9!&OI!&OM!(/]!&OM!'_M&)/I,'_M!*O=!&OQ!*OE!#O1!&?A!&?A!&?1!"
- "'_=!(_5&*?=&&?1!&?-!$/-\"&?-!'?9%&.]!&?%!)O%$#O!!(.U)&.]!&.U!$^U!"
- "&.U!#NU!&.Q!&.E!'>9!$^M!(>A+&.=!(>A+&.9!'.E%%^1!$N!!'.)!(>)!%^%!"
- "'.!!#-])#>-!&MU%$MQ!&=E$%-]#%]M!']E*(-A!'-='&]9!&=1$&]1!%]5\"$=-!"
- "%]%\"(M9.!=5\"%<U!%=%)&\\U&&<=&(]!!%\\I#&\\Q\"&LE!%<A!&,=(%<5!%<5!'<9%"
- "&,1%%,-!%,-!$,%!%+]!&<)&$,%!&[U)$KU##<%\"$+M!$KI#&;=#$;A\"#;I&$[A!"
- "$+5\"%K5$#;-\"#[)%\"Z]!%[%%$[!!#Z]!&JY,$+%\"#ZQ!$JA$%:A##ZE\"$J9!#J=!"
- "$*=\"#*1%\"Z=!$*1##J-!$:)!\"Z%\"#I]!$*%#&9Y)#YQ##9M#$9U!!)M$\"IE!$9E%"
- "\"I)!&I-(#Y1##I9%\"Y-\"\"I5!\"IA!$)9!#9I!%)I!$)M$\"IE$#IU!#YY)#YY\"$J!\""
- "\"*)%\"J)!$:1$$Z)&$:1'$J5!#J-!$JI$$*M\"\"ZE!#JI!#*Q\"%*Q'#;!#$JM$#Z]!"
- "%+1\"&+!&$+%\"#[)!%;-'#K!$$+1\"$+9\"';9,%+I!&+I%$[E!%[A!$;I\"%;U&#+]!"
- "%L%''KY+%,1!(<%/%,%!&,!!%L-\"&,-$%\\1#%<=!%<A!&L=&&LI!%<Y!&LQ&'\\Q+"
- "&<I!%LQ&%M-!%<]!&\\]&&]%''L]!&])&(<Y-']1&&==$$=9!'==#&-=#(-=!%]I!"
- "$]I\"&MM$)MM!#=]!'M](\"MY'$MY!%^!!%^)!%^)!'.)!'.-!%^1!'.1!'>9!%^)!"
- "$^5!%.E\"&.A!'>A!(.Q#&^Q$&^U#'.Y%&^U#%NY#&.M!&.]!(>U*'O)&(.])&/)&"
- ")O-#'O!!%O1#&?)!'O5!'?1%'_=!)/9!&_5#&?9!&?E!#O-!'_9!'_E!-/A&)/E!"
- "'_E!(_U$'_I!'_E!&OM!*OE!(OE$'_=!'O1!+/A0&OI!&O9!&?=!%/-!(_9%&?9!"
- "%/1!)_5$+/5$'O)!(?1$)/1-*_1\"'O%'&?!!$_)!*.]2'N]!'>Q&&.Q!(_)!&.Q!"
- "&.M!&NQ\"(NI!'NE''>E&&NA#$^=!\"^=#&.9!\"NA\"'.1!'.)!%^1!'-]!$N%!%^%!"
- "%]Y!%]U!\">!!%]Q!%]Q!%]Q!$MA!&]E!(-=!&]A%)-5!']9*&=5$%M)!%M!!$])\""
- "%]1\"%\\]\")\\]!',Y#'<Y$'LU!',9('\\]+%<M!%L9\"'LE!&<A!&<-!'L=!%<1%%L=\""
- "$<-\"%L%#%L)'$,%!#,!!';Y!&+M!&[I!%K]'\"+M!&[I!$[9!';M'';A+$[5!(;9#"
- "$[1!\"[1!&[1*#[5$%+%\"'J])%[))%Z]%%JY!$*Y\"#ZY!!ZM!%JI%#JE!$JE%#Z=!"
- "%*5#%*5'\"ZE!#J1!#J)!#J-!\"J!$$Y]#$)]#\")Q\"&)I%$YM#%9M,#IU!#IE\"&)E)"
- "#9)!\"I)!\"Y9\"!Y5!#91!!)5!\"9A##IA\"#9A!$)I##YM##9U!$9]$\"Y]\"#I]!!)]$"
- "#:9#$:)(\"J%!%Z1*%*%$$:5$%Z9\"#JA!#ZA\"':E!#JM!!ZY!$JQ$!ZU!%:U'#ZY!"
- "!ZY!$K!$$+%\"$[)%$K9$\"[1!#[=$%+9!%[A$\"[)!&[A)&+E%$[I!$+M!%\\!$%;U\""
- "%+]!&,!%&;Q\"%<!!&+]!%L1\"%+Y!(L1!)\\9\"&<=!%L=\"),E##,A!%LI\"%LI\"%<Y!"
- "%\\M#%<Y!)M%)'LU!(,Y'%M!!&M%!%]-\"%L]!%M1!%M-&$MA!%M9!%]I!(]A*#=E!"
- "%]I!$-Y##=M!(-Q!&^%%%N%%$]]!&>!\"%^)!%]U!'.)!&^-*'N)\"'.-!&.=!'N5("
- "&.=!'.1%(NA!'N='&>A\"$^M!&.A!&.Q!&.Y!'^U(#NQ!&.]!#^]!'_1('O%!)_)0"
- "$_)!&/1%&?-!'O1!&?5!\"?=!&/5*'?=$)?A!&?9!&?=!%/A!&O5!&?=!&?E!'OA&"
- "%/M!&_A\"'?Q$&?A!#OA!&?=!%/A!)/A!'?=$\"?=!&?=!(?=)'/E#&O9!&?9!&?5!"
- "&?5!%/A!&_1\"&?1!(O-*'?)%'?%%'O%!'_)!(O!+&?!!*N])'.]$$^U!&^U$&.]!"
- "'>A!$^Q!&.=!&.E!'>I!'.I%&.9!&.I!$N1!&.1!'N1('>9!$M]!$N%!&>!\"(N!-"
- "\"]Y#%]U!&>%#\"-Q!%]M!&-9#&]]%)-A&%MA!%]=!&-9\"&=9$%]5!(-E!&\\Y\"%<Y!"
- "%]1!&M!&&,]#&,]#',](&LU!#,Q!'LU!%<I!'LI!$<9!$,=!(<5%'<9*',9$#,5!"
- "&,%!%<%\"$,!!(<!+&\\!(#,%!%+U!%+U!$[=$$;M\"%;A\"'+A!$[E!'[=.%[=$$;5\""
- "\"[5!'[1*$+)!#[%!$+)!#ZU!$*]\"!*U!#ZU!&ZI##ZY!%ZU)#JM!\"ZA!$:E$$:I$"
- "%:9!\"ZA!&:1!#*50#Z1\"#Z-\"$*%#%)]'%J-\"#YY\"#9U!#I]!%9A##9I!%IE&#9E!"
- "#))#\"I-!\"I-!#)1#\"I9!!)9!#9I!$9A$$)I#%9I&$YM#$)Q*$IU%$*!##J1!$:!$"
- "#IY!#Y]\"%:)!$J-\"#J)$%J!&#JI!#J=!\"*I\"$Z=\"%JE(!ZQ!$JM!%:Q(%*U&$ZY\""
- "*+%,#[-!&Z]\"$+%\"$+)\"\"[)!\"[1!%[E!$[9!&+=!$+9\"%[E$$[=!$+Y!$;Y\"'K]+"
- "&;U'$;U\"&;]*#;]\"(;]!%,)!',-%%\\1#%<9!%\\=#'\\%,%<9!'\\A\"%<E!&,I#&,E$"
- "&L]!'<Y)$,Q$']!!%<Y!&L]!$M!!%-)$&M-!&=)$'-9'$]5'%]9''MA)&MA$$]M\""
- "%ME!%]I!%]Q!$MY!%^!!(]Y-&=Q#(M]\"%]Y%'^5#%^)!'>5!%^)!'.1!&N5(&.9!"
- "'>9!(^=!'>=!&.E!&^A$&.E!(NE!&.M!&.U!&.U!$_%!'>M!&?!!(?!$&?!!(_%!"
- "&?%!'/)$-/5!%/-!&?-!+?-+'_9!'?-%&?1!&?-!&_9\"'_A!&?5!&?-!!/)!+_=!"
- "&_5#'_)((?=*&?=!(OA0'?A%(_=+*_=\"*/A1)/5!&?9!(?9*&?=!&_9\"#O1!'O5!"
- "'?)%&?9!'/%$\"?-!&?%!\"?)!(?%)'O%!)?!(&.Y!(_!!&.]!'>A!$^Y!(>U%&.Y!"
- "&^U#&.I!&.I!$>M)&.A!(>=&&>9\"'.-!&^1%'.1!'-]&$N1!%N5$(N5!%^!!%^!!"
- "$N!!%]]!%]I!%]Y!%]M!'MQ$&=E#&]A!)-A+&MQ$%M9!#MA&&-9\"%M-!\"M!'%])\""
- "%\\Y#$]1\"#=!!&,U#%<U!$\\U#%<Q!%<Q!%<5!&\\=(%LI&'\\=\"$,5!'\\9,'<5!#<1!"
- "'\\-#%,)!%,)!*<%!%;U\"$\\!$%KQ'%+U!$+M!$+M!&[I!%KE$'[I!$[A!#[9!'K=$"
- "\"[5!#[-!\"[=!$;%\"%+%&#ZU!%ZY&$*]\"&*I.&JM%$ZI\"#:M\"%*='#*E\"\":I)$J9!"
- "!*9!\"Z)\"$*9##Z-\"\"J)!#I]!\"J!!$YY#$I]%$IY\"#9U!&Z!$#IU!\"IE!%)Q!$)1$"
- "!Y%!$I1)#))#\"I%!#9-!#9E#%Y=$#Y=#$)E$#IM\"!YM!#YU\"%9U%%IY'$YY#$Y]&"
- "#IQ\"#I]!\"J)!#Z-\"%:1(%J5)&*%!\"Z9!%JI!#J=!&*M+#JM!':M%$*U\"%ZU%#JM!"
- "(;%$$;!\"&;!(#[1!$K!$#[)!%[1!#;5\"(K=$(;=\"\"[I!$[E!&KI#$;M\"$+M!#KQ#"
- "$+U!';Y+%<!\"&;Y!&<5!%<1!%,1!&L9\"&,1%&L5\"%\\9#&<A!$L9\"&L9&$,A!%<E!"
- "%<M!%<E!&LU&%<Y!&]%!&M!%'L]!%<U!%M%!']=+%]1!%M1!#-9$(-9+$]9\"#=A!"
- "#=E!%]I&%]I!%]M!%]Y!(]U.(-U!'M])&>!\"&>)\"%^!!(>!!&.=!$N-!'>5!%^1!"
- "&.M!'>9+&.=!'>=+$^E!%.Q!(^A2&NM\"(NM!&.Q!&.M!%/!!(^]!&.M!(>]*&.Y!"
- "&.U!&?9!%/1!)/1!$_)!&?-!#^U!$_)!&_9\"'O1!&?5!)?5.&?-!&?A!#O9!'_E!"
- "%/-!#O9!(?9#&?1!'_9!#O9!&_5\"(?A#%O9)'_1''_=!'?%&'_1'%/I!&?1!'/5$"
- "&?-!)?-\"(?))'O)!&_%#'?-%)_!0&O%\"'N]!#O!!$_!!&>U!*^U*&?!!&NM#'^M("
- "$^M!'^E(!.E!&.A!$^9!%N5%%^)%$N%!#>!!(>-!$N-!%^%!(.-*(N!!%^%!'-]!"
- "%^!!%-U#%]Q!'-Q&&]M!&-I\"%ME!$MA!&-A\"%M9!'-9'#M5\"%M1!'])+%]-\"(--!"
- ")=%\"'=!)%<]!$<M!%M%!&<U%%<M!&,M$%<I!%<E!&,M$+,I,'<-!(<9!&<)%%\\!#"
- "%<5!$,-!(K]'%,)!%+Y!$[A!%;]!%+I!$;Q\"!+M%%KE#&KI($[A!&[=!'+=*%;5\""
- "\"[5!#[-!$K)$$[)%#[%!\"[!!$:M$#ZY!%JQ!%*I#&JM)#JI!\"ZI!#JE!#J=!#Z=\""
- "&J1#$J5!#J-!\"Z%\"$*)#\"*1!$I]%&*!$\"YE%%J!&\")Y%#9Q!$IA%#Y9#\")E%#YA&"
- "$9%&#))#\"Y%&')1+&95!#)1##Y=##YA##YI\"#9I!#9A!%IQ)#9Q$$9U!#IY!\"*!\""
- "\"J!'&Z%!#*=\"\":-#'J=&$J)\"#*9\"!Z9!#Z5\"%JM!&*E#$:E#%JM(#JM!#ZU!#ZY!"
- "$+!\"$;)#%;%'$[-%$;%#\"[%!#+!\"#[=!%+9\"$[E!%K1$&[A!%;I\"%[I!!KM#$+Q!"
- "%+M!%+Y!%L%#',!!%L!##,%!%,1!%\\-#&<9!%<5!$<9!$L=#$\\A#%<5!'\\I')<9)"
- "%<M!%\\U#)<U2'<Y$%<Y!%M-!&M-!%M%!(-),&M-%%M1!&]1&&-)#!-9!(-=+'M9$"
- "&=A$%MA!$ME!&MU$)=Q!$MU!&]Q!%]Y!'.!!(.!%#>%!%^%!$N%!%^-!(>)!&>1\""
- "'>9!$^5!'^=((^=\"(N=!\">E!&.M!&.I!&.9!&.M!&.M!&>Q!#NU!+.Y1%NY)$^]!"
- "$_!!'O)&#O)!\">]!'O1&&?-!#O)!&.Y!)/-!&?=!&?%!'_I!'O1!%/5!(O5$'O1!"
- "&?1!'_5!*O5-%/A!&?5!%/5!'O5&%/5!'_9!'O5&%/-!&?1!$_5&&?1!%/9!&?%!"
- ")/%(&?1!$_)!&?)!#N]!'/!$&.M!&?!!&.Q!'>]&$^Q!).Y!'>U!(.E$&.A!'>Q!"
- "+>=\"&.A!&.=!&.A!'NI'&.9!&^9%&>)('.)!&N9#&.-!%^%!$N%!'>)!\"-]!'MM("
- "'=U\"%]U!%]Q!\"-I!'MM(%]U!%ME!']=*$M=!%]5!$=-!&]9&'-1''M-$%M9!%M!!"
- "%M-!']!+%L]!'<Q)$\\U#(\\I'\"\\M#$<I!%<5!'\\I\"%LE!%<=!(\\9\"%,)!\",%!%,-!"
- "%,-%#<1\"%\\!((L%\"$K]#%<!\"%+U!%KQ#$+Q!&+=&![E!%+=\"%K=($[9!$[9!$KA#"
- "$;1\"$+-\"#[)!%;%'$+!\"$Z]-![!!'JU%#ZU!&:Q($*A\"%J9&\"ZU!#JE!!ZE$&*9#"
- "!Z5!$:%$$:-!$:1##J-!#Z)\"$9Y$%:-%#YQ#')]&#YE##)E#$IU%#IY!$)A$$9Q!"
- "#I%\"\"Y)\"\"91#\"I-!\"Y9\"\"I9!!YA!#Y=#\"I5$$)Q#$)U#%)M($IE)$)Y##IQ\"$YQ'"
- "$*!#$J)%!*1$&:1\"\"Z-!$:1!\"Z5!%*=&$:5##J=!#JE!%:Q(#ZU!\"Z=!$:Q$#*U\""
- "%JQ!$JY!\"K)#%K!($+)&$[-!#[)%\"[A!%K9$%KA$$;I\"%KA$#[I$';I&&+M!$[I!"
- "([Q)%+Q!&+Y!'K]#%[]$!L%#%<1!&<5!&<=%&<=!%L5\"',5$$\\9#'<A*&\\E\"%\\M#"
- "&<M%$LA\"%<Q!%,U#'M!/',]'#,])#=%!$]%#%M)!\"--!%]1\"&]1&$]1#%M=!(=A'"
- "(=I!&]E%%M9!(-M&%]M!%]M!%]U!)>%%)M]!$M]!&M]$!-]*%^%!&>-\"%.-\"&^5$"
- "&N1#&.E!)>9*(>-!&.9!&.I!!>E\"&.=!&>I!'>I!(^Y!&.I!'NY'$^Y!(_!'&.Q!"
- "$NU%$_!!&>U!$_!!$_)!%O)#'O-&#O)!&?-!&?-!&?-!&?9!'_1('/-)(_!!&?-!"
- "'O1!%/5!'O-&&?-'%/-!'O5&\"O9!'_1!&_1#&?)!)/%(&?1!&O)\"'NY!'_-'&?%!"
- "'_1(&?!!&?%!&?)!&O1!'N]!&.]!&.U!(?!)&>U!).Y!(>U*)^I!&NM\"'^U'+NI("
- "$^E!(NA!(N=!&.9!$^9!&.9!&.5!&>1\"%^-!'>)'%]Q!%^1!'M])%^!!%.9\"#>!!"
- "'-U!%ME!#]I\"&]M!)M9#'ME.&]A!%M1!\"-1!%M9!%]5\"'-1'%]5!&=)$#=)!&M%!"
- "%M%!'-)'(,Y,&,Y#(,Q1#,I%%<M!#LE\"&<E%),A#%<9!%<5!&<A!%\\9#%[]$#<)\""
- "%<)!$\\%$%<!!%+U!%+Y!&+]%$[I!#[A!$;M\"$[E!\";E\"#[A!$[5!#[9$$[9!$;-#"
- "$+1&%+!&&+-\"\"[5!$ZU!#ZU!%*M'#ZQ!$:U$%JQ%$:Q$%*I#&*E$\"ZE!#J9!#J=!"
- "#J1!#J-!$Z-*%*%#&:)%%:%(#J)!$9]!$9Y$$9U(%9Q($IM%\"I9!#9=!%)=%&9A#"
- "#9)!$))!#)-#\"I1!!91\"#I9\"#IU!\"I=!#I=\"#9E$$YE'#IQ\"#YM%#9U!$:!$#Z!\""
- "%J5)\"J1!#J!!#J5!#:)#%:)!%J9)#:=##Z=!#JA!\"ZA!%JI!\"ZQ!$:=#(:Q)$*U\""
- "#[!!$[!!$[!%#[%$$+9\"\";5\"$+-\"%+)\"%K1$'K9)%[5!%+M!%[I!&KQ'$;A\"$;M#"
- "$+Y!%+]!&;Y'$+]!%,!!)<1*%,)!%<)!'<)!%,1!%<5!),=2',5$#<=\"&<A&'\\Q'"
- "%LA\"&LY!#,]!&LU!%-!$%\\]\"$<]!',]#&M%%&M1%$M-!%M5!']!!#==!'=5$%M1!"
- "%M5!&-9#(=M!%ME!(]I$&]M!&MY$&]]%%^%!$M]!(N!''N!)).%*%^-!).1)%^%!"
- "&>%\"&.5!#N5!$^E!&.=!!.9!&^A$'>I!&.=!&.M!&.U&&NM\"&.]!&?!!&.Q!&.]!"
- "&.U!'>U!\"O%!$_!!$/%\"'O%!&O-\"&?-!\"?)!'_!('O!!'O)!&?1!+?!1&?-!$O5)"
- "$_)!)/1!&?A!(?5/'O-!#O5!%/5!*?)!'O)!'>Q!*_-))/5!&?)!'?)%'O)''O%!"
- "&?5!(^Q!&.Y!'^Y''>U!&?!!'>Q!,.Y5&.U!%^M**>Q\"&.M!#^M\"&.M!'N='&.I!"
- "'.1!&NE##NE!&.9!&.5!$^9!%^1!$N!!$N-!(>!&'.%%$N)!%^!!*>!)'=Y\"%]U!"
- "%]M!&-U!&-I\"\"MI+%]Q!%M1%(]9.$-Q$%M9!&]5&\"-)!%]1\"&]-'%<Y!#M)\")<Y("
- "$<Q!%=!%']%*%<U!$<Y!),I#%<I!%LE\"$LE\")LE!&,=$%L9\"$,9!&<1!$,-!%L=\""
- "\",-!#L!'#,%!&[U)&<!&&;]!$+U!$[I!$+M!%<!\"%;E\"%+=\"%;5#$[=!&+=!%+1&"
- "!+-!#[%!$*Y\"%K1$$+!\")J]/%:Y##ZQ!&JU!$ZM!\"ZU!#ZI\"$:Q#$JA%#J9!$J9%"
- "$J5!%Z%'#J)!#J-!!:%\"\"Z%!$IQ\"$:!$!IU##9U!#YQ#$YM&$9I(#YE#%)Y'#99!"
- "%9!$%9))\"Y-\"!I1##95$\"I5!$IA##I5\"\"IM!$IE&#YQ##IU!%)U$$9Y!$9Y!$:!$"
- "$Y]'$J%!$9Q!$:%!%:-!$:%!$:)$%JI,$*A&$:I#\"J1!$JE!#ZU!$JM%$JY$#JM!"
- "$+%\"$;!#!;!\"$:Y#$;!#&;)$$+-\"$;1\"(+5\"&K1$$[=!&+E%$[A!\"KE#&[I!\"[I!"
- "%\\%(#,!!'K]'([]$%,%!&KY'&L%\"&,)!!<)\"&\\1#%<5!',M)),=-&,9$%<E%$,E%"
- "%<A!%L=\")LU$(\\U/%<U!'\\M'&\\]\"#M!\"&=-$&]!!'])*\"=9!%M5!#=1!%M9!(=9,"
- "(=E'%M9!$ME!)MI(%]M!&-M\"&-M\"$=Q$%MQ$'MU))=U&#.!$'.%!'N%\"%^)!(.-%"
- "%^)!%^-!&.5!'^M(&.M!(>9+!.9!&.9!&.E!&NE#+.E,&.E!&.M!&.Q!&>Q!&.Y!"
- "&^U$$_!!&?)!&?)!&?-!&.U!$_!!&?!!&.Q!&.M!&^])'O-!&O)!'O9&'O)!'O)!"
- "'O)!#NU&&?5!(_)!(?))&?!!&?1!&O1!&?=!&?%!(?-#&?%!&?%!'.]*)?)\"'?!&"
- "'.Y$#O%!$_!!&?!!'.U%&.Y!$NI%&.Y!&.Y!$^Y!'>M!'>M!'^I#&>E'(NE&&.E!"
- "$^A!'>=!&.E!&>E\"%^%!(>1%'>-&'.-!'>)'(>)&%]U!$.)#%^!!%]Y!'MM$'-]!"
- "&-A\"'-I'%]Q!%]I!&=A$(-A!$]='&-9#(-A+)]E#&M%!&=)$%M)!%M%!',],%<]!"
- "&M-!(<M)%LU!&LY!#,Q!%<=!#,E!%<Q!$,A!%<9*&L5\")<1*#LA\"%L5\"%<=!%L1\""
- "%+])(\\!$$+U!';Q\"'+Y!'[M$$+Q!$+M!%;I\"&+E&&+A&%;A\"$[9$$[9!&+%\"#[5!"
- "$[-!$[)!$[%!%+!*$+!\"#ZY!%K%!$*A#$*U\"$:I$#J9!#JA!\"ZA!#JM!\"Z=!$*9#"
- "\"Z5!$:-!#J)%$J%\"#)Y##Y]\"%YU!$J!%$IU\"$9U$%9Y&#9I!#YI\"%)E%!YI!!YM!"
- "&)9)$99(#9)!\"I-!\"I1!\"95&\"I=!!IA##YE##I=!'9I'$)M$$)Y'$YE$#IU!#IY!"
- "#I]!\"J%!')]&#J)!#J%!#Z9\"$J5!$Z1&\"Z9!#*=\"#JE!\"ZI!#ZE\"%:Q(#ZQ!$[)!"
- "#[!!$[!&#Z]!\"ZY!%;%'&+1*$[-)$[)!%;5&$[9!([9!\"[9!#[A!%+5\"%+M!$+M!"
- "$+Q!);M,%[U$$+]!',!)$,!!$<!\"&\\-#%,-!%,!!$<%\"'<9!&LI&%<=!$,=!$,A!"
- "#,=!'LQ!%LM!&,I$%\\U#&<Y%&]!!%<]!&M1%%<U!#=)!\"-5!#,Y!'M)*'-5'#==!"
- "&==$&]1!%]M!$MI!\"]I$#=A!%]M!%]]!%]]!(M](\"-Y!'-]!%^)!'N%()N%!&>1\""
- "'.-!%^=%&.5!#N5!#>)!%^)!'N1(&.A!&.9!&.M!#NE!&>E\"(^M!&.I!'>U!'.Q%"
- "&>I!&.U!).U'(_%!'NY!\">Y!).Y'&?%!&?)!&N]\"&.Y!&O%\"\"?)!+/%+&?%!*O%."
- "'O)''O)!\"_1\"+O!!&?)!%/-!&?%!)/-!'O1!&?-!)/%-%?%\"'^Y(%/-!&O)\"(_!!"
- "(?!)\"O%!&.Y!'NY!'_!!&.Q!*.Q!&.U!'.E%&>M''NY!'^=('>E!$^E!&.I!%^)!"
- "\">=!$^9!'>9!&.5!%^1!&^!%&>-\"(.9%#>!!'.!!+-]\"%]]!%]Y!(=]!'-Y!%ME!"
- "%]M!%]Q!(]I)%M=!&]M!']5%&]=!$]9\"']9%%M1!%]1\"&M-%%]!\"%M%!%M!!%<]!"
- ")-)0%\\Q\"$<U&%LM\"&<M%&<E%$\\E#%<9!&LM!&<A&&,9$'\\%-%<5!%L-\"%,-!%L)\""
- "&KY#&;Q''+])&+Y%#+U!&+Y%$+=!$;]\"$[I!%;=\"%[A!%K=#\";9\"%+5!\"[5!#+1\""
- "&;%#$+)\"$[!&&K)!$*Q\"$:Q$$*Y\"#ZQ!\"ZM!#*Y\"%JI!%*Q'#JM!#J9$$Z9&%*9&"
- "#Z5\"#9U$$*)&$Z)&'J%#$*%#%*!#$IQ%#I]!#J%!#YQ#!YM!!YA!$)E#!YE$$YM#"
- "$Y%%#Y!$!Y-$#I-%%I)%#)5##)5#$I=\"$YA!#9=!$YA&%)I(#9M!#9U!$IU\"%)U$"
- "$9Y$$:!(#Z!\"#J)!$:)$$*-#%Z1#\"Z5!#J5!#J9!$J=!\"*=\"#ZU!#JM!#JM!%JQ("
- "$ZU%$*]\"\"ZY!\"[!!%*Y'$;!\"#;-&%K5($KA$&;5#%K9$$;=\"%[=!%KA#%KU#%;I\""
- "$;I\"%,!!%\\!$&,)!%K]#'+]%&+Y%&<=%%,)!%,-%*<1%'L%+$,=$%\\A##<)\"#LA#"
- ")\\E0(LQ/'<M)&<Q$#LQ\"']!!$<Y!%<]!&-9\"%M%!%M%!&])'%M)!%M1!'-5'%M5!"
- "%]9&&-=\"&=M$%]E!'=E\"(MI-(=E!(-I!$MQ!%^-!'.!%%]Y!)M]!&.5!(.!%#N9!"
- "(.-%%^-!%^1!$N1!$^5!&.9!&.5!'N=\"'.=%)NA%'.M%'.1!'.I%&.I!&.M!'>A!"
- "&.U!&.E!(?!)'>U&\">Q!&.U!'NY!&?%!%.M!*>]'&>Y!&.]!#O!!&?)!%O)#'.]$"
- "&?!!'O)''O%!'O!!&_%#)^U,'^]!&?!!&/)&$.Y##NY!&O%\"%O%#\">Q!,.]*\"N]!"
- "&?!!'/1$&.]!(_)!$.U\"$^Q!'>U&$^M!&.U!&.E!&^M$#NI!&.9!&.A!&.=!$^=!"
- "#N9!$^9!&.5!'.-!*.))%^1!'>9!%^%!$>5$%.!\"$MY!$M]!$M]!%]U!(-Q!&]Q!"
- "'-U!%M9!$ME!&=I(%MA!%]1!%]-\"%]1\"#\\](&M%*'--\"%]%\"']%*%]%\"&L]&%M!!"
- "%M!!&<U$&,Q#$LQ\"&<I!'LI!#,E!$\\5#%<I!$,=!&L1'&<5!&<9%%;Y\"%,-!#,=!"
- "&,)!%<!\"&+Y!%;Y\"&L%#\"[E!$;M\"%;A\"#[9!%+E!$K=#%K1$%[9!$+-\"$K)$$K%$"
- ");-$#;-\"!+%!![!$#Z]!$+!\"#ZU!$JM!#ZY!$*Q\"#JI!#*Y\"#Z9\"!Z=$#J1!%:5$"
- "#*1\"#Z1\"%Z-'$J-%$:!$$:!!$)Y'$)Y##YQ##9Q!%Y=$#YM#$9I$!YE!\"IA!\"I=!"
- "#I!%#9!\"\"I)!\"I=!\"I=!#9E#%)5+#)Q#%Y=$#9E!$YE'#9I!$)I#%II#$Z!#$IM%"
- "\"IQ!#YI#%*!#$J%&#Z!\"#IY!!Z5!#JA!$J-\"%*9'#J=!$*Q\"%JQ!!:A\"!:E%#JE!"
- "$[)!%*Y'$J]!#[!!%:U(%JY)$;1\"#[-!#[1!#[1!$[E!%[=$%KE$&[E!$[A!'[I!"
- "#+Q!#+Y!#+]!%+]!%+Y!%+]!$,)!&<)*$\\%$&<1!&,1%(L1+&<A!%<=!&<)!&<A!"
- "&<I%'<I$)\\E'&,Q#$LY!%LY!%LY!(M).*,U\"&-%#%<Y!(<]-'-5\"&]5/&-1'%]5!"
- "%M5!&=M(%M=!&]A%%]I!'=M#%]I!&]Q!%]Q!'-M&%MA!']M)%M])&N5#%]]!%N1$"
- "%^)%'.)!%^1!%^)!'.!!)^5!%^1!&.E!'.A%&.9!(NI&&.=!$^E!&N9#&.I!(NI&"
- "&.M!+^I#&.A!'NY!&.U!(.M)#NU!&>Y!&.Y!*.Y,&.]!&?!!'O!').].#NU!&.]!"
- "#_!!'_!(&?1!(^Y''O%!(_!&&?!!&_!#&N]\"*.],'N]!&.Y!#N]!'.Q%&>Y!'.Y%"
- "'>U!'>U!'NQ!&.Q!)>Y)&>A\"&.M!&.I!$^I!&.E!(^E-&.A!&>E!&N5#(>=%'.=%"
- "'.%!&.5!$^E!$N1!%^-!%^)!%^%!$N%!$^!!$M]!%]]!']Y)'-U!&]]%%]U!%M5!"
- "&-A#%]I!%ME!)]Q-$-=$%M=!'-9'%M5!&-1'&M5%&=9$&=-$(=%(&]!\"%M%&(,Y("
- "(<Y)'<U)&,E$%<U!'LQ%%\\U\"%<E!&,5(%LA\"&<9%%L1\"%,1!%,-!%L)\"&<-!$,%!"
- "(\\%(%KY#&;Y&'+Y!$[U$$[Y$&+M)'+E*$K=#'KE,$[9!&[=)&KE('[5*&+5&%K1("
- "\"[9!#+5!#[)!%+!&#Z]!$*Q\"#ZU!!ZE!#JE!#Z=\"$JE!%*E'!*I$#Z1\"#JI!%:5!"
- "#J1!#J)!#Z)\"!Z!!#IY!#I]!$)Y##Z!\"\"YQ%$YQ##9U!&)I\"$)E$#91!\"II!#)I#"
- "#XU!\"I%!#Y!'!Y=!#9)$#Y5&#)-&\"I9!\"IA!$Y5'#IM\"\"Y]\"#9M##J%!%*!'#I]!"
- "&9Y)#9]#$*%#%)Q!$*)#$)U'#J1!#J5!#J)!#Z=!#*A\"&:9(#*M\"\"Z=!%JU!\"ZI!"
- "$*E&$+%\"#:Q\"$;%#$*U)#[%$$K)$$[9!#[9!&;1#%K1(%K9,#+5\"#[A$%;A\"'+Q*"
- "![=!$+U!%[Y(%+Q!&+E%%K]#'L)\"%,)!(<1%&,)!&<1%&L-#%L-\"%,1!%L=\"&<E%"
- "\"<I\"%LA\"%,1!(,Y#',Q(%\\U#%<]!#,U!$=!!',]#'M%%#=)!&-!#%M)!%M5!)-10"
- "&-1#&=E#%]=!&-U\"%M=!%]M!)-9!&MI$%MA!'-U!&]]*%]Y!(N!'&M]$%N5%'>!\""
- "(N),%^%!$N%!$^9!'N-\"$^5!*.=('>5!'.-!&>)\"&.=!&.A!)^Q,(NM!#N=!&.I!"
- "#NA!'>=!&.U!&.A!(>M+'>E!(NU+'^U\"&>Q!'>U!(?!$&.Y!'O%!)>Y##NY!\"?-!"
- "'O)&&>U!&.Y!$^]!&?%!&?!!#N]!'>]&(^Y!'^Y'&.U!(>U%&.U!'NY-+>M3'>I!"
- "%>Y\"&.I&&^Q#\">I!&.Q!&.]!&.I!&.U!'NM!&.M!&.5!&.5!(>M+&.5!'>9!\">5!"
- "&.5!&.=!%^-!$^9!'.)!'.)!$N%!%^%!(-Y*'-]!$ME!'-U&&]Y*%]]!']M$%M=!"
- "(=I!#]E#'-A!&]I%&MA$&=-$%M5!$=%%%M9!\"--!%<Y%(]%!&L]!'-!#$M!\"&<Y%"
- "&-)(&LA&&]%+$\\I#&<I!%L1#%<A!%<1%'<=!%<A!$,)!%,1!&<)!#\\1((\\)'%<%!"
- "$+]!%<!!([Y$';E\"$;M#$+]!\"[A$&[E(#[-!$[E!%[E!\";=\"$[5!#[5!%;1\"#[1!"
- "\";)\"#[!!$[1!&:U$%:U'%:]$%*Y'#*9&#JI!\"*]\"%:E$#JA(#*=\"#Z)\"&:9)$J9!"
- "$J=!#Z-\"#J-!%J-\"&Z-'$:!!%:!%#I]!%9M)&II(%9I\"%)A'\"I9!$)A$#)M\"\"IA!"
- "#Y)'#9%!\"I-!\"9)&\"I-!\"Y1\"#I1%#Y5&\"9=##99!%9E&#YI&!YQ!#9M!$J!%$*!#"
- "#YY\"$9]$!:!\"$Z!#%:!!%:)!\":-\"$J1%%J5)#J)!%*M\"$:E$#JI!\"ZI!\"ZI!%JY%"
- "\"[!!#ZU!\"ZY!$+!\"\"*]\"\";5\"$;)\"%K5(%;5\"#[A!'[1!%[5!#+M!%[=!$[E!%[E$"
- "&[M%#+Y!$+Q!#+U!'KY'%;Q\"'L%'#,!!#;]\"%,1!(,!)%L9\"&\\-(%\\A#&LE&%L5\""
- "&<E!&,I#'\\Q\"#,Q!',A#%\\Y\"\",Y!&M!%(=!$%<Q!%<]!$=!!&=)$'-='$]!#)=%\""
- "%M)!%M5!&]5!$=9!&-A\"#=A!%]A!$=9!$MQ!&]M!%]Q!'-U!&-Y\"'-]&%^%!&]Y%"
- "%]]!&=]#$MY!$MY!%^%!\".)%#>!!&.5!$N1!'.9&$^9!&.=!$N)!&.I!&.E!&.=!"
- "&.M!&>1\"&>I!&.Q!!.M!'/!$(N=!'>U!&.]!'>Q&'>Q!&>]!#NM!&.Q!&NM#'^Y'"
- "&.]!&.]!(^Y!(>Q*(NQ+(^Y!&O)!*NY#'>M!&>M!&.Q!&.M!&^U#*^Y*'>Q&&.A!"
- "&.Q!&.Q!\">U!&.I!&^-%'.I%#^E!&.I!'>5!%^1!'.9&'>5!\">E!(>)&&N5#$^5!"
- "&N)$&.=!&^-%'>9!&.5!#>%!).)*#>%!%^!!&^%%%]Y!'-U!&-Q\"$MQ!%]Q!%-=$"
- "$ME!$M-!)-A&&-=\"%]9!&=A$%M!!)=A0&=-$%<Y!%<]!(-%\"#=!!'L]!%\\Q\"&<Y$"
- "&\\U&$<I!%<I!&<M!%\\9#%LE\"'<=!)\\A+&<5!'<A!%L9\"%L1\"%;]!%\\-#%,%!%K]#"
- "&;]!'+]!%;Y\"([U)$;I\"#;Y\"([I%#[I!%;E\"';A'&+=!$+)&%K9(#[1!%+)&\"[=!"
- "$[)%$;-\"$+!\"#:]\"\";%)#*M\"!:U\"#JI!#ZQ!&*E(#:E#%JQ%%:9!$JE!$J5%#Z1\""
- "#J-!$:5##J)!$J%\"&:-&#Y]\"\"II$#YU\"#9Q!!YM$%)M!!II#$9A%$)=$!II#\"Y9\""
- "#9%$#I%##I!\"!))!$Y-!'95+%91)%I9'$95($9I$$YA'#9E!#YI##YM#$)U##Z-\""
- "#YY&\"I]!%)Y$\"*%\"#J!!!J%*%*!!#Z-%#J9!#JM!\"J)!#Z=!#JE!#JE!&:=%$*M\""
- "%JM%$;!\"$K-$#Z]!$*]\"$*U\"#[!!#[-!#[-!\"[5$%Z]%%[)&%+A!%+5\"%;A\"#KI#"
- "&[E%$KM#'+U!%[Q$$KY#%+U!$[]$'+]!$,%!$<)\"%<%\"&L)'&,=$&\\5(&<1!$<1!"
- "'\\A\"(LA!&\\E\"%<I!&,I#&<=!%LI!%LM\"#-%$&-!#%<]%'<Y-&-%$(])&'-)''=1("
- "&=1$(=1#(=9\"(-9&$]5'']5%#=I!$=E$$]M\"%]M!%]U!&MM$)=U!%]U!'-Y!)N!&"
- "'>!!%^%!#^5\"%^%!\".)!%^%!&^-%'>1'$N1!%N5%&N=#%^-!%^1!(NA!#NA!$^=!"
- "&.5!&.A!'>E!&>E!'>I!&.M!&>I!&.M!'>M!(_)!)NQ%&.U!&^Q##NQ!&.U!&.Y!"
- "'.Y%'.]$&.I!&.I!&.U!#O%!&.U!&_%#,>I&&.I!&.Q!&.Q!(.Q$&>Q!&.Q!)^Q&"
- "#NM!(NI&&.=!(.M)#NI!&^Q#&NA#!N9#)^A!#N9!&>9\"%.9\")^=!'N)('N5(&.1!"
- "&N-)&^-%%^)!%^%!%^!!$N!!+>%)&>!#*-Y$&-]\"'.!!\"-Q!%=M$%]M!%ME!']A*"
- "&-9#%MA!&-A#%]5\"&]9!(=9'$=1!%]!'$])\"#=%!$<]!$M!\"(<Q)\",]!%M!!(,U,"
- "#<]!#\\U#&<E!&<I%$<M!!,A!$L=#%L1\"$,9!%<1!'\\5($<-\"&\\%($,!%%,%!%+U!"
- "%L!'%+Y!([Y-$+Y!%;M\"#KU#$;E\"&;Y!&+M%$K=$%[)!#[1!#[1!$;%\"%+)\"$K)$"
- "&+)&&K!$#Z]!$*U\"#[%!#ZQ!$*Q\"!*M!#*E\"#JA!#ZE%&JA\"$:=$#J9!$JE%$*1\""
- "#J!!\"9]#$Z!&$*%##IY!!*!$\"YY!$9]$%9Q\"$YY##IY!%)E$$YU)#9=!$9A(\"Y1%"
- "#I-%$)%!#8U!#))##91$$I5&!Y5!\"I=!!)5!#YA#$YM#$9I%%YI($)I''9M+&IU."
- "#IY!#9Y'#J%!%Z)##*!&#YU\"#J!!%Z1*#JA!%*9#!*9!$*M\"%JE%'ZM#%ZE\"$ZU\""
- "#ZQ!%JI)#J]$\"ZY!%J]!&K%(&[)\"$K-$#+5\"%;)'#ZU!$[5!$K9'%[A!#[A$#[A!"
- "%;M#%KI#$;M#!+Q!%<!!&+Y!\"[]$'[](#,)!%,)!$<%!%L-#$L1\"&\\1#%<9!$LA&"
- "'\\Q'#,A)&<-!&<M!#,I!%LI\"%<I!%<A!',Q(%LU!&L]&$L]\"']%+%M%!%M)!)-1!"
- "&M%&#=1!%M9!']9!)M=\"#=1!'-I'$MQ!'-U!&]I!&]I!\"=]&%M=!&MQ$(=Y''M])"
- "%]Q!%^%!&N!$%^%!$N!!%^!!&.-!&.%&#>)!(^-.'>1&%^-!&.9!)^=!&.5!&.5!"
- "$^I!$^A!'>A!#^E!&.Q!&.Q!)NU%'>I&$^I!&.M!%NM$%.M'&.M!'>Q!&.E!&.M!"
- "'>Q!&^=$&^M)&.E!&>Q!&NQ\"$^Q!#NQ!&.Y!(NI!'>M+*.M!&.M!'NQ'%.Q!$^M!"
- "\">E!'>I!(^E-(^I'&.I!'^=)&.A!$^=!&^=*%^-!&.9!&.5!'>5!*^5&$N)!%^-!"
- "(.9*&MY$%^1!'N!#(MY(%]U!%]]!$MQ!%]Y!&MY$$MU!&-]!%]M!'-Y!%ME!$ME!"
- "%MA!%M=!$M1*)=I!%]5!&])&&=9$']1!%M)!%]-!'=%)%\\U\"%M-!%<=!',I(&LU!"
- "&\\Q\"%<U!%<M!%<A!'<=*&<=!&<-!&<E!&L9\"%,1!&<1!(,-$$<-\"%+U!&,!!(,!!"
- "%+Y!\";Y\"%;M\"$[Q$#;M'#KE#$;M+&;=&%+5\"%+1!!+=$&+5*$+1!$+1\"#+5\"$[-!"
- "$;-\"#ZY!$[!&!ZY!$*U\"$:U*%JY!#JA!\"ZM!$ZQ\"#JA!$JE!$*1\"#Z9\"$J5!#J1!"
- "#J-!\"J-!#*)\"$*!*#Y])\"YY$#I]!#YU%#IQ!$)Q'$II)#YE#$IE&#Y-#\"I9!#YA\""
- "\"8]!#HY\"#9-!\"I%!\")%\"#9-$\"I1!#)9#!Y9!!)E!#9A!%)I!%)A%$)M#!YQ!\"II!"
- "#IU!%:)%(*!*$IY&!YY!\"IU!\"J)!&*),\"*1!&:5!%J9)#Z1\"$JA!#JI!#JI!%*E'"
- "\"ZI!$:E$$*A\"#[%!#JI!![)!%;%'\"Z]!#ZU!%+=%$+1\"$;9\"%KI#$[1!\"[9!%+1\""
- "$[=!\"[I!&;U\"$,!!&+U!'<)%%[I$&,%!#L!#%,)!%<A!%<)!&L)\"#<5!%,=%&L=&"
- "'\\=\"%,-%$,A%(L=&$<I!%\\M#&\\I'%<U!&M%!#LU\"%<U!&L]&%M!!&]9!!]%$&])&"
- "#]!''M1*%M5!%]-\"\"-9!&ME$%=E$%M=!&]Q%#MQ!'=9-(]M$$MY!*-Q$%=Q$&=M$"
- "%]Y!%]]!%^!!(>!!$N%!'.-!&-]!&>!\"%>-#%>)$)>9%%^1!%.5\"#N9!&.=!&>A\""
- "&.9!&.A,&NA#&>A\"'NI'&.9!&>Q!#NE!&NI\"'>I!'>I!#NE!)>I$&.Q!&.M!&>I'"
- "&.]!)^I!(.M$(.I)&.M!)>M$&.A!'^Q\"&>Q!&.M!&NI\"&N5#&.I!(.I$&NI\"'.A%"
- ").M3&.E!#>A%#NA!&>=\"%^-!*^A&)>9%&.9!'.-!#N1&$N1!&^5$%^)!%^-!\">)!"
- "(N)'&.%!%^%!$N!!#=]!%^!!$MU!%]U!)=]%%]Q!%]E!$=9!&-A\"&]I%%MA!%M=!"
- "&M9%']I$(-50&]5!'=5($-1$%M-!'-)#$M)!'M%%&M%&%]!\"%<]!%])\"&]5!$LQ\""
- "$L=\"%LQ!&LE&%LE\"%<A!(<1!',I#'L5+'<5*%,1!&<9!&,)%%L)#%,%!%,%!&L%'"
- "&+Y%&+]%%KU#$;U\"#+M!&+Y!%[E$#KA#%;5#%;E\"([9!&;5+%K1(%[)!#+)\"%+-\""
- "$[%!$[!!\":]\"'ZY'$:I$#ZQ!#ZI\"#ZU!%*A'%*A#%*A'$ZM%#J9!$Z5\"!Z5!$J-%"
- "$JA%%*%'\"Z%\"#J5!$9]!$IY&$)U#%)]'%)Y$$9M$%9I)#)I\"$YA!!Y9!#Y)##95$"
- "\"Y!\"$)-'$9%#\"Y%\"#9)$\"Y-%%I%(#)9##9-$#99!$)=$$)E##YE\"$)M$$9I$$9Q!"
- "&9U'%9U)#J)!#J)!$*%#$:%!#J5!#Z-\"!Z9!%:9!%J1\"#J=!\"Z5!#*A\"\"ZM!$JE%"
- "\"JM#$*E&$*I&\"ZU!#[!!$JY$#[%!#Z]!\"[%!#[-!$[1!\";1\"&;9'%[=%$[5!%+=\""
- "&K9(&[I!$[=!$+M!$+U!#KY'&,!!$+Q!$+Q!(L%'%<%\"&\\)#%,-!&,-$%,1!$,1!"
- "&<9!$LA\"'LA&$\\=#$<Q!&\\Y!$<M!#,Q!)<Q)%\\U#$<U!\",]!',]'#]!#(M%*'M)$"
- "&LY&%M-!$=1!&]5!(=5'&-=\"&]1!&-A##=A!$]E\"#=E!%]I!%]M!&=E#'-]!'.!!"
- "%-Y\"%-M#&MU)']])'>!!$N%!%^%!%^-!(>%!#>!!%^)!&.5!%^)!'>A!%^%!'>A&"
- "%.5\"&.=!&.A!(>I+&.=!&.=!'NA\"(NA!#NI!&^I)$^E!&^E$%.E!*>I\"&.Q!&>E\""
- "&.U!&.I!&.I!&.Y!(^U!#>I%&.I!#.M)*NA*&.I!%^1!&.E!&.A!%NE$$^E!'NA\""
- "&>E!*N9+&.=!(>E+%^=&'N='&.5!&>1\"&.=!&.5!$^9!'N1((>-!&.-!(>!,\".)!"
- "%N%*&.%!#>-!$M]!%]]!%]]!%]Y!'-U!$MM!%]Q!&]M+$MI!%ME!%]I!%MA!%MA!"
- "(=E\"%M9%&M1%'-5'%M-!&]1!%M!!%])''-%''=!$%M%!%<Q!',Y#&LM&\",E!%LQ&"
- "&,M$(LA!%<I!&,I#&,=$%\\A#%\\9($\\)$'<=%#<1\"%L1\"&,)!',)%$<%\"%[]$%[U$"
- "%;U\"%;M\"%;Q'%;Q\"%+Q!$[I!([I%';9,'K9$%[9!%+%\"%[E!\"[1!\"[-!%[-!$[!!"
- "$+!\"%J])!*Y!\"ZY!#ZY!#[!!#JI$#JI$#JE!#*9\"#JE!!:Y)#J=!$:1'$J1\"&:--"
- "#J)!$*%&#J-!$:!$%:)!!Z!(%9I\"$IY)$)M$#9E!$II%#YI##YA\"!Y=!#Y=&#))#"
- "$Y!%\"(U\"$(Y$#9%!\"Y)\"#)-#\"I)!#)9#\"9=#\")1\"#YA\"$)5$#YE\"!)I!#IY!#J%!"
- "#II\"#Z!%\"J!!%)Y(\"J)!$:%(#Z)%$Z1&%:1!$J5%$:)$&:9)#J=!!ZA!#*=\"!ZI!"
- "#ZQ!#JE!%JQ)$*U\"\"JY$#ZY!#[!!#*]!$+5!$*]\"%KA#!+)$#[%!$;=\"%;A\"$[9!"
- "$[A!%[=!&+I%#[E!$+Q!#;Q&%KM+)+])&;Q\"'K]'&<-!#L5#%,)!$L1\"%<A!$L-#"
- "+\\),&L%\"&<A%%LA\"&\\E(#LE\"$<I!(,Y\"'LQ!&,Q#&<Q%$]%\"%<U!%<U!%]1\"%M%!"
- "&])&*--!&--#'=1$%M9!\"M9#&]9+%=E)&]E%&=A$$ME!&]I!'=I\"#=U!)=U!%]Q!"
- "$MY!%]U!'-Y&%]]!*>!%(N!\"%^)!%^1!(]]-%^!!(>%!%]]!'.1!%^-!&.)!&.5!"
- "(.E)&N9#'>9!&.9!&.A!'>A!)N10'.=%&.U!&>E!'^E\"&.I!&>E\"&.M!'^5#&.I!"
- "$^=!&.E!&NI#(NE!&.E!(.E*(NM!'N=!&.E!&.M!(^M-'>A!'>E,#NA!(.A$&N=#"
- "(N=,(N=!(>=&&.=!(>1!&.5!'>A!&.5!%.1\"&.5!&.-!&.9!%]Y!%^-!%.-\"'.%!"
- "(=]!&>!\"'-Y!%]Q!)=Q0(N-'(-M!'=Q\"'-E!&=I$%]E!'MI(%M=!'-9\"\"ME\"$]9\""
- "&-9\"$=5!&M5%$=1!&-%#$M=!'=)(%]!'\"=)!'=!$\"]-$%M%!\"L]#&,]#'LQ&*,U!"
- "%<I!%<U)%<5!&,E#!,9!$,1!(\\9\"&,%%'<1%%,-!%<%\"#L%#'<-!&K]'#,)!%+Q!"
- "'KU(&L!'%+Q%$[M$%+]!#[5!$[A!&;9'%K=$$[E!$K=$#[9!$[-!%+)\"%K)$$+)!"
- "#[!!&J]!#ZY!#Z=\"%:Q$#ZQ!%ZM\"&:I(#J=!#ZA!#J=!#Z-\"$*=&#J=!#J-!\"J-!"
- "$:)!&J%#(*!*#9M!&:!,!J1##YI\"$)Q#$9Q!#IM$%9=*#I1\"#9=!!Y9!#)9##95$"
- "#(]##(]#%)!%$9%%!HU!\"I-!!Y1!#)-#$91%#99!#9=!$IA#$)A#$)E#$YM#%YU*"
- "$9Q%#9M!%)Q$#)Y\"#J%!#)I%%*1'\"Z%!$J1\"$J9%#Z1\"#J9!%Z9*$*A\"$ZE\"%JI!"
- "%ZI\"#JM!%JY(&ZQ\"#ZY!#J]$\"ZU!%ZU&#[%!#+1\"#[%!$K1$#[5!$[-!%;9#$[=!"
- "%+A!%;I\"&+E%&+E!%;]&&[Y,#+]!&+M!&,%%(K]'%,%!#,%!%L-\"&<!\"%,-!$<1%"
- "%,%!%<5!&L=\"%L=\"&\\E\"$LM\"\",E!%LE\"'LQ!'LQ&&\\]\"%\\Y\"#,Y!%<]!&M!!&L]%"
- "%M-!#=)!&M)!(=-('-1')-5&%M9!&]9!#=A!&-A\"(=9\"%]M!%]I!\"MI\"#=M!&=Y#"
- "\"-M!&.%!%-M#%]Q!+=]$%]U!&-U\"%^%!%^)!%]Q!$N1!%^%!%^-!%^-!$^%!&N1#"
- "&.9!%^-!$^9!(N9!'>A!(^).(N9!&.A!%>%#&.5!'>E&&.9!)>=$%N5%$^5!&.M!"
- "%^A*&.A!&.=!&.=!&.A!\">=!&.=!'NA\"'>A!+>A(&^A$$^=!'^=($^E!&.=!%^9+"
- "*>=#'.1!(>5+$^5!*.=('.-!%^-!%^1!%.1\"$>!%'>-&\".1!%^%!%^!!%.%\"$M]!"
- "(.%%&=]#'.%!'=Y(%]M!&]Q!'-U!%]I!'MI)%]I!&=M$#=M!&-A#%]5!$==%#=A!"
- "%M9!&-%$)]1*%]-\"%M5&%M%!(-)\"(=-('-%#&M!&%<E!%<Y!%\\U'%\\Q\"&<=%'LU%"
- "&LQ!&<E!&\\E'&<9!&,1%#,)!%<9!&,1%'<9%'<5%&,-%$<)!\"+Y!(+Q!'[]$%[U%"
- "&KI(!KQ'#[9!%KU#$[E!%KM#%;A\"$;A\"%[1!%;E\"(+-#%+1&$K5$%+A%#[!!#[-!"
- "'*]'&+%\"$ZY%%ZU\"$ZU%\"Z9!$J9!!*I!%:I$$:A#$:1#$*A#&J-\"#Z1\"#Z-\"#Z-\""
- "\"J%!\"IY!%J%&$*!#$*%#%IY\"&IA!#II!$)M#$)Y##I=!#)A#$)='#)9##)5#!Y1$"
- "$HY&#HY\"#XU!$))%#Y5#\"I!!%(]&#I)(\"I9!#Y9&\"I=!$)5$$)M$$)A$#9I!%YI!"
- "#9E!#*!\"$9]!%9U)#J!!#)]&$*!##Z-\"%J5)!*1%$Z5\"&*-%#ZA!#:E##ZA!$ZI!"
- "#JA!$*M\"#:U##ZU%%:U'!*Y!#Z]!#[!!#[!!$J]!![-!%[1!![!!$+=!%;=\"%;9\""
- "$[I!(+A!&+M!%KI#$+M%%+M%$[E!$[I!%K]#%;]!%L!#!,)!#L!#\",!!$\\1#%,1!"
- "%<1!*<9$%<=!%LM\"%<A!!,E%)\\I&%LA\"&,M#&\\U'&,U#&,]#%LY&'<M$&]1&%M!!"
- "&M-%%M%!$<]!&]1!&LY!%M5+%-=((-=!#M9\"&=-$'-A\"'-=\"#==!']9!'==(&=M$"
- "(-M+%ME!%^)!%]U!+MU%%]]!'^!$%]]!%^)!)N!!)^)'(>)!(>%!%^-!(.-*&.-!"
- "&.=!*.E'\">5!%^1!&N1#'.1!&.1!%^-!&>9\"&.A!&^=$'>E!&.9!(>A+$^M!(NA!"
- "$^5!&.A!'>9!'>9!&.9!%^%!$N9&$^=!'>5!$^=!&.=!&.A!'.=%&.9!&.9!&^I$"
- "#N5!&.5!%N1*%^1!$N-!'>)'\".-!&N-#&.E!(>)+&^)%%^%!&N%$%^!!&^!%%]]!"
- "'-]&%]Y!&-Y!&-Y!'-U!(-Q!$MM!%]I!#=I!&]M!&M9%&ME$&M9%&]I%'-9'%]=!"
- "%]5!$M=!)-1&%M-!&=!$#=!!%M%!%=!%%L]!'<]#$<U*&<M!%<U!#,Q!%<M!&LM!"
- "\",M!\"<I!%<A!$,A!$,9!&,5%%,1!'<1*#\\=#%<!!'L-+%,!!&<%%%+]!';E&);M'"
- "%[U%$;Y&'+M!&;I\"#[A!%[A-%[=$$[I!%+=!$+9!#KA'%+-\"%;1\"#[)!#;9\"$K!$"
- "%ZY*'*Y##[%!%ZU&\"ZQ!$*Q\"&ZI'#ZE!!*U$$JA!#J=$#Z%\"#J-!$J-!$:-!#J)!"
- "#J-!#J)!$IQ&#I]!#IY!$IQ&#9M!&)M\"$)M&#I=\"#)A#$I=##9=$\"Y=%$91(!Y9!"
- "\"(U\"\"I!!!H]!%(]\"#I%\"\"Y-\"\"I5!\"I=!#Y9#\"Y9\"\")9%%I9#\"I9!$9Q%%)I!#9M!"
- "$9I%%:))$Z%&#9I#'9U+#J!!#*-\"$)Y##Z%\"#J%!$J5!%J9)$Z-\"$J=!\":A\"\"ZE!"
- "#ZI!$JE%$JM$#ZU!$*]\"#ZY!$[!!%K!)$*]\"$[!!$K!$![-!!*]!%;=&&+)\"';9+"
- "%;=\"&[A$%+E%%KQ#%[I(&KM'(+Q.$+U!$;Y\"';U+#K]#%,!!%,%!$,)!%,1!%L-\""
- "',-$&,-%$L=\"%L9\"&\\A#%<A!#LI\"\",]!#,A!%<M&!-!!%<Q!'<U)%<Y!&]5!%<M!"
- "'<])(=-'&=)$&=-$&]1!%M9!%M9!']5!\"-=!*=5!%M=!'-I'&ME$%]M!&-9\"%=E$"
- "(]U.%]M!#=Q!(=Y!&MQ$&]I!%]]!$MY!$M]%%]I!&.!!%>)#$=U%).%$'.-!&>)("
- "%^)!%^)!&.9!$^9!)>9%'.-%'.)%$N5%#>1!(N9!(N5!&.E!&^9$&.=!'NI''>9!"
- "'N5()>1*$^=!&>9\"#N5!%N9$&.5!(N9!,>A,'>5!&.9!&.A!(N5!#N5!\"^1#\".1!"
- "&>5\"&.A!%^%!%N1$(NA!(^-#$^%!'^)*)N%&#M]!)>%*&.-!\"N!\"(MU-%]]!%]Q!"
- "&-Y!%]U!%]U!%]Q!%]Q!$MI!&MU$\"-I!(MQ($MI!$MQ!&]Q%%=A$%]5\"'-9'&M=$"
- "$-1$&M-!%]5\"&-%$(])!%M)!&-!(&LU!%<]!%<Y!%\\U#)LU/&LU&%<M!%LM\"',=("
- "#<=!$<A*&<5!*<A-%<9!$\\A#$\\-$$,-!$,%!!,!!#+U!$<!\"&+]%%L!,(+Y!%[U$"
- "%+Q%\"[I$&;I\"%+I!%+Q!&+A\"%+=\"%[5!%+1\"$[5%%K1$&+-\"$[)!$+)\"$+!\"#[!!"
- "&J]-$JY!$J]!$JQ!#JQ($*M\"\"ZA!&:M,&*I##ZA%$J9!#Z%\"\"J1!'J5##Z)\"!J)&"
- "#IY!%*!!$)]##9Q!$9E$#9U!$)U#\"9M##9E!%YI+!IA&#99!$)9$#)1#%)%&\")1%"
- "\"8U!#(U!\"I!\"#Y1##Y%##Y-)\"I-!%9%#\"I-!\"YE\"%91&$I=\"#Y=#\"9E##YQ#$9Q!"
- "#9M!%)U!#YU)#IY!$)Y##J!!#*5\"#IQ\"(J!,#:-##J!!$Z5&#Z=\"%:=!%:9!#ZQ!"
- "$:E#%JI!$JM$$:M$#ZU!':U$&*Q'#:]#$;!#&+9*!;-&$[1%$[5$&;-(#[)!&+9&"
- "#[=!$[A!\"[A!$[A!#[I(%+A!$;Y\"\"+I!%[U)%;Y\"%+]!$+Y!'\\!$&\\%$%,)!%,-!"
- "',9$&<9*#L9#&<9%%<=!%<=!%LI!$\\E#&,M$&<I!(<M$$<Q!%<M!'LQ%%LM\"&\\]&"
- "&M!!%M!!'-%#%M-!(-9&$=5!&M5%%M-!%M5!%]%\"%MA!!MA#&-=#(-=!%MA!%MA!"
- "%]I!'MQ((-I&#=M!%]Q!%]U!'-U!(]Y##=Y!%]U!(=]!'.!!&>%\"&>%\"%^%!%.%\""
- "\".!!%^1!$^9!(N9!'>1'#>)!&N1#'.9&'.1!&N1#*.93%^)!$N1!%^1!'.1*'>5!"
- "%^1!&N-$&.5!&>I!#N1!&.5!&^9$&.A!&.5!&.5!(N-'&.5!'>1''.1!).1)'.1!"
- "%^-!%^)!%.1\"(N5,&N5))N!!&.5!$N%!%^%!&>%#(]]-'M])%]]!%]]!&-Y!(]Q("
- "&^%%%ME!(]I)$MY!'=]!'MA$%M1!%ME!(-A!%MA!&-9\"&-9\"'M1*%M9!%ME*$M5!"
- "%M=!&]-&%<]!%M-!'=%)\"\\E$+-!+'LQ!#=!!%\\]\"&LU!#LQ#'<M%&,I#%<I!%<5!"
- "%<I!%L=\"%<=!(,9)&<5%&,A$%<1!&,1%%<!\"%<%\"&,)%%L%''+]!&[Y$$[I!$KU'"
- "&;Q+$;M\"%;I\"%[E!#+5%%[9%'[=*%+-\"(+A/#;1\"%K-$$+)!%+-&&[%&$+)\"$*]\""
- "#*I)%JU!#ZQ!!ZQ!$JQ!#JI'$ZE)$JA%$J9!#Z1\"#Z)\"%Z5\"%*1'#Z-\"$:)(#Z!\""
- "#J!!#J-!$9]$$YM'#9U!#IY!#)M\"#IM\"&9='%9A##I5\"$II##)M%#I5%\"I-!\"I1!"
- "$8Y&&HI*\"H]!\"(]\"$)%$#9!%\"I-!$Y1$#I=%#))&#Y1##)=##IM!\")A%#YE##YI%"
- "#9M!!9I\"#YM##J%!$)]#%)]'%9](#J)!$J!\"%*-'\"Z)\"$J%%'I]$%*9&\"J=##ZI!"
- "\":E\"%*I'%:A$%Z9\"$ZA\"$JM!$JY!#Z]!$[!)%*Y*$J]$#[)!#K9$%[=$\"[E$%[9!"
- "&[9!#[=!';9#$[E!#[9!'KU#%;M&\"[Q%%;M#%;Y\"(\\!$%,!!%<!\"%K]'&\\5-&,-$"
- "$<-%%,)!&,9)%,1!'<E%*<1*%LM!%,5)%<E!$<M!&LM*%<M!%\\]\"$L]\"&\\U\"%\\Y#"
- "%\\Y\"'-!(%<U!$M%!&-%$(]%*'M5)'-1'(M-$$=9!&-9\"&M9%&MU%(=M,&-A\"#=M!"
- "%M=!$]I\"(-M&%MA!(-A!(MM('-Q&#=A!'-U&&=M$%-Y\"(=Y,'-Y!$MU!$N!!%^!!"
- "%^%!'.)*).5$$N1!&>%#&>)\"&^5%%^-!&>-\"%^-!&N-#'^!$(>1!'^-#'.)!\".1!"
- "%^1!'NA''^)*'>5!&.5!%^1!&N)#'.1!$N1%%^)!$^5!&.9!\">E!$N-!-N-(&.5!"
- "%^1!#^)\"'.)&&N-$'.-%%^)!%^1!(N!'\"-]!!.%!%]Q!&-]!$MY!)MI,$MY!%^!!"
- "&-]\"#MA!$MM!%]M!%]M!&-I\"%]M!&=I$$MU!'-A\"'M=)&-9\"%]E!&-1,'=)($=-!"
- "'M-$&M!&%M)!%]5\"#=%!%<]!(=%$%M!!%<]!%\\U#&LU!&LM*'<9!%<I%$,A!%\\=#"
- "%<A!',=#%<9!'L5&%<E!%;]\"%,1!&[]$'L5!&,!%'<%*%L%#&[Y)'+Y!%;Q\"%+]%"
- "';U!%KU#%[E$#[E!%+A!%;E\"%[=$&;5\"$[5%$+1\"'K-!#+!!$K!$&;)'$J]$&JQ!"
- "!ZM!&JY,$*Q\"#ZQ!#JI!%JI!#JE!%*A&$:9$$:-!$*5\"%*1'$J1(#J-!#*-\"#*%&"
- "#YY\"!Z!!%*!!#9U##IU!&)](\"IM!%IQ)#9U!%Y=,#I=\"!)I!\"I=!\"I5!#IE%%)-("
- "#8Y'$HY##HY\"#)%#$)!$#9%!\"Y)\"#9-!!Y1!\"Y)\"#IM!\"Y5\"\"95#$YA&%YQ$%Y9("
- "#YI##9M!#IQ$\"YU%$)U*#Z-\"\"J!!#9Y$%J-\"#J1!\"Z9!%*1'#Z5!%*=#$J9%!ZA!"
- "#J9!#ZE\"#ZI!#Z1\"#ZI\"#ZI!\"Z]!#Z]!#Z]!$+%\"%;%'$+)!#[)!#[-!%K9($+5!"
- "&;-$%[=!$[E!%;M\"$[E!%[=!#[I!&+Q%$+Q!$;U\"%<%\"&K]'#,%%%\\!#%\\%#&,)!"
- "&L1\"%,-!%,)!&L5'%L1\"(L=!$,=!#<9\"%L=\"$\\E($<I&),U\"%L]!%LM\"%<Q!$<Y!"
- "$<U%\",]!#M!'$=!!(M=.%])\"%L]!&M)!%M)!$=1!%M5!$=%!$M!\"#-1$&=A$#]I\""
- "%ME!%ME!)]Q(%ME!\"-I!#]E#'-M&%]Q!'=U'#=U!%]Y!&-Y!&]Q!\"-Y!&]]%$N)!"
- "&>!\"%^!!%.)\"$>-$)>!%%^-!(>!!'.)!#^%\"'.%!%^1!'>=!(^%(%^)!%^-!$^%!"
- "(N%,%^%!&>1\"%^1!&N)$&.9!(>-!%^)!$N1!&N)#*^1!).1$%^-!#>-!&.)!(>)%"
- "%^%!,>9'(^%#'-Y!).%$$.%#%^!!(>!!&-Y!%]]!(=U!%]Y!&MY$$]U&%^)!'.!&"
- "&=I($MI!%]M!$ME!#=U!&]E!%M=!$MA!$-=$']5!%M9!'=Q\"%]5\"%M-!%M1!$]9\""
- "$])\"#=%!%<]!%<Q!%M!!$M%!&L]!'-!'%<Y%&<Q%'\\E#%<I!%\\A((\\E'%<E!%LA\""
- "$<5!%<9!',=-$,%%%L1#&\\-(&<1!&[])%,%!&\\!$%,%!&+]%(+]%&+I!%+Q!#[I!"
- "$+M!'[M%%+M!$KA#%+=\"&+U%&[A)%[-!$;=\"%;-'%+1&#[)!$+)\"%+!\"#ZQ!%JU!"
- "!*Q!&JU!#JI!#ZM!#ZE!$*Q\"#:9##ZQ!%J=!$J9!#J5!\"Z%\"#Z5!#Z)\"$9]!#*%&"
- "!9]\"$9]!$YU*%)Q'\"9=#$9U$#9M!%9I)$)E$#99$\"I=!#99$!)='\"95#\"Y-\"$Y-$"
- "#HQ\"#(U##8Y$!)%!$Y!!#9%!\"I%$$)9!#I-\"#Y1&\"I5!#)1##))&$Y9'$)E#$YI$"
- "$YA$#YI##YQ##IU\"&IQ*$*-#%Z%##I]!#J-!\"Z)%!Z-!#J1!#J5!'*-!!Z5!#J9!"
- "$J9!$JU$$Z=\"#ZE!#JM!$ZU%\"ZU$$ZU%#Z]!$[5!%*Q\"$[%%#[-!$ZY%%K1(\"[5+"
- "%[=%\"[5!%+9\"\"[9!%+U!%;E\"$[A!%+E%(K]'%+U!%+]!%+U!&[]#%+M!%\\%$%L)#"
- "&L)'%,-!$\\!$$\\1#&L5&%<9!%<E!%L=\"#LE#%<E!*,E\"#<E!%<M!(,I#&LI+%<U!"
- "#,M!%\\U#%<]!%-1$']!!&=)$&=-$$-)$%M5!\"=I!%=1$&M1%#M5\"#=M!*=5'']1!"
- "(=5#%]A!%ME!&-A#%]I!$]I\"$MM!$MQ!&]Q!\"-Q!%]U!&N!$'-Y!&-Q\"%.)(%]]!"
- "&-Y\"%^%!'=Y'%^!!#>!!%^)!(^%#'.%!$N)!%^-!%^)!'>-'%^-!&^)%$N-!&.5!"
- "#>)!&.)'&.5!%^%!$N!!$N)!%^%!'^-$%^-!$N-!%^-!$N)!&N5(%]]!%]U!%^1!"
- "%^)!'.%!'.!&*^!!'>!''.)!%]U!$]Q!&-Y!%M]%*.!)&]Y%'.%&%]Q!'-Q'%]I!"
- "\"-I!#=E!%]A!$M=!$ME!%M9!%-A('M1)$-A$']9!*-5&%M5!#=)%\"-1!%--$%]%\""
- "'=)$%]%\"$=-!',]'&LQ&&\\Q&%M-!%\\U#$,M)%LM\"&LQ!%LQ!%,A$%<Q!'\\E+\",E!"
- "#<5\"%\\9#'L%,$<5!%L=\"%,5%%L5#&+]%%\\!#$;U''[]#%K]##;U\"%+U!#;M\"&+E*"
- "%[I,%K1$#+M!&+A\"&;A&%+-\"$K5#$[5!#[%!!;-&$[!!#ZY!%;5&$;!#![%!$JU!"
- "$JY$#:U##JA!%Z=&%:I$\"ZE!&ZE*#J=!%J=)$J1%%:9!$*1##J!!#Z%\"$J%!#*!#"
- "$:!+$)Q#%)U$%)U(%9Q(\"IM$%)A$$9I%$)=$$)I!#I1(%YA+$I-##)-##Y=&$9I("
- "$XU$!(U!#(Y#\"9!#$)-'#9!!#(U!#)-##I)\"$9-\"#Y-&\"Y9\"#I=%$I=&#9M!$IA#"
- "\"II!$)=$$9Q!\"9I#$IU%!YY$$*!##J!$!)]!%:1!#Z-\"$:=##:9&$J9!#Z9\"\"J=#"
- "#ZA\"#ZA!$ZI\"#JE!#JI!$J]!#*U\"'JU%#ZU!$[!!'+%'#[9!$+%\"$+)\"#[9$!;1\""
- "&K1$%;5\"%+9!%[9!#;A\"%+M!%KI#%+Y!%+=\"#;Q\"#+U!%+Y!%+Y!$+U%\",)!&,!%"
- "%,!%%L)\"$<-\"%L)\"\",1!)<5%%\\=#&<=%&\\9#'<5!#LE\"&<9!%<M!'LI!%\\Q\"%<]!"
- "%\\Y#&LY!%<U!&M%%(\\Y&&]!'(]%!']%!(M9$$]1'&]-!%M1!$=1!&-9#%M9!$=5!"
- "%M=!,-E(%M=!(-E!%]M!%]U!)=I!$MU!$MY!#=M!(=U'$]Q\"'=]'&M]$'-U!\"-Y!"
- "%]M!%]U!%]]!%]]!'=]!\"-Y!*^!!%^!!!-Y!#>)!$N%!'.%!&>-\"%^%!%^%!%^%!"
- "%^1!%^-!&^!%'N='%^%!#^)\"(^))$N%!&N)#'.!!(>)!+>%)'.)%(N5!%-]\"%^-!"
- "(N!(&>!#'-]!%]Q!)M]2'.!%%]Q!&MY$(=Y!%=Y)$]M!'=I((-Q!+-M('=M#(-M!"
- "%]U!\"MQ\"(]E/%ME!%MA!%MA!%M=!(MA.%M1!&]5!$--$&--#%M)!'=%$%]-''--#"
- "%\\Y\"%-5#%M!!%M!!'<Y)#LY\"%<U!'<=%%<I!$LI\"%\\Q\"&<I%&,E$%LA\"%<=!$,=!"
- "&,A$%L5\"#,1!$+]!%\\-#%\\)$&L5\"(,%)$;]\"%K]#&;]!%+Y!&+U%$KQ#$+M!%+M!"
- "%[I$$;M\"(;M#&+=&&+5&&+9!$[5$$+1\"#[-!#[!!$+)&%[5!$[!!%*]\"$J]!%JY!"
- "%ZY%$JU!#JM!#[!!%K!(#ZQ!$:A#$:5#!*=$&J=-$J=!#J5!#Z%\"#J1!#J)!%*!'"
- "$Y]#$9Y(#I]!$IU%\"YQ$$)Q#%IA&#IE!#9M!#Y5#!9-%\"I1!\"Y5\"$9-(#9-!!Y!!"
- "\"8Q##XI!#(Y&#(U!\"I%!#8M$$9%#\"I)$#99'#I1%!Y1!#I1\"$I9#$)5$#I9\"#YE\""
- "$)Q##IM!#IE!$9U!\"IU!#J!!%IU'#J%!$YY##IU!&*)$$:-!#:-#!J=#\"J1!\"*5\""
- "#Z9\"%ZA&'*E$$*A#!ZM!#ZQ!%:I(%JU!$*Q\"#Z]!%+-&$[!!\"[%!#[%!$;-'$+1!"
- "#K5$$KA$&[9!$+E%%+E%\"[A!&[=$#[5$%;M\"#;Q\"!+I!%<!!&<)&&<%%$[]$%;E\""
- ")L%'%\\)$%K]#%<%\"#\\)#'L9+&\\5,&\\1('LI*$<M!$<E!*\\E&$,I$%LI\"%<I!$LU!"
- "&,]#$<Q!'LY*'\\Y+',]'%]!\"#=!!']%!%M%!$=1!%M-!%])\"']9%&]5!'=-((==("
- "&=M$'M=$&-E\"&M5%&]=!(-I!%ME!&]I!%ME!'ME$$MM!&]M!$M]!%]Q!'-]!%]]!"
- "$MQ&%]Y!'-Y&.]]0'-]!%]]!&.!!#.!%'.!%$MU!%]]!%]]!%]Y!%^!!\".!!'>!'"
- "%^1!%]Q!%^%!&MY)%^%!$N%!%^%!%^)!(^!#(.!%%]U!)MU'&.)!(.%%%]Y!%]Y!"
- "&=]#(=]!%]]!%]Y!$M]!%]U!$]]!&=U#&]Q!%]Q!%]U!&=M$$MU!%]M!'=A#$MI!"
- "\"-Y!$MI!&]M!&]E!$ME!&MA$$=9!&-E\"%M1!'=1#&-5#&=)$*M1'%M)!%]!\"%--$"
- "$M!\"'L]!'<]$$,]$%<]!&<U$%<M!%\\I'&\\I\"&,I$&LM&&,E#&<9%&<A%'\\=#&<-!"
- "',A(%<A!',1)$,%!%<!\"&,)!%<!!%,-!%KY#%,!%'+Y%%+U!$+Q!%;I\"#+M!$+I!"
- "#;I\"$[9!%+)\"#[=!$[9!&[5%$+-\"$+)\"$;-#!;)\"#+)\"#[!!%K!(%*]\"\"JY'%ZY\""
- "$*U%\"ZQ!#:I##ZI\"%*]\"%JA!#J=!#J9!%*9'$:-$$Z5&#J=!$Z)\"#YY\"\"Z!!&I]+"
- "#J)%$)]#$)U##9Q!#9I!%9M)$9I$#9A'#9E!\"IA!%)A'!)5!#Y9#\"99&\"Y)\"\"I)!"
- "%(M\"\"8Q!#(M!#HY%!XI'#I!\"#I%\"#))&$I),$Y-$#))##Y1#$)5'#9I#$9U$#9A!"
- "$II#$)E$$IM\"&9M*$)]#\"YY\"$)Y##9Q!$:5$'9Y#$Z5\"\"Z9!#Z%\"$*1\"#Z5\"&*5,"
- "%Z-&$ZE%#JA!%*M\"$*M-#J=!$JQ$\"Z]!#ZU!$J]!#ZU!#+!\"$*]\"$+1\"\";%\"$K1$"
- "#[1!$+5\"#+Q!&K=$%[=!\"[A!$[E!$[E!%;=\"\"+U!$;Q\"&\\!,%+U!'L!\"%,%!%;I\""
- "%+Y!(,).$<-\"&<-&$\\-$\",5!%<9!&L%+&L9!'<E%\"<E\"&<9%%<=!&,E#&LI&&\\Y&"
- "%LM\"(,Q#&<Y%(\\Q!%LY!$L]!%])\"%M!!%M%!$=)%%])\"%M-!(-=0'-)\"']1*&]9!"
- "%]!\"&==$)-A!%ME!'=A($MA!#=A!#=5!(=I!%]I!%ME!#]M\"%]M!$MM!'=Q\"%]Y!"
- "(>)!%]U!%]U!%]U!&-Y!&.!'%]]!%]U!$MU!'-Y!(=]!%^!!%]]!$M]!'N)#%>)$"
- "'N!)#>!!'^-#'-]!&>!#%^!!%^)!'>!\"&^!%'>!''.!!%]]!%]M!%=]$)-]%#=]!"
- "%^!!)]]-%]]!'-Y&(-Q!!-]%&=I#%]Q!%]Q!'=Q(&=I#(-Q!#=I!&=M#']M)&]E!"
- "%MA!(-E!&]9!&-9#&]9!%]E!%]1\"&-9#$]1\"%]-!'M-*$MI!%M%!(-)!&M-!%M%!"
- "%\\]\"(L]%$-!$$<U!$L]\"%<E!&<Q$%<Q!%LM\"'LM!%<5%&LI&&<9%(\\M&%\\=#%<5!"
- "%<5!%\\1#%,1!(L-!$,-!%<!\"&+]%';]*%+Y!$[I!$+U!%+]!$+U!$+M)%+A!#[E!"
- "$[I!&KE#&[A!$[=!$[)!%+=\"%+1\"#+1&\"JU$%;%'#[!!%:U##:Q#$*Y\"$JI%$*U\""
- "#ZQ!#JE!\"Z5!$*A##J5!'*=%%:=$$Z)&#J1!\"*A!#I]!$Z-&$J!&%Z%'#J!!$IM%"
- "%9Y\"%9Q%#IU\"\"IQ!#II%#)I\"#YE#!)A$\"9A#$)9$#)%#\"Y9\"%I1'\"I-!\"I)!#9!!"
- "#8M%#HQ%%8U*#8E\"#)!##(U#!)!!\"I!!#9)!!)1!$)%!\"9-&#95$$9-%#9=$#YA#"
- "$IE&$)I#\"YQ$#9M!#IY!%J!)$IY%%9I\"$*!#$*%##J%!#*)&!:1\"%:-!$Z5&$*5#"
- "#J1!#Z5\"#ZI!\"Z]!$:M#'ZE(\"ZI!%ZU*%ZY)#ZY!%+%&'+%#$[!&#[)!!ZY!%[))"
- "#[-!%+=%$;5\"';5(\"K=#&+1&%+1\"%[E!%+M!&;5\"#KM'$+Q!%+U!%KU#'KY#%+]!"
- "&,%)$,%!&[]$&\\!$%L-\"$,-%#<5&(,%%%<9!&<9%&LA&$,A-%<=!%<9!&<A!%<A!"
- "%M!!',Q((LQ!%M!!%<M!$\\Q'&L]&%]%\"',]#%M%!&M-!%-)($=%!%M5!$]1\"!-)!"
- "&M%!'-5\"\"-9!$M9!)=E!&-A\"%]A!&]A!%ME!'=E(%]E!&=Y-&]9!(-Q!&MU%'MY)"
- "#]Q#(MY(&M]$$-Q$%]U!%]U!'-U!%M=!%]Y!%]Y!'N!#%]Y!'-Q'']])(-]%'.%!"
- "(N!!%]]!#=]!%]]!(-]%'>)!%^!!$]]!#=Q!%]]!'-Q!%]Y!$MY!&]Y%'.!!&=Y#"
- "'-U!%]M!%]U!%=Y$%]Q!$]Q'%]M!'=Y'&-M,&-M\"%ME!%-I#']A%#=I!$MI/&ME$"
- "&MA$#=A!(=5,&=E#'-9'&]E!'-5''-=!!=1\"(M1$&])&%M)!'M%%$=%!%M!!'--#"
- "#,]!%<M!%<Y!%\\U\"&\\Q'%<M!(\\M!&LI&%<I!%LM\"&<=!&LA&&<=!%<=!%L5#(<5/"
- "%L5#(,!!#<9\"$KY#%<-%%,!!$+]!&+U!!+M!';I\"#+M!$[Q$%+]!&+I%\"[=!$[A!"
- "%;A\"&KE#&[-!%[-!$[5%#[5!#[-%%+)&!+%$#;9\"#*]%%Z]*$+%\"$*Y\"&JU)$JI!"
- "#JM!$ZI!#JI!$JE!!ZA!#Z%\"$*=#&*1!\"J-!$J9!#J-!#J9!#J%!%J%)#Z!\"#I]!"
- "$*!#&9U#$IQ%$)Y#')M.#YM##I9\"&)5#\"Y=\"#9=$$9=\"$Y1!\"I1!!Y9$#I)%&Y!'"
- "\"8M#!HM#\"X]\"#HU%!8Y%\"H]!#9!'$)!!#)-##9%!#I-%#Y=&#)A#!)A!!YA!&IA'"
- "#YE\"'YM-#95$!Y]!#IY!%YY+$)U#%)](#IU$$:!'#J-!#:9#%J-&%*1#$J5!\"Z5!"
- "%:9!$Z5\"%:=(\"ZA!#JM!%JI!':E!$*E\"$+%\"%:U##JE!$;%#'+!/'+5\"&ZY\"&;%#"
- "$+!\"#[1!#[%!';5'%[=!$[=!%+A!%K5$$[=!%KI##[=!%;M\"%+M!%[Y$!+I!(+Y*"
- "%+]!&\\!$$\\)#%,%!%,)!%,1!$<I*%<%!&L5''L%'%<=!#<5\"'<I$'L5'$LM\"&LM&"
- "%\\M'%<Q!(\\Q&$,Q$(\\Q,%<]!%M!!'-!''=%)%M!!&=-$&=1$'-1'(\\]!$M%!\"--!"
- "%]1\"&M1%&M9%!]-$%M9!$=9!&-A#(-I!&]1!'==#&]E!&-I\"%MA!$MI!%]I!(=I'"
- "&]M!']Y$&=Q((-Q!%]]!%]M!%]Q!%]U!$MY!&-Y!'-U!&MY$(M9.$MY!&-Y!(=Y!"
- "&=Y#)-Y/&]Y%%-U#&M]$%^%!#.!%%]Y!%]Q!%^!!&MU$$MQ!&]Q!(-M!&-U\"%]U!"
- "%]Y!%]U!%]M!'MM$%]M!&-M\"(=E')-=%'MM((-Q+&]M!%]I!%]U!$=9!%-=$#==!"
- "'-=,&]9!)]9$)]5)&]=&&M9$$M1&$=%!&]9!&=-$&--#%M)!%M%!%<]!$<]!%\\]\""
- "%LY!%\\]\"#<M!&,Y#(\\M&(\\Y!&LI&#LI#%LI\"$LA\"&,E#%LI\"&,=$&,5$%,A$%,1!"
- "%<=!+,).%L)\"&L%\"#;Y\"$,!!'[Y-#+Y!&;Y\"%KU'&;U&$+M!$KM#$+9\"%[E!#;E\""
- "%+I!%[A!$[5!%[1!%;-'$+5\"$;1\"$K1$#Z]!&K!$%K!$%:Y#$[!%$:M'#ZQ!$ZM\""
- "#ZU!#JE!%*E'%JE%#JA!!:5\"\"Z9!$*1\"!J-##J1!%*)'!Z%(&Z).!Y]!#*%\"%)Q$"
- "%9U%#YM##)Q#!IM#\"IM$$YE$$YI&#9E!#)-##9=$#95!#)1#\"Y%\"#Y1&\"Y%\"#Y%&"
- "\"8U#\"XU\"#(U!\"8Q!\"HI'\"HY!\"I-$$9!&$)9$#XY&!)-$!Y%$!I5#\"I=$#99$$)=$"
- "#II$%IE$$9I%#9Q!#YI#$)I!#YQ%$9U!#J!!%:!(#J%!$*%#$*1##J5!$*1\"#ZU!"
- "#Z=\"#ZA!#:='#ZA\"#:=##JI!#J9%$:M#$JQ!&*U#$JY!!ZY!$+)!%+!&!*]$$+-\""
- "$+)\"%[-&$[1%$+5!$[1!%[9!%+=!$[A!%KE$$+M!#;I\"#;A\"$+Q!$;Q\"%;Y\"%+U!"
- "%;]\"',)$%,%!%<-!%,)!%<)!',-)%<1!)<5*&L9&),5)#<9\"%L-\"'LU!'<A!%\\Q\""
- "%\\=#&,I$!,=!&,Q#&\\M\"%<U!'<U)(\\Y!%<U!&LQ&%M%!']!'&-%#$MA!$=%!&-)#"
- "%M1!&M%!$=5!%M1!%M5!$-A$&M5%$MA!#=9!&==$%MA!%]M!%]1\"%-=$%ME!%-A("
- "%MA!'.!!&-M\"'-I''MI)&=M#'MM((-Q!)-]%)=Q!&]Q!%]U!%]U!%]U!%MU%(MU\""
- "%]Y!%]]!%]Q!%]U!#=U!%]U!%]U!%]U!$MU%%]U!%]Y!%M=!%-9$%]M!%]U!$MQ!"
- "\"-M!%]I!*MQ0%]M!%MA!#=E!'-U!)=Q!%ME!%M1!%MA!$]U''M=$&M9%&-E\"'=A("
- "%M9!&-=\"&]A!$-!)&=1$$]1\"'-)#%<Y!%M)!&=)$%M-!)-!'%M!!&-%#&=!$(L]$"
- "%<]!%\\Y\"%\\I#!,Q!(\\E'%<=!&LE&'\\E\"'LM!\"<E\"&,=$%L5#'<9!%<A&&<-!&<1!"
- "%L1\"$[U%$+]!%\\!#$,!!%K]'%K]#%+Y!$;Q\"\"+I%#+Q!%;M'&[U((+E*&+A\"$[=!"
- "#[I!$[9!$[A!'+5*$JY!#[)!$+)\"![)!&+)\"$[%!'K-!$*]\"$*Y\"\"Z]$$JQ$$JQ!"
- "\"ZM!$J=!#Z=\"$*A##J=!#*5\"%*9#$J5%\"J-!%J1%#J)!%J%\"#J)!$YY'%)]!%9Y)"
- "#YU\"$IQ%$YQ##9M!#YM\"\"I=!#I=\"#91!%I1!$99(\"Y1\"!)A!#)9#\"I!!#9%!$)!$"
- "\"XI\"#HQ%#XE#\"HU$#(Y##8]$\"(Y\"%Y!\"#I)\"#I%##I%#\"I%!\"I1!#I5\"$)9'#)=#"
- "&9M&%)M!$9E$\"IM!!YM!#IQ\"#9M!!YM!&)Y($)]#$*%#%J%&#J)!\":5#!YY!'*9)"
- "$J9!\"Z9!#Z5!%*A''ZA+#ZQ!\"ZI!$*M\"$JM$#ZQ!#ZU!&Z]%#Z]!#ZU!%+%&)+),"
- "\"[)!#[-$$K1$$;1#$[5!(;9,&;9#&+5\"%;A&%KA#&+9&';A'$+M!$,!!'[I($+M!"
- "%+Q!&+]!'+]%%<%\"&+Q!)<1!%L)\"%<-!&L-''L5'&<=!%L=\"'<9*&,5$$<M!#,A!"
- "%<I!%<M!&<5!%\\E#%<M!%<Q!%<Y!&,Y#%L]!*<M#&\\Y\"#M!\"%M!!%M%!'-1''=)("
- "$])\"'M-$$=9!'ME$#=-&%]9&&]1!(]5.'=9#&M9%%-=$#==!&-A\"']A%'-A!%MA!"
- "$ME!%]I!%]U!%]I!%]I&(=E'%]M!%]Q!%]M!%]M!$MQ!&>!\"']Q$%]I!(-Q!#=Q%"
- "$MM!%]Q!$MQ!&MU%&]Q!'-]!#=E!%]M!&]Q!(-Q%$MY!&MI$(=M!%]I!#=]!&]E%"
- "%]Q!\"-U!*>!4'=I(&]Q!$MA!%]M!)=A+%]5\"(-E!&=M$&-1#(=9-%-5(%]9!'==("
- "'=5#%]5\"%]1!*-1*%]%\"(]5$$=)!%]-\"#M%\"%M!!%M-!&L]!&LQ&(,],'-)'&LY!"
- "'M%$%LE\"&\\Q'&<M!(,I,&,E#)<E.&<9%&\\Y&%<9!'<1*%<9!$,5!%,-!$<1%$,1%"
- "%L!#(<5%%,%!$;Y\"&K]'%,%!&,!!#+U%'[Q%$[A$&+M!&KU'';I\"&;M\"%+A!%;E\""
- "%+=\"$[E!%[A(%+5!#[1!#[A!#[5!#[9!$+)!(+!'#Z]!%JY!#[!!#JI!&JU!$*M*"
- "\"ZE!#ZE\"#Z=\"\"*A\"#J=!\"Z9!&:9!#Z5\"#J-!&:)%\"9]&$:!$%J)\"\"I]!!YY*#9Y$"
- "$)Q$#YI#\"9M#$II&!YI!\"II'%)M$#)1##I=(\"95#\"91#$)=$#I!#!9)\"#XY#$(U$"
- "\"8I!\"8M!#(I#\"8U!$8U&!HU!#(]##(]!\"I-!%99)\"I%!#Y-&%))%\"I1!#99!\"I=!"
- "#YE\"%IA#\"IM$#IQ!!YM!#I]!#YQ##9U!#IY!$9U$#YU\"#J!!#J%!$J1\"%:%%#J1!"
- "%Z9*%:1!\"Z9!#J=!#ZQ!$*E\"#JI!%*I'$:U$\"ZM!!:U\"#[!!&*Y\"$;%##[!!%;-'"
- "!+%!%+)&';)#\"[!!%[5)(K1!%+1\")+A&%;E\"$[=!'[I!$[E!$KA##KE#!+Q!$[U$"
- "%[I!%+Y!%+Y!%<%\"&<=!%,%!%,)!$,)%%,-!$<1&$L1\"%\\5#%L)\"&,1%)L=!$LA\""
- "%\\E(&,E#%LI\"#,M!$,Q-%LQ!'<Q$&\\U'',Q#(<Y-$,A!&<]$&,]#&-%#&-!#$M%!"
- "*]%/(]%*'--'$-)$&]1!%M)!)=%\"#M9\"'=1.%MA!'-9'#=U!'--#%M5!'==(%MA!"
- "(-='%-A,&=I('MM$%]M!%ME!(-M!%ME!%]I!%]I!&MI$\"-A!'=M\"&]M!'-I&%]M!"
- "'=M#$MM!\"-I!(=M,&MM$%]Q!%ME!&-U!#-E$&M]$%]Q!(]M.$M]!%]I!&]E!']I%"
- "$ME+&]M!%]I!$M9!&]A!$MA&#=1!%M9!$M9!(-A!'-='&--(%M5!%M1!)-5!&=9$"
- "&M-!'M5$'-1'&])'%M1!&--#&=)$'-%\"&M%!%<]!',Y(%]!\"%\\Y#%]!\"$<Y!%LU!"
- "#,U!%<M!%\\M#%<A!&LA\")<A)&,E$$,A$(L5!&<9%$<E!%LA\"$L9\"&,-%%,-!\",)%"
- "%,)!'L%'\",)!%[M%&+]!%;U\"%KU#'KM'%+Y!%[Y(%;M''+M!\"[I!$[A!&+Q!$[5!"
- "$+=!&[9)%;9&%+1&#[5!\"[)!%K!(\"[1!#[%!$*]%$*U\"\";%\"#ZY!\"ZQ!$JA!%ZM\""
- "%:5!%:=$$*M\"#:9#\"Z9!%:5(#Z5\"#Z1\"\":1&$J)\"#J!!%*!$#Z!\"$:)$&J1*#9U!"
- "%IU&#9Q!#9M!$9E$%YE!$)E#$I9&$YA*#I9\"\"I-!\"I1$\"9-#\"I-!%9%)#9%!\"HU!"
- "!(E&$8I)\"(I\"$XY*\"8Q!#(Y#\"(Y\"!H]##XQ##9!'\"I)!#I5%\"I1!!9%%\")1\"%Y5."
- "\"I=!#9A!%)A'#95!#IA%\"IU!#9E!$II&$)Y##IY!$Y]&\"IQ!$J)!#J)!&*-''*-)"
- "#J9!$J=!\"J)!#ZA\"#J=!#JA!#Z=!#JI!%JQ!$:M$#Z=!$ZU\"%ZU&%*]\"$Z])#ZY!"
- "#;%##[)!%J](%+!&$;=\"$K1$%[5!\"[1!#;=&&;=\"&+E&$[A!&KA($+M!%+I)'+Y-"
- "&;U&%L!#%+U!%L)#%+M!%,!!$\\!(%L!,'<!&$<)\"$,1!%<5!&\\%#',9$%LA\"'<=!"
- "%<A!&<=!',M(&LM&%\\Y\"(L]$&\\M'%LQ!%<U!'LM.&\\Y\"(,Y\"%<I!&,U#$=)!&]!'"
- "&]%''-)'%M-!%M)!&]!'&--,(-1!(=9\"%]1\"%M1!%M=!%M9!)=5\"$=5!&]=!%]=!"
- "%=9$(]5.%]I!'M=$%]5'*=9!&]E!*M=\"'=E\"(-E!%M9!#=Q!)]I(*-I*)-I0%]M!"
- "%MA!&-E\"(-M!$MI!\"-A!%]I!'MI)&-Q\"'-I'%]M!%]Q!%]E!(-I!$=E*(M9.&]5!"
- "%MA!(-E!&=A$%MA!&]I!(-E!(M1)&-Q\"%M=!%]5\"#=)!%M5!(-E!&-5#$=1*'=1("
- "&]9!%M-!'-1\"&=%$&=%$']%&&=)$%<Y!$<]!$LY\"&-!$%,U#$<]!&LU!'LY&&LY!"
- "%\\M#%<Q!%LI\"(LI!%<5!',I)#\\A#$<I!%L9\"$\\1(%<5!%<5!&<A!&<1!%\\%$%\\1#"
- "%<%!%+Y!$L!#&KU'%+]!#KY'%+Y%$;Q\"$;E\"$;M#&;A'&+A\"&+E%$[A!'+=&&[A!"
- "%;9\"$;=\"\"[-!$+-\"%;-#$K-$![%!!+!$#Z]!#[)!%K%!#Z]!$:I##ZQ!$ZM%\"ZI!"
- "#*Q\"$JA!%Z=&$JI%'*=%#J1%$J5!#Z-\"#:-#$Z5\"$:%$$J!&%9]\"%9Y%\"IU#!)Y!"
- "%9I\"#YM\"#9M!#IE!$)E##9A!#I5%#I=%#)1#\"Y1\"#I1%!Y-!$I!$%8]##)%'\"8Y!"
- "#(A#\"XM%!HM##HQ&#HI%#HQ%\"8]!!Y!!\"I=!!Y)!$9)\"\"I-!#9-$#I-%#99$!Y9!"
- "\"I1!$9=%#9A!#9E!$9M!#IM!%YQ$&)](#9U!$9Y!&Z)$$Z!&#*%#\"J%!\":)\"$:)!"
- "#*5\"&:5)$*5##Z9\"#J=!!ZA!$:E'#JE!%:E!#JI!#ZQ!$*U\"$K)$#ZY!$K!$&K!!"
- "#[!!$*Y\"$[)!%+5!$K5$\"[-$$K=#%[A%%+9\"%;=\"&+A\"'+Y!%+M!$;A\"$+I!'+U*"
- "%+U!%,!!&KY#%+]!$,!!%,!!#L1#%,%!%,-!%,)!&,-$%LE\"%L)##,1!#,9!%\\9#"
- "$\\M#$<A!'L=+&\\E\"&,I#(\\E!#LI#'L=+&]%!%,Q$%<U!%<U!&<Y)%]!\"'\\]&%\\]\""
- "&-5#%M!!&-%##,]%'=)-$=)!%M-!$]1\"%M1!%M9!&=9$'ME)'-A\"(]5%%-9$%M-!"
- "\"M9'&M=$'=9(&]=&&-=\"'-A'\"-A!$=M$%MA!$MA!(]E.%M9!&-M'%MA!%]Q!%]M!"
- "#=E!'=Y\"'-E!$MI!%]I!%ME!\"-E!(-9'%]I!$]E\"%ME!&-M(#=E!%M=!'==(&M9$"
- "'M9$$ME!%M=!%]=!$M=!'-E!#=A!%-9#%M5!(=9#&-=\"&-=\"%M)&$M5!'-1'$M)'"
- "%]-\"%])\"%M5!%]-!(-%\"#=!&'M)$&L]!(,U'&\\U&%<Y!&LU**M%$&LQ!&<Q$&,Q#"
- "!,Q!$<Y!%LE!&LY&'<9*%<9!%<=!&<1!%<5!&<=!&<1!&<1!%L-\"&,!!%,)!#+]!"
- "%<%!%,!!$;]\"$+U!&;M#'+U*#[I!%+Q!$[Y$%KA#%K9$&+A&%KA$$[E!%;9#$[5!"
- "\"[9!&[5!$K-$$[-!$;%#&ZY.#:Q#$*]\"$JY!#[!!#ZE!%:A!%ZQ%$JM!$ZI!#J5!"
- "%:A($*A\"#J1!#Z9\"(*5&#J=!#Z-\"$JA!#J)!$J%\"#IU$#J)!#I]!$YY)$IY&\"YA%"
- "#YQ\"$YI*$9I(#)E##9A$$Y='\"II!\"I5!\"9-##)!$\"I-!$Y1!%)%)$)-$#9!\"\"H]!"
- "&XU$\"8E!\"(E\"#(M##XY&#(U#\"8U!$8Q&%8]*#8Y!#XY!\"I%!\"I1!!9-\"\"I1!\"II!"
- "\"99#!Y9!()9%'IA-#9E!%)9(&9M&$)Q$$YY&$IU%#9U!#)]\"&*%$#J%!$Z!'!Z)!"
- "#J%!#Z9!#J=!#J9!%Z9'#J=!#J=!#ZA\"\"ZI!\"ZI!$*M\"(*I%\"ZU$%JU!$*U\"%+!\""
- "#;%\"#[%!\"*Y)%;-\"$+)\"#[1!![1!%+=!$[A!'[9!%;A\"'+A.$KI'\"+5!$[I!$KI#"
- "%;Q&\"\\!$%;I\"%<%\"&,%!&+]!#,!!'L!'),)-%\\9#%\\!$'<-%%<1!%,1!%<5!$,=$"
- "&<9%$,9!&<A!&<=%%<I!%LE!&<I%%LI!'LI*&LQ!%<M!'<U)$LQ\"%L]!&\\Q&%<]!"
- "%L]&%M!!&,U($=%*'-%#%<]!$]1\"&M)!$=%!&M9$'])&'-5'%-1$%M=!%M1!%]-\""
- "%]5\"$M=!&]1&%=I$&]I%%M=!%ME!&-9#%M5!\"M=\"%]=&&=E#$MA!%]=!#==!&]E!"
- "&]A&#=M!%MA!&MQ$%M=!%]M!%]Q!$MA!#]Q(%MA!&=A$%-=$'-A'#]9##M9!&]9!"
- "&]=!#==!&-=#']9!&]5&(=9\"&M1%)--1(-9&&M1%(M=#$-5$&]!\"&--#&])''-1\""
- "'-)'(-%\"'=)$%<U!%M)!$=)!$]%\"(,]'#LM&',Q#%\\Q\"%\\]\"%<Q!%<M!%\\Q#%<M!"
- "%<A!&<E!%LI\"%<A!&\\E(%<1!%L9\"%,=%!,5!$<-\"&,5$)<-%&,)!%<1!'\\=,$L!#"
- "%,)!%,)!%+Y!(+]%&+I%%[I!#+U!%;I&%[I$%;A\"%;E\"%;M\"&[9!\"[E!$[9!%[5!"
- "&[9!$+5\"\"[1!&+-\"#[%!\"[%!$;!##JI!#*U\"%*Y\"$ZY%#ZY!&:I!#JE!&*E(%JE)"
- "$JE$#Z=\"!ZI!#J1!!Z%!#J5!$:-!#J-!#J1!#J%$&9]&%*1+#9U!$)Y#$9U$\"IE!"
- "%YI!$9M$&IE'#99$$)I#!)5!!I1&#)5##I1\"%)9%#)-##)-#%HY$#9!!\"I!!!8]%"
- "!HE##(M!#HI%!XM!!HQ!!HQ&\"8M!#HE&\"I%!$)!%#9-!#I)%#95!%9))\"I1$#)5#"
- "#9=$#Y=#\")9\"#IA!\"YE%#YE##9U!%IQ)#9M!!YU!%J)&$YY#%J!#\"IQ'#Z!\"!Z)$"
- "$*-#\"*9!#:1#$:5$$*9##J=!&:A!#JM!#ZE\"!*Y!\"ZI!$*M\"#ZQ!#:U\"&JY%%;)#"
- "$*U\"$[!!#[!!%K)(#[)!$+-\"$+-\"#[5!%+1\"$[E!#[5!$[)!%[A!'+E*#[I!%;M\""
- "$+M!$;Q\"$[5!%+U!&;U\"%+U!%+]!%L!#%\\%($<%\"%\\)#)\\!)&<1!%,1!&,9$%L5&"
- "'L9+$\\A#$L=&%\\E#%L-#%L=\"(\\A'%<I!',=('<A!%LM!(LY$%\\U#%M%!*<]#%])\""
- "&LY!%M)!%<]%&=)$&-)#$=)!)=%'&LY&&=9)%])\")M-#%]-\")--+#=1!%]1\"%]-\""
- "'--\"&]1!%]5\"'=5(%<]!(M9)%M-&&=9$'MA$%]=!(==\"&]9!$=5!$M=!&]=&%MI%"
- "&]A%%]=+(M=#%M9!$M=!(]=$%M=!(M=.$]9\"&-=#%]M!']5!%M=!%MA!'-Q&&-=\""
- "&=5$$=9!$=9!']5!%]=&&]5!$=1!%]5\"%M5!$=9!+=-&&M)!%--$%M!!)-)0%M1!"
- "'M)*&-%-%M%!(-!'#L]\"#,]!&LY!)LQ%&<=%'\\Y!%\\M'&<U$&,Y#&,M$&LQ!&LI&"
- ")<9%%<E!%<=!)<A.%<=!%LA\"&,)!&<5!&<)!&L9'$,5!'L%'%L)\"$+Y!)<%!';]!"
- "%,)!#,!!%,!!&[A!(+U%$+I!$,)!$+M!%[I!&[E(&[1&%+1\"%+=%%K!$%[)!%J]!"
- "$;-#$;-\"#[)!#+!!#[%!#[-!#*]\"$ZU%%;!'#[!!#ZU!!ZE!\"*M\"$:M#$*=\"%ZA#"
- "$*=##Z=\"$:1!\":5#\"Z-%%J1\"$J)\"#J-$#J)!\"Z%\"\"Z!$$IY\"$9Y$!YY!%*!'$9Q%"
- "#9I!&)M%$)9!\"I=!%YM(\"I=!!)5$#I9%#Y1#%(Y%%9)#\"Y-%#9%!$H]&!(]!!XQ!"
- "\"HA\"&8E%$8M&%HM+#HM##H]\"\"HY!$8Y%\"I!!\"8]!#)!##XY##(]##9-$\"I-!\"I-!"
- "\"I5!\"Y5\"#II!%Y=,$Y9$\"IQ!&II!#YM#$)U#$9U$%)U!%)Y$$)]#$*%#$*)##J%!"
- "$*)##Z-\"#J5!#ZM!$Z=&#J1!\"Z5!#Z=\"%:A##JE!%*M#\"JU#$*U%#JM!$JY$$:Y#"
- "#Z]!#ZY!%+=!$ZY%#[)$#[1!%J]!#[=!#[=!%[=$#;1\"%KA$#[1!$[A!&KI''KE("
- "$[E!%[M)$+Q!$KQ#$[U%'L%\"%[U$%[U$#\\!$%<!!%\\-##\\-#%\\)#%,9$(L1\"%,-!"
- "%L9\"%<-!#<9\"%<A!%<9!%LA&&<A%&,M#$LA\"%L1#%LI\"(LI!&LQ&%\\Q\"\"\\M#'\\U!"
- "%\\Y#&LY!&LQ*%<]!%<]!$=!!&M!!%M-!%M)!'-%\"&]1&&M!%&=)$$]-\"%]-!&]5!"
- ")=1'']5%&--#&]-!*]5)$=5!'M1*&=1$$M%!%M5!']5+&-9\"']9+&=A$(=5(&]5!"
- "(M-)&=1$%]I!$]5\"\"M=#'-9'&-A\"%M=!#==!'-9\"#]9#$=-!)]A$%M9!*MA\"(=)-"
- "%]5\"&]-&&]Q!%]1\"%M1!)]=$%M)!$]%\"%M-!&M-!'--\"%,Y$%M)!'=)-'--\"&-%$"
- "%M!!%]!\"%\\Q\"'LY%&<Q)',Y#&,Y#%\\U#',U#',Q#(LQ*',M)\"<M\"%<I!%<I!&<E!"
- "%<A!%<Y!%\\=#%\\=#&,9$&\\-((\\5,%,1!'L-&#<-\"!,)!&\\)#&<!&%\\!#&,-$%+Q%"
- "%[Y$%+Y!%+M!$+U!$+M!!;M\"#+=!$+M!%;M#&;Q'\"[A!$[5!$;A\"#[5!%+1\"';9\""
- "#[)!#[-!$[)!$[%!#ZU!';!0&:]'$+!&%J])\":E\"#ZU!$JM!#JM!#ZU!&*E$#ZI!"
- "$ZE)%JA%#JA!$J%!#J5!#Z-\"$:!!$Z%#&)],%*%*$9U$\"YY!\"IY!$)I#$9Q%%YE'"
- "\"IM!$9E$$I9&$9A!$)='\"I9!$95%#I1\"#)1##I1\"\"Y%\"%Y%\"$8U\"$H]#\"9%##8U$"
- "\"H=\"#8=%#XE$!HE!\"HM!#X]#\"8Q!!HM!!8E\"#(U##9!%\"I!\"\"Y)(\")1\"$)1!\"Y%#"
- "!)=!&9=$\"I9$%)=(#)Q##9E!$9I%$YM'%9Q%$:!!#9M!$9Y$$9]!$IU%%J%)#Z%\""
- "#J-!%:-!#Y]\"!Z-!$J5!%:A!#J1!$:1!#J=!$Z5\"$*Y\"$ZQ\"$JM!(:U%#[!!#JM!"
- "#J]$&;!(#[1!#[%!$;%#&;)$\"+)!#K-$$+1\"%;A\"%+E!%K1$%+=\"%K9$$+A!$+M!"
- "%;M\"%+M!%+M!$+Q!$[I!&;Y\"%+Q!%[](#+]!'\\)($,)!%,%!%\\%#%<)&*L%'&<5!"
- "%\\5#%L5#',1$&<)%&,9$%LA\"',A(%<M!%<E!&<E!'<A!'\\I\"%<Q!'L=+\",I!%=!*"
- "'\\M'*,Q,%\\U\"'<Q$',]'&=!$%M1!%<]!&]!'$=%!&-!#%]%\"&]1!&=)$']1%'=-$"
- "(]-%&-)'&=1$%]1!%]1\"']9!\"-1!&M-!%M5!%M5!%MA!)M5(&=5.*==0&]9&%M1!"
- "%M)!&M5$*]5.%MI%$=1!%M1!&]9!%M5!(=1'(]5*%]5\"'-5'\"M9\"&M5%'M-%%M9!"
- "#=1!%M5!$]5\"%M1!&-1#&=-$%M-!&-)#&,]#'-%#(]9*$M!''\\Q+&,Q,%\\U#&\\]\""
- ")<]-&M)%%\\Y\"$LY\"%<Y!)LU3%<Q%%\\Q\"%<Q!%<E!$<M!)<A$(,E-'LE&(<9%&<A%"
- "%\\9#%<=!%L=\"%<9!'<1%&<1!%<=!&,1$'<1!%L)\"%<%\"&,%%&,!!&,%!%K]#&<-!"
- "%;Y\"$KQ#%;]\"!;E\"(;Q\"#+I%&;E&%+5\"&+9&\"[E!$[=!$[9!$[A!#[5!#[1!%+)&"
- "%K%!$K5#%+)\"%*]\"$+!\"%JY$&:U$$;%\"#ZY!$JQ%#JE!$JA!$JQ!%JE(#JA!#J=!"
- "%Z5*!Z9!#J%!#J9!#J)%$J1%'Z)-$:1$$9]$#9Q#%I]&$:!!#YU\"$)I##II!$9]!"
- "!IA##9I!#9I'%)=(%Y=(#Y9##)=#\"8]!\"Y%%$Y5*#I9%%9!#%I!(#)!#$(Y(#8Q!"
- "#(-$#(E!\"X9(\"XE#\"HE!#HM%%XU&$(U!#XY)#X]&\"X]%#I%#$I)'$)%!#))#\"I5!"
- "#I%#$)5'\"IA!!I=##9E!#IU!%IA#!YA!\"9M#&YY,$IY\"$J%%$9Y!&*-'$Z1&$9]$"
- "$J%%#Z)\"$J)%#J5!%*9&$:1!$*9\"&J9*$J5!%:=!%:E(#ZI!$JQ$$JI!$:M#$ZU)"
- "\"ZY!$:Y#\"*]%&+!*$[!!$*]\"%*Y\"$+)!%+%&#[1!#[5!%;9#%[1!'[=)#[9!'+A\""
- "%+A!&[=!$[U$#KM'#+Q!$+U!$+M!%[Y$$,!!%,%!&,!!%,%!#,%!#<1\"$+]!&[]$"
- "&<-!&;]\"%,1!(<9!%L9\"&L9!(,A##,1!%<A!'\\=#%<I!',I#(\\I!),M'%LY!\"LM#"
- "$\\Q#)\\Q4%\\Y\"#LU\"\",Q!&<Y$(<]##LU\"%<]!%M-!&M!!%M)!$M%&#-%%%M%!$=-!"
- "\"M)\"&=)$%M)!%]!\"%M5!$-5$%M5!#=1!'-1\"#=1!%M-!#=1!(-9+%M1%$=1!%M1!"
- "#=1!(-1,(,Y(&-1#%-5$%M5!%M9!%=)%%]5\"%M9!%M1!)-9!%M9!%M9!*-1!'M1*"
- "'M5$&=-$&M9$&=%$(M!.%M-!(-9+'-!(%L]!$=%!&=)$%M!!']!'&L]%%<U!$<]!"
- "&]1!%\\U\"%M!!%LU&$LU\"%,Q)%,Q)\",Y!'LM!%<M!)<M)%\\I#&,M$#\\=#%LI!%<=!"
- "(\\-#%<9!&<9!$<I!\"L5+%LE\"$<-!%<9!$,1!%L)\"%L!#%\\-#%+]%%KU#%,%!$,!!"
- "'+U-%+U!&+M&&;M\"%+U%$[I!%[E$%K=#&;E\"$[=!&[9%#[9!&;5'$+1\"$+5!#[A!"
- "#[5!#[%!%;-\"$+)!#Z]!&:Q($JY$%ZU\"$:Q$$*Q\"#JM!%ZM*$:Q##J1!#J=!\"ZA!"
- "#Z9\"#J5!$IY\"%:1!$*)##I]!!:%\"%Z)##J!!$:)$$)Y#!IU&!9Q\"#IQ\"$IE&#99!"
- "%9E\"\"IY!#9A!#I=%\"IA!#Y1)#)1&\"Y9\"$)%!\"I!!$9%%&Y%#\"XY\"!8U%\"HY$#XM&"
- "\"8E!\"(E\"#8=%!XE!\"HI!%(M,!8U\"#H]\"!XM!$HY#$8M&#I!#%)%(#Y%$$I%&\"I9'"
- "$95%$)5$\"I9!!))$#)A##9=!#9=!#Y9#\")I%$9M!#)Q#%)U'#9U!#I]!%9],\"J!!"
- "$:%$\"Z%\"%:-($*5\"#Z5\"%:5!#J9!%JQ!#Z=\"#JA!$ZE%&*E#%ZI&%JM!$:M'$ZY\""
- "#:Y#%+!\"&*U\"#*]!#[!!#ZY!&[1&$[)!$[%!!+1!%+=&$[9!$;5\"%;1\"![1!%[5!"
- "%+Q!$[9!'[M%$;U\"$+E!&+Q!!+M%%;I\"#KM')+Y))+])%,)!%,!!%\\!$%,-!%L)\""
- "%,)!%L5\"&\\1(#<1\"%<5!#,=!%L9\"$,9!%<E!&<A&&<A!%L5\"%<E!%<I!%<U!$<Y!"
- "%LA\"%LQ!&,I#(LM/%<A!$LU\"&\\Y&*<]($LY!%L]!%<Y!&<]$%LI\"&LU!']%+'=%$"
- "%]-\"%L]*'M%%$--$%-)($=!!&-%$&--#$=%!']-!%M-&'=-$$=-!(M-$%]-\"&--#"
- "'--\"%M%!%M%!'-!#%M-!%M-!'-1'']-*(=--&M%!%M%!%]-\"&M%&%M-!%M!!&M)%"
- "'M)%%M)!(-!\"%M-!%M!!$=!!%M)!'M-*&-%#&-!#%]%\"%<]!'=%)$<M!#L]\"%<Y!"
- "%<U!'LY*&LU!%\\U\"%<U!$<U!%\\U\"']%!&LE&%<9!&LE&&<M%%\\9#*L9*$\\5#(LI%"
- "&<9!%<9!'<1!%L-#%L-\"%<-!%,-!'L)#$,)!%L%#%\\!#$,-!&L%'$+U!'[M-%+M!"
- "'+Q*$KQ#%+Q!$[I!'+U)%;=\"&;I\"&+A&#[=$&;E&%;9&%;1\"!;)\"$+)\"%+%&$Z]-"
- "%+)\"%K%!$*Q*#Z]!$[1!#*]\"%ZI*$JQ!':Q!#JM!$:M##ZI\"$:U#$:E$#ZI\"#J=!"
- "&*1$$J5%\"*1\"#ZA\"$J%(!Z)!$*)##J%!%9])$9Y!#Y]\"!IU##)Q#\"YE\"%9](\"YQ!"
- "$9E%#9E$!Y5!!)=!#)9#\"Y5\"$Y-*#XU!\"I1!#H]\"#9)!#(U!\"8U#$(Y'\"8Q!#XQ#"
- "\"H9!$X=(#(M#\"8I!\"HE$#(=&#XE##8Q'\"8I!\"8Y!#8]$$I-'&I!)\"I%%\"Y)\"\"Y-%"
- "$)!'#91$#Y5&#Y5&#Y)##Y=\"$I5&\")5\"%I=#\"IU!#II%#YA\"$YU##J)!%J-\"%J!#"
- "#J!!$:%$#J!!#J%!#J-!$J-%#J5(%*5#$*=#'JA\"#JA!$JA%&:E!#JI$#*M\"#ZQ!"
- "$ZU\"#ZQ!!ZU!'J]!#+!\"\"+!\"%+!.%K)$%[9$#[-!%[1!$K1$&+A&$[%!$[=!'+A\""
- "&[A)%;E&&KE$$[I!$+I!#KQ##;U\"$;U\"%+E%%+M!';Y*%+U!%\\)(#+]!%L-\"&<%&"
- "'\\!-'<-!&<-%&\\1#'L-\"%<5!$L9\"%<5!&<5!%\\=#%L9\"%<1!$\\A#%LA\"%<=!#LA\""
- "&\\I\"'LM+%<M!%<M!%\\Q\"&\\5(&<M!&<U%%M%!%<Y!$LY\"&L]&%L]!'L]*(=)-&]!!"
- "%]!\"'=%)%M!!%M1!%]%\"%M%!&-%$%]-!(--\"%M-!&]1&&]1!$M)!%M)!'M%$&=1$"
- "%M1!%M-!\"--!%])\"#--$%]-\"%M-!&M!*#M)\"&-)#(])*&-!$%M)!(,],\"--!'-%\""
- "&M)!&--#*-)+&-%$&]!!%M1!%M)!%\\]\"%M)!&\\Y&'-1\"%\\]\"&LY&'<M)%<Y!$<Q!"
- "&<U%%<E!%LI!&,U#'<Q)$<Q!%\\I#'<M%#<E!&\\I\"$,=!%<I!%<=!%<A!$LA\"#,9!"
- "(L-&$\\5#(L-'%L1\"%,)!&,5%$,!!',!%%L1#&L%'&;]\"&;]\"%,)!%+Y!&[Y)$[I$"
- "%+Q!%;M&';M\"&;M\"%;E\"(;I&$[E!&+9\"$[=!$[1!$+5\"%+9&\"[9!$;%##K1#!+5!"
- "%+!\"$:Q#$*]\"#[!!%JY!%;)'$JU$#:E#$*Q\"$ZE&#JI!%:A$&*A#\"Z=!!ZE($*9\""
- "#Z5\"#J5!$*1#':A!%J5)#Z%\"$*!##Z!\"$)]&%IY*%IE$&)]($)E##9M!#YI#%9M)"
- "#IA\"#9M!!)=!()I'#Y5#\")1\"\"I)$$)A'\"I)!#I%#$)!%!))!\"9%##8U$\"HQ$\"XM\""
- "!(=!\"81!#H=\"\"8E!#(E!\"XM\"\"(9*\"8Q!$H]#$H])#XQ$#Y!&#I%##Y)#$8]\"#9)!"
- "\"I-!\"I1!\"Y)\"#95$#Y9#\"IA!#9E!%YM$\"9A#$)=!#YI#%)Y!#IY!!YY!$9]$\"I]#"
- "$YQ##Z)\"%:1!\"Z)!#J-!%:1!!Z9!\"Z5!#J-!#JI!#ZA\"%ZM\"#JI$#JI!#*I\"#ZU!"
- "$*Y\"&ZU*%*U'%ZU)!+!!#[-!%[!&$+%&$;%\"#[5!#[-!#[1!$[5%&[5!%K=#'[A!"
- "&K=(%+A!%+9\"'KE('[I!%+E&#KM##[E!#[I!%;Y\"%+Y!$[Y$&KY'#\\!$%<!\"&L!#"
- "&L%'%<9!%\\!$$,-!%L!'#,1!&<5%$L=\"%L1\"$<9!%L='',=#%<E!&,E##,E!&<E!"
- "%<=!#LI\"%<E!+LM*%<M!(LM!$<E!%\\Q\"%\\U\"%<U!&LU!',Y(&\\Q\"&]5!)-1!(\\Y!"
- "&,]#%]!\"&\\]\"&]!'\"M!#&M!&$<Y!%M)!'-)\"%M-!\"M%\"%\\Y\"%M%!%M1!$=5!'-)\""
- "%]9&%M)!%=!$%M5!%M%!%]-\"%M-!(])%']!!%M%!(=%(&]-&%<]!#M%\"%]%\"\"])$"
- "&]-&$=!!$\\]#%]1!%M)!%M!!&-%$%M)!%\\Y\"&M!!'-!-&LY&%LQ!&LU!%\\U\"'LQ%"
- "$\\I#)\\Q&'LM*#,A!&\\Q'#\\Y#%<E!&L=\"%,Q$&<5%',A-%<=!\"<A\"&<=%)<1!(,9-"
- "(LA!%,1!%,1!%,-!$<)\"%,%!'<%!$KY'';Y+&,!!'+Y!&<!\"%+Y!%\\5#$+Q!&KQ+"
- "$+Q!#[E!%;I\"';M+%[A!#;I\"\"[9!#[=!&+A\"%;5#$+)\")[1*$+-\"#[-!$+1\"$Z]%"
- "&+!*\"K!$#[!!#ZU!#Z]!$ZE\"':U)\"ZI!#JI!#J5!%*A#$:Q##JE!%:A#%:1)!J9'"
- "$J)!$J9!#J-!\"J1!#:%##)]#%*!!#)]#$YY#$9Q(#Z%\"#IU!#9Q!%YQ+\"YU\"#)Q#"
- "#9A$\"Y9\"!)A!\"I5'#I5%#91$\"Y)\"!Y1!%)!($9)%\"Y!\"#8M$$HU)#HQ\"\"8Q!\"8I#"
- "\"85!\"8A!#(=#\"8=!!(E!\"89!!HI!\"XM%#8Q!\"8Y!!(Y$!I))\"8M!#I!%$I%*$))!"
- "\"I9!#Y!$$)1'\"I5!$Y9!!Y9!%)=(\")Q\"$IQ%$YM#\"IM$$YI$#YM#$9]!$)Y#$I]&"
- "%YM!'*1-$)Y#'*)%$J%&\"Z9!#Z-\"\"J)!#Z%\"$*9)#J5!':!'#J=$$Z=)#J-!#JM!"
- "&*M+!Z=!#ZQ!&*Y#\"ZY!#Z]!&JY)$;!\"%+%&\"[%!#[!!#K-$%+1&%+5!$[5!'[E!"
- "$[9!#[=!!+9!%;Q\"%[A!&;M'';A,#+I!#[9!'+Q*%[U%%;M\"%+Y!);Y+#K]#&<!\""
- "',%%'<!+%+M!&L%\"',%*%L-\"%,1!%<1%'<1!(<5!$,9!%<)!&<9!%,1!%<A!$,9!"
- "#,I!$<E!',A(\"\\I#),M\"%LM\"&<Q$'-!'%<=!&<Q$%<U!%<Y!$\\Q#',](%<I!%L]!"
- "#,Q!$<]!']%!'L]*'\\]&%M!!%<M!']A%%<U!%M!!'-!#&=!$&LU!%]%\"%M!!%M)!"
- "%=)%']!!%M%!(=!-&M%!&M%%&L]!$<U!$]%##-%$(-%\"+=5+#]%$&M)!%,U$']5+"
- "%L]!(\\]!&L]%$<]!%M!!%\\]\"*,U'&,Q-%L]!&LU&)LQ*#,Y!%<M!&LQ!&<A&*<U)"
- "'\\M+$L9\"&,I$'L]!%<A!&LI!(,Q((\\A\"%<A!%<%\"&,9$',=#%<M!'<1%%<5!&,-$"
- "&,1%&,-)%,=$%<5!%<)!%;]!#,%!%,!!$+]!%<!\"%+Y!&[Y$%[U$&+Q!\"[E!$;=\""
- "'+A\"%KQ#$+U!%;E\"%[A$&K=($[E!&[9!&[A!![A!#[1!$[)!%+%\"#[!$#[-!$K!$"
- "\"J]#%JY!#ZU!$Z]%#*]!#ZI!#JE!%ZU%#JQ$#ZA!#ZA!#JA!\":=\"!Z9!$:1!#Z9\""
- "$*1\"\"Z=!#Z%\"&J%##J%!#J!!%I]##J!!#YU\"$)U#$YU&#9Q!%IM&#YA#$9I%\"I=!"
- "#9=!\"YA\"#Y9#$)!$%Y1(\"I5!\"Y%%#)1#$Y!'!Y!!%8]-$HU)\"8U!#(]#!(M#%(Q,"
- "!H5!#(9$#X='\"X)&\"8=$\"HE$#8Q!\"8M&\"8A!\"8U!\"8U!#(Y##8]$#I!&#XY##I%#"
- "\"I)!#(Q!#91!$))$#9)'\"Y5%!)=!$I9\"#99!#9E!#IM\"'9I+&*%$$IU%%)U$#)]#"
- "$J!\"$:!$$:!$$Y]&#J-!$JA!!:1\"$:)$#*5\"\"Z9!%JI!#*U\"#JA!#J1!$:M$$*=&"
- "#ZM!$*U\"#ZQ!#Z]!#ZY!&J]!$[!!$+!\"$+!&([1\"#[5!$[-!$K5#$K5$#[9!%;E\""
- "%+9!$+9\"&[=$%KA#%KA#';=\"#[I!%KM('+M!$KQ'#;U\"%;U\"%+U!&;Y\"%,!!#[]$"
- "%<!\"%,!!$<-\"'L)\"$<-\"$,1!!<)\"$,-!&L1'&,5$%<5!'<1*\",5!%,1!%<=!#,=!"
- "$,9!&<M%(,],&<=&#,E!$<I!%\\Q\"',M#%<I!$LU+%,Q$&\\E(%<]!(LM/(LY$'\\U&"
- "$<U!(,]1\"LY'#,Y!$<Y!%,]$%<])%M%!',]')<Y('=-($<]!$])\"%M!!\"M=\"!-!!"
- "&=)$&LY&$=!!%]%\"$]!#(<Q-%]!'%]!\"%]-!\"M!'&-%$&\\Y&%<]!&M!%&<]$'\\]&"
- "\"=!!%<Y!%<Y!'L]!%=!%%LY!%<Q!%<Y!%<U!#\\M#%LM\"%\\Q#(LU)&LM!(LM!'<Y)"
- "&\\=#',M#&\\E'%LA\"$,=%$L=\"&<9%$L9\"%<=!%LM\"&<9!%<9!&L9&'<=!&\\1#%\\=#"
- "&,-$$L-#%\\)#(,!!'<-*\"+Y!&+]%'L%+';]+&;Y&%[M%'KU##[Q%$+M!$K9#'[M$"
- "%[M%&[E$%[E!$;=\"%K=$$[1!%+-\"$[)!$K5$#[)!$;=&#[1!%+)&#[%!#ZY!\"ZY%"
- "#[%!#ZY!&:Y(#ZQ!$JQ!#ZQ!$*M\"%:E$#ZE\"$*E\"#*E\"#J=!#J9!#Z=%#Z5!$J1\""
- "$*)##*%\"!Z)!&:-,$Z!&!Z!!#I]!$)U##I]!%9M)#9Q!$9U$$)U#$)Q#$YE*$I=&"
- "$)I'#)1#!YA'#99$#I1%\"Y%##))#!I%(#(Y!#9!!#8]$#I!%#HE#\"XE\"\"(Y%\"XM\""
- "\"(!\"\"8-!!(E##X='#H1!$XA($8I#$XQ$$(M\"#(E!\"XM-#I)%!HY!#8Q$\"Y!#$9!%"
- "!))!#Y)'\"I%!$I1)\"I5!\"I=!\"I)!\"I1!#9M!%IE##YM\"\"IA!#9M!&II+#YM#%YU#"
- "#I]!$9Y$!Y]!$)]#!Z%!#Z)\"!Z1!!:%\"#Z-\"#*5\"&*5#$*=#$JA$\"ZA!#:M\"$*Q\""
- "\"ZU!\"ZI!#ZQ!$JI!%*I*$*Y\"!*M!$;!\"#[%!$+-!%;%'$K%$![5!#[-!#[1!$;5\""
- "%;1#&K5($[=!';9(%;A\"%K=##;E.%[E$\"[I!$+M!#[M,&+Q%%+U!%+U!%<%!%\\!#"
- "&\\%($,!!$,!!&<)&%L1\"&,%!$,5!%,-!%<1!'L1&&,1%%<5!',I(#\\5$#,5!%<A!"
- "%<U!%<=!%<=!(LA!%LE\"#,I!$<I!%<Q!)<M$&<I%%LQ&%<Q!\"<=!%\\Q#',Q#%\\Y#"
- "%\\Q\"'LU/\",U!%LU!%LU!%]!'&M!!'<]$#<Y!#,]!$L]\"(=%#%\\]\"%LE\"$]!#&<U%"
- "%<]!&<]$(\\]/&,Y#$<U!#,]!%LU!#=!!%\\Y#(<]-&-1(%LU&%LE\"#,Y!%]!'%<U!"
- "%<Y%&-!$&\\U\"$LM\"&LU!%<U!\"<U\"%\\Q#&<Q%&<Q%%<M!),Q'#,U!'\\I&$<I!(,I,"
- "&\\E\"%LE\"&\\E,%\\A#'<E))\\A&'L9\"%<E!#<9\"%<A!%L9\"%L9\"%,A$%L1\"&<1%%;]!"
- "%,)!#<%\"(<%!%,!!'L!,%L!#$KU#$+Y!%KU##[U$%KU#$;M#\"+Q!#[I!&+I%&;I&"
- "%;E\"%+M!#KA#';9##[=!%;9#%;9\"%;9#\"[1!&+1&#[1!$+)\"%J])#[1!$[!%$*]\""
- "%[)!$Z]%#ZQ!%*U\"\"ZE!!*M!#ZI\"!ZM!'ZA/$*A#$:5$#*I\"#J=!#J5!\"J1!#J-!"
- "&J1*#J)!#Z1\"#Y]\"\"Z)\"%I]#!YY!$9Y$$I]%#IU\"#IY!$IU\"#IE\"#YA##YE##)5#"
- "!I5&#)9#\"I5!#)1#\"I5$#9-!#9)!\"Y%\"#9!!#(]#\"I!!$XQ(#HU%\"HQ!\"XQ\"\"HI$"
- "\"GY\"\"8)!\"HE!\"8=&#8=$#H=#\"XI\"!HI!#(M#\"8M!#8M$\"8U!#XU&\"I!!!9!\"#X]#"
- "$I%)!Y)!\"I-!\"Y1\"\"Y-\"\"I5!$)=$#)A#\"Y9\"%9=%#YI&#9I!$)M##9I!%I]&#9M!"
- "%9Y)$IQ%$Y]&#9Q!#Z!\"#J)!$:-!#J1!%*1#$:-#$I]\"$:)!$*5##J1%#JE!#*E\""
- "#JE!#JI$$ZA\"&ZU\"#*I\"$*U\"$*Y\"$*]\"%*]&'[!&'+)+$[1$(K!2$K-($[1%%+1&"
- "$+5\"&+5\"$[5!%K=$%KE#%[M$%[A$#[E!*KI($[I!#+Q!$+Q!%+Q%%KU#%KU#$+Y!"
- "&[Y(#+]!'<)&(<!+$;]\"%\\%$'L5*$L)#%<1!&,-%&,-%&<1!$<5%&L%\"&<9%',9)"
- "%<9!#\\=#$L9*$\\=#$LA\"*,A('<E%&\\E(%<M!$LI\"&]!\"%<A!%\\M#%\\U\"%<M!&LM&"
- "&LQ!&LM!%<U!%<]!$<]!$<Y!&\\U\"&<E!%\\Q\"%\\U\"%<U!#\\]#%<]!&\\Y\"&LU&(\\]+"
- "'\\Y!%\\U\"%<U!%,U#\",]!'\\U&%<Y!&<Q%$M!!(LY.%M!!%<Y!'\\Q''\\U\"%<U!&LU!"
- "(<]-*\\U/)LM*%\\Q\"(,U(&LQ&#<Q!+,Q'%\\Q\"#,U!&,E#%LA\"%<E!&<I!(\\A\"%LE\""
- "$<E!$,A!#,A!'LE/(\\=0&,1%(<=*&L1\"&<1!&\\5#%\\1#%,1!%<9!&<-!(<-!%K]#"
- "%,)!'L%+&<-%%[Y$%;M\"&+]%'+]!&;Y\"#;M'&+U!$;A\"$;E\"&+A\"&;M\"&;I\"&+M!"
- "$[A!%[A!%;)#%+)\"&[=!&[5!'K-!#[-!$*]\"#[-!$[-)#[1!!;%\"#[%!$J]!\"ZU!"
- "$*Y\"\"*Q\"&*Q'$*U\"%*A'#*=\"&*A+%:Q$\":A#%J1\"\"Z=$#J5!#Z-\"\"J1!$:9##Z-\""
- "#J%!\"*1\"\"J-!#J!!%Z!'$)Y#$)Y##IQ!$)M#&IM$#YI#%Y=$#9E!$YA'#Y9##Y5&"
- "%)E(#I9\"%9-*\"I1!\"9-&#I1%#Y9#\")!\"\"I!\"#(Y#%8Y!\"HA\"\"HE!\"(Y%#(Q&$8I)"
- "#X5!$X)#$89#\"H=\"!HE!\"XM\"\"8I#\"(I\"#(M##XM##(Q!$HU#\"8Y!!HY!\"I!!$8Y&"
- "#)%#$(Y!#8]$\"9-&$I1##)1#\"I5!\"I9!#95$!YI!#9E!\"IE$$IE)%)Q!%)U(#9Y$"
- "#IU\"#Z)\"#I]!$:%$#J!!#J1!$YY#$:5$#J)!':A%#J5!&:1)!Z9!#JA!#J9!#ZA%"
- "$JA%!ZE!\"ZU!#JI!#JI!%ZI\"$:U$$JY!$:Y#$J]$&[!\"$+-!#ZY!\"[!!&K1$$;-#"
- "#[-!%+-\");5(%[5!(+M%%KA$&+I!)+5\"'+A\"%;I\"&KM'$KA#$+M!$;]&$+Q!%;Q\""
- "$+U!$+Y!'+U!&+]%&,!!&[U$$,)!$L1\"&,5%',))%,1!%\\-(&L9\"%<1!%,1!%L1'"
- "%<5!&,9$'<9!$L9##<1\"%\\9#$<E!&<E!%<E&%LE!$,9!%<U!%\\I#(LM&'LU!(<I$"
- "%<M!'LE!%LM\"%\\U\"&<M%%LI\"&,M$%<Q)%<E!%\\Q#%\\]\"%\\Q\"&\\Y!&\\M\"&\\]&&<U$"
- "%LQ!$\\Q#&<Y$%<M!%\\Q\"%<Q!&<]$&\\U&#,Y!%<U!)-!\"&]!\"%LU!$<Q!'\\I\"'<Q)"
- "%\\Q\"'<]#%,Q#),=-#LE\"&<M%%<I!(,I)&LI!\"\\M$%\\Q\"%<E!%<Q!&,M#&LA\"&\\A#"
- "!LA#(\\A'%,1!&<=!$,1!(<5%'<5%'\\E\"%,1!(L1\"&<5!&\\)#%,-!%,))%,)!%,!!"
- "%+Y!'L%\"%<!\"&<%%$+]!&+Q!$+U!&+Y%$KQ'$;Y\"$KQ#$KQ#%;M&$[I!#[E!%+M!"
- "$+9\"'K-%$+=%$+9!$+9!#+9!$+1\"%;5'%+)&%;)'#[%!!;-&%;!'#Z]!$[!!%*]\""
- "#ZU!$*Y%#JI!%JM!%:U'%JU!#JA!!:A\"#*A\"$Z=\"\"J1!$:E$#*E%$J1\"#Z-\"$Z)\""
- "$Z)&$)Y#%J)&%)]($:!$!YY!#9U'#IU\"!YY!$IM\"%YA+$)M$$IM\"#9A!#)1##Y9#"
- "!Y9!\"I1!#I9\"#Y-#\"Y9\"#I%#$(]$#HQ\"#9)!#8]!#XE'#(U##(Y#\"8Y#\"8Q!$(I'"
- "\"81##H1&!H%#$X5##89\"\"X=\"\"HE!\"8E!\"XE\"#(M)\"XQ\"!HU!#(Q#&I)/\"8]!\"I)$"
- "#9!!#I%\"\"Y%\"#)-#$)-$\"I5!#)9#\"Y9\"\"I9!!)9!#YE##9I!\"YI\"#9I$$9M$'9E$"
- "#)U)!YQ!#IU!%*-#%*!!$*!#$:%$#Z)\"%J)\"\"Z%%%*!!\"Z5!%Z9*$Z9\"&:5!#ZQ!"
- "'*M'#ZA!$JI$$*U\"\"ZM($:Y##ZU!#[!!$*Y\"$*U\"$JU!#[!!$;!\"%*]\"%JY!$[)!"
- "#[)!$[!&![=!$[5!&[9!$[5!*+=+)[I*&KI(&KA$%[A!$[E!#[E!&+I*#[E!$KQ#"
- "'+Q!%+U!%;Y\"%KY#$[I!%K]#%,!%&<%%%L-\"%,!!%<%\"%\\%$%,)!&<-!%,1!$,1!"
- "(,)-$,-!%LA\"%,1!'<-%%\\=#(LA&(L9&#,=!$,A!&LA&(,M#&\\E(%<E!&,A$%<I!"
- "'<I)'<I$'\\M!&<I!&<Y$*,M#&<M%$\\M#%<I!&<I%&,U#&<E%%<M!(,Q#%\\Q\"%\\Q\""
- "%LE!&L]%%<U!%\\Y\"$<I!%M)!'\\U\"$<Y!%<U!%\\]\"$<Y!%]!\"$L]\"(,M#$\\M#%,I$"
- "&<M!\",=!#LI#%\\I(%<I!%\\Q\"%<I!%\\E(%<E!%\\E#%<9!&<9!%L=\"&<=!%,=$%LA\""
- "',M)%\\9##<=\"%<9!&<=&%<9!%<5!%<5!%L%#(L-\"'L=&%L5\"&,)%',%*'<%%(KU#"
- "%<%\"%+Y!),-$'+]!%;]\"%+M!&+Q!#;]\"%;I&%<!\"$;I\"&;A&%;E\"&+9\")KA$&;A'"
- "&[9)'+9*\"[9$&;9\"%;E\"$;)\"%K-$$K-$$[)!\"[)!$+1\"#ZY!#ZQ!$:Y#![!!%*U&"
- "$:]##JE!#JI!&JQ!#JI!$JE!$:A#$:9##JA!&:9!#J1!$:5$#J=$#J-!&:5!%*!$"
- "#J1!#Z!\"\"J!$#I]!#9U!#9]#%)U!$)M$#YI##II$#I]!$)E!$)9$!YA!\"I9!#)9#"
- "$Y1$#I%\"#)-#\"I!!\"Y)\"&)%'!Y!!\"8]!!Y)!!Y!!#(U!#(Q#$(U%\"HY!\"8I!#X5&"
- "#8-\"#81%\"X=#$(5&\"X)\"$8=&!(A!$85)!XY$!HI!$(M(#(Q#\"8Q##HU%\"XY\"$(Q%"
- "\"X]%#(U!\"H]!\"9)&#9)!\"XY\"#9-$\"Y%\"!Y9!$)-'#YM\"#IA!&II($9M!#YE\"$IE,"
- "#YQ#$)M$#9U!&)]!%IM*$9Q%$J%%$9U$\"J1$$Z)&$*9\"\"J-$#J-!#Z9\"$*=\"\"Z9!"
- "$ZI)$JA%$J=%$:E$$*M\"#JE!#ZQ!#ZQ!$J]$#*Q\"$*Y\"#ZQ!#;!##+-\"$;!\"#+)\""
- "![-!%+)&#;9\"$[1!%KA$%K1($[9!%[=!$[=!&[A!%[9!![E!%+A!&KI$$+Y!&[M-"
- "$;Q&%+U!%[M%%+Y!#+]%&+Q!$;U\"$L!#&+]%'L%\"%\\%(%<!!%,)!$L)#%<=!%\\E'"
- "%<5!'\\E'%<1!#,I!%,)!%\\=#%<9!\"\\=$$<-%%<=!(,%*%<A!%LA\"%\\=#&<E!&<E!"
- "%L9\"%LM\"%LI\"&=!$%\\Q\"$LI&&LI&'<A)$LM\"%,Q$%<M!%LE\"%<Y!&<M!%<Q!%<M!"
- "%\\Y\"%<Y!\"<M\"%<U!(\\E\"%LI&'LM!%<M!'LM!%<M!%\\=#$<U!#,9!&\\M\"%<I!$<I!"
- "&LU&(,I#%<E!&LI&(<9!$,A!%\\A#&,E$',I)#\\)'%\\E#$,A!%\\9#&LE&'<=!%<=!"
- "&L9+%<9!%<5!&\\5(%,1!&,))&<%&%<9!$+]!$,)!',%%%L)\"$,%!&,1$',))'L!\""
- "&;]\"$;E&&K]+$[I!$;M\"'KQ#!;Q\"$+Y!&+U)%+=\"&;I&#[E!%[M)%;A\"\"[5!%+I&"
- "(+=&%+9\"%[%)#[1!$[)!#[5!#K5$$+!\"#[%$$;%#%;-'&K5$$:]#!JY#\"Z]!%ZQ&"
- "#JM!#JA!%:I$%ZI'$*E\"$:=##Z=%$JI%%*9'&:M!$:1!$JA$$J-%#J-!#J-!$J)%"
- "\"J%!#)]\"#9U!#IY!$)U#\"I]!#YQ\"#9I#$YQ#$IE##9A!#YA#$)I#!)=$\"I)!!Y5!"
- "#I-%\"I!%\"I-!\"Y!\"!Y%!$91\"#))&\"H]$\"8U!#(I#\"8Q!%(E&\"XE##HI%#8E%\"8A!"
- "#(-$$(-#$(9%#89\"#(9$\"8)!#(=$#HE#\"X=#\"8U!\"HQ!$(M!\"XE\"!XU!\"8]&#X]&"
- "#Y!&#I!\"$Y!'\"Y%\"\"95##)5&#91!#95$#9)$#9=$$I-#\"YA\"#YE#\"IU!$9I!$9U$"
- "(YU'()Q+#9M!\"YY$#J%!!*!!\"YU\"#Z-&%J%\"#J!!$*!#\"J1!#J)!$Z5\"\"Z9!#J-!"
- "#J=!#*A\"#*A&%JM!!ZI!$*Q&$:Q#\":Y\"$:U$#ZU!#[)!#Z]!$ZY%#Z]!$*]\"#[!!"
- "#*]\"$+!\"$[5%#+1%$;1\"#[5!%K=$%;9\"'[=*$[=!&;E'%;U\"$[E!$[I!'[I-$<!\""
- "';M\"$+Q!$KA$#;M&$+U!$[A!'+Y!&+]-\"+]!%+Y%$,!!%,)!$,%!%\\%#%,%!&<)!"
- "%,-!'<-!&,!!%\\E#%,-!$L5\"$,9!%,1!%<5!&LM&\"\\A#$LA\"%<I!%<9!%<5!#LA\""
- "$<1!$LE\"',E(%<E!%\\I#)\\M&%LI\"%LE!&\\A(%L=\"'\\5,%<E!%<A!&,I#)<I)$<I&"
- "%\\A#&-!$%\\Q\"%LI\"&<I%'<M.%\\Q\"%LI\"#,I!%<M!#LI#&LE&',E#%LI!'\\9'&<E!"
- "&,U#%<E!'<5!',9$&<A*&L=!'<A%\"<A\"&<A&&L=&$<1!(,9#%,-!%<9!',5-%<5!"
- "',E#'<1!%<1!&,1%$L=\"%,1!)\\-#%+U!&+Q!%,!!%L5\"%,%!%<%!'L%,&+]!&;]+"
- "%;M\"%+Y!$KQ#%+U!&;Y\"%[Q$$[A$$[]$%;I\"%[E!&[E!#[I!&;E&$[=!%+A&\"[9!"
- "%[5!&+1*%+1\"![1!#[-!$+-\"#[!!%JY!%[-)$+%&$[!%$;)\"!ZY!&:I!%*Q*#ZU!"
- "$JM!$*M\"%*I\"#ZQ!#JE!%*A'!*9!$Z%&&:=,#*5\"\"J1!!:9\"$I]\"%J-\"#I]!$*%#"
- "$Z)&&)]%\"Y]!'Y])#YQ#&9U#()Q.%IQ#')=+#Y=#$)9!%)A($)I&#)9#!Y5!!H]!"
- "\"Y1\"#I1%\"I-!#Y))#I%\"#I%#\"HU$#(M#\"(]\"%8U##XI'\"(M(\"8I!#(U!#(E!\"8=#"
- "\"8)!\"H)!\"(-\"#H5#\"XA#\"89!\"8=#!(Y!$HI*#HE\"$XU*#X]&#(Q#$8Q(!XY!#(M#"
- "\"8]!\"HU!#9!$$Y!$#))#\"Y1\"#)5##9-$\"I9!$95(!Y9$\"I9!%YA.%)A\"$)E#$9M!"
- "!YY!')E-$)A$#IU!#9U!%9]($:!$$9]!#:1#$Z-\"#J)$\"Z-!$*-#%:=+#J5!#J5!"
- "!Z=!#J=!%ZI*#JI!\"ZE!#ZI\"$JM$%ZE\"$JQ!$*U\"$*U\"$*Y\"$*]\"#Z]!#[%!$;!#"
- "%+%&#[)!!;)&'[)&$[1$#;9\"#[9!'[=%%K9($[=!\"[=!'+A.$[I!%;E\"&;E\"%;]!"
- "$[I!\";M\"$+M!$+Q!$+U!&+I%%,%!&\\-(%+]!%K]#'KY#%<%\"&<%%%[]$#L%#&L!'"
- "$,1!$+U!%,)!%<=!$,1!$,1!&,%*#<5\"&<5%&<5!%\\9#$,=$&L9'%<9!(LA&&LE!"
- "%<E!#LM\"$<E!&LA&#LA#%LA\"%LE\"%\\A(#,E!'LE!%\\M#$<E!%<A!%<9!&,E#&,I#"
- "%<I!%<5!&<5!%<U!'LE!&LM!$<E!$LI\"%<A!'<Y$&,E$%,=('<M)'<E))<E)%<A!"
- "%<A!$,A!&\\E'%<A!%LA\"%L)\"%L='$LI\"%<=!'<A*%<5!%<=!&,1$%L-\"$L1\"%L9\""
- "&<5!(LA/%\\)$%,-!'<1*&,)%%L)\"%L1\"',%!$,-!%+Y!%,1!'[])%+]%';U\"%+U!"
- "%L!#%+I!&;U\"#[M%)KI,$;A\"%+M!&K9($[A!$[E!'K5$#KE#%+=\"%+=\"%[-!%[9!"
- "$;5\"$K5$#[1!![-!%+)\"$;)\"%[)!$[!!$K1$$*]\"#[-!#Z]!#ZQ!%JI!$*Q\"$JM("
- "#ZI\"$ZI\"#:E'$JQ!$ZI%\"Z=!\"Z=!\"Z9($J%!#J1!$J%\"\"Z!\"#J)!$*)##J!!%9Y&"
- "#)]#$Z!\"#IY!\":%\"\"IM!#IQ!#9M!$II)#9A!'9E$#Y=##I=\"\"Y9\"!Y9!\"I)!\"Y-\""
- "\"I!\"\"91#$Y)$#9-!#(]##(]#$))'#95$#(U#$(M\"#HE%!8E\"$8E&\"XE#\"8A!#(A$"
- "#(%$\"H)\"\"X)%%89$#H5&#(5!!H9!$(=!#XA!#XI!#(E$$(U$$8Q(!(U!#8U$#(U#"
- "#(Y#\"I-!#9!$#Y1##9%!!Y1!#I1(\"Y5\"$I=#!I=##9=$\"I9$$IE%$)9$$)A!$II%"
- "#IE\"$9Y$%9I)%*!(#9U!$*!'$)]#$:!$&Z5#$*%#$9]!\"Z9!#J1!#Z-\"$J9%#Z-\""
- "#J9!$*5#$JE!#JE!#JE!#Z1\"&ZU*#JM!#*M\"%*E'#Z]!$;%##+!!%*M&#Z]!$;!#"
- "$K!$$+%\"#[)!#+%!#[)!\"[1!$K9#%;-\"%;5'#[-!%[9!$[=!%;A\"$[1!%;A\"%KA#"
- "(+I.';M+&+I!#[E!#[I!!+M%'[Q$);U\"%;Y\"'+I!&,%%&+]!(+Y-%,)!%[]$%L)\""
- "%L!#'\\!$&L-\"%L)'&<1!&<1%&\\1(%LA\"&,5$%<5!'\\1#$<5%%L9\"$,1%%\\5#%<9!"
- "\"\\E#%,=%$L9#%<=!'<=%%<9!%<M!&<9!&\\E\"#<A!%<E!(,M-&<I%'LM!%<A!(L=!"
- "%\\9#&LE&#<=!$LA\"%<9!'<A!$LM\"'\\=\"(\\=\"%\\A#%\\A#%<9!&LE&'<=)%<A!%LA\""
- "%,1!%LI!&<=!(LU)%L9\"%\\9#&<E%&,9$%\\=#%<5!#,9)$,=!'\\M\"%<1!&L%'&LE&"
- "&,-)&<1!$+]!\"<)\"$,-!%L)\"$<-\"%L-\"$;]\"&K]#)[]#&+M!%+Y!$+Y!$+Y!%+A!"
- "$,%!$KQ#\",)!%+M%$;=\"%+I!&+Q%'+E\"';E\"%;1\"%+A&%+5\"$[A!$[I!%;!$%;5#"
- "\";1\"\"K1##K!$$;1\"\"[!!%+%\"$+!\"&*U+$Z]%$:Q#$JY$\"ZQ!%ZY!&JQ!#JM!$ZI\""
- "%J9\"#JI!#Z=\"(JY*$JA!$*E\"$ZA\"\"J9'$JA!#J-!$Z9\"#J%!#J)!$)Y#$:!$%)]("
- "#J!!#)]\"$)U#$)U##)U#()].%YY$&YQ,#9A!$)A#!YQ'!)5!#)1#\"IA!\"I-!$Y9'"
- "$Y!!#I)%$Y%$\"I%!\"HQ$!X]!#HQ\"\"8U!$(U$#(M#\"8M!\"XU\"!8A\"$(A!$(5(#85\""
- "\"8%$#(1##(1!\"X%##(9$%(5'\"85!#X=$\"H=\"\"H9!#(Q&\"XI\"\"(M\"\"(Q\"#(M#$8U)"
- "$XY*\"8Y#\"I!!#(]!#9!!\"Y).$)5!\"Y!#\"I9!!Y5!\"I9!#)A&!9A%!)A!#IA\"$)M#"
- "$YI&$IQ%#IQ\"&II(%Z!$#J!!#YY\"$IM&%*!$#Z%\"#9U!#J)!#)]#\"J-!#J1!$*9&"
- "%J5%#:9#%:-!#JI!$JA$#JI!$:I##ZU!!*M!#JM!%JQ!$*U\"%JU!#Z]!![!!%;%'"
- "\"[!!#Z]!&K),%+)\"$K)$#[)!#[1!%+A&$KM#&[5!$[5!&+I&(K=$%[9!%[I!$;E\""
- "%KA$%+A!%+I!'+E\"$;U\"$+M!$+M!$+M!&;Q\"%;Y\"%+]!%\\!$%,!!(;]&%;]!%;]&"
- "'L!#&,1$%,%!%+Q!$K]'%<)!$,%!',9($,1!$L1#$\\-$&L9'&<-!%,1!%<=!(<1*"
- "$\\1#%L9'%<5!'<9%&<=&&,5$%L1\"$,-!&L9!&<A!$LE\"%<A!&\\1(%,=$$,=!\",A!"
- "%<=!(LE!'\\=,&<=&%<A!&<E%$L9#(,=#%<=!%<=!%\\9('\\-#(<9%&,=)%,-!'<9*"
- "'<-*%<9!%<9!&<5%$L9\"$,1!&,9(%\\9#(<5/'<9*(\\E&$L1\"'L=+&\\)(%,-!%L-\""
- "$<)\"&L)\"%,!!&L!''<%*%<%\"&+Y%%,!!'<%%%<!\"#+]!%+Y!%+Y!#+Y!%K]##+E!"
- "&;Y*$+Y!$[M%%+=\"&[=!%;E\"%+Q!%+=\"%+=\"%+=\"#[=!(;%(([=!%K5(%[=!$[-!"
- "%+1&![-!#+-!$K%$%;%'#Z]!%;)'#ZY!$ZQ\"&*Y'#ZQ!%*I#$*M\"$JI!$ZU%#Z=!"
- "$JE$%*M&#J-!#J1!&J=\"#J9!$*5##J1!$J-\"#Z-\"#I]!\"J1!$J!&#*!##Z!\"%*%'"
- "\"IQ!\"IQ!$IY\"#J!!%)M!%9M%!)M!#9E!\")=%$)=!$I1##99'#)5#$Y9!#)1)#95!"
- "#)%$#9)$\"I%!#9!!#X]##HY%#HY\"\"I!!!XQ$$(A!!8E\"#(I#\"8A!\"8I!\"X=\"#H=#"
- "$(%(#']$\"X%#\"H)!#(1$\"81!!H5%#H5#\"8=!#XA'$HE!#8I%#89%$8M##XQ#%XY#"
- "#8U$#(Y)#Y!&\"8Y!$8Y%$9!&$I!*\"I1$$I1)\"YA\"#9A!\"I5!#I9\"%)E($)=$#)M#"
- "\"IE!#)Q\"#9M!#IU!$9M!!*!!$)]#&)U%#)U#$*!#$9Q!&*%,#J)!#Z)\"#Z-\"#J1!"
- "#J=!$J=%\"Z9!%:=%$*A\"\"ZA!&JA\"%:I'#ZQ!&*U+\":E\"$:M$\"*U!$JU!#[!!%ZU\""
- "'K!!%JY)!;%&#[!!$+)\"$+%\"%[-!\"+!\"$+5\"$+%&$+5\"&+1&(+9+%[=$#[A!#[A!"
- "'[9.$[I!%KI#%+M!$+Q!\"[E!$+M!$+U!);M/$+U!%,!!%;E\"&[],%+Y!%+]!'+]%"
- ")+])%\\)'';Y/%<%\"&L%#',%!)\\),%L%#%,!!%\\)$&L-'%\\)#%L-\")<1/%L=\"%L)\""
- "'L1\"%\\)#%<A!$L5\"%\\1#%L1\"%<=!'<9!(<-%$,9!%<5!',9)%LA\"&\\=#\",9!$<=!"
- "&L5\"%<=!'LA+%<=!&,=$%<A!)\\94%L5\"'\\A,(<9%&<=&%,1!%<9!$L9&%<=!%<5!"
- "%<9!%<9!&L1'(<5!%\\I#&<=*$\\-$\",9!%\\!#%,1!&L%\"&<1!'L5\"%,%!&\\)(%,-!"
- "$,%!$,%!&<-*#L%''<-*',!!&;]\"&K]#%\\!('L!'&<)!&;U&#+Q!%;M#$;]\"$;U\""
- "%;U'%KM'%+=!&+A\"%+E&&;A+'+A\"&;E''[E$\"[A!$[A!%;9*$;E&%[1!$[5%%+-\""
- "#+-\"$[)%$;1#&[1)#ZU!'JY!$JQ!#:U\"!ZY!\"ZY!#JA!%J=\"#JI!&:9!%JI)$ZI\""
- "#Z5\"$JU$#Z9!$:I$!*)!'*9(#J-!#J5!#Z-\"$*)##J)!#J)$$9U!$:!$$Y]#!)]!"
- "\"IQ!\"YY!$)Q#$YM#$)=!$IU%#9A!%9M\"!I5##9=$\"I=!#95$!Y5!$)9'!Y-!#)5#"
- "#Y%'$(Q!$8Y%%(Y\"\"8]!\"X]\"\"8U#\"8I!#8Y$$8I#$H=$\"HA$#H5#!HI##(=#\"89!"
- "#8!$\"H-\"!X)!\"X)#$H1+\"X1\"\"89!\"XA\"$X1\"#(E#!(A##XI!\"HI!#HI&#HQ&#XQ$"
- "$8]%%9%-\"X]\"$H]#\"8]!#(]#&9)(#Y)&\"Y-\"\"I-!#91$!Y9!\"I9!#Y1&$Y=#\")I\""
- "\"IA!$9E$$)M&$)M#$IQ)%IQ#%IU)$I]&%)U'$9]$#YQ\"\"J9'#J-!#*=\"#J-!$:5#"
- "$J9!#J-!%J1\"\"ZE!%:1$#ZI%#J5!$JE!!ZA!$*=\"#JM!%:U$\"ZQ!!JU##JU+%*Y'"
- "#ZU!$:]'\";)\"#;-\"$;%\"$J]$#[)!#+1\"#+-!#[5!#K1$'+1&%+9&$+=*%+=\"&[=!"
- "(K=$#[A!$[A!$;I\"&+E%$+I!&KM($+Y!%+M!\"[I!#+E!$,)!%;Q\"%+Q!&KY'%KE#"
- "$<%!%<!\"%+Y!&\\5#&<!\"%<!!'[],#,!!&,%%'<)!%,)!%\\!$%K]#%L-#$\\)#*,9-"
- "&,!%%,1!%,1!%L-\"$,=!&<5!'\\1(%L9\"$+]!&,5$%\\5#%<5!&\\E\"%L)\"%<9!'LE!"
- "%LI\"%<I!'<)!(\\5-%<=!&<9%$,9!%<5!$,1!*L9+$,5!%<9!%L9'$\\5#&,5$%L5\""
- "%L1#%,-!%<1!$L1\"'L5\"$<1*$,5!&<-!$<-\"\",)!$,5!%,)!%<!\"%,)!%\\)#&,!%"
- "(;Y&%,!!%<!!%<%%';Y+%<!\"\"+]!%+Y!&+U!%+Y!&+U!%[U$$+M!#<!\"$[M$\"[Y$"
- "%;=*(+M*$[I!%+=!![Y$%KE##[5!%+9!$[9!&[1!%[-!(;1(%K5(%+1\"%K)$#[5!"
- "#[-!#[)!$+)\"#Z]!#ZY!#ZY!$*Y\"$*M\"#*U%#ZU!$ZU%#Z=\"$:9#%*I'$JE$$:=#"
- "$ZA&\"Z9!%*=&#J9!$Z5&#J5!#J1!#ZA\"$*5\"$:)!#J%!#Z%\"$*!#$)]#&:!\"&IU#"
- "$IQ\"%IA*\"YU!$9M!$9I$!Y=!%YI+$Y='\"Y9\"\"9=##)=#\"I)!\"91##I5(#)1#$Y!!"
- "$Y5'$9!%!I%#$X](\"8]!%(U(#XY&$(]$#X='\"8Q!!HM#!XA!#H=&%H=#\"H=$#XE#"
- "\"8!!#X%'$()(\"X%#\"81#!(-!#H-##X5!#H5&\"8=!\"(-\"\"X=&#HE%\"XI\"\"8E!\"HQ!"
- "#(Q#&(U$#8]$#HQ%\"I!!#9!!#I!##91!$Y-!\"Y=\"#Y-&!95($I9#\")9\"$)9$#9=!"
- "#YA&%IA$#9A!#9M$$)M$#9Q$#9Q!%IU\"&IQ.$:!!!Y]$%:))$:%$!YY!#Z)\"#Z-\""
- "#J5!$J1%#Z5\"#*5\"$JA$\"ZA!$Z=%#*A\"&ZA&%:E!%:E($:9##:M\"#ZQ!$[!!#*U\""
- "$J]!$ZU%#[!!#ZQ!$;%*#[%!%+-&%+)\"$[1!![-!!;-\"%;1\"&+A&&[E(%;9\"%;='"
- "$;=\"';1(#K=$)KI$\"[E!&;E\"&;5#%+M!$[A!#+M!#[I!$+Q!$[Q$%[U$%;Q\"&+U%"
- "%,!%%;Y\"&L!#%+]!%,%!%<!\"$;Y\"%,)!&+]!#<%\"%L)\"%,!!%L-\"%,!!%L)\"#\\9#"
- "%L-\"%L-#'L-&&L1'$,)!$L1\"%,1!%L5\"#<1\"'L-\"#L)+%L1\"&<-%%L5#&L1+!<!\""
- "'L5!#\\5#&\\1($,5!&<9%',5$',5$%,1!'L1\"(,).&<1!(\\1#%L)\"#,1!&L5\"$,1!"
- "'<=!%L5\"%<%\"%\\-#%,-!%\\-(%<)!#,=!%L)#&<5!&K]'%<%\"&L%\"!,9!&KY#',%!"
- "%,!!',!)$;]\"&\\%(&+U!#+]!'K]+$+U!%+M!%+Q!%+U!&KE(#[E!%[M$&+A&%KI#"
- "%KQ#$[E!&[A)'+1+%+M!&KA#%[A!%K=#&[A)%[1!$+5\"%+9\"$+-!$[9%#+1\"$+-\""
- "$K!+$K%$$*Y\"#Z]!!ZQ!$Z]%$JY!\"ZU!!*]!#JE!$ZI\"%J=)&*I$$*A\"#JM!$ZA\""
- "#JA!#ZI\"#Z1\"!:5\"%:-(%J1\"#J-!$*1#\"Y]\"$9]!%*!$\")]\"\")Y\"#Y]\"\")Y\"#9U!"
- "%II*$YM&#9U!#II!#YI##9A!$IE%%YE$\"I=!!)A!\"I5$#95$%Y)&!I%#!))!#X]#"
- "$)5!#9!!\"X]\"$(Y!%HY.#(U##8Q'$(M\"#(M#\"8I!\"8A!#(A$#H=#$(=%!XA$\"X1#"
- "\"GY\"%(%$#GY!\"G]%\"H1!$8))\"X)#\"85!#81%$89#$(=!$XA+!(A!#XE&!HU#$HM)"
- "$HY#!HM#!(U!$(Y!!X]!%I!!#9!!$I%$#)5&#9)!#)-##)-#$I5#\"II'$99%!I=&"
- "$)A$#II!%)E(#IA\"$YE$#YE##IQ!#9U!$Z!'#YI\"#9I!\"Z%\"%*!!%:%(%Z%##J)!"
- "%:-)#J1!#J1!$*M\"%:5!%*5##Z=\"$*5\"!ZU!#JE!#:=#$:I##ZE\"$+%\"$:U$$JM!"
- "$JU!!ZU(%JU!$J]$#Z]!#ZU!%:]'$+-!$[1%\"[)!$;=\"#[)!![)'#;1\"#[5!%[1%"
- "%K9$%;9\"%;1#$K='&;A'%[A!%;M\"%KI'';I\"%KU#&[E)#;M\"#+M!$;Q\"#+Y!&;U."
- "%+Y!%;Y\"$+Y!%+Y!%+Y!%[]$'+Y!(<!+%,!!$L9#$L!'#L!'&+]!'<)!(,!%%,%!"
- "%L%#&,)%#<)\"$L)#'<-*$<-!&,%!&<-%&+]!',-%&<-!&<-!%,-!%,!!$,1!&\\%("
- "%,1%&<1!$,-!%\\1#'<5*&,1$',))#L5#%,-!%,)!&<1!&<=&%L-\"$,-!%L-#%<-!"
- "%L-\"%,-!$L-''L1&%,1!&,!%%,)!%L)\"%\\%#%<%!&L!'%<%\"$\\%#&<-!*+])&+M%"
- "\";]\"';Y*#,%!&+Y!%KU'%+U!(;U+%KU'$+Q!$;]\"$+U)%+M!$[I!%[E!&;I\"%;E\""
- "%;5#$[A!%[M$';Q/$[=!#K9#%;9#%;5\"!KE#%+1\"'+1\"%[-)$[)%$[)!%+)\"$+%\""
- "%+!&#[!%$J]!%ZY\"$JU!\"ZY!#ZU!$*U&$*Q&#*Q\"$JI%\"JI$#J9!#:E'%ZI*$*=#"
- "#JI$#:-##J5!!*5($*1\"$:!$(*)\"\"*9\"!)]!$)]##:!##)]\"#Z)\"!YY$#IE\"#Z!\""
- "$YQ#%II#$)I$#YI\"#9E!#YQ#%IE#$IA(\"I-!\"Y5\"%IM&#9-'\"I9!!Y)!#9)$#(]!"
- "#Y)##(]#\"9%#$XY%#8Y!\"8]!#X]!\"8M!\"8M!#HQ%\"HU!\"XA\"\"H9!$81&\"85!%(A#"
- "#']$$']##()$!H%!\"X)\"\"H%\"\"8-!\"X)#\"89!$(=%\"X9\"#(Q#$(A%%(E#\"XE\"#XE'"
- "$XQ+%XQ)\"XU\"$)!!#(Q##I%&#I!#$I1##I%\"!I5)\"Y-\"$9-%!I5#!Y5$#Y5&$)-$"
- "\"I9!#)A&#)1#$)E#$9M!#YM#$IM&#9M!$)I$$IU\"#)U#$)Y##J)!%*!(&Z%$%:1!"
- "#:)##Z!\"$:)!$:1!#Z%&#J1!$:-!%JI!%J=)\"ZQ!#ZA!$*I\"%*I\"$JI!#ZU!#[!!"
- "$*]\"#ZU!%ZY*!Z]!\"+!\"#Z]!%+%&#[!!$[%!#+%\"%+1\"&K)(#K-$#[9!&;)+![1!"
- "#[5!';9,$[I!%K=#%[=!%[=%$[A!&;M'%+E!%[E!%;Y\"%+Y!&+M*&[M$#+M!&;I*"
- "%KI'%K]##[I!%+Y!$[A!%+U!&KY'([]-%;]!$;]\"#,)!&<-%&,!!&L!'$;Y\"&;Y!"
- "&;U&&;]!$<)!(<!+'<-!%[]$&L)\"$,)!&L)#$<-\"&,)!%+Y!%,1!%L-\"$,-!%L9\""
- "%<5!%,!!(<!*&,-%'L1\"%,5%&\\-((<-!%\\-#&L%'&\\1#&,-$%L)#!K]'$+]!$,)!"
- "%,%!(<)%'<1!%\\%$$K]#&;]\"%<)!%<-!&,!!$+Q!%,)!%,!!&;Y!%+]!%+]!$;U\""
- "$KY#',!!%+U!\"+U!%+M!#L%'%;U&$+Q!$+Q!&;U&&+E!$[I!$[=$#;E\"$[=!$[E!"
- "'[U$$;=\"%[A%%[9$%;5\"\"K9##[1!#K5#%+1\"%[9!$[-!#[)!#[)!#Z]!#JY$$*U\""
- "$;!\"%;-+$J]!%ZY\"#*M\"%*Q\"#*]\"\"ZQ!$JI!$ZI\"#ZY!$*Y\"#JE!#JA!%JM!\"*=!"
- "&Z=+!Z5!#:5#%Z1*%JA\"\":1#$J!(#Z%\"#I]!#YU\"\"*%\"$Z)#$II%#IU\"$J!!&)M!"
- "#IM!#IE\"$YI'#9Q!\"I=!#)A##9E!#99$$IA#\"I=!!I-#$I5)\"I)!%9)$$I%&#(Y#"
- "%I!(\"8]!\"HU!#(]#\"Y!%\"H]$#(I#\"H]!#8A$#(E!#8I%#(=#\"89!\"H9$\"8%!$HA'"
- "\"7Y!\"WA!!(!#\"X!##H)&\"8)!!WU$\"81!#8-%\"X9##8%(#H=%#H5&!8I\"\"8E#\"8=#"
- "\"XE%\"8Q##8U$\"8Q!$(]'#(Y#\"X]\"\"X]\"#I)%$I)#\")1\"\"I%!!Y)$$91(\"I1!$)I!"
- "$Y9*#)=##9M!$)M$#Y9#\"9E#%)M!#YM#$)U##9Y'%II'%9Y%#*!\"$)]#$9Q%!*%!"
- "#I]!!Z)!\"Z!\"$:-#\"J1!\"J1!$JA!#Z=\"$*=\"\"Z9!#:E##J1!$*E\"$*Q\"%*I\"$ZM\""
- "!ZQ!#ZQ!$J]!$JU!\"ZY!%;)+$;!\"$+!\"$+%\"#[%!#+%\"$K)$$+5\"\"K-$#[5!%;-#"
- "\";%\"$K5$$[1!%[E$&;5'&+-\"$[=!%[9%&[A$%[=%&+E!#KE#'+I*&;=&%;E\"$;I\""
- "\"+I)#[I!$+Q!';Q'&+U%%+Q!%[]$&+U!%+Y!$;U\"&KY#&K]'#\\!$&K]'&K]'%;Y\""
- "%,!!$\\!$$+]!&;]\"$<)\"(,%*&\\1(%L-#'\\%#&+U!&<1!&\\%(&,-$&,%!'<-!%,%!"
- "',)%%,1!%,)!&,%!%,)!%[Q%%<)!%<5!(,=-&,5%#,)!&,%!%,%!&<%%$<%\"%,%!"
- "%\\9#%L5#&+]!%\\!#%+Y!%;]\"$<%\"%L!'#,!!&;Q&%,!!%L5##+Y!%KY''+Y!%[U%"
- "%+Q!&+Q)$+U!$+M!\";Y\"&KQ#$+M!#[=!&[Q)&+M!%+M!#[I$'+-\"%[A%#[A$$[1!"
- "$[A!$[=!%K1$$+9%$[)!$K='%+A&![A$$[9!'K-!$[)!!Z]!%+9!\"[%!#K)#$;5\""
- "$+)\"$K!$$*Y\"&+)\"$JM$$ZU%#JA!%:E+#JE!#JI!#JA!&:A!$J9!#Z5\"#Z=\"$J=!"
- "\":5\"#J9!!Z1!%J5!#Z-\"%9U\"#J)!\"Z-%#*)\"#9Q!$J%&#YY\"#)U&$)U##IQ\"%)U!"
- "#9M!%YI(#YE#$IA\"\"9A##9-$\"I5!#)5#\"I-!#9=$!I=&\"Y)\"#I%#$Y%'$HY&!H]&"
- "\"H]!!XY$$HY'!8Q\"!(M!$(M%\"XI\"$(U$\"8E#\"X9%\"8E(#X=!\"H9$\"81&!X1'!H1#"
- "\"7]!\"W]!\"W]#$(!#$(%($(%(\"H)!#X=$%X5!#(A#\"85!\"H9!$(A(\"89#\"(5#\"HE$"
- "\"HI!#(U#\"8M!#(Y##HQ&\"8Y!\"8Y!#(I##Y9#%)-\"#Y%##I)%!9!(#95!$I1#\"I5!"
- "$I9\"$Y9$\"IA!!Y1!#91!$)M#$)U#$9M!#IM%$Y]##)U\"$YU##9U!%)M($9]$#IU!"
- "\"J!!%:%(#*%##Z9\"$J1\"$J-\"#Z=\"$J5!&*9#$:1#&:=!$:9#%*A&#JA!$:I$$:A#"
- "$ZM\"!ZU!%*A&$*U\"#ZY!$*U\"#ZY!!ZY!#Z]!$+)\"%+)&!;%\"#;1&&+5\"$[1%#[)!"
- "&+9&$K5$#[1!$[5!%[5%$[=$'[9*%+=\"$;=\"%+=\"%[A$\"[=!';E+'KI$$[E!%;I\""
- "$[E!$+Q!!+I!$;I\"$;Q\"%KI(#+Q!#,)!%+]!%[U(#+U!%KY#&+Y!#[E!%+Y!)L!\""
- "&[]#%;]!!K]''+Y!',%!%L%'%L)#&<-!%,!!%,!!(+Y!%<%!&\\-#&+Y%%<5!%,!!"
- "$,%!%,-!&<%%%+Y!%,%!$<%!%,!!$K]#%<1!',%)$,%!%+]!'<%*%<%\"',!.&<)%"
- "&<1!#,!!&+]%'<-*&[])$<!&%\\%#(+]%%;Q\"%+Q!%+Y!$\\!$%+Y!#+Y!'KU#&;Y'"
- "$KY#$;U\"&+Q!#;M&#L!#%+M!%KA#%KE#$;M#&+5\"%[I!#[I!%[A%(K=$%+-\"$[=!"
- "$[9!&;E&%+5\"$;A\"#K1#\"[1!%;-#$;-#%+!&#[1!$Z]%#[%!$:M##[%!$JU!&*]&"
- "$ZY\"'Z]\"$ZM\"\":Q&$*]\"$*U\"$JM!#:A#$JQ%#J=!$:9$%:A(#J=!%J9%\"JA#\"J-!"
- "#Z5\"$*5\"#Z1\"\"J%!#Z=\"$J%\"$J1%#J)!$Y]#$9Q!#Y]\"%Z%*#IE\"\"YM!$YQ#$)M#"
- "#YQ#%IE$$9I%$YE##I=\"\"Y9\"\"I9!#I9%\"I=!$Y5$\"Y%#\"I-!%)1\"!)%!!)-!!H]!"
- "\"8Y!\"8Y!\"8M!#8]$\"8]!\"8M&\"8Y!\"XE\"#(A$#(A!#(9!\"85!&89,#(5#\"H1!#89$"
- "#H%&\"WY#!7]\"#X)!\"7]&!H%!\"8)!%(-*\"81!\"X1#\"H9\"\"X1#$X5##(E$\"XA#\"8Q#"
- "\"8M##(I##HM#\"HQ!\"8Q#\"8U!%(Y\"!HU##HY%#XY#$I%$!Y)!\"Y%\"#I-\"$9))\"I5!"
- "#9E##9A$\"YA(!Y1!#9A$$9E%\"II!\"9M##IM\"&)Y,#9]$%)Y+$)U#$J)%#I]!#Y]&"
- "$9]$!*-!#Z%\"%Z)#\"ZA!$:-$%:-!#Z5\"\"J%!#J9!#JE!#JM!#JA!#Z=\"%Z5.*:I'"
- "#ZI\"$ZM%#ZY!#ZE\"$:M+#ZU!%ZU)%ZY\"$*]%#Z]$#[)!%+!\"\"[%!%K%!&+!*%K%!"
- "$:]##;-\"#[1!#[-!%[5!%[5!$[5!&[=)&;9'%+=\"$;)\"'+A!\";E\"'+)\"'+E\"&+M!"
- "#[5$&;I&(;A#%;Q\"%[I$$[M$&+M!\";Q\"$L!#'[I!&+U%&;U'%KU#(+Q%%[M$%+Y!"
- "&+Y%&+]%'[U)%+U!&K]'&+]!%+]!%+]!&[](%+]!&,!!%K]##,!!$L!#)<!+'<9%"
- "'<!&#<!&$L1\"&,!!',%*%+]!%+]!)<%&&L%'&,%!&KY#%,!!&<-!%\\!$$[Y$\";Q\""
- "%;]!&+]!%;Y\"\"K]#%+Y!%;Y\"%;Y&#[Y$%;]!$;U\"\"+Y!&;]\"%<!\"![=!$[U$%[Q("
- "$;]\"&KM(#+Q!$[I!%KM#$[A!%[I!&KM#$;E\"&;I\"$[5('+A\"$[A!#[-!%;9#(+A&"
- "\"[5!%+5&$;9\"#[1!$;)\"#;-\"$JY$$[%)#[)!$[)!'+%'&K%,#:Y\"%JU)$J]$$*]\""
- "$*Y\"#ZU!#ZA\"$ZQ!#JI!&:E!!*Q!&:I%#J9!$*A#!*1!#*9\"$*9##:5##:)##Z9\""
- "#*1\"\"9]\"!Z5!\"Z!\"$J%&%Z9##J!$$9]$&*%$%Z-#%9U%#9U!\"YY\"#9U!#9M!#9A!"
- "#)E##9A!$99%#9A!#)A##9=$#9)!\"I1!!Y9'#9!!\"I%!#)%##Y!$$)-$#(]##)%#"
- "#X]##HU%#8Y$#(Q##H=#!H]!\"XE#!H5##8M%\"8E!#H9#\"H=!\"89!#X-'\"X-#\"WY#"
- "%'U*\"7U!\"X!##7]%\"H!'!H!!\"WY!\"X1#\"X-#$85$$8)$#H)##(9&\"H=\"%(=)#8E'"
- "#X='#XI#$8M##(E$\"8U!!HM)\"Y!##(Y##)!#\"8])!I%##9%!\"I!!\"Y=\"$)5'$I1)"
- "#Y5#\"Y1\"\"I=!\"I9!&9='\"Y=\"!IE&#IE%#YM#%YM$!9U)\")M(!YU!\"YQ\"&YQ%\"I]$"
- "$9]$$Z)##J)!#J)!&*)!#*-&!Z1!%:9(&:5,%JA%$Z5&%*=&$:5##ZE!#J=!!ZM!"
- "&:=!%:I(#:Q\"%ZM\"#ZQ!#ZA!$J]$#[%!$*U\"#[!!%:]$$[-!$K)$';%$%K-$&[%*"
- "&+-\"![)!$K5$$[-!$;%#'+1&$[5!#[5!![=!'K9,#[1!%+9\"$[9!%;M#$[A!%[A%"
- "%KI##[E!'KQ#'KA$$[E!$[E!#L!#$;M\"$+M!%+E!$KQ#%;Q'$,!!$+9\"&KU'%+Q!"
- "%\\)#&+U!&KY+#+Y!%,!!(+Y*'KY,&;Y\"%+U!%L%#$+Y!#;Y\"%;]!#[]$';]*$;Q\""
- "*+U%%+Y!%,%!&KQ#%+Q!&KU#$+Q!&,!%&K]'&,!!\";]\"%+]!%+]!'K]'%,)!%+]!"
- "%+Y!&;Y\"&;Y&'+U*$;U'$KU#%K]#'KU'$[M$%+Q!#KQ#\"+]!$[M%#[A!$+M!'+M%"
- "&+M!%+Q!$[Y$&+I!$[E!&[E!*;E'(+A&'K9$$[9!&;A\"%K=#!;A\"%;9'%+5\"%+I)"
- "$+5\"%+1!#+!%!+-!\";-\"'J]%![-!#[%!$*Q\"%K%!$*]%!*]!%+%&#Z]!%*Y&$ZY\""
- "%ZU\"#ZU%$:U$%:I$!ZM!#JM!#ZI\"$*=##JA!#JA!$Z=\"$*5\"#J9!$:%$#J%!#J-!"
- "#J-!$J-\"%J-\"#J%!$)Q#\":%\"#J!'$Y])%*!!$9M$$9U!$*!##)Q#$9U$\"IM!#IE$"
- "#YI#$I1##)A&#)5#\"Y=(!Y9!\"I1!%I5*\"I-!\"I)!#Y)'$)%!#(Y!\"Y!\"$)!(#(Q#"
- "!HM!\"X]\"$8I#!H9#\"XI%\"XI\"#(Q#&HE*#(-$#X9*#H=##X1&!H!!#(%$\"X-\"\"X-\""
- "\"GM\"\"'U#\"7Y!\"WY#\"W]#!7U%\"H%%\"G]!&85,!H1)#(1$\"H=\"#(5#\"8=!\"HE'!XA!"
- "#HA\"!(U!$XA%\"8=!#8Q!\"8Q!#(U##(U!#(Q#\"8I#\"Y%\"#X]#$(]$&9!(\"I%!\"Y%\""
- "$Y-$$91(\"X]\"#I5%%99##IA%#)9#%)E'!YA!$)I$$9Q%$IM&#YQ\"\"YU%$)U#&IY+"
- "#:!##Z!\"$*!##*%#%J!)#*-&#J-!#Z-\"$J1%$:1$$J=!$Z9&#JE!\"ZI!#J9!#JA!"
- "#ZA\"#JA!%ZI*#J=!%ZQ\"\"ZY!&JY!%ZQ\"#ZQ!$:Y#%*U'$J]$&Z]\"!Z]!&[!&#;)\""
- "#ZY!%+!\"#[%!#K)#![)!%;!#$;-&%+1&#[5!#K)'&+5&&+9&(+%/$[=!&[1)$[=!"
- "&KA(%[A!$KA##[9!&;E'#;E\"$[E!$[A!$+Y!&;Y&$+]!%;U'\"[I$$KU'$+]!#;U\""
- "$K]#$;U\"%+M!%+U!';E'';Y!$+U!%+U!#,!!$;U\"#+U!%,%!$,!%&[Y$$+U!%[U("
- "';Y+*+Y*\"<!\"$KY#%,!!%;Y\"%KY#%K]#%+Y!%;Y\"\"<!\"'+U!)+]!\"+]!&KU#\"[U$"
- "&+U!&+]%(+U)'+]%$[I!$[I!&+M!$+Q!#[=!$+M!%[Q)\"[I$$KA$(+Q.$[I!%[U$"
- "&KE#&KA($[5!\"[E!&[=)$[-!)+I/$[A!$[=!$+9\"'+9&$[9!#[5!%K9(%[)!#+1\""
- "#K-$\"+-%%[%)#Z]!%[)!%;-##+-%$+-\"%:]'$[!!$*]\"\"ZU!#ZY!$*Y\"$*]\"%ZU%"
- "$JQ!\"ZM!&*I.%*I\"%*M\"\"ZE!$:E$$*A\"#JA!#Z5\"!Z=!$*)#$*=#$Z5\"#Z-\"$Z-&"
- "$*!#$Z)&#J%!$:!$$:!!%IY##)]&#IQ\"$:)$%:!%%IQ##YI%!IM#$9Q$%9I\"$9M%"
- "&II!$I=&#)E&!Y9!$)5$\"I5'$Y1*!Y-!\"I)!!)1!#(Y!$9!%\"I!'#8]$#)%##Y!'"
- "\"8Q!$8M(!(U!#HI&#(I!\"H9\"\"8=!#(E!#(=$\"89!\"X1\"$W]+!H9##8)%!X!$\"X%!"
- "#7Q%$'Y(\"7U!$']##G]&#W]$\"X!#$X9\"#X)'\"(!##(1#$85)!H5!\"85!\"89#\"8=!"
- "#8A$#(=##HI%\"(I\"\"XM\"#(I#\"8E!\"8U!!HY!#)!##8]'\"I1!#(U#\"I%!\")1%#Y)#"
- "\"X]\"#9-$\"9)1\"95##Y5#$I=&$9=\"#YE\"&IE!$YE&#9I!#9I!#YM#\"YU$$)U##YQ\""
- "#9U!':)*%Y]'%*!!$*%#%:!\"\"J)!#J-!&:A)#Z9\"#:1#%:1!$Z9\"#JE!%:A,#J9!"
- "%:A!#ZA\"#JA!%JI!$*Q\"$:Q*#:Q\"&*M'&*Y+#ZQ!$:U$!*Y!$*Y\"#Z]!%+%\"#[%!"
- "';!$#[)%$;)#$K5$&;)'#[1!%[-%$+-\"$[%!%[5!!+1$%;5&&;)$$[A!%+1\"'K9)"
- "%[=$$[I!![U(#[5!&+A!';I'&+=\"&+A\"$[E!#[I!&;A\"%;E\"&+M!\"+]!$[M$%KM'"
- "$+M!\"[E!\"KQ#&;]&!KI#%+Q!$+Q!#[E!$+U!&;U&%;I\"%KU#$[I$!+U!#[Y$%+]!"
- "&;M#\";E\"%<!\"([](%;U\"'KM'\"+M!$K]#%;]!%+Y!%+Q!%KQ#$[I!);I+%;Q\"%+I%"
- "$+U!#[I!$+Q!'+Y%$+Q!$+M!$;M\"%KM(%KE0!+M!\"[E!&+Q!#;E\"%+M!$;E\"%+A!"
- "'KE,%;A\"$[A!%;A\"#[9!$+=!&+A\"&[1%([-&$;=\"%;1\"%K)$%;9&$+1\"$;5\"$+1!"
- "$K-$$;-\"!+1$%+)&#[)!$;-&#[!!$+!\"%ZU&\"Z]!#:M##ZY!%JQ!$ZU%#ZQ!#ZQ!"
- "$ZM%$JM!$JI%#ZI\"$JE!#JE$#JE$$:E##ZA\"&JI*$Z9\"$:5##*5&#J-!$J5!#J)!"
- "'*)!#Z%\"#Z%\"$Z1&!YY!#YE#$9]$%YQ!#YM\"#YQ##)M\"#9Q!$9A$#II!#IA!$IA%"
- "#IA!$99(#)5#\"I1!#Y9#\"Y%##))#\"I!!#9)!#I%\"#8Y!\"9)#\"X]\"#(M#\"8Y!\"8I!"
- "$HY$$(E'#XM!%(A)\"8A#\"8A!#XE'\"8=!#(1##H!!\"89!#X1'#X5$#WM)\"H1\"#(5#"
- "#GM$$'Y)\"GU\"\"'Q#\"7]!#W]$\"H%$#X!$#(-'\"8)!!H=!\"X-#\"(-#\"X5#$8E)$H=$"
- "\"8)!$XE($(E(#(E#\"XA#\"H]!$XY%#8]$\"(I\"\"8U!#XU!!Y!!#9!!#9)!#I1%#))#"
- "#Y-#$)1'\"II!#9)!\"II!#Y9#$)='!YY$%)I!&Y-&#YE\"$Y=!$)I#!)5!#IU\"$Y]*"
- "#)Q&#9A!$IU%#I]!#J!$%:!%%:1$$Z)&#Z)\"%:A(!Z1!%J1\"#J5!$:9##J9!%J1\""
- "#:-##ZA!%JE!&J=*#JI!$:I##JE!!*M!$*E\"#JM!#JQ$$:U##ZQ!$:Y##ZY!$*]\""
- "#Z]!!ZU!#[!!&;E+$K!$\"[5!$[-!&+1\"![5!%[-!&[=%#[%!#[5!$+5\"%;)#%[E!"
- "\"[=!(+=!\";=\"%[9%%+9\"%;U'$[A!&+E%'[5&#[A$$+E!%[E!%;A\"&KA##;E\"&[I$"
- "$[I$#;]\"&+M%&+Q*$+Q!$[I$$KQ#$+M!$+]!&K]+&KQ'\"K]#$+Q!'+U.$KY#$KQ#"
- "%KQ#&+Y!#KQ#$;]\"&+Q!$+Y!#+Q!$;Q\"&;M\"$;Q\"#[A!%[I$&+Q1$[I$$KM#$[5$"
- "$[U%$+U!%[Q(#[I!$+Q!$;Y\"%+A%#[I!%;I.$[E!![=!\"[E!&;1(%+Q%%+9\"%+U!"
- "#+I!'[A!$[A!&+=\"#[5!&[9!%K9$%+1\"#[9!\"[=!$K9$$+1!%K1$%+)\"%[)!#[1!"
- "\"K-$$[%!#+%\"%[)&%:Y'!K!#&+1&#[%!$*M\"$JY$%ZY&%K!)$*Q\"$JU$%ZQ\"$JA$"
- "%ZY&%JQ(#ZE%#*E\"$J5(#ZA!$*9&\"ZM!%:-%$J9($J1\"#J-!$J1!#Z-\"#J)%#J!!"
- "\"J)!&*-+#J-!$*%##IY!#*%##)E##YY\"#YQ\"\"IM!\"IQ!%II##YM##IE\"%9Q(!Y5!"
- "#9=$#YE)#95$\")5%\"I1!\"I)!\"Y)\"!HY!#I)\"#I%\"$(Y!#(]#\"8Y!\"8U#\"Y!#!HQ!"
- "#XQ#\"8M!#HM%#(Q#\"XE\"#(A$!(9#\"89#\"X5#!H5#$8-!%())!(-##X%!\"8%!\"7]!"
- "\"7I!\"WM##'Q'#X)'!X!\"\"X!#\"GY\"\"']%$(%(\"8!#\"8)!\"89!!(5#\"X-##(%$$85#"
- "#(A##H=#\"XA#\"H=!\"8I!\"8U!\"HM!!HQ##XQ'#(U#\"8Y!!H]#!9!\"#Y!##Y9##9%%"
- "!)%!%)-&#)9#%)1%#Y9#$)9!\"YI\"$9I$$)U##YI\"#YA##)M\"\"II$#)A##YI\"$YQ#"
- "$9U!%)U!#Y]\"#Y]\"#)Y##J%!#J!!&:%-#J%!$*)&#Z%%%:-!%Z9\"#J9!$*5\"%*9&"
- "#J1!$*A##J=!%:E!#JI!!*E!'ZI'#JI!%JI-\"JQ#%JQ!$:Q$$:U#%:U$#ZY!\"ZI!"
- "%*]&#+)\"$:]#%+!\"'K)%&Z]*';%(#[9!#[)!%[-%#[-)%;)'$K5#%[!&$+1\"&[5*"
- "#+9!([-&$[-!#[9$#[=!%[=!&;1'$[E!%;A\"%;A\"$[A!%+9\"&;I\"%;E\"$[E$\"[=$"
- "#;9\"$+U!%;I\"&+I)&KM''+M%%;E\"$+M!$+M!\"+M!$+M!#+]!$+M!&;I\"\"+M!$+M!"
- "%[M$%+E%%;=&#+U!$<%\"$;E\"%;E\"$;M\"%+E%#;M\"$+M!';I+$+M!$+M!$+M!&[A$"
- "([I%'+U*&+M!\"[I!%+1\"%[I$%+1\"%+E!%+E!&;E'#K=#%KA#(;=##[I!#[A!$KE#"
- "&KE$$+E!';1,\"[9!$[=!&K5($[)!$[5%%K1(&+=&\"K1#\"[)!$+-!%[-&&[)-$;)'"
- "$J]!#+!\"!Z]!%K!!\";%\"'*]/%[))#JI!$;!#\"ZY!#ZY!%*Q'\"ZM!#Z=(#:M##ZI!"
- "\"ZE%\"Z9%#ZI!$*9#$JA!$J9!#Z9!#Z5\"%*1#$*I&#J%!#J=!#Z)\"&:)\"\"Z%\"#:-#"
- "%*!(#)Q#$)Y#\"Y]!$)I$#9Q!#9U!$IE#\"IA!%9I\"#IQ\"#Y5#%9M\"$9A%\"IA!$IE\""
- "$Y5$\")1\"%9I)\")1\"#))#\"I-!!))!$Y%'$)5$#Y)##X]!\"8])\"I!$\"8M!#(I#%(U+"
- "$XM$#HM%\"HI!\"HE!#(I'!(=!#89%$8A#\"89!!H5#\"X1##8-(\"81!\"8E#\"X%#\"X!#"
- "\"'A\"%7U#$'Y)!GQ&$'U#!GY!\"W]#\"WQ!!(-!\"7]!#8%%#()$#H!$\"X-#!X1!#H9#"
- "%X9'#(=#$X9(\"XI\"\"8M##(I#\"HI!#HM\"\"HA%\"HU!\"(]\"$HM)#8Q$#(]&#I!\"!)%!"
- "$9%%#))##95!#I)&$95($95%\"Y9\"$95%#I=!$IA#&)5,!YA!\"95##9I!#IM!%)Q'"
- "!YQ!#Z!\"%IU''9Y+#J!!#J!!#J!!\"I]##I]!%:)%\"Z-!$:-#\"J)!$Z5&#*9\"!Z=!"
- "#J9!#J=!$J9!#Z=!\"Z=!#ZQ!#Z9\"\"*M!$*Q\"#ZQ!#ZI\"&:M!!ZQ$\"ZE!#JI!#ZY!"
- "\"*Y\"\"JY$&*]'$+-\"$[!%$:U##[!!%[))#[%!#[9!%;)'\"[)!$;-##[E!%+1&&;1#"
- "#[5!$;1\"$[5!%;5##[=!%+A!%[5$$;A\"%+E!$[5!%;=\"(K=$&[A)#;M#%;A\"\";Q\""
- "'[E))+5+\"[E!$+E!&[-!&[E!&KM(#[E!(KE($[9!'[I!&+9&%[E!$[E!%KQ#&;M\""
- "$[I!'+U*%+M*&;Q'#[E!&;M#$[I!%+Y!%KI#'+I*%;M\"#[Q$%;I\"$[I$$[I!$;E\""
- "$[I!$;E\"(+I.$[I!%[I$#[E!$[I!'KA(%+E!$[A!$[E!$[=!%+=\"%;=\"![=!'+9\""
- "$[9!%[1!#[1!%[5%\"K!$%[5$$+M!#[1!\"[1!\"K)#%+1&(+1'#[)!&;%,#[%!#[%!"
- "\"[-!#+!\"\"ZQ!$ZY%#*Y,#:Y#%*I\"!*Q!$*Q\"#ZU!%*Q##ZU!#JQ$$*M\"#JI!#*Q\""
- "\"*Q\"\":A\"#ZA\"$ZA%#Z=!\"Z=!&*9,$Z5&#J%!$J1%$:)$%*)'$*%#$Z)#$*)#\"Z-!"
- "\"IQ$$Y]*#IY!\"J-$&9U-\")U%$9Q!%YM$#YY\"%)M$#YY\"$IE#$)A!#IA!\"Y=\"#Y5&"
- "#)5##I5%#I1%#I!#\"H]!\"I%!#I%##Y)##(U!#X]##(]##(Q#\"HY!\"XQ\"\"XQ%#(E!"
- "$8Q($(I$\"HE!#8A%!X9!\"XI\"#X5$\"89#\"X5\"\"81!#(-,!8-\"#(-!\"H5*#8!\"#7]#"
- "#7A#\"G=\"\"GI#\"7M$\"WQ#\"7U!!7Y\"\"8)!\"W]#\"7Y#\"8%!\"89$\"H1!\"X%%#(5$!H9#"
- "\"X9\"\"H9!#HA%\"XU\"#(A$#HE\"#(I#\"I)$#8I%#XI&$(U'\"8U!\"8U#!)!!!(I!#Y-#"
- "#I%\"#HU\"!))!\"Y-\"#)1&\"Y%\"!Y5!$Y9$#)=#!)=$#YM##9=!\"YE\"%IQ#%)E%#YM\""
- "$IA#\"IQ!$)U#$)U#\"YQ!\"9Y&$9]'$9]$$J!%%)](':!&#J)!#Z1\"$Z1\"!Z-!&:5!"
- "#J1!%:5!#J9!\"Z=!$ZA%#JA!#Z1\"\"ZE!$JI$#ZI\"#JI!$*Q\"#JM!%*U'#*E\"#*U%"
- "#ZY!#ZU!%J]!#:Y'#Z]!#Z]!$[5!$[!!$Z]!#[%!#[!!#ZY!#*U)#[-!%K)($K-$"
- "$[1!$;1\"#[%!![1!$+5\"$;=\"%;)#%+=!$;=\"&K%,&+=\"&+1\"%+=%&;E\"$[=!%;A\""
- "$[E!&;A'$[I!$[=!$[A!$[A!#[I!%[=!%+I!%+E!$[I!#;=\"$;E\"%KA$$;E\"$[E!"
- "\"[I!$[E!$;9\"&+E&%KI##;M#$[A!%<!\"%KE$%;A&%;E\"%;E\"#[E!%[I$$[A!'[I("
- "%;E\"&K5($+A)$+1!'[I$\"[A!%KA$$[1!&+=&%K5$&+=\"&;9'$[=!$[5!%;=\"'+5&"
- "#[9!&[9!\"[)!%+-*%+1\"$;1\"$;-#$+-\"$K)'$+-!#+)\"$+%\"#[%!%K%$%[!)$[!!"
- "$;%##Z]!#Z]!$*]\"%ZY&\"*U%#ZY!$:Q$#[-!#:U##ZQ!!*M!#ZI\"$:I#\"*A\"#ZE!"
- "\"*I\"$ZA&#J=$#J=!#*9\"#J-!\"Z=!$Z-#!*1!!Z%!$*%*%Z!*$*%#$:-#$IQ&&*%!"
- "%*!(!YI!$I]\"%YU$%IY&#IU\"$9M%$9M$$9I%$)E$$IE%$IA#$IA&#))##Y=&\"Y9\""
- "#))##I1%$)1!\"I1!!)%'#Y%##I-\"%Y%\"#XY#!9!\"#(Y!#(U#%HU%!HE!#(U##(A!"
- "!(5!#(A##(M#!(I!#(A!#(9!!H9#\"XM\"#85\"#(-$\"X%##H))\"H)!#8!%!WY!\"WU%"
- "\"'E#\"'I!$WI!\"WQ#\"7Y!#7U#\"7U!\"7]$#W]'\"H!\"\"X!#!H%#!()!$(-\"\"8)!\"H5\""
- "\"H5!#H9(#(9!\"H=!#8A$$8I)\"HE'\"8I#\"(U%#(]#%HQ($8](#8U'#(U#%Y)%\"8U!"
- "#I!#$Y!%\"I-!!I!%\"I-!!)-'#)=##9!$#Y=##YI#$YE#&9A#$I1##9E!#II!&II$"
- "#YM##Y=##)Q#&)Y!#)I#!YY!#YY\"#)]##J!!%J!&$J%&%*!'\"J)!$Z)&$*A\"\"J)!"
- "#J1!$:-!!ZE!$J9%$:9#%JA)#J)!#ZE%!ZA$$J=!$J=%%*I#$ZI%%ZI\"#ZM%$JM!"
- "#ZQ!#ZU!$+!\"$+%&$J]$%*Y&!*]!$;-\"#[!!$:Y'%*]&$[!%#ZU!#[%%%[1!#ZY!"
- "%;!'$[9%#*]%![1!%K5(#[)!#;E\"&+%\"$[-$%;1'#[9$%K=#$K9$$[=!&J]!&K9("
- "$[=$%[9!&KE$&[A$%[=$%[A$&[A!%;A\"$[9!&;E'%KE#%;1\"\"[A!#[A!'+A*\"+M!"
- "$[=!$[E!&[I$%;E\"&;I&\"[)!%;Q\"%;A\"$[=!%;A\"%;E\"&;='$+A!%[=%%[=!%+Q!"
- "$[I!'+=\"$[A!%+9\"$[=!&+A&(+=\"$K9#$+9\"(;1(%;)#'K9)%+5!$[5!$;1#%;5'"
- "$+)\"#[5!#[-%#[-!![-$$[-!#[-!#K)##[),$J]$$;%\"#[!!#ZU!#+1-%[%&$+%\""
- "$+%\"#JI!#JQ$\"*Y!!*]$#Z=\"'K!!$:Q$%JY$$JM!$*I\"$JA!\"JE'\"Z9!\":A\"#J=!"
- "#J9!#Z=\"$*9\"#J9!%J%*#ZA!#:1#\"Z5!$Y]'!*%!\"J%!#Z)\"!:%\"!*!!&*%!$)U#"
- "#YM#$*%#%)E'$9](#9Q!$YM'%9M)#9A!#IE!%IE#$)E!$IA&\"IA!\"YM\"#YA#!I)#"
- "#I1%#91$\"I%!!)-!\"I1!$)!$#HY\"#)%$!(Q#!XU!\"HQ!$XM\"#(M#\"8U!#(M#\"(I\""
- "#H9&\"HQ!\"XA#\"XA%$X1&#W]$\"H5\"\"X)##8-%\"7Y!#H)%$H5*#()$$8!$\"H%\"!H!#"
- "!GA#\"WE!!WA$\"7Q!!GI!\"'Q\"#GU##W]$$'Y##H!#\"'U##(%'$(%#\"()##H)$$(1\""
- "!H%!\"X5#$X)+\"85!\"H9!#(A$%(E&$HE'#HQ(\"HQ!$HU)$(Q'\"HU$#9!$\"8]#\")-\""
- "%8U,#)%'%I%!#I%#\"Y-%$)-$#)1##)=&!I9##)5##)9#\"II!&)=&$9=%$IY\"$9A\""
- "%II##YM##9U!$9M!&9Q#%:!($9Q!#IY!%:1(%)Y$$*!##J%!!*%!#Z1\"%Z)*\"ZA!"
- "#J-!\"J1!$JA$%ZE\"$*5#$Z9\"\"Z=!%ZA#!ZM!#Z=\"'JE&#JI!!*I$!*=(#JI!(JY*"
- "#ZQ!$*U\"$[!!#ZY!#ZU!#ZY!%ZU*!*E!#*]\"\"*M\"$*]\"%ZU)&+%\"\"ZY!$+-\"&;)'"
- "\"[)!!;)\"#;)\"$K)$#K-$#[-!%+1&%[-!&[5-$+5\"$K=#\"[5!&+1&$[A!$K5#'KE("
- "%;5\")+9+%[5!$+9\"#+-\"$;E\"%[=!#[A!%[A!%+=!%+=\"&+=&$[=!$[9!%[=!$[I!"
- "&+A&%[I$%+M!%;A\"&KA($KA#$[I!&[9!$[=!%;E\"&+=\"%+=\"$+=)#[=!%K5$![E!"
- "&K9$&+9&&;5'$KE+%+9!%;9\"#K=();A,$[9)$[)!$ZY%&+9\"$[5$$[E$%K-(%[1%"
- "#[!!$[-!#+)%$[-!$K!(#[%!#[)!![9!';%$$+%\"$K%$$JU!$:U$%J]!#:M*$JY$"
- "$J]!#+!%$:M#\"Z]!$ZU%$ZU\"%JE%#JM!!:I\"%*I\"$ZM)#JI!$ZA&#J5!$*E\"#J=!"
- "#JE!&*=+#Z-\"$Z1\"#Z1\"'*),#J-!#J)!\"J%!#J)!#:%'$:%$!Z%!$J%%#I]!$9Y$"
- "#IQ\"#9U$\"9Q##YM&#YI\"$)E$\"9I#$YE&$IE&$)A$$9I$$IA%#9A$#)9#%9-,\"9)&"
- "#I)%\"I%!!Y!!\"I)!$9!#\"I%!%(Y\"\"8]!\"8Y!#(]##HQ%#(M##(]#\"(M\"$HI'$(E%"
- "\"XE\"\"8A!!HE)#(9&#(5##85$\"H1!\"85!\"X-#\"8A#\"H%!$H%%\"7M!#G]!\"7Y!\"GA\""
- "#'A)!G5!!'E%#GI'!GU!#'U$\"7Q!\"GU\"\"X%#$7Y)#WQ(\"8)!!H%%\"7Q!\"7]!\"X)#"
- "#(1!\"8-!#XA!#(=$\"8=$\"H=!#XI&#(A$$(E$$HE!#(Y##8M!$XU'$)!$\"8I!$)%("
- "$I-'\"I!!%(U&#9%!\"I)!#HY\"\"I%!$I1)\"I%!\"I)!$)A!!)=!#)=##Y=##99!#9I!"
- "#YM%$)U#\"IY!%)M($)A$!YQ!%)Y($J%%#YM%#J%!%)]'$*!##J!!\"J%!$:)!#Z)\""
- "#J)!\"Z1!$Z5\"%J-&%*=&#Z1\"\"Z5!':A!#Z=\"#J=!#JE!#ZU!%J5\"#JI!!*E!$:M#"
- "$*Q\"\"ZI!\"JE'%ZQ-#ZU!%K!$#ZY!#ZQ!%JY!#ZY!#[!!%+!\"%Z]\"&+!\"$[!&#[!!"
- "#+%\"#[%!$*]\"$K%$$;)\"#[!!%[-!%K-$#[)!#[-!%;5\"%[1%%;-'#[5!%;5&![1!"
- "$;5\"\"[5$%+5\"&+E%$[5!$[9!%+9\"([)+%+9\"#[9!$K9$$[1!%[9%%K=$#[-!#;=\""
- "$[=!&;9''KE#%+9\"';=#%;1#%+5\"%+1\"([A!%;5#$J]!$;5\"$+9\"$;A\"%[9%&;9\""
- "$[1!%[9%&;1($[A!#[5!$K5$%[9%$K5#$;-'%+)\"%;!$$[A!#[-!&[-&&K-)!;5&"
- "#[)!$[1%#[)!$K9$#[%!#[%!$[%!(JQ.$+!\"#[!!%JY!\"[%!\"*Y\"\"ZU!$;!\"#[!!"
- "$JM%%:M'#ZE%\"ZI!#ZQ!$:M$$:M#$Z=%$:M$#ZE!\"JE$#Z9\"#JI!&Z9##J=!#J)!"
- "$Z9\"#J1!#Z5\"\"J1!!Z1!#J5!$Z9&#Z1\"\"J)!\"9Y&$9]$#YU&$9]$$I]%$9Y$#IU("
- "%9I\"\"9Q##YQ%$YM#%)U($9E$%II#%YA+#9A!#9=!$IA)%)5%#I5%\")5\"#Y=\"$)9'"
- "\"Y-\"#Y)'\"9)#$I9\"$Y!!$X]!#)%#$(]$\"8Q##(]#\"(U(#8Q$\"XQ\"\"8E!#HE#$8E#"
- "#(A#\"X=##X9!#8!##85%#H1&#8%\"\"89!\"X%\"#']!\"H)!!H)!!H!!$']%\"WQ#\"7U!"
- "\"'I\"!WA\"#WA*\"WM#\"'I!\"7M!\"WI!$7U\"\"7]!#'Y$\"8)!\"G]$\"H!\"\"8%!\"8)!!X-!"
- "#']$\"X)##(5$\"X5##8-%#(A$\"H=\"#(I##HE#$(M'$8I%\"8Q!#8I$#(M##HU\"\"I!!"
- "$XY$\"HQ!!HY!#8]!%(](\"I1!\"I-!\"I)!#95!\"Y1\"#I%#!Y5$\"9A#\"YM!%I=*#YA\""
- "%)I(%9Q)$)Q$$II&\"IM!#9Q!\")A\"$Y=#$)M$!YY!!)U!%I]&#J!!$Z!\"#Z!\"&*-$"
- "&:)\"%:1(&Z-'#J)!#J1!$J5!\":)&$*5\"#Z=\"%*A'#J=!&J=\"$:9##Z1\"%JM!#ZA\""
- "#JM!%JM!#ZE!&*]\"#*A\"$ZQ%$*Q\"\"ZY!'*U'$*M\"&*Y'\"ZY!$+!\"$J]$#[!!#[!!"
- "%*]\"%ZY\"$[!&%JY!$[9!$+!\"$[1$#[1!$;%#$+)!#K)'#[!%#[-!#K-#';=\"\"K9'"
- "$[1!![-(%[5!#K=#$[5$#[-!$+A!&+5\"$[5!&+5&'+E!&+1\"$[5!$[=!$+=!%;E\""
- "&KE($[9!(+-\"&;E*$[E!%[9!$[9!%[-!%+9\"%[5$'K-!$;1#(:])';9#$[=)$K-$"
- "$;1#$;M##[I!$+5!&[1!%;-\"$[5$$+1!%[1!$[1!$[-%%K!)#Z]!!+%!%+)\"$[)!"
- "%[)!$K%$%K%$#+1\"%K!)%Z]%!+!!$[-!$J]$#+!\"(*]#%*E'%K!$#ZQ!\"ZY!#ZU!"
- "#ZU!$*Q\"$:M##ZM!$JI!$:I$#ZI\"\"ZE$#ZE\"#ZU!#*I\"#ZA%$J1(&*9($JA$#J5!"
- "#J5!$J1\"\"Z5!$*!#!Z%!#J%!#J!$$J!\"#Z!\"#IY!$9]$#J%!$)]##IY!$)]##9U!"
- "#IU(#)E#!9M\"#9A!#9M!#YM\"\"YE%\"I5!#)=#$I=*\"I9!#91!\"I5!!Y%!#95$$)!\""
- "$)-!$99\"#9%!$8U%!I!##(Y#\"8U!!XY$$(]*\"8Q!#HQ+\"XE\"#8E%#(E!$(E$\"(9\""
- "\"8M!#(=!\"X9\"\"H5\"$85)\"81!\"H%\"\"X)%#H)#\"X%#$8!!$G]'!W]$#WM\"\"7U!\"7Y!"
- "\"WM!\"'=#\"'I!#'M&#'I$\"7M!\"7U!\"WI#\"GU\"\"X!!#GY'\"G]\"!H!!\"8)!$8%$!()#"
- "!H)!\"H-!$()\"\"81!\"81&\"89!\"H=!\"85!\"8A#\"X=%\"XA\"\"XE#\"(]%#8Y'#H=%\"8U!"
- "%8Y#\"XY\"#8]$\"X]\"!I!##XU!\"9)#!)-!!Y1!\"9=#\"I5!!Y5!\"I9!#)5&#)-&#)9#"
- "#YE&%I=##IM\"%IE*#IM!#9I!#9U!#IY!%IU&#)]##9U!$II&#9U!#Z%\"\":!&%)Q$"
- "$)Y'%*)$%:)%#Z-\"$:%!$Z1&%*1#&:5%\":5#%J5%&*A'&J=\"&:5)$ZI%#JE$#JA!"
- "$ZI%%:U##JM!$ZI&#ZY!$J]!$*Q\"\"*Y!&JE!$*U\"#ZY!#ZU!#ZU!#Z]%#ZY!$*M\""
- "#[%!$ZU\"$JY$#ZY!#[!!&J])&;-'#[)!#Z]!\"JU##[-!$K1$$:Y##K)$$[-!\"[-!"
- "$[5$$[9%%+-&![5!#[9!#[!!$[1!$+5\"#[9!%;1'#[=!#[-!$;9\"![5!$[1!#[9!"
- "$+1\"$+5!$[5!$K5$$+5\"%;5\"%+=&#[9!$+5\"#[=!%K1(\";)\"&[1%$+1%#[)!%+1\""
- "%+)&#[5!$+5%';1(#+1!#[)!%;='$;=\"%;%#%+%\"$+)\"$[!%$+9!#+)!$[9!#[!!"
- "&+!+$[!!#[!!%JQ!#ZU!$[1!#;%#%*]\"$*Y\"#[-!$ZQ\"%*U&!*M%!ZM!%*Q#!*U!"
- "#JA!$JI%%ZQ\"$ZI%#JI!$JE!$*E\"#J=!#ZI!%:A!&:A%#ZA!#Z9!$JI$'*-)%:5$"
- "#J1!%*1'$J-\"$Z)&\"J-!$Z=\"!YY!&:%\"\"*!\"#)Y&\"9]#$*%#\"IU!#9E!')Q%$9Q%"
- "#9Q!#9M!#9I!$IQ%#9=!%YA($I=&%IA'\"I=!!Y5!$)-'\"YA\"$)1$#I)%#)5&\"8]!"
- "\"I)!%)1(#(]!#8U$\"Y!##(U!\"8Y!#8U$$HQ#\"HQ!$8M)!XI!\"8M!$8E)\"XA##85%"
- "\"8=!%(9#\"H5\"#X1'$81$\"X-#\"8=!!'Y($H!(\"']\"#8!%!G]#!'I!\"WU#\"WQ#\"7Y#"
- "#75%#75(!GE!!W=\"\"GQ$\"WI##GA'\"7M(\"7Q!!WU'#GY&#W]'\"G]$\"WU#!H5!$8%$"
- "$(%##8%%$8-!!H9!%(=)#81%#H9#\"(1\"$HA)\"H=!#85$\"XI\"\"HI!\"XM\"\"Y)%$HQ'"
- "$8U(\"Y!\"\"8Y!\"H]!\"H]!%I)$$9%#\"Y!#!Y)!&)9,\"I5$\"Y1\"$)-$!(]!#95$\"I5!"
- "\"IE!$)A$#IA%%IM##IU\"#9I!&)I)$:!$!9M%$II\"%)U$!YY!\"J!!\"Y]$#)]\"#Z!\""
- "$*)##Y]\"$J5!!:)\"$9]$\"Z5!!Z-!#*9\"#*I\"\"Z5!$J5!$*E&#Z9!&*='%ZI\"$Z9\""
- "#JA!$J=!#JI!&:E!$:Q#$J=%$JQ!$JQ!#J=!$JQ%#*U\"#ZQ!\"ZU$%:Q(&Z]\"#ZQ!"
- "$ZU%#ZY!#ZY!%Z]*&J]$#[)!#+!0#;)\"$+!\"$[%!\"[%!#[)!#[%%%+)\"$K5$'K!)"
- "%;5'#+1%\"[-!%[1!#[-!$K!$!+-!#[1!&+-&#[-!#[-!$[-!%+-&$+-\"$K-$\"K-#"
- "#Z]%#;)&$[-!#;1\"$[-!#K1##[1!)K1.$[5!$[9!$[1!#[1!%;)'#[%!$JU$%[M$"
- "$;)\"$;1\"%+-&![9!\"*]\"&;)'$;)\"#[-!#[)!$[!!%[1!$[1!$[)!\"[%!&Z]\"%JY!"
- "$Z]%#[)%$*]\"#[-!#Z]!$JY$#[%!!ZQ!#ZU!#[%$$ZU%&*M'\"ZY!'ZM'\"ZE!$:M$"
- "%:M'!ZQ$$:I##J1!\"*E\"%*E'$:A##J1!#J=!%*='$J9%#Z1\"%:1!$J1!#*1\"$:9$"
- "$Z=%&Z-'!:-\"$Z))$J!%&J1#%J!#!9Q\"$YY'\"J!$#YY\"%9M%#I]!$)I#%9Q\"#II\""
- "$9U$$9I\"$)E#$)I#%)U'#9=!!I=&\"Y=\"\"I9!#99$#9-$!I1#\")=\"#I-%#9-!\"Y-\""
- "$9-%$)!%$9%&\"8]!#8Y$!HY!#XU'!HQ##(Q##(M#%(I#\"(I\"$X5##(A#$XA&!(1!"
- "\"89!#X1&\"8=##X1'#H1&$89+\"8-!!X%!$(%(!7M$#']$\"7Y!\"WY#\"7U!$8!)#GY'"
- "$&]'!G=!\"G=#!WA\"\"GE#!'E!\"GI\"$G](\"GA\"\"7U!!H)!$'M#\"GI#\"GU\"#(!!#X%$"
- "#X-!#())$H-$\"H%\"!X5$#89%%X5$\"89!#(=!\"(A\"\"(A\"\"XE%#(=!#8I!%(M&$8Q)"
- "#8M$#(U!!I)#$HU&$8]%#9%%\"8]!\"9%#&I!&\"Y1\"#Y-&\"Y-\"!Y=!#99!#9E!!99\""
- "\"99#\"Y=%!YA!\")A\"%YI!$)Q#(9U$#9M!#IY!\"IQ!%YQ!$9Y!$)U#\"Y]!%IY#$9Y!"
- "$YY&#I]!!:%\"#J5!#J5!$J=!#*-\"$J9!\"J1!$*1#$Z5&$Z9\"!ZE!#J=!$J-\"$JA%"
- "&:9!#*1\"#ZE\"#ZA\"%:E$$JA$#:Q#&JM\"'*Q'#JI!#[!!$[!!$JA%%*Q'$JU!#ZY!"
- "#ZU!#ZY%\"Z]!#ZY!$JY($Z]%#Z]!%*Y'#ZY!&:],\"+!\"$;!\"$:Y##[%!#K%$#[%!"
- "$;5\"%+%\"#[)!(;)(':]$#Z]!$+)!$;5&$+%\"$+5\"$+5\"#[!!\";5\"#[9!$+-\"$+-\""
- "#Z]!%;-#$+%\"#[-!%K%!![1!#+-&&[).#[1$$[5!\"[)!$+1!$[9!![-!*+%,&+-\""
- "#[)!$+)\"'+)\"\"[1!$K!(\"ZU$#[%!$K%$&+)+%+%\"%K!(!*]!$K!$\"Z]!#ZY!\"[%!"
- "#Z]$!;%\"\"[!!%:Y$$JY!&K!!%*]\"#Z]!$:U#$JM!$JE!#*Q%%JQ$$*M\"$JE%#ZI!"
- "#JA!'*=!#ZA\"#ZI!!Z=!\"ZE!#JA!#J=!%:9!!:9\"#*-\"&Z5.$:=#&ZA+$*1\"$J))"
- "$*-#$*)#%9](%Z)*$*!*$J!%$*!'$Z!#\"J!!$YY#!)I!!)]!$)Q#$)U##IM$%)Y$"
- "%I=+#YE#\"IE$#99!#YE#\"I=!%)M(\"I5!#95!!II#\"I1!#9-!#9%%\"HQ!$Y%'\")%\""
- "#9!\"$)%'\"HU$#(Y#\"H]$\"XQ%#HI&!HQ&\"8M!#XA'#(I$$XE!!HA&\"XA#\"X=##X1&"
- "\"85!\"85!\"(1\"%8--!(9!\"8)!\"X%#\"7]!!H!!\"7U!$GA&!8!\"#'Y$$'](\"WQ#\"7Y!"
- "!'1!\"79!!'9#!WA\"#'A'!'M!\"WE*\"'A!#GM!!'U!\"WU##'Y\"\"WY-#X!(%(!$$GY#"
- "\"X%##(-$$X)&\"X-#$(%(\"H)\"&8E\"\"(1\"#8A\"!(=!!HE&\"XA#\"XE##HE\"#X=!#X]&"
- "&8U+!HU!$(]$#(I##(U#!Y%!#Y!'#8Q!#I%#$)-!!)1!$Y)!!)!!!Y1!#99!\"I-!"
- "#)A#$IA#$Y5$$9A%#9E!#Y9##9E!#IE!#9I!&)A,#9Q!$)]#\"IM!#IU!$9I%$IY%"
- "#J!$#YI#%Z)##YY&%J1&#J!!\"J-!#Z1\"#Z)\"#Z-\"$:-!#:--%:!!$*)##JA!\"ZA!"
- "!*9!#*=\"%:=!%*A'#:A-%:=!#ZI\"!*E!#JI!#JA!#JE!$*U\"$*Q\"\"*M\"$*Q\"%:U'"
- "$JM$%*U\"#Z]!'+!#%JI!$*Q\"$;)#%JY!'*Y$#Z]!#+)\"\"ZU!$+%\"#[!!%*]\"$*Q\""
- "\":Y\"&ZU*$;1##[)!#[5!$;1\"$*U\"$;!\"\"[!!$K%'#[1!%;%'%K%$$[%%$*M\"%[1!"
- "$K)$'*Y'$:U$\"+-!%[%%#+!\"$K)$$+-\"%K)(#;5\"#[)!$[5%$[1!%[%&#Z]!$*Y\""
- "$[%!$[)!';!$%+%\"#[!%#[!!$[!&%;!'\"*Q!$+!&\"*]\"#ZY!#Z]!\"[!!$J]!\"ZU!"
- "%JU!$:Y#$*U\"\"ZU!$*]\"\"ZY!$*Q\"$JQ!#*Q\"#ZM!%*M&$JA!!:I%$K!$\":M&#ZE\""
- "#JE!#:A#$*I\"%JI(!Z=!#J=!\"ZA!#*9\"$Z9\"$J-%$:5#$:1#$:E$#J5!\"Z=!%9])"
- "$:)$$*1#$)]##YY\"#*!#%)]'$Z%\"$9Y!#J!!#YU\"#J!!#IU\"#YM##)U#!YI$%)I("
- "\"I]!$)E*$I9&$9=%\"I=!!YA!#9I!#)5##)-#$I1#\"X]%\"I-!#9-!%)%\"#I%\"#I!\""
- "#9!\"!HY&!(]!\"8Y#\"XY\"#HY%$8Q&\"HY!$8I##(I#\"XI\"\"8A!\"HE!$H='$XA(#H9#"
- "#X9!#(1&\"(-##(1#\"X5#!(!!#X)$!GY!\"G]%\"G]\"\"W]#\"7U!\"7I!\"WQ#\"7M!#'I!"
- "!'1!!71$\"79!\"GA#!W9\"\"7A&!GE!$'A$\"GE%\"GA\"#'Q$#GA'\"WU#\"7]!!'Q&\"WY!"
- "!H%#$()(#81!$H1*\"X-#\"81!\"H-!\"8)!$89)\"81!\"8=!#8A$$(E%#HE#\"8Q!!HI!"
- "\"8M!\"8U!$(Q%%(Y&\"8U!!HY!#H]%!H]##9!\"#9%!#I%\"#9)!\"I1!!Y-!#))#%)9!"
- "\"I5!#Y9&\"I9!$)E'#9E!$9A+\"IA!$)U#$)A##)M#$)M#$)I#$)E!%IQ#!Y]!%)U!"
- "\"YQ%#J!!$)]#$*)##I]!$Z%&&:1\"$J%%#J)%#J9!#J-!$J5!!:1\"$*%#$:1##ZE!"
- "%J9!%:9(#Z9!#Z=\"$JI!#J-!#JA!$*E\"\"ZE!#Z=\"!J1#!*E!#*I&&:Q$$:M$\"ZM!"
- "%*U'':I!#ZQ!#Z]!\"Z]!\"ZM!#ZU!$:Q$#ZY!&:U$!+!$$JY$#ZU!$*]\"$JQ!#+%\""
- "#:]\"&K!$#[%$#[!!%J]($+%\"#ZY!&JY,#K!$#[%!$;%#$+)\"%+%&\"[%!%[1!%;%'"
- "%+%&&[%!$[-!\"[-!$;%##[)!#ZQ!$+%&#[%!%;%'#Z]!#[)%#[%!\"K-$%:Y$$;!\""
- "#[9!$[!%#JM!$;%\"#[!!&;!#%ZY\"$Z])$:U'$K%$#Z]!%*Y\"&ZU'#K%$#ZQ!$ZU\""
- "%:E($ZI&$*M\"$*Q\"$*M\"#*Q\"#JI!\"ZM!#ZQ!!*M!&:=!#*E\"#ZE\"%JM)!ZA!$*A\""
- "#JA!#*A\"\"Z9(#J=!#Z1\"$*E\"\"Z9!#Z5!#Z5\"%*%#$:1!%J1)$*)'\"J)!#*1\"$J)%"
- "$:1#%)U!#J!$$:!!&*-+$:)$$IU)\"IU!$)U##YM\"#IA!#YM#$9I$#9Q!#YI#%9I)"
- "$IM\"#IA%&)A,#9=$\"I1!$9A%#)9#!I1##Y9##)5#!Y-!!Y-!#(Y!#H]\"$8Y%$(]$"
- "\"8]!\"HY!\"8U#$8U(#8Y$#(M##XQ$%8I'#XI!#8I%#XA$\"X=##8E$#(=#$(E'\"H5\""
- "\"XA#\"81+\"8-!%()!\"8%!#X-$#H!&\"X!#\"W]%#GY)\"WM!\"X%#\"WU#!WQ$!WE!\"GI#"
- "\"79$$7-\"\"'1#\"79\"#'A$!GA!\"G9\"\"'I#\"GI#\"GI##7M%#7U#$(%(#7Q\"\"H!\"\"7]!"
- "#'E!#X!$%']!$7]'\"X)#\"X5&\"X9##H1##X5&\"89!#(9#\"8M!$HE$\"X5#$8E)#HI\""
- "$HI'\"HY*\"XI\"#8I%$(Q%$(]!#(U&#(Y#\"8]!%9!*#9%!#(]!\"I)!\"IE!#91$$Y)("
- "#91!#9)!!95\"\")E(\"Y1\"!YE!#YA##Y9#$9A%#IM%%)I+#9Q!#9M!$YM##IY!%IU&"
- "$IY&#IY!#Y]\"#YU\"#Y]\"!Z)!$Z%#$*)#%Z%'\":%##J-!%:-!#J)!#J-!#Z1\"$:1!"
- "(*-*#Z)\"%JA!&J9\"#Z9\"#Z9\"%*=#$JI%!*A$$:Q$#ZQ!$JM$#JE!\"*I!$JI!#JE$"
- "&:=!#JI!#J=!#JM$#*I\"$*Q\"&*Q'%*M#%*Y&\":]\"#ZQ!$:U##ZY!#ZY!$ZY!$ZU\""
- "%*Y'\"[!!\"JY$#[!!$[%!\"J]##*Y!$*Q\"%+!&!K%#&J]!#[!!$ZY\"#+!\"!+!!#[!!"
- "$[!)#[-!\"[1!$Z]!%;%'#Z]!\"K!$$J]'#[!!%;!'#[!!%:]'![5!$K!(#*]%\"[-!"
- "$Z]%\"ZM!$:]#%+-)\";%&&Z]\"#;!\"\"ZY!%ZQ\"#[!!$*Y\"&*U'$:U$%ZU%$K)$\"ZY!"
- "#ZA!#JU$\":Q\"$*M\"$ZM%$JY!#JM!%*I\"%*I*%:=$$JQ!#ZM!%:E$#JE!$JA!#J9!"
- "#J-!#J1!#Z)\"%*5#$JA!#Z5\"#J)!$J9!$*1\"$:-##*-\"$*1\"$Z)&$J%%#J)!#J!!"
- "$Z!##IY!#J!!#9Y#$)U#$Z!&$)U##IU\"#)I#%9Q(#9E!#9E!#9I!$9I%&IA$%YA("
- "!)=!\"I9!!IQ#\"I9!$95\"!Y-$\"I-!!Y1!!)5!#91$#Y)#%I)($9-\"#I!##(]!%(Y\""
- "%(Y%&(]-$HU$#(I!$H]#!HM!\"8I!#XE$\"XE\"#(A!#(E##(=!\"85!#X9'!H9!$H-%"
- "!89\"\"X1%!GU!$8-)\"X)&#H-##'Y'#7](#7Y%$W]&\"7U&!7U\"!WI!\"WI!\"GE#\"7=$"
- "#W9%!G)!\"'9#\"GE$\"G5\"!W=!\"WQ&#G-\"\"GA#\"GM\"$'Q##'I%#7]#$'Y&#WU$$'Y%"
- "\"7Y!!H5#\"8!!#7]%\"H-!#H5&$89)\"8)$#X1'!XA!$(9\"#(=$%(1$\"HA$\"HA!\"XQ\""
- "$(A%$HI##XM'#HQ\"%8U)#XM'#XU#\"8Y!%8Q'#H]%$(U$$8Y%#))#\"I!\"#X]&$)-'"
- "!)1!#I)%!Y5!#95!#I9%$Y='#9I#%IE*%IA$&)E,#9I!%YM!%9I%$)M##9M!#YQ#"
- "\"YQ\"$9U$')U*&9M#&)Y$#9U!%9])&*%$#J-!$*%#\":%\"#Z%\"':5)\"*=!'*1!#:1#"
- "\"J1!\"*1\"'J9/#*5%#J9!#J5!#J=!$:=$#J=!!Z=!$*=\"\"ZE!#Z5!$ZA\"':I)$*5#"
- "!ZA(#JI!#ZY!#ZQ!$ZA\"%*M\"#ZU!!JU'#JI!%:Y$#ZQ!#ZU!&JM)$*U\"#*U\"%ZI'"
- "$JI%$JY!$[%!'JY%$ZY%#*Y\"\":I#%K%$$+!\"#[%!#ZU!$*]\"\"JY#$*]\"#:Y#$ZY\""
- "!*]$$*]\"#ZY!#Z]!#ZY!$[%%$:]##Z]!#Z]!#[!!$:M$$K!$$J]!#Z]!#ZU!#:]#"
- "#ZY!!:Q\"&:Q$$Z]%#ZY!%ZU-$ZU%$:Y#$JU$$JQ!&ZY\"%:]''JQ&#JM!%;!##ZQ!"
- "#JA!$J=!#JI!\"Z9!#JI'$:Q##JE!#J9!%ZE)#JE!$*5\"#JA!#ZA\"%JE(!ZA!#Z1\""
- "$J=%&:-\"#ZA\"#J5!!Z5!$*1#\"J1!#J-!\"J)!&*-%$*)#$Z=&#J9!#Y]\"$*!#$)Q$"
- "$Y]&#J!!#9U!$I]&\"YU($9U*%II#$IQ%#9M!#9M#$)I$&YQ(&9E-!YE!#9I$#)M&"
- "$I=*\"I9!#Y=#\"I=!!Y=!$I-#\"I-!&Y--#)!#$I)*#9!!#I%#$Y)'#(U!$91\"#HU\""
- "\"HU!#XU&\"Y)+#XA$\"XM\"$8A#%(E&\"8I!$(E'\"8A!%8=$#H=&#(5!\"X%#\"(1#\"(5#"
- "\"8)!\"WY!\"8-!\"H1'\"8%!#X!'#7M&\"7Y!\"7M!#'Y$#WU\"#'M$!WM!\"GA#\"WE#\"7A#"
- "\"'-!!GA#\"'9#\"7!$\"WE!\"'9\"#'=%!GI!#'I&\"GE$\"GM\"\"WM#\"'I!\"WE##GY)\"7]!"
- "#7Q%\"X!#\"H%\"#H!$#X%'\"8)!\"H%'\"X-\"!H5!\"8!##X5$$(9%\"X%##X=$\"HA\"#8I%"
- "\"(Q%#(9#\"8I!!(Y&\"HQ!\"H]$\"8U!\"XU\"#XY!\"8Q!#(]##Y!$\"))%$)!$%I)'\"I-!"
- "!Y-!!I9&#)5#!Y9!#)5#$99(!Y9!#I=\"!I=&$)9'')A.#9E!#II+$)I&$9Q%$9Q$"
- "\"IQ$!)Y!#9U$$)Y##YY\"%)Q$$:)!&Y]$$)]#$:-##9U!#Z%\"$J%%#Z)\"#J)!%:-)"
- "$Z-&#Z-\"#:1#\"J1'#JE!#J5!$*5\"#J9!#J=!%:=(#Z=\"#JA!#Z9!$*5##Z=%#JE!"
- "\"ZA!\"ZM!%*M\"#ZI!#JE!&*Q'%*Q#%ZU&$*U\"$ZI%\"Z]!#ZQ!#ZU!%*Y\"!ZY!$:Q#"
- "\"ZU!%ZU!$*U\"#Z]!#:Q'%JY)%*M'#JY$%:Y$$J]$%+!&#JM!$;%##Z]!$ZY%\"Z]!"
- "$JY$#*Y\"$*Y\"$[!&%:U'$*U\"$ZY\"#[)!$JU$#Z]!#[)!$JY!\"JY'$*Y&%JU!%;!'"
- "$K!$\"ZU!#ZU!\"ZI!%JY%\"[!!#*=\"%ZQ%$*Y\"#JI!%:U(#ZQ!#JE$$:M#$ZE\"$JM%"
- "\"*E!$ZM!\"ZI!%*Q##ZE\"!ZY'#*I\"#JI!$:-##JA!$*A\"&JA*$J=!$*E\"$Z9\"$J9%"
- "#J=!#:9#%J)\"#J!!!Z1!$:-!#Z)\"#Z1\"\"*)\"!Z!!%IY&$:%!\"J)$$:%$&J)#$9U$"
- "$I])$J!($*%'$9]!#Y]&!99%$YQ'#YY\"$YI&%YI!$)=!#9E!$I1##I9\"$YI'\")=\""
- "%9=#\"I1!#)5#$I%&#9)$#9%$!Y)!\"I1!#I)%#9%!!9!%$(Q!\"8]!\"8]!#X]&\"XU\""
- "$8M&\"8Q!\"8Q!#XM!\"HA!#HI#$(E(#(=#!(A#\"H5!#(=$\"(-\"#H-)\"85!#81%\"X-%"
- "\"X)#\"X)\"\"8%!\"H!'\"G]\"#8!%\"X!#\"H!\"\"7E!\"GM\"\"7M!\"7M!\"X!#\"'E#\"'A\"\"'A#"
- "\"71\"\"'-#\"7=$\"7%&!G5!\"79$\"W9&!G=%\"GE%#7E(\"G1%\"WI!#WM'\"WM##'A%#'I\""
- "#X!\"\"WY#\"7]!#(!$\"X!#\"8%!\"X!!\"8)!\"X=#\"8)!\"X9\"\"X9#\"8=!#(9#$(9'\"8I#"
- "#8A$#(A#\"HA\"\"HI!#(A'#(=$\"8U##(U##HU\"\"HY!$(]*\"8Y!\"HY!%9!*#X]!\"Y)\""
- "!Y)!#Y-#\"I9!\"Y-%#)-#$)E'$I5##99!#)=#\"YI!#9I!#II!#9=!#YE#\"IM!$II%"
- "$99%$IE\"#IM\"$YM#\"I]!#IQ\"!)Y'%J%&#I]!#9]$#J!!$J)!#*%\"%*%'#YY\"#Z%\""
- "#J)!#Z-\"#Z!\"$J-%$*5#$Z1&#J)!#:5#\"J1!#J5!!*1!$:5##J=!%ZE)$JA%#J=!"
- "$:A#&:A%#:A#!*E$%ZE&$J=!%*M&#ZQ!#ZI\"$JE!%:Q$%ZI&&*M'$:Q#$JY$$JQ!"
- "#ZU!\"ZQ!$*Q\"#ZU!#ZU!&:Q,$ZU\"(:Y)!ZY!#ZU!$*U\"$:U#$*U\"#ZY!#*Q%#ZQ!"
- "$:U$!+%!%Z]!\"*]%$ZU)&JU!#ZY!(:I%\"K%#%ZY!%Z]*%ZY%$:Q##ZU!$:I$$ZU\""
- "#*Q\"$ZQ\"%JQ!%*M&#JM!$*Y\"\"[%!'Z9$%ZU\"%*I\"&ZM.$JE$%*M&$:M#\"ZQ!$JU!"
- "$ZU%#*A\"%:9!$*Q\"&JE!':A!\":A&$:=#%:=%'J=*#JA!$:5'%*9'\"Z9!&:-!#Z5\""
- "#:9##J5!#J-!%:)!#J-!%*-##J!!!Z1!$9]!#:!#$J%%#J!$$Y]#%Z)#$9Y!$)U#"
- "$IM&$*!#$)U#$YM'#9Q!$)Q##YQ\"&)I)$YI$#YE#!Y5!\"I5!!Y=!#I=%$Y=!\"Y=\""
- "#I9\"%I9-%91,%91#\"I1!#I!%#))#%I-!!Y!\"$))$\"8U!$8I&\"8Y!\"8M##(U##8U$"
- "!XQ$\"XQ\"#(I##(I!#8Q$!HA!\"8I!\"XA#$HM)$(9+\"H5!\"X=#\"8E&#X1$\"X-##8%%"
- "$8))\"8%!#H%&\"X!#\"7]!$8!!\"WY!\"WU!%'A(\"7Q!\"7Y!\"GI#\"7I$#7M'$7E$!GA!"
- "\"'9!\"7-$\"G)\"!W9($7%!!GM!!G9!!W5+\"')\"\"'1\"\"GE%#GA$\"'9#\"7U!#'Q$\"7Q!"
- "#7]%\"WY#\"7]!\"X!#\"X!#$WI#!H-%#X%'#8!#\"8-!\"81!#(1'\"89#%8-*\"X5#$H1\""
- "\"8E!#8=%!HA!\"XI\"#8A\"\"HU$\"8M!\"HQ!\"8Q#\"8Q##(Y##8U$\"8]!#9-!$9!&#I5\""
- "#I%##))##I)%\"Y-%\"I1!#)1#\"I9!\"Y1\"\"9=##99!#)=#$Y=#'YE&!99%#99!%YI+"
- "%IQ)$IM%$9E\"#YQ#%)Q$#9U!#YY\"#9I!$IU\"%YY$$)U'&9U&$)Y#%J!\"#Z-\"$9Q!"
- "&*)!$J)%%*1'#Z-\"\"J-!#J-!#J1!%*1'#J)!#Z=\"#J5!$*=\"\"Z9!#:9#$*)##:=#"
- "\"Z1!!*5!$*A\"':A)$J5%$J9!#ZQ!%:I$%ZE\"$:A##ZE!$JA%#JI!':U%%JI!#JM!"
- "%ZM\"#ZE\"\"ZM!\"ZI!%Z]\"#Z]!$J]$\"ZQ!$*Q&$ZU!$ZQ!$:Q##ZQ!%*I#$:Q$#ZA!"
- "&:Q(#ZU%#ZQ!%:U#&:Q($ZU%$:M#\"Z]!\"ZI!%+!&\"ZQ!$JQ%$JI!#JM!&:U$#ZQ!"
- "&JU!%JE%%:I$\":Q\"\"JQ#$:U##ZA\"#ZU!$JA$$:E#$*A\"$ZU\"!*=!$Z1\"%*I#\":I#"
- "$*I\"#ZI\"%:A$!:A\"\"Z9!#J=!!*=$#JI!#JA!#Z5!#Z5\"#*5\"$JA$&J5*%:5(%*E+"
- "$:1!$*)#$:1!#Z-\"%:1$$:-#$9]!$)]#%)Y'#*!#\"YU\"#Y]\"$)]#$9Y!#YM\"#9I!"
- "#YM#$I]($9U!$9]!#I]!%YM$#9I!$)Q$$)A##YA#$II%#99!#)9##99$#9A!\"I1!"
- "\"I5!#I1%#91!\"9)#\"I-!!91(\"I!!!I9##9!!!Y!$#8]'#HY%$(]-#XU&%HU+%HQ%"
- "#HY%#HM&\"XA#\"XA+\"XE##(I##HI%!X=$\"XA#\"XE\"\"H)!\"8-!\"X9\"!8-%\"H5\"\"X%%"
- "!H!!!H!!\"7U$\"X!##7Q&\"H!\"\"7Q!!'I#\"7Y!\"WM!\"7=$\"'Y(!G=!!GA#\"GA$\"79$"
- "!W)!\"7=#\"G)!\"'-#!W-$\"W5#\"75#\"'1#!G=!!W=!!'A%\"'E##7M%!7Y\"#7M%\"WM#"
- "\"7E!\"GQ\"#W]$!WY\"#H!!#8!%$8!$\"8!!!H!!\"H!\"#H)##X-$\"H-!\"H5\"$X1%#(='"
- "\"XI\"\"XM\"\"XA#$8E)#HE%!HQ!#(M##XE#%8M##XU!\"8U#%8Y!\"8Q!#HY%\"HY!$8Y\""
- "#)%$#9)!\"I%!\"Y-\"#)-#\"Y%#$)='\"II$#)5#\"Y9\"\"Y9%$)='#Y=\"$)E##Y=&#9M!"
- "$YE'#9E$#IQ!!9I(#)M#\"IU!#9U!\"YQ!$)M#%YM+$IM&%)Q$%J%*#I]!&*!!$:!!"
- "#*!#&J%'#I]!$*)#\"J)!#J)!$J-%#Z-\"#J9!#J!!\"IY!$J5)&:5!#J5$&:9%%:9%"
- "!*=!$*9#$*=#%*9#$Z=)$Z9\"$*A&%*=&#JE!$:A#\"ZA!#J9!$JE!#ZI\"!ZE!#:I'"
- "%:=($JI!\"*I\"#*I\"$:I$$JM!%JM)%ZQ\"$:M#\"JM'$ZU%#J9!$JY$%ZI*%JI($JM!"
- "%ZI*\"*E!#ZE%#JM!$J=%\"ZE!\"ZI!!:I\"#ZM!$*=\"&ZU-%ZQ*%:M(&:M!#ZU!$:I#"
- "'Z]'%JU$#JI!#*I\"$J9%$Z=\"#ZI!$*I\"#*E\"$:I$$*I\"%JA%#*E\"#JA!#JA!\"ZA!"
- "#JA$$*5&$Z=&%*='#J=!%*=&$*A\"#J9!!*9!%*5##Z5\"#J5!#J1!%ZA)%:1!#J)!"
- "#J%!\"J)!$Z=\"$Z!#%*%'\"J%!\"Z)!$Z!#!J!#$*!#'I]$#II!$*!#$YA'%9Y%$9U!"
- "%YM(#IE!$YM*#)I\"#YI\"!YI!$99%$9M$&I)(#9E!%)=\"$9A+#)=#$9A%#)1#\"I5!"
- "\"I-!\"I-!\"))\"\"91#$)-'$)%$$9%##HY\"#)%#$8]%!HY!#(]!\"(]\"#HU%#(M#\"XE#"
- "%XI/#XI!#(I$$(E'#(]!$8A)#H-%#X1%\"()#\"XA#!(9!\"X1#\"8-!\"()\"!H1!$(%("
- "\"7Q(\"X!#\"X%#!H!!\"7U!#7Y\"\"7Q!\"GE\"\"7M!!'M&$GI%\"'E#\"'A#!G9!!W=\"!79\""
- "!G!!#'!'\"')\"!G-!\"'-#\"'1\"\"G9\"!'5#\"'=#!W9\"\"GI$!G=*!GE!$']#\"7E$\"WI#"
- "$7Q*\"7Q!#'M$#GY&\"WY#\"8!!\"X%(#8!%\"(!%!H%!#H)$\"8%!#(1$#(1##(9$!HE!"
- "#H9#\"89!\"H9\"$(A%\"(A\"%(E&!XQ'$HM&!HQ!!XU$$8Q#!(Y#!)!!!8]%\"Y!%#8U'"
- "#9!!$Y!$#Y)##Y)##9)$!)-!\"I1!!Y1!\"I-!#)I#%9%&!Y5$\"IE!#99$$)5$!9Q%"
- "$9E\"$9A$$)=$&YI,%)9($)Y#%)A'\"9I#%)Q!$IU%$IQ\"#Z)\"#IY!$)Y#$I]&#9U!"
- "#J!!$J-%$J!!#Z%\"$9U!#J)!$J1\"'J)$#J-!\"J-!#J=!$:1##Z1)#ZE%#J5!#J5%"
- "\"J1!$JA!$*5\"%:)(#Z9\"$Z=&#*9\"#J=!\"ZQ$#JA!#JI!#J=!$:Q#$J=!$*E\"#JE!"
- "&*E(#JA!#*E\"!ZQ!%:9($*I&#JI!#JE!!ZI!#ZU!$:E#\":I#$*M\"#JE!#ZI\"$JM!"
- "#ZE\"#JM!$JA!%*I\"$JI%\"ZQ/&J=\"#ZE\"\"ZI!#JI!#JE!$*I\"%JM!#*E\"#*I\"#*I\""
- "%*U\"$:Q$#JM!$:M#\"ZA$%*Q&#JE!%*A##JE!%JE-$ZA\"#JI!%:A$$ZA%#J1!!Z=!"
- "#*A\"\"*9%#*1%#*-\"#Z1\"#*9\"#:)##:5#\"Z5!#*9&%J5)\"J1!$:-#\"*)\"\"J-!\"*%\""
- "#Z)&$J1%#Z%\"%J-)\"J)!%J!\"#9Q!%)]!$*!#%)Y!#J)$#9U!!9U\"#YQ##9=$#IU\""
- "#9M!#9M!!YM!#YA&!YE!\"IM!#YA#$)5$#Y=##9=$%I-'\"I5!$I5#\"IE!\"91&#91'"
- "\"I!!\"I-!$8]\"#Y%&$)!!#91!#8]!$(Y($X]*\"XE#!XY!\"XQ\"!I!#!(Y!#HQ&#(M)"
- "%H=.\"8I#!8Q%#HE&\"8A!#XA#\"H9\"\"(9%\"X5\"#(1&\"(1\"$X%%\"X-#\"()#\"7Q!\"X!#"
- "$(!+\"'U#\"7Y$\"X)#!GU##WM'\"WQ#\"7Q##7I#\"WM#\"'A#!GA!\"WA%!G9!#'='\"')#"
- "\"'!#!G1#\"W5%#'5$\"')!\"'1!\"'1'#'A'\"W5#!G9!!79\"!W5\"\"'A#\"'M#$'9)!GM!"
- "\"7M!\"'Q##'U)#GY!\"7Y!#'Y$\"X%#\"8!!!7]%\"81!\"8!!!()!#(-'!(-!\"7]#\"X5#"
- "#(9##(=##81\"\"81!#(A$#XE#!HQ!#HI%\"HI!#HM%\"HQ!!HU!\"8U!#(Q!\"8Y!\"8U#"
- "\"8U!$9!%#I%#$9)%#9-!#9)!#9-!%8Y-$)1!#)1#$)A!#)9#\"I=!#Y9##YA##)=#"
- "%)E!\"I=!$)A#')I\"$9Q%#II\"#IY!$)M$#)I##9Q!!IM#$)U#')U-\")Y\"$)Y#$9Y$"
- "#J%!%)]'$*!#$9Y$#IY$#J%!$)]##Z%\"%:)%#J-!#J-!'*9!$J%&%:-%'*1!#Z1\""
- "$Z-##Z-\"$J=%$*1#$*5##JA!$Z=&&*9$\"Z5!$Z=\"#Z5\"$Z=%#*A\"%*-'#JA!%ZA)"
- "#ZA\"$ZA%$*I\"#Z9\"!ZE!!*I$#*M\"#JA!%*E\"!:5\"$JE(#Z5\"#*I\"$:E$%JM!%:E$"
- "$:I#!:M%$JI!%JI!$JA!#JI!#ZQ!\"Z]!#J=!#ZU!$*=#$JI!#J=!#*=\"$JE%#*Q\""
- "#JA!$JA!$JA$$:I##ZQ!#:E#$*=\"%JA!$*1##:Q##ZM%#ZA\"$JA%!ZE!#J9!\"*9\""
- "#J1!\"Z9!&*-$#Z5\"#J9!%:5!$:1$#J-!%:1!\"J-!$:5$&*-%#Z1\"#J-!#J)!%J!&"
- "$J%!#Z%%$J!&$YY#$J!\"%9U(\"Z!%%9Y%#J!!%)M!\"IU!$9U!#IM!&)Q,#)M\"#9Q!"
- "\"IA!\"IM*%9U)\"YE\"#9I!$)A!#9A!$)9!%YA+#99$%IE##)5#\"I5!#)1#\"Y1\"!Y)!"
- "$Y-(\"Y)\"$9%\"$)5!#H]\"\"I!!$H])#H]+&X]-\"8Y#\"XU\"\"XM\"\"8Q!!HI!#8M%#XM$"
- "#XQ!#(A$!X5!\"89!\"8=!#X1&!H9&\"85!!H9!$X-##(-$#()!\"8!!\"8%!$8)$!G]!"
- "$7Y$\"7Y!\"'E!!'M!\"7Q$$7Q$#'M$!GE!\"'M#\"75!!G=!#'I'\"'=%#'A'!W5\"\"'9%"
- "\"&]!!FU#\"G%%\"'%#!'!##'-'!W5\"!G-!\"'5\"\"71$\"79$!G1!!'9%!W=!\"GE$\"'=!"
- "!GI!#7E##7Q&\"GQ\"\"7U!!WY!#7Y%\"H)\"\"7]!\"8%!\"X%##H)#!H)!#85%#8=%\"H5!"
- "\"85!#(=#\"(A%$XA\"\"8E!%(A!%(E)$HE'#8=$#(I$\"(I\"#9!!\"XM\"\"XU%#(U#\"XU("
- "!XY$#8Y'\"8]!\"Y!\"%9%'$9)&$I)##))#$)-$#)1#&)-)!Y1'\"I-!!91\"#Y5&#)5#"
- "#I=%%Y5(%)A%#Y5#$9M%$)E!$II&%)I(%)M('9M$#II!%)Q(\"YM!$)U#$YY&#9Q!"
- "\"9]#!YY!#)]#'*!!%*!'#J!!%:)!%*%'#J)!#IY!&:)\"#J%!$:-!\"*-%#J-!$*)#"
- "&Z-$#J1!#J1!#ZA!#*5%%J5%#J5!#Z5!#Z9\"%:9%#*A\"&*9+$:9$$ZE&#ZE\"#ZM!"
- "$Z-&#J9!'J='#J=!$Z=\"#J=!%JM)$J=!#Z=!#JA!\"ZE!$*A#%*=#&:1)#J5!#JA!"
- "$JA$$JI!$ZE\"#JE!\"ZE!&:=,#JE!'ZE+#Z=\"%ZM\"!ZA$$J1%!ZI$\"Z9!\"ZA!$ZM\""
- "$JE!$ZE)#ZE!\"ZA!%*-'#JA!\"Z=!$J-%%*E#\"Z=!#J5%$*9##JA!&*9$$J9%#J5!"
- "#9]#!:A\"#J9!\"J1!!Z%!\"ZA!#J-!\"Z)\"%Z9\"#J)!#J)!#Z)\"#J)!#J!!%:-!%*%'"
- "\":!#$Z!#%*)'#9Q!&:!,$I]\"$Y]#\"IY!$)U##9U!#IE\"#IQ!%YM!!Y=!$9M(%)I("
- "$)9$#IE!$II&$99\"$)E!#Y=#!)I'#Y)#!Y)!\"I9$#95$!)1!!)9!#9-!#)1##))#"
- "#9)$#I%##9-!$HU'#)!#\"X]\"!H]##XQ#!H]&#(Y##XQ'\"XQ\"#HM#!(I##(=!\"8E!"
- "%8E$$8A)\"89!\"X=#$X1#\"85!#X5$$H%(\"X1#\"8)!#()$\"H)\"!8!\"\"X%##7]\"$8%$"
- "\"WY##WY'\"7Q!!GQ!\"WQ##7M%#7M%#'E$!GE#\"GA\"!WA\"\"W=(!'9!\"7I$\"71*#6]#"
- "#V]&!VY$!W)\"#FY%\"G!%\"G)%#W1(!W%$\"W5#\"'1#\"W9$!G9!#'1$\"'A#!GA!\"'A#"
- "#'E$#'=%!GM!$W]&#H%!\"7U!\"WU#!GY!$7]!!WU!\"7Y!\"X)#\"81!#H)!!(1&$']\""
- "\"X1#$(-#\"X9#\"H=\"\"(='\"X=\"#HA\"#(A#\"XE\"\"8M!#H=&\"XM\"#(Q#$XQ!\"HQ!\"HU!"
- "#)%#\"8Y##9%'$9!%#(Y!#9!!#9%!#I!\"\"I)!\"I9!#I-\"\"Y1%#)1#$Y5'#95$\"I5!"
- "#)9##9E'#)A#$YI&#9I##Y=##YE#!YE!$)M#%)I(#9M!%)M!%9=%$)M##YQ\"$YE'"
- "\"IQ!$YY#$9U!%)Y+#J1!#I]!#I]!#Z9\"!)]!#Z%\"#J)!$)Y#$:%!%:1%#J!!$:!!"
- "%:-!'*))$:-$&J!'\"J1!$*1\"!*%$&:=%$J5!#J1!#J=!!*9!#J9!(:9&%Z1'#J9!"
- "#ZI!#J9!\"*5\"#JA!$J9%#Z-\"$Z=&$:5$#JA!#ZE\"%*%##Z9\"$Z1&':A!\"Z9!%*Y'"
- "$:Q##JA!\"ZA!$JA!#Z9!#JA!\":M\"#JE!#J9!#J9!&J=\"$:1!%J=)&*='#Z=\"$J=!"
- "\"Z=$#Z=\"$JE!#J1!\"Z9!$J9%\"JA#$J9!#J5!%:)!$ZA%\"Z9!\"J5#%Z5*$Z5\"%:1)"
- "#J1!$Z=&\"J1!\"*-!#Z)\"#J5!#J%!#J)!!*)!%Z)'!J!#\":!##I]!&)]$$I]&%Z!*"
- "#Z%\"%)U'$IQ%%*!!%YU$$9Q%$)Q##IY!#9Q!#IE\"$Z%##II!#YM#\"YY\"#)U\"%Y9%"
- "#I9\"$)1'\"I=!%YA+!)I!#)=#\"Y9\"\"I9!\")9\"\"I5!#)%#$Y1*$)--\"I-$\"I)!#))&"
- "#(]!$(Y!%I!$!(U&\"HU!\"8Y!\"H]'#(U#\"Y-\"#X]##XM&\"XE\"#(I!#(E$\"XI\"\"X1#"
- "\"HA!\"8E!\"8=!#89$#(5#\"H-%\"85&\"X9#\"X1#\"X)##(5$!(%!!X)$$(!#\"WY#\"7Y!"
- "\"WU##7I%\"WQ#!'U!$'](#'Y$#'Q+\"'A,\"7E$$'9*!G=!\"7=$!'9!!'%!!G-!!G)!"
- "!&]!#7!%\"VQ&!G!#!W-(\"&]%#'-&\"'-#\"'-#!W1$!'5!\"'=#\"'E%\"7E$!G=!!GI%"
- "\"GA%#WY'\"'A!#'M!\"GQ\"#GE&#WQ%\"8!!#W]$!8%\"\"']%\"8!!\"8-!\"8)&\"X)\"\"(%#"
- "\"XA&#H-##H9&\"X5\"#(5!$H=!\"X-\"\"XQ\"$8E##XU!#(I$\"8I!#HY%\"HQ!#8Y$#(Q#"
- "$HU'#(Y##I!&#9-!$)!%#I!\"#X]##))#$)%!\"I)!#))#\"I!!\"X]\"#I1\"\"I1!#Y5&"
- "!Y5!!Y9$#)5&!)=!\"I=!#YA#$I=&\"II!#9E!%9M%#YE##I9\"\"9I##II\"%)U$#YQ#"
- "$9Q$$IM\"'9U#%)]'$Y]##9U!$9]$\"*!($I]%#Z)\"$9Q%#Y]\"%*5#&*%(%*!##J%!"
- "%)]!\"J)!#*%&\"*-%#Z-\"#*9\"$J5!#Z-\"$J9%#J1!#:9&#J=!#J5!#J1!#ZE\"$Z5\""
- "$*1##J5!$J=(#Z9!!*5!%*9##J9!!Z9!$J9!$Z5&&*9#%J)\"$Z9\"#J5!#*5\"$:=$"
- "%*='#Z=\"#JA!#:9#$:M$#*A\"%JA)$JA!#J=!#J5!$*=\"$:=##ZA\"$*9#\"Z9!!Z=!"
- "$J1%$*9#&J9)$*9\"%:=!%J)&#ZE!#J9!\"Z%\"$ZA\"$Z5&#Z5\"#J1!#J1!#Z1\"#Z1%"
- "!:-\"$J1\"#J-!#J%!#J)!#J)!#J%!!9Y\"#J)!#J%!$Z%&#J!!$I]\"$)U##)]#$9]!"
- "$I]%$*!##YQ\"#)Y\"\"YY!#I]!$IQ&#9U!$)Q#$)U#&IM(#9I!#IQ\"$YI&#9Q!#IA\""
- "#)A##YA\"#II%$I=#!Y-!$Y9'\")=%\")5\"\"I=!$9A!%(]%$Y1!$I-&\"I%!#9%!$I%'"
- "#I!&\"8Y!\"I)!\"H]*!HY#\"X]\"#HM&#XQ'#(U##HM#!HY!#(A#\"8Q!!HE&#HE(!(=#"
- "!H=#\"8=!#85%\"85!\"85!#H)%#81%\"X1#\"X!!\"8)!\"H%!#8!'\"8=!#7]'\"X%##GY#"
- "\"7]!\"GQ,\"7Q$\"GI#\"GA\"!GE#!G=!!'A!#WA%!'=#\"'9\"\"G9$#7E#!W-\"!G%!#'=$"
- "\"G)#\"6U$!F]#!'1#\"6U$\"&]#!G)!\"7-$!G%!#G1\"#75#!G=!#G9!!W5\"#'=$!G9#"
- "#'E'\"GI##'A$!GQ!$GI#!GE!\"GQ\"#WE\"!'Y!!W]!#(%$\"GU\"\"H!\"%(%*\"8%!\"89$"
- "\"X!#!(5!$(1&$(5%#X)'#XE&\"81!\"XA&#HA#\"XE\"#(A$$8E)!XE'#(M##(M!#HQ&"
- "!(Q$!(M#\"HU!#(U#$8Y\"#(]#\"8]!$)!$$H]&#9%!#Y9&!Y9!#)-##)-##I9%\"Y1\""
- "#95$!)9!\"I5!\"I9!!Y9!\"Y=\"$I-&#I=\"#YA\"%9E\"&II(%II-%9A($II%\"IM!\"IA!"
- "#)Q##IY!$)Q##IY!#I]!%YM$$IM\"%)]('9Y#$*!&%9Y%#I]!%:%%#J-!#IY!'*%("
- "!:%\"%J))&*!!#J)!\":-\"!Z%!#J%!\"J1!#J-!\"J%!#Z5\"#ZA\"$*%#!:1%$:1$\"J-!"
- "#J9!$JE%&*1$#J5!#*5\"\"Z5!$*5#$J5!$:5#%:5%#*5\"$:9$%*9#%:1!%:E$&*A+"
- "#J9!\"*9\"#Z=!$J-\"$:M$#J9!\"ZA!&:5!#J-!%:9$#*1\"%*9##J1!%:5%$J%\"\"ZA!"
- "$*=#%Z5*\":9*#J-!#ZQ!\"J-!#J1!\"J1!$:)!&*1!#J5!#JI!\"J)!$J9!#J-!$:%!"
- "%J-%$*)#\"I]!$*-#$Z)\"$*%##Z-\"\"I]$$*!#\"IY!!Z%$#9U!!IU#\"I]!$)Y#$)]#"
- "%*%'$I]%#9U!#)U%%IQ#$)U##9E!$9Q($)]##9U!$)1$%YI($)E!%IE&#YA##9A!"
- "$91%#9=$%)I%'99/$Y5'$I1)#95$\"I)!!)-!\"I-!\"Y)%\"I1$$))'\"8U!#XY!$I!'"
- "$(Q(#Y%$#(Y!#(I$#XQ#\"HU!!HU&#8U$$XM+#8M$#(M#\"XE\"!(E!\"85!!(A!#HI&"
- "\"8=!\"X=\"$8-)\"X9\"\"H1\"\"8-!%X-,\"8)$!H5&$X%&#8!##']$\"H!!!X!\"$(!(\"WA#"
- "#7Q'$7Q&\"WQ#\"W=!\"GQ\"!GE##GI!#G9)\"7=!!G=!\"WA!\"'1#\"G1$\"W%&#7-(!G%%"
- "\"&Q!!VU\"#&Y%!&Y!#7!$\"G!%\"V]#\"7%$#G1)$'-+\"G=%\"'1\"!GA!!79\"\"GA'\"W9#"
- "#'A$\"7=$!GE!#G-'#7A#\"7M!#WQ'\"WU##GU&$8!!\"GY\"%G]'\"8)!\"X!#\"X!#\"'U\""
- "\"8-!#H-&\"X1\"\"X1#%(1,#85%\"89!#89%\"X=#\"XI\"!(A!\"89!#(9!#HQ%#XI&\"8M!"
- "#(Y##)!##XQ'\"HI!!8=\"$Y)$#)%#\"8Q##HY%$Y!%\"Y%\"%I-!\"I1!!Y!!#I)%\"9-#"
- "\")9\"#)1##)5#!YA!#99!%Y9$$)E&$9=(%9=#$9A$\")E%%)E$#9E!#YE##9Q!#YE#"
- "#9M!$Y='#9Q!#IY!$9Y'$YY&$9U$#IU\"$YU'$YM&!IU#\"I]!#YY\"$Z)&\"IY!$)]#"
- "#YQ\"%:-)$*!'!*%!!YY!$*)&\"J1!$J-!$:-!#J-!%*!!#*-\"$*-#!)]!!*)!#Z-\""
- "$J9!#J!!#Z5\"#J1!#J1!&Z1'\"J1!#Z5\"$Z1&\"J1!%Z1*\"*=\"$*=#$J5!#*5\"$J5!"
- "$:1!#J-$#Z5!$J5!\"Z5!#Z1\"#*-\"#J=!#J1!%*9&&*5($J5!$:5$#J5(#J)!&:1%"
- "#Z5!%Z)#%*9#$J5%$:5#$Z=%$:%$#Z)\"#*)&#*9\"#*-\"#J-!$:)$#Z)\"#J9!$)]#"
- "&*%!#Z%\"$:%!\"J%!$II&\"YY!$Z!&&)],\"Z5!$*!#$Y]##J-!#J)!$9Y$%IU#%I])"
- "#J%!$Y]&$)E!#9M!$YM&#9M!#YM#!)I!$IM%#YE\"#IE\"#9E!%9A\"#I=!$I5#\"Y9\""
- "#I=!%YM+%)9%\"Y5\"#)9&\"9-)#95!#Y1##I)%$Y)!!)-!$9!\"#8]!#H]\"\"9!$!Y!!"
- "#9!!!(I!#(U#\"XU(#(Q#!HI#!8A\"\"HE$!(I!#HE&\"8=!\"HA!$8A)\"8=!\"X=#\"X9%"
- "!(9)\"H1\"%H5&$81!$8%)#X)'#8)\"#']$$H%*\"X)#\"7]!#G]##'Y$#H)!\"WY##GY&"
- "#GQ$\"7M!!7I'\"GI#!'E*!WA+$'A#!W5\"\"'I!\"G=%!75\"\"W=#\"'=\"!W-$!G-%\"7%$"
- "\"FU%!FM!!6Y\"\"&Y#!VU&!'!!!F]!\"V](\"G)\"#7)#!G5%\"')%!'1!!W5$!'9##W=#"
- "\"'=\"!G5!\"7A!#WE%\"WM#\"GE#\"7M!\"WM#\"GM\"\"WQ!!GY#\"WY#\"81!$8!!\"GU\"!X%\""
- "#(%$#()!\"81!$(9'\"X-&\"H1\"#89$\"H5!%HM(#H=\"#8=%$H9*#8A$\"XE\"$8I&$(U'"
- "#XM!#(=#\"HY!#(]##H]\"$(U$\"8Y##)!#\"9!##(]#&)!#\"(U\"#Y%$#))##91$!Y)$"
- "#9)!\"I)!#95$\"Y5\"!)5!#Y9&$)1'%9A\"#)5#$YI&\")A%$)A##YI\"#9M!#)E##9=!"
- "$)Y##YA#\"9]##YM\"$)Q$#YA#$*!#$YY#&:!,$9U$&)M%$9Q(#YU\"$Z%#$9U!\"Y]\""
- "#Z%%\":)#$)Q'!Z%!%*%'&Z!/#*%\"%:%($*%##YY\"#I]!%Z1*$:-#&*1(\"Z5!%J-%"
- "%:)!$:1!#J5!$*)##J!!&*-+$J5%'*-!#J!!$J9%#*1\"#J1!!Z9!$:-!%J1)\"I]!"
- "#*1\"$:%!#J5!\"*)\"':-&#Z1\"#Z1%%:-!#J5!#Z1\"#J-!#J-!%J1%%:5$$J-%$Z5&"
- "$:=#$:-!$JA!$Z1\"$J)%$J-\"$:1#$J)%#Z)%%:1!$J%\"!Z)!$:)$#I]!#J!'$)U#"
- "$J1%%J!&#:!#$:!!%J%*$)Q$%J!)#Y]\"&9U\"$*%##9M&#)M#%:!$#9Q!#9I##9U!"
- "$)E#&9I'#9Q'#YE#&YI%\"9M#$IU\"%)I$!YI!$9E%\"Y-\"$)I$%IA'\"Y1\"%))\"\"I9!"
- "#9)!$)Q'\"Y5%#95!!I=#\")-%$Y9!#))#\"I1!#X]##Y%##I!\"%9!'#8Y$\"Y5\"#8Y$"
- "#8]$!HU!#HU%#(Q#$HQ##XU##XM!\"8I!#8M$#XA&$(A\"#(Q#\"X5\"\"HE)\"X9#\"HI!"
- "%(='$(-(\"H%\"\"H-!\"X-&#(!$\"X1\"#H)$\"8!!\"X!#\"WU#$'Y#!H%#\"7U&$'Q&#'E$"
- "#GM$\"'I!!GI#\"'I!\"W9%\"'A#!75\"#'9$#G9$#W5(!G1!!G1!!G-!\"G%\"#F])\"G1%"
- "\"6Y$!&I!!&Q#\"&Y#!6U$\"6M\"$&U\"\"7)$\"7)$#G='!W%\"\"W-&\"'1\"!G1!\"'A#\"75#"
- "\"75$\"'-#\"'A##7A#\"WE#!GI#!WM\"\"7U(\"WY#\"GI\"%8!(\"W]##GY$#H!!\"7]!\"H!\""
- "\"X9(\"G]\"\"H)\"#H)##(-!\"81!\"8)!#89%\"X9#%89'#8A$#(=$\"(E\"$8A)\"8U!#(M!"
- "$8I#\"HI$\"XY\"#(Y##(Q!\"8Q!\"HI!#8Y!\"I)!#8]$#8]$\"I!!#9!\"$Y%($I1&#95!"
- "#9)$$I1)$Y!!\"9)##Y1&\")1(\"I9!\")E\"#)9##I1\"$)9!$)9'%I9'#YA\"#99!#9A!"
- "$9E%$YE'$)I$&)I%#YM##)U\"$9M$!)E!!IM##9Q!!YY!$9U$$Z)##)Q#$YY'%J%&"
- "!YE!%)U!\"IY#$IQ\"#IY$%IY*$J1)$:1##J%!&Z-$%J!&%J%*#J%!$J%!#J!!\"J%!"
- "#J)$#J%!#Y]\"#J-!&:)\"#:)##J)!%*)'$J9%%:-!$Z-&$*5\"\"Z%!\"*-\"\"J1!%Z5&"
- "%Z-&\"J)!#*%#%:5%#J)!$:-##J1!$*-#'Z)(\"Z5!#Z%\"\"J-!#Z1\"#Z5\"#J-!#J5!"
- "%J!##I]!#J1$$:)$%Z)##J)!%*-#$*1\"!:A\"$9]$$:9$$:%$$)Y##IU!$*)##J!!"
- "#)U#&*%+$Y]'#Z%&%9U(\"9Y&#9Q!$YU#&9U-$)I!\")Y($IU%$)M$&IQ$#9M!#)=#"
- "$)Q$!)1!#95!$)I#\"9I#$YA&$IE\"#9E!#9Q!#YA#%9=%#Y9##)9##I1\"$)1$\"I=!"
- "#)5##91!#Y1#\"I-!#91$#Y)#$9%&\"I-!$9%#\"I5$#9!!\"Y!\"\"8]#\"H]!$(Y(\"(U%"
- "!HM!$(I%#(U##XU#$(U(#(E$\"HI$\"89!\"8Q!\"(A\"\"XA#\"XA#\"XA#\"H1\"\"X1##H9&"
- "\"(1#!H)##81\"\"X%##X1'\"G]\"\"']%\"X%!$7]!\"G]!\"X)\"#'Y$\"7Q!\"GE\"$'U#\"'M#"
- "\"'E!#WI'\"'E!\"'Q#!W=\"!G=!!'=#!W=\"!W1!\"'5\"$'1&\"G-!#W)%#G))\"F]#\"&]'"
- "\"6M&\"6M\"\"6Y&!VU\"\"G!%!FM!\"W!&\"6]&$7)#\"'%#!'5!!W)+!7)\"\"'=#!W1$!75$"
- "!G9!\"'9\"#'A%#GI)!7Q\"!'I!#'U$\"'Q\"\"'I!\"GI\"$'I%$'U!#7Q\"$'Y(#7]\"\"GY\""
- "$8!!#(!$\"8%!$X!##'Y$\"H!\"!(1!\"81!\"X5\"#X9!$H9'#H9&\"8=!#XA##XE*\"8E!"
- "\"8I!#HI&#XE##HM%\"8M!\"XI\"\"HU!#XY#\"8U!#9!\"$H])#X]&\"8]!#9%!!XY!#I!#"
- "#9%!$))!!Y)'$Y-$#95!\"9-#\"I1!#Y!&!)=$#I=%\"YI%!I5&$Y=*\"YE\"%91&#9E!"
- "#YM#$IA&%9=#%YI$$)Q#!YA!%IE#\"YQ%$IE%$YY##)M#!YU!#YM#$IU%\"IU!%9M\""
- "\")U(%IY#$9Q%&:!&$9Y!$IY&#IY!!Z)!$:%!%*!#\")]%\"J!!&9U##J!!$I]%!Z%!"
- "$*%#%:%!%*%'\"9Y##Z%%$)U##J)!$*1\"#J)!#Y]\"%J!\"#J)!%*-$\"Z)\"%:))#J)!"
- "#J!!&:)!#*)\"$:5##J%!!J)#\"*%\"#J1!\"J%!$:!$$:1##J)!$J!\"%Z5*&:-\"%*%'"
- "!*%!#J%!$*%'&J%##Z!\"%*1#$*)##J!!#J!!#J!!$:%!$*!##J!!&9Y&$YY'#J%!"
- "\"I]!!)Y$$)I$%9U%$)Y#\"YY\"$YQ#\"IU!%)U!$)I&#9Q!\"9Q##YM#$)Q##YM&#9M$"
- "$YI$$9I$\"IA!%YE+#)A#$9=%&)E,#)M#$)=$#YA&!YE!\"I5!\"I=!\"I1$\"Y-\"\"I1!"
- "#)!##I)%#)-#!I-#$9))!95\"%)-&$XQ(\"Y!##Y!'$H]##8]$!(M!$XQ$$8U##8E%"
- "!(Y!#8Y$#(I#\"XQ\"\"8Q!#(I!\"XE#%8I!\"H=!#8A%#(9!\"X5##(-$#(9##(=!#(1$"
- "#X1'%8E!\"8!!#()$#H%##H%&\"X)\"\"8!!#()!!X!$\"WU#$'Q!\"GI#\"WY#$7M)\"7M!"
- "\"7A#\"'E!!79\"#'A'#W9'$79)!G5##'5\"\"'1#!75\"\"'-\"\"75$\"V]&\"'1\"\"G%%!W-\""
- "#6I&!FU!!&E!!G!!!VU\"!VY\"!VY\"!FY#!G1!!G!!!W%$#7)'!VU\"\"G)%$'-$#71("
- "\"GA'!G=#!GI!\"7A!#WY$!GA!$WE%!GI##'='\"7M!!'Q#\"7Q!\"7U!#WU%\"WY#\"G]\""
- "#8%\"\"X%#\"7Y!#7U%#(1$!H)!\"H-\"$H-'\"H1!#(5!!H!!\"X5\"\"85!#(=#!89%!XA!"
- "\"X9#\"HA$#(I$#HI%#(M#\"XM\"!XE)#8U$\"8Y!#(Y#\"XU\"#(U#$)%'#8Y'\"Y!#%(]\""
- "$Y)'$Y%'#I)%#I)&#Y)&\"I-!$9=(%99&\"95#\"Y1\"\"I5!#)-#\"Y5\"#I9%\"Y9\"#)9#"
- "!Y=!$)5$$)A$#IA\"%YQ*&)M,%IE##YI\"#9A!$YM#$YM'$YM'$9Y!#YU&\"IM!\"YY!"
- "$)U#%II*#9Y'%)I$!)U$!Z!!$Z!\"\"IY!!Y]!!:!\"#9]'$9U$$Z-\"\"I]!$9Y($9]("
- "':)1$Z!#$IY&#*!#!Y]!$J!\"$9]$$J%\"%9]!&YU!$Z!&$:%!$)]#%J%&#I]$$*%#"
- "\":!\"#J%!!*%!$:%!%:!%$:%!&J).$:%$#Z%\"%YY+#J%$\":)##YQ\"#J%!#9U!#:%#"
- "#J!!$Z!'#Z!\"%:%!$Y]'%:%!#Z!\"!Y]!$)]#&I]+$J-%$I]&#I]!$Z)##IU\"#9Q!"
- "#YY\"$)]#$)U##9U!#IY!#9U!$YU#!YQ!#YI%%YU!%)Q$#YQ#\"IM!$YQ*$)E!$YI$"
- "\"I=$%I9*#95!$Y1$#I=\"\"IA$!)=!\"95&!Y1!#I9%\"9=#\")5%#)9##95$%I1!#Y%&"
- "!)-$#9%!#Y)&\"I5$#I%#!XY!#8U!\"(U\"$(Q'\"X]%\"8]!#8M$$I!)\"HQ!#(U#!XM$"
- "\"XE\"#(M##(M&#(I#!(=!\"HQ!#HA%#8I$#(=#$(='$(9\"\"89#!H9#$85&$8=!!H-#"
- "#X)'\"8-#$(9(#H%&\"8)!\"X!#\"G]%#WY%\"GY\"!GQ!\"7Y##'Y!\"GQ\"\"WM#\"WI!\"GI#"
- "\"WA&!W5!\"'E#!W1!\"79!$W='#W5&\"G1$\"G)\"\"&Y#\"7)$!W%&#6U$\"G!#\"'%#\"'!*"
- "!FM%\"6I\"!VM\"!FQ%!6U\"!&U#\"6Y$\"G)*!F]!!7%\"!G1#\"W%&!G!!\"G-#\"'5!!7%\""
- "\"71\"\"G=%\"79#\"'9\"!'=##'='!GA!\"GM\"!'I#!WI!!'Q!\"GM%\"WQ#\"WM#!GI!\"7]!"
- "\"G]$#'Y$$W])\"X-\"#(-$#X)'#']$\"8-!!(-!!85\"\"(1%\"85!$X1#\"8=!#81\"\"X5#"
- "#(9#!XA!\"HE!$H=)\"(Y\"\"(5\"#8M%\"8M!#(U#$(U%#Y!$#(U#!HY#\"X]\"#8]$\"X]\""
- "\"Y!#$XU'$95%#9!%\"Y!##(]&$9!##)9##I%##91!\"Y1\"#95$\"I5!#Y)#\")5%\"IA!"
- "\"IA!$9M(#YU&%I=+#IA%$9=%#I=!#YE##9E!\"9A#$9]$#YE\"\"YQ(#Y=##9E!#9U!"
- "(:%'#YM#&J--$Y]##9Q!%)E$#YU\"#9M!$YI&#IY!$9]'#)Y#&9Y&\"IQ!$9U!$Y]'"
- "#I]!$*!*%I]&#)]#&I]##I]!!IQ##J%!#J!!#Y]\"$*1##YM#!J!'$9M!$:%$$J!%"
- "$:5$\"IU!#J!!$*!#\"Z-%$:%!#*!##J!!$)U#$Z!&$Z%&#Z%&\"IQ!#I]!$Z!'$Z)#"
- "#J5!#Y]%$IU\"$*!##IY!#J-!%)Y'%9M\"&:%&#I]!\"9M#$9Y!$YY&#IY!$9U!#Z!\""
- "$)U#%YU##YQ##YE#$)Q$$9M%#IM$#9M!#9=!$)M$\"IE!!YM!#9I!$)E!$YA!#99!"
- "!IA##YM#$)E!\"9=#\"I=!\"Y=\"\"YE\"\"Y)\"!Y1!$)5!$91%\"91#%)1(#Y-&\"I-!#I5%"
- "\"8]!\"Y)\"\"Y%\"#I%\"%X]%$)%%#H]\"#HM&$(Y$\"8Q&#8Y$\"8U!\"8U#!HE#\"8Q!#8M%"
- "#(M#!HU!#XI$$(I$#8E$\"XA\"\"8=!\"(=%$81$\"X9#!H1!\"H5\"#(9##(1$\"8-$\"81!"
- "#H1#\"H%\"\"G]\"#8%%#H-&#(!$\"W]#!'U!\"G]!\"'E!$WM$$'U&#W=(\"GU\"#GQ!\"WE#"
- "\"7=$!7A'!'9!!G-!!7-'!75$!W1!!')!\"'-#!W1\"#G%%#G!\"\"G%)!G!!\"FY%\"&]!"
- "!&Q!!&Y#!VM$#6M%!FQ#\"6]#!FU##FY'!G!#!FQ#$'))!'%!!'!#!G%!!75$!G1!"
- "\"W1$!W1!!'-!#GM)#'=%!GE!!GA!!'I#!GE!!GE%\"'I!#'E\"#7Q%%GQ'\"'U\"$GU+"
- "!GY!\"'I\"\"8!!\"X!!!'U!\"8%##(!'#()$$()#$(-#\"X9\"\"(1\"\"X5\"\"X5#\"8A!\"85!"
- "\"89!$81)\"8I!#8E%$HE'#(A#$8E##(M#$HM&$8Q#\"XU\"!(Y&\"8Y!#8U$\"8Q#\"I!\""
- "$H])#)!##8]$$)%$#9%!#I%\"%I)(!Y1!!Y)!#Y)&!)5!\"I)!#Y-#\"I1!\"9=##Y5&"
- "#95!#))##YE#\"9=##Y=#&)-##YQ\"$)1$!Y='#9=!#YE##YA#$YM'#9I!#9A!%)E!"
- "\"IA!#IM!%)M(#YM#$IQ%$)Y##)Q#$IY%$9M$#J)!$)U#$IQ\"$)U##9Q##IY!%9I&"
- "\"IY#$)Y#$9Y$$)Y#%YY'&)]!$Y]*$YY#!Z!!#9Y#$9]$#I]!#I]!#Z!&#Y]\"&:%&"
- "$*!#$)U#$:)!\"Z)!#)]##9U!#YQ%\"YY!%9]%#I]!%Z%#$9]$%Y]#%)M$#J)!#J)!"
- "&Y]!#9]$#IY!\"IY!$YY#$I]%%*%$%IU#%IQ#!Y]!!)U!$9U!$IQ%$9U$#YY\"&YY!"
- "$YQ'#II\"#9I!#9M!$)I$&II!#IQ!$II#$)I$\"IE!#Y=#$IA##IA!$)E##Y-#(9Q+"
- "%95)$I5&\"95#%I5.#I9%#)=#\"I!!\"I5'\"I1!\")-\"!)-!#91!#I!&\"I1!$9)(#)9#"
- "\"I-!$9%#$I%&$(Y'\"Y%&\"XY\"\"H]!\"HY!\"H]!#HU%&HU)!HQ!#(I##(Q#!HI)\"8Q!"
- "#(I&$8I##(A#\"H9!#(E#\"8A!!H%!#81%#X='$(%%\"85!\"X1##X1$$(-%#H5)!H1!"
- "\"7Y!\"81!\"WY!\"H!$#8-\"#8!%$'U!!7I\"\"G]$\"7M!#'Y$#'A!#GM&\"WM#\"'9%\"WE%"
- "\"'M\"!GA#\"W9##G5&\"'E#!GA!\"G1'\"75!!'%!#G)$!7-\"\"'!#!&]#\"&]!!6]\"#FY'"
- "!FM#!6Y$!6M\"!G)!!&Q!!7%&!FU!\"&U#\"VY&\"&]#!FY#\"6]$\"')%!G!!\"W)&#75#"
- "\"7%$\"7-&\"'1#!W=(\"WI!!G1!!GA!\"GA%#'=\"\"'=#\"'E!\"7A!\"WY!\"WM#\"X%##'U+"
- "!GU%\"WY#\"WU#\"G]\"%H!,#8-\"#H)!$8!!$G]%%8)%%H-$#(-$\"X5\"\"X5##(-$#X5!"
- "$(9\"$(=\"\"89!!H5##XE&\"8A!$XE+%(U&\"XM%\"8I#\"XM\"%)!,!HM##HM\"#(Y#$Y%'"
- "#9)$#(5$#(U#!8Y\"$(Y$%8Y#&Y)$#I%#\"Y1(\"Y)\"#I)\"#)9#\"Y5\"$Y9!#I1%\"Y)\""
- "#)5#\"I1$%99##)9##9=$#9-!\"9=#!Y=!#9=!\"9A#$)A*$IA##Y5#\"IQ!!YI!#YE\""
- "$9I!$IA&$9Y!%9M\"$91%#9M!#YE\"#9U!#9Y#$IQ&#IQ\"#)U#&)Q%$YQ#%)]('YU&"
- "\"IY!%)U'$J)%%IU)#IE%$9Y$$9Y$$)Y#%IY##9Q!#9Q!\"9Y##IY!$YY##YY)$YY&"
- "$)Y#%9U)\"I]##9I!$9]!&)Y%#)Y#%)Q'#)Y&$I](#YU\"#IY!&IY$$)]##J!!#)Y#"
- "$)U#(9]+&9U&$IY\"#9U!!)U!$YU&\"YU!&9U\"$9Q%#9I!$:%$$9Y$%9M%!YI!%IQ*"
- "%II#$IQ\"#IM%')Q*&)Q($)I#!YQ$&I=!$)9$#YI\"#99!%9=%$)A$\"IA!$Y=$!)='"
- "\"I9!#)9#\"99##)=##9)!\"I5!%I1(\"I-!#I)&\"Y1%#9%$#)-#\"9)#\"Y%#\"(]\"#I%#"
- "%(])$XQ(#(Y!#9!$\"Y1\"\"Y!##XY##(Y#!HU!$Y%($8Q)$HY##(A!#(M#\"HA\"\"8M&"
- "$(9(#HM&!HA&#XA'\"HA!#(=!\"(5#$(1#\"H5$\"85!\"X9%\"X-#\"X%#!X!\"\"X!#$X%+"
- "\"H%!!(!!#']&\"W]!$7Y'#WY!\"'U\"\"GM\"#7Q%$WM&#'A$#7I#\"7E#\"'E!!WA$!W9\""
- "!G=!\"79)\"79$\"75$!71\"\"'%#\"G!!\"W)&!V]\"\"G)%!G1!!7!\"\"FM!!&U#!FU%!VU\""
- "\"FM%\"FM'!6M&\"&I%!FM#\"VU&!FQ)\"FU%!FU#\"6U$\"&Q!\"'!\"#&]'!G!%\"'%\"#79!"
- "!G)!!G-%#G1)!G)!#79'\"71$#79%\"'I#\"WE!#W5'\"WE&\"'E\"#'Q$\"7M!\"GM'\"7Q$"
- "#'U$$8))!GI#\"WM#\"GY\"\"H%!!GY!$H!(%(5'\"8%!\"H)\"\"(%'#8-%$81&#H1##H5&"
- "$(1#\"H9'$H9!#8=%\"X=%#H9&$H1'#(I!\"(I\"#(I!#XY#\"8M##HQ%#8U$\"8U!#(U#"
- "#(I#\"HY$\"HQ!\"HY!#(]!\"I!\"\"Y%&\"8U!&)5&#9-!$I%'$Y%$#))##)1#\"I1!$)5!"
- "\"I1!#)5##)1##)A#\"Y5\"\"I9$$I-'&)90#)-##)1##9I#!YA!\"Y1\"#IE!$)9$\"9A#"
- "#Y=#&)I,#9U!$)E!\"IM$\"II!%9A)#)A#$)M$&9I'$)E!#YM\"%)M$%IQ#$IU%#YQ#"
- "#YQ\"!)A!$)A$$9Q!\"Z%!%)U($)U#\"IU!#IY!$Y]#$)]##)M##9I!\")U\"$9U$#YM#"
- "%)U$%)Y'#)M#\")U\"$Y]'$)U#%IU'$9U$$I])%9U\"#9M!$9Q!$)]##)Q#%YU#$)U#"
- "$*!&\"YU\"$9Y$$9Q%$IM&#YQ\"#IU!$YQ#$YM&$)M##9A!$9Q!%9Q%&)M)#9A!%)I!"
- "$9Y!&IM$#)M#$9M!$9I$#)M#$)E$#91!#YA\"#IA!\"Y-\"\"9=##)5#\")5\"#)5#\"I9!"
- "#)E#%9=-#I9\"#I=%#)I#\"Y9\"$I)*#I-%#Y1##Y-&\"Y-\"$Y!.#HY\"#91!$X]!#I!\""
- "#9!!#8Q$#(]#$8]%#8]!$8M#\"8U&!)!$!HI!#HQ%#(M#\"XI\"!HA!\"XE#\"XE#$8E\""
- "#8A$%8A$\"81!\"8=!#H9&#X9$\"(5\"#85%\"(5#\"(1\"\"X-#\"X1%$X)##(%$\"8!$\"G]$"
- "\"(!#\"7]!\"WY#\"W]##(!$!GI%$GQ*\"'I\"#GM&$7A%#WE\"\"G=#\"7M)\"'A#!'A#\"'=#"
- "\"G1-\"W=&!G=%\"'1\"!W1\"!')#\"G1$\"G%!\"7%!!FY#!W!\"#&]%!V]\"\"F]%\"&U#!'!!"
- "!6]\"#&M$!6Y\"!6I\"\"6M$\"&M#\"&M#\"6U$\"F]+!FY!!FY&#'!'!F]!#&U%\"'%#!'1#"
- "!G)'\"G)$\"'1#\"G)#\"'9#\"'1#!G=!!79\"!G1#\"'E#\"'A#\"7I##7A'\"WI#$'I#!'I!"
- "$'Q!!G=!#X%!\"GQ\"#WQ\"\"W]##'Y$!']$\"'Y%#X%$\"X)#\"8)&#X)'$(!(!(%$\"X%\""
- "\"XE\"\"X5##(5#\"X9#\"X9##HA#\"XA#\"X5\"\"XE#\"(M%\"XE\"$HM'\"XM\"!HY!\"8M##HU\""
- "#(M!#(M#!HU!#(]##I%\"\"(](\"9!##H]%#Y%$$)!$#I%#$)-!$9)\"#)%##))#\"95&"
- "$9)(\"I9!\"Y9\"\"IM'\"I1!\"I5!\"I5!#)5##)1#\"I9!#Y9&\"I-!\"I=!#9A$\")=\"$IQ&"
- "#YA##9I$$)9!$9E%#YI#$9=%#9M!$)E#$YM#$9A%&)M\"$9M$#)M#$)U#!II&$YQ#"
- "$YQ'$YU'#99!$9M!#IU!$)U##)M#$9Q$#9Q$%IY'#9M!$)E##9Q!#)Q#$)]#%9M)"
- "'*!&!YE!#Y]\"%)E(#9Q!$9Q!&YQ/%YQ'$9Q$%9U)#9U!%*!!$IQ\"$YU&$YQ#$9E!"
- "$YE'!IY##IY!$9A%$YM&$9I(#9M!$I])$)I#&IM+#Y9#$YE&#9I!$II)$II%#9A!"
- "\"YE%$9E%$9E(%9E)%YE$&)E,$9A'#9A!%)=(#Y=#%IM##)A#\"IE!'95(#I=%#Y=&"
- "\"I5!$)5$!Y9$#91$#)1#%)1+!Y1$\"Y-\"#9%$\"I)$&(]$!9%($9%##I%#$I%'#(]!"
- "!XM$#X]&\"XQ\"&8M\"!(U&#8U'$HU)#(M##(]#%(M&!XM'\"HA!#(M#!(Q!\"XQ\"\"8A!"
- "\"HA$\"XE##89%#(5!#()$#(A#!H-%#(1#\"81!$(-#!X)!\"()#\"X%#!H%#$X!$!WM\""
- "#8!$#8!'#'Y$#7Y#!'M#\"WI!#']$\"WM##'M$\"'E\"#7M#!'I&\"GE$\"G=%\"'=#\"G9$"
- "\"W5##7!#\"'1#\"79\"!'-!!G%#\"7!$!G1!\"W1&\"&]\"!VU\"!7!\"!FU#\"&]#!FU!\"&Y#"
- "\"FM'!FM#!6U'!FM#!FU#!FQ#\"FQ%\"VM#!&Q#!FU#\"6E$\"6U!!'%!\"')#\"&]\"#')\""
- "#'%'\"W9%\"G)%!7-\"$7-(\"'1\"\"75#!W1$\"G='!G5#\"7Q!!GE!#7E(\"GE\"!GI!#GI&"
- "!'Q&#GM$#'Q$$']%\"7Q!#7U#\"8!!#'Y$!H!#$(!+#()!#W]%%(!(#()&\"H)\"!H-#"
- "\"X-\"\"X1\"\"H5%\"XE#\"X9##H-%\"X=\"#(E$#8M$#H1##8I$#H9\"\"XI\"\"XY\"#HU%#HM#"
- "#XQ!$HU&\"XQ\"#Y!'\"HU!\"I5!#Y-#$)!'\"XY\"#9%$\"Y!#%Y!)%(](#8]$\"I)!\"I-!"
- "$)-'#I!%#99!\"Y9\"#9-$#91!\"I1!\"I1!\"I5!%)9!\"I)!$YA!\"I=!$I9&#I=!#I=!"
- "#9I$%)-+&95'#95!#9A!$9A%#9A!$II##9E!&)E,&YI)#Y9#$YE'$9I$$YQ##YM#"
- "&)Y!$YI#$9Y$%)M!!II&$IM%$)U#%9U)$)U#%IQ&#9M#$:!!#)M#\"IM!#)I#!YM!"
- "$)U##IQ\"'IE)%IU&#9I!$9Q$#)U##YY\"$II#%IM##)M\"$9M$&IM!#9M##IM\"#IM!"
- "#9I!#YM##9U#%)M($YI'%YI$#YE%$)M$#YI##)I##9M!&)E%#9A!$II##Y=\"#IY!"
- "$II##9I!%YE!%)E!\"Y9%$)5!$9=(\"Y1%\"Y9%\"9=#$)9!\"I9$\"95#\"I9!!)!!#99$"
- "#(]##I9%\"9-#$Y!!!Y%!$9-\"$I-#\"Y-\"$8]%$Y!!#9!!#X]#$8Y\"#(U!$Y!$!HQ!"
- "$HY*\"XY\"$8U\"%HU($XQ$#HQ)#(U##(I!#8A$!HI!\"XI\"\"XQ\"%(M\"#(M##HE&%89!"
- "\"8A#$(9%\"X1##X5$#X1&#(1$!H=#\"X-##(-!!X9$\"8)!\"X%#\"8%!#H!!\"X%#\"H!!"
- "\"GY\"\"WY##7M%!GE!#'M$\"X!#\"G=)\"'=\"\"GE\"!GE!\"7E##W5%$'E##'A)#G1)!G9!"
- "#G9(\"W9#!W1$#W-&!G-!!VY\"\"'%#\"W1!\"W!$!FY!!F]!\"'!)\"FY##&U%\"6Q&#F9'"
- "";
diff --git a/hacks/glx/boxed.man b/hacks/glx/boxed.man
deleted file mode 100644
index 455b806..0000000
--- a/hacks/glx/boxed.man
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-boxed \- draws a box full of 3D bouncing balls that explode.
-.SH SYNOPSIS
-.B boxed
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Draws a box full of 3D bouncing balls that explode.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Sander van Grieken. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Sander van Grieken.
diff --git a/hacks/glx/bubble3d.c b/hacks/glx/bubble3d.c
deleted file mode 100644
index 7b0b686..0000000
--- a/hacks/glx/bubble3d.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* bubble3d.c - 3D bubbles */
-
-#if 0
-static const char sccsid[] = "@(#)bubble3d.c 4.11 98/06/16 xlockmore";
-#endif
-
-/*-
- * BUBBLE3D (C) 1998 Richard W.M. Jones.
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- * 16-Jun-98: Written.
- *
- * bubble.c: This code is responsible for creating and managing
- * bubbles over their lifetime.
- * The bubbles may be drawn inside out.
- */
-
-#include "bubble3d.h"
-
-typedef struct bubble {
- GLfloat *contributions; /* List of contributions from each
- * nudge to each vertex. This list has
- * length nr_vertices * nr_nudge_axes.
- */
- GLfloat x, y, z; /* (x,y,z) location of the bubble. */
- GLfloat scale; /* Scaling factor applied to bubble. */
- GLfloat y_incr, scale_incr; /* Change in y and scale each frame. */
- GLfloat rotx, roty, rotz; /* Current rotation. */
- GLfloat rotx_incr, roty_incr, rotz_incr; /* Amount by which we increase
- * rotation each step.
- */
- GLfloat *nudge_angle; /* Current angle (radians) of each
- * nudge. This list has length nr_nudge_axes.
- */
- GLfloat *nudge_angle_incr; /* Amount by which we increase each nudge
- * angle in each frame.
- */
- GLfloat color[4];
-} bubble;
-
-/* Should be taken care of already... but just in case */
-#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
-#undef inline
-#define inline /* */
-#endif
-static inline void
-normalize(GLfloat v[3])
-{
- GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] +
- v[2] * v[2]));
-
- if (d != 0) {
- v[0] /= d;
- v[1] /= d;
- v[2] /= d;
- } else {
- v[0] = v[1] = v[2] = 0;
- }
-}
-
-static inline GLfloat
-dotprod(GLfloat * v1, GLfloat * v2)
-{
- return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
-}
-
-static inline GLfloat
-max(GLfloat a, GLfloat b)
-{
- return a > b ? a : b;
-}
-
-/* Create a new bubble. */
-void *
-glb_bubble_new(glb_data *d, GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
- GLfloat y_incr, GLfloat scale_incr)
-{
- int i, j;
-
- /* GLfloat axes [glb_config.nr_nudge_axes][3]; */
- GLfloat axes[5][3]; /* HARD CODED for SunCC */
- int nr_vertices;
- glb_vertex *vertices = glb_sphere_get_vertices(d, &nr_vertices);
-
- bubble *b = (bubble *) malloc(sizeof *b);
-
- if (b == 0)
- return 0;
-
- if (glb_config.bubble_colour[0] == -1.0) {
- b->color[0] = ((float) (NRAND(100)) / 100.0);
- b->color[1] = ((float) (NRAND(100)) / 100.0);
- b->color[2] = ((float) (NRAND(100)) / 100.0);
- } else {
- b->color[0] = glb_config.bubble_colour[0];
- b->color[1] = glb_config.bubble_colour[1];
- b->color[2] = glb_config.bubble_colour[2];
- }
- b->color[3] = glb_config.bubble_colour[3];
-
-
- b->contributions = (GLfloat *) malloc(sizeof (GLfloat) * nr_vertices *
- glb_config.nr_nudge_axes);
- if (b->contributions == 0) {
- free(b);
- return 0;
- }
- b->nudge_angle = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
- if (b->nudge_angle == 0) {
- free(b->contributions);
- free(b);
- return 0;
- }
- b->nudge_angle_incr = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
- if (b->nudge_angle_incr == 0) {
- free(b->nudge_angle);
- free(b->contributions);
- free(b);
- return 0;
- }
- /* Initialize primitive elements. */
- b->x = x;
- b->y = y;
- b->z = z;
- b->scale = scale;
- b->y_incr = y_incr;
- b->scale_incr = scale_incr;
- b->rotx = b->roty = b->rotz = 0;
- b->rotx_incr = glb_drand() * glb_config.rotation_factor * 2
- - glb_config.rotation_factor;
- b->roty_incr = glb_drand() * glb_config.rotation_factor * 2
- - glb_config.rotation_factor;
- b->rotz_incr = glb_drand() * glb_config.rotation_factor * 2
- - glb_config.rotation_factor;
-
- /* Initialize the nudge angle arrays. */
- for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
- b->nudge_angle[i] = 0;
- b->nudge_angle_incr[i] = glb_drand() * glb_config.nudge_angle_factor;
- }
-
- /* Choose some random nudge axes. */
- for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
- axes[i][0] = glb_drand() * 2 - 1;
- axes[i][1] = glb_drand() * 2 - 1;
- axes[i][2] = glb_drand() * 2 - 1;
- normalize(axes[i]);
- }
-
- /* Calculate the contribution that each nudge axis has on each vertex. */
- for (i = 0; i < nr_vertices; ++i)
- for (j = 0; j < glb_config.nr_nudge_axes; ++j)
- b->contributions[i * glb_config.nr_nudge_axes + j]
- = max(0, dotprod(vertices[i], axes[j]));
-
- return (void *) b;
-}
-
-/* Delete a bubble and free up all memory. */
-void
-glb_bubble_delete(void *bb)
-{
- bubble *b = (bubble *) bb;
-
- if (b != NULL) {
- if (b->nudge_angle_incr) {
- free(b->nudge_angle_incr);
- b->nudge_angle_incr = NULL;
- }
- if (b->nudge_angle) {
- free(b->nudge_angle);
- b->nudge_angle = NULL;
- }
- if (b->contributions) {
- free(b->contributions);
- b->contributions = NULL;
- }
- free(b);
- b = NULL;
- }
-}
-
-/* Rotate and wobble a bubble by a single step. */
-void
-glb_bubble_step(void *bb)
-{
- int i;
- bubble *b = (bubble *) bb;
-
- /* Update the rotation. */
- b->rotx += b->rotx_incr;
- b->roty += b->roty_incr;
- b->rotz += b->rotz_incr;
-
- /* Update the nudge angles. */
- for (i = 0; i < glb_config.nr_nudge_axes; ++i)
- b->nudge_angle[i] += b->nudge_angle_incr[i];
-
- /* Move it upwards & outwards. */
- b->y += b->y_incr;
- b->scale += b->scale_incr;
-}
-
-/* Draw a bubble. */
-void
-glb_bubble_draw(glb_data *d, void *bb)
-{
- int i, j;
- bubble *b = (bubble *) bb;
- int nr_vertices;
- glb_vertex *vertices = glb_sphere_get_vertices(d, &nr_vertices);
- int nr_triangles;
- glb_triangle *triangles = glb_sphere_get_triangles(d, &nr_triangles);
- glb_vertex *new_vertices;
-
- new_vertices = (glb_vertex *) malloc(sizeof (glb_vertex) * nr_vertices);
- /* Calculate the vertices of this bubble, factoring in each nudge axis. */
- for (i = 0; i < nr_vertices; ++i) {
- GLfloat s = 0;
-
- for (j = 0; j < glb_config.nr_nudge_axes; ++j)
- s += ((GLfloat) cos((double) (b->nudge_angle[j])) *
- glb_config.nudge_factor - glb_config.nudge_factor / 2) *
- b->contributions[i * glb_config.nr_nudge_axes + j];
-
- new_vertices[i][0] = vertices[i][0] * (s + 1);
- new_vertices[i][1] = vertices[i][1] * (s + 1);
- new_vertices[i][2] = vertices[i][2] * (s + 1);
- }
-
- glPushMatrix();
-
- /* Apply translation, rotation and scalings. */
- glTranslatef(b->x, b->y, b->z);
-
- glRotatef(b->rotx, 1, 0, 0);
- glRotatef(b->roty, 0, 1, 0);
- glRotatef(b->rotz, 0, 0, 1);
-
- glScalef(b->scale, b->scale, b->scale);
-
- /* Draw the bubble. */
- glFrontFace(GL_CW);
- glBegin(GL_TRIANGLES);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, b->color);
-
- for (i = 0; i < nr_triangles; ++i) {
- glNormal3fv(new_vertices[triangles[i][0]]);
- glVertex3fv(new_vertices[triangles[i][0]]);
- glNormal3fv(new_vertices[triangles[i][1]]);
- glVertex3fv(new_vertices[triangles[i][1]]);
- glNormal3fv(new_vertices[triangles[i][2]]);
- glVertex3fv(new_vertices[triangles[i][2]]);
- }
- glEnd();
- glPopMatrix();
- free(new_vertices);
- glb_config.polygon_count += nr_triangles;
-}
-
-/* Return y value. */
-GLfloat
-glb_bubble_get_y(void *bb)
-{
- bubble *b = (bubble *) bb;
-
- return b->y;
-}
diff --git a/hacks/glx/bubble3d.h b/hacks/glx/bubble3d.h
deleted file mode 100644
index 2816b27..0000000
--- a/hacks/glx/bubble3d.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* GLBUBBLES (C) 1998 Richard W.M. Jones. */
-
-#ifndef __bubbles3d_h__
-#define __bubbles3d_h__
-
-#ifdef STANDALONE
-# include "screenhackI.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#include <math.h>
-
-/* Static configuration. */
-#define GLB_SLOW_GL 0 /* Set this if you have a slow GL
- * implementation. If you have an accelerated
- * graphics card, set this to 0.
- */
-#define GLB_VERTICES_EPSILON 0.0005 /* How close are identical vertices? */
-
-/* Configuration structure. */
-struct glb_config {
- int transparent_p; /* Whether to use alpha blending */
-
- int subdivision_depth; /* Controls how many triangles are in
- * each bubble. 2 and 3 are good values.
- */
- int nr_nudge_axes; /* Number of directions in which each
- * bubble gets stretched. Values between
- * 3 and 7 seem to produce good results.
- */
- GLfloat nudge_angle_factor; /* Max. amount of rotation in nudge angles.
- * Controls the amount of `wobble' we see,
- * and 0.3 seems to work well.
- */
- GLfloat nudge_factor; /* Max. displacement of any single nudge.
- * Controls the amount of the wobble. Depends
- * on NR_NUDGE_AXES, and must not exceed
- * 1 / NR_NUDGE_AXES. 0.1 is good.
- */
- GLfloat rotation_factor; /* Max. amount by which bubbles rotate. */
- int create_bubbles_every; /* How often to create new bubbles. */
- int max_bubbles; /* Max. number of bubbles to create. */
- double p_bubble_group[4]; /* Probabilities of creating 1, 2, 3, 4
- * bubbles in a group. Cumulative.
- */
- GLfloat max_size; /* Max. size. */
- GLfloat min_size; /* Min. size of bubbles. */
- GLfloat max_speed; /* Max. speed. */
- GLfloat min_speed; /* Min. speed of bubbles. */
- GLfloat scale_factor; /* Factor by which bubbles scale from bottom
- * of screen to top. 1.5 - 2.0 are OK.
- */
- GLfloat screen_bottom; /* Bottom of screen. */
- GLfloat screen_top; /* Top of screen. */
- GLfloat bubble_colour[4]; /* Colour of the bubbles. */
-
- int polygon_count;
-};
-
-extern struct glb_config glb_config;
-
-#define glb_drand() ((double)LRAND() / (double)MAXRAND)
-
-/*-- From glb_sphere.c. --*/
-typedef struct glb_data glb_data;
-typedef GLfloat glb_vertex[3];
-typedef GLuint glb_triangle[3];
-extern glb_data * glb_sphere_init(void);
-extern glb_vertex *glb_sphere_get_vertices(glb_data *, int *nr_vertices);
-extern glb_triangle *glb_sphere_get_triangles(glb_data *, int *nr_triangles);
-extern void glb_sphere_end(glb_data *);
-
-/*-- From glb_bubble.c. --*/
-extern void *glb_bubble_new(glb_data *d,
- GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
- GLfloat y_incr, GLfloat scale_incr);
-extern void glb_bubble_delete(void *);
-extern void glb_bubble_step(void *);
-extern void glb_bubble_draw(glb_data *d, void *);
-extern GLfloat glb_bubble_get_y(void *);
-
-/*-- From glb_draw.c. --*/
-extern void *glb_draw_init(void);
-extern void glb_draw_step(void *);
-extern void glb_draw_end(void *);
-
-#endif /* __bubbles3d_h__ */
diff --git a/hacks/glx/bubble3d.man b/hacks/glx/bubble3d.man
deleted file mode 100644
index 6db573a..0000000
--- a/hacks/glx/bubble3d.man
+++ /dev/null
@@ -1,62 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-bubble3d \- 3d rising bubbles.
-.SH SYNOPSIS
-.B bubble3d
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-transparent]
-[\-color \fIcolor\fP]
-[\-fps]
-.SH DESCRIPTION
-Draws a stream of rising, undulating 3D bubbles, rising toward the top of
-the screen, with nice specular reflections.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-transparent
-Draw transparent bubbles instead of solid ones.
-.TP 8
-.B \-color \fIcolor\fP
-Draw bubbles of the specified color. "Random" means a different color
-for each bubble.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 15000 (0.015 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Richard Jones. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Richard Jones.
diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c
deleted file mode 100644
index 645866d..0000000
--- a/hacks/glx/buildlwo.c
+++ /dev/null
@@ -1,98 +0,0 @@
-
-#if 0
-static const char sccsid[] = "@(#)buildlwo.c 4.02 97/04/20 xlockmore";
-#endif
-
-/*-
- * buildlwo.c: Lightwave Object Display List Builder for OpenGL
- *
- * This module can be called by any GL mode wishing to use
- * objects created in NewTek's Lightwave 3D. The objects must
- * first be converted to C source with my converter "lw2ogl".
- * If other people are interested in this, I will put up a
- * web page for it at http://www.netaxs.com/~emackey/lw2ogl/
- *
- * by Ed Mackey, 4/19/97
- *
- */
-
-#ifndef STANDALONE
-# include "xlock.h"
-#else
-# include "screenhackI.h"
-#endif
-
-#ifdef USE_GL
-
-#include "buildlwo.h"
-
-GLuint
-BuildLWO(int wireframe, const struct lwo *object)
-{
- GLuint dl_num;
- const GLfloat *pnts, *normals, *grab;
- const unsigned short int *pols;
- GLfloat three[3];
- int p, num_pnts = 0;
-
- dl_num = glGenLists(1);
- if (!dl_num)
- return (0);
-
- pnts = object->pnts;
- normals = object->normals;
- pols = object->pols;
-
- glNewList(dl_num, GL_COMPILE);
-
- if (!pols) {
- num_pnts = object->num_pnts;
- glBegin(GL_POINTS);
- for (p = 0; p < num_pnts; ++p) {
- three[0] = *(pnts++);
- three[1] = *(pnts++);
- three[2] = *(pnts++);
- glVertex3fv(three);
- }
- glEnd();
- } else
- for (;;) {
- if (num_pnts <= 0) {
- num_pnts = *pols + 2;
- if (num_pnts < 3)
- break;
- if (num_pnts == 3) {
- glBegin(GL_POINTS);
- } else if (num_pnts == 4) {
- glBegin(GL_LINES);
- } else {
- three[0] = *(normals++);
- three[1] = *(normals++);
- three[2] = *(normals++);
- glNormal3fv(three);
- if (wireframe)
- glBegin(GL_LINE_LOOP);
- else
- glBegin(GL_POLYGON);
- }
- } else if (num_pnts == 1) {
- glEnd();
- } else {
- grab = pnts + ((int) (*pols) * 3);
- three[0] = *(grab++);
- three[1] = *(grab++);
- three[2] = *(grab);
- glVertex3fv(three);
- }
- --num_pnts;
- ++pols;
- }
-
- glEndList();
-
- return (dl_num);
-}
-
-#endif /* USE_GL */
-
-/* End of buildlwo.c */
diff --git a/hacks/glx/buildlwo.h b/hacks/glx/buildlwo.h
deleted file mode 100644
index 9b16f73..0000000
--- a/hacks/glx/buildlwo.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*-
- * buildlwo.h: Header file for Lightwave Object Display List Builder
- * for OpenGL
- *
- * by Ed Mackey, 4/19/97
- *
- */
-
-#ifndef __BUILD_LWO_H__
-#define __BUILD_LWO_H__
-
-struct lwo {
- int num_pnts;
- const GLfloat *pnts;
- const GLfloat *normals;
- const unsigned short int *pols;
- const GLfloat *smoothnormals;
-};
-
-GLuint BuildLWO(int wireframe, const struct lwo *object);
-
-#endif
-
-/* End of buildlwo.h */
diff --git a/hacks/glx/cage.c b/hacks/glx/cage.c
deleted file mode 100644
index eb7c7a5..0000000
--- a/hacks/glx/cage.c
+++ /dev/null
@@ -1,497 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* cage --- the Impossible Cage, an Escher like scene. */
-
-#if 0
-static const char sccsid[] = "@(#)cage.c 5.01 2001/03/01 xlockmore";
-#endif
-
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The RotateAroundU() routine was adapted from the book
- * "Computer Graphics Principles and Practice
- * Foley - vanDam - Feiner - Hughes
- * Second Edition" Pag. 227, exercise 5.15.
- *
- * This mode shows some interesting scenes that are impossible OR very
- * wierd to build in the real universe. Much of the scenes are inspirated
- * on Mauritz Cornelis Escher's works which derivated the mode's name.
- * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
- * say he was a mathematician.
- *
- * Thanks goes to Brian Paul for making it possible and inexpensive to use
- * OpenGL at home.
- *
- * Since I'm not a native English speaker, my apologies for any grammatical
- * mistakes.
- *
- * My e-mail address is
- * mfvianna@centroin.com.br
- *
- * Marcelo F. Vianna (Jun-01-1997)
- *
- * Revision History:
- * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
- * 01-Mar-2001: Added FPS stuff E.Lassauge <lassauge@mail.dotcom.fr>
- * 01-Nov-2000: Allocation checks
- * 01-Jan-1998: Mode separated from escher and renamed
- * 08-Jun-1997: New scene implemented: "Impossible Cage" based in a M.C.
- * Escher's painting with the same name (quite similar). The
- * first GL mode to use texture mapping.
- * The "Impossible Cage" scene doesn't use DEPTH BUFFER, the
- * wood planks are drawn consistently using GL_CULL_FACE, and
- * the painter's algorithm is used to sort the planks.
- * Marcelo F. Vianna.
- * 07-Jun-1997: Speed ups in Moebius Strip using GL_CULL_FACE.
- * Marcelo F. Vianna.
- * 03-Jun-1997: Initial Release (Only one scene: "Moebius Strip")
- * The Moebius Strip scene was inspirated in a M.C. Escher's
- * painting named Moebius Strip II in wich ants walk across a
- * Moebius Strip path, sometimes meeting each other and sometimes
- * being in "opposite faces" (note that the moebius strip has
- * only one face and one edge).
- * Marcelo F. Vianna.
- */
-
-/*-
- * Texture mapping is only available on RGBA contexts, Mono and color index
- * visuals DO NOT support texture mapping in OpenGL.
- *
- * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
- * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
- * is not officially supported for both OpenGL and Mesa, but seems to not crash
- * Mesa.
- *
- * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
- */
-
-#ifdef STANDALONE
-# define MODE_cage
-# define DEFAULTS "*delay: 25000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_cage 0
-# define cage_handle_event xlockmore_no_events
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef MODE_cage
-
-#if 0
-#include "e_textures.h"
-#else
-#include "ximage-loader.h"
-#include "images/gen/wood_png.h"
-#endif
-
-ENTRYPOINT ModeSpecOpt cage_opts =
-{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
-
-#ifdef USE_MODULES
-ModStruct cage_description =
-{"cage", "init_cage", "draw_cage", NULL,
- "draw_cage", "change_cage", (char *) NULL, &cage_opts,
- 25000, 1, 1, 1, 1.0, 4, "",
- "Shows the Impossible Cage, an Escher-like GL scene", 0, NULL};
-
-#endif
-
-#define Scale4Window 0.3
-#define Scale4Iconic 0.4
-
-#define sqr(A) ((A)*(A))
-
-#ifndef Pi
-#define Pi M_PI
-#endif
-
-#define ObjWoodPlank 0
-#define MaxObj 1
-
-/*************************************************************************/
-
-typedef struct {
- GLint WindH, WindW;
- GLfloat step;
- GLXContext *glx_context;
-} cagestruct;
-
-static const float front_shininess[] = {60.0};
-static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
-static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
-static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
-static const float position0[] = {1.0, 1.0, 1.0, 0.0};
-static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
-static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
-static const float lmodel_twoside[] = {GL_TRUE};
-
-static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
-
-static cagestruct *cage = (cagestruct *) NULL;
-
-#define PlankWidth 3.0
-#define PlankHeight 0.35
-#define PlankThickness 0.15
-
-static Bool
-draw_woodplank(ModeInfo *mi, cagestruct * cp, int wire)
-{
- glBegin(wire ? GL_LINES : GL_QUADS);
- glNormal3f(0, 0, 1);
- glTexCoord2f(0, 0);
- glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
- glTexCoord2f(1, 0);
- glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
- glTexCoord2f(1, 1);
- glVertex3f(PlankWidth, PlankHeight, PlankThickness);
- glTexCoord2f(0, 1);
- glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
- mi->polygon_count++;
- glNormal3f(0, 0, -1);
- glTexCoord2f(0, 0);
- glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
- glTexCoord2f(1, 0);
- glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
- glTexCoord2f(1, 1);
- glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
- glTexCoord2f(0, 1);
- glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
- mi->polygon_count++;
- glNormal3f(0, 1, 0);
- glTexCoord2f(0, 0);
- glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
- glTexCoord2f(1, 0);
- glVertex3f(PlankWidth, PlankHeight, PlankThickness);
- glTexCoord2f(1, 1);
- glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
- glTexCoord2f(0, 1);
- glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
- mi->polygon_count++;
- glNormal3f(0, -1, 0);
- glTexCoord2f(0, 0);
- glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
- glTexCoord2f(1, 0);
- glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
- glTexCoord2f(1, 1);
- glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
- glTexCoord2f(0, 1);
- glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
- mi->polygon_count++;
- glNormal3f(1, 0, 0);
- glTexCoord2f(0, 0);
- glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
- glTexCoord2f(1, 0);
- glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
- glTexCoord2f(1, 1);
- glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
- glTexCoord2f(0, 1);
- glVertex3f(PlankWidth, PlankHeight, PlankThickness);
- mi->polygon_count++;
- glNormal3f(-1, 0, 0);
- glTexCoord2f(0, 0);
- glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
- glTexCoord2f(1, 0);
- glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
- glTexCoord2f(1, 1);
- glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
- glTexCoord2f(0, 1);
- glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
- mi->polygon_count++;
- glEnd();
-
- return True;
-}
-
-static Bool
-draw_impossiblecage(ModeInfo *mi, cagestruct * cp, int wire)
-{
- glPushMatrix();
- glRotatef(90, 0, 1, 0);
- glTranslatef(0.0, PlankHeight - PlankWidth, -PlankThickness - PlankWidth);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 0, 1);
- glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - PlankThickness);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 1, 0);
- glTranslatef(0.0, PlankWidth - PlankHeight, -PlankThickness - PlankWidth);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0.0, PlankWidth - PlankHeight, 3 * PlankThickness - PlankWidth);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 0, 1);
- glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - PlankThickness);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - 3 * PlankThickness);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0.0, PlankHeight - PlankWidth, 3 * PlankThickness - PlankWidth);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 0, 1);
- glTranslatef(0.0, PlankHeight - PlankWidth, PlankThickness - PlankWidth);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - 3 * PlankThickness);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 1, 0);
- glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth + PlankThickness);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 0, 1);
- glTranslatef(0.0, PlankWidth - PlankHeight, PlankThickness - PlankWidth);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 0, 1, 0);
- glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth + PlankThickness);
- if (!draw_woodplank(mi, cp, wire))
- return False;
- glPopMatrix();
- return True;
-}
-
-static void
-reshape_cage(ModeInfo * mi, int width, int height)
-{
- cagestruct *cp = &cage[MI_SCREEN(mi)];
- int i;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- }
-
- glViewport(0, y, cp->WindW = (GLint) width, cp->WindH = (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
- glMatrixMode(GL_MODELVIEW);
- i = width / 512 + 1;
- glLineWidth(i);
- glPointSize(i);
-}
-
-static void
-pinit(ModeInfo *mi)
-{
- /* int status; */
-
- if (MI_IS_WIREFRAME(mi))
- return;
-
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_POSITION, position1);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_NORMALIZE);
- glFrontFace(GL_CCW);
- glCullFace(GL_BACK);
-
- /* cage */
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
- glShadeModel(GL_FLAT);
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_CULL_FACE);
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-#if 0
- clear_gl_error();
- if (MI_IS_MONO(mi))
- status = 0;
- else
- status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
- WoodTextureWidth, WoodTextureHeight,
- GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
- if (status)
- {
- const char *s = (char *) gluErrorString (status);
- fprintf (stderr, "%s: error mipmapping texture: %s\n",
- progname, (s ? s : "(unknown)"));
- exit (1);
- }
- check_gl_error("mipmapping");
-#else
- {
- XImage *img = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- wood_png, sizeof(wood_png));
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- img->width, img->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, img->data);
- check_gl_error("texture");
- XDestroyImage (img);
- }
-#endif
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
-}
-
-ENTRYPOINT void
-init_cage (ModeInfo * mi)
-{
- cagestruct *cp;
-
- MI_INIT (mi, cage);
- cp = &cage[MI_SCREEN(mi)];
-
- cp->step = NRAND(90);
- if ((cp->glx_context = init_GL(mi)) != NULL) {
-
- reshape_cage(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
- pinit(mi);
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-ENTRYPOINT void
-draw_cage (ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- cagestruct *cp;
-
- if (cage == NULL)
- return;
- cp = &cage[MI_SCREEN(mi)];
-
- MI_IS_DRAWN(mi) = True;
- if (!cp->glx_context)
- return;
-
- mi->polygon_count = 0;
- glXMakeCurrent(display, window, *cp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
- glTranslatef(0.0, 0.0, -10.0);
-
- if (!MI_IS_ICONIC(mi)) {
- glScalef(Scale4Window * cp->WindH / cp->WindW, Scale4Window, Scale4Window);
- } else {
- glScalef(Scale4Iconic * cp->WindH / cp->WindW, Scale4Iconic, Scale4Iconic);
- }
-
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- int o = (int) current_device_rotation();
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- if (o != 0 && o != 180 && o != -180) {
- glScalef (1/h, h, 1/h); /* #### not quite right */
- h = 1.7;
- glScalef (h, h, h);
- }
- h = 0.7;
- glScalef (h, h, h);
- }
-# else
- {
- /* Don't understand why this clause doesn't work on mobile, but it
- doesn't. */
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glRotatef (current_device_rotation(), 0, 0, 1);
- glScalef (s, s, s);
- }
-# endif
-
- /* cage */
- glRotatef(cp->step * 100, 0, 0, 1);
- glRotatef(25 + cos(cp->step * 5) * 6, 1, 0, 0);
- glRotatef(204.5 - sin(cp->step * 5) * 8, 0, 1, 0);
- if (!draw_impossiblecage(mi, cp, MI_IS_WIREFRAME(mi))) {
- MI_ABORT(mi);
- return;
- }
-
- glPopMatrix();
- if (MI_IS_FPS(mi)) do_fps (mi);
- glFlush();
-
- glXSwapBuffers(display, window);
-
- cp->step += 0.025;
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void
-change_cage (ModeInfo * mi)
-{
- cagestruct *cp = &cage[MI_SCREEN(mi)];
-
- if (!cp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cp->glx_context);
- pinit(mi);
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void
-free_cage (ModeInfo * mi)
-{
- /* nothing to do */
-}
-
-XSCREENSAVER_MODULE ("Cage", cage)
-
-#endif
diff --git a/hacks/glx/cage.man b/hacks/glx/cage.man
deleted file mode 100644
index b08458f..0000000
--- a/hacks/glx/cage.man
+++ /dev/null
@@ -1,61 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cage \- Escher's impossible cage, for xscreensaver.
-.SH SYNOPSIS
-.B cage
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-mono]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-This draws Escher's "Impossible Cage", a 3d analog of a moebius strip,
-and rotates it in three dimensions.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 25000 (0.03 seconds.).
-.TP 8
-.B \-mono
-Render solid instead of textured.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of textured.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Marcelo Vianna.
diff --git a/hacks/glx/carousel.c b/hacks/glx/carousel.c
deleted file mode 100644
index ec207a4..0000000
--- a/hacks/glx/carousel.c
+++ /dev/null
@@ -1,958 +0,0 @@
-/* carousel, Copyright (c) 2005-2018 Jamie Zawinski <jwz@jwz.org>
- * Loads a sequence of images and rotates them around.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Created: 21-Feb-2005
- */
-
-#define DEF_FONT \
- "OCR A Std 48, Lucida Console 48, Monaco 48, Courier 48, monospace 48"
-#define DEF_TITLE_FONT "sans-serif bold 48"
-
-#define DEFAULTS "*count: 7 \n" \
- "*delay: 10000 \n" \
- "*wireframe: False \n" \
- "*showFPS: False \n" \
- "*fpsSolid: True \n" \
- "*useSHM: True \n" \
- "*font: " DEF_FONT "\n" \
- "*titleFont: " DEF_TITLE_FONT "\n" \
- "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
- "*grabDesktopImages: False \n" \
- "*chooseRandomImages: True \n"
-
-# define release_carousel 0
-# include "xlockmore.h"
-
-#ifdef USE_GL
-
-# define DEF_SPEED "1.0"
-# define DEF_DURATION "20"
-# define DEF_TITLES "True"
-# define DEF_ZOOM "True"
-# define DEF_TILT "XY"
-# define DEF_MIPMAP "True"
-# define DEF_DEBUG "False"
-
-#include "rotator.h"
-#include "gltrackball.h"
-#include "grab-ximage.h"
-#include "texfont.h"
-
-# ifndef HAVE_JWXYZ
-# include <X11/Intrinsic.h> /* for XrmDatabase in -debug mode */
-# endif
-
-/* Should be in <GL/glext.h> */
-# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
-# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
-# endif
-# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
-# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-# endif
-
-typedef struct {
- double x, y, w, h;
-} rect;
-
-typedef enum { EARLY, NORMAL, LOADING, OUT, IN, DEAD } fade_mode;
-static int fade_ticks = 60;
-
-typedef struct {
- char *title; /* the filename of this image */
- int w, h; /* size in pixels of the image */
- int tw, th; /* size in pixels of the texture */
- XRectangle geom; /* where in the image the bits are */
- GLuint texid;
-} image;
-
-typedef struct {
- ModeInfo *mi;
- image current, loading;
- GLfloat r, theta; /* radius and rotation on the tube */
- rotator *rot; /* for zoomery */
- Bool from_top_p; /* whether this image drops in or rises up */
- time_t expires; /* when this image should be replaced */
- fade_mode mode; /* in/out animation state */
- int mode_tick;
- Bool loaded_p; /* whether background load is done */
-} image_frame;
-
-
-typedef struct {
- GLXContext *glx_context;
- GLfloat anisotropic;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- time_t button_down_time;
-
- int nframes; /* how many frames are loaded */
- int frames_size;
- image_frame **frames; /* pointers to the frames */
-
- Bool awaiting_first_images_p;
- int loads_in_progress;
-
- texture_font_data *texfont, *titlefont;
-
- fade_mode mode;
- int mode_tick;
-
- int loading_sw, loading_sh;
-
- time_t last_time, now;
- int draw_tick;
-
-} carousel_state;
-
-static carousel_state *sss = NULL;
-
-
-/* Command-line arguments
- */
-static GLfloat speed; /* animation speed scale factor */
-static int duration; /* reload images after this long */
-static Bool mipmap_p; /* Use mipmaps instead of single textures. */
-static Bool titles_p; /* Display image titles. */
-static Bool zoom_p; /* Throb the images in and out as they spin. */
-static char *tilt_str;
-static Bool tilt_x_p; /* Tilt axis towards the viewer */
-static Bool tilt_y_p; /* Tilt axis side to side */
-static Bool debug_p; /* Be loud and do weird things. */
-
-
-static XrmOptionDescRec opts[] = {
- {"-zoom", ".zoom", XrmoptionNoArg, "True" },
- {"-no-zoom", ".zoom", XrmoptionNoArg, "False" },
- {"-tilt", ".tilt", XrmoptionSepArg, 0 },
- {"-no-tilt", ".tilt", XrmoptionNoArg, "" },
- {"-titles", ".titles", XrmoptionNoArg, "True" },
- {"-no-titles", ".titles", XrmoptionNoArg, "False" },
- {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
- {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
- {"-duration", ".duration", XrmoptionSepArg, 0 },
- {"-debug", ".debug", XrmoptionNoArg, "True" },
- {"-font", ".font", XrmoptionSepArg, 0 },
- {"-speed", ".speed", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
- { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
- { &titles_p, "titles", "Titles", DEF_TITLES, t_Bool},
- { &zoom_p, "zoom", "Zoom", DEF_ZOOM, t_Bool},
- { &tilt_str, "tilt", "Tilt", DEF_TILT, t_String},
- { &speed, "speed", "Speed", DEF_SPEED, t_Float},
- { &duration, "duration", "Duration", DEF_DURATION, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt carousel_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Allocates a frame structure and stores it in the list.
- */
-static image_frame *
-alloc_frame (ModeInfo *mi)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- image_frame *frame = (image_frame *) calloc (1, sizeof (*frame));
-
- frame->mi = mi;
- frame->mode = EARLY;
- frame->rot = make_rotator (0, 0, 0, 0, 0.04 * frand(1.0) * speed, False);
-
- glGenTextures (1, &frame->current.texid);
- glGenTextures (1, &frame->loading.texid);
- if (frame->current.texid <= 0) abort();
- if (frame->loading.texid <= 0) abort();
-
- if (ss->frames_size <= ss->nframes)
- {
- ss->frames_size = (ss->frames_size * 1.2) + ss->nframes;
- ss->frames = (image_frame **)
- realloc (ss->frames, ss->frames_size * sizeof(*ss->frames));
- if (! ss->frames)
- {
- fprintf (stderr, "%s: out of memory (%d images)\n",
- progname, ss->frames_size);
- exit (1);
- }
- }
-
- ss->frames[ss->nframes++] = frame;
-
- return frame;
-}
-
-
-static void image_loaded_cb (const char *filename, XRectangle *geom,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure);
-
-
-/* Load a new file into the given image struct.
- */
-static void
-load_image (ModeInfo *mi, image_frame *frame)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
-
- if (debug_p && !wire && frame->current.w != 0)
- fprintf (stderr, "%s: dropped %4d x %-4d %4d x %-4d \"%s\"\n",
- progname,
- frame->current.geom.width,
- frame->current.geom.height,
- frame->current.tw, frame->current.th,
- (frame->current.title ? frame->current.title : "(null)"));
-
- switch (frame->mode)
- {
- case EARLY: break;
- case NORMAL: frame->mode = LOADING; break;
- default: abort();
- }
-
- ss->loads_in_progress++;
-
- if (wire)
- image_loaded_cb (0, 0, 0, 0, 0, 0, frame);
- else
- {
- int w = (MI_WIDTH(mi) / 2) - 1;
- int h = (MI_HEIGHT(mi) / 2) - 1;
- if (w <= 10) w = 10;
- if (h <= 10) h = 10;
-
- if (w > h * 5) { /* tiny window: use 16:9 boxes */
- h = w * 9/16;
- }
-
- load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context, w, h,
- mipmap_p, frame->loading.texid,
- image_loaded_cb, frame);
- }
-}
-
-
-/* Callback that tells us that the texture has been loaded.
- */
-static void
-image_loaded_cb (const char *filename, XRectangle *geom,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- image_frame *frame = (image_frame *) closure;
- ModeInfo *mi = frame->mi;
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
-
- if (wire)
- {
- frame->loading.w = MI_WIDTH (mi) * (0.5 + frand (1.0));
- frame->loading.h = MI_HEIGHT (mi);
- frame->loading.geom.width = frame->loading.w;
- frame->loading.geom.height = frame->loading.h;
- goto DONE;
- }
-
- if (image_width == 0 || image_height == 0)
- exit (1);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
-
- if (ss->anisotropic >= 1.0)
- glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
- ss->anisotropic);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- frame->loading.w = image_width;
- frame->loading.h = image_height;
- frame->loading.tw = texture_width;
- frame->loading.th = texture_height;
- frame->loading.geom = *geom;
-
- if (frame->loading.title)
- free (frame->loading.title);
- frame->loading.title = (filename ? strdup (filename) : 0);
-
- /* xscreensaver-getimage returns paths relative to the image directory
- now, so leave the sub-directory part in. Unless it's an absolute path.
- */
- if (frame->loading.title && frame->loading.title[0] == '/')
- { /* strip filename to part after last /. */
- char *s = strrchr (frame->loading.title, '/');
- if (s) strcpy (frame->loading.title, s+1);
- }
-
- if (debug_p)
- fprintf (stderr, "%s: loaded %4d x %-4d %4d x %-4d \"%s\"\n",
- progname,
- frame->loading.geom.width,
- frame->loading.geom.height,
- frame->loading.tw, frame->loading.th,
- (frame->loading.title ? frame->loading.title : "(null)"));
-
- DONE:
-
- frame->loaded_p = True;
-
- if (ss->loads_in_progress <= 0) abort();
- ss->loads_in_progress--;
-
- /* This image expires N seconds after it finished loading. */
- frame->expires = time((time_t *) 0) + (duration * MI_COUNT(mi));
-
- switch (frame->mode)
- {
- case EARLY: /* part of the initial batch of images */
- {
- image swap = frame->current;
- frame->current = frame->loading;
- frame->loading = swap;
- }
- break;
- case LOADING: /* start dropping the old image out */
- {
- frame->mode = OUT;
- frame->mode_tick = fade_ticks / speed;
- frame->from_top_p = random() & 1;
- }
- break;
- default:
- abort();
- }
-}
-
-
-static void loading_msg (ModeInfo *mi, int n);
-
-static Bool
-load_initial_images (ModeInfo *mi)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int i;
- Bool all_loaded_p = True;
- for (i = 0; i < ss->nframes; i++)
- if (! ss->frames[i]->loaded_p)
- all_loaded_p = False;
-
- if (all_loaded_p)
- {
- if (ss->nframes < MI_COUNT (mi))
- {
- /* The frames currently on the list are fully loaded.
- Start the next one loading. (We run the image loader
- asynchronously, but we load them one at a time.)
- */
- load_image (mi, alloc_frame (mi));
- }
- else
- {
- /* The first batch of images are now all loaded!
- Stagger the expire times so that they don't all drop out at once.
- */
- time_t now = time((time_t *) 0);
- int i;
-
- for (i = 0; i < ss->nframes; i++)
- {
- image_frame *frame = ss->frames[i];
- frame->r = 1.0;
- frame->theta = i * 360.0 / ss->nframes;
- frame->expires = now + (duration * (i + 1));
- frame->mode = NORMAL;
- }
-
- /* Instead of always going clockwise, shuffle the expire times
- of the frames so that they drop out in a random order.
- */
- for (i = 0; i < ss->nframes; i++)
- {
- image_frame *frame1 = ss->frames[i];
- image_frame *frame2 = ss->frames[random() % ss->nframes];
- time_t swap = frame1->expires;
- frame1->expires = frame2->expires;
- frame2->expires = swap;
- }
-
- ss->awaiting_first_images_p = False;
- }
- }
-
- loading_msg (mi, ss->nframes-1);
-
- return !ss->awaiting_first_images_p;
-}
-
-
-ENTRYPOINT void
-reshape_carousel (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (60.0, 1/h, 1.0, 8.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 2.6,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-carousel_handle_event (ModeInfo *mi, XEvent *event)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
-
- if (event->xany.type == ButtonPress &&
- event->xbutton.button == Button1)
- {
- if (! ss->button_down_p)
- ss->button_down_time = time((time_t *) 0);
- }
- else if (event->xany.type == ButtonRelease &&
- event->xbutton.button == Button1)
- {
- if (ss->button_down_p)
- {
- /* Add the time the mouse was held to the expire times of all
- frames, so that mouse-dragging doesn't count against
- image expiration.
- */
- int secs = time((time_t *) 0) - ss->button_down_time;
- int i;
- for (i = 0; i < ss->nframes; i++)
- ss->frames[i]->expires += secs;
- }
- }
-
- if (gltrackball_event_handler (event, ss->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &ss->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- int i = random() % ss->nframes;
- ss->frames[i]->expires = 0;
- return True;
- }
-
- return False;
-}
-
-
-/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
- */
-static void
-hack_resources (Display *dpy)
-{
-# ifndef HAVE_JWXYZ
- char *res = "desktopGrabber";
- char *val = get_string_resource (dpy, res, "DesktopGrabber");
- char buf1[255];
- char buf2[255];
- XrmValue value;
- XrmDatabase db = XtDatabase (dpy);
- sprintf (buf1, "%.100s.%.100s", progname, res);
- sprintf (buf2, "%.200s -v", val);
- value.addr = buf2;
- value.size = strlen(buf2);
- XrmPutResource (&db, buf1, "String", &value);
- free (val);
-# endif /* !HAVE_JWXYZ */
-}
-
-
-static void
-loading_msg (ModeInfo *mi, int n)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- char text[100];
-
- if (wire) return;
-
- if (n == 0)
- sprintf (text, "Loading images...");
- else
- sprintf (text, "Loading images... (%d%%)",
- (int) (n * 100 / MI_COUNT(mi)));
-
- if (ss->loading_sw == 0)
- {
- /* only do this once, so that the string doesn't move. */
- XCharStruct e;
- texture_string_metrics (ss->titlefont, text, &e, 0, 0);
- ss->loading_sw = e.width;
- ss->loading_sh = e.ascent + e.descent;
- }
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
-
-/*
- {
- double rot = current_device_rotation();
- glRotatef(rot, 0, 0, 1);
- if ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135))
- {
- GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
- glScalef (s, 1/s, 1);
- }
- }
-*/
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glRotatef (current_device_rotation(), 0, 0, 1);
- glScalef (s, s, s);
- }
-
- glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
- glTranslatef ((MI_WIDTH(mi) - ss->loading_sw) / 2,
- (MI_HEIGHT(mi) - ss->loading_sh) / 2,
- 0);
- glColor3f (1, 1, 0);
- glEnable (GL_TEXTURE_2D);
- glDisable (GL_DEPTH_TEST);
-# ifndef HAVE_ANDROID /* Doesn't work -- photo displays as static */
- print_texture_string (ss->titlefont, text);
-# endif
- glEnable (GL_DEPTH_TEST);
- glPopMatrix();
-
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
- glMatrixMode(GL_MODELVIEW);
-
- glFinish();
- glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
-}
-
-
-ENTRYPOINT void
-init_carousel (ModeInfo *mi)
-{
- int screen = MI_SCREEN(mi);
- carousel_state *ss;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, sss);
- ss = &sss[screen];
-
- if ((ss->glx_context = init_GL(mi)) != NULL) {
- reshape_carousel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
- } else {
- MI_CLEARWINDOW(mi);
- }
-
- if (!tilt_str || !*tilt_str)
- ;
- else if (!strcasecmp (tilt_str, "0"))
- ;
- else if (!strcasecmp (tilt_str, "X"))
- tilt_x_p = 1;
- else if (!strcasecmp (tilt_str, "Y"))
- tilt_y_p = 1;
- else if (!strcasecmp (tilt_str, "XY"))
- tilt_x_p = tilt_y_p = 1;
- else
- {
- fprintf (stderr, "%s: tilt must be 'X', 'Y', 'XY' or '', not '%s'\n",
- progname, tilt_str);
- exit (1);
- }
-
- {
- double spin_speed = speed * 0.2; /* rotation of tube around axis */
- double spin_accel = speed * 0.1;
- double wander_speed = speed * 0.001; /* tilting of axis */
-
- spin_speed *= 0.9 + frand(0.2);
- wander_speed *= 0.9 + frand(0.2);
-
- ss->rot = make_rotator (spin_speed, spin_speed, spin_speed,
- spin_accel, wander_speed, True);
-
- ss->trackball = gltrackball_init (False);
- }
-
- if (strstr ((char *) glGetString(GL_EXTENSIONS),
- "GL_EXT_texture_filter_anisotropic"))
- glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &ss->anisotropic);
- else
- ss->anisotropic = 0.0;
-
- glDisable (GL_LIGHTING);
- glEnable (GL_DEPTH_TEST);
- glDisable (GL_CULL_FACE);
-
- if (! wire)
- {
- glShadeModel (GL_SMOOTH);
- glEnable (GL_LINE_SMOOTH);
- /* This gives us a transparent diagonal slice through each image! */
- /* glEnable (GL_POLYGON_SMOOTH); */
- glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_ALPHA_TEST);
-
- glEnable (GL_POLYGON_OFFSET_FILL);
- glPolygonOffset (1.0, 1.0);
-
- }
-
- ss->texfont = load_texture_font (MI_DISPLAY(mi), "font");
- ss->titlefont = load_texture_font (MI_DISPLAY(mi), "titleFont");
-
- if (debug_p)
- hack_resources (MI_DISPLAY (mi));
-
- ss->nframes = 0;
- ss->frames_size = 10;
- ss->frames = (image_frame **)
- calloc (1, ss->frames_size * sizeof(*ss->frames));
-
- ss->mode = IN;
- ss->mode_tick = fade_ticks / speed;
-
- ss->awaiting_first_images_p = True;
-}
-
-
-static void
-draw_frame (ModeInfo *mi, image_frame *frame, time_t now, Bool body_p)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
-
- GLfloat texw = frame->current.geom.width / (GLfloat) frame->current.tw;
- GLfloat texh = frame->current.geom.height / (GLfloat) frame->current.th;
- GLfloat texx1 = frame->current.geom.x / (GLfloat) frame->current.tw;
- GLfloat texy1 = frame->current.geom.y / (GLfloat) frame->current.th;
- GLfloat texx2 = texx1 + texw;
- GLfloat texy2 = texy1 + texh;
- GLfloat aspect = ((GLfloat) frame->current.geom.height /
- (GLfloat) frame->current.geom.width);
-
- glBindTexture (GL_TEXTURE_2D, frame->current.texid);
-
- glPushMatrix();
-
- /* Position this image on the wheel.
- */
- glRotatef (frame->theta, 0, 1, 0);
- glTranslatef (0, 0, frame->r);
-
- /* Scale down the image so that all N frames fit on the wheel
- without bumping in to each other.
- */
- {
- GLfloat t, s;
- switch (ss->nframes)
- {
- case 1: t = -1.0; s = 1.7; break;
- case 2: t = -0.8; s = 1.6; break;
- case 3: t = -0.4; s = 1.5; break;
- case 4: t = -0.2; s = 1.3; break;
- default: t = 0.0; s = 6.0 / ss->nframes; break;
- }
- glTranslatef (0, 0, t);
- glScalef (s, s, s);
- }
-
- /* Center this image on the wheel plane.
- */
- glTranslatef (-0.5, -(aspect/2), 0);
-
- /* Move as per the "zoom in and out" setting.
- */
- if (zoom_p)
- {
- double x, y, z;
- /* Only use the Z component of the rotator for in/out position. */
- get_position (frame->rot, &x, &y, &z, !ss->button_down_p);
- glTranslatef (0, 0, z/2);
- }
-
- /* Compute the "drop in and out" state.
- */
- switch (frame->mode)
- {
- case EARLY:
- abort();
- break;
- case NORMAL:
- if (!ss->button_down_p &&
- now >= frame->expires &&
- ss->loads_in_progress == 0) /* only load one at a time */
- load_image (mi, frame);
- break;
- case LOADING:
- break;
- case OUT:
- if (--frame->mode_tick <= 0) {
- image swap = frame->current;
- frame->current = frame->loading;
- frame->loading = swap;
-
- frame->mode = IN;
- frame->mode_tick = fade_ticks / speed;
- }
- break;
- case IN:
- if (--frame->mode_tick <= 0)
- frame->mode = NORMAL;
- break;
- default:
- abort();
- }
-
- /* Now translate for current in/out state.
- */
- if (frame->mode == OUT || frame->mode == IN)
- {
- GLfloat t = (frame->mode == OUT
- ? frame->mode_tick / (fade_ticks / speed)
- : (((fade_ticks / speed) - frame->mode_tick + 1) /
- (fade_ticks / speed)));
- t = 5 * (1 - t);
- if (frame->from_top_p) t = -t;
- glTranslatef (0, t, 0);
- }
-
- if (body_p) /* Draw the image quad. */
- {
- if (! wire)
- {
- glColor3f (1, 1, 1);
- glNormal3f (0, 0, 1);
- glEnable (GL_TEXTURE_2D);
- glBegin (GL_QUADS);
- glNormal3f (0, 0, 1);
- glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
- glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
- glTexCoord2f (texx2, texy1); glVertex3f (1, aspect, 0);
- glTexCoord2f (texx1, texy1); glVertex3f (0, aspect, 0);
- glEnd();
- }
-
- /* Draw a box around it.
- */
- glLineWidth (2.0);
- glColor3f (0.5, 0.5, 0.5);
- glDisable (GL_TEXTURE_2D);
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (1, 0, 0);
- glVertex3f (1, aspect, 0);
- glVertex3f (0, aspect, 0);
- glEnd();
-
- }
- else if (frame->current.title && *frame->current.title)
- { /* Draw a title under the image. */
- XCharStruct e;
- int sw, sh;
- GLfloat scale = 0.05;
- char *title = frame->current.title ? frame->current.title : "(untitled)";
- texture_string_metrics (ss->texfont, title, &e, 0, 0);
- sw = e.width;
- sh = e.ascent + e.descent;
-
- glTranslatef (0, -scale, 0);
-
- scale /= sh;
- glScalef (scale, scale, scale);
-
- glTranslatef (((1/scale) - sw) / 2, 0, 0);
- glColor3f (1, 1, 1);
-
- if (!wire)
- {
- glEnable (GL_TEXTURE_2D);
-# ifndef HAVE_ANDROID /* Doesn't work -- photo displays as static */
- print_texture_string (ss->texfont, title);
-# endif
- }
- else
- {
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (sw, 0, 0);
- glVertex3f (sw, sh, 0);
- glVertex3f (0, sh, 0);
- glEnd();
- }
- }
-
- glPopMatrix();
-}
-
-
-ENTRYPOINT void
-draw_carousel (ModeInfo *mi)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int i;
-
- if (!ss->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ss->glx_context);
-
- if (ss->awaiting_first_images_p)
- if (!load_initial_images (mi))
- return;
-
- /* Only check the wall clock every 10 frames */
- {
- if (ss->now == 0 || ss->draw_tick++ > 10)
- {
- ss->now = time((time_t *) 0);
- if (ss->last_time == 0) ss->last_time = ss->now;
- ss->draw_tick = 0;
- }
- }
-
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
- glRotatef(current_device_rotation(), 0, 0, 1);
-
-
- /* Run the startup "un-shrink" animation.
- */
- switch (ss->mode)
- {
- case IN:
- if (--ss->mode_tick <= 0)
- {
- ss->mode = NORMAL;
- ss->last_time = time((time_t *) 0);
- }
- break;
- case NORMAL:
- break;
- default:
- abort();
- }
-
-
- /* Scale as per the startup "un-shrink" animation.
- */
- if (ss->mode != NORMAL)
- {
- GLfloat s = (ss->mode == OUT
- ? ss->mode_tick / (fade_ticks / speed)
- : (((fade_ticks / speed) - ss->mode_tick + 1) /
- (fade_ticks / speed)));
- glScalef (s, s, s);
- }
-
- /* Rotate and tilt as per the user, and the motion modeller.
- */
- {
- double x, y, z;
- gltrackball_rotate (ss->trackball);
-
- /* Tilt the tube up or down by up to 30 degrees */
- get_position (ss->rot, &x, &y, &z, !ss->button_down_p);
- if (tilt_x_p)
- glRotatef (15 - (x * 30), 1, 0, 0);
- if (tilt_y_p)
- glRotatef (7 - (y * 14), 0, 0, 1);
-
- /* Only use the Y component of the rotator. */
- get_rotation (ss->rot, &x, &y, &z, !ss->button_down_p);
- glRotatef (y * 360, 0, 1, 0);
- }
-
- /* First draw each image, then draw the titles. GL insists that you
- draw back-to-front in order to make alpha blending work properly,
- so we need to draw all of the 100% opaque images before drawing
- any of the not-100%-opaque titles.
- */
- for (i = 0; i < ss->nframes; i++)
- draw_frame (mi, ss->frames[i], ss->now, True);
- if (titles_p)
- for (i = 0; i < ss->nframes; i++)
- draw_frame (mi, ss->frames[i], ss->now, False);
-
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
-}
-
-
-ENTRYPOINT void
-free_carousel (ModeInfo *mi)
-{
- carousel_state *ss = &sss[MI_SCREEN(mi)];
- int i;
- if (!ss->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ss->glx_context);
- if (ss->rot) free_rotator (ss->rot);
- if (ss->trackball) gltrackball_free (ss->trackball);
- if (ss->texfont) free_texture_font (ss->texfont);
- if (ss->titlefont) free_texture_font (ss->titlefont);
- for (i = 0; i < ss->nframes; i++) {
- if (ss->frames[i]->current.title) free (ss->frames[i]->current.title);
- if (ss->frames[i]->loading.title) free (ss->frames[i]->loading.title);
- if (ss->frames[i]->rot) free_rotator (ss->frames[i]->rot);
- if (ss->frames[i]->current.texid)
- glDeleteTextures (1, &ss->frames[i]->current.texid);
- if (ss->frames[i]->loading.texid)
- glDeleteTextures (1, &ss->frames[i]->loading.texid);
- }
-}
-
-XSCREENSAVER_MODULE ("Carousel", carousel)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/carousel.man b/hacks/glx/carousel.man
deleted file mode 100644
index cde2eb8..0000000
--- a/hacks/glx/carousel.man
+++ /dev/null
@@ -1,109 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-carousel \- displays multiple images rotating in a circular formation
-.SH SYNOPSIS
-.B carousel
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fIint\fP]
-[\-zoom | \-no\-zoom]
-[\-tilt \fIXY\fP]
-[\-titles | \-no\-titles]
-[\-font \fIfont\fP]
-[\-speed \fIratio\fP]
-[\-duration \fIseconds\fP]
-[\-fps]
-[\-debug]
-[\-wireframe]
-.SH DESCRIPTION
-Loads several random images, and displays them flying in a circular
-formation. The circle changes speed and direction randomly, tilts on
-its axis, and the images move in and out.
-
-This program requires a good video card capable of supporting large
-textures.
-
-To specify the directory that images are loaded from, run
-.BR xscreensaver\-settings (1)
-and click on the "Advanced" tab.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fIint\fP
-How many images to display. Default 7.
-.TP 8
-.B \-zoom \fB| \-no\-zoom\fP
-Whether the images should move in and out (toward and away from the
-axis of rotation). Default true.
-.TP 8
-.B \-tilt \fIXY\fP \fB| \-no\-tilt\fP
-Whether the axis of rotation should tilt, and how. \fB-tilt X\fP
-means that it will tilt toward and away from the viewer.
-\fB-tilt Y\fP means that it will tilt to the left and right of the
-screen. \fB-tilt XY\fP (the default) means it will do both.
-.TP 8
-.B \-titles \fB| \-no\-titles\fP
-Whether to display the file names of the images beneath them. Default: yes.
-.TP 8
-.B \-font \fIfont-name\fP
-The font to use for titles. Note that the size of the font affects
-the clarity of the characters, not their size (it is auto-scaled.)
-.TP 8
-.B \-duration \fIseconds\fP
-Every \fIduration\fP seconds, one of the images will be replaced
-with a new one. Default 20 seconds.
-.TP 8
-.B \-speed \fIratio\fP
-Speed up or slow down the animation. 0.5 means half as fast as the
-default; 2.0 means twice as fast.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-debug
-Prints debugging info to stderr.
-.TP 8
-.B \-wireframe
-Another debug mode.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver\-settings (1)
-.BR xscreensaver\-getimage (MANSUFFIX)
-.BR xscreensaver (1)
-.BR glslideshow (MANSUFFIX)
-.BR photopile (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2005 by Jamie Zawinski.
-
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/chessgames.h b/hacks/glx/chessgames.h
deleted file mode 100644
index 28f5c57..0000000
--- a/hacks/glx/chessgames.h
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * endgame -- plays through a chess game ending. enjoy.
- *
- * Copyright (C) 2002 Blair Tennessy (tennessy@cs.ubc.ca)
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __CHESSGAMES_H__
-#define __CHESSGAMES_H__
-
-/** structure for a chess game */
-typedef struct {
-
- /** original board configuration */
- int board[BOARDSIZE][BOARDSIZE];
-
- /** total moves */
- int movecount;
-
- /**
- moves in game. this is a slight hack: moves are encoded in
- integer pairs (x,y). the first pair, _from_, determines the
- piece to move. the second pair, _to_, determines where to move.
-
- in case _to_ is held by another piece, that piece is taken.
- (see drawTakePiece(), draw_chess())
-
- in case the move promotes a pawn, we assume a queening.
- (see drawMovingPiece())
-
- what's lacking?
- castling, en passant, under-promotions.
- */
- int moves[40][4];
-} ChessGame;
-
-#define GAMES 7
-static ChessGame games[GAMES] = {
-
- /**
- game 1:
-
- E. N. Somov-Nasimovitsch
- White to play and win.
-
- "Zadachi I Etiudi"
- 1928
- */
- {
- {
- { 0, 0, 0, 0, 0, BKING, 0, 0},
- { BPAWN, 0, BPAWN, 0, BPAWN, 0, 0, 0},
- { 0, 0, BPAWN, 0, BPAWN, 0, 0, KNIGHT},
- { PAWN, 0, ROOK, 0, 0, 0, 0, 0},
- { PAWN, 0, 0, 0, KING, PAWN, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { BPAWN, 0, 0, 0, 0, 0, 0, PAWN},
- { BBISHOP,0, 0, 0, 0, 0, 0, 0},
- },
-
- 24,
-
- {
- {3, 2, 6, 2},
- {7, 0, 6, 1},
- {6, 2, 6, 6},
- {0, 5, 0, 4},
- {6, 6, 0, 6},
- {0, 4, 1, 3},
- {2, 7, 1, 5},
- {2, 2, 3, 2},
- {0, 6, 0, 3},
- {1, 3, 2, 2},
- {0, 3, 6, 3},
- {3, 2, 4, 2}, /* pawn to bishop 5 */
- {1, 5, 0, 3}, /* check */
- {2, 2, 3, 2},
- {0, 3, 2, 4}, /* takes pawn */
- {3, 2, 2, 2},
- {2, 4, 0, 3},
- {2, 2, 3, 2},
- {6, 3, 6, 1}, /* rook takes bishop */
- {6, 0, 7, 0},
- {6, 1, 3, 1},
- {3, 2, 2, 3},
- {3, 1, 3, 3},
- {0, 0, 2, 3},
- }
- },
-
- /**
- game 2:
-
- K. A. L. Kubbel
- White to play and win.
-
- "Chess in the USSR"
- 1936
- */
- {
- {
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, BPAWN},
- { 0, 0, 0, 0, BPAWN, KING, 0, BKING},
- { 0, 0, 0, 0, 0, ROOK, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0,BBISHOP, 0, 0, BROOK, 0, PAWN, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0,BISHOP, 0, 0},
- },
-
- 10,
-
- {
- {3, 5, 6, 5},
- {5, 1, 7, 3},
- {6, 5, 6, 7}, /* check */
- {7, 3, 3, 7},
- {7, 5, 6, 4},
- {5, 4, 6, 4},
- {5, 6, 4, 6}, /* ! */
- {6, 4, 6, 7},
- {4, 6, 3, 6},
- {0, 0, 2, 7}
- }
- },
-
- /**
- game 3:
-
- J. Hasek
- White to play and win.
-
- "Le Strategie"
- 1929
- */
- {
- {
- { 0, 0, 0, KNIGHT, 0, 0, 0, KNIGHT},
- { 0, KING, BPAWN, BPAWN, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, BKING, 0, 0, 0, 0, 0, 0},
- { 0, PAWN, 0, 0, 0, BPAWN, 0, 0},
- { PAWN, 0, PAWN, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- },
-
- 11,
-
- {
- {0, 3, 2, 2},
- {1, 3, 2, 2},
- {0, 7, 2, 6},
- {4, 5, 5, 5},
- {2, 6, 3, 4},
- {5, 5, 6, 5},
- {3, 4, 5, 3}, /* ! */
- {6, 5, 7, 5},
- {5, 3, 6, 1},
- {0, 0, 0, 0}, /* mull it over... */
- {0, 0, 3, 1}
- }
- },
-
- /**
- game 4:
-
- M.B. Newman
- White to play and win.
-
- "Chess Amateur"
- 1913
- */
- {
- {
- { 0, 0, 0, 0, BQUEEN, 0, 0, 0},
- {BKNIGHT, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, PAWN},
- { BKING, 0, BISHOP, 0, KNIGHT, 0, 0, 0},
- { PAWN, 0, 0, 0, KNIGHT, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { KING, 0, 0, 0, 0, 0, 0, 0},
- },
-
- 15,
-
- {
- {4, 2, 3, 1},
- {0, 4, 3, 1}, /* queen wins bishop */
- {4, 4, 5, 2},
- {4, 0, 5, 0}, /* king takes pawn */
- {5, 2, 3, 1}, /* knight takes queen, check */
- {1, 0, 3, 1}, /* knight takes knight */
- {3, 7, 2, 7}, /* pawn advances */
- {3, 1, 2, 3},
- {5, 4, 4, 2},
- {2, 3, 4, 2},
- {2, 7, 1, 7}, /* pawn advances */
- {4, 2, 2, 3},
- {1, 7, 0, 7},
- {0, 0, 0, 0},
- {0, 0, 5, 0}
- }
- },
-
- /**
- game 5:
-
- V.A. Korolikov
- White to play and win
-
- First Prize - "Truda"
- 1935
- */
- {
- {
- { 0, 0, BISHOP, 0, 0, 0, 0, 0},
- { BPAWN, ROOK, 0, 0, 0, 0, 0, 0},
- { 0, 0, BPAWN, PAWN, 0, BKING, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, KING, BBISHOP},
- { 0, 0, 0, 0, BPAWN, 0, PAWN, 0},
- { 0, 0, 0, 0, 0, BPAWN, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- },
-
- 21,
-
- {
- {2, 3, 1, 3}, /* pawn to q7 */
- {2, 5, 1, 4}, /* cover with king */
- {1, 1, 0, 1},
- {4, 7, 5, 6}, /* bishop takes pawn */
- {0, 1, 0, 0}, /* r - r8 */
- {6, 5, 7, 5}, /* queened */
- {1, 3, 0, 3}, /* white pawn promoted */
- {1, 4, 0, 3}, /* king takes queen */
- {0, 2, 2, 0}, /* discovered check */
- {5, 6, 0, 1}, /* pull back bishop */
- {2, 0, 7, 5}, /* bishop takes queen */
- {0, 3, 1, 2},
- {7, 5, 2, 0}, /* save rook */
- {5, 4, 6, 4},
- {2, 0, 6, 4}, /* bishop takes pawn */
- {1, 2, 1, 1}, /* king moves in */
- {6, 4, 5, 5},
- {1, 1, 0, 0},
- {5, 5, 2, 2},
- {0, 0, 0, 0},
- {0, 0, 0, 0}
- }
- },
-
- /**
- game 6:
-
- T.B. Gorgiev
- White to play and win
-
- First Prize - "64"
- 1929
- */
- {
- {
- { 0, 0, 0, 0, 0, 0, KNIGHT, 0},
- { BKNIGHT, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, BKING, BKNIGHT, 0, 0, 0},
- { KING, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, KNIGHT, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, BISHOP, 0, 0, 0},
- },
-
- 13,
-
- {
- {3, 0, 2, 1}, /* king on move */
- {1, 0, 0, 2}, /* check */
- {2, 1, 1, 1},
- {0, 2, 1, 4}, /* knight moves on */
- {7, 4, 5, 6}, /* bishop puts king in check */
- {2, 3, 1, 3}, /* king moves back */
- {0, 6, 2, 5}, /* knight moves in, check */
- {1, 3, 0, 3}, /* king moves back queen */
- {5, 6, 1, 2}, /* bishop - b7 ch!! */
- {2, 4, 1, 2}, /* black knight takes bishop */
- {4, 6, 3, 4}, /* knight to k5 */
- {0, 0, 0, 0}, /* mate */
- {0, 0, 0, 0}
- }
- },
-
- /**
- game 7:
-
- K. A. L. Kubbel
- White to play and win
-
- "Schachmatny Listok"
- 1922
- */
- {
- {
- { 0, KNIGHT, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { KING, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, BKING, 0, 0, 0, 0},
- { 0, 0, 0, BPAWN, 0, 0, 0, BISHOP},
- { BPAWN, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, PAWN, PAWN, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- },
-
- 12,
-
- {
- {0, 1, 2, 2}, /* kt-b6 */
- {3, 3, 2, 2}, /* k x kt */
- {4, 7, 2, 5}, /* b-b6 */
- {2, 2, 3, 3}, /* king back to original position */
- {6, 3, 5, 3}, /* p-q3! */
- {5, 0, 6, 0}, /* p-r7 */
- {6, 2, 4, 2}, /* p-b4ch */
- {3, 3, 3, 2}, /* king moves, black cannot capture in passing */
- {2, 0, 1, 1}, /* k-kt7! */
- {6, 0, 7, 0}, /* promo */
- {2, 5, 1, 4}, /* mate */
- {0, 0, 3, 2},
- }
- },
-};
-
-#endif /* __CHESSGAMES_H__ */
diff --git a/hacks/glx/chessmodels.c b/hacks/glx/chessmodels.c
deleted file mode 100644
index ab0bd09..0000000
--- a/hacks/glx/chessmodels.c
+++ /dev/null
@@ -1,1720 +0,0 @@
-/*
- * models for the xss chess screensavers
- * hacked from:
- *
- * glChess - A 3D chess interface
- *
- * Copyright (C) 2006 John-Paul Gignac <jjgignac@users.sf.net>
- *
- * Copyright (C) 2002 Robert Ancell <bob27@users.sourceforge.net>
- * Michael Duelli <duelli@users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* chessmodels.c: Contains the code for piece model creation */
-
-#include "screenhackI.h"
-#include "chessmodels.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-#define ENDOFDATA 65535
-
-/* Section headers */
-#define SPIN 65534
-#define VERTICES 65533
-#define QUADS 65532
-#define TRIANGLES 65531
-#define POLARQUADSTRIP 65530
-#define QUADSTRIP 65529
-
-/* Special spin-related commands */
-#define SEAM 65528
-#define PATTERN 65527
-#define STEPUP 65526
-#define STEPDOWN 65525
-#define SETBACKREF 65524
-#define BACKREF 65523
-
-static unsigned short classic_pawn_data[] = {
- SPIN,16,
- 350,0,SEAM,350,200,SEAM,250,300,SEAM,250,400,SEAM,150,600,SEAM,100,880,
- SEAM,180,880,SEAM,100,920,SEAM,200,1160,SEAM,100,1340,0,1340,
- ENDOFDATA
-};
-
-static unsigned short classic_rook_data[] = {
- SPIN,16,
- 380,0,SEAM,380,200,SEAM,260,500,SEAM,200,1020,SEAM,280,1020,SEAM,280,1360,SEAM,220,1360,SEAM,220,1300,0,1300,
- ENDOFDATA
-};
-
-static unsigned short classic_knight_data[] = {
- SPIN,16,
- 410,0,SEAM,410,200,SEAM,200,360,SEAM,200,480,260,580,
-
- VERTICES,
- 260,580,260, -260,580,260, -260,580,-80, 260,580,-80, 80,1620,400,
- 100,1680,340, -100,1680,340, -80,1620,400, 100,1680,340, 100,1680,300,
- -100,1680,300, -100,1680,340, 100,1680,300, 50,1680,160, -50,1680,160,
- -100,1680,300, 50,1680,160, 100,1680,20, -100,1680,20, -50,1680,160,
- 100,1680,20, 100,1680,-20, -100,1680,-20, -100,1680,20, 100,1680,-20,
- 40,1680,-110, -40,1680,-110, -100,1680,-20, 40,1680,-110,
- 100,1680,-200, -100,1680,-200, -40,1680,-110, 100,1680,-200,
- 100,1680,-440, -100,1680,-440, -100,1680,-200, -100,1680,-440,
- 100,1680,-440, 100,1500,-440, -100,1500,-440, -100,1500,-440,
- 100,1500,-440, 55,1480,-280, -55,1480,-280, -100,1680,300, -50,1680,160,
- -100,1400,130, -120,1380,240, -50,1680,160, -80,1680,20, -120,1380,20,
- -100,1400,130, -83,1660,20, -80,1680,20, -100,1680,-20, -100,1660,-38,
- -120,1380,20, -88,1620,20, -100,1620,-74, -120,1360,-20, -120,1360,-20,
- -100,1620,-74, -100,1580,-110, -60,1400,-140, -100,1680,-200,
- -55,1480,-280, -60,1400,-140, -100,1580,-110, -100,1680,-200,
- -100,1680,-440, -100,1500,-440, -55,1480,-280, 100,1680,300,
- 120,1380,240, 100,1400,130, 50,1680,160, 50,1680,160, 100,1400,130,
- 120,1380,20, 80,1680,20, 83,1660,20, 100,1660,-38, 100,1680,-20,
- 80,1680,20, 120,1380,20, 120,1360,-20, 100,1620,-74, 88,1620,20,
- 120,1360,-20, 60,1400,-140, 100,1580,-110, 100,1620,-74, 100,1680,-200,
- 100,1580,-110, 60,1400,-140, 55,1480,-280, 100,1680,-200, 55,1480,-280,
- 100,1500,-440, 100,1680,-440, 88,1620,20, 100,1620,-74, 80,1640,-56,
- 61,1640,20, 61,1640,20, 80,1640,-56, 100,1660,-38, 83,1660,20,
- -88,1620,20, -61,1640,20, -80,1640,-56, -100,1620,-74, -61,1640,20,
- -83,1660,20, -100,1660,-38, -80,1640,-56, 35,1780,-80, 35,1780,-440,
- -35,1780,-440, -35,1780,-80, 35,1780,-80, 35,1680,-80, 35,1680,-440,
- 35,1780,-440, -35,1780,-80, -35,1780,-440, -35,1680,-440, -35,1680,-80,
- 35,1780,-80, -35,1780,-80, -35,1680,-80, 35,1680,-80, 35,1780,-440,
- 35,1680,-440, -35,1680,-440, -35,1780,-440, -100,1400,130, -120,1380,20,
- 120,1380,20, 100,1400,130, -100,1400,130, 100,1400,130, 120,1380,240,
- -120,1380,240, -260,580,-80, -55,1480,-280, 0,1500,-360, 0,780,-400,
- 260,580,-80, 0,780,-400, 0,1500,-360, 55,1480,-280, -50,1380,40,
- -200,880,400, 200,880,400, 50,1380,40, -200,880,400, -260,580,260,
- 260,580,260, 200,880,400, -50,1380,40, -140,1220,-40, -260,580,260,
- -200,880,400, -140,1220,-40, -114,1220,-222, -260,580,-80, -260,580,260,
- -55,1480,-280, -114,1220,-222, -140,1220,-40, -60,1400,-140,
- 50,1380,40, 200,880,400, 260,580,260, 140,1220,-40, 140,1220,-40,
- 260,580,260, 260,580,-80, 114,1220,-222, 55,1480,-280, 60,1400,-140,
- 140,1220,-40, 114,1220,-222, 260,580,-80, 144,580,-260, 0,780,-400,
- 144,580,-260, -144,580,-260, 0,780,-400, -260,580,-80, 0,780,-400,
- -144,580,-260, 0,1400,400, 80,1620,400, -80,1620,400, 0,1400,400,
- -80,1620,400, -120,1380,240, -120,1380,240, -80,1620,400, -100,1680,340,
- -120,1380,240, -100,1680,340, -100,1680,300, 0,1400,400, 120,1380,240,
- 80,1620,400, 120,1380,240, 100,1680,340, 80,1620,400, 120,1380,240,
- 100,1680,300, 100,1680,340, 0,1400,400, -120,1380,240, 120,1380,240,
- -60,1400,-140, -140,1220,-40, -45,1380,-20, -45,1380,-20, -140,1220,-40,
- -50,1380,40, 60,1400,-140, 45,1380,-20, 140,1220,-40, 45,1380,-20,
- 50,1380,40, 140,1220,-40, 60,1400,-140, 120,1360,-20, 45,1380,-20,
- 50,1380,40, 45,1380,-20, 120,1360,-20, 50,1380,40, 120,1360,-20,
- 120,1380,20, -60,1400,-140, -45,1380,-20, -120,1360,-20, -50,1380,40,
- -120,1360,-20, -45,1380,-20, -50,1380,40, -120,1380,20, -120,1360,-20,
- 88,1620,20, 61,1640,20, 83,1660,20, 100,1620,-74, 100,1660,-38,
- 80,1640,-56, -88,1620,20, -83,1660,20, -61,1640,20, -100,1620,-74,
- -80,1640,-56, -100,1660,-38, -40,1680,-110, -100,1680,-200,
- -100,1580,-110, -100,1680,-20, -40,1680,-110, -100,1580,-110,
- 40,1680,-110, 100,1580,-110, 100,1680,-200, 100,1680,-20, 100,1580,-110,
- 40,1680,-110,
-
- QUADS, 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, 16,17,18,19,
- 20,21,22,23, 24,25,26,27, 28,29,30,31, 32,33,34,35, 36,37,38,39,
- 40,41,42,43, 44,45,46,47, 48,49,50,51, 52,53,54,55, 56,57,58,59,
- 60,61,62,63, 64,65,66,67, 68,69,70,71, 72,73,74,75, 76,77,78,79,
- 80,81,82,83, 84,85,86,87, 88,89,90,91, 92,93,94,95, 96,97,98,99,
- 100,101,102,103, 104,105,106,107, 108,109,110,111, 112,113,114,115,
- 116,117,118,119, 120,121,122,123, 124,125,126,127, 128,129,130,131,
- 132,133,134,135, 136,137,138,139, 140,141,142,143, 144,145,146,147,
- 148,149,150,151, 152,153,154,155, 156,157,158,159, 160,161,162,163,
- 164,165,166,167, 168,169,170,171, 172,173,174,175, 176,177,178,179,
- 180,181,182,183,
-
- TRIANGLES, 184,185,186, 187,188,189, 190,191,192, 193,194,195,
- 196,197,198, 199,200,201, 202,203,204, 205,206,207, 208,209,210,
- 211,212,213, 214,215,216, 217,218,219, 220,221,222, 223,224,225,
- 226,227,228, 229,230,231, 232,233,234, 235,236,237, 238,239,240,
- 241,242,243, 244,245,246, 247,248,249, 250,251,252, 253,254,255,
- 256,257,258, 259,260,261, 262,263,264, 265,266,267, 268,269,270,
-
- ENDOFDATA
-};
-
-static unsigned short classic_bishop_data[] = {
- SPIN,16,
- 400,0,SEAM,400,200,SEAM,250,300,SEAM,250,400,SEAM,150,700,SEAM,120,940,
- SEAM,250,940,SEAM,170,1100,SEAM,170,1220,SEAM,220,1320,SEAM,220,1480,
- SEAM,100,1600,SEAM,80,1700,SEAM,120,1770,SEAM,80,1840,0,1840,
- ENDOFDATA
-};
-
-static unsigned short classic_queen_data[] = {
- SPIN,16,
- 480,0,SEAM,480,220,SEAM,340,400,SEAM,340,500,SEAM,180,800,SEAM,140,1180,
- SEAM,290,1180,SEAM,180,1360,SEAM,180,1520,SEAM,200,1780,SEAM,270,1920,
- SEAM,240,2000,SEAM,170,2000,SEAM,95,2080,SEAM,70,2080,SEAM,90,2140,
- SEAM,70,2200,0,2200,
- ENDOFDATA
-};
-
-static unsigned short classic_king_data[] = {
- SPIN,16,
- 500,0,SEAM,500,200,SEAM,350,300,SEAM,350,460,SEAM,200,760,SEAM,140,1260,
- SEAM,300,1260,SEAM,200,1460,SEAM,200,1560,SEAM,280,1910,SEAM,160,1970,
- SEAM,160,2010,0,2010,
-
- VERTICES,
- -30,2010,35, 30,2010,35, 30,2310,35, -30,2310,35, -90,2110,35,
- -30,2110,35, -30,2210,35, -90,2210,35, 90,2110,35, 90,2210,35,
- 30,2210,35, 30,2110,35, 30,2010,-35, -30,2010,-35, -30,2310,-35,
- 30,2310,-35, -30,2110,-35, -90,2110,-35, -90,2210,-35, -30,2210,-35,
- 30,2110,-35, 30,2210,-35, 90,2210,-35, 90,2110,-35, -90,2110,35,
- -90,2210,35, -90,2210,-35, -90,2110,-35, -30,2010,35, -30,2110,35,
- -30,2110,-35, -30,2010,-35, -30,2210,30, -30,2310,30, -30,2310,-30,
- -30,2210,-30, 90,2110,-35, 90,2210,-35, 90,2210,35, 90,2110,35,
- 30,2010,-35, 30,2110,-35, 30,2110,35, 30,2010,35, 30,2210,-35,
- 30,2310,-35, 30,2310,35, 30,2210,35, -90,2210,-35, -90,2210,35,
- -30,2210,35, -30,2210,-35, 30,2210,-35, 30,2210,35, 90,2210,35,
- 90,2210,-35, -30,2310,-35, -30,2310,35, 30,2310,35, 30,2310,-35,
-
- QUADS, 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, 16,17,18,19,
- 20,21,22,23, 24,25,26,27, 28,29,30,31, 32,33,34,35, 36,37,38,39,
- 40,41,42,43, 44,45,46,47, 48,49,50,51, 52,53,54,55, 56,57,58,59,
-
- ENDOFDATA
-};
-
-static unsigned short knight_data[] = {
- VERTICES, SETBACKREF,0, 7910,8863,0, 7790,8863,1326, 7433,8863,2611,
- 6850,8863,3817, 6059,8863,4907, 5084,8863,5847, 3955,8863,6611,
- 2705,8863,7173, 1373,8863,7517, 0,8863,7633, -1373,8863,7517,
- -2705,8863,7173, -3955,8863,6611, -5084,8863,5847, -6059,8863,4907,
- -6850,8863,3817, -7433,8863,2611, -7790,8863,1326, -7910,8863,0,
- -7790,8863,-1326, -7433,8863,-2611, -6850,8863,-3817,
- -6059,8863,-4907, -5066,8863,-5896, -3955,8863,-6611,
- -2705,8863,-7173, -1373,8863,-7517, 0,8863,-7633, 1373,8863,-7517,
- 2705,8863,-7173, 3955,8863,-6611, 5066,8863,-5896, 6059,8863,-4907,
- 6850,8863,-3817, 7433,8863,-2611, 7790,8863,-1326, -1183,11744,7939,
- -1183,12003,7939, -1183,14019,6547, -1183,16307,5288,
- -1183,16555,5281, -1183,20128,2191, -1134,20304,2131,
- -1183,20516,2156, -1417,21874,1842, -1417,23109,2185,
- -1417,23961,3121, -1417,24001,4252, 0,23917,5637, -1418,23893,5418,
- -1151,23389,6664, -1151,23501,6906, -1151,23806,6987,
- -1151,24102,6987, -1151,24209,7189, -1151,24371,7513,
- -1151,24605,7715, -1151,24939,7674, -1313,25568,7149,
- -1313,25695,7149, -1598,26707,7610, 0,26837,7841, 0,27354,8076,
- -1598,27262,7839, -1598,27842,7723, 0,27919,7998, 0,28449,7606,
- -1598,28309,7303, -1302,28414,6723, 0,28544,6980, 0,28540,6197,
- -1187,28523,5990, -1304,28447,4204, -1158,28789,1627,
- -561,28931,-1220, -357,29608,-1244, -357,30527,-1441,
- -357,31249,-1837, -357,31511,-2627, -357,31511,-3484,
- -357,31118,-4143, -357,30264,-4538, -436,29406,-5256, 0,29409,-5243,
- -2207,29018,-6763, -914,28658,-6964, 0,26292,-7237, -1305,26324,-7143,
- -806,23401,-6784, -812,20723,-6228, -796,16757,-6210,
- -1559,24934,7435, -1566,24633,7460, -1531,24429,7334,
- -1475,24293,7131, -1440,24203,7004, -1372,23935,7015,
- -1364,23606,6868, -1389,23515,6705, -1687,28010,6952,
- -1687,27926,7343, -1687,27629,7491, -1687,27324,7552,
- -1687,27032,7432, -1687,26791,7148, -1642,27135,7165,
- -1642,27254,7304, -1642,27397,7364, -1642,27546,7334,
- -1642,27693,7261, -1642,27737,7088, -1611,10591,8159,
- -888,9327,-8560, -4491,13292,1032, -3840,15084,786, -3412,17397,397,
- -2937,20005,-35, -5108,11669,1240, -6344,10251,1395, -6345,10246,1248,
- -5109,11664,1092, -2964,20022,-132, -3413,17393,250, -3841,15079,638,
- -4491,13288,885, -3743,13207,-535, -3085,15092,-710, -2727,17642,-878,
- -2569,20636,-797, -4348,11575,-324, -5584,10108,-169,
- -5403,10079,-1732, -4167,11644,-1888, -2465,20842,-2651,
- -2522,18130,-2392, -2905,15407,-2077, -3562,13227,-1951,
- -3901,13568,-3294, -3243,15993,-3519, -2861,18863,-3735,
- -2776,22447,-4309, -4486,11792,-3132, -5783,9930,-2931,
- -5783,9930,-3054, -4486,11792,-3255, -2776,22438,-4430,
- -2861,18863,-3858, -3243,15993,-3641, -3901,13568,-3417,
- -6199,9466,4558, -5766,10642,5726, -5228,11829,6090, -4801,12891,6048,
- -4155,14560,5246, -3546,16847,3719, -3334,17643,2937,
- -2860,20062,1230, -4822,12054,7102, -5325,10909,7208,
- -5732,9938,6026, -4026,14701,5522, -2852,20170,1447, -3319,17801,3175,
- -3538,16955,3935, -4090,13256,1679, -2874,20073,676, -3706,15083,1464,
- -3301,17348,1117, -5931,10206,1996, -4695,11624,1840,
- -4445,11658,2844, -5681,10240,3000, -3074,17398,2202,
- -3456,15117,2468, -3840,13290,2683, -4642,13358,4019,
- -4257,15194,3908, -6017,10188,3746, -5237,11714,4039,
- -5621,11218,5077, -5026,12862,5058, -5134,10861,-3154,
- -4193,12680,-3336, -2832,20609,-4118, -3052,17428,-3750,
- -3572,14780,-3529, -3579,14774,-3623, -3059,17422,-3843,
- -2839,20596,-4211, -4200,12674,-3429, -5141,10855,-3248,
- -3908,13562,-3510, -3250,15987,-3735, -2868,18857,-3952,
- -4492,11786,-3348, -5789,9924,-3148, -4817,11321,-3298,
- -5465,10389,-3198, -4054,13118,-3470, -4346,12230,-3389,
- -2853,19681,-4056, -2825,21511,-4367, -3155,16705,-3789,
- -2963,18140,-3897, -3744,14168,-3567, -3415,15381,-3679,
- -845,13482,-6604, -945,10997,-7893, -981,11110,-7735,
- -859,13469,-6526, -899,9307,-8439, -813,16486,-6146, -832,20681,-6100,
- -826,23358,-6656, -882,10149,-8148, -913,12323,-7139,
- -822,14910,-6353, -817,18235,-6210, -827,21937,-6382,
- -846,21937,-6341, -841,14912,-6313, -931,12326,-7098,
- -901,10152,-8107, -844,23359,-6615, -851,20681,-6059,
- -831,16487,-6105, -919,9307,-8399, -869,13482,-6492, -999,11113,-7694,
- -860,9726,-8255, -942,10578,-7958, -962,11715,-7413, -900,12896,-6796,
- -863,14065,-6404, -818,15760,-6221, -828,17367,-6171,
- -854,19800,-5994, -848,21309,-6200, -843,22566,-6482,
- -3407,15409,-3785, -3736,14196,-3673, -2911,18365,-4048,
- -3147,16733,-3895, -2726,21608,-4455, -2808,19905,-4191,
- -4338,12259,-3495, -4046,13146,-3576, -5457,10418,-3304,
- -4809,11349,-3404, -4484,11815,-3454, -2715,22288,-4534,
- -2832,19035,-4066, -3242,16015,-3841, -3900,13590,-3616,
- -5133,10883,-3354, -4171,12742,-3524, -2803,20773,-4339,
- -3051,17450,-3949, -3571,14803,-3729, -4979,11072,-3368,
- -5619,10185,-3279, -4119,12924,-3556, -4411,12037,-3475,
- -2801,20363,-4269, -2721,21826,-4489, -3099,17092,-3922,
- -2887,18618,-4038, -3653,14499,-3701, -3325,15712,-3813,
- -3489,15106,-3757, -3818,13893,-3645, -3011,17758,-3971,
- -3194,16374,-3868, -2755,21085,-4385, -2815,19494,-4139,
- -4265,12481,-3515, -3973,13368,-3596, -5304,10595,-3318,
- -4664,11477,-3407, -5441,10207,-3361, -5350,10338,-3375,
- -5139,10672,-3428, -5058,10742,-3431, -4831,11101,-3457,
- -4742,11228,-3470, -4516,11559,-3504, -4423,11693,-3518,
- -4277,12079,-3558, -4232,12180,-3571, -4138,12522,-3597,
- -4094,12603,-3609, -3979,12935,-3675, -3943,13043,-3671,
- -3852,13383,-3699, -3813,13496,-3705, -3692,13947,-3767,
- -3653,14073,-3790, -3506,14587,-3772, -3467,14685,-3777,
- -3349,15192,-3888, -3308,15317,-3887, -3162,15800,-3957,
- -3119,15954,-3961, -3009,16528,-3946, -3002,16637,-3937,
- -2914,17260,-4014, -2909,17347,-4006, -2834,17893,-4049,
- -2813,18060,-4060, -2760,18849,-4232, -2746,18968,-4242,
- -850,22569,-6438, -855,21313,-6156, -861,19804,-5949,
- -834,17371,-6127, -824,15765,-6176, -869,14070,-6360,
- -906,12901,-6751, -968,11720,-7368, -948,10645,-7895, -865,9731,-8211,
- -1006,11164,-7630, -875,13487,-6447, -926,9310,-8354,
- -837,16490,-6061, -857,20684,-6015, -867,23379,-6515,
- -907,10157,-8062, -937,12331,-7053, -847,14917,-6268,
- -842,18236,-6111, -852,21941,-6297, -885,9891,-8156, -985,10905,-7724,
- -947,11969,-7255, -885,13125,-6649, -858,14493,-6314,
- -839,16049,-6111, -836,17735,-6083, -859,20244,-5982,
- -891,21559,-6157, -848,22883,-6508, -851,22255,-6367,
- -856,20999,-6085, -867,19042,-6000, -836,16930,-6094,
- -835,15341,-6222, -880,13646,-6405, -916,12540,-6953,
- -981,11337,-7564, -927,10370,-7988, -932,9518,-8285, -931,9583,-8174,
- -863,9671,-8145, -892,9982,-8037, -903,10075,-7996, -952,10454,-7865,
- -961,10550,-7832, -1008,10963,-7617, -1018,11105,-7567,
- -996,11458,-7405, -992,11582,-7342, -972,12080,-7057,
- -968,12210,-6984, -935,12620,-6792, -931,12759,-6714,
- -914,13199,-6441, -910,13346,-6359, -915,13767,-6194,
- -910,13941,-6175, -890,14633,-6107, -886,14783,-6091,
- -864,15476,-6035, -859,15645,-6017, -870,16062,-5957,
- -873,16231,-5936, -853,17048,-5965, -861,17185,-5974,
- -879,17812,-5997, -885,17961,-5997, -851,18486,-6138,
- -865,18526,-5933, -872,18761,-5875, -870,19337,-5971,
- -864,19470,-5784, -937,19590,-5786, -833,19023,-6126,
- -851,20344,-5894, -851,20576,-5912, -855,21086,-5973,
- -854,21224,-6003, -871,21651,-6070, -852,21853,-6116,
- -850,22332,-6224, -849,22490,-6259, -831,22924,-6338,
- -834,23240,-6364, -2743,19661,-4287, -2740,19863,-4312,
- -2723,20501,-4469, -2705,20711,-4503, -2661,21262,-4565,
- -2658,21427,-4593, -2687,22088,-4631, -2695,22209,-4643,
- -2774,23170,-4392, -2633,23103,-4527, -2681,22439,-4516,
- -2656,22665,-4573, -2552,22727,-4653, -2534,23015,-4628,
- -2607,23397,-4556, -2759,23681,-4398, -2740,24136,-4370,
- -2610,24100,-4580, -2412,24481,-5089, -2671,24389,-4569,
- -2397,24935,-5652, -2562,25022,-5528, -939,23708,-6566,
- -1009,24359,-6776, -1095,24912,-6886, -1049,24117,-6493,
- -990,23894,-6415, -2290,23837,-4814, -2312,23612,-4723,
- -2183,24804,-5574, -2191,24632,-5391, -1156,24771,-6650,
- -1154,24624,-6586, -1104,24526,-6656, -1281,9161,-8432,
- -2524,9161,-8046, -3691,9161,-7572, -4745,9161,-6945,
- -5662,9127,-6096, -3697,9192,-7581, -2531,9192,-8056,
- -4753,9183,-6951, -5664,9161,-6101, -5664,9185,-6101,
- -4753,9207,-6951, -2531,9216,-8055, -3697,9216,-7581,
- -3684,9232,-7560, -2518,9232,-8034, -4740,9223,-6930,
- -5651,9200,-6080, -2828,20259,1366, -2798,20256,1187, -2820,20237,692,
- -2843,20292,-25, -2874,20473,735, -2975,20508,90, -2474,20772,-759,
- -2660,20879,-691, -2471,21553,-1445, -2498,22175,-1940,
- -2471,24346,-2830, -2556,22373,-1903, -2528,21595,-1351,
- -2493,24314,-2936, -2576,22239,-2123, -2548,21461,-1571,
- -2823,20635,1307, -2741,20503,1328, -1490,23972,5392,
- -1489,24080,4226, -1489,24040,3095, -1489,23188,2159,
- -1489,21953,1816, -2479,22156,182, -1515,23830,2117, -1605,24415,3131,
- -1599,24460,4263, -1580,24357,5431, -1448,23885,6743,
- -1252,24770,5442, -1271,24873,4274, -1277,24828,3142,
- -1389,24618,2016, -1479,24733,1993, -1301,25010,3165,
- -1295,25055,4297, -1391,24890,5460, -1512,25216,5507,
- -1602,25353,4317, -1608,25308,3186, -1979,23458,-29, -1320,25312,1928,
- -1495,25055,546, -2438,25790,-488, -1605,25585,5599, -1583,26793,6150,
- -1850,26272,4298, -1578,27435,7117, -1658,27625,6884,
- -1671,27398,6846, -1678,27176,6937, -1715,27784,6626,
- -1744,27323,6551, -1753,26904,6776, -1884,28809,-1688,
- -1555,28655,1620, -1658,28252,4204, -1581,28263,5997,
- -1567,28312,6790, -1935,27827,4220, -1818,28249,1603,
- -1570,27742,6195, -1532,27288,6120, -2038,27074,4245, -1418,28416,228,
- -413,30264,-4539, -424,31094,-4152, -418,31478,-3497,
- -410,31453,-2653, -410,31190,-1863, -410,30468,-1467,
- -410,29550,-1270, -411,31041,-1902, -448,31253,-2696,
- -449,31323,-3466, -425,31182,-3496, -411,31060,-2738,
- -387,30899,-1932, -316,30806,-1957, -335,30952,-2766,
- -353,31089,-3521, -322,31007,-3540, -303,30871,-2786,
- -284,30725,-1976, -304,30630,-1993, -323,30776,-2802,
- -342,30912,-3557, -396,30843,-3565, -378,30707,-2811,
- -358,30561,-2001, -414,30477,-2013, -433,30623,-2822,
- -452,30759,-3576, -474,30560,-3616, -456,30424,-2861,
- -436,30278,-2052, -349,30194,-2077, -368,30340,-2886,
- -386,30477,-3641, -309,30389,-3665, -291,30253,-2911,
- -271,30107,-2102, -267,29996,-2124, -286,30142,-2933,
- -305,30278,-3688, -376,30179,-3700, -357,30043,-2945,
- -338,29897,-2136, -420,29789,-2150, -439,29935,-2959,
- -458,30071,-3713, -500,29883,-3751, -463,29601,-2187,
- -470,30974,-4049, -462,30153,-4391, -466,30563,-4220,
- -410,30009,-1368, -725,29372,-3225, -677,29335,-5130,
- -908,29205,-3300, -632,29533,-4803, -2587,28768,-3408,
- -2730,28611,-3456, -2404,28568,-6916, -2413,28849,-6612,
- -1904,26715,1801, -1394,25919,831, -2224,27270,-3994,
- -2730,28438,-3011, -2587,28570,-2864, -2826,28152,-3163,
- -2476,28668,-6523, -2476,28433,-6776, -2787,28338,-3507,
- -2216,27658,-3972, -2207,27950,-5907, -2311,28216,-6128,
- -2320,27876,-3971, -2311,28118,-6301, -2311,27845,-6252,
- -2320,27703,-3749, -2320,27084,-3798, -2320,26986,-4070,
- -2698,26705,-4014, -2557,26974,-3547, -2557,27739,-3485,
- -2572,27738,-6362, -2436,28204,-6533, -2436,28421,-6303,
- -2556,28092,-3822, -2431,28142,-6975, -2544,27863,-6726,
- -2266,28229,-1686, -1939,28156,-1065, -2569,27943,-2270,
- -2381,27545,-1682, -2799,27594,-3104, -2750,27866,-2738,
- -2539,27578,-6309, -2720,26853,-3133, -2788,26461,-3776,
- -1061,27543,-7078, -1780,27941,135, -1859,27747,-527, -1756,27784,691,
- -1855,27001,736, -1950,26711,19, -1964,27006,-630, -2342,26955,-1898,
- -2595,25515,-3113, -2147,27855,132, -2126,27722,601, -2213,27691,-428,
- -2210,27061,639, -2290,26816,34, -2302,27065,-515, -2347,27680,100,
- -2335,27602,376, -2386,27584,-229, -2385,27213,398, -2432,27069,42,
- -2439,27215,-281, -2481,27452,103, -1786,24263,399, -2278,24851,-562,
- -2372,25143,-1163, 7383,9172,0, 7270,9172,-1487, 6937,9172,-2929,
- 6393,9172,-4281, 1282,9172,-8433, 0,9172,-8563, 1301,9439,8159,
- 2371,9313,7844, 3857,9286,7355, 4477,9172,6559, 5704,9174,5179,
- 6393,9172,4281, 6937,9172,2929, 7270,9172,1487, -7270,9172,-1487,
- -6937,9172,-2929, -6393,9172,-4281, -1282,9172,-8433, 0,9339,8274,
- -1301,9439,8159, -2371,9313,7844, -3857,9286,7355, -4477,9172,6559,
- -5704,9174,5179, -6393,9172,4281, -6937,9172,2929, -7270,9172,1487,
- -796,9467,8260, 0,9503,8356, 0,9667,8438, -796,9666,8325,
- -807,10584,8327, -7383,9172,0, 796,9467,8260, 796,9666,8325,
- 807,10584,8327, 0,10584,8457, 0,11744,8130, 1183,11744,7939,
- 1183,12003,7939, 0,12003,8130, 0,14019,6737, 1183,14019,6547,
- 1183,16307,5288, 0,16307,5479, 0,16555,5472, 1183,16555,5281,
- 1183,20128,2191, 0,20128,2382, 0,20304,2322, 1134,20304,2131,
- 1183,20516,2156, 0,20516,2346, 0,21898,2060, 1417,21874,1842,
- 1417,23109,2185, 0,23133,2404, 0,23985,3339, 1417,23961,3121,
- 1417,24001,4252, 0,24025,4470, 1418,23893,5418, 1151,23389,6664,
- 0,23394,6882, 0,23506,7125, 1151,23501,6906, 1151,23806,6987,
- 0,23811,7205, 0,24107,7205, 1151,24102,6987, 1151,24209,7189,
- 0,24213,7407, 0,24376,7731, 1151,24371,7513, 1151,24605,7715,
- 0,24610,7933, 0,24944,7892, 1151,24939,7674, 1313,25568,7149,
- 0,25562,7367, 0,25689,7367, 1313,25695,7149, 1598,26707,7610,
- 1598,27262,7839, 1598,27842,7723, 1598,28309,7303, 1302,28414,6723,
- 1187,28523,5990, 1304,28447,4204, 0,28469,4435, 0,28654,1893,
- 1158,28789,1627, 561,28931,-1220, 0,29310,-864, 0,29574,-1062,
- 357,29608,-1244, 357,30527,-1441, 0,30496,-1259, 0,31221,-1655,
- 357,31249,-1837, 357,31511,-2627, 0,31485,-2445, 0,31485,-3302,
- 357,31511,-3484, 357,31118,-4143, 0,31089,-3961, 0,30233,-4356,
- 357,30264,-4538, 436,29406,-5256, 0,29018,-6407, 2207,29018,-6763,
- 914,28658,-6964, 0,28472,-7040, 1305,26324,-7143, 806,23401,-6784,
- 0,23246,-6890, 0,20735,-6319, 812,20723,-6228, 796,16757,-6210,
- 0,17171,-6133, 1559,24934,7435, 1566,24633,7460, 1531,24429,7334,
- 1475,24293,7131, 1440,24203,7004, 1372,23935,7015, 1364,23606,6868,
- 1389,23515,6705, 1687,28010,6952, 1687,27926,7343, 1687,27629,7491,
- 1687,27324,7552, 1687,27032,7432, 1687,26791,7148, 1642,27135,7165,
- 1642,27254,7304, 1642,27397,7364, 1642,27546,7334, 1642,27693,7261,
- 1642,27737,7088, 1611,10591,8159, 888,9327,-8560, 4491,13292,1032,
- 3840,15084,786, 3412,17397,397, 2937,20005,-35, 5108,11669,1240,
- 6344,10251,1395, 6345,10246,1248, 5109,11664,1092, 2964,20022,-132,
- 3413,17393,250, 3841,15079,638, 4491,13288,885, 3743,13207,-535,
- 3085,15092,-710, 2727,17642,-878, 2569,20636,-797, 4348,11575,-324,
- 5584,10108,-169, 5403,10079,-1732, 4167,11644,-1888,
- 2465,20842,-2651, 2522,18130,-2392, 2905,15407,-2077,
- 3562,13227,-1951, 3901,13568,-3294, 3243,15993,-3519,
- 2861,18863,-3735, 2776,22447,-4309, 4486,11792,-3132, 5783,9930,-2931,
- 5783,9930,-3054, 4486,11792,-3255, 2776,22438,-4430, 2861,18863,-3858,
- 3243,15993,-3641, 3901,13568,-3417, 6199,9466,4558, 5766,10642,5726,
- 5228,11829,6090, 4801,12891,6048, 4155,14560,5246, 3546,16847,3719,
- 3334,17643,2937, 2860,20062,1230, 4822,12054,7102, 5325,10909,7208,
- 5732,9938,6026, 4026,14701,5522, 2852,20170,1447, 3319,17801,3175,
- 3538,16955,3935, 4090,13256,1679, 2874,20073,676, 3706,15083,1464,
- 3301,17348,1117, 5931,10206,1996, 4695,11624,1840, 4445,11658,2844,
- 5681,10240,3000, 3074,17398,2202, 3456,15117,2468, 3840,13290,2683,
- 4642,13358,4019, 4257,15194,3908, 6017,10188,3746, 5237,11714,4039,
- 5621,11218,5077, 5026,12862,5058, 5134,10861,-3154, 4193,12680,-3336,
- 2832,20609,-4118, 3052,17428,-3750, 3572,14780,-3529,
- 3579,14774,-3623, 3059,17422,-3843, 2839,20596,-4211,
- 4200,12674,-3429, 5141,10855,-3248, 3908,13562,-3510,
- 3250,15987,-3735, 2868,18857,-3952, 4492,11786,-3348, 5789,9924,-3148,
- 4817,11321,-3298, 5465,10389,-3198, 4054,13118,-3470,
- 4346,12230,-3389, 2853,19681,-4056, 2825,21511,-4367,
- 3155,16705,-3789, 2963,18140,-3897, 3744,14168,-3567,
- 3415,15381,-3679, 0,14037,-6616, 845,13482,-6604, 945,10997,-7893,
- 0,11066,-7866, 981,11110,-7735, 859,13469,-6526, 899,9307,-8439,
- 813,16486,-6146, 832,20681,-6100, 826,23358,-6656, 882,10149,-8148,
- 913,12323,-7139, 822,14910,-6353, 817,18235,-6210, 827,21937,-6382,
- 846,21937,-6341, 841,14912,-6313, 931,12326,-7098, 901,10152,-8107,
- 844,23359,-6615, 851,20681,-6059, 831,16487,-6105, 919,9307,-8399,
- 869,13482,-6492, 999,11113,-7694, 860,9726,-8255, 942,10578,-7958,
- 962,11715,-7413, 900,12896,-6796, 863,14065,-6404, 818,15760,-6221,
- 828,17367,-6171, 854,19800,-5994, 848,21309,-6200, 843,22566,-6482,
- 3407,15409,-3785, 3736,14196,-3673, 2911,18365,-4048,
- 3147,16733,-3895, 2726,21608,-4455, 2808,19905,-4191,
- 4338,12259,-3495, 4046,13146,-3576, 5457,10418,-3304,
- 4809,11349,-3404, 4484,11815,-3454, 2715,22288,-4534,
- 2832,19035,-4066, 3242,16015,-3841, 3900,13590,-3616,
- 5133,10883,-3354, 4171,12742,-3524, 2803,20773,-4339,
- 3051,17450,-3949, 3571,14803,-3729, 4979,11072,-3368,
- 5619,10185,-3279, 4119,12924,-3556, 4411,12037,-3475,
- 2801,20363,-4269, 2721,21826,-4489, 3099,17092,-3922,
- 2887,18618,-4038, 3653,14499,-3701, 3325,15712,-3813,
- 3489,15106,-3757, 3818,13893,-3645, 3011,17758,-3971,
- 3194,16374,-3868, 2755,21085,-4385, 2815,19494,-4139,
- 4265,12481,-3515, 3973,13368,-3596, 5304,10595,-3318,
- 4664,11477,-3407, 5441,10207,-3361, 5350,10338,-3375,
- 5139,10672,-3428, 5058,10742,-3431, 4831,11101,-3457,
- 4742,11228,-3470, 4516,11559,-3504, 4423,11693,-3518,
- 4277,12079,-3558, 4232,12180,-3571, 4138,12522,-3597,
- 4094,12603,-3609, 3979,12935,-3675, 3943,13043,-3671,
- 3852,13383,-3699, 3813,13496,-3705, 3692,13947,-3767,
- 3653,14073,-3790, 3506,14587,-3772, 3467,14685,-3777,
- 3349,15192,-3888, 3308,15317,-3887, 3162,15800,-3957,
- 3119,15954,-3961, 3009,16528,-3946, 3002,16637,-3937,
- 2914,17260,-4014, 2909,17347,-4006, 2834,17893,-4049,
- 2813,18060,-4060, 2760,18849,-4232, 2746,18968,-4242, 850,22569,-6438,
- 855,21313,-6156, 860,19804,-5949, 834,17371,-6127, 824,15765,-6176,
- 869,14070,-6360, 906,12901,-6751, 968,11720,-7368, 948,10645,-7895,
- 865,9731,-8211, 1006,11164,-7630, 875,13487,-6447, 926,9310,-8354,
- 837,16490,-6061, 857,20684,-6015, 867,23379,-6515, 907,10157,-8062,
- 937,12331,-7053, 847,14917,-6268, 842,18236,-6111, 852,21941,-6297,
- 885,9891,-8156, 985,10905,-7724, 947,11969,-7255, 885,13125,-6649,
- 858,14493,-6314, 839,16049,-6111, 836,17735,-6083, 859,20244,-5982,
- 891,21559,-6157, 848,22883,-6508, 851,22255,-6367, 856,20999,-6085,
- 867,19042,-6000, 836,16930,-6094, 835,15341,-6222, 880,13646,-6405,
- 916,12540,-6953, 981,11337,-7564, 927,10370,-7988, 932,9518,-8285,
- 931,9583,-8174, 863,9671,-8145, 892,9982,-8037, 903,10075,-7996,
- 952,10454,-7865, 961,10550,-7832, 1008,10963,-7617, 1018,11105,-7567,
- 996,11458,-7405, 992,11582,-7342, 972,12080,-7057, 968,12210,-6984,
- 935,12620,-6792, 931,12759,-6714, 914,13199,-6441, 910,13346,-6359,
- 915,13767,-6194, 910,13941,-6175, 890,14633,-6107, 886,14783,-6091,
- 864,15476,-6035, 859,15645,-6017, 870,16062,-5957, 873,16231,-5936,
- 853,17048,-5965, 861,17185,-5974, 879,17812,-5997, 885,17961,-5997,
- 851,18486,-6138, 865,18526,-5933, 872,18761,-5875, 870,19337,-5971,
- 864,19470,-5784, 937,19590,-5786, 833,19023,-6126, 851,20344,-5894,
- 851,20576,-5912, 855,21086,-5973, 854,21224,-6003, 871,21651,-6070,
- 852,21853,-6116, 850,22332,-6224, 849,22490,-6259, 831,22924,-6338,
- 834,23240,-6364, 2743,19661,-4287, 2740,19863,-4312, 2723,20501,-4469,
- 2705,20711,-4503, 2661,21262,-4565, 2658,21427,-4593,
- 2687,22088,-4631, 2695,22209,-4643, 2774,23170,-4392,
- 2633,23103,-4527, 2681,22439,-4516, 2656,22665,-4573,
- 2552,22727,-4653, 2534,23015,-4628, 2607,23397,-4556,
- 2759,23681,-4398, 2740,24136,-4370, 2610,24100,-4580,
- 2412,24481,-5089, 2671,24389,-4569, 2397,24935,-5652,
- 2562,25022,-5528, 939,23708,-6566, 1009,24359,-6776, 1095,24912,-6886,
- 1049,24117,-6493, 990,23894,-6415, 2290,23837,-4814, 2312,23612,-4723,
- 2183,24804,-5574, 2191,24632,-5391, 1156,24771,-6650,
- 1154,24624,-6586, 1104,24526,-6656, 0,9161,-8562, 1281,9161,-8432,
- 2524,9161,-8046, 3691,9161,-7572, 4745,9161,-6945, 5662,9127,-6096,
- 3697,9192,-7581, 2531,9192,-8056, 4753,9183,-6951, 5664,9161,-6101,
- 5664,9185,-6101, 4753,9207,-6951, 2531,9216,-8055, 3697,9216,-7581,
- 3684,9232,-7560, 2518,9232,-8034, 4740,9223,-6930, 5651,9200,-6080,
- 2828,20259,1366, 2798,20256,1187, 2820,20237,692, 2843,20292,-25,
- 2874,20473,735, 2975,20508,90, 2474,20772,-759, 2660,20879,-691,
- 2471,21553,-1445, 2498,22175,-1940, 2471,24346,-2830,
- 2556,22373,-1903, 2528,21595,-1351, 2493,24314,-2936,
- 2576,22239,-2123, 2548,21461,-1571, 2823,20635,1307, 2741,20503,1328,
- 1490,23972,5392, 1489,24080,4226, 1489,24040,3095, 1489,23188,2159,
- 1489,21953,1816, 2479,22156,182, 1515,23830,2117, 1605,24415,3131,
- 1599,24460,4263, 1580,24357,5431, 1448,23885,6743, 1252,24770,5442,
- 1271,24873,4274, 1277,24828,3142, 1389,24618,2016, 1479,24733,1993,
- 1301,25010,3165, 1295,25055,4297, 1391,24890,5460, 1512,25216,5507,
- 1602,25353,4317, 1608,25308,3186, 1979,23458,-29, 1320,25312,1928,
- 1495,25055,546, 2438,25790,-488, 1605,25585,5599, 1583,26793,6150,
- 1850,26272,4298, 1578,27435,7117, 1658,27625,6884, 1671,27398,6846,
- 1678,27176,6937, 1715,27784,6626, 1744,27323,6551, 1753,26904,6776,
- 1884,28809,-1688, 1555,28655,1620, 1658,28252,4204, 1581,28263,5997,
- 1567,28312,6790, 1935,27827,4220, 1818,28249,1603, 1570,27742,6195,
- 1532,27288,6120, 2038,27074,4245, 1418,28416,228, 413,30264,-4539,
- 424,31094,-4152, 418,31478,-3497, 410,31453,-2653, 410,31190,-1863,
- 410,30468,-1467, 410,29550,-1270, 411,31041,-1902, 448,31253,-2696,
- 449,31323,-3466, 425,31182,-3496, 411,31060,-2738, 387,30899,-1932,
- 316,30806,-1957, 335,30952,-2766, 353,31089,-3521, 322,31007,-3540,
- 303,30871,-2786, 284,30725,-1976, 304,30630,-1993, 323,30776,-2802,
- 342,30912,-3557, 396,30843,-3565, 378,30707,-2811, 358,30561,-2001,
- 414,30477,-2013, 433,30623,-2822, 452,30759,-3576, 474,30560,-3616,
- 456,30424,-2861, 436,30278,-2052, 349,30194,-2077, 368,30340,-2886,
- 386,30477,-3641, 309,30389,-3665, 291,30253,-2911, 271,30107,-2102,
- 267,29996,-2124, 286,30142,-2933, 305,30278,-3688, 376,30179,-3700,
- 357,30043,-2945, 338,29897,-2136, 420,29789,-2150, 439,29935,-2959,
- 458,30071,-3713, 500,29883,-3751, 463,29601,-2187, 470,30974,-4049,
- 462,30153,-4391, 466,30563,-4220, 410,30009,-1368, 725,29372,-3225,
- 677,29335,-5130, 908,29205,-3300, 632,29533,-4803, 2587,28768,-3408,
- 2730,28611,-3456, 2404,28568,-6916, 2413,28849,-6612,
- 1904,26715,1801, 1394,25919,831, 2224,27270,-3994, 2730,28438,-3011,
- 2587,28570,-2864, 2826,28152,-3163, 2476,28668,-6523,
- 2476,28433,-6776, 2787,28338,-3507, 2216,27658,-3972,
- 2207,27950,-5907, 2311,28216,-6128, 2320,27876,-3971,
- 2311,28118,-6301, 2311,27845,-6252, 2320,27703,-3749,
- 2320,27084,-3798, 2320,26986,-4070, 2698,26705,-4014,
- 2557,26974,-3547, 2557,27739,-3485, 2572,27738,-6362,
- 2436,28204,-6533, 2436,28421,-6303, 2556,28092,-3822,
- 2431,28142,-6975, 2544,27863,-6726, 2266,28229,-1686,
- 1939,28156,-1065, 2569,27943,-2270, 2381,27545,-1682,
- 2799,27594,-3104, 2750,27866,-2738, 2539,27578,-6309,
- 2720,26853,-3133, 2788,26461,-3776, 1061,27543,-7078, 1780,27941,135,
- 1859,27747,-527, 1756,27784,691, 1855,27001,736, 1950,26711,19,
- 1964,27006,-630, 2342,26955,-1898, 2595,25515,-3113, 2147,27855,132,
- 2126,27722,601, 2213,27691,-428, 2210,27061,639, 2290,26816,34,
- 2302,27065,-515, 2347,27680,100, 2335,27602,376, 2386,27584,-229,
- 2385,27213,398, 2432,27069,42, 2439,27215,-281, 2481,27452,103,
- 1786,24263,399, 2278,24851,-562, 2372,25143,-1163, -2567,23141,-2607,
- -2513,23156,-2494, 2513,23156,-2494, 2567,23141,-2607,
-
- TRIANGLES, 657,656,159, 100,506,99, 1003,900,995, 1048,1009,901,
- 1051,901,1009, 1070,1073,1071, 1070,803,808, 1071,1077,1070,
- 1072,1006,1073, 1072,808,915, 1073,808,1072, 1077,1071,1076,
- 1078,1283,1127, 1081,1078,1079, 1081,1079,1080, 1083,1082,1086,
- 1083,747,1274, 1084,888,1085, 1085,878,1086, 1085,1086,1095,
- 1086,747,1083, 1093,1095,1086, 1094,1095,1093, 658,657,149,
- 1101,637,32, 1103,638,1108, 1105,637,1101, 1106,637,1105,
- 1108,638,1111, 111,36,158, 111,653,665, 111,665,36, 1110,858,1112,
- 1111,988,1110, 1111,638,891, 1111,891,988, 1112,858,1113,
- 1113,637,1106, 1117,779,784, 112,214,207, 112,651,210, 1124,1297,1154,
- 1125,1123,1128, 1125,1302,1154, 1127,1077,1078, 1129,791,796,
- 1130,1118,1137, 1136,1130,1137, 1137,1118,1119, 1137,1119,1121,
- 1137,1121,1126, 1142,758,759, 1142,759,760, 1142,760,761,
- 1147,1146,1154, 1150,755,756, 1150,756,757, 1154,1302,1124,
- 1155,1147,1154, 1155,1297,1156, 1155,1154,1297, 1156,1240,1155,
- 1156,1298,1157, 1157,1240,1156, 1157,1299,1273, 1157,1282,1281,
- 1158,1151,1152, 1161,768,1164, 1162,773,1161, 1162,1161,1163,
- 1163,1161,1164, 1165,1172,762, 1168,726,1178, 1168,1267,1266,
- 1169,1178,725, 1171,1172,1165, 1171,720,1172, 1171,1165,1175,
- 1178,1169,1174, 1178,1174,1278, 1179,1229,1228, 118,660,168,
- 1180,1229,1179, 1185,726,1226, 1186,1183,1184, 1186,1184,1191,
- 119,660,118, 1191,1184,1192, 1192,1184,1197, 1197,1184,1198,
- 1198,1184,1203, 1203,1184,1204, 121,116,451, 1210,1209,1230,
- 1215,1210,1230, 1216,1215,1230, 1221,1216,1230, 1222,1185,1226,
- 1222,1221,1230, 1223,1222,1226, 1224,1223,1225, 1225,1223,1226,
- 1226,726,1231, 1227,1188,1189, 1227,1189,1194, 1227,1194,1195,
- 1227,1195,1200, 1227,1200,1201, 1227,1201,1206, 1228,1224,1225,
- 1228,1225,1234, 1229,1207,1212, 1229,1212,1213, 1229,1213,1218,
- 1229,1218,1219, 1229,1219,1224, 1229,1180,1227, 1229,1224,1228,
- 1230,729,1185, 1230,1185,1222, 1231,1225,1226, 1232,1179,1234,
- 1233,744,1232, 1234,1179,1228, 1234,1225,1231, 1235,744,1233,
- 1237,744,1238, 1239,1155,1240, 1240,1157,1239, 1243,1168,1266,
- 1248,1241,1249, 1250,1249,1252, 1252,1249,1253, 1254,1248,1251,
- 1256,1241,1255, 1259,1244,1270, 1264,745,1237, 1265,1260,1272,
- 1267,1168,1178, 1267,1178,1277, 1269,1282,1270, 1270,1282,1273,
- 1271,1268,1269, 1271,1269,1270, 1273,1283,1274, 1274,1078,1081,
- 1274,1081,1083, 1274,747,1275, 1275,745,1264, 1275,1264,1265,
- 1275,1265,1272, 1275,1272,1274, 1276,1178,1278, 1277,1178,1276,
- 1280,1157,1281, 1281,1269,1277, 1282,1157,1273, 1282,1269,1281,
- 1283,1078,1274, 1292,1290,1296, 1295,1292,1296, 1296,1290,1291,
- 1296,1291,1293, 1296,1293,1294, 1296,1294,1295, 1297,1298,1156,
- 1297,1124,1298, 1298,1124,1299, 1299,1124,1273, 1299,1157,1298,
- 660,659,168, 133,128,463, 137,182,141, 138,185,137, 139,184,138,
- 140,183,139, 141,181,142, 141,182,144, 142,181,143, 143,649,142,
- 143,197,195, 144,196,181, 144,199,194, 145,183,140, 145,201,183,
- 145,140,405, 146,184,139, 146,139,183, 146,203,184, 147,185,138,
- 147,138,184, 147,205,185, 148,198,182, 148,137,185, 149,657,159,
- 150,149,159, 151,150,157, 152,151,157, 153,152,157, 157,150,158,
- 157,38,160, 157,37,38, 158,150,159, 160,153,157, 160,39,163,
- 160,38,39, 162,41,161, 163,39,40, 168,659,171, 172,155,156,
- 176,153,154, 176,154,155, 177,658,149, 179,149,150, 179,150,151,
- 180,152,153, 181,197,143, 181,141,144, 181,196,190, 182,199,144,
- 182,137,148, 182,198,189, 183,200,146, 184,202,147, 185,204,148,
- 186,204,185, 186,267,204, 186,185,205, 187,202,184, 187,265,202,
- 187,184,203, 188,200,183, 188,263,200, 188,183,201, 189,275,199,
- 189,261,255, 190,277,197, 190,259,254, 191,276,198, 191,148,204,
- 192,205,147, 192,147,202, 192,268,205, 193,203,146, 193,146,200,
- 193,266,203, 194,278,196, 194,262,249, 196,259,190, 196,144,194,
- 196,278,248, 197,181,190, 197,260,195, 197,277,247, 198,261,189,
- 198,148,191, 198,276,246, 199,182,189, 199,262,194, 199,275,245,
- 200,274,193, 201,273,188, 202,272,192, 203,271,187, 204,270,191,
- 205,269,186, 206,215,209, 206,216,90, 207,215,206, 207,214,208,
- 208,231,215, 208,230,228, 209,233,216, 209,232,227, 210,229,214,
- 210,651,226, 211,235,217, 211,234,225, 212,237,218, 212,236,224,
- 212,386,236, 213,238,223, 213,421,88, 214,230,208, 214,112,210,
- 214,229,222, 215,207,208, 215,232,209, 215,231,221, 216,206,209,
- 216,234,211, 216,233,220, 217,90,211, 217,386,212, 218,89,212,
- 218,238,213, 218,237,219, 219,342,238, 219,340,331, 220,346,234,
- 220,336,329, 221,348,232, 221,334,328, 222,350,230, 222,332,327,
- 223,341,326, 224,343,237, 224,339,325, 225,345,235, 225,337,324,
- 226,351,229, 226,651,445, 227,347,233, 227,335,322, 228,349,231,
- 228,333,321, 229,332,222, 229,210,226, 229,351,320, 230,214,222,
- 230,333,228, 230,350,319, 231,334,221, 231,208,228, 231,349,318,
- 232,215,221, 232,335,227, 232,348,317, 233,336,220, 233,209,227,
- 233,347,316, 234,216,220, 234,337,225, 234,346,315, 235,211,225,
- 235,345,314, 236,339,224, 236,383,313, 236,344,383, 237,340,219,
- 237,212,224, 237,343,312, 238,218,219, 238,341,223, 238,342,311,
- 239,269,205, 239,205,268, 240,270,204, 240,204,267, 241,271,203,
- 241,203,266, 242,272,202, 242,202,265, 243,273,201, 243,201,264,
- 244,274,200, 244,200,263, 250,145,407, 251,266,193, 251,193,274,
- 252,268,192, 252,192,272, 253,191,270, 256,263,188, 256,188,273,
- 257,265,187, 257,187,271, 258,267,186, 258,186,269, 259,196,248,
- 22,650,435, 260,197,247, 261,198,246, 262,199,245, 21,650,22,
- 275,189,255, 276,191,253, 277,190,254, 278,194,249, 323,226,445,
- 330,217,235, 330,235,338, 332,229,320, 333,230,319, 334,231,318,
- 335,232,317, 336,233,316, 337,234,315, 338,235,314, 339,236,313,
- 664,653,661, 340,237,312, 341,238,311, 342,219,331, 343,224,325,
- 344,236,386, 345,225,324, 346,220,329, 347,227,322, 348,221,328,
- 349,228,321, 665,653,664, 350,222,327, 351,226,323, 380,217,330,
- 405,408,145, 405,412,406, 406,408,405, 407,145,408, 408,341,407,
- 411,406,412, 413,412,461, 414,413,416, 415,414,416, 416,413,608,
- 418,87,421, 418,416,608, 419,223,326, 420,213,223, 420,223,419,
- 421,417,418, 421,213,420, 421,430,428, 421,87,88, 428,430,429,
- 430,421,420, 435,650,439, 439,650,440, 440,650,447, 442,651,437,
- 444,195,323, 444,323,445, 445,651,442, 446,195,444, 447,650,195,
- 447,195,446, 453,452,471, 455,453,471, 460,455,471, 461,617,413,
- 462,457,459, 465,43,44, 471,452,464, 471,464,470, 486,485,492,
- 488,458,1301, 488,631,458, 488,1301,459, 488,480,481, 488,481,489,
- 489,574,490, 490,631,489, 490,574,491, 490,632,631, 491,632,490,
- 495,105,106, 495,106,107, 495,107,108, 495,108,109, 495,109,110,
- 495,110,496, 497,495,496, 498,105,495, 498,495,497, 499,506,505,
- 505,68,71, 506,68,505, 506,67,68, 508,503,512, 509,499,505,
- 512,74,502, 512,502,601, 513,563,514, 518,517,520, 518,564,76,
- 519,75,564, 519,74,75, 523,522,561, 525,518,520, 526,518,525,
- 528,523,561, 529,528,561, 531,518,526, 532,518,531, 534,529,561,
- 535,534,561, 537,518,532, 538,518,537, 540,535,561, 546,541,563,
- 547,546,563, 552,547,563, 553,552,563, 556,519,564, 558,553,563,
- 559,557,558, 559,558,562, 560,74,519, 560,519,556, 560,556,557,
- 560,557,559, 560,559,565, 561,514,563, 562,563,513, 562,558,563,
- 562,513,568, 564,543,544, 564,544,549, 564,549,550, 564,550,555,
- 564,555,556, 565,74,560, 565,559,568, 566,84,567, 567,84,569,
- 568,559,562, 568,513,566, 571,85,598, 571,84,85, 572,84,571,
- 573,491,574, 574,489,573, 583,575,582, 585,582,588, 586,583,584,
- 587,583,586, 589,575,590, 598,85,609, 599,598,609, 653,111,654,
- 600,601,502, 600,502,577, 603,602,605, 604,578,593, 604,616,603,
- 604,603,605, 606,594,599, 606,599,609, 607,633,491, 607,616,604,
- 607,491,616, 607,458,633, 608,87,418, 608,617,607, 608,606,609,
- 608,413,617, 609,87,608, 609,86,87, 610,512,611, 611,512,601,
- 611,603,615, 612,508,512, 612,512,610, 615,616,491, 615,491,614,
- 615,603,616, 625,624,630, 627,625,630, 628,627,630, 629,628,630,
- 630,624,626, 630,626,629, 631,488,489, 632,458,631, 632,491,633,
- 633,458,632, 639,651,112, 641,774,640, 32,637,33, 667,640,668,
- 668,640,669, 669,640,774, 67,506,100, 672,669,774, 676,673,820,
- 677,676,823, 680,677,826, 688,685,1131, 712,711,754, 720,719,1172,
- 721,720,1171, 725,1178,726, 729,726,1185, 729,1230,730, 73,512,503,
- 730,1230,1184, 74,512,73, 743,82,83, 745,744,1237, 745,743,744,
- 745,1275,746, 746,85,743, 746,743,745, 746,609,85, 746,1275,86,
- 747,86,1275, 748,747,1086, 748,883,751, 748,1086,878, 751,882,752,
- 752,881,870, 76,564,75, 762,1172,763, 763,1172,719, 769,768,1161,
- 770,769,1161, 771,770,1161, 772,771,1161, 773,772,1161, 774,641,642,
- 775,638,639, 781,647,782, 655,654,111, 800,848,801, 801,847,802,
- 801,848,810, 802,846,803, 802,847,809, 803,846,808, 804,845,800,
- 805,844,804, 805,636,806, 806,844,805, 806,860,844, 807,845,804,
- 807,804,844, 807,862,845, 808,1073,1070, 809,863,846, 809,866,856,
- 810,865,847, 810,868,855, 811,800,845, 811,867,848, 812,644,645,
- 812,645,840, 813,812,842, 814,813,842, 816,815,843, 817,816,839,
- 818,817,839, 819,818,835, 820,813,814, 820,814,815, 820,815,816,
- 820,816,823, 821,672,774, 821,813,820, 822,642,643, 822,643,644,
- 822,644,812, 822,812,813, 822,813,821, 823,676,820, 824,681,825,
- 826,677,823, 83,742,743, 831,646,647, 831,647,781, 834,646,831,
- 844,859,807, 845,861,811, 846,864,808, 846,802,809, 846,863,851,
- 847,866,809, 847,801,810, 847,865,850, 848,868,810, 848,800,811,
- 848,867,849, 849,934,868, 849,932,923, 85,84,743, 850,936,866,
- 850,930,922, 851,938,864, 851,928,921, 852,861,845, 852,926,861,
- 852,845,862, 853,859,844, 853,924,859, 853,844,860, 854,811,861,
- 854,935,867, 855,937,865, 855,933,917, 856,939,863, 856,931,916,
- 857,862,807, 857,807,859, 857,927,862, 858,637,1113, 858,860,806,
- 858,925,860, 859,943,857, 86,609,746, 860,942,853, 861,941,854,
- 862,940,852, 863,928,851, 863,809,856, 863,939,909, 864,846,851,
- 864,938,908, 865,930,850, 865,810,855, 865,937,907, 866,847,850,
- 866,931,856, 866,936,906, 867,932,849, 867,811,854, 867,935,905,
- 868,848,849, 868,933,855, 868,934,904, 870,880,871, 871,879,775,
- 873,879,871, 873,895,879, 873,871,880, 874,880,870, 874,897,880,
- 874,870,881, 875,638,775, 875,775,879, 876,881,752, 876,899,881,
- 876,752,882, 877,882,751, 877,1051,882, 877,751,883, 878,883,748,
- 878,903,883, 879,894,875, 88,218,213, 880,896,873, 881,898,874,
- 882,900,876, 883,902,877, 884,902,883, 884,1005,902, 884,883,903,
- 885,898,881, 885,1001,898, 885,881,899, 886,896,880, 886,999,896,
- 886,880,897, 887,894,879, 887,997,894, 887,879,895, 888,878,1085,
- 888,903,878, 888,1006,903, 889,901,877, 889,1004,901, 889,877,902,
- 89,217,212, 89,218,88, 890,899,876, 890,1002,899, 890,876,900,
- 891,638,875, 891,875,894, 892,897,874, 892,1000,897, 892,874,898,
- 893,895,873, 893,998,895, 893,873,896, 894,1016,891, 895,1015,887,
- 896,1014,893, 897,1013,886, 898,1012,892, 899,1011,885, 656,655,159,
- 90,216,211, 90,217,89, 900,1010,890, 900,882,995, 901,1051,877,
- 902,1008,889, 903,1007,884, 91,57,58, 910,940,862, 910,862,927,
- 911,941,861, 911,861,926, 912,942,860, 912,860,925, 913,943,859,
- 913,859,924, 914,927,857, 914,857,943, 918,854,941, 919,924,853,
- 919,853,942, 920,926,852, 920,852,940, 928,863,909, 929,864,908,
- 93,92,484, 930,865,907, 931,866,906, 932,867,905, 933,868,904,
- 934,849,923, 935,854,918, 936,850,922, 937,855,917, 938,851,921,
- 939,856,916, 94,93,484, 96,95,476, 97,96,476, 976,903,1006,
- 976,1007,903, 977,902,1005, 977,1008,902, 978,901,1004, 978,1048,901,
- 979,900,1003, 979,1010,900, 98,97,476, 980,899,1002, 980,1011,899,
- 981,898,1001, 981,1012,898, 982,897,1000, 982,1013,897, 983,1014,896,
- 983,896,999, 984,1015,895, 984,895,998, 985,1016,894, 985,894,997,
- 986,893,1014, 986,998,893, 987,892,1012, 987,1000,892, 988,891,1016,
- 988,858,1110, 989,890,1010, 989,1002,890, 99,506,499, 990,889,1008,
- 990,1004,889, 991,888,1084, 991,1006,888, 992,887,1015, 992,997,887,
- 993,886,1013, 993,999,886, 994,885,1011, 994,1001,885, 995,882,1045,
- 996,884,1007, 996,1005,884,
-
- QUADS, 648,666,130,131, 648,649,20,19, 657,658,15,14,
- 1000,987,1032,1031, 1001,994,1036,1035, 1002,989,1040,1039,
- 1003,995,1044,1043, 1004,990,1053,1052, 1005,996,1057,1056,
- 1006,991,1061,1060, 1007,976,1059,1058, 1008,977,1055,1054,
- 1009,906,973,1047, 101,64,67,100, 1010,979,1042,1041,
- 1011,980,1038,1037, 1012,981,1034,1033, 1013,982,1030,1029,
- 1014,983,1026,1025, 1015,984,1022,1021, 1016,985,1018,1017,
- 102,63,64,101, 103,60,63,102, 104,59,60,103, 1045,882,1051,1009,
- 1045,1009,1047,1046, 1048,978,1050,1049, 105,104,103,106,
- 106,103,102,107, 1061,991,1071,1075, 1062,939,1004,1052,
- 1062,1052,1053,1063, 1063,909,939,1062, 1064,928,1008,1054,
- 1064,1054,1055,1065, 1065,921,928,1064, 1066,938,1005,1056,
- 1066,1056,1057,1067, 1067,908,938,1066, 1068,929,1007,1058,
- 1068,1058,1059,1069, 1069,915,929,1068, 107,102,101,108,
- 1071,991,1084,1076, 1072,915,976,1006, 1073,1006,1060,1074,
- 1074,1060,1061,1075, 1075,1071,1073,1074, 1078,1077,1076,1079,
- 108,101,100,109, 1080,1079,1085,1095, 1081,1080,1082,1083,
- 1082,1080,1092,1091, 1084,1085,1087,1088, 1085,1079,1089,1087,
- 1086,1082,1091,1093, 1088,1087,1089,1090, 1089,1079,1076,1090,
- 109,100,99,110, 1090,1076,1084,1088, 1092,1080,1095,1094,
- 1093,1091,1092,1094, 1096,27,26,431, 1097,638,1103,1098,
- 658,659,16,15, 110,99,499,496, 1100,1099,1102,1104,
- 1101,1100,1104,1105, 1102,1099,1098,1103, 1106,1105,1104,1107,
- 1107,1104,1102,1109, 1109,1102,1103,1108, 1110,1109,1108,1111,
- 1112,1107,1109,1110, 1113,1106,1107,1112, 1115,819,828,1116,
- 1117,784,791,1120, 1118,1116,1117,1119, 1119,1117,1120,1121,
- 1120,791,1129,1122, 1121,1120,1122,1126, 1122,1123,1125,1126,
- 1126,1125,1154,1137, 1127,1124,1302,1303, 1128,1123,1122,1129,
- 1128,803,1070,1303, 1129,796,803,1128, 113,114,123,124,
- 1130,1115,1116,1118, 1131,1114,1115,1130, 1132,1133,1140,1141,
- 1133,1134,1139,1140, 1134,1135,1138,1139, 1136,688,1131,1130,
- 1138,1135,1136,1137, 1138,1137,1154,1146, 1139,1138,1146,1145,
- 114,115,122,123, 1140,1139,1145,1144, 1141,1140,1144,1143,
- 1142,761,1132,1141, 1143,758,1142,1141, 1143,1144,1149,1150,
- 1144,1145,1148,1149, 1145,1146,1147,1148, 1148,1147,1155,1153,
- 1149,1148,1153,1152, 115,116,121,122, 115,114,166,167,
- 1150,757,758,1143, 1150,1149,1152,1151, 1151,754,755,1150,
- 1158,712,754,1151, 1158,1152,1160,1159, 1160,1152,1153,1155,
- 1160,1155,1239,1177, 1165,762,773,1162, 1165,1162,1163,1166,
- 1166,1163,1164,1167, 1167,1159,1176,1166, 1169,1170,1173,1174,
- 1173,1170,1171,1175, 1174,1173,1177,1239, 1175,1165,1166,1176,
- 1176,1159,1160,1177, 1177,1173,1175,1176, 1182,1183,1186,1187,
- 1187,1186,1191,1190, 1188,1181,1182,1187, 1189,1188,1187,1190,
- 119,118,117,120, 1190,1191,1192,1193, 1193,1192,1197,1196,
- 1194,1189,1190,1193, 1195,1194,1193,1196, 1196,1197,1198,1199,
- 1199,1198,1203,1202, 659,660,17,16, 659,658,177,171, 120,117,113,124,
- 1200,1195,1196,1199, 1201,1200,1199,1202, 1202,1203,1204,1205,
- 1204,1184,1230,1209, 1205,1204,1209,1208, 1206,1201,1202,1205,
- 1207,1206,1205,1208, 1208,1209,1210,1211, 1211,1210,1215,1214,
- 1212,1207,1208,1211, 1213,1212,1211,1214, 1214,1215,1216,1217,
- 1217,1216,1221,1220, 1218,1213,1214,1217, 1219,1218,1217,1220,
- 122,121,128,127, 1220,1221,1222,1223, 1224,1219,1220,1223,
- 1227,1180,1181,1188, 1227,1206,1207,1229, 123,122,127,126,
- 1231,726,1168,1233, 1233,1168,1243,1235, 1234,1231,1233,1232,
- 1236,1235,1243,1242, 1236,1242,1244,1247, 1237,1238,1245,1246,
- 1238,744,1235,1236, 1239,1157,1280,1279, 124,123,126,125,
- 1244,1242,1271,1270, 1245,1238,1236,1247, 1246,1245,1262,1261,
- 1247,1244,1259,1263, 1249,1241,1256,1253, 125,126,135,136,
- 1251,1248,1249,1250, 1251,1250,1262,1263, 1254,1251,1263,1259,
- 1255,1241,1248,1254, 1257,1256,1255,1258, 1258,1255,1254,1259,
- 126,127,134,135, 1260,1253,1256,1257, 1261,1252,1253,1260,
- 1262,1250,1252,1261, 1262,1245,1247,1263, 1264,1237,1246,1265,
- 1265,1246,1261,1260, 1268,1243,1266,1269, 1269,1266,1267,1277,
- 127,128,133,134, 1271,1242,1243,1268, 1272,1260,1257,1274,
- 1273,1258,1259,1270, 1273,1124,1127,1283, 1274,1257,1258,1273,
- 1278,1174,1239,1279, 128,121,451,454, 1284,1276,1278,1285,
- 1285,1278,1279,1287, 1286,1277,1276,1284, 1287,1279,1280,1288,
- 1288,1280,1281,1289, 1289,1281,1277,1286, 129,120,124,125,
- 1290,1284,1285,1291, 1291,1285,1287,1293, 1292,1286,1284,1290,
- 1293,1287,1288,1294, 1294,1288,1289,1295, 1295,1289,1286,1292,
- 660,666,18,17, 130,666,660,119, 130,119,120,129, 1301,458,461,1300,
- 1301,1300,462,459, 1303,1070,1077,1127, 1303,1302,1125,1128,
- 131,130,129,132, 132,129,125,136, 134,133,140,139, 135,134,139,138,
- 136,135,138,137, 140,133,463,462, 141,132,136,137, 142,131,132,141,
- 154,153,160,163, 158,36,37,157, 159,655,111,158, 161,156,155,162,
- 161,41,42,448, 162,155,154,163, 163,40,41,162, 164,113,117,169,
- 164,169,170,174, 165,116,115,167, 165,156,449,450, 166,114,113,164,
- 167,166,173,172, 169,117,118,168, 170,169,168,171, 172,156,165,167,
- 173,166,164,174, 174,170,178,175, 175,178,179,180, 176,155,172,173,
- 176,173,174,175, 177,149,179,178, 178,170,171,177, 179,151,152,180,
- 180,153,176,175, 649,648,131,142, 649,650,21,20, 201,145,250,264,
- 206,90,753,869, 207,206,869,872, 263,256,400,399, 264,250,404,403,
- 265,257,306,305, 266,251,310,309, 267,258,298,297, 268,252,302,301,
- 269,239,300,299, 270,240,296,295, 271,241,308,307, 272,242,304,303,
- 273,243,402,401, 274,244,398,397, 279,260,247,280, 280,247,320,353,
- 281,277,254,282, 282,254,327,355, 283,259,248,284, 284,248,319,357,
- 285,278,249,286, 286,249,321,359, 287,262,245,288, 288,245,318,361,
- 289,275,255,290, 19,18,666,648, 290,255,328,363, 291,261,246,292,
- 292,246,317,365, 293,276,253,294, 294,253,322,367, 296,240,316,369,
- 298,258,329,371, 650,649,143,195, 300,239,315,373, 302,252,324,375,
- 304,242,314,377, 306,257,330,379, 308,241,344,382, 661,653,652,662,
- 310,251,313,385, 311,250,407,341, 312,256,273,340, 313,251,274,339,
- 314,242,265,338, 315,239,268,337, 316,240,267,336, 317,246,276,335,
- 318,245,275,334, 319,248,278,333, 662,667,668,663, 320,247,277,332,
- 321,249,262,349, 322,253,270,347, 323,195,260,351, 324,252,272,345,
- 325,244,263,343, 327,254,259,350, 328,255,261,348, 329,258,269,346,
- 663,668,669,670, 330,257,271,380, 331,243,264,342, 332,277,281,354,
- 333,278,285,358, 334,275,289,362, 335,276,293,366, 336,267,297,370,
- 337,268,301,374, 338,265,305,378, 339,274,397,387, 664,661,662,663,
- 340,273,401,391, 342,264,403,393, 343,263,399,389, 344,241,266,383,
- 345,272,303,376, 346,269,299,372, 347,270,295,368, 348,261,291,364,
- 349,262,287,360, 665,664,663,670, 350,259,283,356, 351,260,279,352,
- 352,279,280,353, 353,320,351,352, 354,281,282,355, 355,327,332,354,
- 356,283,284,357, 357,319,350,356, 358,285,286,359, 359,321,333,358,
- 36,665,670,671, 360,287,288,361, 361,318,349,360, 362,289,290,363,
- 363,328,334,362, 364,291,292,365, 365,317,348,364, 366,293,294,367,
- 367,322,335,366, 368,295,296,369, 369,316,347,368, 37,36,671,674,
- 370,297,298,371, 371,329,336,370, 372,299,300,373, 373,315,346,372,
- 374,301,302,375, 375,324,337,374, 376,303,304,377, 377,314,345,376,
- 378,305,306,379, 379,330,338,378, 38,37,674,675, 380,271,307,381,
- 381,307,308,382, 382,344,380,381, 383,266,309,384, 384,309,310,385,
- 385,313,383,384, 386,217,380,344, 388,325,339,387, 388,387,397,398,
- 39,38,675,678, 390,312,343,389, 390,389,399,400, 392,331,340,391,
- 392,391,401,402, 394,311,342,393, 394,393,403,404, 395,341,408,409,
- 396,326,341,395, 396,395,409,410, 398,244,325,388, 40,39,678,679,
- 400,256,312,390, 402,243,331,392, 404,250,311,394, 405,140,462,1300,
- 406,326,396,410, 408,406,410,409, 41,40,679,682, 411,412,413,414,
- 411,414,424,425, 412,405,1300,461, 417,415,416,418, 419,326,406,411,
- 419,411,425,423, 42,41,682,683, 420,414,415,430, 422,420,419,423,
- 424,414,420,422, 424,422,423,425, 426,417,421,428, 427,415,417,426,
- 427,426,428,429, 43,42,683,686, 430,415,427,429, 431,651,639,1096,
- 431,26,25,432, 432,25,24,433, 432,433,436,437, 433,24,23,434,
- 434,23,22,435, 436,433,434,438, 436,438,441,443, 437,651,431,432,
- 437,436,443,442, 438,434,435,439, 438,439,440,441, 44,43,686,687,
- 441,440,447,446, 442,443,444,445, 443,441,446,444, 448,42,43,465,
- 449,156,161,448, 449,448,465,464, 45,44,687,690, 450,449,464,452,
- 451,116,165,450, 451,450,452,453, 454,451,453,455, 456,454,455,460,
- 456,457,462,463, 459,457,456,460, 46,45,690,691, 461,458,607,617,
- 463,128,454,456, 465,44,470,464, 466,98,476,475, 466,49,50,98,
- 467,47,49,466, 468,46,47,467, 469,45,46,468, 47,46,691,694,
- 470,44,45,469, 470,469,472,471, 472,469,468,473, 473,468,467,474,
- 474,467,466,475, 476,95,477,475, 478,474,475,477, 479,473,474,478,
- 48,695,696,697, 480,472,473,479, 481,480,479,482, 482,479,478,483,
- 483,478,477,484, 486,483,484,485, 487,482,483,486, 487,486,494,489,
- 488,459,460,471, 488,471,472,480, 489,481,482,487, 49,47,694,48,
- 492,58,59,493, 493,59,104,501, 494,486,492,493, 494,493,510,511,
- 497,496,499,500, 498,497,500,501, 652,640,667,662, 652,653,10,9,
- 50,49,48,697, 500,499,509,510, 501,104,105,498, 502,74,565,567,
- 504,72,73,503, 505,71,72,504, 505,504,507,509, 507,504,503,508,
- 509,507,511,510, 51,50,697,698, 510,493,501,500, 511,507,508,573,
- 513,81,82,566, 514,80,81,513, 515,79,80,514, 515,514,561,522,
- 516,78,79,515, 516,515,522,521, 517,77,78,516, 518,76,77,517,
- 52,51,698,701, 520,517,516,521, 521,522,523,524, 524,523,528,527,
- 525,520,521,524, 526,525,524,527, 527,528,529,530, 53,52,701,702,
- 530,529,534,533, 531,526,527,530, 532,531,530,533, 533,534,535,536,
- 536,535,540,539, 537,532,533,536, 538,537,536,539, 539,540,541,542,
- 54,53,702,705, 541,540,561,563, 542,541,546,545, 543,538,539,542,
- 544,543,542,545, 545,546,547,548, 548,547,552,551, 549,544,545,548,
- 55,54,705,706, 550,549,548,551, 551,552,553,554, 554,553,558,557,
- 555,550,551,554, 556,555,554,557, 56,55,706,709, 564,518,538,543,
- 566,82,743,84, 567,565,568,566, 569,84,572,570, 57,56,709,710,
- 570,572,579,581, 573,489,494,511, 573,508,612,613, 577,502,567,569,
- 577,569,570,576, 577,576,605,602, 578,576,570,581, 579,572,571,580,
- 58,57,710,713, 580,571,598,599, 581,579,596,597, 582,575,589,588,
- 583,582,585,584, 586,584,596,595, 587,586,595,594, 588,589,592,593,
- 589,590,591,592, 59,58,713,714, 590,575,583,587, 590,587,594,591,
- 591,594,606,608, 592,591,608,607, 593,578,581,597, 593,592,607,604,
- 595,580,599,594, 596,579,580,595, 596,584,585,597, 597,585,588,593,
- 653,654,11,10, 60,59,714,61, 600,577,602,603, 601,600,603,611,
- 605,576,578,604, 61,716,717,62, 610,611,620,618, 611,615,623,620,
- 612,610,618,619, 613,612,619,621, 614,491,573,613, 614,613,621,622,
- 615,614,622,623, 618,620,626,624, 619,618,624,625, 62,717,718,65,
- 620,623,629,626, 621,619,625,627, 622,621,627,628, 623,622,628,629,
- 63,60,61,62, 639,638,1097,1096, 64,63,62,65, 647,634,793,782,
- 1,647,646,2, 2,646,645,3, 65,718,719,66, 3,645,644,4, 4,644,643,5,
- 5,643,642,6, 6,642,641,7, 7,641,640,8, 8,640,652,9, 28,27,1096,1097,
- 29,28,1097,1098, 66,719,720,69, 30,29,1098,1099, 31,30,1099,1100,
- 32,31,1100,1101, 33,637,636,34, 34,636,635,35, 35,635,634,0,
- 0,634,647,1, 67,64,65,66, 670,669,672,671, 671,672,673,674,
- 673,672,821,820, 674,673,676,675, 675,676,677,678, 678,677,680,679,
- 679,680,681,682, 68,67,66,69, 681,680,826,825, 682,681,684,683,
- 683,684,685,686, 684,681,824,1114, 685,684,1114,1131,
- 686,685,688,687, 687,688,689,690, 689,688,1136,1135, 69,720,721,70,
- 690,689,692,691, 691,692,693,694, 692,689,1135,1134,
- 693,692,1134,1133, 694,693,695,48, 695,693,1133,1132,
- 696,695,1132,761, 697,696,699,698, 698,699,700,701, 699,696,761,760,
- 654,655,12,11, 70,721,722,723, 700,699,760,759, 701,700,703,702,
- 702,703,704,705, 703,700,759,758, 704,703,758,757, 705,704,707,706,
- 706,707,708,709, 707,704,757,756, 708,707,756,755, 709,708,711,710,
- 71,68,69,70, 710,711,712,713, 711,708,755,754, 713,712,715,714,
- 714,715,716,61, 715,712,1158,1159, 716,715,767,766, 717,716,766,765,
- 718,717,765,764, 719,718,764,763, 72,71,70,723, 722,721,1171,1170,
- 723,722,725,724, 724,725,726,727, 725,722,1170,1169, 727,726,729,728,
- 728,729,730,731, 73,72,723,724, 731,730,733,732, 732,733,734,735,
- 733,730,1184,1183, 734,733,1183,1182, 735,734,737,736,
- 736,737,738,739, 737,734,1182,1181, 738,737,1181,1180,
- 739,738,741,740, 74,73,724,727, 740,741,742,83, 741,738,1180,1179,
- 742,741,1179,1232, 743,742,1232,744, 749,748,751,750, 75,74,727,728,
- 750,751,752,753, 753,752,870,869, 76,75,728,731, 762,763,772,773,
- 763,764,771,772, 764,765,770,771, 765,766,769,770, 766,767,768,769,
- 767,715,1159,1167, 768,767,1167,1164, 77,76,731,732, 774,642,822,821,
- 775,639,872,871, 776,780,783,787, 776,777,829,827, 778,779,828,830,
- 78,77,732,735, 780,781,782,783, 780,776,827,832, 781,780,832,831,
- 783,782,793,792, 784,779,778,785, 785,778,777,786, 786,777,776,787,
- 787,783,792,788, 788,792,795,799, 789,786,787,788, 79,78,735,736,
- 790,785,786,789, 791,784,785,790, 792,793,794,795, 793,634,635,794,
- 794,635,636,805, 795,794,805,804, 796,791,790,797, 797,790,789,798,
- 798,789,788,799, 799,795,804,800, 655,656,13,12, 80,79,736,739,
- 801,798,799,800, 802,797,798,801, 803,796,797,802, 806,636,637,858,
- 81,80,739,740, 815,814,842,843, 817,818,825,826, 818,819,824,825,
- 82,81,740,83, 823,816,817,826, 824,819,1115,1114, 827,829,836,837,
- 828,779,1117,1116, 828,819,835,830, 829,777,778,830, 831,832,833,834,
- 833,832,827,837, 834,833,841,840, 835,818,839,836, 836,829,830,835,
- 837,836,839,838, 839,816,843,838, 840,645,646,834, 841,833,837,838,
- 842,812,840,841, 842,841,838,843, 86,747,748,749, 869,870,871,872,
- 872,639,112,207, 88,87,86,749, 89,88,749,750, 656,657,14,13,
- 90,89,750,753, 91,58,492,485, 910,927,952,953, 911,926,956,957,
- 912,925,944,945, 913,924,948,949, 914,943,950,951, 915,808,864,929,
- 918,941,958,959, 919,942,946,947, 92,91,485,484, 92,56,57,91,
- 920,940,954,955, 924,919,992,1015, 925,858,988,1016, 926,920,993,1013,
- 927,914,986,1014, 928,909,990,1008, 929,908,996,1007, 93,55,56,92,
- 930,907,979,1003, 931,906,1009,1048, 932,905,981,1001,
- 933,904,980,1002, 934,923,994,1011, 935,918,987,1012,
- 936,922,995,1045, 937,917,989,1010, 938,921,977,1005,
- 939,916,978,1004, 94,54,55,93, 940,910,983,999, 941,911,982,1000,
- 942,912,985,997, 943,913,984,998, 944,925,1016,1017,
- 945,944,1017,1018, 946,942,997,1019, 947,946,1019,1020,
- 948,924,1015,1021, 949,948,1021,1022, 95,94,484,477, 95,53,54,94,
- 950,943,998,1023, 951,950,1023,1024, 952,927,1014,1025,
- 953,952,1025,1026, 954,940,999,1027, 955,954,1027,1028,
- 956,926,1013,1029, 957,956,1029,1030, 958,941,1000,1031,
- 959,958,1031,1032, 96,52,53,95, 960,935,1012,1033, 961,960,1033,1034,
- 961,905,935,960, 962,932,1001,1035, 963,962,1035,1036,
- 963,923,932,962, 964,934,1011,1037, 965,964,1037,1038,
- 965,904,934,964, 966,933,1002,1039, 967,966,1039,1040,
- 967,917,933,966, 968,937,1010,1041, 969,968,1041,1042,
- 969,907,937,968, 97,51,52,96, 970,930,1003,1043, 971,970,1043,1044,
- 971,922,930,970, 972,936,1045,1046, 973,972,1046,1047,
- 973,906,936,972, 974,931,1048,1049, 975,974,1049,1050,
- 975,916,931,974, 976,915,1069,1059, 977,921,1065,1055,
- 978,916,975,1050, 979,907,969,1042, 98,50,51,97, 980,904,965,1038,
- 981,905,961,1034, 982,911,957,1030, 983,910,953,1026,
- 984,913,949,1022, 985,912,945,1018, 986,914,951,1024,
- 987,918,959,1032, 989,917,967,1040, 990,909,1063,1053,
- 992,919,947,1020, 993,920,955,1028, 994,923,963,1036,
- 995,922,971,1044, 996,908,1067,1057, 997,992,1020,1019,
- 998,986,1024,1023, 999,993,1028,1027,
-
- /* The base of the knight */
- SPIN,18,
- 9510,0, 9510,756, SEAM, 9134,1129, 9447,1487,
- 9447,1951, 9103,2371, STEPDOWN, 8211,3083,
- 7167,4242, 6662,5664, 7040,7142, STEPUP, SEAM, 7935,8560,
- STEPUP, BACKREF,0,
-
- ENDOFDATA
-};
-
-static unsigned short bishop_data[] = {
- VERTICES, SETBACKREF,0, 5233,26960,0, 5154,26960,909, 4918,26960,1790,
- 4532,26960,2617, 4009,26960,3364, 3364,26960,4009, 2617,26960,4532,
- 1790,26960,4918, 909,26960,5154, 0,26833,5233, -909,26960,5154,
- -1790,26960,4918, -2617,26960,4532, -3364,26960,4009,
- -4009,26960,3364, -4532,26960,2617, -4918,26960,1790,
- -5154,26960,909, -5233,26960,0, -5154,26960,-909, -4918,26960,-1790,
- -4532,26960,-2617, -4009,26960,-3364, -3364,26960,-4009,
- -2617,26960,-4532, -1790,26960,-4918, -909,26960,-5154, 0,26833,-5233,
- 909,26960,-5154, 1790,26960,-4918, 2617,26960,-4532, 3364,26960,-4009,
- 4009,26960,-3364, 4532,26960,-2617, 4918,26960,-1790, 5154,26960,-909,
- SETBACKREF,1, 3812,31178,0, 3765,31144,729, 3624,31040,1435,
- 3395,30872,2153, 3084,30642,2820, 2701,30360,3389, 2076,29899,4102,
- 1492,30015,4340, 845,30033,4442, 0,30044,4511, -657,30063,4443,
- -1481,30081,4214, -2190,30081,3884, -2830,30081,3435,
- -3383,30081,2883, -3831,30081,2242, -4162,30081,1534,
- -4364,30081,779, -4432,30081,0, -4364,30081,-779, -4162,30081,-1534,
- -3831,30081,-2242, -3383,30081,-2883, -2830,30081,-3435,
- -2190,30081,-3884, -1481,30081,-4214, -657,30063,-4443, 0,30044,-4511,
- 845,30033,-4442, 1492,30015,-4340, 2076,29899,-4102, 2701,30360,-3388,
- 3084,30642,-2820, 3395,30872,-2153, 3624,31040,-1435, 3765,31144,-729,
- 240,28546,-4957, 884,29021,-4784, 1490,29467,-4537, 2076,29899,-4102,
- 2701,30360,-3388, 3084,30642,-2820, 3395,30872,-2153,
- 3624,31040,-1435, 3765,31144,-729, 2177,28477,4637, 1021,27605,5037,
- 1021,27605,-5042, 2170,28478,-4644, 0,26833,-5233, 0,26833,5233,
- -3153,28619,-3758, 240,28546,4957, 884,29021,4784, 2076,29899,4102,
- 2701,30360,3389, 3084,30642,2820, 3395,30872,2153, 3624,31040,1435,
- 3765,31144,729, -719,28582,4883, 4863,28569,977, 4560,28569,1925,
- 4064,28569,2815, 3465,28569,3723, 2622,28569,4448, 2621,28583,-4401,
- 3473,28588,-3691, 4064,28569,-2815, 4560,28569,-1925, 4863,28569,-977,
- 4965,28569,0, -1678,28619,4610, -3153,28619,3758, -2453,28619,4248,
- -4248,28619,2453, -3758,28619,3153, -4831,28619,852, -4906,28619,0,
- -4831,28619,-852, -4610,28619,-1678, -4248,28619,-2453,
- -3758,28619,-3153, -1678,28619,-4610, -2453,28619,-4248,
- -644,27895,5037, -644,27895,-5037, -4610,28619,1678, -719,28582,-4883,
- 2170,28478,-4644, 1021,27605,-5042, 1021,27605,5037, 2177,28477,4637,
- 0,26833,-5233, 0,26833,5233, -644,27895,-5037, -644,27895,5037,
- -644,27895,5037, -644,27895,-5037, 1490,29467,-4537, 884,29021,-4784,
- 240,28546,-4957, 240,28546,4957, 884,29021,4784, 3812,31178,0,
- 4349,30116,-867, 4197,30001,-1705, 3948,29813,-2492, 3610,29558,-3203,
- 3193,29244,-3817, 2711,28880,-4315, 4349,30116,-867, 4197,30001,-1705,
- 3948,29813,-2492, 3610,29558,-3203, 3193,29244,-3817,
- 2711,28880,-4315, 1608,28047,-4906, 1608,28047,4901, 2711,28880,4310,
- 3193,29244,3812, 3610,29558,3198, 3948,29813,2487, 4197,30001,1701,
- 4349,30116,862, 4401,30155,-176, 1490,29467,4537, 1490,29467,4537,
- 4401,30155,-176, 4349,30116,862, 4197,30001,1701, 3948,29813,2487,
- 3610,29558,3198, 3193,29244,3812, 2711,28880,4310, 1608,28047,4901,
- 1608,28047,-4906,
-
- TRIANGLES, 8,127,9, 7,128,154, 2,98,3, 121,96,10, 121,10,9, 121,138,96,
- 122,27,26, 27,126,28, 66,135,65, 162,42,43, 165,164,141, 80,140,95,
- 103,151,150, 102,125,152, 101,155,128, 100,157,156, 124,137,122,
- 33,105,34, 29,153,125, 26,124,122,
-
- QUADS, 22,118,87,23, 21,117,118,22, 20,116,117,21, 19,115,116,20,
- 18,114,115,19, 17,113,114,18, 16,123,113,17, 15,111,123,16, 14,112,111,15,
- 13,109,112,14, 12,110,109,13, 11,108,110,12, 7,154,127,8, 110,108,47,48,
- 135,136,64,65, 136,137,63,64, 138,139,44,45, 139,162,43,44, 109,110,48,49,
- 147,161,107,106, 166,165,141,142, 167,166,142,143, 168,167,143,144,
- 169,168,144,145, 112,109,49,50, 170,169,145,146, 171,81,84,172,
- 111,112,50,51, 72,88,133,134, 73,89,88,72, 74,163,89,73, 75,90,163,74,
- 76,91,90,75, 77,92,91,76, 78,93,92,77, 79,94,93,78, 80,95,94,79,
- 81,170,146,84, 82,171,172,83, 86,82,83,85, 130,129,131,132, 123,111,51,52,
- 113,123,52,53, 114,113,53,54, 115,114,54,55, 116,115,55,56, 117,116,56,57,
- 118,117,57,58, 87,118,58,59, 120,87,59,60, 119,120,60,61, 107,161,160,97,
- 106,107,0,35, 105,148,147,106, 105,106,35,34, 104,149,148,105,
- 104,105,33,32, 103,150,149,104, 103,104,32,31, 102,152,151,103,
- 102,103,31,30, 101,128,7,6, 100,101,6,5, 100,156,155,101, 99,100,5,4,
- 99,158,157,100, 98,99,4,3, 98,159,158,99, 97,98,2,1, 97,160,159,98,
- 96,108,11,10, 96,138,45,46, 124,119,61,62, 47,108,96,46, 63,137,124,62,
- 0,107,97,1, 29,125,102,30, 28,126,153,29, 25,119,124,26, 24,120,119,25,
- 23,87,120,24,
-
- /* Everything above the slit */
- SPIN,18,
- 8870,0,8870,731,SEAM,8519,1091,8811,1438,8811,1886,8626,2292,
- STEPDOWN,6989,2980,5927,4133,5548,5735,
- STEPUP,5388,7642,5228,7807,STEPDOWN,4427,8149,4057,8434,
- 3493,9185,2816,13524,SEAM,2690,18532,5301,18690,
- STEPUP,6810,19005,6861,19277,6804,19625,STEPDOWN,6502,19845,
- SEAM,4305,20394,STEPUP,4796,20522,4924,20759,4778,20979,
- STEPDOWN,SEAM,3727,21207,SEAM,3726,22181,STEPUP,SEAM,4546,22705,
- SEAM,3846,23385,4718,24227,5226,25516,STEPUP,BACKREF,0,
-
- /* Everything below the slit */
- SPIN,36,
- BACKREF,1,STEPDOWN,3548,31590,STEPDOWN,2724,32633,SEAM,1581,33500,
- 2013,33901,STEPUP,2281,34500,2281,34936,STEPDOWN,1947,35372,
- STEPDOWN,1233,35734,STEPDOWN,0,35891,
-
- ENDOFDATA
-};
-
-static unsigned short king_data[] = {
- SPIN,20,
- 11378,0,11378,856,SEAM,10928,1152,
- 11302,1684,11302,2209,11065,2684,
- STEPDOWN,8964,3490,7603,4841,7116,6717,
- STEPUP,6911,8950,6705,9144,STEPDOWN,5678,9545,5204,9878,
- 4481,10758,3696,14808,SEAM,3065,26979,
- 5813,27155,STEPUP,7145,27507,7424,27812,7352,28288,7131,28533,
- 5477,28882,5397,29010,5406,29363,4903,29934,
- STEPDOWN,SEAM,3944,30227,
- SEAM,3974,31478,4703,31849,STEPUP,4832,32092,4756,32370,
- SEAM,3975,32620,6899,39055,6877,39351,2833,39514,
- 2786,39612,2786,39807,2734,39856,STEPDOWN,STEPDOWN,2590,39905,0,39969,
- /* The cross */
- SETBACKREF,0,
- QUADSTRIP,-1613,39866,0,-1543,39866,702,-1651,40481,0,-1580,40590,702,
- -1531,40917,0,-1465,41008,702,
- QUADSTRIP,-1531,40917,0,-1465,41008,702,-2956,41104,0,-2829,41187,702,
- -3075,41520,0,-2943,41585,702,-3075,43849,0,-2943,43805,702,
- -2862,44347,0,-2739,44282,702,-1116,44636,0,-1068,44554,702,
- QUADSTRIP,-1116,44636,0,-1068,44554,702,-1102,45692,0,-1054,45576,702,
- -973,45829,0,-973,45747,702,973,45829,0,973,45747,702,1102,45692,0,
- 1054,45576,702,1116,44636,0,1068,44554,702,
- QUADSTRIP,1116,44636,0,1068,44554,702,2862,44347,0,2739,44282,702,
- 3075,43849,0,2943,43805,702,3075,41520,0,2943,41585,702,2956,41104,0,
- 2829,41187,702,1531,40917,0,1465,41008,702,
- QUADSTRIP,1531,40917,0,1465,41008,702,1651,40481,0,1580,40590,702,
- 1613,39866,0,1543,39866,702,
- QUADSTRIP,-1543,39866,702,1543,39866,702,-1580,40590,702,
- 1580,40590,702,-1465,41008,702,1465,41008,702,-2829,41187,702,
- 2829,41187,702,-2943,41585,702,2943,41585,702,-2943,43805,702,
- 2943,43805,702,-2739,44282,702,2739,44282,702,-1068,44554,702,
- 1068,44554,702,-1054,45576,702,1054,45576,702,-973,45747,702,
- 973,45747,702,
- QUADSTRIP,-1543,39866,-702,BACKREF,0,0,-1580,40590,-702,BACKREF,0,2,
- -1465,41008,-702,BACKREF,0,4,
- QUADSTRIP,-1465,41008,-702,BACKREF,0,6,-2829,41187,-702,BACKREF,0,8,
- -2943,41585,-702,BACKREF,0,10,-2943,43805,-702,BACKREF,0,12,
- -2739,44282,-702,BACKREF,0,14,-1068,44554,-702,BACKREF,0,16,
- QUADSTRIP,-1068,44554,-702,BACKREF,0,18,-1054,45576,-702,
- BACKREF,0,20,-973,45747,-702,BACKREF,0,22,973,45747,-702,BACKREF,0,24,
- 1054,45576,-702,BACKREF,0,26,1068,44554,-702,BACKREF,0,28,
- QUADSTRIP,1068,44554,-702,BACKREF,0,30,2739,44282,-702,
- BACKREF,0,32,2943,43805,-702,BACKREF,0,34,2943,41585,-702,BACKREF,0,36,
- 2829,41187,-702,BACKREF,0,38,1465,41008,-702,BACKREF,0,40,
- QUADSTRIP,1465,41008,-702,BACKREF,0,42,1580,40590,-702,
- BACKREF,0,44,1543,39866,-702,BACKREF,0,46,
- QUADSTRIP,1543,39866,-702,-1543,39866,-702,1580,40590,-702,
- -1580,40590,-702,1465,41008,-702,-1465,41008,-702,2829,41187,-702,
- -2829,41187,-702,2943,41585,-702,-2943,41585,-702,2943,43805,-702,
- -2943,43805,-702,2739,44282,-702,-2739,44282,-702,1068,44554,-702,
- -1068,44554,-702,1054,45576,-702,-1054,45576,-702,973,45747,-702,
- -973,45747,-702,
- ENDOFDATA
-};
-
-static unsigned short queen_data[] = {
- SPIN,24,
- 11092,0,11092,914,SEAM,10653,1284,
- 11018,1798,11018,2358,10787,2866,
- STEPDOWN,8739,3726,7412,5168,6937,7171,
- STEPUP,6737,9556,6537,9762,STEPDOWN,5536,10191,5073,10546,
- 4368,11485,3678,15137,SEAM,3259,26879,
- 5966,27091,STEPUP,7332,27515,7619,27882,7545,28455,7317,28751,
- 5654,29177,5538,29326,5542,29982,5377,30278,
- STEPDOWN,SEAM,4194,30585,
- SEAM,4226,31822,5002,32218,STEPUP,5139,32477,5058,32774,
- SEAM,4227,33040,STEPDOWN,4421,34778,5042,36612,5874,38429,
- STEPUP,SEAM,PATTERN,3,6018,39660,6018,39660,6804,39977,
- SEAM,PATTERN,3,5015,41139,5015,41139,5673,41460,
- SEAM,4349,40044,
- STEPDOWN,SEAM,1381,41188,
- 1396,42332,STEPDOWN,1082,43072,481,43476,0,43543,
- ENDOFDATA
-};
-
-static unsigned short pawn_data[] = {
- SPIN,16,
- 7395,0,7395,609,
- SEAM,7102,910,7345,1199,7345,1572,7191,1910,
- STEPDOWN,5826,2484,4941,3446,4625,4781,
- STEPUP,4492,6371,4358,6508,
- STEPDOWN,3691,6794,2912,7657,2473,10091,
- SEAM,2100,15344,
- STEPUP,4518,15697,4695,15900,4649,16218,4509,16382,
- STEPDOWN,SEAM,3150,16755,STEPUP,3858,17678,4303,18752,4455,19905,
- 4303,21058,3858,22132,
- STEPDOWN,3150,23055,2227,23763,STEPDOWN,1153,24208,0,24360,
- ENDOFDATA
-};
-
-static unsigned short rook_data[] = {
- SPIN,20,
- 9374,0,9374,756,SEAM,9003,1062,9311,1487,
- 9311,1951,9116,2371,8521,3083,6701,5807,SEAM,6009,7595,
- 6167,7812,6138,8066,5926,8460,5216,12608,
- SEAM,4883,21434,
- SEAM,5140,21608,
- SEAM,5176,22792,
- SEAM,5953,23030,
-/* SEAM,PATTERN,5,6103,26819,6143,27971,6143,27971,6143,27971,6103,26819, */
-/* SEAM,PATTERN,5, 5020,26819,5053,27971,5053,27971,5053,27971, 5020,26819, */
- SETBACKREF,0,
- 6103,26819,
-
- SETBACKREF,1,
- SPIN,20,
- 5020,26819,5020,26114,4906,25858,0,25666,
-
- POLARQUADSTRIP,20,BACKREF,0,1,1,6143,27971,BACKREF,0,2,2,6143,27971,
- BACKREF,0,3,3,6143,27971,BACKREF,0,4,4,6143,27971,
- POLARQUADSTRIP,20,BACKREF,0,6,6,6143,27971,BACKREF,0,7,7,6143,27971,
- BACKREF,0,8,8,6143,27971,BACKREF,0,9,9,6143,27971,
- POLARQUADSTRIP,20,BACKREF,0,11,11,6143,27971,BACKREF,0,12,12,6143,27971,
- BACKREF,0,13,13,6143,27971,BACKREF,0,14,14,6143,27971,
- POLARQUADSTRIP,20,BACKREF,0,16,16,6143,27971,BACKREF,0,17,17,6143,27971,
- BACKREF,0,18,18,6143,27971,BACKREF,0,19,19,6143,27971,
-
- POLARQUADSTRIP,20,1,5053,27971,BACKREF,1,1,2,5053,27971,BACKREF,1,2,
- 3,5053,27971,BACKREF,1,3,4,5053,27971,BACKREF,1,4,
- POLARQUADSTRIP,20,6,5053,27971,BACKREF,1,6,7,5053,27971,BACKREF,1,7,
- 8,5053,27971,BACKREF,1,8,9,5053,27971,BACKREF,1,9,
- POLARQUADSTRIP,20,11,5053,27971,BACKREF,1,11,12,5053,27971,BACKREF,1,12,
- 13,5053,27971,BACKREF,1,13,14,5053,27971,BACKREF,1,14,
- POLARQUADSTRIP,20,16,5053,27971,BACKREF,1,16,17,5053,27971,BACKREF,1,17,
- 18,5053,27971,BACKREF,1,18,19,5053,27971,BACKREF,1,19,
-
- POLARQUADSTRIP,20,1,5020,26819,1,6103,26819,
- 0,5020,26819,0,6103,26819,19,5020,26819,19,6103,26819,
- POLARQUADSTRIP,20,6,5020,26819,6,6103,26819,
- 5,5020,26819,5,6103,26819,4,5020,26819,4,6103,26819,
- POLARQUADSTRIP,20,11,5020,26819,11,6103,26819,
- 10,5020,26819,10,6103,26819,9,5020,26819,9,6103,26819,
- POLARQUADSTRIP,20,16,5020,26819,16,6103,26819,
- 15,5020,26819,15,6103,26819,14,5020,26819,14,6103,26819,
-
- POLARQUADSTRIP,20,1,5053,27971,1,6143,27971,1,5020,26819,1,6103,26819,
- POLARQUADSTRIP,20,4,5020,26819,4,6103,26819,4,5053,27971,4,6143,27971,
- POLARQUADSTRIP,20,6,5053,27971,6,6143,27971,6,5020,26819,6,6103,26819,
- POLARQUADSTRIP,20,9,5020,26819,9,6103,26819,9,5053,27971,9,6143,27971,
- POLARQUADSTRIP,20,11,5053,27971,11,6143,27971,11,5020,26819,11,6103,26819,
- POLARQUADSTRIP,20,14,5020,26819,14,6103,26819,14,5053,27971,14,6143,27971,
- POLARQUADSTRIP,20,16,5053,27971,16,6143,27971,16,5020,26819,16,6103,26819,
- POLARQUADSTRIP,20,19,5020,26819,19,6103,26819,19,5053,27971,19,6143,27971,
-
- POLARQUADSTRIP,20,1,6143,27971,1,5053,27971,2,6143,27971,2,5053,27971,
- 3,6143,27971,3,5053,27971,4,6143,27971,4,5053,27971,
- POLARQUADSTRIP,20,6,6143,27971,6,5053,27971,7,6143,27971,7,5053,27971,
- 8,6143,27971,8,5053,27971,9,6143,27971,9,5053,27971,
- POLARQUADSTRIP,20,11,6143,27971,11,5053,27971,12,6143,27971,12,5053,27971,
- 13,6143,27971,13,5053,27971,14,6143,27971,14,5053,27971,
- POLARQUADSTRIP,20,16,6143,27971,16,5053,27971,17,6143,27971,17,5053,27971,
- 18,6143,27971,18,5053,27971,19,6143,27971,19,5053,27971,
-
- ENDOFDATA
-};
-
-static double piece_size;
-
-static int
-enumerate_ring_vertices( int steps, unsigned short *data, void *h,
- void (*process_vertex)(void *h,double x,double y,double z))
-{
- int patlen = 1,i;
- unsigned short *pts = data;
- double dtheta = M_PI * 2 / steps;
-
- if( data[0] == PATTERN) {
- patlen = data[1];
- pts += 2;
- }
-
- if( pts[0] == 0) steps = 1;
-
- for( i=0; i < steps; i++) {
- double r = pts[(i % patlen)*2] * piece_size;
- double y = pts[(i % patlen)*2+1] * piece_size;
- double theta = dtheta * i;
-
- process_vertex( h, r * cos(theta), y, r * sin(theta));
- }
-
- return pts + patlen * 2 - data;
-}
-
-static void
-enumerate_vertices( unsigned short *data, void *h,
- void (*process_vertex)(void *h,double x,double y,double z))
-{
- while(1) {
- if( data[0] == SPIN) {
- int steps;
- steps = data[1];
- data += 2;
-
- while(data[0] <= SEAM) {
- if( data[0] == SETBACKREF || data[0] == BACKREF) {
- data += 2;
- continue;
- } else if( data[0] == STEPUP) {
- steps *= 2;
- data++;
- continue;
- } else if( data[0] == STEPDOWN) {
- steps /= 2;
- data++;
- continue;
- } else if( data[0] == SEAM) {
- data ++;
- /* Visit seam vertices twice */
- enumerate_ring_vertices( steps, data,
- h, process_vertex);
- data += enumerate_ring_vertices( steps, data,
- h, process_vertex);
- } else {
- data += enumerate_ring_vertices( steps, data,
- h, process_vertex);
- }
- }
- } else if( data[0] == POLARQUADSTRIP) {
- int steps = data[1];
- double dtheta;
- data += 2;
-
- dtheta = M_PI * 2 / steps;
-
- while(data[0] <= SEAM) {
- if( data[0] != BACKREF) {
- double theta = dtheta * data[0];
- double r = data[1] * piece_size;
- double y = data[2] * piece_size;
- process_vertex( h, r * cos(theta), y, r * sin(theta));
- }
- data += 3;
- }
- } else if( data[0] == QUADSTRIP || data[0] == VERTICES) {
- data ++;
-
- while(data[0] <= SEAM) {
- if( data[0] == SETBACKREF) {
- data += 2;
- continue;
- }
-
- if( data[0] != BACKREF) {
- double x = (signed short)data[0] * piece_size;
- double y = data[1] * piece_size;
- double z = (signed short)data[2] * piece_size;
- process_vertex( h, x, y, z);
- }
- data += 3;
- }
- } else if( data[0] == QUADS || data[0] == TRIANGLES) {
- data ++;
- while( data[0] <= SEAM) data++;
- } else {
- break;
- }
- }
-}
-
-static void
-enumerate_ring_faces( int basevertex, int steps,
- int prevbase, int prevsteps, void *h, int *count_ret,
- void (*process_face)(void *h,int v1,int v2,int v3,int v4))
-{
- int i,j;
-
- if( steps == 1) {
- for( i=0; i < prevsteps; i++) {
- process_face( h,
- basevertex,
- prevbase + i,
- prevbase + (i ? i-1 : prevsteps-1),
- -1);
- if (count_ret) (*count_ret)++;
- }
- } else if( steps == prevsteps) {
- for( i=0; i < steps; i++) {
- process_face( h,
- basevertex + i,
- prevbase + i,
- prevbase + (i ? i-1 : steps-1),
- basevertex + (i ? i-1 : steps-1));
- if (count_ret) (*count_ret)++;
- }
- } else {
- j = 0;
- for( i=0;; i++) {
- while( j < prevsteps && steps*(1+2*j) < prevsteps*(1+2*i)) {
- process_face( h,
- basevertex + (i%steps),
- prevbase + ((j+1)%prevsteps),
- prevbase + j,
- -1);
- if (count_ret) (*count_ret)++;
- j++;
- }
- if( i == steps) break;
- process_face( h,
- basevertex + i,
- basevertex + ((i+1)%steps),
- prevbase + (j%prevsteps),
- -1);
- if (count_ret) (*count_ret)++;
- }
- }
-}
-
-static void
-enumerate_faces( unsigned short *data, void *h, int *count_ret,
- void (*process_face)(void *h,int v1,int v2,int v3,int v4))
-{
- int basevertex = 0, startofvertices = 0;
- int backrefs[5];
-
- while(1) {
- if( data[0] == SPIN) {
- int steps;
- int prevsteps = -1,prevbase = 0;
-
- steps = data[1];
- data += 2;
-
- while( data[0] <= SEAM) {
- if( data[0] == SETBACKREF) {
- backrefs[data[1]] = basevertex;
- data += 2;
- continue;
- }
-
- if( data[0] == STEPUP) {
- steps *= 2;
- data++;
- continue;
- } else if( data[0] == STEPDOWN) {
- steps /= 2;
- data++;
- continue;
- }
-
- if( data[0] == BACKREF) {
- if( prevsteps != -1) {
- enumerate_ring_faces( backrefs[data[1]], steps,
- prevbase, prevsteps, h,
- count_ret, process_face);
- }
-
- prevbase = backrefs[data[1]];
- data += 2;
- } else {
- int isseam = 0;
- if( data[0] == SEAM) {
- isseam = 1;
- data++;
- }
-
- if( data[0] == PATTERN) {
- data += 2 + data[1]*2;
- } else {
- if( data[0] == 0) steps = 1;
- data += 2;
- }
-
- if( prevsteps != -1) {
- enumerate_ring_faces( basevertex, steps,
- prevbase, prevsteps, h,
- count_ret, process_face);
- }
-
- if( isseam) basevertex += steps;
- prevbase = basevertex;
- basevertex += steps;
- }
-
- prevsteps = steps;
- }
- } else if( data[0] == POLARQUADSTRIP || data[0] == QUADSTRIP) {
- int v0=-1,v1=0,v2,v3;
- if( data[0] == POLARQUADSTRIP) data += 2;
- else data ++;
- while(data[0] <= SEAM) {
- if( data[0] == BACKREF) {
- v2 = backrefs[data[1]]+data[2];
- } else {
- v2 = basevertex;
- basevertex++;
- }
- if( data[3] == BACKREF) {
- v3 = backrefs[data[4]]+data[5];
- } else {
- v3 = basevertex;
- basevertex++;
- }
- data += 6;
- if( v0 != -1) {
- process_face( h, v0, v1, v3, v2);
- if (count_ret) (*count_ret)++;
- }
- v0 = v2;
- v1 = v3;
- }
- } else if( data[0] == VERTICES) {
- data ++;
- startofvertices = basevertex;
- while( data[0] <= SEAM) {
- if( data[0] == SETBACKREF) {
- backrefs[data[1]] = basevertex;
- data += 2;
- continue;
- }
- data += 3;
- basevertex ++;
- }
- } else if( data[0] == QUADS) {
- data ++;
- while( data[0] <= SEAM) {
- process_face( h,
- data[0] + startofvertices,
- data[1] + startofvertices,
- data[2] + startofvertices,
- data[3] + startofvertices);
- if (count_ret) (*count_ret)++;
- data += 4;
- }
- } else if( data[0] == TRIANGLES) {
- data ++;
- while( data[0] <= SEAM) {
- process_face( h,
- data[0] + startofvertices,
- data[1] + startofvertices,
- data[2] + startofvertices, -1);
- if (count_ret) (*count_ret)++;
- data += 3;
- }
- } else {
- break;
- }
- }
-}
-
-static void
-normalize( float v[3]) {
- float d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
-
- if( d == 0.0) {
- /* The direction is undefined - normalize it anyway */
- v[0] = 1.0;
- v[1] = 0.0;
- v[2] = 0.0;
- return;
- }
-
- v[0] /= d;
- v[1] /= d;
- v[2] /= d;
-}
-
-static void
-normcrossprod( float v1[3], float v2[3], float out[3])
-{
- out[0] = v1[1] * v2[2] - v1[2] * v2[1];
- out[1] = v1[2] * v2[0] - v1[0] * v2[2];
- out[2] = v1[0] * v2[1] - v1[1] * v2[0];
- normalize( out);
-}
-
-#define vectordiff(v1,v2,out) \
- ((out)[0] = (v1)[0] - (v2)[0], \
- (out)[1] = (v1)[1] - (v2)[1], \
- (out)[2] = (v1)[2] - (v2)[2])
-
-#define vectoradd(v1,v2) \
- ((v1)[0] += (v2)[0], \
- (v1)[1] += (v2)[1], \
- (v1)[2] += (v2)[2])
-
-static int numverts;
-static float *vertices;
-static float *normals;
-
-static void
-count_vertex( void *dummy, double x, double y, double z)
-{
- numverts++;
-}
-
-static void
-add_normal( void *dummy, int v1, int v2, int v3, int v4)
-{
- float surfnormal[3],d1[3],d2[3];
-
- if( v4 == -1) {
- vectordiff( vertices + 3 * v2, vertices + 3 * v1, d1);
- vectordiff( vertices + 3 * v3, vertices + 3 * v1, d2);
- normcrossprod( d1, d2, surfnormal);
- vectoradd( normals + 3 * v1, surfnormal);
- vectoradd( normals + 3 * v2, surfnormal);
- vectoradd( normals + 3 * v3, surfnormal);
- } else {
- vectordiff( vertices + 3 * v2, vertices + 3 * v1, d1);
- vectordiff( vertices + 3 * v4, vertices + 3 * v1, d2);
- normcrossprod( d1, d2, surfnormal);
- vectoradd( normals + 3 * v1, surfnormal);
- vectordiff( vertices + 3 * v3, vertices + 3 * v2, d1);
- vectordiff( vertices + 3 * v1, vertices + 3 * v2, d2);
- normcrossprod( d1, d2, surfnormal);
- vectoradd( normals + 3 * v2, surfnormal);
- vectordiff( vertices + 3 * v4, vertices + 3 * v3, d1);
- vectordiff( vertices + 3 * v2, vertices + 3 * v3, d2);
- normcrossprod( d1, d2, surfnormal);
- vectoradd( normals + 3 * v3, surfnormal);
- vectordiff( vertices + 3 * v1, vertices + 3 * v4, d1);
- vectordiff( vertices + 3 * v3, vertices + 3 * v4, d2);
- normcrossprod( d1, d2, surfnormal);
- vectoradd( normals + 3 * v4, surfnormal);
- }
-}
-
-static void
-collect_vertex( void *curvert, double x, double y, double z)
-{
- (*(float**)curvert)[0] = x;
- (*(float**)curvert)[1] = y;
- (*(float**)curvert)[2] = z;
- (*(float**)curvert) += 3;
-}
-
-static void
-draw_face( void *dummy, int v1, int v2, int v3, int v4)
-{
- glBegin( v4 == -1 ? GL_TRIANGLES : GL_QUADS);
- glNormal3f( normals[v1*3], normals[v1*3+1], normals[v1*3+2]);
- glVertex3f( vertices[v1*3], vertices[v1*3+1], vertices[v1*3+2]);
- glNormal3f( normals[v2*3], normals[v2*3+1], normals[v2*3+2]);
- glVertex3f( vertices[v2*3], vertices[v2*3+1], vertices[v2*3+2]);
- glNormal3f( normals[v3*3], normals[v3*3+1], normals[v3*3+2]);
- glVertex3f( vertices[v3*3], vertices[v3*3+1], vertices[v3*3+2]);
- if( v4 != -1) {
- glNormal3f( normals[v4*3], normals[v4*3+1], normals[v4*3+2]);
- glVertex3f( vertices[v4*3], vertices[v4*3+1], vertices[v4*3+2]);
- }
- glEnd();
-}
-
-static int
-draw_piece( unsigned short *piece_data)
-{
- int i;
- float *curvert;
- int count = 0;
-
- /* Count how many vertices this piece has */
- enumerate_vertices( piece_data, NULL, count_vertex);
-
- /* Allocate memory for the vertices and for the vertex normals */
- vertices = malloc( sizeof(float) * 3 * numverts);
- normals = malloc( sizeof(float) * 3 * numverts);
- if( !vertices || !normals) exit(1);
-
- /* Collect the vertex coordinates */
- curvert = vertices;
- enumerate_vertices( piece_data, &curvert, collect_vertex);
-
- /* Zero out the normals */
- for( i=0; i < numverts * 3; i++) {
- normals[i] = 0.0;
- }
-
- /* Add up all the face normals at each vertex */
- enumerate_faces( piece_data, NULL, NULL, add_normal);
-
- /* Normalize the vertex normals */
- for( i=0; i < numverts; i++) {
- normalize( normals + i * 3);
- }
-
- /* Now draw the faces */
- enumerate_faces( piece_data, NULL, &count, draw_face);
-
- free( normals);
- free( vertices);
-
- if (count <= 1) abort();
- return count;
-}
-
-void chessmodels_gen_lists( int classic, int poly_count[PIECES]) {
-
- Bool queen_only_p = classic < 0;
- if (classic < 0) classic = 0;
-
- piece_size = classic ? 0.095 / 100 : 0.3 / 8192;
-
- glGenLists (20); /* this is horrible! List numbers are hardcoded! */
-
- glNewList(QUEEN, GL_COMPILE);
- poly_count[QUEEN] = draw_piece( classic ? classic_queen_data : queen_data);
- glEndList();
-
- if (queen_only_p) return;
-
- glNewList(KING, GL_COMPILE);
- poly_count[KING] = draw_piece( classic ? classic_king_data : king_data);
- glEndList();
-
- glNewList(BISHOP, GL_COMPILE);
- poly_count[BISHOP] = draw_piece( classic ? classic_bishop_data : bishop_data);
- glEndList();
-
- glNewList(KNIGHT, GL_COMPILE);
- poly_count[KNIGHT] = draw_piece( classic ? classic_knight_data : knight_data);
- glEndList();
-
- glNewList(ROOK, GL_COMPILE);
- poly_count[ROOK] = draw_piece( classic ? classic_rook_data : rook_data);
- glEndList();
-
- glNewList(PAWN, GL_COMPILE);
- poly_count[PAWN] = draw_piece( classic ? classic_pawn_data : pawn_data);
- glEndList();
-}
diff --git a/hacks/glx/chessmodels.h b/hacks/glx/chessmodels.h
deleted file mode 100644
index 6e41e22..0000000
--- a/hacks/glx/chessmodels.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * models for the xss chess screensavers
- * hacked from:
- *
- * glChess - A 3D chess interface
- *
- * Copyright (C) 2006 John-Paul Gignac <jjgignac@users.sf.net>
- *
- * Copyright (C) 2002 Robert Ancell <bob27@users.sourceforge.net>
- * Michael Duelli <duelli@users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* ugggggggly */
-#define PIECES 7
-#define NONE 0
-#define KING 1
-#define QUEEN 2
-#define BISHOP 3
-#define KNIGHT 4
-#define ROOK 5
-#define PAWN 6
-#define BKING 8
-#define BQUEEN 9
-#define BBISHOP 10
-#define BKNIGHT 11
-#define BROOK 12
-#define BPAWN 13
-
-extern void chessmodels_gen_lists( int classic, int poly_count[PIECES]);
-
diff --git a/hacks/glx/circuit.c b/hacks/glx/circuit.c
deleted file mode 100644
index 00e88c8..0000000
--- a/hacks/glx/circuit.c
+++ /dev/null
@@ -1,2105 +0,0 @@
-/*
- * circuit - Random electronic components floating around
- *
- * version 1.4
- *
- * Since version 1.1: added to-220 transistor, added fuse
- * Since version 1.2: random display digits, LED improvements (flickering)
- * Since version 1.3: ICs look better, font textures, improved normals to
- * eliminate segmenting on curved surfaces, speedups
- * Since version 1.4: Added RCA connector, 3.5mm connector, slide switch,
- * surface mount, to-92 markings. Fixed ~5min crash.
- * Better LED illumination. Other minor changes.
- *
- * Copyright (C) 2001-2015 Ben Buxton (bb@cactii.net)
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* Written over a few days in a (successful) bid to learn GL coding
- *
- * -seven option is dedicated to all the Slarkeners
- *
- * This hack uses lookup tables for sin, cos and tan - it can do a lot
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
- "*componentFont: monospace bold 12" \
-
-# define release_circuit 0
-# define circuit_handle_event xlockmore_no_events
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#define DEF_SPIN "True"
-#define DEF_SEVEN "False"
-#define DEF_PARTS "10"
-#define DEF_ROTATESPEED "1"
-#define DEF_LIGHT "True"
-
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-
-#ifdef USE_GL
-
-#include "texfont.h"
-
-static int maxparts;
-static int rotatespeed;
-static int spin;
-static int uselight;
-static int seven;
-
-static XrmOptionDescRec opts[] = {
- {"-parts", ".circuit.parts", XrmoptionSepArg, 0 },
- {"-rotate-speed", ".circuit.rotatespeed", XrmoptionSepArg, 0 },
- {"+spin", ".circuit.spin", XrmoptionNoArg, "false" },
- {"-spin", ".circuit.spin", XrmoptionNoArg, "true" },
- {"+light", ".circuit.light", XrmoptionNoArg, "false" },
- {"-light", ".circuit.light", XrmoptionNoArg, "true" },
- {"+seven", ".circuit.seven", XrmoptionNoArg, "false" },
- {"-seven", ".circuit.seven", XrmoptionNoArg, "true" },
-};
-
-static argtype vars[] = {
- {&maxparts, "parts", "Parts", DEF_PARTS, t_Int},
- {&rotatespeed, "rotatespeed", "Rotatespeed", DEF_ROTATESPEED, t_Int},
- {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&uselight, "light", "Light", DEF_LIGHT, t_Bool},
- {&seven, "seven", "Seven", DEF_SEVEN, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt circuit_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct circuit_description =
-{"circuit", "init_circuit", "draw_circuit", NULL,
- "draw_circuit", "init_circuit", "free_circuit", &circuit_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Flying electronic components", 0, NULL};
-
-#endif
-
-#define MAX_COMPONENTS 400
-#define MOVE_MULT 0.02
-
-static float f_rand(void)
-{
- return ((float)RAND(10000)/(float)10000);
-}
-
-#define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
-
-/* Represents a band on a resistor/diode/etc */
-typedef struct {
- float pos; /* relative position from start/previous band */
- GLfloat r, g, b; /* colour of the band */
- float len; /* length as a fraction of total length */
-} Band;
-
-typedef struct {
- Band *b1, *b2, *b3, *b4; /* bands */
- int b[4];
-} Resistor;
-
-typedef struct {
- Band *band;
- GLfloat r, g, b; /* body colour */
-} Diode;
-
-static const char * const transistortypes[] = {
- "TIP2955",
- "TIP32C",
- "LM 350T",
- "IRF730",
- "ULN2577",
- "7805T",
- "7912T",
- "TIP120",
- "2N6401",
- "BD239",
- "2SC1590",
- "MRF485",
- "SC141D"
-};
-
-static const char * const to92types[] = {
- "C\n548",
- "C\n848",
- "74\nL05",
- "C\n858",
- "BC\n212L",
- "BC\n640",
- "BC\n337",
- "BC\n338",
- "S817",
- "78\nL12",
- "TL\n431",
- "LM\n35DZ",
-};
-
-static const char * const smctypes[] = {
- "1M-",
- "1K",
- "1F",
- "B10",
- "S14",
- "Q3",
- "4A"
-};
-
-typedef struct {
- int type; /* package type. 0 = to-92, 1 = to-220 */
- const char *text;
-} Transistor;
-
-typedef struct {
- GLfloat r,g,b; /* LED colour */
- int light; /* are we the light source? */
-} LED;
-
-typedef struct {
- int type; /* 0 = electro, 1 = ceramic */
- float width; /* width of an electro/ceramic */
- float length; /* length of an electro */
-} Capacitor;
-
-/* 3.5 mm plug */
-typedef struct {
- int blah;
-} ThreeFive;
-
-/* slide switch */
-typedef struct {
- int position;
-} Switch;
-
-typedef struct {
- int pins;
- const char *val;
-} ICTypes;
-
-static const ICTypes ictypes[] = {
- {8, "NE 555"},
- {8, "LM 386N"},
- {8, "ADC0831"},
- {8, "LM 383T"},
- {8, "TL071"},
- {8, "LM 311"},
- {8, "LM393"},
- {8, "LM 3909"},
-
- {14, "LM 380N"},
- {14, "NE 556"},
- {14, "TL074"},
- {14, "LM324"},
- {14, "LM339"},
- {14, "MC1488"},
- {14, "MC1489"},
- {14, "LM1877-9"},
- {14, "4011"},
- {14, "4017"},
- {14, "4013"},
- {14, "4024"},
- {14, "4066"},
-
- {16, "4076"},
- {16, "4049"},
- {16, "4094"},
- {16, "4043"},
- {16, "4510"},
- {16, "4511"},
- {16, "4035"},
- {16, "RS232"},
- {16, "MC1800"},
- {16, "ULN2081"},
- {16, "UDN2953"},
-
- {24, "ISD1416P"},
- {24, "4515"},
- {24, "TMS6264L"},
- {24, "MC146818"}
-};
-
-typedef struct {
- int type; /* 0 = DIL, 1 = flat square */
- int pins;
- char text[100];
-} IC;
-
-/* 7 segment display */
-
-typedef struct {
- int value; /* displayed number */
-} Disp;
-
-typedef struct {
- GLfloat l, w;
-} Fuse;
-
-typedef struct {
- GLfloat l, w;
- int col;
-} RCA;
-
-typedef struct {
- GLfloat x, y, z; /* current co-ordinates */
- GLfloat dx, dy, dz; /* current direction */
- GLfloat rotx, roty, rotz; /* rotation vector */
- GLfloat drot; /* rotation velocity (degrees per frame) */
- int norm; /* Normalize this component (for shine) */
- int rdeg; /* current rotation degrees */
- int angle; /* angle about the z axis */
- int alpha; /* 0 if not a transparent component */
- int type; /* 0 = resistor, 1 = diode, 2 = transistor, 3 = LED, 4 = cap, 5=IC,
- 6 = 7 seg disp */
- void * c; /* pointer to the component */
-} Component;
-
-/* standard colour codes */
-
-static const GLfloat colorcodes [12][3] = {
- {0.0,0.0,0.0}, /* black 0 */
- {0.49,0.25,0.08}, /* brown 1 */
- {1.0,0.0,0.0}, /* red 2 */
- {1.0,0.5,0.0}, /* orange 3 */
- {1.0,1.0,0.0}, /* yellow 4 */
- {0.0,1.0,0.0}, /* green 5 */
- {0.0,0.5,1.0}, /* blue 6 */
- {0.7,0.2,1.0}, /* violet 7 */
- {0.5,0.5,0.5}, /* grey 8 */
- {1.0,1.0,1.0}, /* white 9 */
- {0.66,0.56,0.2}, /* gold 10 */
- {0.8,0.8,0.8}, /* silver 11 */
-};
-
-/* base values for components - we can multiply by 0 - 1M */
-static const int values [9][2] = {
- {1,0},
- {2,2},
- {3,3},
- {4,7},
- {5,6},
- {6,8},
- {7,5},
- {8,2},
- {9,1}
-};
-
-typedef struct {
- GLXContext *glx_context;
- Window window;
-
- int XMAX, YMAX;
- int win_w, win_h;
-
- /* one lucky led gets to be a light source , unless -no-light*/
- int light;
- int lighton;
-
- /* stores refs to textures */
- int s_refs[50];
-
- GLfloat viewer[3];
- GLfloat lightpos[4];
-
- float sin_table[720];
- float cos_table[720];
- float tan_table[720];
-
- Component *components[MAX_COMPONENTS];
- int band_list[12];
- int band_list_polys[12];
-
- GLfloat grid_col[3], grid_col2[3];
-
- int display_i;
- GLfloat rotate_angle;
-
- texture_font_data *font;
- char *font_strings[50]; /* max of 40 textures */
- int font_w[50], font_h[50];
- int font_init;
-
- GLfloat draw_sx, draw_sy; /* bright spot co-ords */
- int draw_sdir; /* 0 = left-right, 1 = right-left, 2 = up->dn, 3 = dn->up */
- int draw_s; /* if spot is enabled */
- float draw_ds; /* speed of spot */
-
-} Circuit;
-
-static Circuit *circuit = NULL;
-
-
-static int DrawResistor(Circuit *, Resistor *);
-static int DrawDiode(Circuit *, Diode *);
-static int DrawTransistor(Circuit *, Transistor *);
-static int DrawLED(Circuit *, LED *);
-static int DrawIC(Circuit *, IC *);
-static int DrawCapacitor(Circuit *, Capacitor *);
-static int DrawDisp(Circuit *, Disp *);
-static int DrawFuse(Circuit *, Fuse *);
-static int DrawRCA(Circuit *, RCA *);
-static int DrawThreeFive(Circuit *, ThreeFive *);
-static int DrawSwitch(Circuit *, Switch *);
-
-static void reorder(Component *[]);
-static int circle(Circuit *, float, int,int);
-static int bandedCylinder(Circuit *,
- float, float , GLfloat, GLfloat , GLfloat,
- Band **, int);
-static int Rect(GLfloat , GLfloat , GLfloat, GLfloat , GLfloat ,GLfloat);
-static int ICLeg(GLfloat, GLfloat, GLfloat, int);
-static int HoledRectangle(Circuit *ci,
- GLfloat, GLfloat, GLfloat, GLfloat, int);
-static Resistor *NewResistor(void);
-static Diode *NewDiode(void);
-static Transistor *NewTransistor(ModeInfo *);
-static LED * NewLED(Circuit *);
-static Capacitor *NewCapacitor(Circuit *);
-static IC* NewIC(ModeInfo *);
-static Disp* NewDisp(Circuit *);
-static Fuse *NewFuse(Circuit *);
-static RCA *NewRCA(Circuit *);
-static ThreeFive *NewThreeFive(Circuit *);
-static Switch *NewSwitch(Circuit *);
-
-/* we use trig tables to speed things up - 200 calls to sin()
- in one frame can be a bit harsh..
-*/
-
-static void make_tables(Circuit *ci)
-{
-int i;
-float f;
-
- f = 360 / (M_PI * 2);
- for (i = 0 ; i < 720 ; i++) {
- ci->sin_table[i] = sin(i/f);
- }
- for (i = 0 ; i < 720 ; i++) {
- ci->cos_table[i] = cos(i/f);
- }
- for (i = 0 ; i < 720 ; i++) {
- ci->tan_table[i] = tan(i/f);
- }
-}
-
-
-static int createCylinder (Circuit *ci,
- float length, float radius, int endcaps, int half)
-{
- int polys = 0;
- int a; /* current angle around cylinder */
- int angle, norm;
- float z1, y1, z2, y2,ex;
- int nsegs;
-
- glPushMatrix();
- nsegs = radius*MAX(ci->win_w, ci->win_h)/20;
- nsegs = MAX(nsegs, 4);
- if (nsegs % 2)
- nsegs += 1;
- angle = (half) ? (180 - 90/nsegs) : 374;
- z1 = radius; y1 = 0;
- glBegin(GL_QUADS);
- for (a = 0 ; a <= angle ; a+= angle/nsegs) {
- y2=radius*(float)ci->sin_table[(int)a];
- z2=radius*(float)ci->cos_table[(int)a];
- glNormal3f(0, y1, z1);
- glVertex3f(0,y1,z1);
- glVertex3f(length,y1,z1);
- glNormal3f(0, y2, z2);
- glVertex3f(length,y2,z2);
- glVertex3f(0,y2,z2);
- polys++;
- z1=z2;
- y1=y2;
- }
- glEnd();
- if (half) {
- glBegin(GL_POLYGON);
- glNormal3f(0, 1, 0);
- glVertex3f(0, 0, radius);
- glVertex3f(length, 0, radius);
- glVertex3f(length, 0, 0 - radius);
- glVertex3f(0, 0, 0 - radius);
- polys++;
- glEnd();
- }
- if (endcaps) {
- for(ex = 0 ; ex <= length ; ex += length) {
- z1 = radius; y1 = 0;
- norm = (ex == length) ? 1 : -1;
- glBegin(GL_TRIANGLES);
- glNormal3f(norm, 0, 0);
- for (a = 0 ; a <= angle ; a+= angle/nsegs) {
- y2=radius*(float)ci->sin_table[(int)a];
- z2=radius*(float)ci->cos_table[(int)a];
- glVertex3f(ex,0, 0);
- glVertex3f(ex,y1,z1);
- glVertex3f(ex,y2,z2);
- polys++;
- z1=z2;
- y1=y2;
- }
- glEnd();
- }
- }
- glPopMatrix();
- return polys;
-}
-
-static int circle(Circuit *ci, float radius, int segments, int half)
-{
- int polys = 0;
- float x1 = 0, x2 = 0;
- float y1 = 0, y2 = 0;
- int i, t, s;
-
- if (half) {
- t = 270; s = 90;
- x1 = radius, y1 = 0;
- } else {
- t = 360, s = 0;
- }
- glBegin(GL_TRIANGLES);
- glNormal3f(1, 0, 0);
- for(i=s;i<=t;i+=10)
- {
- float angle=i;
- x2=radius*(float)ci->cos_table[(int)angle];
- y2=radius*(float)ci->sin_table[(int)angle];
- glVertex3f(0,0,0);
- glVertex3f(0,y1,x1);
- glVertex3f(0,y2,x2);
- polys++;
- x1=x2;
- y1=y2;
- }
- glEnd();
- return polys;
-}
-
-static int wire(Circuit *ci, float len)
-{
- int polys = 0;
- GLfloat col[] = {0.3, 0.3, 0.3, 1.0};
- GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
- GLfloat nospec[] = {0.4, 0.4, 0.4, 1.0};
- GLfloat shin = 30;
- int n;
-
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
- n = glIsEnabled(GL_NORMALIZE);
- if (!n) glEnable(GL_NORMALIZE);
- polys += createCylinder(ci, len, 0.05, 1, 0);
- if (!n) glDisable(GL_NORMALIZE);
- glMaterialfv(GL_FRONT, GL_SPECULAR, nospec);
- return polys;
-}
-
-static int sphere(Circuit *ci, GLfloat r, float stacks, float slices,
- int startstack, int endstack, int startslice,
- int endslice)
-{
- int polys = 0;
- GLfloat d, d1, dr, dr1, Dr, Dr1, D, D1, z1, z2, y1, y2, Y1, Z1, Y2, Z2;
- int a, a1, b, b1, c0, c1;
- GLfloat step, sstep;
-
- step = 180/stacks;
- sstep = 360/slices;
- a1 = startstack * step;
- b1 = startslice * sstep;
- y1 = z1 = Y1 = Z1 = 0;
- c0 = (endslice / slices) * 360;
- c1 = (endstack/stacks)*180;
- glBegin(GL_QUADS);
- for (a = startstack * step ; a <= c1 ; a+= step) {
- d=ci->sin_table[a];
- d1=ci->sin_table[a1];
- D=ci->cos_table[a];
- D1=ci->cos_table[a1];
- dr = d * r;
- dr1 = d1 * r;
- Dr = D * r;
- Dr1 = D1 * r;
- for (b = b1 ; b <= c0 ; b+= sstep) {
- y2=dr*ci->sin_table[b];
- z2=dr*ci->cos_table[b];
- Y2=dr1*ci->sin_table[b];
- Z2=dr1*ci->cos_table[b];
- glNormal3f(Dr, y1, z1);
- glVertex3f(Dr,y1,z1);
- glNormal3f(Dr, y2, z2);
- glVertex3f(Dr,y2,z2);
- glNormal3f(Dr1, Y2, Z2);
- glVertex3f(Dr1,Y2,Z2);
- glNormal3f(Dr1, Y1, Z1);
- glVertex3f(Dr1,Y1,Z1);
- polys++;
- z1=z2;
- y1=y2;
- Z1=Z2;
- Y1=Y2;
- }
- a1 = a;
- }
- glEnd();
- return polys;
-}
-
-static int DrawComponent(Circuit *ci, Component *c, unsigned long *polysP)
-{
- int polys = *polysP;
- int ret = 0; /* return 1 if component is freed */
-
- glPushMatrix();
- glTranslatef(c->x, c->y, c->z);
- if (c->angle > 0) {
- glRotatef(c->angle, c->rotx, c->roty, c->rotz);
- }
- if (spin) {
- glRotatef(c->rdeg, c->rotx, c->roty, c->rotz);
- c->rdeg += c->drot;
- }
-
- if (c->norm)
- glEnable(GL_NORMALIZE);
- else
- glDisable(GL_NORMALIZE);
-
- /* call object draw routine here */
- if (c->type == 0) {
- polys += DrawResistor(ci, c->c);
- } else if (c->type == 1) {
- polys += DrawDiode(ci, c->c);
- } else if (c->type == 2) {
- polys += DrawTransistor(ci, c->c);
- } else if (c->type == 3) {
- if (((LED *)c->c)->light && ci->light) {
- GLfloat lp[] = {0.1, 0, 0, 1};
- glEnable(GL_LIGHT1);
- glLightfv(GL_LIGHT1, GL_POSITION, lp);
- }
- polys += DrawLED(ci, c->c);
- } else if (c->type == 4) {
- polys += DrawCapacitor(ci, c->c);
- } else if (c->type == 5) {
- polys += DrawIC(ci, c->c);
- } else if (c->type == 6) {
- polys += DrawDisp(ci, c->c);
- } else if (c->type == 7) {
- polys += DrawFuse(ci, c->c);
- } else if (c->type == 8) {
- polys += DrawRCA(ci, c->c);
- } else if (c->type == 9) {
- polys += DrawThreeFive(ci, c->c);
- } else if (c->type == 10) {
- polys += DrawSwitch(ci, c->c);
- }
- c->x += c->dx * MOVE_MULT;
- c->y += c->dy * MOVE_MULT;
- if (c->x > ci->XMAX/2 || c->x < 0 - ci->XMAX/2 ||
- c->y > ci->YMAX/2 || c->y < 0 - ci->YMAX/2) {
- if (c->type == 3 && ((LED *)c->c)->light && ci->light) {
- glDisable(GL_LIGHT1);
- ci->light = 0; ci->lighton = 0;
- }
- if (c->type == 1)
- free(((Diode *)c->c)->band); /* remember to free diode band */
- free(c->c);
- ret = 1;
- }
-
- glPopMatrix();
- glDisable(GL_NORMALIZE);
- *polysP = polys;
- return ret;
-}
-
-/* draw a resistor */
-
-static int DrawResistor(Circuit *ci, Resistor *r)
-{
- int polys = 0;
- int i;
- GLfloat col[] = {0.74, 0.62, 0.46, 1.0};
- GLfloat spec[] = {0.8, 0.8, 0.8, 1.0};
- GLfloat shine = 30;
-
- glTranslatef(-4, 0, 0);
- polys += wire(ci, 3);
- glTranslatef(3, 0, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
- polys += createCylinder(ci, 1.8, 0.4, 1, 0);
- glPushMatrix();
- for (i = 0 ; i < 4 ; i++) {
- glTranslatef(0.35, 0, 0);
- glCallList(ci->band_list[r->b[i]]);
- polys += ci->band_list_polys[r->b[i]];
- }
- glPopMatrix();
- glTranslatef(1.8, 0, 0);
- polys += wire(ci, 3);
- return polys;
-}
-
-static int DrawRCA(Circuit *ci, RCA *rca)
-{
- int polys = 0;
- GLfloat col[] = {0.6, 0.6, 0.6, 1.0}; /* metal */
- GLfloat red[] = {1.0, 0.0, 0.0, 1.0}; /* red */
- GLfloat white[] = {1.0, 1.0, 1.0, 1.0}; /* white */
- GLfloat spec[] = {1, 1, 1, 1}; /* glass */
-
- glPushMatrix();
- glTranslatef(0.3, 0, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMateriali(GL_FRONT, GL_SHININESS, 40);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- polys += createCylinder(ci, 0.7, 0.45, 0, 0);
- glTranslatef(0.4, 0, 0);
- polys += createCylinder(ci, 0.9, 0.15, 1, 0);
- glTranslatef(-1.9, 0, 0);
- glMateriali(GL_FRONT, GL_SHININESS, 20);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, rca->col ? white : red);
- polys += createCylinder(ci, 1.5, 0.6, 1, 0);
- glTranslatef(-0.9, 0, 0);
- polys += createCylinder(ci, 0.9, 0.25, 0, 0);
- glTranslatef(0.1, 0, 0);
- polys += createCylinder(ci, 0.2, 0.3, 0, 0);
- glTranslatef(0.3, 0, 0);
- polys += createCylinder(ci, 0.2, 0.3, 1, 0);
- glTranslatef(0.3, 0, 0);
- polys += createCylinder(ci, 0.2, 0.3, 1, 0);
- glPopMatrix();
- return polys;
-}
-
-static int DrawSwitch(Circuit *ci, Switch *f)
-{
- int polys = 0;
- GLfloat col[] = {0.6, 0.6, 0.6, 0}; /* metal */
- GLfloat dark[] = {0.1, 0.1, 0.1, 1.0}; /* dark */
- GLfloat brown[] = {0.69, 0.32, 0, 1.0}; /* brown */
- GLfloat spec[] = {0.9, 0.9, 0.9, 1}; /* shiny */
-
- glPushMatrix();
- glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_AMBIENT, dark);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMateriali(GL_FRONT, GL_SHININESS, 90);
- polys += Rect(-0.25, 0, 0, 1.5, 0.5, 0.75);
-/* polys += Rect(-0.5, 0.5, 0, 2, 0.1, 0.75); */
- glPushMatrix();
- glRotatef(90, 1, 0, 0);
- glTranslatef(-0.5, -0.4, -0.4);
- polys += HoledRectangle(ci, 0.5, 0.75, 0.1, 0.15, 8);
- glTranslatef(2, 0, 0);
- polys += HoledRectangle(ci, 0.5, 0.75, 0.1, 0.15, 8);
- glPopMatrix();
- polys += Rect(0.1, -0.4, -0.25, 0.1, 0.4, 0.05);
- polys += Rect(0.5, -0.4, -0.25, 0.1, 0.4, 0.05);
- polys += Rect(0.9, -0.4, -0.25, 0.1, 0.4, 0.05);
- polys += Rect(0.1, -0.4, -0.5, 0.1, 0.4, 0.05);
- polys += Rect(0.5, -0.4, -0.5, 0.1, 0.4, 0.05);
- polys += Rect(0.9, -0.4, -0.5, 0.1, 0.4, 0.05);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, dark);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- polys += Rect(0, 0.5, -0.1, 1, 0.05, 0.5);
- polys += Rect(0, 0.6, -0.1, 0.5, 0.6, 0.5);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, brown);
- polys += Rect(-0.2, -0.01, -0.1, 1.4, 0.1, 0.55);
- glPopMatrix();
- return polys;
-}
-
-
-static int DrawFuse(Circuit *ci, Fuse *f)
-{
- int polys = 0;
- GLfloat col[] = {0.5, 0.5, 0.5, 1.0}; /* endcaps */
- GLfloat glass[] = {0.4, 0.4, 0.4, 0.3}; /* glass */
- GLfloat spec[] = {1, 1, 1, 1}; /* glass */
-
- glPushMatrix();
- glTranslatef(-1.8, 0, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMateriali(GL_FRONT, GL_SHININESS, 40);
- polys += createCylinder(ci, 0.8, 0.45, 1, 0);
- glTranslatef(0.8, 0, 0);
- glEnable(GL_BLEND);
- glDepthMask(GL_FALSE);
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, glass);
- glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 40);
- polys += createCylinder(ci, 2, 0.4, 0, 0);
- polys += createCylinder(ci, 2, 0.3, 0, 0);
- glDisable(GL_BLEND);
- glDepthMask(GL_TRUE);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMateriali(GL_FRONT, GL_SHININESS, 40);
- glBegin(GL_LINES);
- glVertex3f(0, 0, 0);
- glVertex3f(2, 0. ,0);
- glEnd();
- glTranslatef(2, 0, 0);
- polys += createCylinder(ci, 0.8, 0.45, 1, 0);
- glPopMatrix();
- return polys;
-}
-
-
-static int DrawCapacitor(Circuit *ci, Capacitor *c)
-{
- int polys = 0;
- GLfloat col[] = {0, 0, 0, 0};
- GLfloat spec[] = {0.8, 0.8, 0.8, 0};
- GLfloat brown[] = {0.84, 0.5, 0};
- GLfloat shine = 40;
-
- glPushMatrix();
- if (c->type) {
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, brown);
- polys += sphere(ci, c->width, 15, 15, 0, 4 ,0, 15);
- glTranslatef(1.35*c->width, 0, 0);
- polys += sphere(ci, c->width, 15, 15, 11, 15, 0, 15);
- glRotatef(90, 0, 0, 1);
- glTranslatef(0, 0.7*c->width, 0.3*c->width);
- polys += wire(ci, 3*c->width);
- glTranslatef(0, 0, -0.6*c->width);
- polys += wire(ci, 3*c->width);
- } else {
- glTranslatef(0-c->length*2, 0, 0);
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &shine);
- glBegin(GL_POLYGON);
- glVertex3f(0, 0.82*c->width, -0.1);
- glVertex3f(3*c->length, 0.82*c->width, -0.1);
- glVertex3f(3*c->length, 0.82*c->width, 0.1);
- glVertex3f(0, 0.82*c->width, 0.1);
- glEnd();
- col[0] = 0.0;
- col[1] = 0.2;
- col[2] = 0.9;
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
- glEnable(GL_POLYGON_OFFSET_FILL);
- glPolygonOffset(1.0, 1.0);
- polys += createCylinder(ci, 3.0*c->length, 0.8*c->width, 1, 0);
- glDisable(GL_POLYGON_OFFSET_FILL);
- col[0] = 0.7;
- col[1] = 0.7;
- col[2] = 0.7;
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
- polys += circle(ci, 0.6*c->width, 30, 0);
- col[0] = 0;
- col[1] = 0;
- col[2] = 0;
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
- glTranslatef(3.0*c->length, 0.0, 0);
- polys += circle(ci, 0.6*c->width, 30, 0);
- glTranslatef(0, 0.4*c->width, 0);
- polys += wire(ci, 3*c->length);
- glTranslatef(0.0, -0.8*c->width, 0);
- polys += wire(ci, 3.3*c->length);
- }
- glPopMatrix();
- return polys;
-}
-
-static int DrawLED(Circuit *ci, LED *l)
-{
- int polys = 0;
- GLfloat col[] = {0, 0, 0, 0.6};
- GLfloat black[] = {0, 0, 0, 0.6};
-
- col[0] = l->r; col[1] = l->g; col[2] = l->b;
- if (l->light && ci->light) {
- GLfloat dir[] = {-1, 0, 0};
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, dir);
- if (!ci->lighton) {
- glLightfv(GL_LIGHT1, GL_SPECULAR, col);
- glLightfv(GL_LIGHT1, GL_AMBIENT, black);
- col[0] /= 1.5; col[1] /= 1.5; col[2] /= 1.5;
- glLightfv(GL_LIGHT1, GL_DIFFUSE, col);
- glLighti(GL_LIGHT1, GL_SPOT_CUTOFF, (GLint) 90);
- glLighti(GL_LIGHT1, GL_CONSTANT_ATTENUATION, (GLfloat)1);
- glLighti(GL_LIGHT1, GL_LINEAR_ATTENUATION, (GLfloat)0);
- glLighti(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, (GLfloat)0);
- glLighti(GL_LIGHT1, GL_SPOT_EXPONENT, (GLint) 20);
- ci->lighton = 1;
- }
- }
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
- /* no transparency when LED is lit */
- if (!l->light) {
- glEnable(GL_BLEND);
- glDepthMask(GL_FALSE);
- glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
- }
- glTranslatef(-0.9, 0, 0);
- polys += createCylinder(ci, 1.2, 0.3, 0, 0);
- if (l->light && ci->light) {
- glDisable(GL_LIGHTING);
- glColor3fv(col);
- }
- polys += sphere(ci, 0.3, 7, 7, 3, 7, 0, 7);
- if (l->light && ci->light) {
- glEnable(GL_LIGHTING);
- } else {
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- }
-
- glTranslatef(1.2, 0, 0);
- polys += createCylinder(ci, 0.1, 0.38, 1, 0);
- glTranslatef(-0.3, 0.15, 0);
- polys += wire(ci, 3);
- glTranslatef(0, -0.3, 0);
- polys += wire(ci, 3.3);
- if (random() % 50 == 25) {
- if (l->light) {
- l->light = 0; ci->light = 0; ci->lighton = 0;
- glDisable(GL_LIGHT1);
- } else if (!ci->light) {
- l->light = 1;
- ci->light = 1;
- }
- }
- return polys;
-}
-
-
-static int DrawThreeFive(Circuit *ci, ThreeFive *d)
-{
- int polys = 0;
- GLfloat shine = 40;
- GLfloat const dark[] = {0.3, 0.3, 0.3, 0};
- GLfloat const light[] = {0.6, 0.6, 0.6, 0};
- GLfloat const cream[] = {0.8, 0.8, 0.6, 0};
- GLfloat const spec[] = {0.7, 0.7, 0.7, 0};
-
- glPushMatrix();
- glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cream);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
-
- glTranslatef(-2.0, 0, 0);
- polys += createCylinder(ci, 0.7, 0.2, 0, 0);
- glTranslatef(0.7, 0, 0);
- polys += createCylinder(ci, 1.3, 0.4, 1, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light);
- glTranslatef(1.3, 0, 0);
- polys += createCylinder(ci, 1.3, 0.2, 0, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, dark);
- glTranslatef(0.65, 0, 0);
- polys += createCylinder(ci, 0.15, 0.21, 0, 0);
- glTranslatef(0.3, 0, 0);
- polys += createCylinder(ci, 0.15, 0.21, 0, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light);
- glTranslatef(0.4, 0, 0);
- polys += sphere(ci, 0.23, 7, 7, 0, 5, 0, 7);
-
- glPopMatrix();
- return polys;
-}
-
-static int DrawDiode(Circuit *ci, Diode *d)
-{
- int polys = 0;
- GLfloat shine = 40;
- GLfloat col[] = {0.3, 0.3, 0.3, 0};
- GLfloat spec[] = {0.7, 0.7, 0.7, 0};
-
- glPushMatrix();
- glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glTranslatef(-4, 0, 0);
- polys += wire(ci, 3);
- glTranslatef(3, 0, 0);
- polys += bandedCylinder(ci, 0.3, 1.5, d->r, d->g, d->b, &(d->band), 1);
- glTranslatef(1.5, 0, 0);
- polys += wire(ci, 3);
- glPopMatrix();
- return polys;
-}
-
-static int Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
- GLfloat t)
-{
- int polys = 0;
- GLfloat yh;
- GLfloat xw;
- GLfloat zt;
-
- yh = y+h; xw = x+w; zt = z - t;
-
- glBegin(GL_QUADS); /* front */
- glNormal3f(0, 0, 1);
- glVertex3f(x, y, z);
- glVertex3f(x, yh, z);
- glVertex3f(xw, yh, z);
- glVertex3f(xw, y, z);
- polys++;
- /* back */
- glNormal3f(0, 0, -1);
- glVertex3f(x, y, zt);
- glVertex3f(x, yh, zt);
- glVertex3f(xw, yh, zt);
- glVertex3f(xw, y, zt);
- polys++;
- /* top */
- glNormal3f(0, 1, 0);
- glVertex3f(x, yh, z);
- glVertex3f(x, yh, zt);
- glVertex3f(xw, yh, zt);
- glVertex3f(xw, yh, z);
- polys++;
- /* bottom */
- glNormal3f(0, -1, 0);
- glVertex3f(x, y, z);
- glVertex3f(x, y, zt);
- glVertex3f(xw, y, zt);
- glVertex3f(xw, y, z);
- polys++;
- /* left */
- glNormal3f(-1, 0, 0);
- glVertex3f(x, y, z);
- glVertex3f(x, y, zt);
- glVertex3f(x, yh, zt);
- glVertex3f(x, yh, z);
- polys++;
- /* right */
- glNormal3f(1, 0, 0);
- glVertex3f(xw, y, z);
- glVertex3f(xw, y, zt);
- glVertex3f(xw, yh, zt);
- glVertex3f(xw, yh, z);
- polys++;
- glEnd();
- return polys;
-}
-
-/* IC pins */
-
-static int ICLeg(GLfloat x, GLfloat y, GLfloat z, int dir)
-{
- int polys = 0;
- if (dir) {
- polys += Rect(x-0.1, y, z, 0.1, 0.1, 0.02);
- polys += Rect(x-0.1, y, z, 0.02, 0.1, 0.1);
- polys += Rect(x-0.1, y+0.03, z-0.1, 0.02, 0.05, 0.3);
- } else {
- polys += Rect(x, y, z, 0.1, 0.1, 0.02);
- polys += Rect(x+0.8*0.1, y, z, 0.02, 0.1, 0.1);
- polys += Rect(x+0.8*0.1, y+0.03, z-0.1, 0.02, 0.05, 0.3);
- }
- return polys;
-}
-
-
-static int DrawIC(Circuit *ci, IC *c)
-{
- int polys = 0;
- GLfloat w, h, d;
- int z;
- GLfloat col[] = {0.1, 0.1, 0.1, 0};
- GLfloat col2[] = {0.2, 0.2, 0.2, 0};
- GLfloat spec[] = {0.6, 0.6, 0.6, 0};
- GLfloat shine = 40;
- GLfloat lspec[] = {0.6, 0.6, 0.6, 0};
- GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
- GLfloat lshine = 40;
-
- glPushMatrix();
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
- switch(c->pins) {
- case 8:
- w = 1.0; h = 1.5;
- break;
- case 14:
- w = 1.0; h = 3;
- break;
- case 16:
- w = 1.0; h = 3;
- break;
- case 24:
- default:
- w = 1.5; h = 3.5;
- break;
- }
- w = w/2; h = h/2;
- glEnable(GL_POLYGON_OFFSET_FILL);
- glPolygonOffset(1.0, 1.0);
- glBegin(GL_QUADS);
- glNormal3f(0, 0, 1);
- glVertex3f(w, h, 0.1);
- glVertex3f(w, -h, 0.1);
- glVertex3f(-w, -h, 0.1);
- glVertex3f(-w, h, 0.1);
- polys++;
- glNormal3f(0, 0, -1);
- glVertex3f(w, h, -0.1);
- glVertex3f(w, -h, -0.1);
- glVertex3f(-w, -h, -0.1);
- glVertex3f(-w, h, -0.1);
- polys++;
- glNormal3f(1, 0, 0);
- glVertex3f(w, h, -0.1);
- glVertex3f(w, -h, -0.1);
- glVertex3f(w, -h, 0.1);
- glVertex3f(w, h, 0.1);
- polys++;
- glNormal3f(0, -1, 0);
- glVertex3f(w, -h, -0.1);
- glVertex3f(w, -h, 0.1);
- glVertex3f(-w, -h, 0.1);
- glVertex3f(-w, -h, -0.1);
- polys++;
- glNormal3f(-1, 0, 0);
- glVertex3f(-w, h, -0.1);
- glVertex3f(-w, h, 0.1);
- glVertex3f(-w, -h, 0.1);
- glVertex3f(-w, -h, -0.1);
- polys++;
- glNormal3f(0, -1, 0);
- glVertex3f(-w, h, -0.1);
- glVertex3f(w, h, -0.1);
- glVertex3f(w, h, 0.1);
- glVertex3f(-w, h, 0.1);
- polys++;
- glEnd();
- glDisable(GL_POLYGON_OFFSET_FILL);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
-
- {
- GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
- GLfloat s = 0.015;
- XCharStruct e;
- texture_string_metrics (ci->font, c->text, &e, 0, 0);
-
- glPushMatrix();
- glTranslatef (0, 0, 0.1);
- glRotatef (90, 0, 0, 1);
- glScalef (s, s, s);
- glTranslatef (-w/2, 0, 0);
- glColor4fv (texfg);
- print_texture_string (ci->font, c->text);
- glEnable(GL_LIGHTING);
- glPopMatrix();
- }
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- d = (h*2-0.1) / c->pins;
- d*=2;
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lcol);
- glMaterialfv(GL_FRONT, GL_SPECULAR, lspec);
- glMaterialfv(GL_FRONT, GL_SHININESS, &lshine);
- for (z = 0 ; z < c->pins/2 ; z++) {
- polys += ICLeg(w, -h + z*d + d/2, 0, 0);
- }
- for (z = 0 ; z < c->pins/2 ; z++) {
- polys += ICLeg(-w, -h + z*d + d/2, 0, 1);
- }
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col2);
- glTranslatef(-w+0.3, h-0.3, 0.1);
- glRotatef(90, 0, 1, 0);
- polys += circle(ci, 0.1, 7, 0);
- glPopMatrix();
- return polys;
-}
-
-static int DrawDisp(Circuit *ci, Disp *d)
-{
- int polys = 0;
- GLfloat col[] = {0.8, 0.8, 0.8, 1.0}; /* body colour */
- GLfloat front[] = {0.2, 0.2, 0.2, 1.0}; /* front colour */
- GLfloat on[] = {0.9, 0, 0, 1}; /* 'on' segment */
- GLfloat off[] = {0.3, 0, 0, 1}; /* 'off' segment */
- int i, j, k;
- GLfloat x, y; /* for the pins */
- GLfloat spec[] = {0.6, 0.6, 0.6, 0};
- GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
- GLfloat shine = 40;
- static const GLfloat vdata_h[6][2] = {
- {0, 0},
- {0.1, 0.1},
- {0.9, 0.1},
- {1, 0},
- {0.9, -0.1},
- {0.1, -0.1}
- };
- static const GLfloat vdata_v[6][2] = {
- {0.27, 0},
- {0.35, -0.1},
- {0.2, -0.9},
- {0.1, -1},
- {0, -0.9},
- {0.15, -0.15}
- };
-
- static const GLfloat seg_start[7][2] = {
- {0.55, 2.26},
- {1.35, 2.26},
- {1.2, 1.27},
- {0.25, 0.25},
- {0.06, 1.25},
- {0.25, 2.25},
- {0.39, 1.24}
- };
-
- static const int nums[10][7] = {
- {1, 1, 1, 1, 1, 1, 0}, /* 0 */
- {0, 1, 1, 0, 0, 0, 0}, /* 1 */
- {1, 1, 0, 1, 1, 0, 1}, /* 2 */
- {1, 1, 1, 1, 0, 0, 1}, /* 3 */
- {0, 1, 1, 0, 0, 1, 1}, /* 4 */
- {1, 0, 1, 1, 0, 1, 1}, /* 5 */
- {1, 0, 1, 1, 1, 1, 1}, /* 6 */
- {1, 1, 1, 0, 0, 0, 0}, /* 7 */
- {1, 1, 1, 1, 1, 1, 1}, /* 8 */
- {1, 1, 1, 0, 0, 1, 1} /* 9 */
- };
-
- glTranslatef(-0.9, -1.8, 0);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- polys += Rect(0, 0, -0.01, 1.8, 2.6, 0.7);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, front);
- glBegin(GL_QUADS);
- glVertex2f(-0.05, -0.05);
- glVertex2f(-0.05, 2.65);
- glVertex2f(1.85, 2.65);
- glVertex2f(1.85, -0.05);
- polys++;
- glEnd();
- glDisable(GL_LIGHTING); /* lit segments dont need light */
- if (!seven && (random() % 30) == 19) { /* randomly change value */
- d->value = random() % 10;
- }
- for (j = 0 ; j < 7 ; j++) { /* draw the segments */
- GLfloat xx[6], yy[6];
- if (nums[d->value][j])
- glColor3fv(on);
- else
- glColor3fv(off);
- for (k = 0 ; k < 6 ; k++) {
- if (j == 0 || j == 3 || j == 6) {
- xx[k] = seg_start[j][0] + vdata_h[k][0];
- yy[k] = seg_start[j][1] + vdata_h[k][1];
- } else {
- xx[k] = seg_start[j][0] + vdata_v[k][0];
- yy[k] = seg_start[j][1] + vdata_v[k][1];
- }
- }
- glBegin(GL_POLYGON);
- for(i = 0 ; i < 6 ; i++) {
- glVertex3f(xx[i], yy[i], 0.01);
- }
- polys++;
- glEnd();
- }
- glColor3fv(on);
- glPointSize(4);
- glBegin(GL_POINTS);
- glVertex3f(1.5, 0.2, 0.01);
- polys++;
- glEnd();
- glEnable(GL_LIGHTING);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lcol);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
- for (x = 0.35 ; x <= 1.5 ; x+= 1.15) {
- for ( y = 0.2 ; y <= 2.4 ; y += 0.3) {
- polys += ICLeg(x, y, -0.7, 1);
- }
- }
- return polys;
-}
-
-static int HoledRectangle(Circuit *ci,
- GLfloat w, GLfloat h, GLfloat d, GLfloat radius,
- int p)
-{
- int polys = 0;
- int step, a;
- GLfloat x1, y1, x2, y2;
- GLfloat yr, yr1, xr, xr1, side, side1;
- GLfloat nx, ny;
-
- step = 360 / p;
- x1 = radius; y1 = 0;
- xr1 = w/2; yr1 = 0;
- side = w/2;
- side1 = h/2;
- glBegin(GL_QUADS);
- for (a = 0 ; a <= 360 ; a+= step) {
- y2=radius*(float)ci->sin_table[(int)a];
- x2=radius*(float)ci->cos_table[(int)a];
-
- if (a < 45 || a > 315) {
- xr = side;
- yr = side1 * ci->tan_table[a];
- nx = 1; ny = 0;
- } else if (a <= 135 || a >= 225) {
- xr = side/ci->tan_table[a];
- if (a >= 225) {
- yr = -side1;
- xr = 0 - xr;
- nx = 0; ny = -1;
- } else {
- yr = side1;
- nx = 0; ny = 1;
- }
- } else {
- xr = -side;
- yr = -side1 * ci->tan_table[a];
- nx = -1; ny = 0;
- }
-
- glNormal3f(-x1, -y1, 0); /* cylinder */
- glVertex3f(x1,y1,0);
- glVertex3f(x1,y1,-d);
- glVertex3f(x2,y2,-d);
- glVertex3f(x2,y2,0);
- polys++;
-
- glNormal3f(0, 0, 1); /* front face */
- glVertex3f(x1,y1,0);
- glVertex3f(xr1, yr1, 0);
- glVertex3f(xr, yr, 0);
- glVertex3f(x2, y2, 0);
- polys++;
-
- glNormal3f(nx, ny, 0); /* side */
- glVertex3f(xr, yr, 0);
- glVertex3f(xr, yr, -d);
- glVertex3f(xr1, yr1, -d);
- glVertex3f(xr1, yr1, 0);
- polys++;
-
- glNormal3f(0, 0, -1); /* back */
- glVertex3f(xr, yr, -d);
- glVertex3f(x2, y2, -d);
- glVertex3f(x1, y1, -d);
- glVertex3f(xr1, yr1, -d);
- polys++;
-
- x1=x2;
- y1=y2;
- xr1 = xr; yr1 = yr;
- }
- glEnd();
- return polys;
-}
-
-static int DrawTransistor(Circuit *ci, Transistor *t)
-{
- int polys = 0;
- GLfloat col[] = {0.3, 0.3, 0.3, 1.0};
- GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
- GLfloat nospec[] = {0.4, 0.4, 0.4, 1.0};
- GLfloat shin = 30;
-
- glPushMatrix();
- glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- if (t->type == 1) { /* TO-92 style */
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
- glRotatef(90, 0, 1, 0);
- glRotatef(90, 0, 0, 1);
- polys += createCylinder(ci, 1.0, 0.4, 1, 1);
- polys += Rect(0, -0.2, 0.4, 1, 0.2, 0.8);
-/* Draw the markings */
-
- {
- GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
- GLfloat s = 0.015;
- XCharStruct e;
- int w;
- texture_string_metrics (ci->font, t->text, &e, 0, 0);
- w = e.width;
- glPushMatrix();
- glRotatef (90, 1, 0, 0);
- glTranslatef (0.5, -0.05, 0.21);
- glScalef (s, s, s);
- glTranslatef (-w/2, 0, 0);
- glColor4fv (texfg);
- print_texture_string (ci->font, t->text);
- glEnable (GL_LIGHTING);
- glPopMatrix();
- }
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- glDepthMask(GL_TRUE);
- glTranslatef(-2, 0, -0.2);
- polys += wire(ci, 2);
- glTranslatef(0, 0, 0.2);
- polys += wire(ci, 2);
- glTranslatef(0, 0, 0.2);
- polys += wire(ci, 2);
- } else if (t->type == 0) { /* TO-220 Style */
- polys += Rect(0, 0, 0, 1.5, 1.5, 0.5);
- {
- GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
- GLfloat s = 0.015;
- XCharStruct e;
- int w;
- texture_string_metrics (ci->font, t->text, &e, 0, 0);
- w = e.width;
- glPushMatrix();
- glTranslatef (0.75, 0.75, 0.01);
- glScalef (s, s, s);
- glTranslatef (-w/2, 0, 0);
- glColor4fv (texfg);
- print_texture_string (ci->font, t->text);
- glEnable (GL_LIGHTING);
- glPopMatrix();
- }
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- glDepthMask(GL_TRUE);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
- polys += Rect(0, 0, -0.5, 1.5, 1.5, 0.30);
- if (!glIsEnabled(GL_NORMALIZE)) glEnable(GL_NORMALIZE);
- glTranslatef(0.75, 1.875, -0.55);
- polys += HoledRectangle(ci, 1.5, 0.75, 0.25, 0.2, 8);
- glMaterialfv(GL_FRONT, GL_SPECULAR, nospec);
- glTranslatef(-0.375, -1.875, 0);
- glRotatef(90, 0, 0, -1);
- polys += wire(ci, 2);
- glTranslatef(0, 0.375, 0);
- polys += wire(ci, 2);
- glTranslatef(0, 0.375, 0);
- polys += wire(ci, 2);
- } else { /* SMC transistor */
-/* Draw the body */
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
- glTranslatef(-0.5, -0.25, 0.1);
- polys += Rect(0, 0, 0, 1, 0.5, 0.2);
-/* Draw the markings */
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glDepthMask(GL_FALSE);
- glBegin (GL_QUADS);
- glNormal3f(0, 0, 1);
- glTexCoord2f(0, 1);
- glVertex3f(0.2, 0, 0.01);
- glTexCoord2f(1, 1);
- glVertex3f(0.8, 0, 0.01);
- glTexCoord2f(1, 0);
- glVertex3f(0.8, 0.5, 0.01);
- glTexCoord2f(0, 0);
- glVertex3f(0.2, 0.5, 0.01);
- polys++;
- glEnd();
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- glDepthMask(GL_TRUE);
-/* Now draw the legs */
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
- polys += Rect(0.25, -0.1, -0.05, 0.1, 0.1, 0.2);
- polys += Rect(0.75, -0.1, -0.05, 0.1, 0.1, 0.2);
- polys += Rect(0.5, 0.5, -0.05, 0.1, 0.1, 0.2);
- polys += Rect(0.25, -0.2, -0.2, 0.1, 0.15, 0.1);
- polys += Rect(0.75, -0.2, -0.2, 0.1, 0.15, 0.1);
- polys += Rect(0.5, 0.5, -0.2, 0.1, 0.15, 0.1);
- }
- glPopMatrix();
- return polys;
-}
-
-static Component * NewComponent(ModeInfo *mi)
-{
- Circuit *ci = &circuit[MI_SCREEN(mi)];
- Component *c;
- float rnd;
-
- c = malloc(sizeof(Component));
- c->angle = RAND_RANGE(0,360);
- rnd = f_rand();
- if (rnd < 0.25) { /* come from the top */
- c->y = ci->YMAX/2;
- c->x = RAND_RANGE(0, ci->XMAX) - ci->XMAX/2;
- if (c->x > 0)
- c->dx = 0 - RAND_RANGE(0.5, 2);
- else
- c->dx = RAND_RANGE(0.5, 2);
- c->dy = 0 - RAND_RANGE(0.5, 2);
- } else if (rnd < 0.5) { /* come from the bottom */
- c->y = 0 - ci->YMAX/2;
- c->x = RAND_RANGE(0, ci->XMAX) - ci->XMAX/2;
- if (c->x > 0)
- c->dx = 0 - RAND_RANGE(0.5, 2);
- else
- c->dx = RAND_RANGE(0.5, 2);
- c->dy = RAND_RANGE(0.5, 2);
- } else if (rnd < 0.75) { /* come from the left */
- c->x = 0 - ci->XMAX/2;
- c->y = RAND_RANGE(0, ci->YMAX) - ci->YMAX/2;
- c->dx = RAND_RANGE(0.5, 2);
- if (c->y > 0)
- c->dy = 0 - RAND_RANGE(0.5, 2);
- else
- c->dy = RAND_RANGE(0.5, 2);
- } else { /* come from the right */
- c->x = ci->XMAX/2;
- c->y = RAND_RANGE(0, ci->YMAX) - ci->YMAX/2;
- c->dx = 0 - RAND_RANGE(0.5, 2);
- if (c->y > 0)
- c->dy = 0 - RAND_RANGE(0.5, 2);
- else
- c->dy = RAND_RANGE(0.5, 2);
- }
- c->z = RAND_RANGE(0, 7) - 9;
- c->rotx = f_rand();
- c->roty = f_rand();
- c->rotz = f_rand();
- c->drot = f_rand() * 3;
- c->rdeg = 0;
- c->dz = f_rand()*2 - 1;
- c->norm = 0;
- c->alpha = 0; /* explicitly set to 1 later */
- rnd = random() % 11;
- if (rnd < 1) {
- c->c = NewResistor();
- c->type = 0;
- if (f_rand() < 0.4)
- c->norm = 1; /* some resistors shine */
- } else if (rnd < 2) {
- c->c = NewDiode();
- if (f_rand() < 0.4)
- c->norm = 1; /* some diodes shine */
- c->type = 1;
- } else if (rnd < 3) {
- c->c = NewTransistor(mi);
- c->norm = 1;
- c->type = 2;
- } else if (rnd < 4) {
- c->c = NewCapacitor(ci);
- c->norm = 1;
- c->type = 4;
- } else if (rnd < 5) {
- c->c = NewIC(mi);
- c->type = 5;
- c->norm = 1;
- } else if (rnd < 6) {
- c->c = NewLED(ci);
- c->type = 3;
- c->norm = 1;
- c->alpha = 1;
- } else if (rnd < 7) {
- c->c = NewFuse(ci);
- c->norm = 1;
- c->type = 7;
- c->alpha = 1;
- } else if (rnd < 8) {
- c->c = NewRCA(ci);
- c->norm = 1;
- c->type = 8;
- } else if (rnd < 9) {
- c->c = NewThreeFive(ci);
- c->norm = 1;
- c->type = 9;
- } else if (rnd < 10) {
- c->c = NewSwitch(ci);
- c->norm = 1;
- c->type = 10;
- } else {
- c->c = NewDisp(ci);
- c->type = 6;
- }
- return c;
-}
-
-static Transistor *NewTransistor(ModeInfo *mi)
-{
- Transistor *t;
-
- t = malloc(sizeof(Transistor));
- t->type = (random() % 3);
- if (t->type == 0) {
- t->text = transistortypes[random() % countof(transistortypes)];
- } else if (t->type == 2) {
- t->text = smctypes[random() % countof(smctypes)];
- } else if (t->type == 1) {
- t->text = to92types[random() % countof(to92types)];
- }
- return t;
-}
-
-static Capacitor *NewCapacitor(Circuit *ci)
-{
- Capacitor *c;
-
- c = malloc(sizeof(Capacitor));
- c->type = (f_rand() < 0.5);
- if (!c->type) {
- c->length = RAND_RANGE(0.5, 1);
- c->width = RAND_RANGE(0.5, 1);
- } else {
- c->width = RAND_RANGE(0.3, 1);
- }
- return c;
-}
-
-/* 7 segment display */
-
-static Disp *NewDisp(Circuit *ci)
-{
- Disp *d;
-
- d = malloc(sizeof(Disp));
- if (seven)
- d->value = 7;
- else
- d->value = RAND_RANGE(0, 10);
- return d;
-}
-
-
-static IC *NewIC(ModeInfo *mi)
-{
- IC *c;
- int pins;
- const char *val;
- int types[countof(ictypes)], i, n = 0;
-
- c = malloc(sizeof(IC));
- c->type = 0;
- switch((int)RAND_RANGE(0,4)) {
- case 0:
- pins = 8;
- break;
- case 1:
- pins = 14;
- break;
- case 2:
- pins = 16;
- break;
- case 3:
- default:
- pins = 24;
- break;
- }
- for (i = 0 ; i < countof(ictypes) ; i++) {
- if (ictypes[i].pins == pins) {
- types[n] = i;
- n++;
- }
- }
-
- if (n > countof(types)) abort();
- val = ictypes[types[random() % n]].val;
- sprintf(c->text, "%s\n%02d%02d", val,
- (int)RAND_RANGE(80, 100), (int)RAND_RANGE(1,53));
- c->pins = pins;
- return c;
-}
-
-static LED *NewLED(Circuit *ci)
-{
- LED *l;
- float r;
-
- l = malloc(sizeof(LED));
- r = f_rand();
- l->light = 0;
- if (!ci->light && (f_rand() < 0.4)) {
- ci->light = 1;
- l->light = 1;
- }
- if (r < 0.2) {
- l->r = 0.9; l->g = 0; l->b = 0;
- } else if (r < 0.4) {
- l->r = 0.3; l->g = 0.9; l->b = 0;
- } else if (r < 0.6) {
- l->r = 0.8; l->g = 0.9; l->b = 0;
- } else if (r < 0.8) {
- l->r = 0.0; l->g = 0.2; l->b = 0.8;
- } else {
- l->r = 0.9, l->g = 0.55, l->b = 0;
- }
- return l;
-}
-
-static Fuse *NewFuse(Circuit *ci)
-{
- Fuse *f;
-
- f = malloc(sizeof(Fuse));
- return f;
-}
-
-static RCA *NewRCA(Circuit *ci)
-{
- RCA *r;
-
- r = malloc(sizeof(RCA));
- r->col = (random() % 10 < 5);
- return r;
-}
-
-static ThreeFive *NewThreeFive(Circuit *ci)
-{
- ThreeFive *r;
-
- r = malloc(sizeof(ThreeFive));
- return r;
-}
-
-static Switch *NewSwitch(Circuit *ci)
-{
- Switch *s;
-
- s = malloc(sizeof(Switch));
- s->position = 0;
- return s;
-}
-
-static Diode *NewDiode(void)
-{
- Band *b;
- Diode *ret;
-
- ret = malloc(sizeof(Diode));
- b = malloc(sizeof(Band));
- b->pos = 0.8;
- b->len = 0.1;
- if (f_rand() < 0.5) {
- b->r = 1;
- b->g = 1;
- b->b = 1;
- ret->r = 0.7; ret->g = 0.1 ; ret->b = 0.1;
- } else {
- b->r = 1;
- b->g = 1;
- b->b = 1;
- ret->r = 0.2; ret->g = 0.2 ; ret->b = 0.2;
- }
- ret->band = b;
- return ret;
-}
-
-
-static Resistor * NewResistor(void)
-{
- int v, m, t; /* value, multiplier, tolerance */
- Resistor *ret;
-
- v = RAND(9);
- m = RAND(5);
- t = (RAND(10) < 5) ? 10 : 11;
- ret = malloc(sizeof(Resistor));
-
- if (seven) {
- ret->b[0] = ret->b[1] = ret->b[2] = 7;
- } else {
- ret->b[0] = values[v][0];
- ret->b[1] = values[v][1];
- ret->b[2] = m;
- }
- ret->b[3] = t;
-
- return ret;
-}
-
-static void makebandlist(Circuit *ci)
-{
- int i;
- GLfloat col[] = {0,0,0,0};
- GLfloat spec[] = {0.8,0.8,0.8,0};
- GLfloat shine = 40;
-
- for (i = 0 ; i < 12 ; i++) {
- ci->band_list[i] = glGenLists(1);
- glNewList(ci->band_list[i], GL_COMPILE);
- col[0] = colorcodes[i][0];
- col[1] = colorcodes[i][1];
- col[2] = colorcodes[i][2];
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &shine);
- ci->band_list_polys[i] = createCylinder(ci, 0.1, 0.42, 0, 0);
- glEndList();
- }
-}
-
-
-static int bandedCylinder(Circuit *ci,
- float radius, float l,
- GLfloat r, GLfloat g, GLfloat bl,
- Band **b, int nbands)
-{
- int polys = 0;
- int n; /* band number */
- GLfloat col[] = {0,0,0,0};
-
- col[0] = r; col[1] = g; col[2] = bl;
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- polys += createCylinder(ci, l, radius, 1, 0); /* body */
- for (n = 0 ; n < nbands ; n++) {
- glPushMatrix();
- glTranslatef(b[n]->pos*l, 0, 0);
- col[0] = b[n]->r; col[1] = b[n]->g; col[2] = b[n]->b;
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
- polys += createCylinder(ci, b[n]->len*l, radius*1.05, 0, 0); /* band */
- glPopMatrix();
- }
- return polys;
-}
-
-static int drawgrid(Circuit *ci)
-{
- int polys = 0;
- GLfloat x, y;
- GLfloat col3[] = {0, 0.8, 0};
-
- if (!ci->draw_s) {
- if (f_rand() < ((rotatespeed > 0) ? 0.05 : 0.01)) {
- ci->draw_sdir = RAND_RANGE(0, 4);
- ci->draw_ds = RAND_RANGE(0.4, 0.8);
- switch (ci->draw_sdir) {
- case 0:
- ci->draw_sx = -ci->XMAX/2;
- ci->draw_sy = ((int)RAND_RANGE(0, ci->YMAX/2))*2 - ci->YMAX/2;
- break;
- case 1:
- ci->draw_sx = ci->XMAX/2;
- ci->draw_sy = ((int)RAND_RANGE(0, ci->YMAX/2))*2 - ci->YMAX/2;
- break;
- case 2:
- ci->draw_sy = ci->YMAX/2;
- ci->draw_sx = ((int)RAND_RANGE(0, ci->XMAX/2))*2 - ci->XMAX/2;
- break;
- case 3:
- ci->draw_sy = -ci->YMAX/2;
- ci->draw_sx = ((int)RAND_RANGE(0, ci->XMAX/2))*2 - ci->XMAX/2;
- break;
- }
- ci->draw_s = 1;
- }
- } else if (rotatespeed <= 0) {
- if (ci->grid_col[1] < 0.25) {
- ci->grid_col[1] += 0.025; ci->grid_col[2] += 0.005;
- ci->grid_col2[1] += 0.015 ; ci->grid_col2[2] += 0.005;
- }
- }
-
- glDisable(GL_LIGHTING);
- if (ci->draw_s) {
- glColor3fv(col3);
- glPushMatrix();
- glTranslatef(ci->draw_sx, ci->draw_sy, -10);
- polys += sphere(ci, 0.1, 10, 10, 0, 10, 0, 10);
- if (ci->draw_sdir == 0)
- glTranslatef(-ci->draw_ds, 0, 0);
- if (ci->draw_sdir == 1)
- glTranslatef(ci->draw_ds, 0, 0);
- if (ci->draw_sdir == 2)
- glTranslatef(0, ci->draw_ds, 0);
- if (ci->draw_sdir == 3)
- glTranslatef(0, -ci->draw_ds, 0);
- polys += sphere(ci, 0.05, 10, 10, 0, 10, 0, 10);
- glPopMatrix();
- if (ci->draw_sdir == 0) {
- ci->draw_sx += ci->draw_ds;
- if (ci->draw_sx > ci->XMAX/2)
- ci->draw_s = 0;
- }
- if (ci->draw_sdir == 1) {
- ci->draw_sx -= ci->draw_ds;
- if (ci->draw_sx < -ci->XMAX/2)
- ci->draw_s = 0;
- }
- if (ci->draw_sdir == 2) {
- ci->draw_sy -= ci->draw_ds;
- if (ci->draw_sy < ci->YMAX/2)
- ci->draw_s = 0;
- }
- if (ci->draw_sdir == 3) {
- ci->draw_sy += ci->draw_ds;
- if (ci->draw_sy > ci->YMAX/2)
- ci->draw_s = 0;
- }
- } else if (rotatespeed <= 0) {
- if (ci->grid_col[1] > 0) {
- ci->grid_col[1] -= 0.0025; ci->grid_col[2] -= 0.0005;
- ci->grid_col2[1] -= 0.0015 ; ci->grid_col2[2] -= 0.0005;
- }
- }
- for (x = -ci->XMAX/2 ; x <= ci->XMAX/2 ; x+= 2) {
- glColor3fv(ci->grid_col);
- glBegin(GL_LINES);
- glVertex3f(x, ci->YMAX/2, -10);
- glVertex3f(x, -ci->YMAX/2, -10);
- glColor3fv(ci->grid_col2);
- glVertex3f(x-0.02, ci->YMAX/2, -10);
- glVertex3f(x-0.02, -ci->YMAX/2, -10);
- glVertex3f(x+0.02, ci->YMAX/2, -10);
- glVertex3f(x+0.02, -ci->YMAX/2, -10);
- glEnd();
- }
- for (y = -ci->YMAX/2 ; y <= ci->YMAX/2 ; y+= 2) {
- glColor3fv(ci->grid_col);
- glBegin(GL_LINES);
- glVertex3f(-ci->XMAX/2, y, -10);
- glVertex3f(ci->XMAX/2, y, -10);
- glColor3fv(ci->grid_col2);
- glVertex3f(-ci->XMAX/2, y-0.02, -10);
- glVertex3f(ci->XMAX/2, y-0.02, -10);
- glVertex3f(-ci->XMAX/2, y+0.02, -10);
- glVertex3f(ci->XMAX/2, y+0.02, -10);
- glEnd();
- }
- glEnable(GL_LIGHTING);
- return polys;
-}
-
-static void display(ModeInfo *mi)
-{
- Circuit *ci = &circuit[MI_SCREEN(mi)];
- GLfloat light_sp[] = {0.8, 0.8, 0.8, 1.0};
- GLfloat black[] = {0, 0, 0, 1.0};
- int j;
-
- mi->polygon_count = 0;
-
- if (ci->display_i == 0) {
- for (ci->display_i = 0 ; ci->display_i < maxparts ; ci->display_i++) {
- ci->components[ci->display_i] = NULL;
- }
- }
- glEnable(GL_LIGHTING);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- gluLookAt(ci->viewer[0], ci->viewer[1], ci->viewer[2],
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
- glPushMatrix();
- glRotatef(ci->rotate_angle, 0, 0, 1);
- ci->rotate_angle += 0.01 * (float)rotatespeed;
- if (ci->rotate_angle >= 360) ci->rotate_angle = 0;
-
- glLightfv(GL_LIGHT0, GL_POSITION, ci->lightpos);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_sp);
- glLighti(GL_LIGHT0, GL_CONSTANT_ATTENUATION, (GLfloat)1);
- glLighti(GL_LIGHT0, GL_LINEAR_ATTENUATION, (GLfloat)0.5);
- glLighti(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, (GLfloat)0);
-
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (h, h, h);
- h = 2;
- glScalef (h, h, h);
- }
-# else
- {
- /* Don't understand why this clause doesn't work on mobile, but it
- doesn't. */
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- s = 1/s;
- glScalef (s, s, s);
- }
-# endif
-
- mi->polygon_count += drawgrid(ci);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light_sp);
- if (f_rand() < 0.05) {
- for (j = 0 ; j < maxparts ; j++) {
- if (ci->components[j] == NULL) {
- ci->components[j] = NewComponent(mi);
- j = maxparts;
- }
- }
- reorder(&ci->components[0]);
- }
- for (j = 0 ; j < maxparts ; j++) {
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, black);
- glMaterialfv(GL_FRONT, GL_EMISSION, black);
- glMaterialfv(GL_FRONT, GL_SPECULAR, black);
- if (ci->components[j] != NULL) {
- if (DrawComponent(ci, ci->components[j], &mi->polygon_count)) {
- free(ci->components[j]); ci->components[j] = NULL;
- }
- }
- }
- glPopMatrix();
- glFlush();
-}
-
-/* ensure transparent components are at the end */
-static void reorder(Component *c[])
-{
- int i, j, k;
- Component *c1[MAX_COMPONENTS];
- Component *c2[MAX_COMPONENTS];
-
- j = 0;
- for (i = 0 ; i < maxparts ; i++) { /* clear old matrix */
- c1[i] = NULL;
- c2[i] = NULL;
- }
- for (i = 0 ; i < maxparts ; i++) {
- if (c[i] == NULL) continue;
- if (c[i]->alpha) { /* transparent parts go to c1 */
- c1[j] = c[i];
- j++;
- } else { /* opaque parts go to c2 */
- c2[i] = c[i];
- }
- }
- for (i = 0 ; i < maxparts ; i++) { /* clear old matrix */
- c[i] = NULL;
- }
- k = 0;
- for (i = 0 ; i < maxparts ; i++) { /* insert opaque part */
- if (c2[i] != NULL) {
- c[k] = c2[i];
- k++;
- }
- }
- for (i = 0 ; i < j ; i++) { /* insert transparent parts */
- c[k] = c1[i];
- k++;
- }
-}
-
-ENTRYPOINT void reshape_circuit(ModeInfo *mi, int width, int height)
-{
- Circuit *ci = &circuit[MI_SCREEN(mi)];
- int y = 0;
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0,y,(GLint)width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0,1.0,-h,h,1.5,35.0);
- glMatrixMode(GL_MODELVIEW);
- ci->win_h = height;
- ci->win_w = width;
- ci->YMAX = ci->XMAX * h;
-}
-
-
-ENTRYPOINT void init_circuit(ModeInfo *mi)
-{
-int screen = MI_SCREEN(mi);
-Circuit *ci;
-
- MI_INIT(mi, circuit);
- ci = &circuit[screen];
- ci->window = MI_WINDOW(mi);
-
- ci->XMAX = ci->YMAX = 50;
- ci->viewer[2] = 14;
- ci->lightpos[0] = 7;
- ci->lightpos[1] = 7;
- ci->lightpos[2] = 15;
- ci->lightpos[3] = 1;
-
- ci->grid_col[1] = 0.25;
- ci->grid_col[2] = 0.05;
- ci->grid_col2[1] = 0.125;
- ci->grid_col2[2] = 0.05;
-
- ci->font = load_texture_font (MI_DISPLAY(mi), "componentFont");
-
- if (maxparts >= MAX_COMPONENTS)
- maxparts = MAX_COMPONENTS-1;
-
- if ((ci->glx_context = init_GL(mi)) != NULL) {
- reshape_circuit(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
- if (uselight == 0)
- ci->light = 1;
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- make_tables(ci);
- makebandlist(ci);
-
-}
-
-ENTRYPOINT void draw_circuit(ModeInfo *mi)
-{
- Circuit *ci = &circuit[MI_SCREEN(mi)];
- Window w = MI_WINDOW(mi);
- Display *disp = MI_DISPLAY(mi);
-
- if (!ci->glx_context)
- return;
-
- glXMakeCurrent(disp, w, *ci->glx_context);
-
- display(mi);
-
- if(mi->fps_p) do_fps(mi);
- glFinish();
- glXSwapBuffers(disp, w);
-}
-
-ENTRYPOINT void free_circuit(ModeInfo *mi)
-{
- Circuit *ci = &circuit[MI_SCREEN(mi)];
- int i;
- if (!ci->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *ci->glx_context);
- if (ci->font) free_texture_font (ci->font);
- for (i = 0 ; i < 12 ; i++)
- if (glIsList(ci->band_list[i])) glDeleteLists(ci->band_list[i], 1);
- FreeAllGL(mi);
-}
-
-XSCREENSAVER_MODULE ("Circuit", circuit)
-
-#endif
diff --git a/hacks/glx/circuit.man b/hacks/glx/circuit.man
deleted file mode 100644
index d76db94..0000000
--- a/hacks/glx/circuit.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "5-May-2004" "X Version 11"
-.SH NAME
-circuit \- animates a number of 3D electronic components.
-.SH SYNOPSIS
-.B circuit
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-parts \fInumber\fP]
-[\-no-spin]
-[\-rotate]
-[\-speed \fInumber\fP]
-[\-no-light]
-[\-fps]
-.SH DESCRIPTION
-Animates a number of 3D electronic components.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-parts \fInumber\fP
-Number of parts. Default: 10.
-.TP 8
-.B \-spin | \-no-spin
-Whether the objects should spin.
-.TP 8
-.B \-rotate | \-no-rotate
-Whether the scene should spin.
-.TP 8
-.B \-speed \fInumber\fP
-Rotation speed, 0 - 100. Default: 1.
-.TP 8
-.B \-light | \-no-light
-Whether to use lighting, or flat coloring.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Ben Buxton.
diff --git a/hacks/glx/cityflow.c b/hacks/glx/cityflow.c
deleted file mode 100644
index ce385fc..0000000
--- a/hacks/glx/cityflow.c
+++ /dev/null
@@ -1,560 +0,0 @@
-/* cityflow, Copyright (c) 2014-2017 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*count: 800 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_cube 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SKEW "12"
-
-#define DEF_WAVES "6"
-#define DEF_WAVE_SPEED "25"
-#define DEF_WAVE_RADIUS "256"
-static int texture_size = 512;
-
-typedef struct {
- GLfloat x, y, z;
- GLfloat w, h, d;
- GLfloat cth, sth;
-} cube;
-
-typedef struct {
- int x, y;
- double xth, yth;
-} wave_src;
-
-typedef struct {
- int nwaves;
- int radius;
- int speed;
- wave_src *srcs;
- int *heights;
-} waves;
-
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
- GLuint cube_list;
- int cube_polys;
- int ncubes;
- cube *cubes;
- waves *waves;
- GLfloat min_x, max_x, min_y, max_y;
- int texture_width, texture_height;
- int ncolors;
- XColor *colors;
-
-} cube_configuration;
-
-static cube_configuration *ccs = NULL;
-
-static int wave_count;
-static int wave_speed;
-static int wave_radius;
-static int skew;
-
-static XrmOptionDescRec opts[] = {
- {"-waves", ".waves", XrmoptionSepArg, 0 },
- {"-wave-speed", ".waveSpeed", XrmoptionSepArg, 0 },
- {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
- {"-skew", ".skew", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&wave_count, "waves", "Waves", DEF_WAVES, t_Int},
- {&wave_speed, "waveSpeed", "WaveSpeed", DEF_WAVE_SPEED, t_Int},
- {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
- {&skew, "skew", "Skew", DEF_SKEW,t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt cube_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-ENTRYPOINT void
-reshape_cube (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 2) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- /* For this one it's really important to minimize the distance between
- near and far. */
- gluPerspective (30, 1/h, 10, 50);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-reset_colors (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- make_smooth_colormap (0, 0, 0,
- cc->colors, &cc->ncolors,
- False, 0, False);
- if (! MI_IS_WIREFRAME(mi))
- glClearColor (cc->colors[0].red / 65536.0,
- cc->colors[0].green / 65536.0,
- cc->colors[0].blue / 65536.0,
- 1);
-}
-
-
-static void
-tweak_cubes (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < cc->ncubes; i++)
- {
- cube *cube = &cc->cubes[i];
- cube->x += (frand(2)-1)*0.01;
- cube->y += (frand(2)-1)*0.01;
- cube->z += (frand(2)-1)*0.01;
- }
-}
-
-
-ENTRYPOINT Bool
-cube_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
-
- /* Neutralize any vertical motion */
- GLfloat rot = current_device_rotation();
- Bool rotp = ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135));
-
- if (event->xany.type == ButtonPress ||
- event->xany.type == ButtonRelease)
- {
- if (rotp)
- event->xbutton.x = MI_WIDTH(mi) / 2;
- else
- event->xbutton.y = MI_HEIGHT(mi) / 2;
- }
- else if (event->xany.type == MotionNotify)
- {
- if (rotp)
- event->xmotion.x = MI_WIDTH(mi) / 2;
- else
- event->xmotion.y = MI_HEIGHT(mi) / 2;
- }
-
- if (gltrackball_event_handler (event, cc->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &cc->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- reset_colors (mi);
- tweak_cubes (mi);
- gltrackball_reset (cc->trackball, 0, 0);
- return True;
- }
-
- return False;
-}
-
-
-/* Waves.
- Adapted from ../hacks/interference.c by Hannu Mallat.
- */
-
-static void
-init_wave (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- waves *ww;
- int i;
- cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
- ww->nwaves = wave_count;
- ww->radius = wave_radius;
- ww->speed = wave_speed;
- ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
- ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
-
- for (i = 0; i < ww->radius; i++)
- {
- float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
- ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
- }
-
- for (i = 0; i < ww->nwaves; i++)
- {
- ww->srcs[i].xth = frand(2.0) * M_PI;
- ww->srcs[i].yth = frand(2.0) * M_PI;
- }
-
- cc->texture_width = texture_size;
- cc->texture_height = texture_size;
-}
-
-
-static int
-interference_point (cube_configuration *cc, int x, int y)
-{
- /* Compute the effect of the waves on a pixel. */
-
- waves *ww = cc->waves;
- int result = 0;
- int i;
- for (i = 0; i < ww->nwaves; i++)
- {
- int dx = x - ww->srcs[i].x;
- int dy = y - ww->srcs[i].y;
- int dist = sqrt (dx*dx + dy*dy);
- result += (dist >= ww->radius ? 0 : ww->heights[dist]);
- }
- result *= 0.4;
- if (result > 255) result = 255;
- return result;
-}
-
-
-static void
-interference (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- waves *ww = cc->waves;
- int i;
-
- /* Move the wave origins around
- */
- for (i = 0; i < ww->nwaves; i++)
- {
- ww->srcs[i].xth += (ww->speed / 1000.0);
- if (ww->srcs[i].xth > 2*M_PI)
- ww->srcs[i].xth -= 2*M_PI;
- ww->srcs[i].yth += (ww->speed / 1000.0);
- if (ww->srcs[i].yth > 2*M_PI)
- ww->srcs[i].yth -= 2*M_PI;
-
- ww->srcs[i].x = (cc->texture_width/2 +
- (cos (ww->srcs[i].xth) *
- cc->texture_width / 2));
- ww->srcs[i].y = (cc->texture_height/2 +
- (cos (ww->srcs[i].yth) *
- cc->texture_height / 2));
- }
-}
-
-
-/* qsort comparator for sorting cubes by y position */
-static int
-cmp_cubes (const void *aa, const void *bb)
-{
- const cube *a = (cube *) aa;
- const cube *b = (cube *) bb;
- return ((int) (b->y * 10000) -
- (int) (a->y * 10000));
-}
-
-
-ENTRYPOINT void
-init_cube (ModeInfo *mi)
-{
- int i;
- cube_configuration *cc;
-
- MI_INIT (mi, ccs);
-
- cc = &ccs[MI_SCREEN(mi)];
-
- if ((cc->glx_context = init_GL(mi)) != NULL) {
- reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- cc->trackball = gltrackball_init (False);
-
- cc->ncolors = 256;
- cc->colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
-
- reset_colors (mi);
- init_wave (mi);
-
- cc->ncubes = MI_COUNT (mi);
-
- if (cc->ncubes < 1) cc->ncubes = 1;
-
- cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
- for (i = 0; i < cc->ncubes; i++)
- {
- /* Set the size to roughly cover a 2x2 square on average. */
- GLfloat scale = 1.8 / sqrt (cc->ncubes);
- cube *cube = &cc->cubes[i];
- double th = -(skew ? frand(skew) : 0) * M_PI / 180;
-
- cube->x = (frand(1)-0.5);
- cube->y = (frand(1)-0.5);
-
- cube->z = frand(0.12);
- cube->cth = cos(th);
- cube->sth = sin(th);
-
- cube->w = scale * (frand(1) + 0.2);
- cube->d = scale * (frand(1) + 0.2);
-
- if (cube->x < cc->min_x) cc->min_x = cube->x;
- if (cube->y < cc->min_y) cc->min_y = cube->y;
- if (cube->x > cc->max_x) cc->max_x = cube->x;
- if (cube->y > cc->max_y) cc->max_y = cube->y;
- }
-
- /* Sorting by depth improves frame rate slightly. With 6000 polygons we get:
- 3.9 FPS unsorted;
- 3.1 FPS back to front;
- 4.3 FPS front to back.
- */
- qsort (cc->cubes, cc->ncubes, sizeof(*cc->cubes), cmp_cubes);
-}
-
-
-static void
-animate_cubes (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < cc->ncubes; i++)
- {
- cube *cube = &cc->cubes[i];
- GLfloat fx = (cube->x - cc->min_x) / (cc->max_x - cc->min_x);
- GLfloat fy = (cube->y - cc->min_y) / (cc->max_y - cc->min_y);
- int x = (int) (cc->texture_width * fx) % cc->texture_width;
- int y = (int) (cc->texture_height * fy) % cc->texture_height;
- unsigned char v = interference_point (cc, x, y);
- cube->h = cube->z + (v / 256.0 / 2.5) + 0.1;
- }
-}
-
-
-ENTRYPOINT void
-draw_cube (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!cc->glx_context)
- return;
-
- mi->polygon_count = 0;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cc->glx_context);
-
- interference (mi);
- animate_cubes (mi);
-
- glShadeModel(GL_FLAT);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
- /* glEnable (GL_POLYGON_OFFSET_FILL); */
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glRotatef(current_device_rotation(), 0, 0, 1);
- gltrackball_rotate (cc->trackball);
- glRotatef (-180, 1, 0, 0);
-
- {
- GLfloat s = 15;
- glScalef (s, s, s);
- }
- glRotatef (-90, 1, 0, 0);
-
- glTranslatef (-0.18, 0, -0.18);
- glRotatef (37, 1, 0, 0);
- glRotatef (20, 0, 0, 1);
-
- glScalef (2.1, 2.1, 2.1);
-
- /* Position lights after device rotation. */
- if (!wire)
- {
- static const GLfloat pos[4] = {0.0, 0.25, -1.0, 0.0};
- static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- }
-
- glBegin (wire ? GL_LINES : GL_QUADS);
-
- for (i = 0; i < cc->ncubes; i++)
- {
- cube *cube = &cc->cubes[i];
- GLfloat cth = cube->cth;
- GLfloat sth = cube->sth;
- GLfloat x = cth*cube->x + sth*cube->y;
- GLfloat y = -sth*cube->x + cth*cube->y;
- GLfloat w = cube->w/2;
- GLfloat h = cube->h/2;
- GLfloat d = cube->d/2;
- GLfloat bottom = 5;
-
- GLfloat xw = cth*w, xd = sth*d;
- GLfloat yw = -sth*w, yd = cth*d;
-
- GLfloat color[4];
- int c = cube->h * cc->ncolors * 0.7;
- c %= cc->ncolors;
-
- color[0] = cc->colors[c].red / 65536.0;
- color[1] = cc->colors[c].green / 65536.0;
- color[2] = cc->colors[c].blue / 65536.0;
- color[3] = 1.0;
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
-
- /* Putting this in a display list makes no performance difference. */
-
- if (! wire)
- {
- glNormal3f (0, 0, -1); /* top */
- glVertex3f (x+xw+xd, y+yw+yd, -h);
- glVertex3f (x+xw-xd, y+yw-yd, -h);
- glVertex3f (x-xw-xd, y-yw-yd, -h);
- glVertex3f (x-xw+xd, y-yw+yd, -h);
- mi->polygon_count++;
-
- glNormal3f (sth, cth, 0); /* front */
- glVertex3f (x+xw+xd, y+yw+yd, bottom);
- glVertex3f (x+xw+xd, y+yw+yd, -h);
- glVertex3f (x-xw+xd, y-yw+yd, -h);
- glVertex3f (x-xw+xd, y-yw+yd, bottom);
- mi->polygon_count++;
-
- glNormal3f (cth, -sth, 0); /* right */
- glVertex3f (x+xw-xd, y+yw-yd, -h);
- glVertex3f (x+xw+xd, y+yw+yd, -h);
- glVertex3f (x+xw+xd, y+yw+yd, bottom);
- glVertex3f (x+xw-xd, y+yw-yd, bottom);
- mi->polygon_count++;
-
-# if 0 /* Omitting these makes no performance difference. */
-
- glNormal3f (-cth, sth, 0); /* left */
- glVertex3f (x-xw+xd, y-yw+yd, -h);
- glVertex3f (x-xw-xd, y-yw-yd, -h);
- glVertex3f (x-xw-xd, y-yw-yd, bottom);
- glVertex3f (x-xw+xd, y-yw+yd, bottom);
- mi->polygon_count++;
-
- glNormal3f (-sth, -cth, 0); /* back */
- glVertex3f (x-xw-xd, y-yw-yd, bottom);
- glVertex3f (x-xw-xd, y-yw-yd, -h);
- glVertex3f (x+xw-xd, y+yw-yd, -h);
- glVertex3f (x+xw-xd, y+yw-yd, bottom);
- mi->polygon_count++;
-# endif
- }
- else
- {
- glNormal3f (0, 0, -1); /* top */
- glVertex3f (x+xw+xd, y+yw+yd, -h);
- glVertex3f (x+xw-xd, y+yw-yd, -h);
-
- glVertex3f (x+xw-xd, y+yw-yd, -h);
- glVertex3f (x-xw-xd, y-yw-yd, -h);
-
- glVertex3f (x-xw-xd, y-yw-yd, -h);
- glVertex3f (x-xw+xd, y-yw+yd, -h);
-
- glVertex3f (x-xw+xd, y-yw+yd, -h);
- glVertex3f (x+xw+xd, y+yw+yd, -h);
- mi->polygon_count++;
- }
- }
- glEnd();
-
- glPolygonOffset (0, 0);
-
-# if 0
- glDisable(GL_DEPTH_TEST); /* Outline the playfield */
- glColor3f(1,1,1);
- glBegin(GL_LINE_LOOP);
- glVertex3f (-0.5, -0.5, 0);
- glVertex3f (-0.5, 0.5, 0);
- glVertex3f ( 0.5, 0.5, 0);
- glVertex3f ( 0.5, -0.5, 0);
- glEnd();
-# endif
-
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_cube (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- if (!cc->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cc->glx_context);
-
- if (cc->waves) {
- free (cc->waves->srcs);
- free (cc->waves->heights);
- free (cc->waves);
- }
- if (cc->trackball) gltrackball_free (cc->trackball);
- if (cc->cubes) free (cc->cubes);
- if (cc->colors) free (cc->colors);
-}
-
-
-XSCREENSAVER_MODULE_2 ("Cityflow", cityflow, cube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/cityflow.man b/hacks/glx/cityflow.man
deleted file mode 100644
index ff795e2..0000000
--- a/hacks/glx/cityflow.man
+++ /dev/null
@@ -1,77 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cityflow \- waves of boxes.
-.SH SYNOPSIS
-.B cityflow
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-count \fInumber\fP]
-[\-wave-speed \fInumber\fP]
-[\-wave-radius \fInumber\fP]
-[\-waves \fInumber\fP]
-[\-skew \fInumber\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Waves move across a sea of boxes. The city swells. The walls are closing
-in.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
-.TP 8
-.B \-count \fInumber\fP
-Boxes. 50 - 4000. Default: 800.
-.TP 8
-.B \-wave-speed \fInumber\fP
-Wave speed. 5 - 150. Default: 25.
-.TP 8
-.B \-wave-radius \fInumber\fP
-Wave overlap. 5 - 512. Default: 256.
-.TP 8
-.B \-waves \fInumber\fP
-Wave complexity. 1 - 20. Default: 6.
-.TP 8
-.B \-skew \fInumber\fP
-Skew. 0 - 45. Default: 12.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2012 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/companion.c b/hacks/glx/companion.c
deleted file mode 100644
index 3daebcb..0000000
--- a/hacks/glx/companion.c
+++ /dev/null
@@ -1,604 +0,0 @@
-/* companioncube, Copyright (c) 2011-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/* The symptoms most commonly produced by Enrichment Center testing are
- superstition, perceiving inanimate objects as alive, and hallucinations.
- The Enrichment Center reminds you that the weighted companion cube will
- never threaten to stab you and, in fact, cannot speak. In the event that
- the Weighted Companion Cube does speak, the Enrichment Center urges you to
- disregard its advice.
- */
-
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*count: 3 \n" \
- "*wireframe: False \n" \
-
-/* #define DEBUG */
-
-
-# define release_cube 0
-#define DEF_SPEED "1.0"
-#define DEF_SPIN "False"
-#define DEF_WANDER "False"
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-#include "xlockmore.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include "ximage-loader.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#include "gllist.h"
-
-extern const struct gllist *companion_quad, *companion_disc, *companion_heart;
-static const struct gllist * const *all_objs[] = {
- &companion_quad, &companion_disc, &companion_heart
-};
-#define BASE_QUAD 0
-#define BASE_DISC 1
-#define BASE_HEART 2
-#define FULL_CUBE 3
-
-#define SPEED_SCALE 0.2
-
-typedef struct {
- GLfloat x, y, z;
- GLfloat ix, iy, iz;
- GLfloat dx, dy, dz;
- GLfloat ddx, ddy, ddz;
- GLfloat zr;
- rotator *rot;
- Bool spinner_p;
-} floater;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLuint *dlists;
- int cube_polys;
-
- int nfloaters;
- floater *floaters;
-
-} cube_configuration;
-
-static cube_configuration *bps = NULL;
-
-static GLfloat speed;
-static Bool do_spin;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-#define BOTTOM 28.0
-
-static void
-reset_floater (ModeInfo *mi, floater *f)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
-
- f->y = -BOTTOM;
- f->x = f->ix;
- f->z = f->iz;
-
- /* Yes, I know I'm varying the force of gravity instead of varying the
- launch velocity. That's intentional: empirical studies indicate
- that it's way, way funnier that way. */
-
- f->dy = 5.0;
- f->dx = 0;
- f->dz = 0;
-
- /* -0.18 max -0.3 top -0.4 middle -0.6 bottom */
- f->ddy = speed * SPEED_SCALE * (-0.6 + BELLRAND(0.45));
- f->ddx = 0;
- f->ddz = 0;
-
- if (do_spin || do_wander)
- f->spinner_p = 0;
- else
- f->spinner_p = !(random() % (3 * bp->nfloaters));
-
- if (! (random() % (30 * bp->nfloaters)))
- {
- f->dx = BELLRAND(1.8) * RANDSIGN();
- f->dz = BELLRAND(1.8) * RANDSIGN();
- }
-
- f->zr = frand(180);
- if (do_spin || do_wander)
- {
- f->y = 0;
- if (bp->nfloaters > 2)
- f->y += frand(3.0) * RANDSIGN();
- }
-}
-
-
-static void
-tick_floater (ModeInfo *mi, floater *f)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (bp->button_down_p) return;
-
- if (do_spin || do_wander) return;
-
- f->dx += f->ddx;
- f->dy += f->ddy;
- f->dz += f->ddz;
-
- f->x += f->dx * speed * SPEED_SCALE;
- f->y += f->dy * speed * SPEED_SCALE;
- f->z += f->dz * speed * SPEED_SCALE;
-
- if (f->y < -BOTTOM ||
- f->x < -BOTTOM*8 || f->x > BOTTOM*8 ||
- f->z < -BOTTOM*8 || f->z > BOTTOM*8)
- reset_floater (mi, f);
-}
-
-
-
-
-
-static int
-build_corner (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat s;
- const struct gllist *gll = *all_objs[BASE_QUAD];
-
- glPushMatrix();
- glTranslatef (-0.5, -0.5, -0.5);
- s = 0.659;
- glScalef (s, s, s);
-
- glRotatef (180, 0, 1, 0);
- glRotatef (180, 0, 0, 1);
- glTranslatef (-0.12, -1.64, 0.12);
- glCallList (bp->dlists[BASE_QUAD]);
- glPopMatrix();
-
- return gll->points / 3;
-}
-
-
-static int
-build_face (ModeInfo *mi)
-{
- int polys = 0;
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat s;
- const struct gllist *gll;
-
- GLfloat base_color[4] = {0.53, 0.60, 0.66, 1.00};
- GLfloat heart_color[4] = {0.92, 0.67, 1.00, 1.00};
- GLfloat disc_color[4] = {0.75, 0.92, 1.00, 1.00};
- GLfloat corner_color[4] = {0.75, 0.92, 1.00, 1.00};
-
- if (!wire)
- {
- GLfloat w = 0.010;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, base_color);
- glPushMatrix();
- glNormal3f (0, 0, -1);
- glTranslatef (-0.5, -0.5, -0.5);
-
- glBegin(GL_QUADS);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 0.5-w, 0);
- glVertex3f (0.5-w, 0.5-w, 0);
- glVertex3f (0.5-w, 0, 0);
-
- glVertex3f (0.5+w, 0, 0);
- glVertex3f (0.5+w, 0.5-w, 0);
- glVertex3f (1, 0.5-w, 0);
- glVertex3f (1, 0, 0);
-
- glVertex3f (0, 0.5+w, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (0.5-w, 1, 0);
- glVertex3f (0.5-w, 0.5+w, 0);
-
- glVertex3f (0.5+w, 0.5+w, 0);
- glVertex3f (0.5+w, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0.5+w, 0);
- glEnd();
-
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
-
- glNormal3f (0, -1, 0);
- glBegin(GL_QUADS);
- glVertex3f (0, 0.5+w, 0);
- glVertex3f (1, 0.5+w, 0);
- glVertex3f (1, 0.5+w, w);
- glVertex3f (0, 0.5+w, w);
- glEnd();
-
- glNormal3f (0, 1, 0);
- glBegin(GL_QUADS);
- glVertex3f (0, 0.5-w, w);
- glVertex3f (1, 0.5-w, w);
- glVertex3f (1, 0.5-w, 0);
- glVertex3f (0, 0.5-w, 0);
- glEnd();
-
- glNormal3f (-1, 0, 0);
- glBegin(GL_QUADS);
- glVertex3f (0.5+w, 0, w);
- glVertex3f (0.5+w, 1, w);
- glVertex3f (0.5+w, 1, 0);
- glVertex3f (0.5+w, 0, 0);
- glEnd();
-
- glNormal3f (1, 0, 0);
- glBegin(GL_QUADS);
- glVertex3f (0.5-w, 0, 0);
- glVertex3f (0.5-w, 1, 0);
- glVertex3f (0.5-w, 1, w);
- glVertex3f (0.5-w, 0, w);
- glEnd();
-
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
-
- glNormal3f (0, 0, -1);
- glTranslatef (0, 0, w);
- glBegin(GL_QUADS);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0);
- glEnd();
-
- glPopMatrix();
- }
-
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, corner_color);
-
- glPushMatrix();
- polys += build_corner (mi); glRotatef (90, 0, 0, 1);
- polys += build_corner (mi); glRotatef (90, 0, 0, 1);
- polys += build_corner (mi); glRotatef (90, 0, 0, 1);
- polys += build_corner (mi);
-
- glRotatef (90, 0, 0, 1);
- glTranslatef (0.585, -0.585, -0.5655);
-
- s = 10.5;
- glScalef (s, s, s);
- glRotatef (180, 0, 1, 0);
-
- if (! wire)
- {
- gll = *all_objs[BASE_HEART];
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
- glCallList (bp->dlists[BASE_HEART]);
- polys += gll->points / 3;
- }
-
- gll = *all_objs[BASE_DISC];
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, disc_color);
- glCallList (bp->dlists[BASE_DISC]);
- polys += gll->points / 3;
-
- glPopMatrix();
- return polys;
-}
-
-
-static int
-build_cube (ModeInfo *mi)
-{
- int polys = 0;
- glPushMatrix();
- polys += build_face (mi); glRotatef (90, 0, 1, 0);
- polys += build_face (mi); glRotatef (90, 0, 1, 0);
- polys += build_face (mi); glRotatef (90, 0, 1, 0);
- polys += build_face (mi); glRotatef (90, 1, 0, 0);
- polys += build_face (mi); glRotatef (180,1, 0, 0);
- polys += build_face (mi);
- glPopMatrix();
- return polys;
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_cube (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-cube_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_cube (ModeInfo *mi)
-{
- cube_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (!wire)
- {
- GLfloat pos[4] = {0.7, 0.2, 0.4, 0.0};
-/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- bp->trackball = gltrackball_init (False);
-
- bp->dlists = (GLuint *) calloc (countof(all_objs)+2, sizeof(GLuint));
- for (i = 0; i < countof(all_objs)+1; i++)
- bp->dlists[i] = glGenLists (1);
-
- for (i = 0; i < countof(all_objs); i++)
- {
- const struct gllist *gll = *all_objs[i];
- glNewList (bp->dlists[i], GL_COMPILE);
- renderList (gll, wire);
- glEndList ();
- }
-
- glNewList (bp->dlists[i], GL_COMPILE);
- bp->cube_polys = build_cube (mi);
- glEndList ();
-
-
- bp->nfloaters = MI_COUNT (mi);
- bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
-
- for (i = 0; i < bp->nfloaters; i++)
- {
- floater *f = &bp->floaters[i];
- double spin_speed = do_spin ? 0.7 : 10;
- double wander_speed = do_wander ? 0.02 : 0.05 * speed * SPEED_SCALE;
- double spin_accel = 0.5;
- f->rot = make_rotator (spin_speed, spin_speed, spin_speed,
- spin_accel,
- wander_speed,
- True);
- if (bp->nfloaters == 2)
- {
- f->x = (i ? 2 : -2);
- }
- else if (i != 0)
- {
- double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
- double r = 3;
- f->x = r * cos(th);
- f->z = r * sin(th);
- }
-
- f->ix = f->x;
- f->iy = f->y;
- f->iz = f->z;
- reset_floater (mi, f);
- }
-}
-
-
-static void
-draw_floater (ModeInfo *mi, floater *f)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat n;
- double x, y, z;
-
- get_position (f->rot, &x, &y, &z, !bp->button_down_p);
-
- glPushMatrix();
- glTranslatef (f->x, f->y, f->z);
-
- if (do_wander)
- glTranslatef (x, y, z);
-
- if (do_spin)
- get_rotation (f->rot, &x, &y, &z, !bp->button_down_p);
-
- if (do_spin || f->spinner_p)
- {
- glRotatef (x * 360, 1, 0, 0);
- glRotatef (y * 360, 0, 1, 0);
- glRotatef (z * 360, 0, 0, 1);
- }
- else
- {
- glRotatef (f->zr * 360, 0, 1, 0);
- }
-
- n = 1.5;
- if (bp->nfloaters > 99) n *= 0.05;
- else if (bp->nfloaters > 25) n *= 0.18;
- else if (bp->nfloaters > 9) n *= 0.3;
- else if (bp->nfloaters > 1) n *= 0.7;
-
- n *= 2;
-
- if ((do_spin || do_wander) && bp->nfloaters > 1)
- n *= 0.7;
-
- glScalef(n, n, n);
-
- glCallList (bp->dlists[FULL_CUBE]);
- mi->polygon_count += bp->cube_polys;
-/* build_cube (mi);*/
-
- glPopMatrix();
-}
-
-
-
-ENTRYPOINT void
-draw_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
- glRotatef(current_device_rotation(), 0, 0, 1);
- gltrackball_rotate (bp->trackball);
-
- glScalef (2, 2, 2);
-
- mi->polygon_count = 0;
-
-# if 0
- {
- floater F;
- F.x = F.y = F.z = 0;
- F.dx = F.dy = F.dz = 0;
- F.ddx = F.ddy = F.ddz = 0;
- F.rot = make_rotator (0, 0, 0, 1, 0, False);
- glRotatef (45, 0, 1, 0);
- draw_floater (mi, &F);
- }
-# else
- for (i = 0; i < bp->nfloaters; i++)
- {
- floater *f = &bp->floaters[i];
- draw_floater (mi, f);
- tick_floater (mi, f);
- }
-# endif
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- for (i = 0; i < bp->nfloaters; i++)
- if (bp->floaters[i].rot) free_rotator (bp->floaters[i].rot);
- for (i = 0; i < countof(all_objs)+1; i++)
- if (glIsList(bp->dlists[i])) glDeleteLists(bp->dlists[i], 1);
- if (bp->floaters) free (bp->floaters);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->dlists) free (bp->dlists);
-}
-
-XSCREENSAVER_MODULE_2 ("CompanionCube", companioncube, cube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/companion_disc.c b/hacks/glx/companion_disc.c
deleted file mode 100644
index b2f1830..0000000
--- a/hacks/glx/companion_disc.c
+++ /dev/null
@@ -1,9593 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
- -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
- -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
- -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
- -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
- -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
- -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
- -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
- -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
- -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
- -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
- -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
- -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
- -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
- -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
- -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
- -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
- -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
- -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
- -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
- -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
- -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
- -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
- -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
- -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
- -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
- -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
- -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
- -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
- -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
- -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
- -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
- -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
- -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
- -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
- -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
- -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
- -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
- -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
- -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
- -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
- -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
- -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
- -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
- -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
- -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
- -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
- -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
- -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
- -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
- -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
- -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
- -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
- -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
- -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
- -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
- -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
- -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
- -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
- -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
- -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
- -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
- -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
- -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
- -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
- -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
- -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
- -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
- -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
- -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
- -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
- -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
- -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
- -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
- -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
- -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
- -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
- -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
- -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
- -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
- -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
- -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
- -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
- -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
- -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
- -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
- -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
- -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
- -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
- -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
- -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
- -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
- -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
- -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
- -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
- -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
- -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
- -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
- -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
- -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
- -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
- -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
- -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
- -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
- -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
- -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
- -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
- -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
- 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
- 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
- -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
- 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
- -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
- -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
- 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
- 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
- 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
- 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
- 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
- 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
- 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
- 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
- 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
- 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
- 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
- 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
- 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
- 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
- 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
- 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
- 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
- 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
- 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
- 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
- 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
- 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
- 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
- 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
- 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
- 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
- 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
- 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
- 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
- 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
- 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
- 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
- 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
- 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
- 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
- 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
- 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
- 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
- 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
- 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
- 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
- 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
- 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
- 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
- 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
- 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
- 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
- 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
- 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
- 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
- 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
- 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
- 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
- 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
- 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
- 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
- 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
- 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
- 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
- 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
- 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
- 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
- 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
- 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
- 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
- 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
- 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
- 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
- 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
- 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
- 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
- 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
- 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
- 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
- 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
- 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
- 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
- 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
- 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
- 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
- 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
- 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
- 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
- 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
- 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
- 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
- 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
- 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
- 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
- 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
- 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
- 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
- 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
- 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
- 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
- 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
- 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
- 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
- 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
- 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
- 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
- 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
- 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
- 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
- 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
- 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
- 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
- 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
- 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
- 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
- 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
- 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
- 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
- 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
- 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
- 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
- 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
- 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
- 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
- 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
- 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
- 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
- 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
- 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
- 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
- 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
- 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
- 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
- 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
- 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
- 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
- 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
- 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
- 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
- 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
- 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
- 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
- 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
- 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
- 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
- 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
- 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
- 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
- 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
- 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
- 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
- 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
- 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
- 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
- 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
- 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
- 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
- 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
- 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
- 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
- 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
- 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
- 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
- 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
- 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
- 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
- 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
- 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
- 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
- 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
- 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
- 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
- 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
- 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
- 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
- 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
- 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
- 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
- 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
- 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
- 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
- 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
- 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
- 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
- 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
- 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
- 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
- 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
- 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
- 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
- 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
- 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
- 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
- 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
- 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
- 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
- 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
- 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
- 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
- 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
- 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
- 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
- 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
- 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
- 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
- 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
- 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
- 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
- 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
- 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
- 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
- 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
- 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
- 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
- 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
- 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
- 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
- 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
- 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
- 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
- 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
- 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
- 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
- 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
- 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
- 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
- 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
- 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
- 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
- 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
- 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
- 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
- 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
- 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
- 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
- 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
- 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
- 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
- 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
- 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
- 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
- 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
- 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
- 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
- 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
- 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
- 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
- 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
- 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
- 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
- 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
- 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
- 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
- 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
- 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
- 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
- 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
- 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
- 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
- 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
- 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
- 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
- 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
- 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
- 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
- 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
- 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
- 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
- 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
- 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
- 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
- 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
- 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
- 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
- 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
- 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
- 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
- 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
- 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
- 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
- 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
- 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
- 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
- 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
- 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
- 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
- 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
- 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
- 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
- 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
- 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
- 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
- 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
- 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
- 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
- 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
- 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
- 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
- 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
- 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
- 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
- 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
- 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
- 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
- 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
- -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
- -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
- 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
- -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
- 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
- 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
- -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
- -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
- -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
- -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
- -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
- -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
- -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
- -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
- -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
- -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
- -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
- -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
- -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
- -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
- -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
- -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
- -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
- -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
- -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
- -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
- -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
- -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
- -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
- -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
- -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
- -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
- -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
- -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
- -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
- -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
- -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
- -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
- -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
- -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
- -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
- -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
- -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
- -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
- -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
- -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
- -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
- -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
- -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
- -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
- -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
- -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
- -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
- -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
- -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
- -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
- -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
- -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
- -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
- -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
- -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
- -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
- -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
- -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
- -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
- -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
- -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
- -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
- -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
- -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
- -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
- -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
- -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
- -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
- -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
- -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
- -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
- -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
- -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
- -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
- -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
- -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
- -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
- -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
- -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
- -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
- -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
- -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
- -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
- -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
- -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
- -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
- -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
- -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
- -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
- -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
- -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
- -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
- -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
- -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
- -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
- -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
- -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
- -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
- -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
- -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
- -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
- -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
- -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
- -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
- -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
- -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
- -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
- -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
- -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
- -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
- -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
- -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
- -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
- -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
- -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
- -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
- -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
- -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
- -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
- -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
- -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
- -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
- -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
- -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
- -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
- -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
- -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
- -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
- -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
- -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
- -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
- -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
- -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
- -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
- -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
- -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
- -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
- -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
- -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
- -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
- -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
- -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
- -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
- -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
- -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
- -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
- -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
- -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
- -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
- -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
- -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
- -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
- -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
- -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
- -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
- -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
- -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
- -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
- -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
- -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
- -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
- -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
- -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
- -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
- -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
- -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
- -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
- -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
- -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
- -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
- -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
- -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
- -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
- -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
- -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
- -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
- -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
- -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
- -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
- -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
- -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
- -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
- -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
- -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
- -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
- -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
- -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
- -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
- -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
- -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
- -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
- -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
- -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
- -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
- -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
- -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
- -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
- -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
- -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
- -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
- -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
- -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
- -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
- -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
- -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
- -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
- -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
- -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
- -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
- -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
- -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
- -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
- -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
- -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
- -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
- -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
- -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
- -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
- -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
- -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
- -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
- -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
- -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
- -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
- -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
- -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
- -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
- -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
- -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
- -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
- -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
- -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
- -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
- -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
- -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
- -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
- -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
- -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
- -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
- -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
- -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
- -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
- -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
- -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
- -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
- -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
- -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
- -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
- -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
- -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
- -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
- -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
- -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
- -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
- -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
- -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
- -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
- -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
- -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
- -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
- -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
- -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
- -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
- -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
- -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
- -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
- -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
- -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
- -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
- -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
- -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
- -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
- -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
- -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
- -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
- -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
- -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
- -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
- -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
- -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
- -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
- -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
- -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
- -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
- -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
- -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
- -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
- -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
- -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
- -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
- -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
- -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
- -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
- -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
- 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
- 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
- -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
- 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
- -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
- -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
- 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
- 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
- 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
- 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
- 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
- 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
- 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
- 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
- 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
- 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
- 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
- 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
- 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
- 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
- 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
- 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
- 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
- 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
- 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
- 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
- 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
- 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
- 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
- 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
- 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
- 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
- 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
- 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
- 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
- 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
- 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
- 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
- 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
- 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
- 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
- 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
- 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
- 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
- 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
- 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
- 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
- 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
- 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
- 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
- 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
- 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
- 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
- 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
- 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
- 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
- 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
- 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
- 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
- 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
- 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
- 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
- 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
- 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
- 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
- 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
- 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
- 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
- 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
- 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
- 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
- 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
- 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
- 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
- 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
- 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
- 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
- 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
- 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
- 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
- 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
- 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
- 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
- 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
- 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
- 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
- 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
- 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
- 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
- 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
- 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
- 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
- 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
- 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
- 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
- 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
- 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
- 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
- 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
- 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
- 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
- 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
- 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
- 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
- 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
- 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
- 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
- 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
- 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
- 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
- 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
- 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
- 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
- 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
- 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
- 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
- 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
- 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
- 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
- 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
- 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
- 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
- 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
- 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
- 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
- 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
- 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
- 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
- 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
- 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
- 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
- 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
- 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
- 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
- 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
- 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
- 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
- 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
- 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
- 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
- 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
- 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
- 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
- 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
- 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
- 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
- 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
- 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
- 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
- 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
- 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
- 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
- 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
- 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
- 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
- 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
- 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
- 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
- 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
- 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
- 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
- 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
- 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
- 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
- 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
- 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
- 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
- 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
- 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
- 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
- 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
- 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
- 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
- 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
- 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
- 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
- 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
- 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
- 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
- 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
- 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
- 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
- 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
- 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
- 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
- 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
- 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
- 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
- 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
- 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
- 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
- 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
- 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
- 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
- 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
- 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
- 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
- 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
- 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
- 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
- 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
- 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
- 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
- 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
- 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
- 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
- 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
- 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
- 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
- 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
- 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
- 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
- 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
- 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
- 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
- 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
- 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
- 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
- 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
- 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
- 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
- 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
- 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
- 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
- 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
- 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
- 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
- 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
- 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
- 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
- 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
- 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
- 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
- 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
- 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
- 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
- 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
- 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
- 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
- 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
- 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
- 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
- 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
- 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
- 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
- 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
- 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
- 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
- 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
- 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
- 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
- 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
- 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
- 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
- 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
- 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
- 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
- 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
- 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
- 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
- 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
- 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
- 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
- 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
- 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
- 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
- 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
- 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
- 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
- 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
- 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
- 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
- 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
- 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
- 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
- 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
- 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
- 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
- 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
- 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
- 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
- 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
- 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
- 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
- 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
- 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
- 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
- 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
- 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
- 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
- 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
- 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
- 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
- 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
- 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
- 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
- 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
- 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
- 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
- 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
- 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
- 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
- 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
- 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
- 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
- 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
- -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
- -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
- 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
- -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
- 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
- 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
- -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
- -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
- -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
- -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
- -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
- -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
- -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
- -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
- -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
- -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
- -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
- -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
- -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
- -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
- -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
- -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
- -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
- -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
- -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
- -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
- -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
- -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
- -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
- -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
- -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
- -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
- -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
- -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
- -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
- -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
- -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
- -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
- -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
- -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
- -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
- -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
- -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
- -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
- -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
- -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
- -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
- -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
- -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
- -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
- -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
- -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
- -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
- -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
- -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
- -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
- -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
- -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
- -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
- -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
- -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
- -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
- -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
- -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
- -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
- -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
- -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
- -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
- -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
- -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
- -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
- -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
- -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
- -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
- -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
- -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
- -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
- -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
- -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
- -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
- -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
- -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
- -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
- -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
- -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
- -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
- -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
- -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
- -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
- -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
- -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
- -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
- -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
- -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
- -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
- -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
- -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
- -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
- -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
- -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
- -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
- -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
- -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
- -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
- -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
- -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
- -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
- -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
- -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
- -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
- -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
- -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
- -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
- -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
- -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
- -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
- -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
- -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
- -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
- -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
- -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
- -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
- -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
- -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
- -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
- -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
- -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
- -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
- -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
- -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
- -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
- -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
- -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
- -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
- -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
- -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
- -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
- -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
- -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
- -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
- -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
- -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
- -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
- -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
- -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
- -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
- -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
- -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
- -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
- -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
- -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
- -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
- -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
- -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
- -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
- -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
- -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
- -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
- -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
- -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
- -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
- -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
- -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
- -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
- -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
- -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
- -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
- -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
- -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
- -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
- -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
- -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
- -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
- -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
- -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
- -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
- -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
- -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
- -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
- -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
- -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
- -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
- -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
- -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
- -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
- -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
- -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
- -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
- -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
- -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
- -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
- -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
- -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
- -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
- -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
- -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
- -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
- -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
- -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
- -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
- -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
- -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
- -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
- -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
- -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
- -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
- -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
- -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
- -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
- -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
- -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
- -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
- -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
- -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
- -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
- -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
- -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
- -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
- -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
- -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
- -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
- -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
- -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
- -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
- -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
- -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
- -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
- -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
- -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
- -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
- -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
- -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
- -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
- -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
- -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
- -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
- -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
- -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
- -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
- -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
- -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
- -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
- -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
- -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
- -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
- -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
- -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
- -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
- -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
- -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
- -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
- -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
- -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
- -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
- -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
- -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
- -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
- -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
- -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
- -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
- -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
- -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
- -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
- -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
- -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
- -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
- -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
- -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
- -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
- -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
- -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
- -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
- -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
- -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
- -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
- -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
- -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
- -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
- -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
- -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
- -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
- -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
- -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
- -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
- -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
- -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
- -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
- -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
- -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
- -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
- -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
- -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
- -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
- -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
- -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
- -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
- -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
- -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
- -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
- -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
- 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
- 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
- -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
- 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
- -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
- -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
- 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
- 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
- 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
- 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
- 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
- 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
- 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
- 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
- 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
- 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
- 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
- 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
- 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
- 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
- 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
- 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
- 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
- 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
- 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
- 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
- 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
- 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
- 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
- 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
- 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
- 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
- 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
- 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
- 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
- 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
- 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
- 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
- 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
- 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
- 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
- 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
- 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
- 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
- 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
- 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
- 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
- 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
- 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
- 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
- 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
- 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
- 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
- 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
- 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
- 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
- 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
- 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
- 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
- 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
- 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
- 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
- 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
- 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
- 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
- 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
- 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
- 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
- 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
- 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
- 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
- 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
- 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
- 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
- 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
- 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
- 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
- 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
- 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
- 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
- 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
- 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
- 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
- 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
- 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
- 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
- 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
- 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
- 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
- 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
- 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
- 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
- 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
- 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
- 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
- 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
- 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
- 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
- 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
- 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
- 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
- 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
- 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
- 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
- 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
- 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
- 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
- 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
- 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
- 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
- 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
- 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
- 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
- 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
- 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
- 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
- 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
- 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
- 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
- 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
- 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
- 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
- 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
- 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
- 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
- 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
- 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
- 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
- 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
- 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
- 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
- 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
- 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
- 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
- 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
- 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
- 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
- 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
- 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
- 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
- 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
- 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
- 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
- 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
- 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
- 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
- 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
- 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
- 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
- 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
- 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
- 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
- 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
- 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
- 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
- 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
- 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
- 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
- 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
- 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
- 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
- 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
- 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
- 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
- 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
- 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
- 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
- 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
- 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
- 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
- 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
- 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
- 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
- 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
- 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
- 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
- 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
- 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
- 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
- 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
- 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
- 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
- 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
- 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
- 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
- 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
- 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
- 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
- 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
- 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
- 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
- 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
- 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
- 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
- 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
- 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
- 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
- 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
- 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
- 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
- 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
- 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
- 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
- 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
- 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
- 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
- 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
- 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
- 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
- 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
- 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
- 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
- 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
- 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
- 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
- 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
- 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
- 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
- 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
- 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
- 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
- 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
- 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
- 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
- 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
- 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
- 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
- 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
- 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
- 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
- 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
- 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
- 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
- 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
- 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
- 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
- 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
- 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
- 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
- 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
- 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
- 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
- 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
- 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
- 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
- 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
- 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
- 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
- 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
- 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
- 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
- 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
- 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
- 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
- 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
- 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
- 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
- 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
- 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
- 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
- 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
- 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
- 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
- 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
- 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
- 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
- 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
- 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
- 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
- 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
- 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
- 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
- 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
- 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
- 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
- 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
- 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
- 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
- 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
- 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
- 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
- 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
- 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
- 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
- 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
- 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
- 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
- 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
- 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
- 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
- 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
- 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
- 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
- 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
- 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
- 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
- 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
- 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
- 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
- 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
- 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
- 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
- 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
- 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
- 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
- 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
- -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
- -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
- 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
- -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
- 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
- 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
- -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
- -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
- -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
- -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
- -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
- -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
- -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
- -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
- -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
- -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
- -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
- -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
- -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
- -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
- -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
- -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
- -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
- -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
- -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
- -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
- -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
- -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
- -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
- -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
- -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
- -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
- -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
- -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
- -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
- -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
- -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
- -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
- -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
- -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
- -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
- -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
- -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
- -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
- -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
- -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
- -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
- -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
- -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
- -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
- -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
- -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
- -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
- -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
- -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
- -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
- -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
- -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
- -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
- -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
- -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
- -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
- -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
- -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
- -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
- -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
- -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
- -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
- -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
- -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
- -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
- -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
- -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
- -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
- -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
- -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
- -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
- -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
- -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
- -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
- -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
- -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
- -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
- -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
- -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
- -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
- -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
- -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
- -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
- -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
- -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
- -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
- -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
- -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
- -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
- -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
- -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
- -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
- -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
- -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
- -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
- -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
- -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
- -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
- -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
- -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
- -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
- -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
- -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
- -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
- -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
- -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
- -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
- -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
- -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
- -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
- -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
- -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
- -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
- -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
- -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
- -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
- -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
- -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
- -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
- -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
- -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
- -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
- -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
- -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
- -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
- -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
- -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
- -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
- -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
- -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
- -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
- -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
- -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
- -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
- -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
- -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
- -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
- -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
- -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
- -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
- -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
- -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
- -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
- -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
- -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
- -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
- -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
- -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
- -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
- -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
- -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
- -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
- -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
- -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
- -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
- -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
- -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
- -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
- -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
- -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
- -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
- -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
- -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
- -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
- -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
- -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
- -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
- -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
- -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
- -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
- -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
- -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
- -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
- -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
- -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
- -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
- -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
- -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
- -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
- -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
- -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
- -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
- -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
- -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
- -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
- -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
- -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
- -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
- -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
- -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
- -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
- -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
- -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
- -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
- -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
- -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
- -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
- -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
- -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
- -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
- -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
- -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
- -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
- -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
- -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
- -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
- -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
- -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
- -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
- -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
- -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
- -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
- -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
- -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
- -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
- -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
- -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
- -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
- -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
- -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
- -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
- -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
- -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
- -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
- -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
- -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
- -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
- -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
- -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
- -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
- -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
- -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
- -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
- -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
- -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
- -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
- -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
- -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
- -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
- -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
- -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
- -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
- -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
- -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
- -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
- -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
- -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
- -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
- -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
- -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
- -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
- -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
- -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
- -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
- -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
- -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
- -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
- -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
- -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
- -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
- -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
- -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
- -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
- -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
- -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
- -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
- -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
- -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
- -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
- -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
- -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
- -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
- -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
- -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
- -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
- -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
- -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
- -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
- -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
- -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
- -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
- -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
- -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
- -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
- -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
- -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
- -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
- -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
- -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
- -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
- -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
- -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
- -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
- -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
- 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
- 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
- -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
- 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
- -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
- -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
- 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
- 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
- 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
- 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
- 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
- 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
- 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
- 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
- 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
- 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
- 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
- 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
- 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
- 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
- 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
- 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
- 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
- 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
- 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
- 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
- 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
- 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
- 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
- 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
- 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
- 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
- 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
- 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
- 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
- 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
- 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
- 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
- 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
- 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
- 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
- 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
- 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
- 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
- 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
- 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
- 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
- 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
- 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
- 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
- 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
- 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
- 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
- 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
- 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
- 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
- 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
- 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
- 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
- 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
- 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
- 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
- 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
- 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
- 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
- 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
- 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
- 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
- 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
- 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
- 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
- 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
- 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
- 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
- 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
- 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
- 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
- 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
- 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
- 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
- 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
- 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
- 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
- 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
- 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
- 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
- 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
- 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
- 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
- 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
- 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
- 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
- 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
- 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
- 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
- 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
- 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
- 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
- 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
- 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
- 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
- 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
- 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
- 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
- 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
- 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
- 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
- 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
- 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
- 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
- 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
- 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
- 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
- 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
- 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
- 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
- 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
- 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
- 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
- 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
- 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
- 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
- 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
- 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
- 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
- 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
- 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
- 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
- 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
- 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
- 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
- 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
- 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
- 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
- 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
- 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
- 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
- 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
- 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
- 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
- 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
- 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
- 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
- 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
- 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
- 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
- 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
- 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
- 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
- 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
- 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
- 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
- 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
- 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
- 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
- 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
- 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
- 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
- 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
- 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
- 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
- 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
- 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
- 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
- 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
- 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
- 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
- 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
- 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
- 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
- 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
- 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
- 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
- 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
- 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
- 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
- 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
- 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
- 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
- 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
- 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
- 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
- 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
- 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
- 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
- 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
- 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
- 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
- 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
- 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
- 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
- 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
- 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
- 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
- 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
- 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
- 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
- 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
- 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
- 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
- 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
- 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
- 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
- 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
- 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
- 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
- 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
- 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
- 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
- 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
- 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
- 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
- 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
- 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
- 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
- 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
- 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
- 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
- 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
- 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
- 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
- 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
- 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
- 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
- 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
- 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
- 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
- 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
- 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
- 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
- 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
- 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
- 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
- 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
- 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
- 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
- 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
- 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
- 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
- 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
- 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
- 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
- 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
- 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
- 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
- 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
- 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
- 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
- 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
- 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
- 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
- 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
- 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
- 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
- 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
- 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
- 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
- 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
- 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
- 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
- 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
- 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
- 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
- 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
- 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
- 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
- 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
- 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
- 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
- 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
- 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
- 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
- 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
- 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
- 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
- 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
- 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
- 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
- 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
- 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
- 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
- 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
- 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
- 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
- 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
- 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
- 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
- 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
- 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
- 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
- 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
- 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
- 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
- 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
- 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
- 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
- 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
- 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
- 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
- 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
- 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
- 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
- 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
- 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
- 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
- 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
- -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
- -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
- 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
- -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
- 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
- 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
- -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
- -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
- -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
- -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
- -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
- -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
- -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
- -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
- -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
- -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
- -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
- -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
- -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
- -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
- -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
- -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
- -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
- -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
- -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
- -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
- -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
- -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
- -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
- -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
- -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
- -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
- -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
- -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
- -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
- -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
- -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
- -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
- -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
- -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
- -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
- -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
- -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
- -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
- -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
- -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
- -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
- -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
- -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
- -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
- -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
- -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
- -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
- -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
- -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
- -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
- -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
- -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
- -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
- -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
- -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
- -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
- -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
- -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
- -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
- -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
- -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
- -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
- -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
- -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
- -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
- -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
- -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
- -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
- -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
- -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
- -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
- -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
- -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
- -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
- -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
- -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
- -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
- -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
- -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
- -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
- -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
- -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
- -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
- -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
- -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
- -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
- -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
- -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
- -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
- -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
- -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
- -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
- -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
- -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
- -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
- -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
- -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
- -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
- -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
- -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
- -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
- -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
- -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
- -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
- -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
- -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
- -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
- -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
- -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
- -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
- -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
- -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
- -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
- -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
- -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
- -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
- -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
- -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
- -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
- -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
- -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
- -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
- -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
- -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
- -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
- -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
- -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
- -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
- -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
- -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
- -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
- -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
- -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
- -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
- -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
- -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
- -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
- -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
- -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
- -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
- -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
- -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
- -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
- -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
- -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
- -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
- -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
- -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
- -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
- -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
- -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
- -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
- -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
- -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
- -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
- -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
- -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
- -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
- -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
- -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
- -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
- -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
- -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
- -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
- -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
- -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
- -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
- -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
- -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
- -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
- -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
- -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
- -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
- -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
- -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
- -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
- -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
- -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
- -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
- -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
- -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
- -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
- -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
- -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
- -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
- -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
- -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
- -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
- -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
- -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
- -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
- -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
- -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
- -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
- -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
- -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
- -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
- -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
- -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
- -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
- -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
- -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
- -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
- -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
- -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
- -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
- -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
- -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
- -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
- -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
- -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
- -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
- -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
- -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
- -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
- -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
- -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
- -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
- -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
- -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
- -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
- -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
- -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
- -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
- -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
- -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
- -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
- -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
- -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
- -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
- -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
- -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
- -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
- -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
- -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
- -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
- -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
- -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
- -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
- -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
- -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
- -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
- -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
- -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
- -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
- -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
- -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
- -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
- -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
- -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
- -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
- -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
- -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
- -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
- -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
- -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
- -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
- -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
- -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
- -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
- -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
- -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
- -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
- -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
- -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
- -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
- -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
- -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
- -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
- -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
- -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
- -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
- -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
- -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
- -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
- -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
- -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
- -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
- -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
- -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
- -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
- -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
- -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
- -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
- -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
- -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
- -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
- -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
- -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
- -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
- -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
- -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
- -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
- -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
- 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
- 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
- -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
- 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
- -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
- -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
- 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
- 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
- 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
- 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
- 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
- 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
- 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
- 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
- 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
- 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
- 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
- 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
- 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
- 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
- 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
- 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
- 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
- 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
- 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
- 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
- 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
- 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
- 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
- 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
- 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
- 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
- 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
- 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
- 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
- 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
- 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
- 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
- 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
- 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
- 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
- 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
- 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
- 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
- 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
- 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
- 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
- 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
- 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
- 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
- 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
- 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
- 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
- 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
- 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
- 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
- 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
- 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
- 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
- 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
- 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
- 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
- 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
- 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
- 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
- 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
- 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
- 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
- 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
- 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
- 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
- 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
- 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
- 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
- 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
- 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
- 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
- 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
- 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
- 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
- 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
- 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
- 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
- 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
- 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
- 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
- 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
- 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
- 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
- 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
- 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
- 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
- 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
- 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
- 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
- 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
- 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
- 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
- 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
- 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
- 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
- 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
- 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
- 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
- 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
- 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
- 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
- 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
- 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
- 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
- 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
- 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
- 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
- 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
- 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
- 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
- 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
- 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
- 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
- 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
- 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
- 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
- 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
- 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
- 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
- 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
- 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
- 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
- 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
- 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
- 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
- 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
- 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
- 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
- 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
- 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
- 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
- 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
- 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
- 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
- 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
- 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
- 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
- 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
- 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
- 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
- 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
- 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
- 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
- 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
- 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
- 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
- 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
- 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
- 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
- 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
- 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
- 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
- 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
- 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
- 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
- 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
- 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
- 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
- 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
- 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
- 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
- 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
- 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
- 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
- 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
- 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
- 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
- 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
- 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
- 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
- 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
- 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
- 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
- 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
- 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
- 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
- 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
- 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
- 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
- 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
- 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
- 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
- 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
- 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
- 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
- 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
- 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
- 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
- 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
- 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
- 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
- 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
- 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
- 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
- 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
- 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
- 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
- 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
- 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
- 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
- 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
- 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
- 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
- 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
- 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
- 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
- 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
- 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
- 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
- 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
- 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
- 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
- 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
- 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
- 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
- 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
- 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
- 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
- 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
- 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
- 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
- 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
- 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
- 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
- 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
- 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
- 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
- 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
- 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
- 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
- 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
- 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
- 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
- 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
- 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
- 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
- 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
- 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
- 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
- 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
- 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
- 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
- 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
- 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
- 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
- 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
- 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
- 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
- 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
- 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
- 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
- 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
- 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
- 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
- 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
- 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
- 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
- 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
- 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
- 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
- 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
- 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
- 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
- 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
- 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
- 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
- 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
- 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
- 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
- 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
- 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
- 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
- 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
- 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
- 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
- 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
- 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
- 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
- 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
- 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
- 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
- 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
- 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
- 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
- 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
- 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
- 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
- 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
- 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
- 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
- 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
- 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
- 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
- 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
- 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
- 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
- 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
- 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
- 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
- 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
- -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
- -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
- 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
- -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
- 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
- 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
- -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
- -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
- -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
- -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
- -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
- -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
- -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
- -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
- -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
- -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
- -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
- -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
- -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
- -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
- -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
- -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
- -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
- -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
- -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
- -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
- -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
- -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
- -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
- -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
- -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
- -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
- -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
- -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
- -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
- -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
- -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
- -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
- -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
- -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
- -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
- -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
- -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
- -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
- -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
- -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
- -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
- -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
- -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
- -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
- -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
- -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
- -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
- -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
- -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
- -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
- -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
- -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
- -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
- -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
- -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
- -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
- -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
- -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
- -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
- -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
- -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
- -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
- -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
- -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
- -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
- -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
- -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
- -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
- -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
- -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
- -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
- -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
- -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
- -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
- -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
- -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
- -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
- -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
- -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
- -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
- -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
- -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
- -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
- -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
- -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
- -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
- -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
- -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
- -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
- -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
- -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
- -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
- -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
- -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
- -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
- -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
- -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
- -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
- -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
- -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
- -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
- -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
- -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
- -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
- -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
- -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
- -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
- -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
- -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
- -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
- -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
- -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
- -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
- -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
- -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
- -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
- -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
- -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
- -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
- -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
- -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
- -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
- -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
- -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
- -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
- -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
- -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
- -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
- -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
- -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
- -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
- -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
- -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
- -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
- -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
- -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
- -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
- -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
- -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
- -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
- -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
- -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
- -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
- -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
- -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
- -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
- -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
- -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
- -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
- -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
- -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
- -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
- -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
- -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
- -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
- -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
- -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
- -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
- -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
- -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
- -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
- -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
- -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
- -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
- -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
- -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
- -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
- -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
- -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
- -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
- -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
- -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
- -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
- -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
- -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
- -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
- -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
- -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
- -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
- -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
- -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
- -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
- -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
- -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
- -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
- -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
- -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
- -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
- -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
- -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
- -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
- -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
- -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
- -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
- -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
- -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
- -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
- -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
- -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
- -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
- -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
- -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
- -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
- -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
- -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
- -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
- -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
- -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
- -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
- -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
- -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
- -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
- -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
- -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
- -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
- -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
- -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
- -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
- -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
- -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
- -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
- -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
- -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
- -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
- -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
- -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
- -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
- -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
- -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
- -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
- -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
- -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
- -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
- -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
- -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
- -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
- -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
- -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
- -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
- -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
- -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
- -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
- -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
- -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
- -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
- -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
- -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
- -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
- -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
- -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
- -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
- -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
- -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
- -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
- -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
- -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
- -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
- -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
- -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
- -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
- -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
- -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
- -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
- -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
- -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
- -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
- -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
- -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
- -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
- -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
- -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
- -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
- -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
- -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
- -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
- -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
- -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
- -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
- -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
- -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
- -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
- -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
- -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
- -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
- -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
- -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
- -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
- -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
- -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
- -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
- -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
- -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
- -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
- -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
- 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
- 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
- -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
- 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
- -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
- -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
- 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
- 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
- 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
- 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
- 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
- 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
- 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
- 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
- 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
- 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
- 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
- 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
- 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
- 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
- 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
- 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
- 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
- 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
- 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
- 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
- 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
- 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
- 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
- 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
- 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
- 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
- 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
- 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
- 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
- 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
- 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
- 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
- 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
- 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
- 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
- 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
- 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
- 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
- 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
- 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
- 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
- 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
- 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
- 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
- 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
- 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
- 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
- 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
- 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
- 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
- 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
- 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
- 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
- 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
- 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
- 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
- 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
- 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
- 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
- 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
- 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
- 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
- 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
- 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
- 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
- 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
- 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
- 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
- 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
- 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
- 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
- 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
- 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
- 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
- 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
- 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
- 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
- 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
- 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
- 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
- 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
- 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
- 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
- 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
- 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
- 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
- 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
- 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
- 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
- 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
- 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
- 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
- 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
- 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
- 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
- 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
- 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
- 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
- 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
- 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
- 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
- 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
- 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
- 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
- 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
- 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
- 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
- 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
- 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
- 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
- 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
- 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
- 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
- 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
- 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
- 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
- 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
- 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
- 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
- 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
- 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
- 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
- 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
- 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
- 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
- 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
- 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
- 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
- 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
- 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
- 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
- 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
- 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
- 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
- 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
- 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
- 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
- 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
- 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
- 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
- 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
- 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
- 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
- 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
- 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
- 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
- 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
- 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
- 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
- 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
- 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
- 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
- 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
- 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
- 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
- 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
- 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
- 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
- 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
- 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
- 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
- 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
- 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
- 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
- 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
- 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
- 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
- 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
- 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
- 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
- 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
- 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
- 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
- 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
- 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
- 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
- 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
- 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
- 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
- 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
- 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
- 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
- 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
- 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
- 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
- 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
- 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
- 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
- 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
- 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
- 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
- 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
- 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
- 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
- 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
- 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
- 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
- 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
- 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
- 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
- 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
- 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
- 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
- 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
- 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
- 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
- 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
- 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
- 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
- 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
- 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
- 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
- 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
- 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
- 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
- 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
- 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
- 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
- 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
- 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
- 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
- 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
- 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
- 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
- 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
- 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
- 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
- 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
- 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
- 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
- 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
- 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
- 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
- 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
- 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
- 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
- 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
- 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
- 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
- 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
- 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
- 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
- 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
- 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
- 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
- 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
- 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
- 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
- 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
- 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
- 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
- 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
- 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
- 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
- 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
- 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
- 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
- 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
- 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
- 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
- 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
- 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
- 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
- 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
- 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
- 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
- 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
- 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
- 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
- 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
- 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
- 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
- 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
- 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
- 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
- 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
- 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
- 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
- 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
- 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
- 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
- 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
- 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
- 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
- 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
- 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
- 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
- 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
- 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
- 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
- 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
- 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
- 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
- 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
- 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
- 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
- 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
- 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
- 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
- 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
- -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
- -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
- 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
- -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
- 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
- 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
- -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
- -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
- -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
- -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
- -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
- -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
- -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
- -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
- -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
- -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
- -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
- -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
- -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
- -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
- -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
- -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
- -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
- -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
- -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
- -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
- -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
- -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
- -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
- -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
- -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
- -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
- -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
- -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
- -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
- -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
- -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
- -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
- -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
- -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
- -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
- -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
- -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
- -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
- -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
- -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
- -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
- -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
- -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
- -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
- -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
- -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
- -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
- -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
- -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
- -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
- -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
- -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
- -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
- -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
- -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
- -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
- -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
- -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
- -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
- -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
- -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
- -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
- -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
- -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
- -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
- -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
- -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
- -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
- -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
- -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
- -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
- -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
- -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
- -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
- -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
- -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
- -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
- -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
- -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
- -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
- -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
- -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
- -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
- -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
- -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
- -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
- -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
- -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
- -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
- -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
- -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
- -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
- -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
- -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
- -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
- -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
- -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
- -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
- -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
- -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
- -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
- -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
- -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
- -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
- -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
- -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
- -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
- -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
- -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
- -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
- -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
- -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
- -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
- -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
- -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
- -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
- -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
- -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
- -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
- -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
- -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
- -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
- -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
- -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
- -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
- -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
- -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
- -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
- -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
- -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
- -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
- -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
- -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
- -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
- -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
- -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
- -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
- -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
- -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
- -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
- -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
- -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
- -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
- -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
- -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
- -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
- -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
- -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
- -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
- -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
- -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
- -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
- -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
- -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
- -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
- -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
- -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
- -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
- -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
- -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
- -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
- -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
- -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
- -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
- -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
- -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
- -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
- -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
- -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
- -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
- -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
- -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
- -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
- -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
- -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
- -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
- -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
- -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
- -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
- -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
- -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
- -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
- -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
- -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
- -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
- -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
- -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
- -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
- -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
- -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
- -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
- -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
- -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
- -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
- -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
- -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
- -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
- -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
- -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
- -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
- -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
- -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
- -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
- -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
- -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
- -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
- -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
- -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
- -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
- -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
- -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
- -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
- -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
- -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
- -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
- -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
- -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
- -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
- -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
- -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
- -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
- -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
- -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
- -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
- -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
- -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
- -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
- -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
- -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
- -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
- -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
- -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
- -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
- -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
- -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
- -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
- -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
- -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
- -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
- -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
- -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
- -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
- -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
- -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
- -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
- -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
- -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
- -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
- -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
- -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
- -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
- -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
- -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
- -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
- -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
- -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
- -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
- -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
- -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
- -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
- -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
- -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
- -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
- -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
- -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
- -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
- -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
- -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
- -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
- -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
- -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
- -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
- -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
- -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
- -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
- -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
- -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
- -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
- -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
- -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
- -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
- -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
- -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
- -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
- -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
- -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
- -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
- -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
- -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
- -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
- -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
- -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
- -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
- -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
- 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
- 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
- -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
- 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
- -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
- -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
- 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
- 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
- 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
- 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
- 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
- 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
- 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
- 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
- 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
- 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
- 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
- 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
- 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
- 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
- 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
- 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
- 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
- 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
- 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
- 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
- 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
- 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
- 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
- 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
- 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
- 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
- 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
- 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
- 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
- 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
- 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
- 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
- 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
- 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
- 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
- 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
- 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
- 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
- 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
- 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
- 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
- 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
- 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
- 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
- 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
- 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
- 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
- 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
- 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
- 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
- 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
- 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
- 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
- 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
- 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
- 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
- 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
- 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
- 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
- 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
- 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
- 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
- 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
- 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
- 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
- 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
- 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
- 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
- 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
- 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
- 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
- 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
- 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
- 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
- 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
- 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
- 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
- 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
- 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
- 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
- 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
- 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
- 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
- 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
- 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
- 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
- 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
- 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
- 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
- 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
- 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
- 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
- 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
- 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
- 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
- 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
- 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
- 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
- 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
- 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
- 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
- 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
- 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
- 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
- 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
- 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
- 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
- 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
- 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
- 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
- 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
- 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
- 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
- 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
- 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
- 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
- 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
- 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
- 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
- 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
- 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
- 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
- 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
- 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
- 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
- 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
- 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
- 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
- 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
- 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
- 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
- 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
- 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
- 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
- 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
- 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
- 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
- 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
- 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
- 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
- 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
- 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
- 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
- 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
- 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
- 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
- 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
- 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
- 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
- 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
- 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
- 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
- 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
- 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
- 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
- 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
- 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
- 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
- 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
- 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
- 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
- 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
- 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
- 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
- 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
- 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
- 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
- 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
- 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
- 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
- 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
- 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
- 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
- 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
- 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
- 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
- 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
- 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
- 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
- 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
- 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
- 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
- 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
- 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
- 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
- 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
- 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
- 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
- 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
- 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
- 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
- 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
- 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
- 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
- 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
- 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
- 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
- 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
- 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
- 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
- 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
- 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
- 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
- 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
- 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
- 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
- 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
- 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
- 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
- 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
- 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
- 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
- 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
- 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
- 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
- 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
- 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
- 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
- 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
- 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
- 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
- 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
- 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
- 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
- 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
- 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
- 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
- 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
- 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
- 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
- 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
- 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
- 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
- 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
- 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
- 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
- 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
- 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
- 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
- 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
- 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
- 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
- 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
- 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
- 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
- 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
- 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
- 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
- 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
- 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
- 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
- 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
- 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
- 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
- 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
- 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
- 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
- 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
- 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
- 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
- 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
- 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
- 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
- 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
- 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
- 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
- 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
- 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
- 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
- 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
- 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
- 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
- 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
- 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
- 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
- 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
- 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
- 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
- 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
- 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
- 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
- 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
- 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
- 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
- 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
- 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
- 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
- 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
- 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
- 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
- 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
- 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
- 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
- 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
- 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
- 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
- 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
- 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
- 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
- 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
- -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
- -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
- 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
- -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
- 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
- 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
- -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
- -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
- -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
- -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
- -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
- -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
- -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
- -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
- -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
- -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
- -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
- -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
- -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
- -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
- -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
- -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
- -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
- -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
- -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
- -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
- -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
- -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
- -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
- -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
- -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
- -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
- -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
- -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
- -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
- -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
- -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
- -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
- -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
- -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
- -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
- -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
- -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
- -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
- -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
- -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
- -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
- -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
- -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
- -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
- -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
- -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
- -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
- -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
- -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
- -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
- -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
- -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
- -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
- -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
- -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
- -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
- -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
- -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
- -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
- -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
- -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
- -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
- -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
- -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
- -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
- -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
- -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
- -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
- -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
- -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
- -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
- -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
- -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
- -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
- -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
- -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
- -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
- -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
- -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
- -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
- -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
- -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
- -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
- -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
- -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
- -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
- -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
- -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
- -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
- -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
- -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
- -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
- -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
- -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
- -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
- -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
- -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
- -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
- -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
- -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
- -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
- -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
- -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
- -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
- -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
- -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
- -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
- -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
- -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
- -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
- -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
- -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
- -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
- -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
- -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
- -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
- -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
- -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
- -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
- -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
- -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
- -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
- -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
- -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
- -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
- -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
- -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
- -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
- -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
- -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
- -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
- -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
- -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
- -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
- -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
- -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
- -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
- -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
- -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
- -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
- -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
- -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
- -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
- -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
- -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
- -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
- -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
- -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
- -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
- -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
- -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
- -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
- -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
- -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
- -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
- -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
- -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
- -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
- -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
- -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
- -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
- -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
- -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
- -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
- -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
- -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
- -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
- -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
- -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
- -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
- -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
- -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
- -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
- -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
- -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
- -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
- -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
- -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
- -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
- -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
- -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
- -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
- -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
- -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
- -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
- -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
- -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
- -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
- -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
- -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
- -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
- -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
- -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
- -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
- -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
- -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
- -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
- -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
- -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
- -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
- -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
- -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
- -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
- -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
- -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
- -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
- -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
- -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
- -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
- -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
- -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
- -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
- -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
- -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
- -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
- -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
- -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
- -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
- -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
- -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
- -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
- -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
- -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
- -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
- -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
- -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
- -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
- -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
- -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
- -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
- -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
- -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
- -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
- -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
- -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
- -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
- -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
- -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
- -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
- -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
- -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
- -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
- -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
- -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
- -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
- -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
- -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
- -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
- -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
- -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
- -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
- -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
- -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
- -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
- -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
- -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
- -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
- -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
- -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
- -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
- -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
- -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
- -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
- -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
- -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
- -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
- -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
- -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
- -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
- -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
- -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
- -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
- -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
- -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
- -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
- -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
- -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
- -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
- -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
- -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
- -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
- -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
- -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
- -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
- -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
- -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
- -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
- -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
- -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
- -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
- -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
- -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
- -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
- -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
- 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
- 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
- -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
- 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
- -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
- -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
- 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
- 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
- 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
- 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
- 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
- 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
- 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
- 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
- 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
- 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
- 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
- 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
- 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
- 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
- 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
- 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
- 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
- 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
- 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
- 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
- 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
- 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
- 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
- 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
- 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
- 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
- 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
- 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
- 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
- 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
- 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
- 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
- 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
- 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
- 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
- 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
- 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
- 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
- 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
- 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
- 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
- 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
- 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
- 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
- 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
- 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
- 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
- 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
- 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
- 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
- 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
- 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
- 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
- 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
- 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
- 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
- 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
- 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
- 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
- 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
- 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
- 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
- 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
- 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
- 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
- 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
- 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
- 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
- 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
- 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
- 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
- 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
- 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
- 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
- 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
- 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
- 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
- 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
- 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
- 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
- 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
- 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
- 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
- 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
- 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
- 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
- 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
- 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
- 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
- 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
- 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
- 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
- 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
- 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
- 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
- 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
- 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
- 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
- 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
- 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
- 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
- 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
- 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
- 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
- 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
- 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
- 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
- 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
- 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
- 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
- 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
- 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
- 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
- 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
- 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
- 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
- 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
- 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
- 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
- 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
- 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
- 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
- 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
- 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
- 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
- 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
- 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
- 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
- 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
- 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
- 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
- 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
- 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
- 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
- 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
- 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
- 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
- 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
- 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
- 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
- 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
- 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
- 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
- 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
- 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
- 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
- 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
- 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
- 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
- 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
- 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
- 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
- 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
- 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
- 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
- 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
- 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
- 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
- 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
- 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
- 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
- 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
- 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
- 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
- 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
- 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
- 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
- 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
- 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
- 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
- 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
- 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
- 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
- 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
- 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
- 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
- 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
- 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
- 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
- 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
- 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
- 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
- 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
- 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
- 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
- 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
- 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
- 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
- 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
- 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
- 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
- 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
- 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
- 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
- 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
- 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
- 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
- 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
- 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
- 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
- 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
- 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
- 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
- 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
- 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
- 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
- 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
- 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
- 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
- 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
- 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
- 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
- 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
- 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
- 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
- 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
- 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
- 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
- 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
- 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
- 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
- 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
- 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
- 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
- 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
- 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
- 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
- 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
- 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
- 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
- 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
- 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
- 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
- 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
- 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
- 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
- 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
- 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
- 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
- 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
- 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
- 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
- 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
- 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
- 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
- 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
- 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
- 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
- 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
- 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
- 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
- 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
- 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
- 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
- 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
- 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
- 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
- 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
- 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
- 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
- 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
- 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
- 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
- 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
- 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
- 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
- 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
- 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
- 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
- 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
- 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
- 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
- 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
- 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
- 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
- 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
- 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
- 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
- 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
- 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
- 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
- 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
- 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
- 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
- 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
- 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
- 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
- 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
- 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
- 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
- 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
- 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
- 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
- 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
- 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
- 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
- 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
- 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
- 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
- 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
- -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
- -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
- 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
- -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
- 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
- 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
- -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
- -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
- -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
- -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
- -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
- -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
- -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
- -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
- -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
- -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
- -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
- -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
- -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
- -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
- -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
- -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
- -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
- -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
- -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
- -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
- -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
- -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
- -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
- -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
- -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
- -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
- -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
- -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
- -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
- -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
- -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
- -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
- -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
- -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
- -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
- -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
- -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
- -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
- -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
- -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
- -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
- -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
- -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
- -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
- -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
- -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
- -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
- -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
- -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
- -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
- -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
- -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
- -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
- -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
- -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
- -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
- -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
- -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
- -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
- -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
- -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
- -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
- -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
- -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
- -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
- -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
- -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
- -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
- -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
- -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
- -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
- -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
- -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
- -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
- -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
- -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
- -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
- -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
- -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
- -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
- -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
- -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
- -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
- -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
- -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
- -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
- -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
- -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
- -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
- -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
- -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
- -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
- -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
- -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
- -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
- -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
- -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
- -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
- -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
- -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
- -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
- -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
- -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
- -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
- -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
- -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
- -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
- -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
- -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
- -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
- -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
- -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
- -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
- -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
- -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
- -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
- -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
- -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
- -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
- -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
- -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
- -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
- -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
- -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
- -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
- -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
- -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
- -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
- -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
- -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
- -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
- -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
- -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
- -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
- -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
- -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
- -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
- -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
- -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
- -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
- -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
- -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
- -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
- -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
- -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
- -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
- -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
- -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
- -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
- -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
- -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
- -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
- -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
- -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
- -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
- -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
- -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
- -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
- -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
- -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
- -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
- -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
- -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
- -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
- -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
- -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
- -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
- -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
- -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
- -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
- -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
- -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
- -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
- -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
- -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
- -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
- -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
- -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
- -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
- -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
- -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
- -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
- -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
- -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
- -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
- -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
- -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
- -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
- -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
- -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
- -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
- -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
- -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
- -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
- -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
- -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
- -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
- -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
- -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
- -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
- -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
- -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
- -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
- -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
- -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
- -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
- -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
- -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
- -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
- -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
- -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
- -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
- -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
- -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
- -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
- -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
- -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
- -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
- -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
- -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
- -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
- -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
- -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
- -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
- -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
- -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
- -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
- -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
- -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
- -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
- -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
- -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
- -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
- -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
- -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
- -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
- -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
- -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
- -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
- -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
- -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
- -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
- -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
- -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
- -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
- -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
- -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
- -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
- -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
- -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
- -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
- -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
- -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
- -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
- -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
- -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
- -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
- -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
- -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
- -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
- -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
- -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
- -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
- -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
- -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
- -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
- -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
- -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
- -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
- -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
- -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
- -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
- -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
- -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
- -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
- -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
- -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
- -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
- -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
- -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
- -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
- -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
- -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
- -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
- -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
- -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
- -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
- -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
- -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
- -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
- -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
- -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
- -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
- -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
- 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
- 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
- -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
- 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
- -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
- -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
- 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
- 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
- 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
- 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
- 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
- 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
- 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
- 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
- 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
- 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
- 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
- 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
- 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
- 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
- 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
- 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
- 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
- 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
- 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
- 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
- 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
- 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
- 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
- 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
- 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
- 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
- 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
- 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
- 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
- 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
- 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
- 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
- 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
- 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
- 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
- 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
- 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
- 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
- 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
- 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
- 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
- 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
- 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
- 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
- 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
- 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
- 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
- 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
- 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
- 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
- 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
- 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
- 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
- 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
- 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
- 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
- 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
- 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
- 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
- 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
- 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
- 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
- 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
- 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
- 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
- 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
- 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
- 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
- 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
- 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
- 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
- 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
- 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
- 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
- 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
- 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
- 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
- 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
- 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
- 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
- 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
- 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
- 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
- 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
- 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
- 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
- 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
- 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
- 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
- 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
- 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
- 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
- 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
- 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
- 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
- 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
- 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
- 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
- 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
- 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
- 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
- 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
- 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
- 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
- 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
- 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
- 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
- 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
- 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
- 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
- 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
- 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
- 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
- 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
- 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
- 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
- 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
- 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
- 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
- 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
- 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
- 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
- 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
- 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
- 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
- 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
- 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
- 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
- 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
- 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
- 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
- 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
- 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
- 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
- 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
- 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
- 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
- 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
- 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
- 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
- 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
- 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
- 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
- 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
- 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
- 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
- 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
- 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
- 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
- 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
- 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
- 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
- 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
- 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
- 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
- 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
- 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
- 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
- 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
- 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
- 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
- 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
- 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
- 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
- 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
- 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
- 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
- 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
- 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
- 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
- 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
- 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
- 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
- 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
- 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
- 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
- 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
- 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
- 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
- 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
- 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
- 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
- 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
- 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
- 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
- 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
- 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
- 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
- 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
- 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
- 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
- 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
- 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
- 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
- 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
- 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
- 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
- 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
- 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
- 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
- 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
- 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
- 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
- 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
- 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
- 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
- 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
- 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
- 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
- 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
- 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
- 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
- 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
- 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
- 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
- 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
- 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
- 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
- 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
- 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
- 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
- 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
- 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
- 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
- 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
- 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
- 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
- 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
- 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
- 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
- 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
- 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
- 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
- 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
- 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
- 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
- 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
- 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
- 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
- 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
- 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
- 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
- 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
- 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
- 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
- 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
- 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
- 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
- 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
- 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
- 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
- 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
- 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
- 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
- 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
- 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
- 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
- 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
- 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
- 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
- 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
- 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
- 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
- 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
- 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
- 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
- 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
- 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
- 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
- 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
- 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
- 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
- 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
- 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
- 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
- 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
- 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
- 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
- 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
- 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
- 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
- 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
- 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
- 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
- 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
- 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
- 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
- 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
- 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
- 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
- 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
- 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
- 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
- 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
- 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
- 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
- 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
- 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
- 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
- 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
- -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
- -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
- 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
- -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
- 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
- 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
- -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
- -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
- -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
- -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
- -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
- -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
- -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
- -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
- -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
- -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
- -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
- -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
- -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
- -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
- -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
- -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
- -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
- -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
- -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
- -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
- -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
- -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
- -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
- -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
- -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
- -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
- -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
- -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
- -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
- -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
- -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
- -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
- -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
- -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
- -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
- -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
- -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
- -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
- -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
- -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
- -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
- -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
- -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
- -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
- -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
- -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
- -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
- -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
- -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
- -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
- -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
- -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
- -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
- -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
- -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
- -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
- -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
- -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
- -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
- -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
- -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
- -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
- -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
- -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
- -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
- -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
- -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
- -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
- -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
- -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
- -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
- -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
- -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
- -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
- -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
- -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
- -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
- -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
- -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
- -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
- -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
- -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
- -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
- -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
- -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
- -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
- -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
- -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
- -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
- -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
- -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
- -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
- -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
- -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
- -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
- -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
- -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
- -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
- -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
- -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
- -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
- -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
- -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
- -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
- -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
- -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
- -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
- -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
- -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
- -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
- -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
- -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
- -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
- -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
- -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
- -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
- -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
- -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
- -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
- -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
- -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
- -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
- -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
- -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
- -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
- -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
- -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
- -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
- -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
- -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
- -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
- -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
- -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
- -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
- -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
- -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
- -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
- -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
- -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
- -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
- -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
- -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
- -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
- -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
- -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
- -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
- -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
- -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
- -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
- -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
- -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
- -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
- -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
- -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
- -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
- -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
- -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
- -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
- -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
- -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
- -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
- -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
- -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
- -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
- -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
- -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
- -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
- -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
- -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
- -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
- -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
- -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
- -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
- -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
- -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
- -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
- -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
- -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
- -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
- -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
- -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
- -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
- -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
- -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
- -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
- -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
- -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
- -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
- -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
- -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
- -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
- -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
- -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
- -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
- -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
- -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
- -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
- -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
- -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
- -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
- -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
- -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
- -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
- -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
- -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
- -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
- -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
- -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
- -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
- -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
- -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
- -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
- -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
- -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
- -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
- -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
- -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
- -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
- -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
- -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
- -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
- -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
- -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
- -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
- -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
- -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
- -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
- -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
- -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
- -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
- -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
- -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
- -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
- -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
- -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
- -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
- -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
- -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
- -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
- -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
- -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
- -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
- -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
- -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
- -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
- -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
- -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
- -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
- -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
- -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
- -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
- -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
- -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
- -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
- -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
- -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
- -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
- -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
- -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
- -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
- -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
- -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
- -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
- -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
- -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
- -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
- -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
- -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
- -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
- -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
- -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
- -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
- -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
- -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
- -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
- -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
- -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
- -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
- -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
- -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
- -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
- -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
- -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
- -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
- -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
- -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
- -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
- -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
- -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
- -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
- -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
- -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
- -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
- -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
- 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
- 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
- -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
- 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
- -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
- -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
- 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
- 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
- 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
- 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
- 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
- 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
- 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
- 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
- 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
- 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
- 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
- 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
- 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
- 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
- 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
- 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
- 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
- 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
- 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
- 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
- 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
- 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
- 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
- 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
- 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
- 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
- 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
- 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
- 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
- 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
- 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
- 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
- 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
- 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
- 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
- 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
- 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
- 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
- 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
- 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
- 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
- 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
- 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
- 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
- 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
- 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
- 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
- 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
- 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
- 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
- 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
- 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
- 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
- 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
- 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
- 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
- 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
- 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
- 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
- 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
- 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
- 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
- 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
- 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
- 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
- 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
- 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
- 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
- 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
- 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
- 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
- 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
- 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
- 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
- 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
- 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
- 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
- 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
- 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
- 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
- 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
- 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
- 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
- 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
- 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
- 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
- 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
- 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
- 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
- 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
- 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
- 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
- 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
- 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
- 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
- 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
- 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
- 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
- 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
- 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
- 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
- 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
- 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
- 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
- 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
- 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
- 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
- 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
- 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
- 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
- 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
- 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
- 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
- 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
- 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
- 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
- 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
- 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
- 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
- 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
- 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
- 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
- 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
- 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
- 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
- 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
- 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
- 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
- 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
- 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
- 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
- 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
- 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
- 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
- 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
- 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
- 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
- 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
- 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
- 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
- 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
- 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
- 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
- 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
- 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
- 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
- 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
- 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
- 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
- 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
- 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
- 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
- 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
- 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
- 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
- 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
- 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
- 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
- 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
- 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
- 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
- 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
- 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
- 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
- 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
- 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
- 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
- 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
- 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
- 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
- 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
- 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
- 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
- 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
- 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
- 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
- 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
- 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
- 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
- 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
- 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
- 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
- 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
- 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
- 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
- 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
- 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
- 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
- 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
- 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
- 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
- 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
- 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
- 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
- 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
- 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
- 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
- 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
- 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
- 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
- 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
- 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
- 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
- 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
- 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
- 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
- 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
- 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
- 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
- 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
- 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
- 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
- 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
- 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
- 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
- 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
- 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
- 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
- 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
- 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
- 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
- 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
- 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
- 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
- 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
- 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
- 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
- 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
- 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
- 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
- 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
- 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
- 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
- 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
- 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
- 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
- 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
- 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
- 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
- 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
- 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
- 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
- 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
- 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
- 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
- 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
- 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
- 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
- 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
- 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
- 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
- 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
- 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
- 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
- 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
- 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
- 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
- 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
- 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
- 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
- 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
- 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
- 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
- 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
- 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
- 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
- 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
- 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
- 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
- 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
- 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
- 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
- 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
- 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
- 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
- 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
- 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
- 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
- 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
- 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
- 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
- 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
- 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
- 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
- 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
- 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
- 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
- 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
- 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
- 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
- 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
- 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
- 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
- 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
- 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
- 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
- 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
- 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
- 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
- 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
- -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
- -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
- 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
- -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
- 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
- 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
- -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
- -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
- -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
- -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
- -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
- -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
- -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
- -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
- -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
- -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
- -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
- -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
- -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
- -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
- -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
- -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
- -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
- -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
- -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
- -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
- -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
- -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
- -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
- -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
- -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
- -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
- -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
- -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
- -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
- -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
- -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
- -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
- -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
- -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
- -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
- -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
- -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
- -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
- -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
- -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
- -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
- -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
- -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
- -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
- -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
- -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
- -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
- -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
- -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
- -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
- -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
- -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
- -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
- -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
- -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
- -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
- -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
- -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
- -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
- -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
- -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
- -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
- -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
- -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
- -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
- -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
- -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
- -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
- -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
- -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
- -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
- -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
- -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
- -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
- -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
- -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
- -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
- -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
- -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
- -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
- -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
- -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
- -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
- -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
- -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
- -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
- -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
- -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
- -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
- -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
- -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
- -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
- -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
- -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
- -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
- -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
- -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
- -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
- -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
- -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
- -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
- -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
- -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
- -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
- -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
- -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
- -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
- -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
- -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
- -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
- -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
- -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
- -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
- -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
- -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
- -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
- -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
- -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
- -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
- -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
- -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
- -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
- -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
- -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
- -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
- -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
- -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
- -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
- -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
- -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
- -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
- -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
- -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
- -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
- -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
- -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
- -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
- -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
- -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
- -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
- -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
- -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
- -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
- -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
- -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
- -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
- -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
- -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
- -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
- -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
- -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
- -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
- -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
- -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
- -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
- -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
- -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
- -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
- -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
- -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
- -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
- -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
- -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
- -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
- -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
- -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
- -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
- -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
- -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
- -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
- -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
- -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
- -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
- -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
- -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
- -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
- -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
- -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
- -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
- -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
- -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
- -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
- -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
- -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
- -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
- -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
- -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
- -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
- -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
- -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
- -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
- -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
- -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
- -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
- -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
- -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
- -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
- -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
- -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
- -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
- -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
- -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
- -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
- -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
- -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
- -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
- -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
- -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
- -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
- -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
- -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
- -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
- -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
- -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
- -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
- -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
- -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
- -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
- -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
- -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
- -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
- -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
- -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
- -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
- -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
- -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
- -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
- -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
- -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
- -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
- -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
- -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
- -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
- -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
- -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
- -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
- -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
- -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
- -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
- -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
- -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
- -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
- -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
- -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
- -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
- -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
- -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
- -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
- -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
- -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
- -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
- -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
- -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
- -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
- -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
- -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
- -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
- -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
- -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
- -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
- -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
- -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
- -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
- -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
- -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
- -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
- -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
- -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
- -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
- -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
- -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
- -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
- -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
- -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
- -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
- -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
- -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
- -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
- -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
- -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
- -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
- -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
- -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
- -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
- -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
- -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
- -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
- -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
- -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
- -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
- -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
- -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
- -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
- -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
- 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
- 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
- -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
- 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
- -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
- -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
- 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
- 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
- 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
- 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
- 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
- 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
- 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
- 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
- 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
- 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
- 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
- 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
- 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
- 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
- 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
- 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
- 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
- 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
- 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
- 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
- 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
- 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
- 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
- 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
- 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
- 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
- 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
- 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
- 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
- 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
- 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
- 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
- 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
- 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
- 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
- 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
- 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
- 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
- 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
- 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
- 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
- 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
- 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
- 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
- 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
- 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
- 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
- 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
- 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
- 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
- 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
- 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
- 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
- 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
- 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
- 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
- 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
- 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
- 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
- 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
- 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
- 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
- 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
- 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
- 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
- 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
- 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
- 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
- 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
- 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
- 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
- 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
- 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
- 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
- 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
- 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
- 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
- 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
- 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
- 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
- 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
- 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
- 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
- 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
- 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
- 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
- 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
- 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
- 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
- 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
- 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
- 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
- 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
- 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
- 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
- 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
- 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
- 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
- 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
- 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
- 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
- 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
- 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
- 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
- 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
- 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
- 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
- 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
- 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
- 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
- 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
- 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
- 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
- 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
- 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
- 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
- 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
- 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
- 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
- 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
- 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
- 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
- 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
- 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
- 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
- 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
- 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
- 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
- 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
- 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
- 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
- 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
- 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
- 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
- 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
- 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
- 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
- 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
- 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
- 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
- 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
- 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
- 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
- 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
- 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
- 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
- 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
- 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
- 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
- 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
- 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
- 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
- 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
- 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
- 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
- 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
- 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
- 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
- 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
- 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
- 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
- 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
- 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
- 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
- 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
- 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
- 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
- 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
- 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
- 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
- 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
- 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
- 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
- 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
- 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
- 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
- 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
- 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
- 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
- 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
- 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
- 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
- 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
- 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
- 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
- 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
- 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
- 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
- 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
- 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
- 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
- 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
- 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
- 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
- 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
- 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
- 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
- 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
- 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
- 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
- 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
- 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
- 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
- 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
- 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
- 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
- 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
- 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
- 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
- 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
- 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
- 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
- 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
- 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
- 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
- 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
- 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
- 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
- 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
- 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
- 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
- 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
- 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
- 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
- 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
- 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
- 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
- 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
- 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
- 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
- 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
- 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
- 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
- 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
- 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
- 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
- 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
- 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
- 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
- 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
- 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
- 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
- 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
- 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
- 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
- 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
- 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
- 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
- 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
- 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
- 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
- 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
- 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
- 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
- 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
- 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
- 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
- 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
- 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
- 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
- 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
- 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
- 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
- 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
- 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
- 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
- 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
- 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
- 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
- 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
- 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
- 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
- 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
- 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
- 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
- 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
- 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
- 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
- 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
- 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
- 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
- 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
- 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
- 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
- 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
- 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
- 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
- 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
- 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
- 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
- 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
- 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
- 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
- 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
- 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
- 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
- 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
- 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
- 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
- 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
- -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
- -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
- 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
- -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
- 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
- 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
- -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
- -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
- -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
- -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
- -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
- -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
- -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
- -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
- -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
- -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
- -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
- -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
- -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
- -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
- -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
- -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
- -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
- -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
- -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
- -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
- -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
- -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
- -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
- -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
- -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
- -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
- -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
- -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
- -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
- -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
- -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
- -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
- -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
- -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
- -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
- -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
- -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
- -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
- -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
- -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
- -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
- -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
- -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
- -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
- -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
- -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
- -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
- -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
- -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
- -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
- -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
- -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
- -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
- -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
- -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
- -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
- -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
- -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
- -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
- -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
- -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
- -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
- -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
- -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
- -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
- -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
- -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
- -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
- -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
- -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
- -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
- -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
- -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
- -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
- -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
- -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
- -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
- -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
- -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
- -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
- -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
- -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
- -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
- -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
- -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
- -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
- -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
- -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
- -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
- -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
- -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
- -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
- -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
- -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
- -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
- -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
- -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
- -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
- -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
- -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
- -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
- -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
- -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
- -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
- -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
- -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
- -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
- -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
- -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
- -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
- -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
- -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
- -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
- -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
- -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
- -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
- -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
- -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
- -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
- -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
- -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
- -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
- -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
- -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
- -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
- -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
- -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
- -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
- -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
- -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
- -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
- -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
- -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
- -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
- -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
- -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
- -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
- -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
- -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
- -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
- -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
- -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
- -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
- -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
- -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
- -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
- -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
- -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
- -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
- -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
- -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
- -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
- -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
- -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
- -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
- -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
- -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
- -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
- -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
- -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
- -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
- -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
- -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
- -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
- -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
- -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
- -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
- -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
- -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
- -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
- -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
- -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
- -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
- -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
- -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
- -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
- -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
- -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
- -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
- -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
- -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
- -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
- -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
- -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
- -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
- -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
- -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
- -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
- -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
- -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
- -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
- -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
- -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
- -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
- -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
- -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
- -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
- -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
- -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
- -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
- -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
- -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
- -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
- -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
- -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
- -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
- -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
- -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
- -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
- -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
- -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
- -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
- -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
- -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
- -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
- -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
- -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
- -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
- -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
- -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
- -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
- -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
- -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
- -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
- -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
- -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
- -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
- -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
- -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
- -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
- -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
- -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
- -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
- -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
- -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
- -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
- -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
- -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
- -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
- -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
- -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
- -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
- -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
- -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
- -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
- -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
- -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
- -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
- -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
- -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
- -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
- -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
- -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
- -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
- -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
- -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
- -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
- -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
- -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
- -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
- -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
- -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
- -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
- -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
- -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
- -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
- -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
- -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
- -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
- -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
- -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
- -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
- -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
- -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
- -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
- -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
- -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
- -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
- -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
- -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
- -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
- -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
- -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
- -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
- -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
- -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
- -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
- -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
- -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
- -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
- -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
- -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
- -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
- -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
- 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
- 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
- -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
- 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
- -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
- -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
- 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
- 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
- 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
- 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
- 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
- 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
- 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
- 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
- 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
- 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
- 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
- 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
- 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
- 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
- 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
- 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
- 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
- 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
- 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
- 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
- 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
- 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
- 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
- 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
- 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
- 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
- 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
- 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
- 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
- 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
- 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
- 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
- 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
- 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
- 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
- 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
- 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
- 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
- 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
- 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
- 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
- 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
- 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
- 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
- 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
- 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
- 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
- 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
- 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
- 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
- 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
- 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
- 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
- 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
- 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
- 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
- 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
- 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
- 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
- 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
- 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
- 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
- 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
- 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
- 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
- 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
- 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
- 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
- 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
- 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
- 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
- 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
- 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
- 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
- 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
- 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
- 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
- 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
- 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
- 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
- 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
- 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
- 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
- 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
- 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
- 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
- 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
- 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
- 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
- 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
- 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
- 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
- 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
- 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
- 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
- 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
- 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
- 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
- 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
- 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
- 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
- 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
- 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
- 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
- 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
- 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
- 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
- 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
- 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
- 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
- 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
- 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
- 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
- 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
- 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
- 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
- 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
- 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
- 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
- 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
- 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
- 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
- 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
- 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
- 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
- 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
- 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
- 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
- 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
- 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
- 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
- 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
- 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
- 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
- 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
- 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
- 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
- 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
- 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
- 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
- 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
- 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
- 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
- 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
- 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
- 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
- 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
- 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
- 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
- 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
- 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
- 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
- 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
- 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
- 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
- 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
- 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
- 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
- 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
- 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
- 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
- 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
- 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
- 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
- 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
- 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
- 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
- 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
- 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
- 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
- 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
- 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
- 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
- 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
- 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
- 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
- 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
- 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
- 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
- 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
- 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
- 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
- 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
- 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
- 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
- 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
- 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
- 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
- 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
- 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
- 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
- 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
- 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
- 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
- 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
- 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
- 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
- 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
- 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
- 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
- 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
- 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
- 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
- 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
- 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
- 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
- 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
- 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
- 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
- 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
- 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
- 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
- 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
- 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
- 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
- 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
- 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
- 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
- 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
- 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
- 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
- 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
- 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
- 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
- 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
- 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
- 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
- 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
- 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
- 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
- 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
- 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
- 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
- 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
- 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
- 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
- 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
- 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
- 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
- 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
- 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
- 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
- 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
- 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
- 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
- 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
- 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
- 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
- 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
- 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
- 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
- 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
- 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
- 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
- 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
- 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
- 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
- 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
- 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
- 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
- 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
- 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
- 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
- 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
- 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
- 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
- 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
- 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
- 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
- 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
- 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
- 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
- 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
- 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
- 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
- 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
- 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
- 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
- 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
- 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
- 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
- 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
- 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
- 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
- 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
- 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
- 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
- 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
- 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
- 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
- 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
- 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
- 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
- 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
- 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
- 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
- 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
- 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
- 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
- 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
- -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
- -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
- 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
- -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
- 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
- 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
- -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
- -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
- -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
- -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
- -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
- -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
- -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
- -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
- -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
- -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
- -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
- -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
- -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
- -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
- -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
- -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
- -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
- -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
- -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
- -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
- -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
- -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
- -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
- -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
- -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
- -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
- -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
- -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
- -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
- -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
- -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
- -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
- -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
- -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
- -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
- -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
- -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
- -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
- -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
- -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
- -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
- -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
- -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
- -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
- -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
- -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
- -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
- -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
- -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
- -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
- -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
- -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
- -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
- -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
- -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
- -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
- -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
- -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
- -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
- -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
- -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
- -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
- -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
- -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
- -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
- -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
- -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
- -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
- -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
- -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
- -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
- -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
- -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
- -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
- -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
- -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
- -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
- -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
- -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
- -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
- -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
- -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
- -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
- -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
- -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
- -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
- -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
- -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
- -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
- -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
- -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
- -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
- -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
- -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
- -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
- -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
- -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
- -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
- -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
- -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
- -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
- -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
- -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
- -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
- -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
- -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
- -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
- -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
- -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
- -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
- -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
- -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
- -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
- -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
- -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
- -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
- -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
- -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
- -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
- -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
- -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
- -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
- -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
- -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
- -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
- -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
- -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
- -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
- -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
- -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
- -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
- -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
- -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
- -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
- -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
- -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
- -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
- -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
- -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
- -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
- -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
- -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
- -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
- -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
- -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
- -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
- -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
- -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
- -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
- -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
- -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
- -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
- -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
- -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
- -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
- -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
- -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
- -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
- -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
- -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
- -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
- -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
- -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
- -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
- -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
- -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
- -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
- -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
- -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
- -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
- -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
- -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
- -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
- -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
- -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
- -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
- -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
- -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
- -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
- -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
- -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
- -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
- -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
- -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
- -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
- -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
- -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
- -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
- -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
- -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
- -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
- -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
- -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
- -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
- -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
- -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
- -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
- -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
- -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
- -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
- -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
- -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
- -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
- -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
- -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
- -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
- -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
- -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
- -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
- -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
- -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
- -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
- -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
- -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
- -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
- -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
- -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
- -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
- -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
- -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
- -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
- -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
- -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
- -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
- -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
- -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
- -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
- -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
- -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
- -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
- -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
- -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
- -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
- -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
- -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
- -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
- -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
- -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
- -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
- -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
- -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
- -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
- -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
- -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
- -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
- -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
- -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
- -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
- -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
- -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
- -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
- -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
- -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
- -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
- -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
- -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
- -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
- -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
- -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
- -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
- -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
- -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
- -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
- -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
- -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
- -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
- -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
- -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
- -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
- -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
- -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
- -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
- -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
- -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
- -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
- -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
- -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
- -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
- -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
- -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
- -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
- -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
- -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
- -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
- -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
- -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
- -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
- -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
- -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
- -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
- -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
- -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
- -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
- -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
- 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
- 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
- -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
- 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
- -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
- -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
- 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
- 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
- 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
- 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
- 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
- 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
- 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
- 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
- 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
- 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
- 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
- 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
- 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
- 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
- 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
- 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
- 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
- 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
- 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
- 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
- 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
- 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
- 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
- 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
- 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
- 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
- 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
- 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
- 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
- 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
- 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
- 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
- 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
- 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
- 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
- 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
- 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
- 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
- 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
- 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
- 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
- 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
- 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
- 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
- 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
- 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
- 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
- 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
- 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
- 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
- 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
- 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
- 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
- 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
- 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
- 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
- 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
- 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
- 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
- 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
- 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
- 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
- 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
- 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
- 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
- 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
- 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
- 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
- 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
- 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
- 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
- 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
- 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
- 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
- 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
- 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
- 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
- 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
- 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
- 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
- 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
- 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
- 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
- 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
- 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
- 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
- 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
- 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
- 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
- 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
- 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
- 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
- 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
- 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
- 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
- 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
- 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
- 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
- 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
- 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
- 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
- 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
- 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
- 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
- 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
- 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
- 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
- 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
- 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
- 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
- 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
- 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
- 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
- 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
- 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
- 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
- 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
- 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
- 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
- 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
- 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
- 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
- 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
- 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
- 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
- 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
- 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
- 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
- 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
- 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
- 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
- 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
- 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
- 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
- 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
- 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
- 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
- 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
- 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
- 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
- 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
- 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
- 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
- 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
- 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
- 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
- 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
- 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
- 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
- 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
- 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
- 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
- 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
- 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
- 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
- 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
- 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
- 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
- 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
- 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
- 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
- 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
- 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
- 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
- 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
- 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
- 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
- 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
- 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
- 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
- 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
- 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
- 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
- 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
- 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
- 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
- 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
- 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
- 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
- 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
- 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
- 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
- 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
- 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
- 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
- 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
- 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
- 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
- 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
- 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
- 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
- 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
- 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
- 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
- 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
- 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
- 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
- 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
- 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
- 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
- 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
- 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
- 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
- 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
- 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
- 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
- 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
- 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
- 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
- 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
- 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
- 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
- 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
- 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
- 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
- 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
- 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
- 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
- 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
- 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
- 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
- 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
- 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
- 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
- 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
- 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
- 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
- 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
- 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
- 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
- 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
- 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
- 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
- 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
- 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
- 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
- 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
- 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
- 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
- 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
- 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
- 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
- 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
- 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
- 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
- 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
- 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
- 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
- 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
- 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
- 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
- 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
- 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
- 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
- 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
- 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
- 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
- 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
- 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
- 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
- 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
- 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
- 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
- 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
- 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
- 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
- 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
- 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
- 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
- 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
- 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
- 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
- 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
- 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
- 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
- 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
- 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
- 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
- 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
- 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
- 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
- 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
- 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
- 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
- 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
- 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
- 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
- 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
- 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
- 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
- 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
- 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
- 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
- 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
- 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
- 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
- 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
- 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
- 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
- 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
- -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
- -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
- 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
- -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
- 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
- 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
- -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
- -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
- -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
- -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
- -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
- -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
- -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
- -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
- -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
- -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
- -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
- -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
- -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
- -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
- -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
- -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
- -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
- -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
- -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
- -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
- -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
- -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
- -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
- -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
- -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
- -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
- -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
- -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
- -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
- -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
- -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
- -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
- -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
- -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
- -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
- -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
- -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
- -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
- -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
- -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
- -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
- -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
- -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
- -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
- -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
- -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
- -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
- -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
- -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
- -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
- -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
- -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
- -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
- -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
- -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
- -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
- -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
- -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
- -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
- -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
- -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
- -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
- -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
- -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
- -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
- -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
- -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
- -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
- -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
- -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
- -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
- -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
- -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
- -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
- -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
- -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
- -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
- -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
- -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
- -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
- -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
- -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
- -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
- -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
- -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
- -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
- -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
- -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
- -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
- -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
- -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
- -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
- -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
- -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
- -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
- -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
- -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
- -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
- -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
- -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
- -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
- -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
- -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
- -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
- -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
- -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
- -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
- -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
- -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
- -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
- -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
- -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
- -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
- -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
- -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
- -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
- -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
- -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
- -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
- -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
- -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
- -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
- -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
- -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
- -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
- -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
- -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
- -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
- -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
- -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
- -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
- -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
- -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
- -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
- -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
- -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
- -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
- -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
- -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
- -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
- -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
- -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
- -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
- -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
- -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
- -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
- -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
- -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
- -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
- -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
- -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
- -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
- -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
- -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
- -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
- -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
- -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
- -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
- -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
- -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
- -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
- -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
- -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
- -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
- -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
- -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
- -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
- -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
- -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
- -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
- -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
- -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
- -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
- -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
- -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
- -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
- -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
- -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
- -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
- -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
- -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
- -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
- -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
- -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
- -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
- -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
- -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
- -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
- -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
- -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
- -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
- -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
- -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
- -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
- -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
- -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
- -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
- -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
- -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
- -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
- -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
- -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
- -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
- -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
- -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
- -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
- -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
- -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
- -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
- -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
- -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
- -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
- -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
- -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
- -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
- -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
- -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
- -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
- -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
- -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
- -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
- -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
- -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
- -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
- -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
- -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
- -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
- -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
- -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
- -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
- -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
- -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
- -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
- -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
- -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
- -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
- -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
- -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
- -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
- -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
- -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
- -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
- -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
- -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
- -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
- -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
- -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
- -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
- -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
- -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
- -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
- -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
- -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
- 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
- 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
- -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
- 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
- -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
- -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
- 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
- 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
- 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
- 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
- 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
- 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
- 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
- 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
- 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
- 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
- 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
- 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
- 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
- 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
- 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
- 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
- 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
- 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
- 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
- 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
- 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
- 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
- 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
- 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
- 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
- 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
- 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
- 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
- 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
- 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
- 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
- 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
- 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
- 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
- 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
- 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
- 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
- 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
- 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
- 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
- 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
- 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
- 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
- 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
- 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
- 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
- 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
- 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
- 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
- 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
- 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
- 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
- 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
- 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
- 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
- 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
- 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
- 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
- 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
- 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
- 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
- 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
- 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
- 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
- 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
- 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
- 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
- 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
- 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
- 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
- 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
- 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
- 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
- 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
- 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
- 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
- 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
- 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
- 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
- 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
- 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
- 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
- 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
- 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
- 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
- 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
- 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
- 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
- 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
- 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
- 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
- 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
- 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
- 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
- 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
- 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
- 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
- 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
- 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
- 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
- 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
- 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
- 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
- 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
- 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
- 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
- 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
- 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
- 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
- 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
- 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
- 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
- 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
- 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
- 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
- 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
- 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
- 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
- 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
- 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
- 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
- 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
- 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
- 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
- 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
- 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
- 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
- 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
- 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
- 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
- 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
- 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
- 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
- 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
- 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
- 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
- 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
- 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
- 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
- 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
- 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
- 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
- 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
- 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
- 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
- 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
- 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
- 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
- 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
- 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
- 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
- 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
- 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
- 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
- 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
- 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
- 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
- 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
- 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
- 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
- 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
- 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
- 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
- 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
- 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
- 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
- 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
- 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
- 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
- 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
- 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
- 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
- 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
- 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
- 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
- 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
- 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
- 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
- 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
- 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
- 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
- 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
- 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
- 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
- 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
- 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
- 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
- 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
- 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
- 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
- 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
- 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
- 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
- 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
- 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
- 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
- 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
- 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
- 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
- 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
- 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
- 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
- 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
- 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
- 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
- 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
- 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
- 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
- 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
- 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
- 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
- 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
- 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
- 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
- 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
- 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
- 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
- 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
- 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
- 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
- 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
- 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
- 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
- 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
- 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
- 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
- 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
- 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
- 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
- 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
- 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
- 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
- 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
- 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
- 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
- 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
- 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
- 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
- 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
- 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
- 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
- -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
- -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
- 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
- -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
- 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
- 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
- -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
- -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
- -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
- -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
- -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
- -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
- -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
- -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
- -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
- -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
- -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
- -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
- -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
- -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
- -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
- -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
- -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
- -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
- -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
- -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
- -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
- -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
- -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
- -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
- -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
- -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
- -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
- -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
- -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
- -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
- -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
- -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
- -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
- -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
- -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
- -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
- -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
- -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
- -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
- -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
- -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
- -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
- -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
- -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
- -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
- -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
- -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
- -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
- -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
- -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
- -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
- -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
- -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
- -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
- -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
- -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
- -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
- -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
- -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
- -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
- -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
- -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
- -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
- -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
- -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
- -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
- -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
- -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
- -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
- -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
- -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
- -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
- -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
- -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
- -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
- -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
- -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
- -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
- -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
- -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
- -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
- -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
- -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
- -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
- -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
- 0,0,1,0.044613,0.063997,-0.004818,
- -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
- -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
- 0,0,1,0.043898,0.062655,-0.004818,
- 0,0,1,0.044613,0.063997,-0.004818,
- -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
- 0,0,1,0.043898,0.062655,-0.004818,
- -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
- -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
- 0,0,1,0.043489,0.061186,-0.004818,
- 0,0,1,0.043898,0.062655,-0.004818,
- -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
- 0,0,1,0.043489,0.061186,-0.004818,
- -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
- -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
- 0,0,1,0.043489,0.061186,-0.004818,
- -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
- -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
- 0,0,1,0.043409,0.05966,-0.004818,
- 0,0,1,0.043489,0.061186,-0.004818,
- -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
- 0,0,1,0.043409,0.05966,-0.004818,
- -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
- -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
- 0,0,1,0.043472,0.058741,-0.004818,
- 0,0,1,0.043409,0.05966,-0.004818,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- 0,0,1,0.043472,0.058741,-0.004818,
- -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- 0,0,1,0.04361,0.057831,-0.004818,
- 0,0,1,0.043472,0.058741,-0.004818,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- 0,0,1,0.043821,0.056936,-0.004818,
- 0,0,1,0.04361,0.057831,-0.004818,
- -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
- 0,0,1,0.043821,0.056936,-0.004818,
- -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
- -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
- 0,0,1,0.044105,0.056061,-0.004818,
- 0,0,1,0.043821,0.056936,-0.004818,
- -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
- 0,0,1,0.044105,0.056061,-0.004818,
- -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
- -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
- 0,0,1,0.044458,0.055214,-0.004818,
- 0,0,1,0.044105,0.056061,-0.004818,
- -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
- 0,0,1,0.044458,0.055214,-0.004818,
- -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
- -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
- 0,0,1,0.044879,0.054399,-0.004818,
- 0,0,1,0.044458,0.055214,-0.004818,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- 0,0,1,0.044879,0.054399,-0.004818,
- -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- 0,0,1,0.045365,0.053623,-0.004818,
- 0,0,1,0.044879,0.054399,-0.004818,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- 0,0,1,0.045912,0.05289,-0.004818,
- 0,0,1,0.045365,0.053623,-0.004818,
- -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
- 0,0,1,0.045912,0.05289,-0.004818,
- -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
- -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
- 0,0,1,0.046517,0.052206,-0.004818,
- 0,0,1,0.045912,0.05289,-0.004818,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- 0,0,1,0.046517,0.052206,-0.004818,
- -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- 0,0,1,0.047175,0.051576,-0.004818,
- 0,0,1,0.046517,0.052206,-0.004818,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- 0,0,1,0.047882,0.051003,-0.004818,
- 0,0,1,0.047175,0.051576,-0.004818,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- 0,0,1,0.047882,0.051003,-0.004818,
- -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- 0,0,1,0.048634,0.050493,-0.004818,
- 0,0,1,0.047882,0.051003,-0.004818,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- 0,0,1,0.049354,0.050026,-0.004818,
- 0,0,1,0.048634,0.050493,-0.004818,
- -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
- 0,0,1,0.049354,0.050026,-0.004818,
- -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
- -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
- 0,0,1,0.050057,0.049532,-0.004818,
- 0,0,1,0.049354,0.050026,-0.004818,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- 0,0,1,0.050057,0.049532,-0.004818,
- -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- 0,0,1,0.050741,0.049011,-0.004818,
- 0,0,1,0.050057,0.049532,-0.004818,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- 0,0,1,0.051404,0.048464,-0.004818,
- 0,0,1,0.050741,0.049011,-0.004818,
- -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
- 0,0,1,0.051404,0.048464,-0.004818,
- -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
- -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
- 0,0,1,0.052047,0.047891,-0.004818,
- 0,0,1,0.051404,0.048464,-0.004818,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- 0,0,1,0.052047,0.047891,-0.004818,
- -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- 0,0,1,0.052668,0.047293,-0.004818,
- 0,0,1,0.052047,0.047891,-0.004818,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- 0,0,1,0.053266,0.046673,-0.004818,
- 0,0,1,0.052668,0.047293,-0.004818,
- -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
- 0,0,1,0.053266,0.046673,-0.004818,
- -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
- -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
- 0,0,1,0.05384,0.046029,-0.004818,
- 0,0,1,0.053266,0.046673,-0.004818,
- -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
- 0,0,1,0.05384,0.046029,-0.004818,
- -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
- -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
- 0,0,1,0.05439,0.045363,-0.004818,
- 0,0,1,0.05384,0.046029,-0.004818,
- -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
- 0,0,1,0.05439,0.045363,-0.004818,
- -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
- -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
- 0,0,1,0.054915,0.044676,-0.004818,
- 0,0,1,0.05439,0.045363,-0.004818,
- -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
- 0,0,1,0.054915,0.044676,-0.004818,
- -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
- -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
- 0,0,1,0.055414,0.04397,-0.004818,
- 0,0,1,0.054915,0.044676,-0.004818,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- 0,0,1,0.055414,0.04397,-0.004818,
- -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- 0,0,1,0.055885,0.043244,-0.004818,
- 0,0,1,0.055414,0.04397,-0.004818,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- 0,0,1,0.055885,0.043244,-0.004818,
- -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
- -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
- 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
- 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
- -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
- -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
- 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
- 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
- -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
- 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
- -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
- -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
- 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
- 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
- -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
- 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
- -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
- -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
- 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
- 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
- -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
- 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
- -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
- -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
- 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
- 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
- -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
- 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
- -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
- -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
- 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
- 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
- -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
- 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
- -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
- -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
- 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
- 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
- -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
- 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
- -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
- -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
- 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
- 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
- -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
- 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
- -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
- -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
- 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
- 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
- -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
- 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
- -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
- 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
- -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
- 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
- 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
- 0,0,1,0.055885,0.043244,-0.004818,
- 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
- 0,0,1,0.055885,0.043244,-0.004818,
- 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
- 0,0,1,0.056357,0.04397,-0.004818,
- 0,0,1,0.056357,0.04397,-0.004818,
- 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
- 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
- 0,0,1,0.056357,0.04397,-0.004818,
- 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
- 0,0,1,0.056856,0.044676,-0.004818,
- 0,0,1,0.056856,0.044676,-0.004818,
- 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
- 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
- 0,0,1,0.056856,0.044676,-0.004818,
- 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
- 0,0,1,0.05738,0.045363,-0.004818,
- 0,0,1,0.05738,0.045363,-0.004818,
- 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
- 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
- 0,0,1,0.05738,0.045363,-0.004818,
- 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
- 0,0,1,0.05793,0.046029,-0.004818,
- 0,0,1,0.05793,0.046029,-0.004818,
- 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
- 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
- 0,0,1,0.05793,0.046029,-0.004818,
- 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
- 0,0,1,0.058505,0.046673,-0.004818,
- 0,0,1,0.058505,0.046673,-0.004818,
- 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0,0,1,0.058505,0.046673,-0.004818,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0,0,1,0.059103,0.047293,-0.004818,
- 0,0,1,0.059103,0.047293,-0.004818,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0,0,1,0.059724,0.047891,-0.004818,
- 0,0,1,0.059724,0.047891,-0.004818,
- 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
- 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
- 0,0,1,0.059724,0.047891,-0.004818,
- 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
- 0,0,1,0.060366,0.048464,-0.004818,
- 0,0,1,0.060366,0.048464,-0.004818,
- 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0,0,1,0.060366,0.048464,-0.004818,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0,0,1,0.06103,0.049011,-0.004818,
- 0,0,1,0.06103,0.049011,-0.004818,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0,0,1,0.061714,0.049532,-0.004818,
- 0,0,1,0.061714,0.049532,-0.004818,
- 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
- 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
- 0,0,1,0.061714,0.049532,-0.004818,
- 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
- 0,0,1,0.062416,0.050026,-0.004818,
- 0,0,1,0.062416,0.050026,-0.004818,
- 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0,0,1,0.062416,0.050026,-0.004818,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0,0,1,0.063137,0.050493,-0.004818,
- 0,0,1,0.063137,0.050493,-0.004818,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0,0,1,0.063888,0.051003,-0.004818,
- 0,0,1,0.063888,0.051003,-0.004818,
- 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0,0,1,0.063888,0.051003,-0.004818,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0,0,1,0.064596,0.051576,-0.004818,
- 0,0,1,0.064596,0.051576,-0.004818,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0,0,1,0.065254,0.052206,-0.004818,
- 0,0,1,0.065254,0.052206,-0.004818,
- 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
- 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
- 0,0,1,0.065254,0.052206,-0.004818,
- 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
- 0,0,1,0.065859,0.05289,-0.004818,
- 0,0,1,0.065859,0.05289,-0.004818,
- 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0,0,1,0.065859,0.05289,-0.004818,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0,0,1,0.066406,0.053623,-0.004818,
- 0,0,1,0.066406,0.053623,-0.004818,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0,0,1,0.066892,0.054399,-0.004818,
- 0,0,1,0.066892,0.054399,-0.004818,
- 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
- 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
- 0,0,1,0.066892,0.054399,-0.004818,
- 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
- 0,0,1,0.067313,0.055214,-0.004818,
- 0,0,1,0.067313,0.055214,-0.004818,
- 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
- 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
- 0,0,1,0.067313,0.055214,-0.004818,
- 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
- 0,0,1,0.067666,0.056061,-0.004818,
- 0,0,1,0.067666,0.056061,-0.004818,
- 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
- 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
- 0,0,1,0.067666,0.056061,-0.004818,
- 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
- 0,0,1,0.067949,0.056936,-0.004818,
- 0,0,1,0.067949,0.056936,-0.004818,
- 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0,0,1,0.067949,0.056936,-0.004818,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0,0,1,0.068161,0.057831,-0.004818,
- 0,0,1,0.068161,0.057831,-0.004818,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0,0,1,0.068298,0.058741,-0.004818,
- 0,0,1,0.068298,0.058741,-0.004818,
- 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
- 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
- 0,0,1,0.068298,0.058741,-0.004818,
- 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
- 0,0,1,0.068362,0.05966,-0.004818,
- 0,0,1,0.068362,0.05966,-0.004818,
- 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
- 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
- 0,0,1,0.068362,0.05966,-0.004818,
- 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
- 0,0,1,0.068281,0.061186,-0.004818,
- 0,0,1,0.068281,0.061186,-0.004818,
- 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
- 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
- 0,0,1,0.068281,0.061186,-0.004818,
- 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
- 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
- 0,0,1,0.068281,0.061186,-0.004818,
- 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
- 0,0,1,0.067873,0.062655,-0.004818,
- 0,0,1,0.067873,0.062655,-0.004818,
- 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
- 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
- 0,0,1,0.067873,0.062655,-0.004818,
- 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
- 0,0,1,0.067158,0.063997,-0.004818,
- 0,0,1,0.067158,0.063997,-0.004818,
- 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
- 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
- 0,0,1,0.067158,0.063997,-0.004818,
- 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
- 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
- 0,0,1,0.067158,0.063997,-0.004818,
- 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
- 0,0,1,0.06617,0.065145,-0.004818,
- 0,0,1,0.06617,0.065145,-0.004818,
- 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
- 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
- 0,0,1,0.06617,0.065145,-0.004818,
- 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
- 0,0,1,0.064959,0.066043,-0.004818,
- 0,0,1,0.064959,0.066043,-0.004818,
- 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
- 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
- 0,0,1,0.064959,0.066043,-0.004818,
- 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
- 0,0,1,0.063583,0.066646,-0.004818,
- 0,0,1,0.063583,0.066646,-0.004818,
- 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
- 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
- 0,0,1,0.063583,0.066646,-0.004818,
- 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
- 0,0,1,0.06211,0.066926,-0.004818,
- 0,0,1,0.06211,0.066926,-0.004818,
- 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- 0,0,1,0.06211,0.066926,-0.004818,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
- -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
- 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
- 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
- -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
- 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
- -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
- -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
- 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
- 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
- -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
- 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
- -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
- -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
- 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
- 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
- -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
- 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
- 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
- -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
- -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
- 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
- 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
- -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
- 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
- -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
- -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
- 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
- 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
- -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
- 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
- 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
- -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
- -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
- 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
- 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
- -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
- 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
- -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
- -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
- 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
- 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
- -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
- 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
- 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- 0,0,1,0.04966,0.066926,-0.004818,
- 0,0,1,0.06211,0.066926,-0.004818,
- -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
- 0,0,1,0.04966,0.066926,-0.004818,
- -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
- -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
- 0,0,1,0.048188,0.066646,-0.004818,
- 0,0,1,0.04966,0.066926,-0.004818,
- -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
- 0,0,1,0.048188,0.066646,-0.004818,
- -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
- -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
- 0,0,1,0.046812,0.066043,-0.004818,
- 0,0,1,0.048188,0.066646,-0.004818,
- -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
- 0,0,1,0.046812,0.066043,-0.004818,
- -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
- -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
- 0,0,1,0.0456,0.065145,-0.004818,
- 0,0,1,0.046812,0.066043,-0.004818,
- -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
- 0,0,1,0.0456,0.065145,-0.004818,
- -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
- -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
- 0,0,1,0.044613,0.063997,-0.004818,
- 0,0,1,0.0456,0.065145,-0.004818,
- -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
- 0,0,1,0.044613,0.063997,-0.004818,
- -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
- 0,0,1,0.04966,0.066926,-0.004818,
- 0,0,1,0.060613,0.066867,-0.004818,
- 0,0,1,0.06211,0.066926,-0.004818,
- 0,0,1,0.051157,0.066867,-0.004818,
- 0,0,1,0.060613,0.066867,-0.004818,
- 0,0,1,0.04966,0.066926,-0.004818,
- 0,0,1,0.051157,0.066867,-0.004818,
- 0,0,1,0.059165,0.066474,-0.004818,
- 0,0,1,0.060613,0.066867,-0.004818,
- 0,0,1,0.052605,0.066474,-0.004818,
- 0,0,1,0.059165,0.066474,-0.004818,
- 0,0,1,0.051157,0.066867,-0.004818,
- 0,0,1,0.052605,0.066474,-0.004818,
- 0,0,1,0.057837,0.065766,-0.004818,
- 0,0,1,0.059165,0.066474,-0.004818,
- 0,0,1,0.053934,0.065766,-0.004818,
- 0,0,1,0.057837,0.065766,-0.004818,
- 0,0,1,0.052605,0.066474,-0.004818,
- 0,0,1,0.053934,0.065766,-0.004818,
- 0,0,1,0.056739,0.064761,-0.004818,
- 0,0,1,0.057837,0.065766,-0.004818,
- 0,0,1,0.055031,0.064761,-0.004818,
- 0,0,1,0.056739,0.064761,-0.004818,
- 0,0,1,0.053934,0.065766,-0.004818,
- 0,0,1,0.056739,0.064761,-0.004818,
- 0,0,1,0.055031,0.064761,-0.004818,
- 0,0,1,0.055885,0.063727,-0.004818,
- -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
- -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
- -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
- -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
- -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
- -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
- -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
- -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
- -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
- -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
- -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
- -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
- -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
- -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
- -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
- -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
- -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
- -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
- -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
- -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
- -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
- -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
- -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
- -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
- -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
- -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
- -0.860742,-0.509041,0,0.040845,0.047263,-0.007708,
- -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
- -0.860742,-0.509041,0,0.040845,0.047263,-0.007708,
- -0.860742,-0.509041,0,0.040904,0.047163,-0.007708,
- -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
- -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
- -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
- -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
- -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
- -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
- -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
- -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
- -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
- -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
- -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
- -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
- -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
- -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
- -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
- -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
- -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
- -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
- -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
- -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
- -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
- -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
- -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
- -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
- -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
- -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
- -0.707107,-0.707107,0,0.043581,0.043673,-0.007708,
- -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
- -0.707107,-0.707107,0,0.043581,0.043673,-0.007708,
- -0.707107,-0.707107,0,0.043673,0.043581,-0.007708,
- -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
- -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
- -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
- -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
- -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
- -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
- -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
- -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
- -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
- -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
- -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
- -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
- -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
- -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
- -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
- -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
- -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
- -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
- -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
- -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
- -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
- -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
- -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
- -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
- -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
- -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
- -0.509041,-0.860742,0,0.047163,0.040904,-0.007708,
- -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
- -0.509041,-0.860742,0,0.047163,0.040904,-0.007708,
- -0.509041,-0.860742,0,0.047263,0.040845,-0.007708,
- -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
- -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
- -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
- -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
- -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
- -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
- -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
- -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
- -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
- -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
- -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
- -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
- -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
- -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
- -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
- -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
- -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
- -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
- -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
- -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
- -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
- -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
- -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
- -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
- -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
- -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
- -0.278991,-0.960294,0,0.051356,0.039149,-0.007708,
- -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
- -0.278991,-0.960294,0,0.051356,0.039149,-0.007708,
- -0.278991,-0.960294,0,0.051428,0.039128,-0.007708,
- -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
- -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
- -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
- -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
- -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
- -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
- -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
- -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
- -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
- -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
- -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
- -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
- -0.094108,-0.995562,0,0.054796,0.038576,-0.007708,
- -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
- -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
- -0.094108,-0.995562,0,0.054796,0.038576,-0.007708,
- -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
- -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
- -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
- -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
- -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
- -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
- -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
- -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
- -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
- -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
- -0.960294,-0.278991,0,0.039128,0.051428,-0.007708,
- -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
- -0.960294,-0.278991,0,0.039128,0.051428,-0.007708,
- -0.960294,-0.278991,0,0.039149,0.051356,-0.007708,
- -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
- -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
- -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
- -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
- -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
- -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
- -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
- -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
- -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
- -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
- -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
- -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
- -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
- -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
- -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
- -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
- -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
- -0.995562,-0.094108,0,0.038576,0.054796,-0.007708,
- -0.995562,0.094108,0,0.038576,0.056974,-0.007708,
- -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
- -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
- -0.995562,0.094108,0,0.038576,0.056974,-0.007708,
- -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
- -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
- -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
- -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
- -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
- -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
- -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
- -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
- -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
- -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
- -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
- -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
- -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
- -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
- -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
- -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
- -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
- -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
- -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
- -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
- -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
- -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
- -0.960294,0.278991,0,0.039149,0.060414,-0.007708,
- -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
- -0.960294,0.278991,0,0.039149,0.060414,-0.007708,
- -0.960294,0.278991,0,0.039128,0.060343,-0.007708,
- -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
- -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
- -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
- -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
- -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
- -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
- -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
- -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
- -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
- -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
- -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
- -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
- -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
- -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
- -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
- -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
- -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
- -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
- -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
- -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
- -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
- -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
- -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
- -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
- -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
- -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
- -0.860742,0.509041,0,0.040904,0.064607,-0.007708,
- -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
- -0.860742,0.509041,0,0.040904,0.064607,-0.007708,
- -0.860742,0.509041,0,0.040845,0.064507,-0.007708,
- -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
- -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
- -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
- -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
- -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
- -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
- -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
- -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
- -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
- -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
- -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
- -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
- -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
- -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
- -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
- -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
- -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
- -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
- -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
- -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
- -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
- -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
- -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
- -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
- -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
- -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
- -0.707107,0.707107,0,0.043673,0.068189,-0.007708,
- -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
- -0.707107,0.707107,0,0.043673,0.068189,-0.007708,
- -0.707107,0.707107,0,0.043581,0.068097,-0.007708,
- -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
- -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
- -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
- -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
- -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
- -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
- -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
- -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
- -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
- -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
- -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
- -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
- -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
- -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
- -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
- -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
- -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
- -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
- -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
- -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
- -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
- -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
- -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
- -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
- -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
- -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
- -0.509041,0.860742,0,0.047263,0.070926,-0.007708,
- -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
- -0.509041,0.860742,0,0.047263,0.070926,-0.007708,
- -0.509041,0.860742,0,0.047163,0.070867,-0.007708,
- -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
- -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
- -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
- -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
- -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
- -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
- -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
- -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
- -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
- -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
- -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
- -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
- -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
- -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
- -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
- -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
- -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
- -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
- -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
- -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
- -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
- -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
- -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
- -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
- -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
- -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
- -0.278991,0.960294,0,0.051428,0.072642,-0.007708,
- -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
- -0.278991,0.960294,0,0.051428,0.072642,-0.007708,
- -0.278991,0.960294,0,0.051356,0.072621,-0.007708,
- -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
- -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
- -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
- -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
- -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
- -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
- -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
- -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
- -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
- -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
- -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
- -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
- -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
- -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
- -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
- -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
- -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
- -0.094108,0.995562,0,0.054796,0.073195,-0.007708,
- 0.094108,0.995562,0,0.056974,0.073195,-0.007708,
- 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
- 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
- 0.094108,0.995562,0,0.056974,0.073195,-0.007708,
- 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
- 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
- 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
- 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
- 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
- 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
- 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
- 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
- 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
- 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
- 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
- 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
- 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
- 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
- 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
- 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
- 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
- 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
- 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
- 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
- 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
- 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
- 0.278991,0.960294,0,0.060414,0.072621,-0.007708,
- 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
- 0.278991,0.960294,0,0.060414,0.072621,-0.007708,
- 0.278991,0.960294,0,0.060343,0.072642,-0.007708,
- 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
- 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
- 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
- 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
- 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
- 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
- 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
- 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
- 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
- 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
- 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
- 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
- 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
- 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
- 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
- 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
- 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
- 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
- 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
- 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
- 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
- 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
- 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
- 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
- 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
- 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
- 0.509041,0.860742,0,0.064607,0.070867,-0.007708,
- 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
- 0.509041,0.860742,0,0.064607,0.070867,-0.007708,
- 0.509041,0.860742,0,0.064507,0.070926,-0.007708,
- 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
- 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
- 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
- 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
- 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
- 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
- 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
- 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
- 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
- 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
- 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
- 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
- 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
- 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
- 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
- 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
- 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
- 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
- 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
- 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
- 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
- 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
- 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
- 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
- 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
- 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
- 0.707107,0.707107,0,0.068189,0.068097,-0.007708,
- 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
- 0.707107,0.707107,0,0.068189,0.068097,-0.007708,
- 0.707107,0.707107,0,0.068097,0.068189,-0.007708,
- 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
- 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
- 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
- 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
- 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
- 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
- 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
- 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
- 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
- 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
- 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
- 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
- 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
- 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
- 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
- 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
- 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
- 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
- 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
- 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
- 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
- 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
- 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
- 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
- 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
- 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
- 0.860742,0.509041,0,0.070926,0.064507,-0.007708,
- 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
- 0.860742,0.509041,0,0.070926,0.064507,-0.007708,
- 0.860742,0.509041,0,0.070867,0.064607,-0.007708,
- 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
- 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
- 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
- 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
- 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
- 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
- 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
- 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
- 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
- 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
- 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
- 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
- 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
- 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
- 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
- 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
- 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
- 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
- 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
- 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
- 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
- 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
- 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
- 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
- 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
- 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
- 0.960294,0.278991,0,0.072642,0.060343,-0.007708,
- 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
- 0.960294,0.278991,0,0.072642,0.060343,-0.007708,
- 0.960294,0.278991,0,0.072621,0.060414,-0.007708,
- 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
- 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
- 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
- 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
- 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
- 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
- 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
- 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
- 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
- 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
- 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
- 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
- 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
- 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
- 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
- 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
- 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
- 0.995562,0.094108,0,0.073195,0.056974,-0.007708,
- 0.995562,-0.094108,0,0.073195,0.054796,-0.007708,
- 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
- 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
- 0.995562,-0.094108,0,0.073195,0.054796,-0.007708,
- 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
- 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
- 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
- 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
- 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
- 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
- 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
- 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
- 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
- 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
- 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
- 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
- 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
- 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
- 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
- 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
- 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
- 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
- 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
- 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
- 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
- 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
- 0.960294,-0.278991,0,0.072621,0.051356,-0.007708,
- 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
- 0.960294,-0.278991,0,0.072621,0.051356,-0.007708,
- 0.960294,-0.278991,0,0.072642,0.051428,-0.007708,
- 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
- 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
- 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
- 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
- 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
- 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
- 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
- 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
- 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
- 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
- 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
- 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
- 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
- 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
- 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
- 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
- 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
- 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
- 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
- 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
- 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
- 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
- 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
- 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
- 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
- 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
- 0.860742,-0.509041,0,0.070867,0.047163,-0.007708,
- 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
- 0.860742,-0.509041,0,0.070867,0.047163,-0.007708,
- 0.860742,-0.509041,0,0.070926,0.047263,-0.007708,
- 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
- 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
- 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
- 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
- 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
- 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
- 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
- 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
- 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
- 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
- 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
- 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
- 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
- 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
- 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
- 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
- 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
- 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
- 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
- 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
- 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
- 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
- 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
- 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
- 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
- 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
- 0.707107,-0.707107,0,0.068097,0.043581,-0.007708,
- 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
- 0.707107,-0.707107,0,0.068097,0.043581,-0.007708,
- 0.707107,-0.707107,0,0.068189,0.043673,-0.007708,
- 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
- 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
- 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
- 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
- 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
- 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
- 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
- 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
- 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
- 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
- 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
- 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
- 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
- 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
- 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
- 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
- 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
- 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
- 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
- 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
- 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
- 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
- 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
- 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
- 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
- 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
- 0.509041,-0.860742,0,0.064507,0.040845,-0.007708,
- 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
- 0.509041,-0.860742,0,0.064507,0.040845,-0.007708,
- 0.509041,-0.860742,0,0.064607,0.040904,-0.007708,
- 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
- 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
- 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
- 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
- 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
- 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
- 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
- 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
- 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
- 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
- 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
- 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
- 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
- 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
- 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
- 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
- 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
- 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
- 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
- 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
- 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
- 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
- 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
- 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
- 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
- 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
- 0.278991,-0.960294,0,0.060343,0.039128,-0.007708,
- 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
- 0.278991,-0.960294,0,0.060343,0.039128,-0.007708,
- 0.278991,-0.960294,0,0.060414,0.039149,-0.007708,
- 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
- 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
- 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
- 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
- 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
- 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
- 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
- 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
- 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
- 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
- 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
- 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
- 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
- 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
- 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
- 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
- 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
- 0.094108,-0.995562,0,0.056974,0.038576,-0.007708
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,9588,data,NULL};
-const struct gllist *companion_disc=&frame;
diff --git a/hacks/glx/companion_heart.c b/hacks/glx/companion_heart.c
deleted file mode 100644
index 1786a62..0000000
--- a/hacks/glx/companion_heart.c
+++ /dev/null
@@ -1,653 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
- -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781,
- -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.055116,0.063504,-0.005781,
- 0,0,1,0.054127,0.064391,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.054127,0.064391,-0.005781,
- 0,0,1,0.052967,0.065039,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.052967,0.065039,-0.005781,
- 0,0,1,0.051693,0.065415,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.051693,0.065415,-0.005781,
- 0,0,1,0.050367,0.065502,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.050367,0.065502,-0.005781,
- 0,0,1,0.049054,0.065295,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.049054,0.065295,-0.005781,
- 0,0,1,0.04782,0.064804,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.04782,0.064804,-0.005781,
- 0,0,1,0.046724,0.064053,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.046724,0.064053,-0.005781,
- 0,0,1,0.04582,0.063079,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.04582,0.063079,-0.005781,
- 0,0,1,0.045152,0.06193,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.045152,0.06193,-0.005781,
- 0,0,1,0.044754,0.060662,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.044754,0.060662,-0.005781,
- 0,0,1,0.044645,0.059338,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.044645,0.059338,-0.005781,
- 0,0,1,0.044702,0.058527,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.044702,0.058527,-0.005781,
- 0,0,1,0.044827,0.057723,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.044827,0.057723,-0.005781,
- 0,0,1,0.045017,0.056932,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.045017,0.056932,-0.005781,
- 0,0,1,0.045272,0.05616,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.045272,0.05616,-0.005781,
- 0,0,1,0.04559,0.055411,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.04559,0.055411,-0.005781,
- 0,0,1,0.04597,0.054691,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.04597,0.054691,-0.005781,
- 0,0,1,0.046407,0.054006,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.046407,0.054006,-0.005781,
- 0,0,1,0.0469,0.053359,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.0469,0.053359,-0.005781,
- 0,0,1,0.047445,0.052755,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.047445,0.052755,-0.005781,
- 0,0,1,0.048038,0.052198,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.048038,0.052198,-0.005781,
- 0,0,1,0.048675,0.051693,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.048675,0.051693,-0.005781,
- 0,0,1,0.049352,0.051241,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.049352,0.051241,-0.005781,
- 0,0,1,0.050001,0.050829,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.050001,0.050829,-0.005781,
- 0,0,1,0.050634,0.050393,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.050634,0.050393,-0.005781,
- 0,0,1,0.05125,0.049933,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.05125,0.049933,-0.005781,
- 0,0,1,0.051848,0.049449,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.051848,0.049449,-0.005781,
- 0,0,1,0.052427,0.048943,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.052427,0.048943,-0.005781,
- 0,0,1,0.052987,0.048416,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.052987,0.048416,-0.005781,
- 0,0,1,0.053525,0.047867,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.053525,0.047867,-0.005781,
- 0,0,1,0.054043,0.047299,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.054043,0.047299,-0.005781,
- 0,0,1,0.054538,0.046711,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.054538,0.046711,-0.005781,
- 0,0,1,0.055011,0.046104,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.055011,0.046104,-0.005781,
- 0,0,1,0.05546,0.04548,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.05546,0.04548,-0.005781,
- 0,0,1,0.055885,0.044839,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.055885,0.044839,-0.005781,
- 0,0,1,0.05631,0.04548,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.05631,0.04548,-0.005781,
- 0,0,1,0.05676,0.046104,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.05676,0.046104,-0.005781,
- 0,0,1,0.057232,0.046711,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.057232,0.046711,-0.005781,
- 0,0,1,0.057728,0.047299,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.057728,0.047299,-0.005781,
- 0,0,1,0.058245,0.047867,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.058245,0.047867,-0.005781,
- 0,0,1,0.058784,0.048416,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.058784,0.048416,-0.005781,
- 0,0,1,0.059343,0.048943,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.059343,0.048943,-0.005781,
- 0,0,1,0.059922,0.049449,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.059922,0.049449,-0.005781,
- 0,0,1,0.06052,0.049933,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.06052,0.049933,-0.005781,
- 0,0,1,0.061136,0.050393,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.061136,0.050393,-0.005781,
- 0,0,1,0.061769,0.050829,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.061769,0.050829,-0.005781,
- 0,0,1,0.062418,0.051241,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.062418,0.051241,-0.005781,
- 0,0,1,0.063095,0.051693,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.063095,0.051693,-0.005781,
- 0,0,1,0.063732,0.052198,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.063732,0.052198,-0.005781,
- 0,0,1,0.064326,0.052755,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.064326,0.052755,-0.005781,
- 0,0,1,0.06487,0.053359,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.06487,0.053359,-0.005781,
- 0,0,1,0.065363,0.054006,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.065363,0.054006,-0.005781,
- 0,0,1,0.065801,0.054691,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.065801,0.054691,-0.005781,
- 0,0,1,0.06618,0.055411,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.06618,0.055411,-0.005781,
- 0,0,1,0.066498,0.05616,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.066498,0.05616,-0.005781,
- 0,0,1,0.066754,0.056932,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.066754,0.056932,-0.005781,
- 0,0,1,0.066944,0.057723,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.066944,0.057723,-0.005781,
- 0,0,1,0.067068,0.058527,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.067068,0.058527,-0.005781,
- 0,0,1,0.067125,0.059338,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.067125,0.059338,-0.005781,
- 0,0,1,0.067016,0.060662,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.067016,0.060662,-0.005781,
- 0,0,1,0.066618,0.06193,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.066618,0.06193,-0.005781,
- 0,0,1,0.065951,0.063079,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.065951,0.063079,-0.005781,
- 0,0,1,0.065047,0.064053,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.065047,0.064053,-0.005781,
- 0,0,1,0.063951,0.064804,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.063951,0.064804,-0.005781,
- 0,0,1,0.062716,0.065295,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.062716,0.065295,-0.005781,
- 0,0,1,0.061404,0.065502,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.061404,0.065502,-0.005781,
- 0,0,1,0.060078,0.065415,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.060078,0.065415,-0.005781,
- 0,0,1,0.058804,0.065039,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.058804,0.065039,-0.005781,
- 0,0,1,0.057644,0.064391,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.057644,0.064391,-0.005781,
- 0,0,1,0.056655,0.063504,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.056655,0.063504,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.055885,0.06242,-0.005781,
- 0,0,1,0.055116,0.063504,-0.005781,
- 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
- 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
- 0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
- 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
- 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
- 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
- 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
- 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
- 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
- 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
- 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
- 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
- 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
- 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
- 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
- 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
- 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
- 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
- 0.525024,0.459644,0.716294,0.054043,0.047299,-0.005781,
- 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
- 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
- 0.525024,0.459644,0.716294,0.054043,0.047299,-0.005781,
- 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
- 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
- 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
- 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
- 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
- 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
- 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
- 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
- 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
- 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
- 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
- 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
- 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
- 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
- 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
- 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
- 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
- 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
- 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
- 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
- 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
- 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
- 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
- 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
- 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
- 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
- 0.42249,0.532759,0.73326,0.050741,0.049011,-0.004818,
- 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
- 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
- 0.42249,0.532759,0.73326,0.050741,0.049011,-0.004818,
- 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
- 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
- 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
- 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
- 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
- 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
- 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
- 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
- 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
- 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
- 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
- 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
- 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
- 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
- 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
- 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
- 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
- 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
- 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
- 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
- 0.403275,0.554082,0.72826,0.048675,0.051693,-0.005781,
- 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
- 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
- 0.403275,0.554082,0.72826,0.048675,0.051693,-0.005781,
- 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
- 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
- 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
- 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
- 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
- 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
- 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
- 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
- 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
- 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
- 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
- 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
- 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
- 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
- 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
- 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
- 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
- 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
- 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
- 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
- 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
- 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
- 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
- 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
- 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
- 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
- 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
- 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
- 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
- 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
- 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
- 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
- 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
- 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
- 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
- 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
- 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
- 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
- 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
- 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
- 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
- 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
- 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
- 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
- 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
- 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
- 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
- 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
- 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
- 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
- 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
- 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
- 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
- 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
- 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
- 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
- 0.622674,0.06887,0.779444,0.043472,0.058741,-0.004818,
- 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
- 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
- 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
- 0.622674,0.06887,0.779444,0.043472,0.058741,-0.004818,
- 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
- 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
- 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
- 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
- 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
- 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
- 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
- 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
- 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
- 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
- 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
- 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
- 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
- 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
- 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
- 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
- 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
- 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
- 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
- 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
- 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
- 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
- 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
- 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
- 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
- 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
- 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
- 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
- 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
- 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
- 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
- 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
- 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
- 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
- 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
- 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
- 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
- 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
- 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
- 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
- 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
- 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
- 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
- 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
- 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
- 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
- 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
- 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
- -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
- -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
- -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
- 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
- -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
- -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
- -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
- -0.248853,-0.582215,0.774014,0.052967,0.065039,-0.005781,
- -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
- -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
- -0.248853,-0.582215,0.774014,0.052967,0.065039,-0.005781,
- -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
- -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
- -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
- -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
- -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
- -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
- -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
- -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
- -0.558162,-0.527957,0.640091,0.055031,0.064761,-0.004818,
- -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
- -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
- -0.558162,-0.527957,0.640091,0.055031,0.064761,-0.004818,
- -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
- -0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
- -0.641198,-0.455323,0.617694,0.055885,0.06242,-0.005781,
- -0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
- -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
- 0.641198,-0.455323,0.617694,0.055885,0.06242,-0.005781,
- 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
- 0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
- 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
- 0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
- 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
- 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
- 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
- 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
- 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
- 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
- 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
- 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
- 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
- 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
- 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
- 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
- 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
- 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
- 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
- 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
- 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
- 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
- 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
- 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
- -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
- 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
- -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
- 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
- -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
- -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
- -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
- -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
- -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
- -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
- -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
- 0.622274,0.404734,0.670049,0.055885,0.043244,-0.004818,
- 0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
- 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
- -0.622274,0.404734,0.670049,0.055885,0.043244,-0.004818,
- -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
- -0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
- -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
- -0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
- -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
- -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
- -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
- -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
- -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
- -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
- -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
- -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
- -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
- -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
- -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
- -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
- -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
- -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
- -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
- -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
- -0.525024,0.459644,0.716294,0.057728,0.047299,-0.005781,
- -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
- -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
- -0.525024,0.459644,0.716294,0.057728,0.047299,-0.005781,
- -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
- -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
- -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
- -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
- -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
- -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
- -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
- -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
- -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
- -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
- -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
- -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
- -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
- -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
- -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
- -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
- -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
- -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
- -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
- -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
- -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
- -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
- -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
- -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
- -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
- -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
- -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
- -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
- -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
- -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
- -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
- -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
- -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
- -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
- -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
- -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
- -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
- -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
- -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
- -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
- -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
- -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
- -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
- -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
- -0.379372,0.571846,0.727371,0.063137,0.050493,-0.004818,
- -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
- -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
- -0.379372,0.571846,0.727371,0.063137,0.050493,-0.004818,
- -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
- -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
- -0.403275,0.554082,0.72826,0.063095,0.051693,-0.005781,
- -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
- -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
- -0.403275,0.554082,0.72826,0.063095,0.051693,-0.005781,
- -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
- -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
- -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
- -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
- -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
- -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
- -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
- -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
- -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
- -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
- -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
- -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
- -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
- -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
- -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
- -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
- -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
- -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
- -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
- -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
- -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
- -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
- -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
- -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
- -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
- -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
- -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
- -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
- -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
- -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
- -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
- -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
- -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
- -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
- -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
- -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
- -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
- -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
- -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
- -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
- -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
- -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
- -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
- -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
- -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
- -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
- -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
- -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
- -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
- -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
- -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
- -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
- -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
- -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
- -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
- -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
- -0.622674,0.06887,0.779444,0.068298,0.058741,-0.004818,
- -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
- -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
- -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
- -0.622674,0.06887,0.779444,0.068298,0.058741,-0.004818,
- -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
- -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
- -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
- -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
- -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
- -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
- -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
- -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
- -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
- -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
- -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
- -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
- -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
- -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
- -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
- -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
- -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
- -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
- -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
- -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
- -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
- -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
- -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
- -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
- -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
- -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
- -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
- -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
- -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
- -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
- -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
- -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781,
- -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
- -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
- -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
- -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
- -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,648,data,NULL};
-const struct gllist *companion_heart=&frame;
diff --git a/hacks/glx/companion_quad.c b/hacks/glx/companion_quad.c
deleted file mode 100644
index 3cfd230..0000000
--- a/hacks/glx/companion_quad.c
+++ /dev/null
@@ -1,389 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
- 0.138522,0.464654,-0.87459,0.773415,1.636364,-0.251499,
- 0.138522,0.464654,-0.87459,0.775033,1.681818,-0.227094,
- 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
- 0.138522,0.464654,-0.87459,0.775033,1.681818,-0.227094,
- 0.11097,0.464834,-0.878416,0.796039,1.681818,-0.223767,
- -0.917485,0.21303,-0.335916,0.757576,1.636364,-0.208242,
- -0.917485,0.21303,-0.335916,0.757576,1.681818,-0.179415,
- -0.917485,0.21303,-0.335916,0.775033,1.681818,-0.227094,
- -0.917485,0.21303,-0.335916,0.757576,1.636364,-0.208242,
- -0.917485,0.21303,-0.335916,0.775033,1.681818,-0.227094,
- -0.917485,0.21303,-0.335916,0.773415,1.636364,-0.251499,
- -1,0,0,0.757576,1.636364,-0.208242,
- -1,0,0,0.757576,1.636364,-0.121212,
- -1,0,0,0.757576,1.549333,-0.121212,
- -1,0,0,0.757576,1.636364,-0.208242,
- -1,0,0,0.757576,1.549333,-0.121212,
- -1,0,0,0.757576,1.578161,-0.075758,
- -1,0,0,0.757576,1.636364,-0.208242,
- -1,0,0,0.757576,1.578161,-0.075758,
- -1,0,0,0.757576,1.636364,-0.075758,
- -1,0,0,0.757576,1.636364,-0.208242,
- -1,0,0,0.757576,1.636364,-0.075758,
- -1,0,0,0.757576,1.681818,-0.121212,
- -1,0,0,0.757576,1.636364,-0.208242,
- -1,0,0,0.757576,1.681818,-0.121212,
- -1,0,0,0.757576,1.681818,-0.179415,
- -0.917485,-0.335916,0.21303,0.757576,1.578161,-0.075758,
- -0.917485,-0.335916,0.21303,0.757576,1.549333,-0.121212,
- -0.917485,-0.335916,0.21303,0.773415,1.506076,-0.121212,
- -0.917485,-0.335916,0.21303,0.757576,1.578161,-0.075758,
- -0.917485,-0.335916,0.21303,0.773415,1.506076,-0.121212,
- -0.917485,-0.335916,0.21303,0.775033,1.530482,-0.075758,
- 0.138522,-0.87459,0.464654,0.773415,1.506076,-0.121212,
- 0.11097,-0.878416,0.464834,0.79903,1.510133,-0.121212,
- 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
- 0.138522,-0.87459,0.464654,0.773415,1.506076,-0.121212,
- 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
- 0.138522,-0.87459,0.464654,0.775033,1.530482,-0.075758,
- 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
- 0.11097,-0.878416,0.464834,0.79903,1.510133,-0.121212,
- 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
- 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
- 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
- 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
- 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
- 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
- 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
- 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
- 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
- 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
- -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
- -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
- 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
- -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
- 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
- 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
- -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
- -0.11097,-0.878416,0.464834,0.961536,1.533809,-0.075758,
- -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
- -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
- -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
- -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
- -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
- -0.138522,-0.87459,0.464654,0.984161,1.506076,-0.121212,
- -0.138522,-0.87459,0.464654,0.982542,1.530482,-0.075758,
- -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
- -0.138522,-0.87459,0.464654,0.982542,1.530482,-0.075758,
- -0.11097,-0.878416,0.464834,0.961536,1.533809,-0.075758,
- 0.917485,-0.335916,0.21303,1,1.549333,-0.121212,
- 0.917485,-0.335916,0.21303,1,1.578161,-0.075758,
- 0.917485,-0.335916,0.21303,0.982542,1.530482,-0.075758,
- 0.917485,-0.335916,0.21303,1,1.549333,-0.121212,
- 0.917485,-0.335916,0.21303,0.982542,1.530482,-0.075758,
- 0.917485,-0.335916,0.21303,0.984161,1.506076,-0.121212,
- 1,0,0,1,1.636364,-0.121212,
- 1,0,0,1,1.636364,-0.208242,
- 1,0,0,1,1.681818,-0.179415,
- 1,0,0,1,1.636364,-0.121212,
- 1,0,0,1,1.681818,-0.179415,
- 1,0,0,1,1.681818,-0.121212,
- 1,0,0,1,1.636364,-0.121212,
- 1,0,0,1,1.681818,-0.121212,
- 1,0,0,1,1.636364,-0.075758,
- 1,0,0,1,1.636364,-0.121212,
- 1,0,0,1,1.636364,-0.075758,
- 1,0,0,1,1.578161,-0.075758,
- 1,0,0,1,1.636364,-0.121212,
- 1,0,0,1,1.578161,-0.075758,
- 1,0,0,1,1.549333,-0.121212,
- 0.917485,0.21303,-0.335916,1,1.681818,-0.179415,
- 0.917485,0.21303,-0.335916,1,1.636364,-0.208242,
- 0.917485,0.21303,-0.335916,0.984161,1.636364,-0.251499,
- 0.917485,0.21303,-0.335916,1,1.681818,-0.179415,
- 0.917485,0.21303,-0.335916,0.984161,1.636364,-0.251499,
- 0.917485,0.21303,-0.335916,0.982542,1.681818,-0.227094,
- -0.138522,0.464654,-0.87459,0.984161,1.636364,-0.251499,
- -0.11097,0.464834,-0.878416,0.958545,1.636364,-0.247442,
- -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
- -0.138522,0.464654,-0.87459,0.984161,1.636364,-0.251499,
- -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
- -0.138522,0.464654,-0.87459,0.982542,1.681818,-0.227094,
- -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
- -0.11097,0.464834,-0.878416,0.958545,1.636364,-0.247442,
- -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
- -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
- -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
- -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
- -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
- -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
- 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
- -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
- 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
- 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
- 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
- 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
- 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
- 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
- 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
- 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
- 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
- 0.11097,0.464834,-0.878416,0.796039,1.681818,-0.223767,
- 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
- 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
- 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
- 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.878788,1.681818,-0.218561,
- 0,1,0,0.837333,1.681818,-0.219863,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.837333,1.681818,-0.219863,
- 0,1,0,0.796039,1.681818,-0.223767,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.796039,1.681818,-0.223767,
- 0,1,0,0.775033,1.681818,-0.227094,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.775033,1.681818,-0.227094,
- 0,1,0,0.757576,1.681818,-0.179415,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.757576,1.681818,-0.179415,
- 0,1,0,0.757576,1.681818,-0.121212,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.757576,1.681818,-0.121212,
- 0,1,0,1,1.681818,-0.121212,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,1,1.681818,-0.121212,
- 0,1,0,1,1.681818,-0.179415,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,1,1.681818,-0.179415,
- 0,1,0,0.982542,1.681818,-0.227094,
- 0,1,0,0.920242,1.681818,-0.219863,
- 0,1,0,0.982542,1.681818,-0.227094,
- 0,1,0,0.961536,1.681818,-0.223767,
- 0,0.707107,0.707107,0.757576,1.681818,-0.121212,
- 0,0.707107,0.707107,0.757576,1.636364,-0.075758,
- 0,0.707107,0.707107,1,1.636364,-0.075758,
- 0,0.707107,0.707107,0.757576,1.681818,-0.121212,
- 0,0.707107,0.707107,1,1.636364,-0.075758,
- 0,0.707107,0.707107,1,1.681818,-0.121212,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,1,1.636364,-0.075758,
- 0,0,1,0.757576,1.636364,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.757576,1.636364,-0.075758,
- 0,0,1,0.757576,1.578161,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.757576,1.578161,-0.075758,
- 0,0,1,0.775033,1.530482,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.775033,1.530482,-0.075758,
- 0,0,1,0.796039,1.533809,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.796039,1.533809,-0.075758,
- 0,0,1,0.837333,1.537712,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.837333,1.537712,-0.075758,
- 0,0,1,0.878788,1.539015,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.878788,1.539015,-0.075758,
- 0,0,1,0.920242,1.537712,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.920242,1.537712,-0.075758,
- 0,0,1,0.961536,1.533809,-0.075758,
- 0,0,1,1,1.578161,-0.075758,
- 0,0,1,0.961536,1.533809,-0.075758,
- 0,0,1,0.982542,1.530482,-0.075758,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.121212,1.125055,0,
- 0,0,1,0.223833,1.125055,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.223833,1.125055,0,
- 0,0,1,0.227944,1.136476,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.227944,1.136476,0,
- 0,0,1,0.245409,1.176833,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.245409,1.176833,0,
- 0,0,1,0.265373,1.216015,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.265373,1.216015,0,
- 0,0,1,0.287758,1.253867,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.287758,1.253867,0,
- 0,0,1,0.312476,1.290236,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.312476,1.290236,0,
- 0,0,1,0.339427,1.324985,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.339427,1.324985,0,
- 0,0,1,0.368509,1.35797,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.368509,1.35797,0,
- 0,0,1,0.399606,1.389067,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.399606,1.389067,0,
- 0,0,1,0.432591,1.418148,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.432591,1.418148,0,
- 0,0,1,0.467339,1.4451,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.467339,1.4451,0,
- 0,0,1,0.503709,1.469818,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.503709,1.469818,0,
- 0,0,1,0.541561,1.492203,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.541561,1.492203,0,
- 0,0,1,0.580742,1.512167,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.580742,1.512167,0,
- 0,0,1,0.6211,1.52963,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.6211,1.52963,0,
- 0,0,1,0.632521,1.533742,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.632521,1.533742,0,
- 0,0,1,0.632521,1.636364,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.632521,1.636364,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.121212,1.636364,0,
- 0,0,1,0.121212,1.125055,0,
- 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
- 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
- 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
- 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
- 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
- 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
- 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
- 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
- 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
- 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
- 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
- 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
- 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
- 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
- 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
- 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
- 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
- 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
- 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
- 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
- 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
- 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
- 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
- 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
- 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
- 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
- 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
- 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
- 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
- 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
- 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
- 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
- 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
- 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
- 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
- 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
- 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
- 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
- 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
- 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
- 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
- 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
- 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
- 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
- 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
- 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
- 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
- 0.325937,-0.823222,0.464834,0.6211,1.52963,0,
- 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
- 0.325937,-0.823222,0.464834,0.6211,1.52963,0,
- 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
- 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
- 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
- 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
- 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
- 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
- 0.273603,-0.842063,0.464834,0.67563,1.504045,-0.081077,
- 0.273603,-0.842063,0.464834,0.67563,1.504045,-0.081077,
- 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
- 0.247044,-0.850333,0.464654,0.69697,1.488315,-0.121212,
- 0.882948,0,0.469472,0.632521,1.636364,0,
- 0.882948,0,0.469472,0.632521,1.533742,0,
- 0.882948,0,0.469472,0.67563,1.504045,-0.081077,
- 0.882948,0,0.469472,0.632521,1.636364,0,
- 0.882948,0,0.469472,0.67563,1.504045,-0.081077,
- 0.882948,0,0.469472,0.69697,1.488315,-0.121212,
- 0.882948,0,0.469472,0.632521,1.636364,0,
- 0.882948,0,0.469472,0.69697,1.488315,-0.121212,
- 0.882948,0,0.469472,0.69697,1.636364,-0.121212,
- 0.799251,0.424969,0.424969,0.69697,1.636364,-0.121212,
- 0.799251,0.424969,0.424969,0.632521,1.757576,-0.121212,
- 0.799251,0.424969,0.424969,0.632521,1.636364,0,
- 0,0.707107,0.707107,0.632521,1.757576,-0.121212,
- 0,0.707107,0.707107,0.121212,1.757576,-0.121212,
- 0,0.707107,0.707107,0.121212,1.636364,0,
- 0,0.707107,0.707107,0.632521,1.757576,-0.121212,
- 0,0.707107,0.707107,0.121212,1.636364,0,
- 0,0.707107,0.707107,0.632521,1.636364,0,
- -0.57735,0.57735,0.57735,0.121212,1.757576,-0.121212,
- -0.57735,0.57735,0.57735,0,1.636364,-0.121212,
- -0.57735,0.57735,0.57735,0.121212,1.636364,0,
- -0.707107,0,0.707107,0,1.636364,-0.121212,
- -0.707107,0,0.707107,0,1.125055,-0.121212,
- -0.707107,0,0.707107,0.121212,1.125055,0,
- -0.707107,0,0.707107,0,1.636364,-0.121212,
- -0.707107,0,0.707107,0.121212,1.125055,0,
- -0.707107,0,0.707107,0.121212,1.636364,0,
- -0.424969,-0.799251,0.424969,0,1.125055,-0.121212,
- -0.424969,-0.799251,0.424969,0.121212,1.060606,-0.121212,
- -0.424969,-0.799251,0.424969,0.121212,1.125055,0,
- 0,-0.882948,0.469472,0.223833,1.125055,0,
- 0,-0.882948,0.469472,0.121212,1.125055,0,
- 0,-0.882948,0.469472,0.121212,1.060606,-0.121212,
- 0,-0.882948,0.469472,0.223833,1.125055,0,
- 0,-0.882948,0.469472,0.121212,1.060606,-0.121212,
- 0,-0.882948,0.469472,0.269262,1.060606,-0.121212,
- 0,-0.882948,0.469472,0.223833,1.125055,0,
- 0,-0.882948,0.469472,0.269262,1.060606,-0.121212,
- 0,-0.882948,0.469472,0.25353,1.081945,-0.081077,
- 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
- 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
- 0.850333,-0.247044,0.464654,0.269262,1.060606,-0.121212,
- 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
- 0.833143,-0.29995,0.464654,0.223833,1.125055,0,
- 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
- 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
- 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
- 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
- 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
- 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
- 0.823222,-0.325937,0.464834,0.287112,1.113048,-0.121212,
- 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
- 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
- 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
- 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
- 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
- 0.823222,-0.325937,0.464834,0.287112,1.113048,-0.121212,
- 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
- 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
- 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
- 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
- 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
- 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
- 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
- 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
- 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
- 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
- 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
- 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
- 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212,
- 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
- 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
- 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212,
- 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
- 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
- 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
- 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
- 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
- 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
- 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
- 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,384,data,NULL};
-const struct gllist *companion_quad=&frame;
diff --git a/hacks/glx/companioncube.man b/hacks/glx/companioncube.man
deleted file mode 100644
index 9f5b735..0000000
--- a/hacks/glx/companioncube.man
+++ /dev/null
@@ -1,85 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-companioncube \- a vital aparatus.
-.SH SYNOPSIS
-.B companioncube
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fIratio\fP]
-[\-spin]
-[\-wander]
-[\-count \fInumber\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The symptoms most commonly produced by Enrichment Center testing are
-superstition, perceiving inanimate objects as alive, and hallucinations.
-The Enrichment Center reminds you that the weighted companion cube will
-never threaten to stab you and, in fact, cannot speak. In the event that
-the Weighted Companion Cube does speak, the Enrichment Center urges you to
-disregard its advice.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-speed \fInumber\fP
-How fast the animation should run.
-Less than 1 for slower, greater than 1 for faster.
-.TP 8
-.B \-count \fInumber\fP
-How many cubes. Default 3.
-.TP 8
-.B \-spin
-.B \-no\-spin
-Instead of bouncing, float and spin.
-.TP 8
-.B \-wander
-.B \-no\-wander
-Instead of bouncing, float and drift.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR tronbit (MANSUFFIX),
-.BR lament (MANSUFFIX),
-.BR dangerball (MANSUFFIX),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski, with apologies to the fine folks at Valve Software
-and Aperture Science.
diff --git a/hacks/glx/covid19.c b/hacks/glx/covid19.c
deleted file mode 100644
index 62d3c6e..0000000
--- a/hacks/glx/covid19.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/* covid19, Copyright (c) 2020 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Created: Thursday, March 264th, 2020.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 60 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*membraneColor: #AAFFAA" "\n" \
- "*spikeColor: #DD0000" "\n" \
- "*mpColor: #8888FF" "\n" \
- "*epColor: #FF8888" "\n" \
- "*hesColor: #880088" "\n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_ball 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "sphere.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1"
-
-#define SPIKE_FACES 12
-#define SMOOTH_SPIKES True
-#define SPHERE_SLICES 64
-#define SPHERE_STACKS 32
-#define SPHERE_SLICES_2 16
-#define SPHERE_STACKS_2 8
-
-#define SPIKE_FACESb 3
-#define SPHERE_SLICESb 10
-#define SPHERE_STACKSb 5
-#define SPHERE_SLICES_2b 5
-#define SPHERE_STACKS_2b 3
-
-
-typedef struct { GLfloat x, y, z; } XYZ;
-typedef enum { MEMBRANE, SPIKE, M_PROTEIN, E_PROTEIN, HES } feature;
-typedef enum { IN, DRAW, OUT } draw_mode;
-
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-typedef struct {
- XYZ pos;
- GLfloat scale;
- rotator *rot;
- GLuint dlist;
-} ball;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
- draw_mode mode;
- GLfloat tick;
- GLuint ball_lists[20];
- int ball_polys;
- int max_balls, count, ball_delta;
- ball *balls;
- GLfloat membrane_color[4];
- GLfloat spike_color[4];
- GLfloat mp_color[4];
- GLfloat ep_color[4];
- GLfloat hes_color[4];
-} ball_configuration;
-
-static ball_configuration *bps = NULL;
-
-static Bool do_spin;
-static GLfloat speed;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt ball_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_ball (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-ball_handle_event (ModeInfo *mi, XEvent *event)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- bp->mode = OUT;
- bp->tick = 1;
- return True;
- }
-
- return False;
-}
-
-
-static int
-unit_spike (ModeInfo *mi, Bool lowrez)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- GLfloat r = 0.2;
- GLfloat s = 0.2;
- int i;
- glPushMatrix();
-
- glColor4fv (bp->spike_color);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->spike_color);
-
- glScalef (s, s, s);
- glTranslatef (0, -r, 0);
- if (!lowrez)
- glTranslatef (-r, 0, 0);
- polys += tube (0, 0, 0,
- 0, 1, 0,
- r, 0,
- (lowrez ? SPIKE_FACESb : SPIKE_FACES),
- True, False, wire);
- if (!lowrez)
- glTranslatef (r*2, 0, 0);
- if (! lowrez)
- polys += tube (0, 0, 0,
- 0, 1, 0,
- r, 0,
- (lowrez ? SPIKE_FACESb : SPIKE_FACES),
- True, False, wire);
- if (!lowrez)
- glTranslatef (-r, 0, 0);
-
- glTranslatef (0, 1, 0);
- r *= 2;
- glScalef (r, r, r);
-
- for (i = 0; i < (lowrez ? 1 : 3); i++)
- {
- glPushMatrix();
- glRotatef (360.0 / 3 * i, 0, 1, 0);
- if (!lowrez)
- glTranslatef (r, 0, 0);
- polys += unit_sphere ((lowrez ? SPHERE_STACKS_2b : SPHERE_STACKS_2),
- (lowrez ? SPHERE_SLICES_2b : SPHERE_SLICES_2),
- wire);
- glPopMatrix();
- }
-
- glPopMatrix();
- return polys;
-}
-
-
-static int
-unit_ball (ModeInfo *mi, Bool lowrez)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- feature f;
-
- for (f = 0; f <= HES; f++)
- {
- switch (f) {
- case MEMBRANE:
- glColor4fv (bp->membrane_color);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->membrane_color);
- polys += unit_sphere ((lowrez ? SPHERE_STACKSb : SPHERE_STACKS),
- (lowrez ? SPHERE_SLICESb : SPHERE_SLICES),
- wire);
- break;
-
- case SPIKE:
- {
- GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
- GLfloat s = M_PI / 5; /* lon division: 72 deg */
- int i, j;
- int n = (lowrez ? 8 : 10);
- for (j = 0; j < n; j++)
- for (i = 0; i < n; i++)
- {
- GLfloat th1 = s * i;
- GLfloat a = th0;
- GLfloat o = th1;
- GLfloat x, y, z;
-
- a += (0.2 + frand (0.9)) * RANDSIGN();
- o += (0.2 + frand (0.9)) * RANDSIGN();
-
- x = cos(a) * cos(o);
- y = cos(a) * sin(o);
- z = sin(a);
-
- glPushMatrix();
-
- if (! (i & 1))
- {
- glRotatef (180, 0, 1, 0);
- glRotatef (180/5, 0, 0, 1);
- }
-
- glTranslatef (x, y, z);
- glRotatef (-atan2 (x, y) * (180/M_PI), 0, 0, 1);
- glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180/M_PI), 1, 0, 0);
- polys += unit_spike (mi, lowrez);
- glPopMatrix();
- }
-
- glPushMatrix();
- glRotatef (90, 1, 0, 0);
- glTranslatef (0, 1, 0);
- polys += unit_spike (mi, lowrez);
-
- glTranslatef (0, -2, 0);
- glRotatef (180, 1, 0, 0);
- polys += unit_spike (mi, lowrez);
- glPopMatrix();
-
- }
- break;
-
- default:
- {
- GLfloat s = 0.04;
- int n = (lowrez ? 50 : 200);
- int i;
- GLfloat *c;
- switch (f) {
- case M_PROTEIN: c = bp->mp_color; break;
- case E_PROTEIN: c = bp->ep_color; break;
- case HES: c = bp->hes_color; break;
- default: abort();
- }
-
- glColor4fv (c);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c);
-
- if (f == HES)
- {
- s *= 1.5;
- n /= 8;
- }
-
- for (i = 0; i < n; i++)
- {
- glPushMatrix();
- glRotatef (random() % 360, 1, 0, 0);
- glRotatef (random() % 180, 0, 1, 0);
- glTranslatef (1, 0, 0);
- glRotatef (90, 0, 0, 1);
- glScalef (s, s, s);
- polys += unit_dome ((lowrez ? SPHERE_STACKS_2b : SPHERE_STACKS_2),
- (lowrez ? SPHERE_SLICES_2b : SPHERE_SLICES_2),
- wire);
- glPopMatrix();
- }
- }
- break;
- }
- }
-
- return polys;
-}
-
-
-static void
-parse_color (ModeInfo *mi, char *key, GLfloat color[4])
-{
- XColor xcolor;
- char *string = get_string_resource (mi->dpy, key, "RobotColor");
- if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
- {
- fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
- key, string);
- exit (1);
- }
- free (string);
-
- color[0] = xcolor.red / 65536.0;
- color[1] = xcolor.green / 65536.0;
- color[2] = xcolor.blue / 65536.0;
- color[3] = 1;
-}
-
-
-static void
-make_balls (ModeInfo *mi, int count)
-{
- /* Distribute the balls into a rectangular grid that fills the window.
- There may be some empty cells. N items in a W x H rectangle:
- N = W * H
- N = W * W * R
- N/R = W*W
- W = sqrt(N/R)
- */
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
-
- GLfloat aspect = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
- int nlines = sqrt (count / aspect) + 0.5;
- int *cols = (int *) calloc (nlines, sizeof(*cols));
- int i, x, y, max = 0;
- GLfloat scale, spacing;
- Bool lowrez = (count > 40);
-
- if (bp->balls)
- {
- for (i = 0; i < bp->count; i++)
- free_rotator (bp->balls[i].rot);
- free (bp->balls);
- }
-
- bp->count = count;
- bp->balls = (ball *) calloc (sizeof (*bp->balls), count);
-
- for (i = 0; i < count; i++)
- {
- cols[i % nlines]++;
- if (cols[i % nlines] > max) max = cols[i % nlines];
- }
-
- /* That gave us, e.g. 7777666. Redistribute to 6767767. */
- for (i = 0; i < nlines / 2; i += 2)
- {
- int j = nlines-i-1;
- int swap = cols[i];
- cols[i] = cols[j];
- cols[j] = swap;
- }
-
- scale = 1.0 / nlines; /* Scale for height */
- if (scale * max > aspect) /* Shrink if overshot width */
- scale *= aspect / (scale * max);
-
- scale *= 0.9; /* Add padding */
- spacing = scale * 4;
-
- if (count == 1) spacing = 0;
-
- i = 0;
- for (y = 0; y < nlines; y++)
- for (x = 0; x < cols[y]; x++)
- {
- ball *v = &bp->balls[i];
- double spin_speed = 1.0 * speed;
- double wander_speed = 0.04 * speed;
- double spin_accel = 1.0;
- int n = countof (bp->ball_lists) / 2;
-
- v->scale = scale;
- v->pos.x = spacing * (x - cols[y] / 2.0) + spacing/2;
- v->pos.y = spacing * (y - nlines / 2.0) + spacing/2;
- v->pos.z = 0;
- v->dlist = bp->ball_lists [(random() % n) + (lowrez ? n : 0)];
- v->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- i++;
- }
- free (cols);
-}
-
-
-ENTRYPOINT void
-init_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- parse_color (mi, "membraneColor", bp->membrane_color);
- parse_color (mi, "spikeColor", bp->spike_color);
- parse_color (mi, "mpColor", bp->mp_color);
- parse_color (mi, "epColor", bp->ep_color);
- parse_color (mi, "hesColor", bp->hes_color);
-
- for (i = 0; i < countof(bp->ball_lists); i++)
- {
- Bool lowrez = (i > countof(bp->ball_lists) / 2);
- bp->ball_lists[i] = glGenLists (1);
- glNewList (bp->ball_lists[i], GL_COMPILE);
- bp->ball_polys = unit_ball (mi, lowrez);
- glEndList ();
- }
-
- bp->ball_delta = 1;
- bp->max_balls = MI_COUNT(mi);
- if (bp->max_balls < 1) bp->max_balls = 1;
- bp->count = (bp->max_balls > 10 ? 1 + random() % 5 :
- bp->max_balls > 5 ? 1 + random() % 3 : 1);
- make_balls (mi, bp->count);
-
- bp->trackball = gltrackball_init (True);
-}
-
-
-ENTRYPOINT void
-draw_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GLfloat s = 1;
- int i;
-
- static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat bshiny = 128.0;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glScalef (4, 4, 4);
-
- gltrackball_rotate (bp->trackball);
-
- mi->polygon_count = 0;
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
-
- switch (bp->mode) {
- case DRAW:
- bp->tick -= 1/30.0/5; /* No more often than 5 sec */
- if (bp->tick <= 0)
- {
- bp->tick = 1;
- if (! (random() % 20))
- {
- bp->mode = OUT;
- bp->tick = 1;
- }
- }
- s = 1;
- break;
- case IN:
- bp->tick += 1/12.0;
- if (bp->tick >= 1)
- {
- bp->tick = 1;
- bp->mode = DRAW;
- }
- s = bp->tick;
- break;
- case OUT:
- bp->tick -= 1/12.0;
- s = bp->tick;
- if (bp->tick <= 0)
- {
- int c2;
- int n;
- bp->tick = 0;
- bp->mode = IN;
-
- n = (bp->count < 5 ? 2 :
- bp->count < 20 ? 5 : 20);
- c2 = bp->count + (1 + (random() % n)) * bp->ball_delta;
- if (c2 < 1)
- {
- c2 = 1;
- bp->ball_delta = 1;
- }
- else if (c2 > bp->max_balls)
- {
- c2 = bp->max_balls;
- bp->ball_delta = -1;
- }
-
- make_balls (mi, c2);
- s = 0;
- }
- break;
- default:
- abort();
- }
-
- if (s > 0)
- for (i = 0; i < bp->count; i++)
- {
- ball *v = &bp->balls[i];
- double x, y, z;
- glPushMatrix();
- glTranslatef (v->pos.x, v->pos.y, v->pos.z);
- glScalef (v->scale, v->scale, v->scale);
-
- get_position (v->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 2,
- (y - 0.5) * 2,
- (z - 0.5) * 8 * (bp->count > 8 ? 3 : 1));
- get_rotation (v->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
-
- glScalef (s, s, s);
- glCallList (v->dlist);
- mi->polygon_count += bp->ball_polys;
- glPopMatrix ();
- }
- glPopMatrix ();
-
- mi->recursion_depth = bp->count;
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- for (i = 0; i < bp->count; i++)
- free_rotator (bp->balls[i].rot);
- free (bp->balls);
- if (bp->trackball) gltrackball_free (bp->trackball);
- for (i = 0; i < countof(bp->ball_lists); i++)
- if (glIsList(bp->ball_lists[i])) glDeleteLists(bp->ball_lists[i], 1);
-}
-
-#ifndef HAVE_IPHONE
-XSCREENSAVER_MODULE_2 ("COVID19", covid19, ball)
-#else
-XSCREENSAVER_MODULE_2 ("Co____9", co____9, ball)
-
- /* App Store Connect Resolution Center: App Review
-
- Binary Rejected
-
- Guideline 1.1 - Safety - Objectionable Content We found that your app
- includes content or concepts that some users may find upsetting,
-
- We found that your app includes content or concepts that some users may
- find upsetting, offensive, or otherwise objectionable.
-
- Specifically, your entertainment or gaming app inappropriately references
- the C____-__ p__d__ic in the metadata or binary. Entertainment or gaming
- apps that directly or indirectly reference the C____-__ p__d__ic in any
- way are not appropriate for the App Store.
-
- */
-#endif
-
-
-#endif /* USE_GL */
diff --git a/hacks/glx/covid19.man b/hacks/glx/covid19.man
deleted file mode 100644
index 4ebca96..0000000
--- a/hacks/glx/covid19.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-covid19 \- the most 2020 of all screen savers.
-.SH SYNOPSIS
-.B covid19
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-count \fInumber\fP]
-[\-no-wander]
-[\-no-spin]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-SARS-CoV-2. Stay the fuck home. Wear a fucking mask.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-count \fInumber\fP
-Maximum number of virus particles. 1 - 200. Default: 60.
-.TP 8
-.B \-wander | \-no-wander
-Whether the viruses should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the viruses should spin.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2020 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/cow_face.c b/hacks/glx/cow_face.c
deleted file mode 100644
index e57d2bb..0000000
--- a/hacks/glx/cow_face.c
+++ /dev/null
@@ -1,341 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
- 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
- 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
- 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
- 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
- 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
- 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
- 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
- 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
- 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
- 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
- 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
- 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
- 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
- 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
- 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
- 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
- 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
- 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
- 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
- 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
- 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
- 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
- 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
- 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
- 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
- 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
- -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
- 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
- -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
- 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
- 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
- -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
- -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
- 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
- -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
- 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
- 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
- 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
- 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
- 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
- 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
- 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
- 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
- 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
- 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
- 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
- -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
- 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
- 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
- -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
- 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
- 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
- -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
- 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
- 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
- -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
- 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
- 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
- -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
- 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
- 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
- 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
- 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
- -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
- 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
- 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
- -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
- 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
- -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
- -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
- -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
- -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
- 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
- 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
- -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
- 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
- -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
- -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
- -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
- -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
- -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
- -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
- -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
- 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
- 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
- -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
- -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
- -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
- -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
- 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
- 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
- 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
- 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
- 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
- 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
- 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
- -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
- 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
- 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
- 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
- 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
- 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
- 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
- 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
- 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
- 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
- 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
- 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
- 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
- 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
- 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
- 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
- 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
- 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
- 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
- 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
- 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
- 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
- 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
- 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
- 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
- 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
- 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
- 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
- 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
- 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
- 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
- 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
- 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
- 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
- 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
- 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
- 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
- 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
- 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
- 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
- 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
- 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
- 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
- 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
- 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
- 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
- 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
- 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
- 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
- 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
- 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
- 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
- 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
- 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
- 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
- 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
- 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
- -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
- 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
- -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
- -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
- -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
- 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
- -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
- 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
- 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
- -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
- 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
- -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
- 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
- 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
- -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
- 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
- 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
- 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
- -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
- -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
- -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
- 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
- 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
- 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
- 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
- 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
- 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
- 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
- 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
- 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
- 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
- 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
- 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
- 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
- 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
- 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
- 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
- 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
- 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
- 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
- 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
- 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
- -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
- 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
- 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
- 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
- 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
- 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
- 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
- -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
- -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
- 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
- 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
- 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
- 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
- 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
- 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,336,data,NULL};
-const struct gllist *cow_face=&frame;
diff --git a/hacks/glx/cow_hide.c b/hacks/glx/cow_hide.c
deleted file mode 100644
index 3728eef..0000000
--- a/hacks/glx/cow_hide.c
+++ /dev/null
@@ -1,13055 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
- -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
- -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
- -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
- 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
- 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
- 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
- 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
- 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
- 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
- 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
- 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
- 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
- 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
- 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
- -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
- -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
- 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
- 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
- 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
- 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
- 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
- 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
- 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
- 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
- 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
- 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
- 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
- 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
- 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
- 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
- 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
- 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
- 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
- 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
- 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
- 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
- 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
- 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
- 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
- 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
- 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
- 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
- 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
- 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
- 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
- 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
- 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
- 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
- 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
- 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
- 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
- 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
- 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
- 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
- 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
- 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
- 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
- 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
- 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
- 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
- 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
- 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
- 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
- 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
- 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
- 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
- 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
- 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
- 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
- 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
- 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
- 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
- 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
- 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
- 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
- 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
- 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
- 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
- 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
- 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
- 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
- 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
- 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
- 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
- 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
- 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
- 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
- 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
- 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
- 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
- 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
- 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
- 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
- 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
- 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
- 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
- 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
- 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
- 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
- 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
- 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
- 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
- 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
- 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
- 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
- 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
- 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
- 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- -0.334515,0.94239,0,2.970902,-0.959664,0,
- 0.820584,-0.571526,0,2.931756,-1.129655,0,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- 0.820584,-0.571526,0,2.931756,-1.129655,0,
- 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
- 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
- 0.820584,-0.571526,0,2.931756,-1.129655,0,
- -0.255632,0.966774,0,2.896234,-1.31956,0,
- 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
- -0.255632,0.966774,0,2.896234,-1.31956,0,
- 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
- 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
- -0.255632,0.966774,0,2.896234,-1.31956,0,
- 0.826305,-0.563222,0,2.821376,-1.431534,0,
- 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
- 0.826305,-0.563222,0,2.821376,-1.431534,0,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- 0.826305,-0.563222,0,2.821376,-1.431534,0,
- -0.133012,0.991114,0,2.706963,-1.528854,0,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- -0.133012,0.991114,0,2.706963,-1.528854,0,
- 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
- 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
- -0.133012,0.991114,0,2.706963,-1.528854,0,
- 0.815341,-0.578981,0,2.534227,-1.617078,0,
- 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
- 0.815341,-0.578981,0,2.534227,-1.617078,0,
- 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
- 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
- 0.815341,-0.578981,0,2.534227,-1.617078,0,
- -0.144073,0.989567,0,2.348182,-1.624595,0,
- 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
- -0.144073,0.989567,0,2.348182,-1.624595,0,
- 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
- 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
- -0.144073,0.989567,0,2.348182,-1.624595,0,
- -0.073566,0.99729,0,2.167167,-1.596326,0,
- 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
- -0.073566,0.99729,0,2.167167,-1.596326,0,
- 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
- 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
- -0.073566,0.99729,0,2.167167,-1.596326,0,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
- 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
- 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
- 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
- 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
- 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
- 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
- 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
- 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
- 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
- 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
- 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
- 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
- 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
- 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
- 0.942695,-0.333657,0,3.065544,-0.788768,0,
- 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
- 0.942695,-0.333657,0,3.065544,-0.788768,0,
- -0.334515,0.94239,0,2.970902,-0.959664,0,
- 0.942695,-0.333657,0,3.065544,-0.788768,0,
- 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- 0.942695,-0.333657,0,3.065544,-0.788768,0,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- -0.476715,0.879058,0,3.118124,-0.703925,0,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
- 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
- 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
- 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
- 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
- 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
- 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
- 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
- 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
- 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
- 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
- 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
- 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
- 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
- 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
- -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
- -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
- 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
- -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
- -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
- -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
- -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
- 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
- -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
- -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
- 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
- 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
- -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
- 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
- -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
- 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
- -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
- -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
- -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
- -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
- -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
- -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
- -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
- -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
- -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
- -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
- -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
- 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
- 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
- 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
- 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
- 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
- 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
- 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
- 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
- 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
- 0.226963,-0.973903,0,0.44655,-1.67295,0,
- -0.084764,-0.996401,0,-0.155114,-1.828285,0,
- 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
- -0.084764,-0.996401,0,-0.155114,-1.828285,0,
- 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
- 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
- -0.084764,-0.996401,0,-0.155114,-1.828285,0,
- 0.854132,-0.520056,0,-0.530369,-1.860806,0,
- 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
- 0.854132,-0.520056,0,-0.530369,-1.860806,0,
- 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
- 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
- 0.854132,-0.520056,0,-0.530369,-1.860806,0,
- 0.113474,-0.993541,0,-0.956007,-1.825728,0,
- 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
- 0.113474,-0.993541,0,-0.956007,-1.825728,0,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- 0.113474,-0.993541,0,-0.956007,-1.825728,0,
- 0.011286,0.999936,0,-1.395728,-1.723811,0,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- 0.011286,0.999936,0,-1.395728,-1.723811,0,
- -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
- -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
- -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
- -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
- -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
- -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
- 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
- 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
- -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
- 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
- -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
- -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
- -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
- -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
- -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
- -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
- 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
- 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
- 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
- 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
- -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
- -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
- -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
- -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
- -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
- 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
- -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
- -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
- -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
- -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
- 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
- -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
- -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
- 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
- -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
- -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
- -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
- -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
- -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
- -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
- -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
- -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
- 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
- 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
- -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
- 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
- -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
- -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
- -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
- -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
- 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
- -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
- -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
- -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
- -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
- 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
- -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
- 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
- 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
- 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
- -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
- 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
- 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
- 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
- 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
- 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
- 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
- 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
- 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
- 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
- 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
- -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
- -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
- 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
- -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
- -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
- 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
- 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
- -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
- 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
- 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
- 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
- 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
- -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
- -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
- -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
- -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
- -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
- 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
- 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
- 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
- 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
- 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
- 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
- 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
- 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
- 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
- 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
- -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
- -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
- 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
- -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
- 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
- -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
- -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
- 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
- -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
- -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
- 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
- -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
- -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
- -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
- -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
- -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
- -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
- -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
- 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
- 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
- -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
- -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
- 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
- -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
- -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
- -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
- -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
- -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
- -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
- -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
- -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
- 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
- -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
- 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
- -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
- -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
- 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
- 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
- -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
- 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
- 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
- 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
- -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
- -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
- 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
- -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
- -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
- 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
- -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
- 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
- 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
- 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
- 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
- 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
- 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
- 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
- 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
- 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
- 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
- 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
- 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
- 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
- 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
- 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
- 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
- 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
- -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
- 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
- -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
- -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
- 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
- -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
- 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
- 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
- -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
- -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
- 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
- -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
- 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
- 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
- -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
- -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
- 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
- -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
- 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
- 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
- -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
- 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
- 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
- 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
- -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
- -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
- -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
- -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
- -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
- -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
- -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
- -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
- -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
- -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
- -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
- -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
- -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
- -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
- -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
- -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
- 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
- -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
- -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
- -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
- -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
- -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
- -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
- -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
- -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
- -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
- -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
- -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
- -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
- -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
- -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
- -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
- -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
- -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
- -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
- 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
- -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
- -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
- 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
- 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
- -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
- 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
- -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
- -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
- 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
- -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
- -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
- -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
- 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
- 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
- -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
- -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
- -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
- 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
- -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
- -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
- -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
- -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
- -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
- 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
- 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
- -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
- 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
- -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
- -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
- -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
- 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
- -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
- 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
- -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
- -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
- -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
- -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
- -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
- -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
- -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
- -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
- -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
- -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
- -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
- -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
- -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
- -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
- -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
- -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
- -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
- -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
- -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
- -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
- -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
- -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
- -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
- -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
- -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
- -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
- -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
- -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
- -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
- -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
- -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
- -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
- -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
- -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
- -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
- -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
- -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
- -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
- -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
- -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
- -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
- -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
- -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
- -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
- -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
- -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
- -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
- -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
- -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
- -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
- -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
- -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
- -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
- -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
- -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
- -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
- -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
- 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
- -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
- -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
- 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
- -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
- -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
- 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
- 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
- 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
- -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
- 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
- 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
- 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
- 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
- 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
- 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
- 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
- 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
- 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
- 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
- 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
- -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
- 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
- -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
- 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
- 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
- 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
- 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
- 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
- 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
- -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
- -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
- -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
- 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
- -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
- 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
- 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
- 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
- -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
- 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
- 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
- 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
- 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
- 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
- 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
- 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
- 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
- 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
- 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
- -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
- 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
- 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
- -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
- 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
- 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
- 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
- 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
- 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
- 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
- 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
- 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
- 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
- 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
- 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
- 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
- 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
- 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
- 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
- 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
- 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
- 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
- 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
- -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
- -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
- -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
- -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
- 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
- -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
- 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
- -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
- -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
- -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
- -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
- -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
- -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
- -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
- 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
- -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
- 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
- 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
- -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
- -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
- -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
- -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
- -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
- -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
- 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
- -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
- 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
- -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
- -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
- -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
- -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
- -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
- -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
- -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
- -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
- -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
- -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
- -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
- -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
- -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
- 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
- -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
- 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
- -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
- -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
- -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
- -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
- -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
- -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
- -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
- -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
- -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
- -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
- -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
- -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
- -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
- -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
- -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
- -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
- 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
- -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
- 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
- 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
- -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
- -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
- -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
- -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
- -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
- -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
- -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
- -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
- -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
- -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
- -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
- -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
- -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
- -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
- -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
- -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
- -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
- -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
- 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
- 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
- -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
- 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
- -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
- -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
- 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
- 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
- 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
- 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
- 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
- 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
- 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
- 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
- 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
- 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
- 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
- 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
- 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
- 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
- -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
- -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
- -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
- -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
- -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
- -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
- -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
- -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
- -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
- -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
- -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
- -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
- -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
- -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
- -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
- -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
- -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
- -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
- -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
- -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
- 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
- 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
- -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
- 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
- -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
- -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
- 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
- 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
- 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
- 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
- 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
- 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
- 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
- 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
- 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
- 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
- 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
- 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
- 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
- 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
- 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
- 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
- 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
- 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
- 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
- -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
- 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
- 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
- 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
- -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
- 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
- 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
- -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
- 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
- -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
- -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
- -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
- -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
- -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
- -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
- 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
- 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
- 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
- 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
- -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
- 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
- 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
- -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
- 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
- -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
- -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
- -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
- -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
- -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
- -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
- -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
- -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
- -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
- -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
- -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
- -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
- -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
- -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
- -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
- -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
- -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
- -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
- -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
- 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
- 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
- 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
- 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
- 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
- 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
- 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
- -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
- 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
- -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
- -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
- 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
- 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
- -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
- 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
- -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
- -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
- 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
- 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
- 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
- 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
- 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
- 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
- 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
- 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
- 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
- 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
- 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
- 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
- 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
- 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
- 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
- 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
- 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
- -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
- 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
- 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
- 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
- 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
- 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
- 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
- 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
- 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
- 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
- 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
- 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
- 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
- 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
- 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
- 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
- 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
- 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
- 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
- -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
- -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
- 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
- -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
- 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
- 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
- -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
- -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
- -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
- -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
- -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
- -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
- -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
- -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
- -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
- -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
- -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
- -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
- -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
- -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
- -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
- -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
- -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
- -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
- -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
- -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
- -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
- -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
- -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
- -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
- -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
- -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
- -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
- -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
- -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
- -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
- -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
- 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
- -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
- -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
- -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
- -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
- 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
- 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
- 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
- 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
- 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
- -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
- 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
- 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
- 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
- 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
- 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
- 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
- -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
- 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
- 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
- -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
- 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
- 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
- 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
- -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
- 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
- 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
- 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
- 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
- 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
- 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
- -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
- -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
- -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
- -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
- -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
- -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
- -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
- -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
- -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
- -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
- -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
- -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
- -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
- -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
- -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
- -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
- -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
- -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
- -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
- -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
- -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
- -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
- -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
- -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
- -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
- -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
- -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
- -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
- 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
- -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
- -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
- 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
- -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
- 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
- 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
- -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
- -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
- 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
- -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
- 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
- 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
- -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
- -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
- 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
- -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
- 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
- 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
- -0.476715,0.879058,0,3.118124,-0.703925,0,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
- -0.476715,0.879058,0,3.118124,-0.703925,0,
- 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
- -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
- 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
- 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
- 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
- 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
- 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
- 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
- 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
- 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
- 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
- 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
- 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
- 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
- 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
- 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
- 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
- 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
- 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
- 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
- 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
- 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
- -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
- 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
- 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
- -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
- 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
- -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
- 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
- -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
- -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
- 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
- -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
- -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
- 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
- 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
- -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
- 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
- -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
- 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
- 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
- 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
- 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
- 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
- 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
- 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
- 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
- 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
- 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
- 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
- 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
- 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
- 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
- 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
- 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
- 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
- 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
- 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
- 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
- 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
- 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
- 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
- -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
- -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
- 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
- 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
- -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
- 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
- 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
- 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
- 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
- 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
- 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
- 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
- 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
- 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
- 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
- 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
- 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
- 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
- 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
- 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
- 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
- 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
- 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
- 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
- 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
- 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
- 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
- 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
- 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
- -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
- -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
- 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
- -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
- -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
- -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
- -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
- -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
- -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
- -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
- -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
- -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
- -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
- -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
- -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
- 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
- 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
- -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
- 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
- -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
- -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
- 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
- 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
- -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
- 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
- -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
- -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
- 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
- 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
- -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
- 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
- -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
- 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
- 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
- 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
- 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
- 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
- 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
- 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
- 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
- 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
- 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
- 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
- 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
- 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
- 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
- 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
- -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
- 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
- -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
- 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
- -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
- 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
- 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
- -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
- 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
- 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
- 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
- -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
- -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
- -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
- -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
- -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
- -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
- -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
- -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
- -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
- -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
- -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
- -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
- -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
- -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
- -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
- -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
- -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
- -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
- -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
- -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
- -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
- -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
- -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
- -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
- -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
- -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
- -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
- -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
- -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
- -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
- -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
- -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
- 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
- -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
- -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
- 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
- -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
- 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
- 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
- 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
- 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
- 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
- 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
- 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
- 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
- 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
- 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
- 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
- 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
- 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
- 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
- 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
- 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
- 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
- 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
- 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
- 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
- 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
- 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
- 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
- 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
- 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
- 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
- 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
- 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
- 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
- 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
- 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
- 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
- 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
- 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
- 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
- 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
- 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
- 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
- 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
- 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
- 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
- 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
- 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
- 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
- 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
- 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
- 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
- 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
- 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
- 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
- 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
- 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
- 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
- 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
- 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
- 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
- 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
- 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
- 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
- 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
- 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
- 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
- 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
- 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
- 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
- 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
- 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
- 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
- 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
- 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
- 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
- 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
- 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
- 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
- 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
- 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
- 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
- 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
- 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
- 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
- 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
- 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
- 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
- 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
- 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
- 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
- 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
- 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
- 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
- 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
- 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
- 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
- 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
- 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
- -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
- 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
- -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
- 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
- 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
- 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
- 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
- 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
- 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
- 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
- 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
- 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
- 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
- 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
- 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
- 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
- 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
- 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
- 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
- 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
- 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
- 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
- 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
- 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
- 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
- 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
- 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
- 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
- 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
- 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
- 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
- -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
- -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
- 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
- -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
- 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
- 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
- 0.756976,-0.653442,0,2.128139,1.788397,0,
- 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
- 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
- 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
- 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
- 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
- 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
- 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
- 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
- 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
- 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
- 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
- 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
- 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
- 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
- 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
- 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
- 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
- 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
- -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
- -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
- 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
- -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
- -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
- 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
- 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
- -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
- 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
- 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
- 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
- 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
- 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
- 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
- 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
- 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
- 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
- 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
- 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
- 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
- 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
- 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
- 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
- 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
- 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
- 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
- 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
- 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
- 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
- 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
- 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
- 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
- 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
- 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
- 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
- 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
- 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
- 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
- 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
- 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
- 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
- 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
- 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
- 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
- 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
- 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
- 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
- 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
- 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
- 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
- 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
- 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
- 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
- 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
- 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
- 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
- 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
- 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
- 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
- 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
- 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
- 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
- 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
- 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
- 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
- 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
- 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
- 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
- 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
- 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
- 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
- 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
- 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
- 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
- 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
- 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
- -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
- -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
- 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
- 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
- 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
- -0.385788,0.922588,0,2.042206,1.777154,0,
- 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
- 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
- -0.385788,0.922588,0,2.042206,1.777154,0,
- 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
- -0.720176,-0.693792,0,1.794465,1.787719,0,
- 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
- 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
- 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
- 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
- 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
- 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
- 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
- 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
- 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
- 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
- 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
- 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
- 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
- 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
- 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
- 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
- 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
- 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
- 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
- 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
- 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
- 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
- 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
- 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
- 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
- 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
- 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
- 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
- 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
- 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
- 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
- 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
- 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
- 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
- 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
- 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
- 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
- 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
- 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
- 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
- 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
- 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
- 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
- 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
- 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
- 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
- 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
- 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
- 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
- 0.566114,-0.824327,0,0.234527,1.730117,0,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- 0.566114,-0.824327,0,0.234527,1.730117,0,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
- -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
- -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
- 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
- -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
- -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
- -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
- 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
- -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
- 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
- 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
- -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
- -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
- 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
- -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
- 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
- -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
- 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
- -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
- -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
- -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
- 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
- -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
- 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
- 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
- -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
- 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
- -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
- -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
- 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
- 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
- -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
- 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
- -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
- -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
- 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
- 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
- -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
- 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
- -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
- 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
- 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
- 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
- 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
- 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
- -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
- 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
- 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
- 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
- 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
- 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
- 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
- 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
- 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
- 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
- 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
- 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
- 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
- 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
- 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
- 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
- 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
- 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
- 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
- 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
- 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
- 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
- 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
- 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
- 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
- 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
- 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
- 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
- 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
- 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
- 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
- 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
- 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
- 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
- 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
- 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
- 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
- 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
- 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
- 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
- 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
- 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
- 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
- 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
- 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
- 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
- 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
- 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
- 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
- 0.92802,-0.37253,0,0.927497,-1.558489,0,
- 0.226963,-0.973903,0,0.44655,-1.67295,0,
- 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
- 0.92802,-0.37253,0,0.927497,-1.558489,0,
- 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
- 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
- 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
- 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
- -0.009814,-0.999952,0,-0.547248,1.742126,0,
- 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
- -0.009814,-0.999952,0,-0.547248,1.742126,0,
- -0.039092,-0.999236,0,-0.228904,1.734267,0,
- 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
- 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
- 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
- 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
- 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
- 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
- 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
- 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
- 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
- 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
- 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
- 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
- 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
- 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
- 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
- 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
- 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
- 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
- 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
- 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
- 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
- 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
- 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
- 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
- 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
- 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
- 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
- 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
- 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
- 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
- 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
- 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
- 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
- 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
- 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
- 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
- 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
- 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
- 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
- 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
- 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
- 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
- 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
- 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
- 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
- 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
- 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
- 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
- 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
- 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
- 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
- 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
- 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
- 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
- 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
- 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
- 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
- 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
- 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
- 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
- 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
- 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
- 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
- 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
- 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
- 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
- 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
- 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
- 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
- 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
- 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
- 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
- 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
- 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
- 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
- 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
- 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
- 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
- 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
- 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
- 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
- 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
- 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
- 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
- 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
- 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
- -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
- -0.065586,-0.997847,0,-1.179474,1.786649,0,
- 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
- -0.065586,-0.997847,0,-1.179474,1.786649,0,
- -0.098179,0.995169,0,-0.866132,1.75467,0,
- 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
- -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
- -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
- 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
- -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
- 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
- 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
- -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
- -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
- 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
- -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
- 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
- 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
- -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
- -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
- 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
- -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
- 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
- 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
- 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
- -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
- 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
- -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
- 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
- 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
- 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
- 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
- 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
- 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
- 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
- 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
- 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
- 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
- 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
- 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
- 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
- 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
- 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
- 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
- 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
- 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
- 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
- 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
- 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
- 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
- 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
- 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
- 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
- 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
- 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
- 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
- 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
- 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
- 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
- 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
- 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
- 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
- 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
- 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
- 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
- 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
- -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
- 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
- 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
- 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
- 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
- -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
- -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
- -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
- -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
- -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
- 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
- -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
- -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
- -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
- -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
- -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
- -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
- -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
- -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
- 0.779025,-0.626993,0,1.456656,1.785879,0,
- -0.720176,-0.693792,0,1.794465,1.787719,0,
- 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
- -0.720176,-0.693792,0,1.794465,1.787719,0,
- 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
- 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
- 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
- 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
- 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
- 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
- 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
- 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
- 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
- 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
- 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
- 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
- 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
- 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
- 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
- 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
- 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
- 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
- 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
- -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
- 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
- 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
- -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
- 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
- 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
- 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
- -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
- 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
- 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
- -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
- -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
- 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
- -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
- 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
- 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
- -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
- -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
- 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
- -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
- 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
- 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
- -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
- -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
- 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
- -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
- 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
- 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
- -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
- -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
- -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
- 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
- -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
- 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
- -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
- 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- 0.770209,-0.637792,0,1.289448,-1.546597,0,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
- -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
- -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
- 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
- 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
- -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
- 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
- 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
- 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
- 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
- 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
- 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
- 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
- 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
- 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
- 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
- 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
- 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
- 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
- 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
- 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
- -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
- 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
- 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
- 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
- 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
- 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
- 0.779025,-0.626993,0,1.456656,1.785879,0,
- 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- 0.770209,-0.637792,0,1.289448,-1.546597,0,
- 0.92802,-0.37253,0,0.927497,-1.558489,0,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- 0.92802,-0.37253,0,0.927497,-1.558489,0,
- 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
- -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
- -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
- 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
- -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
- 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
- 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
- -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
- -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
- 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
- -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
- 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
- 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
- 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
- -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
- 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
- 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
- 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
- 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
- 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
- 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
- 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
- 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
- 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
- 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
- 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
- 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
- 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
- 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
- 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
- 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
- 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
- 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
- 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
- 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
- -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
- -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
- 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
- -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
- 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
- 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
- -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
- -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
- 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
- -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
- 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
- -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
- -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
- -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
- -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
- -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
- -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
- -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
- -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
- -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
- -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
- -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
- -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
- -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
- -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
- -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
- -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
- -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
- -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
- -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
- -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
- 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
- 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
- -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
- -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
- 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
- -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
- 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
- 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
- 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
- -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
- 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
- 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
- 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
- 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
- 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
- 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
- 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
- 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
- -0.039092,-0.999236,0,-0.228904,1.734267,0,
- -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
- -0.039092,-0.999236,0,-0.228904,1.734267,0,
- 0.566114,-0.824327,0,0.234527,1.730117,0,
- -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
- 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
- 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
- -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
- 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
- -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
- -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
- 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
- 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
- -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
- 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
- -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
- -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
- 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
- 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
- -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
- 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
- -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
- 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
- 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
- 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
- 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
- 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
- -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
- 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
- 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
- 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
- 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
- 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
- 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
- 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
- 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
- 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
- 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
- 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
- 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
- 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
- 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
- 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
- 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
- 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
- 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
- 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
- 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
- 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
- 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
- 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
- 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
- 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
- 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
- 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
- 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
- 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
- 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
- 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
- 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
- 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
- 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
- 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
- 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
- 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
- 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
- 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
- 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
- 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
- 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
- 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
- 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
- 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
- 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
- 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
- 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
- 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
- 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
- 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
- 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
- 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
- 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
- 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
- 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
- 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
- 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
- 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
- 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
- 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
- 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
- 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
- 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
- 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
- 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
- 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
- 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
- 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
- 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
- -0.098179,0.995169,0,-0.866132,1.75467,0,
- 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
- -0.098179,0.995169,0,-0.866132,1.75467,0,
- -0.009814,-0.999952,0,-0.547248,1.742126,0,
- 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
- 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
- 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
- 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
- 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
- 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
- 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
- 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
- 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
- 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
- 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
- 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
- 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
- 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
- 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
- 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
- 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
- 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
- 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
- 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
- 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
- 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
- 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
- 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
- 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
- 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
- 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
- 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
- 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
- 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
- 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
- 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
- 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
- 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
- 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
- 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
- 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
- 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
- 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
- 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
- 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
- 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
- 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
- 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
- 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
- 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
- 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
- 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
- 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
- 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
- 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
- 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
- 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
- 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
- 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
- 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
- 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
- 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
- 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
- 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
- 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
- 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
- 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
- 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
- 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
- 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
- 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
- -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
- 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
- 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
- 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
- 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
- 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
- -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
- -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
- 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
- -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
- 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
- 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
- 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
- -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
- 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
- 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
- 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
- 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
- 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
- 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
- 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
- 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
- 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
- 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
- -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
- -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
- 0.262234,-0.965004,0,-1.35095,1.807009,0,
- -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
- 0.262234,-0.965004,0,-1.35095,1.807009,0,
- -0.065586,-0.997847,0,-1.179474,1.786649,0,
- -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
- -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
- -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
- -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
- -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
- -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
- -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
- -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
- -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
- -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
- -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
- -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
- -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
- -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
- -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
- -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
- -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
- -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
- 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
- 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
- -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
- 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
- -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
- -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
- 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
- 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
- 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
- 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
- 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
- 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
- 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
- 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
- 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
- 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
- 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
- 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
- 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
- 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
- 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
- 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
- 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
- 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
- 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
- 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
- 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
- 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
- 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
- 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
- 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
- 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
- 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
- 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
- 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
- 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
- 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
- -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
- 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
- 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
- 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
- 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
- -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
- -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
- -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
- -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
- -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
- 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
- -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
- -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
- -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
- -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
- -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
- -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
- -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
- -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
- -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
- -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
- -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
- -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
- -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
- -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
- -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
- -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
- 0.021487,0.999769,0,-1.67651,1.826886,0,
- -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
- 0.021487,0.999769,0,-1.67651,1.826886,0,
- 0.262234,-0.965004,0,-1.35095,1.807009,0,
- -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
- -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
- -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
- -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
- -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
- -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
- -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
- -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
- -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
- -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
- -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
- -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
- -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
- -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
- -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
- -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
- -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
- -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
- 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
- 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
- -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
- 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
- -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
- -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
- 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
- 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
- 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
- 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
- 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
- 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
- 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
- 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
- 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
- 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
- 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
- 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
- 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
- -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
- 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
- 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
- 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
- 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
- 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
- -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
- -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
- 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
- -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
- 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
- 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
- -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
- -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
- 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
- -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
- 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
- -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
- -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
- -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
- -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
- -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
- 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
- -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
- 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
- -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
- -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
- -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
- -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
- -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
- 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
- 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
- -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
- 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
- -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
- -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
- 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
- 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
- -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
- 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
- -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
- -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
- 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
- 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
- -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
- 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
- -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
- 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
- -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
- 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
- -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
- -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
- -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
- -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
- 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
- 0.181762,-0.983343,0,-2.057387,1.841308,0,
- -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
- 0.181762,-0.983343,0,-2.057387,1.841308,0,
- 0.021487,0.999769,0,-1.67651,1.826886,0,
- -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
- 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
- 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
- -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
- 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
- -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
- -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
- 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
- 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
- -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
- 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
- -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
- -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
- 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
- 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
- -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
- 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
- -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
- 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
- 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
- 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
- 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
- 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
- -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
- 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
- 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
- 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
- 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
- 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
- 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
- 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
- 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
- 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
- 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
- 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
- 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
- -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
- 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
- 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
- -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
- 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
- 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
- -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
- -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
- 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
- -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
- 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
- -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
- -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
- 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
- -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
- -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
- -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
- -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
- -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
- 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
- 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
- -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
- 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
- -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
- 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
- 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
- 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
- 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
- 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
- -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
- 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
- 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
- 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
- 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
- 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
- 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
- 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
- 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
- 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
- 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
- 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
- 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
- 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
- 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
- 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
- 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
- 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
- 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
- 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
- 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
- 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
- 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
- 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
- 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
- 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
- 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
- 0.03611,0.999348,0,-2.629466,1.918204,0,
- 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
- 0.03611,0.999348,0,-2.629466,1.918204,0,
- 0.181762,-0.983343,0,-2.057387,1.841308,0,
- 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
- 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
- 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
- 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
- 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
- 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
- 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
- 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
- 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
- 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
- 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
- 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
- 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
- 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
- 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
- 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
- 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
- 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
- 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
- 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
- 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
- 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
- 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
- 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
- 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
- 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
- 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
- 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
- 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
- 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
- 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
- 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
- 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
- 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
- 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
- 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
- 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
- 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
- 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
- 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
- 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
- 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
- -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
- -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
- 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
- -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
- 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
- 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
- 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
- -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
- -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
- 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
- -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
- -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
- 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
- -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
- -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
- 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
- -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
- 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
- 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
- -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
- -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
- 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
- -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
- 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
- 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
- -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
- -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
- 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
- -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
- 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
- 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
- -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
- -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
- 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
- -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
- 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
- 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
- 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
- -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
- 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
- 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
- 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
- 0.012502,-0.999922,0,-3.037562,2.001526,0,
- 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
- 0.012502,-0.999922,0,-3.037562,2.001526,0,
- 0.03611,0.999348,0,-2.629466,1.918204,0,
- 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
- 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
- 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
- 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
- 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
- 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
- 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
- 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
- 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
- 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
- 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
- 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
- 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
- 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
- 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
- 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
- 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
- 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
- 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
- -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
- 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
- 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
- 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
- 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
- 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
- -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
- -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
- 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
- -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
- 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
- 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
- -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
- -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
- 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
- -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
- 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
- -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
- -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
- -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
- -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
- -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
- 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
- -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
- -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
- -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
- -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
- -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
- -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
- -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
- -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
- -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
- -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
- -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
- -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
- -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
- -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
- -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
- -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
- -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
- -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
- -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
- -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
- -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
- -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
- -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
- -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
- -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
- -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
- -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
- -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
- -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
- -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
- -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
- -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
- -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
- -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
- -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
- -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
- -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
- -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
- -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
- -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
- -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
- -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
- -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
- -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
- -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
- -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
- 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
- -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
- -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
- 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
- -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
- -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
- -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
- -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
- -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
- -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
- -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
- 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
- -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
- -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
- -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
- -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
- -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
- -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
- -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
- -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
- -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
- -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
- -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
- -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
- -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
- -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
- -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
- -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
- -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
- -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
- -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
- -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
- -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
- -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
- -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
- -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
- -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
- -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
- -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
- -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
- -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
- -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
- -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
- -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
- -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
- -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
- -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
- -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
- -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
- -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
- -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
- -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
- -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
- -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
- -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
- -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
- -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
- -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
- -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
- -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
- -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
- -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
- -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
- -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
- -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
- -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
- -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
- -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
- -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
- -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
- -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
- -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
- -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
- -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
- -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
- -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
- -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
- -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
- -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
- -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
- -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
- -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
- -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
- -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
- -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
- -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
- -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
- -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
- -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
- -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
- -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
- -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
- -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
- -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
- -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
- -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
- -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
- -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
- -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
- -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
- -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
- -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
- -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
- -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
- -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
- -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
- -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
- -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
- -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
- -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
- -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
- -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
- -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
- -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
- -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
- -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
- -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
- -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
- -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
- -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
- -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
- -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
- -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
- -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
- -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
- -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
- -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
- -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
- -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
- -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
- -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
- -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
- -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
- -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
- -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
- -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
- -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
- -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
- -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
- -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
- -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
- -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
- -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
- -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
- -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
- -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
- -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
- -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
- -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
- -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
- -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
- -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
- -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
- -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
- -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
- -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
- -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
- -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
- -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
- -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
- -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
- -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
- -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
- -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
- -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
- -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
- -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
- -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
- -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
- -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
- -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
- -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
- -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
- -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
- -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
- -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
- -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
- -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
- -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
- -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
- -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
- -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
- -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
- -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
- -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
- -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
- -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
- -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
- -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
- -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
- -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
- -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
- -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
- -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
- -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
- -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
- -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
- -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
- -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
- -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
- -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
- -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
- -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
- -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
- -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
- -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
- -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
- -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
- -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
- -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
- -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
- -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
- -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
- -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
- -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
- -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
- -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
- -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
- -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
- -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
- -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
- -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
- -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
- -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
- -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
- -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
- -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
- -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
- -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
- -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
- -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
- -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
- -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
- -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
- 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
- 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
- -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
- 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
- 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
- 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
- -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
- 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
- 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
- -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
- 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
- -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
- -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
- 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
- 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
- -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
- 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
- -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
- 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
- -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
- -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
- -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
- -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
- -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
- -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
- -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
- 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
- -0.385788,0.922588,0,2.042206,1.777154,0,
- 0.756976,-0.653442,0,2.128139,1.788397,0,
- 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
- 0.756976,-0.653442,0,2.128139,1.788397,0,
- 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
- 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
- -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
- -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
- 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
- -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
- -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
- -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
- -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
- -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
- -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
- -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
- 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
- -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
- 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
- -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
- 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
- -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
- 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
- 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
- -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
- 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
- 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
- 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
- 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
- -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
- -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
- -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
- -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
- -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
- 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
- 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
- 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
- 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
- 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
- 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
- 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
- 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
- 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
- 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
- -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
- -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
- 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
- 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
- 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
- -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
- -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
- 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
- -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
- -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
- 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
- -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
- 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
- -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
- -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
- -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
- -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
- -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
- -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
- -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
- -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
- 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
- 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
- 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
- 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
- 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
- -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
- -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
- -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
- -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
- 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
- -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
- 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
- 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
- -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
- 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
- -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
- -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
- -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
- -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
- -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
- -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
- 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
- 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
- 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
- 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
- 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
- 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
- -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
- -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
- -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
- -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
- -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
- -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
- 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
- -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
- -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
- 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
- -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
- 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
- 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
- -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
- -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
- -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
- -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
- 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
- -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
- 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
- -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
- 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
- -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
- -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
- -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
- -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
- 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
- -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
- -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
- -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
- -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
- -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
- -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
- -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
- -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
- -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
- -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
- 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
- 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
- -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
- 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
- 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
- -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
- 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
- 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
- -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
- -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
- -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
- -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
- -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
- -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
- -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
- -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
- -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
- -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
- -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
- -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
- -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
- -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
- -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
- -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
- -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
- -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
- -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
- -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
- -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
- -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
- -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
- -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
- -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
- -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
- -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
- -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
- -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
- -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
- -0.996668,0.081567,0,-3.623861,0.911561,0,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
- -0.996668,0.081567,0,-3.623861,0.911561,0,
- -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
- -0.989171,0.146765,0,-3.599077,0.796217,0,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
- -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
- -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
- -0.946116,-0.323827,0,-3.608593,1.163581,0,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
- -0.946116,-0.323827,0,-3.608593,1.163581,0,
- -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
- -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
- -0.997181,-0.075036,0,-3.622326,1.005378,0,
- -0.946116,-0.323827,0,-3.608593,1.163581,0,
- -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
- -0.997181,-0.075036,0,-3.622326,1.005378,0,
- -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
- -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
- -0.996668,0.081567,0,-3.623861,0.911561,0,
- -0.997181,-0.075036,0,-3.622326,1.005378,0,
- -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
- -0.996668,0.081567,0,-3.623861,0.911561,0,
- -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
- -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
- -0.999862,-0.016634,0,-3.900566,1.002504,0,
- -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
- -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
- -0.999862,-0.016634,0,-3.900566,1.002504,0,
- -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
- -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
- -0.964752,0.26316,0,-3.87514,1.480358,0,
- -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
- -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
- -0.964752,0.26316,0,-3.87514,1.480358,0,
- -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
- -0.999862,-0.016634,0,-3.900566,1.002504,0,
- -0.766357,0.642415,0,-3.712832,1.794492,0,
- -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
- -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
- -0.766357,0.642415,0,-3.712832,1.794492,0,
- -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
- -0.964752,0.26316,0,-3.87514,1.480358,0,
- -0.410619,0.911807,0,-3.47843,1.975409,0,
- -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
- -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
- -0.410619,0.911807,0,-3.47843,1.975409,0,
- -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
- -0.766357,0.642415,0,-3.712832,1.794492,0,
- -0.433128,-0.901332,0,-3.242148,2.021387,0,
- 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
- -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
- -0.433128,-0.901332,0,-3.242148,2.021387,0,
- -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
- -0.410619,0.911807,0,-3.47843,1.975409,0,
- -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
- -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
- -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
- -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
- -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
- -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
- -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
- -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
- -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
- -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
- -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
- -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
- -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
- -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
- -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
- -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
- -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
- -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
- -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
- -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
- -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
- -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
- -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
- -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
- 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
- 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
- -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
- 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
- -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
- -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
- -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
- 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
- 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
- -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
- 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
- -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
- -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
- -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
- 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
- -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
- 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
- -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
- -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
- -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
- -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
- -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
- -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
- -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
- -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
- -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
- -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
- -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
- 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
- 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
- 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
- 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
- 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
- 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
- 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
- -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
- 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
- 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
- -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
- 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
- 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
- -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
- 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
- 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
- -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
- 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
- -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
- 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
- -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
- 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
- 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
- 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
- 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
- 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
- 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
- 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
- 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
- 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
- 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
- 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
- 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
- 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
- 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
- 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
- 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
- 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
- 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
- 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
- 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
- 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
- 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
- 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
- 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
- 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
- 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
- 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
- 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
- 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
- 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
- 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
- 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
- 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
- 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
- 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
- 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
- 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
- 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
- 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
- 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
- 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
- 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
- -0.433128,-0.901332,0,-3.242148,2.021387,0,
- 0.012502,-0.999922,0,-3.037562,2.001526,0,
- 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
- 0.012502,-0.999922,0,-3.037562,2.001526,0,
- 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
- 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
- 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
- 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
- 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
- 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
- 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
- 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
- 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
- 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
- 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
- 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
- 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
- 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
- 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
- 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
- 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
- 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
- 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
- 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
- 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
- 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
- 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
- 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
- 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
- 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
- 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
- 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
- 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
- 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
- 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
- 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
- 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
- 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
- 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
- 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
- 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
- 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
- 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
- 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
- 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
- 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
- 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
- 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
- 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
- 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
- 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
- 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
- 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
- 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
- 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
- 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
- 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
- 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
- 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
- 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
- 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
- -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
- 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
- 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
- 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
- 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
- -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
- -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
- 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
- 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
- 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
- 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
- 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
- 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
- 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
- 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
- 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
- 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
- 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
- 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
- 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
- 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
- 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
- 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
- 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
- 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
- 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
- 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
- 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
- -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
- 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
- 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
- -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
- 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
- -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
- -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
- -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
- 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
- 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
- -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
- 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
- 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
- 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
- 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
- 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
- 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
- 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
- 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
- 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
- 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
- -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
- 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
- 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
- -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
- 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
- -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
- 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
- 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
- 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
- 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
- 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
- -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
- -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
- -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
- -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
- 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
- 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
- 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
- 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
- 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
- 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
- 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
- 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
- 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
- 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
- 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
- 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
- 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
- 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
- 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
- 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
- -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
- 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
- -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
- 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
- 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
- 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
- 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
- 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
- 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
- -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
- 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
- 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
- -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
- 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
- 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
- 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
- -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
- 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
- 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
- -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
- 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
- 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
- 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
- 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
- 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
- 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
- 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
- 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
- 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
- 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
- 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
- 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
- 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
- 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
- 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
- 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
- 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
- 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
- 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
- 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
- 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
- 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
- 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
- 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
- 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
- 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
- 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
- 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
- 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
- -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
- -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
- 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
- -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
- 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
- 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
- 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
- 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
- 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
- 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
- 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
- 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
- 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
- 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
- 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
- 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
- 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
- -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
- 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
- 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
- -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
- 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
- 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
- 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
- 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
- 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
- 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
- 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
- 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
- -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
- 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
- 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
- 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
- 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
- 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
- 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
- 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
- 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
- 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
- -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
- 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
- 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
- -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
- 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
- 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
- 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
- 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
- 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
- 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
- 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
- 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
- -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
- -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
- 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
- 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
- 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
- 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
- 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
- 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
- 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
- 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
- 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
- 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
- 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
- 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
- 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
- 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
- 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
- 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
- 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
- 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
- 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
- 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
- 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
- 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
- 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
- -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
- 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
- -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
- 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
- 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
- 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
- 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
- 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
- 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
- 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
- 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
- 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
- -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
- 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
- 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
- -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
- 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
- -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
- 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
- -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
- -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
- 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
- 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
- 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
- -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
- 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
- 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
- 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
- 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
- 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
- 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
- -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
- 0.027992,0.999608,0,5.588763,1.573846,0.000686,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
- 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
- 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
- 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
- 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
- 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
- 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
- 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
- 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
- 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
- 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
- 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
- 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
- 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
- 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
- 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
- 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
- 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
- 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
- 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
- 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
- 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
- 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
- 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
- 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
- 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
- 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
- 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
- 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
- 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
- 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
- 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
- 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
- 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
- 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
- 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
- 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- 0.027992,0.999608,0,5.588763,1.573846,0.000686,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
- 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
- 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
- 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
- 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
- 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
- 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
- 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
- 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
- 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
- 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
- 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
- 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
- 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
- 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
- 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
- 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
- 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
- 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
- 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
- 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
- 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
- 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
- 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
- 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
- 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
- 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
- -0.016213,0.999869,0,5.908842,1.388968,0.001026,
- 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
- 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
- -0.016213,0.999869,0,5.908842,1.388968,0.001026,
- 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
- 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
- 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
- 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
- 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
- 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
- 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
- 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
- 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
- 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
- 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
- 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
- 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
- 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
- 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
- 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
- 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
- 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
- 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
- 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
- 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
- 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
- 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
- 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
- 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
- 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
- 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
- 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
- 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
- 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
- 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
- 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
- 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
- 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
- -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
- 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
- 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
- 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
- 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
- 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
- -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
- -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
- 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
- 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
- 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
- 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
- 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
- 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
- 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
- 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
- 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
- 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
- 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
- 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
- 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
- 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
- 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
- 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
- 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
- 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
- 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
- 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
- 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
- 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
- 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
- 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
- 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
- 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
- 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
- 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
- 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
- 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
- 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
- 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
- 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
- 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
- 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
- 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
- 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
- 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
- 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
- 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
- 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
- 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
- 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
- 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
- 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
- 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
- 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
- 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
- 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
- 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
- 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
- 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
- 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
- -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
- 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
- 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
- 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
- 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
- -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
- -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
- -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
- -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
- -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
- 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
- -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
- -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
- 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
- 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
- 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
- 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
- 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
- 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
- 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
- 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
- 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
- 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
- -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
- -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
- -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
- -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
- -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
- -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
- 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
- -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
- -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
- -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
- 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
- -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
- -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
- -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
- -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
- 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
- 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
- -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
- 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
- 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
- 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
- -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
- -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
- -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
- 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
- -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
- 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
- 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
- -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
- -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
- -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
- -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
- -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
- 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
- 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
- -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
- 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
- -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
- 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
- -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
- 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
- -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
- -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
- -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
- 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
- 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
- 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
- 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
- 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
- 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
- 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
- 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
- -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
- 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
- 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
- -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
- 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
- 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
- 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
- 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
- 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
- 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
- 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
- -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
- -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
- -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
- 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
- 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
- -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
- 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
- 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
- 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
- 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
- -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
- -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
- -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
- -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
- 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
- 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
- -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
- -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
- -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
- 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
- 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
- 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
- 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
- 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
- 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
- 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
- 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
- -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
- 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
- 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
- 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
- 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
- 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
- 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
- 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
- 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
- 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
- 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
- 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
- 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
- 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
- -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
- 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
- -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
- -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
- 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
- -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
- 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
- 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
- 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
- -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
- 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
- -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
- 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
- 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
- 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
- -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
- 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
- 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
- -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
- 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
- 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
- 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
- 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
- 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
- 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
- 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
- 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
- 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
- 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
- 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
- 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
- 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
- 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
- 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
- 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
- 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
- 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
- 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
- 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
- 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
- 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
- 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
- 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
- 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
- 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
- -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
- 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
- -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
- 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
- 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
- -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
- 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
- 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
- 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
- -0.016213,0.999869,0,5.908842,1.388968,0.001026,
- 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
- 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
- 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
- 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
- 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
- -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
- 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
- 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
- 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
- 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
- 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
- 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
- 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
- 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
- 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
- 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
- -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
- 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
- -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
- -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
- -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
- 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
- -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
- -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
- 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
- -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
- 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
- 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
- -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
- -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
- 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
- -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
- 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
- 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
- -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
- -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
- 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
- -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
- 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
- -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
- -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
- 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
- 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
- -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
- 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
- -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
- 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
- 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
- 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
- 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
- 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
- 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
- -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
- -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
- -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
- -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
- -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
- -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
- 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
- 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
- -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
- 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
- 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
- -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
- -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
- 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
- -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
- 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
- -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
- -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
- -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
- -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
- -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
- -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
- -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
- -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
- -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
- -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
- -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
- -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
- -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
- -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
- -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
- -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
- -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
- 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
- -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
- 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
- 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
- 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
- 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
- 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
- -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
- -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
- 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
- -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
- -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
- -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
- -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
- -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
- -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
- -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
- -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
- -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
- -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
- -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
- -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
- -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
- -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
- -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
- -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
- 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
- -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
- -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
- -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
- -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
- -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
- -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
- -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
- -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
- -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
- -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
- -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
- -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
- -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
- -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
- -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
- -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
- -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
- -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
- -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
- -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
- -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
- -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
- -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
- -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
- -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
- -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
- -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
- -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
- -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
- -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
- -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
- -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
- -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
- -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
- -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
- -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
- -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
- -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
- -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
- -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
- -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
- -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
- -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
- -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
- -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
- -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
- -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
- -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
- 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
- -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
- -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
- 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
- -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
- -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
- 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
- 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
- -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
- 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
- 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
- -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
- -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
- 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
- -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
- -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
- -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
- -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
- -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
- -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
- -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
- -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
- -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
- -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
- -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
- -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
- -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
- -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
- -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
- -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
- -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
- -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
- -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
- 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
- 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
- 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
- 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
- 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
- -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
- 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
- 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
- -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
- 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
- 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
- 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
- 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
- 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
- -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
- -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
- 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
- -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
- 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
- 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
- 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
- -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
- -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
- -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
- 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
- -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
- -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
- -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
- -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
- -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
- -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
- -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
- -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
- -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
- -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
- 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
- -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
- -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
- -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
- -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
- -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
- -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
- -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
- -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
- 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
- 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
- -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
- 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
- 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
- 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
- -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
- 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
- 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
- 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
- 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
- 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
- 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
- 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
- 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
- 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
- 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
- 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
- -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
- -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
- 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
- -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
- 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
- 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
- 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
- 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
- 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
- -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
- -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
- -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
- -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
- -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
- -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
- -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
- -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
- -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
- 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
- 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
- -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
- -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
- -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
- 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
- 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
- -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
- 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
- -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
- 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
- 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
- -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
- 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
- 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
- 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
- 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
- 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
- -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
- 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
- -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
- 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
- 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
- -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
- 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
- -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
- -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
- 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
- -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
- 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
- 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
- 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
- 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
- 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
- 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
- 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
- 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
- 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
- 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
- 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
- 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
- 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
- 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
- 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
- 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
- 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
- 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
- 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
- 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
- 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
- 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
- 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
- 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
- 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
- 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
- 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
- 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
- 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
- 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
- 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
- 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
- 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
- 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
- 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
- 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
- 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
- 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
- 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
- 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
- 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
- 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
- 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
- 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
- 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
- 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
- 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
- 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
- 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
- -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
- 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
- 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
- -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
- 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
- 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
- -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
- 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
- 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
- -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
- 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
- -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
- 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
- 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
- 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
- -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
- 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
- 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
- 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
- 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
- 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
- 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
- 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
- -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
- 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
- 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
- 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
- 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
- -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
- -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
- 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
- -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
- 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
- -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
- -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
- -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
- -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
- -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
- 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
- -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
- -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
- 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
- -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
- 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
- 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
- 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
- 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
- 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
- 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
- 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
- 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
- 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
- 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
- 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
- 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
- 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
- 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
- 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
- -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
- 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
- -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
- 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
- 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
- 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
- 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
- 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
- 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
- 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
- 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
- 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
- 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
- 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
- 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
- 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
- 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
- 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
- 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
- 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
- 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
- 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
- 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
- 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
- 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
- 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
- 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
- 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
- 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
- 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
- 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
- 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
- -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
- 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
- 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
- -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
- 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
- -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
- -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
- -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
- 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
- -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
- -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
- -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
- -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
- -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
- -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
- 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
- -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
- -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
- 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
- -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
- 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
- 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
- -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
- 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
- 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
- -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
- -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
- 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
- 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
- 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
- -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
- -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
- 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
- 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
- -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
- -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
- 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
- -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
- 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
- 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
- -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
- -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
- 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
- -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
- 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
- -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
- 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
- -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
- -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
- -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
- -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
- -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
- -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
- 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
- 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
- -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
- 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
- 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
- -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
- -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
- -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
- 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
- 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
- -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
- 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
- -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
- -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
- -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
- -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
- -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
- -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
- 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
- -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
- -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
- -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
- -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
- -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
- -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
- -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
- -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
- 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
- -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
- -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
- -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
- -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
- -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
- -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
- 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
- -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
- -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
- -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
- 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
- -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
- -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
- -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
- -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
- -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
- -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
- -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
- -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
- 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
- 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
- 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
- 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
- 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
- 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
- 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
- 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
- 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
- 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
- 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
- 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
- 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
- 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
- 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
- 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
- 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
- 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
- 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
- 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
- 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
- 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
- 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
- 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
- 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
- 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
- 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
- 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
- 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
- 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
- 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
- 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
- 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
- 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
- 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
- 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
- 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
- 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
- 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
- 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
- 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
- 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
- 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
- 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
- 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
- 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
- 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
- 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
- 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
- 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
- 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
- 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
- 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
- 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
- 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
- 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
- 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
- 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
- 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
- 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
- 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
- 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
- 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
- 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
- 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
- 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
- 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
- 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
- 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
- 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
- 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
- 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
- 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
- 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
- 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
- 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
- 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
- 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
- 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
- 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
- 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
- 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
- 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
- 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
- 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
- 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
- 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
- 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
- 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
- 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
- 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
- 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
- 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
- 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
- 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
- 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
- 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
- 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
- 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
- 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
- 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
- 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
- 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
- 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
- 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
- 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
- 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
- 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
- 0.820584,-0.571526,0,2.931756,-1.129655,0,
- -0.334515,0.94239,0,2.970902,-0.959664,0,
- 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
- -0.334515,0.94239,0,2.970902,-0.959664,0,
- 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
- 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
- -0.255632,0.966774,0,2.896234,-1.31956,0,
- 0.820584,-0.571526,0,2.931756,-1.129655,0,
- 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
- 0.820584,-0.571526,0,2.931756,-1.129655,0,
- 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
- 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
- 0.826305,-0.563222,0,2.821376,-1.431534,0,
- -0.255632,0.966774,0,2.896234,-1.31956,0,
- 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
- -0.255632,0.966774,0,2.896234,-1.31956,0,
- 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
- 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
- -0.133012,0.991114,0,2.706963,-1.528854,0,
- 0.826305,-0.563222,0,2.821376,-1.431534,0,
- 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
- 0.826305,-0.563222,0,2.821376,-1.431534,0,
- 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
- 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
- 0.815341,-0.578981,0,2.534227,-1.617078,0,
- -0.133012,0.991114,0,2.706963,-1.528854,0,
- 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
- -0.133012,0.991114,0,2.706963,-1.528854,0,
- 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
- 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
- -0.144073,0.989567,0,2.348182,-1.624595,0,
- 0.815341,-0.578981,0,2.534227,-1.617078,0,
- 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
- 0.815341,-0.578981,0,2.534227,-1.617078,0,
- 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
- 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
- -0.073566,0.99729,0,2.167167,-1.596326,0,
- -0.144073,0.989567,0,2.348182,-1.624595,0,
- 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
- -0.144073,0.989567,0,2.348182,-1.624595,0,
- 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
- 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- -0.073566,0.99729,0,2.167167,-1.596326,0,
- 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
- -0.073566,0.99729,0,2.167167,-1.596326,0,
- 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
- 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
- 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
- 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
- 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
- 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
- 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
- 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
- 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
- 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
- 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
- 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
- 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
- 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
- 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
- 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
- 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
- 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
- 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
- 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
- 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
- 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
- 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
- -0.334515,0.94239,0,2.970902,-0.959664,0,
- 0.942695,-0.333657,0,3.065544,-0.788768,0,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- -0.334515,0.94239,0,2.970902,-0.959664,0,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
- -0.476715,0.879058,0,3.118124,-0.703925,0,
- 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- -0.476715,0.879058,0,3.118124,-0.703925,0,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- 0.942695,-0.333657,0,3.065544,-0.788768,0,
- 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
- 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
- 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
- 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
- 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
- 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
- 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
- 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
- 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
- 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
- -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
- -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
- -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
- -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
- -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
- -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
- -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
- -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
- -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
- 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
- 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
- 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
- -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
- -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
- 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
- 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
- -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
- -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
- 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
- -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
- -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
- 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
- -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
- -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
- 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
- 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
- -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
- 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
- -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
- -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
- 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
- -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
- 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
- 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
- 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
- -0.084764,-0.996401,0,-0.155114,-1.828285,0,
- 0.226963,-0.973903,0,0.44655,-1.67295,0,
- 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
- 0.226963,-0.973903,0,0.44655,-1.67295,0,
- -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
- 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
- 0.854132,-0.520056,0,-0.530369,-1.860806,0,
- -0.084764,-0.996401,0,-0.155114,-1.828285,0,
- 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
- -0.084764,-0.996401,0,-0.155114,-1.828285,0,
- 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- 0.113474,-0.993541,0,-0.956007,-1.825728,0,
- 0.854132,-0.520056,0,-0.530369,-1.860806,0,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- 0.854132,-0.520056,0,-0.530369,-1.860806,0,
- 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- 0.011286,0.999936,0,-1.395728,-1.723811,0,
- 0.113474,-0.993541,0,-0.956007,-1.825728,0,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- 0.113474,-0.993541,0,-0.956007,-1.825728,0,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
- 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
- -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
- 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
- -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
- -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
- -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
- -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
- -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
- -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
- 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
- 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
- -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
- -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
- 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
- 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
- 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
- -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
- 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
- -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
- -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
- 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
- -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
- -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
- -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
- -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
- -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
- 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
- -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
- 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
- -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
- 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
- -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
- -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
- -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
- -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
- -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
- -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
- -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
- -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
- 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
- -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
- 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
- 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
- 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
- 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
- -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
- -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
- -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
- -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
- -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
- -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
- 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
- -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
- 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
- -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
- -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
- 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
- -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
- 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
- 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
- -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
- 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
- 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
- -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
- 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
- -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
- 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
- -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
- 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
- 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
- -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
- 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
- -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
- 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
- -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
- 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
- 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
- -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
- -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
- 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
- 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
- -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
- 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
- -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
- -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
- -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
- 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
- -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
- 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
- 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
- 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
- -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
- 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
- -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
- 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
- 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
- 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
- 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
- -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
- -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
- -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
- 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
- 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
- -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
- -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
- 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
- -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
- 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
- -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
- -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
- -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
- -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
- -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
- 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
- -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
- -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
- -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
- 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
- -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
- 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
- -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
- -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
- -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
- -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
- -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
- -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
- -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
- -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
- -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
- -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
- -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
- 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
- -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
- -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
- -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
- 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
- -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
- 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
- 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
- -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
- 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
- -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
- -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
- -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
- 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
- -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
- 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
- -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
- 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
- -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
- 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
- -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
- 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
- -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
- 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
- -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
- -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
- -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
- -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
- -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
- 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
- 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
- -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
- 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
- -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
- 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
- -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
- 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
- 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
- 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
- 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
- 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
- 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
- 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
- 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
- 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
- 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
- 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
- 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
- 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
- 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
- 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
- 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
- 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
- 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
- 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
- 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
- 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
- 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
- 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
- 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
- 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
- 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
- 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
- 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
- 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
- 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
- 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
- -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
- 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
- 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
- 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
- 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
- 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
- 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
- -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
- 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
- -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
- 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
- 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
- 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
- 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
- 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
- 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
- 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
- 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
- -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
- -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
- 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
- -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
- -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
- 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
- -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
- -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
- 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
- -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
- 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
- -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
- -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
- -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
- 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
- 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
- -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
- 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
- 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
- -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
- 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
- -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
- 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
- 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
- -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
- 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
- -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
- 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
- -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
- 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
- -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
- -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
- 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
- -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
- 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
- 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
- -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
- -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
- 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
- -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
- -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
- -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
- -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
- -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
- -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
- -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
- -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
- -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
- -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
- -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
- -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
- -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
- -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
- -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
- -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
- 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
- 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
- -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
- 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
- -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
- 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
- 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
- -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
- -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
- 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
- -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
- 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
- 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
- -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
- -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
- 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
- -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
- 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
- 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
- -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
- -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
- 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
- -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
- 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
- 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
- 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
- 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
- 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
- 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
- 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
- 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
- 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
- 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
- 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
- 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
- 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
- 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
- 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
- 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
- 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
- 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
- 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
- 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
- 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
- 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
- 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
- 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
- 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
- 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
- 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
- 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
- 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
- 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
- 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
- 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
- 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
- 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
- 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
- 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
- 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
- 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
- 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
- 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
- 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
- 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
- -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
- 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
- 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
- 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
- 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
- -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
- 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
- -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
- -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
- 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
- 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
- -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
- 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
- -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
- 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
- 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
- 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
- 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
- -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
- -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
- -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
- -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
- -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
- -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
- -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
- -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
- -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
- -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
- -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
- -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
- -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
- -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
- -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
- -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
- -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
- -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
- -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
- -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
- -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
- -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
- -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
- -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
- -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
- -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
- -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
- -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
- -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
- -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
- -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
- -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
- -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
- -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
- -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
- 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
- -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
- -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
- 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
- -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
- -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
- -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
- 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
- -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
- -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
- -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
- -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
- -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
- -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
- -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
- -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
- 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
- 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
- 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
- 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
- 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
- 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
- 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
- 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
- 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
- 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
- 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
- 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
- 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
- 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
- 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
- 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
- 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
- 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
- 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
- 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
- -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
- -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
- 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
- -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
- 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
- -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
- -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
- 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
- -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
- -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
- 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
- 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
- -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
- 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
- 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
- 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
- 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
- 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
- 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
- -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
- 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
- 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
- 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
- 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
- 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
- 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
- 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
- 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
- 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
- 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
- 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
- -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
- 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
- -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
- -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
- -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
- 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
- -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
- -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
- -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
- -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
- -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
- 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
- -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
- 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
- -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
- -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
- 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
- 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
- -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
- 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
- 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
- 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
- -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
- -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
- 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
- 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
- -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
- 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
- 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
- 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
- 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
- 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
- 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
- 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
- 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
- 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
- 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
- -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
- 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
- -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
- -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
- -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
- -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
- 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
- -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
- 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
- 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
- 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
- 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
- -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
- 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
- -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
- 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
- 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
- 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
- -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
- 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
- -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
- -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
- -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
- -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
- -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
- -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
- -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
- -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
- -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
- -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
- -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
- -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
- -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
- 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
- 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
- -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
- -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
- 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
- -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
- 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
- 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
- -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
- -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
- 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
- -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
- 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
- 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
- -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
- -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
- 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
- -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
- -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
- -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
- -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
- 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
- -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
- 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
- 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
- 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
- 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
- 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
- -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
- 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
- -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
- -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
- -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
- -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
- 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
- -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
- -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
- 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
- -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
- 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
- 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
- -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
- -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
- -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
- 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
- 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
- -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
- -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
- 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
- -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
- -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
- -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
- 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
- -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
- -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
- -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
- -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
- -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
- -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
- -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
- -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
- -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
- -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
- -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
- -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
- -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
- -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
- -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
- -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
- 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
- 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
- -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
- 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
- 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
- -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
- 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
- -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
- 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
- -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
- -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
- 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
- -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
- 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
- -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
- -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
- -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
- -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
- -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
- -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
- 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
- -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
- -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
- 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
- -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
- 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
- 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
- -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
- 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
- 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
- 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
- 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
- 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
- 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
- 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
- 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
- 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
- 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
- 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
- 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
- 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
- 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
- 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
- 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
- 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
- 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
- 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
- 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
- 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
- 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
- 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
- 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
- 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
- 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
- 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
- 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
- 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
- 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
- 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
- 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
- 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
- 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
- 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
- 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
- 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
- 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
- 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
- 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
- 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
- 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
- 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
- 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
- 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
- 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
- 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
- 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
- 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
- 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
- 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
- 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
- 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
- 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
- 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
- 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
- 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
- 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
- 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
- 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
- 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
- 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
- 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
- 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
- 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
- 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
- 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
- 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
- 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
- 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
- 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
- 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
- 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
- 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
- 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
- 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
- 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
- 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
- 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
- -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
- 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
- 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
- -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
- 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
- -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
- 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
- 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
- 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
- -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
- 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
- -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
- 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
- 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
- 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
- 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
- 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
- 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
- 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
- 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
- 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
- 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
- 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
- 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
- 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
- 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
- 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
- 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
- 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
- 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
- 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
- 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
- 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
- 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
- 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
- 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
- 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
- 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
- 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
- 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
- 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
- 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
- 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
- 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
- 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
- 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
- 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
- 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
- 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
- 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
- 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
- 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
- -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
- -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
- -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
- 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
- -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
- 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
- -0.476715,0.879058,0,3.118124,-0.703925,0,
- 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
- 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
- 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
- -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
- 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
- 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
- -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
- 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
- -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
- -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
- 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
- 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
- -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
- 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
- -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
- -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
- 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
- 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
- -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
- 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
- -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
- -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
- 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
- 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
- -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
- 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
- -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
- -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
- 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
- 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
- -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
- 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
- -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
- -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
- -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
- -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
- -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
- -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
- -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
- -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
- -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
- -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
- -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
- 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
- -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
- 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
- -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
- -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
- 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
- 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
- -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
- 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
- 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
- -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
- 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
- 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
- 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
- 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
- -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
- 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
- -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
- -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
- 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
- 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
- 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
- -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
- 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
- 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
- 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
- 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
- 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
- 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
- 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
- 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
- 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
- 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
- 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
- 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
- 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
- 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
- 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
- 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
- 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
- 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
- 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
- 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
- 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
- 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
- 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
- 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
- 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
- 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
- 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
- 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
- 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
- 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
- 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
- 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
- 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
- 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
- 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
- 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
- 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
- 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
- -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
- 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
- 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
- -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
- 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
- -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
- -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
- 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
- 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
- -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
- 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
- -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
- -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
- 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
- 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
- -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
- 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
- -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
- -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
- 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
- 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
- -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
- 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
- -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
- -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
- 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
- -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
- 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
- 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
- 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
- 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
- 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
- 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
- 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
- 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
- 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
- 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
- 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
- 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
- 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
- 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
- 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
- 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
- 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
- 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
- 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
- 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
- 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
- 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
- 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
- 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
- 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
- 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
- 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
- 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
- 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
- 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
- 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
- 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
- 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
- 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
- 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
- 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
- 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
- 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
- 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
- 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
- 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
- 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
- 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
- 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
- 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
- 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
- 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
- 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
- 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
- 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
- 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
- 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
- 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
- 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
- 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
- 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
- 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
- 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
- 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
- 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
- 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
- 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
- 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
- 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
- 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
- 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
- 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
- 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
- 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
- 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
- -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
- -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
- 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
- -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
- 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
- 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
- -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
- -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
- 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
- -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
- 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
- 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
- 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
- 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
- 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
- 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
- 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
- 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
- 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
- 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
- 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
- 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
- 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
- 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
- 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
- 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
- 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
- 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
- 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
- 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
- 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
- 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
- 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
- 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
- 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
- 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
- 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
- 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
- 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
- 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
- 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
- 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
- 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
- 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
- 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
- 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
- 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
- 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
- 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
- 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
- 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
- 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
- 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
- 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
- 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
- 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
- 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
- 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
- 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
- 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
- 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
- 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
- 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
- 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
- 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
- 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
- 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
- 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
- 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
- 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
- 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
- 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
- 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
- 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
- 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
- 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
- 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
- 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
- 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
- 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
- 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
- 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
- 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
- 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
- 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
- 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
- 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
- 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
- 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
- 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
- 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
- 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
- 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
- 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
- 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
- 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
- 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
- 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
- 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
- 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
- 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
- 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
- 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
- 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
- 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
- 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
- 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
- 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
- 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
- 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
- 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
- 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
- -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
- -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
- 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
- -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
- 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
- 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
- -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
- 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
- 0.756976,-0.653442,0,2.128139,1.788397,0,
- -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
- 0.756976,-0.653442,0,2.128139,1.788397,0,
- 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
- -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
- -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
- 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
- -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
- 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
- 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
- -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
- -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
- 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
- -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
- 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
- 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
- -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
- -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
- 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
- -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
- 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
- -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
- -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
- 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
- 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
- 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
- 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
- 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
- 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
- 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
- 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
- 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
- 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
- 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
- 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
- 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
- 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
- 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
- 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
- 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
- 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
- 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
- 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
- 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
- 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
- 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
- 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
- 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
- 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
- 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
- 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
- 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
- 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
- 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
- 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
- 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
- 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
- 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
- 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
- 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
- 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
- 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
- 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
- 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
- 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
- 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
- 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
- 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
- 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
- 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
- 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
- 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
- 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
- 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
- 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
- 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
- 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
- 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
- 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
- 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
- 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
- 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
- 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
- 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
- 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
- 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
- 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
- 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
- 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
- -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
- -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
- -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
- 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
- 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
- -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
- 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
- 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
- -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
- 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
- -0.720176,-0.693792,0,1.794465,1.787719,0,
- -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
- 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
- -0.720176,-0.693792,0,1.794465,1.787719,0,
- 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
- -0.385788,0.922588,0,2.042206,1.777154,0,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
- 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
- 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
- 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
- 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
- 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
- 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
- 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
- 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
- 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
- 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
- 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
- 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
- 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
- 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
- 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
- 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
- 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
- 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
- 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
- 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
- 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
- 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
- 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
- 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
- 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
- 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
- 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
- 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
- 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
- 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
- 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
- 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
- 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
- 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
- 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
- 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
- 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
- -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
- 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
- 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
- -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
- 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
- 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
- -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
- -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
- 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
- -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
- 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
- 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.566114,-0.824327,0,0.234527,1.730117,0,
- 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
- 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
- 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
- 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
- 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
- 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
- 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
- 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
- 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
- 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
- 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
- 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
- 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
- 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
- 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
- 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
- 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
- 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
- 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
- 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
- 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
- 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
- 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
- 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
- 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
- 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
- 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
- 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
- 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
- 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
- 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
- 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
- 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
- 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
- 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
- -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
- 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
- -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
- 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
- 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
- -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
- -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
- 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
- -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
- 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
- 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
- -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
- -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
- 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
- -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
- 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
- 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
- -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
- -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
- 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
- -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
- 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
- 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
- -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
- -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
- 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
- -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
- 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
- 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
- -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
- -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
- 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
- -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
- 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
- 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
- -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
- -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
- 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
- -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
- 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
- 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
- -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
- -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
- 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
- -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
- 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
- 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
- -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
- -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
- 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
- -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
- -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
- -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
- -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
- -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
- -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
- -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
- -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
- -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
- -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
- -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
- -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
- -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
- -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
- -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
- -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
- 0.226963,-0.973903,0,0.44655,-1.67295,0,
- -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
- 0.226963,-0.973903,0,0.44655,-1.67295,0,
- 0.92802,-0.37253,0,0.927497,-1.558489,0,
- -0.039092,-0.999236,0,-0.228904,1.734267,0,
- -0.009814,-0.999952,0,-0.547248,1.742126,0,
- -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
- -0.039092,-0.999236,0,-0.228904,1.734267,0,
- -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
- 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
- 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
- -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
- -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
- 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
- -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
- 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
- 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
- -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
- -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
- 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
- -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
- 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
- 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
- -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
- -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
- 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
- -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
- 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
- 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
- -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
- 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
- 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
- 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
- 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
- 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
- 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
- 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
- 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
- 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
- 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
- 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
- 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
- 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
- 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
- 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
- -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
- -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
- 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
- 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
- -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
- 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
- -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
- -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
- 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
- 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
- -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
- 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
- -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
- -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
- 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
- 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
- -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
- 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
- -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
- -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
- 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
- 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
- -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
- 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
- -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
- -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
- 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
- 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
- -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
- 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
- -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
- -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
- 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
- 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
- -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
- 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
- -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
- -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
- 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
- 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
- -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
- 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
- -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
- -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
- 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
- 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
- -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
- 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
- -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
- -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
- 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
- -0.098179,0.995169,0,-0.866132,1.75467,0,
- -0.065586,-0.997847,0,-1.179474,1.786649,0,
- -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
- -0.098179,0.995169,0,-0.866132,1.75467,0,
- -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
- 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
- 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
- -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
- -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
- 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
- -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
- 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
- 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
- -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
- -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
- 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
- -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
- 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
- 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
- -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
- 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
- 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
- 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
- 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
- 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
- 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
- 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
- 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
- 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
- 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
- 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
- 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
- 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
- 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
- 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
- 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
- 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
- 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
- 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
- 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
- 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
- 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
- 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
- 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
- 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
- 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
- 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
- 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
- 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
- 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
- -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
- 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
- -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
- 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
- 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
- -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
- -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
- 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
- -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
- 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
- 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
- -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
- -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
- 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
- -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
- 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
- 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
- -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
- -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
- 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
- -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
- 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
- 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
- -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
- -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
- 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
- -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
- 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
- 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
- -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
- -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
- 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
- -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
- -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
- -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
- -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
- 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
- -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
- -0.720176,-0.693792,0,1.794465,1.787719,0,
- 0.779025,-0.626993,0,1.456656,1.785879,0,
- -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
- 0.779025,-0.626993,0,1.456656,1.785879,0,
- 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
- -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
- -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
- 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
- -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
- 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
- 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
- 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
- -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
- 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
- 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
- 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
- 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
- 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
- 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
- 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
- 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
- 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
- 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
- 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
- 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
- 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
- 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
- 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
- -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
- -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
- -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
- -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
- 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
- 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
- -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
- 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
- -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
- -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
- 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
- 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
- -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
- 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
- -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
- -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
- 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
- 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
- -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
- 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
- -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
- -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
- -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
- -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
- 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
- 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
- -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
- 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
- -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
- -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
- -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
- -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
- -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
- 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
- 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
- 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
- -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
- -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
- -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
- -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
- -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
- -0.034649,0.9994,0,1.920432,-1.567396,0,
- 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
- -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
- 0.770209,-0.637792,0,1.289448,-1.546597,0,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- 0.770209,-0.637792,0,1.289448,-1.546597,0,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
- 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
- -0.560667,-0.828041,0,1.604939,-1.556997,0,
- 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
- -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
- -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
- 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
- -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
- -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
- -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
- -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
- -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
- -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
- 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
- -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
- -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
- -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
- -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
- -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
- -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
- 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
- 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
- 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
- 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
- 0.779025,-0.626993,0,1.456656,1.785879,0,
- -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
- 0.92802,-0.37253,0,0.927497,-1.558489,0,
- 0.770209,-0.637792,0,1.289448,-1.546597,0,
- -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
- 0.770209,-0.637792,0,1.289448,-1.546597,0,
- -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
- -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
- -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
- -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
- -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
- -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
- -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
- -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
- -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
- -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
- -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
- -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
- -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
- 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
- -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
- -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
- 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
- -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
- -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
- 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
- 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
- -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
- 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
- -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
- -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
- 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
- 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
- -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
- 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
- -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
- -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
- 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
- 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
- -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
- 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
- -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
- 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
- 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
- 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
- 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
- -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
- 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
- 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
- -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
- 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
- -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
- -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
- 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
- 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
- -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
- 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
- -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
- -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
- 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
- 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
- -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
- 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
- -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
- -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
- 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
- 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
- -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
- 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
- -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
- -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
- 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
- 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
- -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
- 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
- -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
- -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
- 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
- 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
- -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
- 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
- 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
- -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
- 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
- -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
- -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
- -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
- 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
- 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
- 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
- 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
- 0.981421,-0.191868,0,0.733818,1.740873,0,
- 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
- 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
- 0.566114,-0.824327,0,0.234527,1.730117,0,
- -0.039092,-0.999236,0,-0.228904,1.734267,0,
- 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
- 0.566114,-0.824327,0,0.234527,1.730117,0,
- 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
- 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
- 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
- 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
- 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
- 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
- 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
- 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
- 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
- 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
- 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
- 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
- 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
- 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
- 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
- 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
- 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
- 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
- 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
- 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
- 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
- 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
- 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
- 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
- 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
- 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
- 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
- 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
- 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
- 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
- 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
- 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
- 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
- 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
- -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
- 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
- -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
- 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
- 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
- -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
- -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
- 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
- -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
- -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
- -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
- -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
- -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
- -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
- -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
- -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
- -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
- -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
- -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
- -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
- -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
- -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
- -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
- -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
- -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
- -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
- -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
- -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
- -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
- -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
- -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
- -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
- -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
- -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
- -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
- -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
- -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
- -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
- -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
- -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
- -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
- -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
- -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
- -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
- -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
- -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
- -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
- -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
- -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
- -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
- -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
- -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
- -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
- -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
- -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
- -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
- -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
- -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
- -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
- -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
- 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
- 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
- -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
- -0.009814,-0.999952,0,-0.547248,1.742126,0,
- -0.098179,0.995169,0,-0.866132,1.75467,0,
- 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
- -0.009814,-0.999952,0,-0.547248,1.742126,0,
- 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
- -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
- -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
- 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
- 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
- -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
- 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
- -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
- -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
- 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
- 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
- -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
- 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
- -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
- -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
- 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
- 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
- -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
- 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
- -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
- -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
- 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
- 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
- -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
- 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
- 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
- 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
- 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
- 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
- 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
- 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
- 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
- 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
- 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
- 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
- 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
- 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
- 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
- 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
- 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
- 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
- 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
- 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
- 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
- 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
- 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
- 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
- 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
- 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
- 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
- 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
- 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
- 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
- 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
- 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
- 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
- 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
- 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
- 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
- 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
- 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
- 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
- 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
- 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
- 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
- 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
- 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
- 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
- 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
- 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
- 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
- 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
- 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
- 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
- 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
- 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
- -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
- 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
- -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
- 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
- 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
- -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
- -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
- 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
- -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
- 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
- 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
- -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
- 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
- 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
- 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
- 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
- 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
- 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
- -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
- -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
- -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
- -0.065586,-0.997847,0,-1.179474,1.786649,0,
- 0.262234,-0.965004,0,-1.35095,1.807009,0,
- -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
- -0.065586,-0.997847,0,-1.179474,1.786649,0,
- -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
- -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
- -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
- -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
- -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
- -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
- -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
- -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
- -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
- -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
- -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
- -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
- -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
- -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
- -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
- -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
- -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
- -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
- -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
- 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
- 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
- -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
- 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
- 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
- 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
- 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
- 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
- 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
- -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
- 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
- -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
- 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
- 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
- -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
- -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
- 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
- -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
- 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
- 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
- -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
- -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
- 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
- -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
- 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
- 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
- -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
- -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
- 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
- -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
- -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
- -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
- -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
- -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
- -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
- -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
- -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
- -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
- -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
- -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
- -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
- -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
- -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
- -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
- -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
- -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
- -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
- -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
- -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
- -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
- -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
- -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
- -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
- -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
- -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
- -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
- -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
- -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
- -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
- -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
- -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
- -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
- -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
- -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
- -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
- -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- 0.262234,-0.965004,0,-1.35095,1.807009,0,
- 0.021487,0.999769,0,-1.67651,1.826886,0,
- -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
- 0.262234,-0.965004,0,-1.35095,1.807009,0,
- -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
- -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
- -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
- -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
- -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
- -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
- -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
- -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
- -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
- -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
- -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
- -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
- -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
- -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
- -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
- -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
- -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
- -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
- -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
- -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
- -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
- -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
- -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
- -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
- -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
- 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
- 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
- -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
- -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
- 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
- -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
- -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
- -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
- -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
- -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
- -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
- -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
- -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
- -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
- -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
- -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
- -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
- -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
- -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
- -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
- -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
- -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
- -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
- -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
- -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
- -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
- -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
- -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
- -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
- -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
- -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
- -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
- -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
- -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
- -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
- -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
- -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
- -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
- -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
- -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
- -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
- -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
- -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
- -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
- -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
- -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
- -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
- -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
- -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
- -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
- -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
- -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
- -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
- -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
- -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
- -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
- -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
- -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
- -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
- -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
- -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
- -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
- -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
- -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
- -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
- -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
- -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
- -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
- -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
- 0.021487,0.999769,0,-1.67651,1.826886,0,
- 0.181762,-0.983343,0,-2.057387,1.841308,0,
- -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
- 0.021487,0.999769,0,-1.67651,1.826886,0,
- -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
- -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
- -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
- -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
- -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
- -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
- -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
- -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
- -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
- -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
- -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
- -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
- -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
- -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
- -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
- -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
- -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
- -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
- -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
- -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
- -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
- -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
- -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
- -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
- -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
- -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
- -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
- -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
- -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
- -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
- -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
- -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
- -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
- -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
- -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
- -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
- -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
- -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
- -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
- -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
- -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
- -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
- -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
- -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
- -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
- -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
- -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
- -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
- -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
- -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
- -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
- -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
- -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
- -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
- -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
- -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
- -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
- -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
- -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
- -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
- -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
- -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
- -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
- -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
- -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
- -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
- -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
- -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
- -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
- -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
- -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
- -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
- -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
- -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
- -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
- -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
- -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
- -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
- -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
- -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
- -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
- -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
- 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
- -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
- 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
- -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
- -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
- 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
- 0.181762,-0.983343,0,-2.057387,1.841308,0,
- 0.03611,0.999348,0,-2.629466,1.918204,0,
- -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
- 0.181762,-0.983343,0,-2.057387,1.841308,0,
- -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
- -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
- -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
- -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
- -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
- -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
- -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
- -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
- -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
- -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
- -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
- -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
- -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
- -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
- -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
- -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
- -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
- -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
- -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
- -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
- -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
- -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
- -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
- -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
- -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
- -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
- -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
- -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
- -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
- -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
- -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
- -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
- -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
- -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
- -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
- -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
- -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
- -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
- -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
- -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
- -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
- -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
- -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
- -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
- -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
- -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
- -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
- -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
- -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
- -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
- -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
- -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
- -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
- -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
- -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
- -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
- -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
- -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
- -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
- -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
- -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
- -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
- -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
- -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
- 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
- -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
- 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
- -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
- -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
- 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
- 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
- -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
- 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
- -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
- -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
- 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
- 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
- -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
- 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
- -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
- -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
- 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
- 0.03611,0.999348,0,-2.629466,1.918204,0,
- 0.012502,-0.999922,0,-3.037562,2.001526,0,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- 0.03611,0.999348,0,-2.629466,1.918204,0,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
- -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
- -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
- -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
- 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
- -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
- -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
- 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
- -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
- -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
- -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
- -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
- -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
- -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
- 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
- -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
- 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
- -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
- -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
- 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
- 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
- -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
- 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
- -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
- -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
- 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
- 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
- -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
- 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
- -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
- -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
- 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
- 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
- -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
- 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
- -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
- -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
- 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
- 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
- -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
- 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
- -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
- -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
- 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
- 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
- -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
- 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
- -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
- -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
- 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
- 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
- -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
- 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
- -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
- -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
- 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
- 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
- -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
- 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
- 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
- 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
- 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
- -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
- 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
- -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
- 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
- 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
- -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
- 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
- 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
- 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
- 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
- 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
- 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
- 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
- -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
- -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
- -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
- -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
- 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
- -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
- 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
- -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
- -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
- 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
- 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
- -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
- 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
- -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
- -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
- 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
- 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
- -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
- 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
- -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
- -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
- 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
- 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
- -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
- 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
- -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
- -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
- 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
- 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
- -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
- 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
- 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
- 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
- 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
- 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
- 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
- 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
- -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
- -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
- 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
- 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
- -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
- 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
- -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
- -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
- 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
- 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
- -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
- 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
- -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
- -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
- 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
- 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
- -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
- 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
- -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
- -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
- 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
- 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
- -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
- 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
- -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
- -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
- 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
- -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
- -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
- -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
- -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
- -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
- -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
- 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
- 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
- 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
- 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
- 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
- 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
- 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
- -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
- -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
- 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
- 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
- -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
- 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
- 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
- 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
- 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
- -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
- 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
- -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
- 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
- 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
- -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
- -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
- 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
- -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
- 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
- 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
- -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
- 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
- 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
- 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
- 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
- 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
- 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
- -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
- 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
- -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
- 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
- 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
- -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
- -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
- 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
- -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
- 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
- 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
- -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
- -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
- 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
- -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
- 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
- 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
- -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
- -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
- 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
- -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
- 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
- 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
- -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
- 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
- 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
- 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
- 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
- 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
- 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
- -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
- 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
- -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
- 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
- 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
- -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
- -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
- -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
- 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
- -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
- -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
- -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
- -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
- 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
- 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
- -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
- -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
- 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
- -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
- 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
- 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
- -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
- -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
- 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
- -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
- 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
- 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
- -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
- -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
- 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
- -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
- -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
- -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
- -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
- -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
- -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
- -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
- 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
- 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
- -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
- -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
- 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
- -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
- -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
- -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
- -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
- -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
- -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
- -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
- -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
- -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
- -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
- -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
- -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
- -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
- -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
- -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
- -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
- -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
- -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
- -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
- -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
- -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
- -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
- -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
- -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
- -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
- -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
- 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
- -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
- 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
- -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
- -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
- -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
- -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
- -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
- -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
- 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
- -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
- -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
- 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
- -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
- 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
- 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
- -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
- -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
- 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
- -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
- 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
- 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
- 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
- -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
- 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
- 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
- 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
- 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
- -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
- 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
- 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
- -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
- 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
- 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
- -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
- -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
- 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
- -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
- 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
- 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
- -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
- -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
- 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
- -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
- 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
- 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
- -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
- -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
- 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
- -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
- 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
- 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
- -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
- -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
- 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
- -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
- 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
- -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
- -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
- 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
- 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
- -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
- 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
- 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
- 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
- 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
- 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
- -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
- 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
- 0.756976,-0.653442,0,2.128139,1.788397,0,
- -0.385788,0.922588,0,2.042206,1.777154,0,
- 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
- -0.385788,0.922588,0,2.042206,1.777154,0,
- 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
- -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
- -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
- -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
- 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
- -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
- 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
- -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
- -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
- -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
- -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
- 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
- -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
- 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
- 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
- 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
- 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
- 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
- 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
- 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
- -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
- 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
- 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
- -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
- 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
- -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
- 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
- -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
- -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
- 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
- -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
- 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
- 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
- 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
- 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
- -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
- 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
- -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
- -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
- -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
- -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
- 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
- -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
- 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
- -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
- 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
- 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
- -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
- -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
- 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
- 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
- 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
- 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
- -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
- -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
- -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
- -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
- -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
- 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
- -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
- -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
- -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
- 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
- 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
- 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
- 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
- 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
- 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
- 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
- -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
- 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
- -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
- -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
- -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
- -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
- 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
- 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
- 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
- -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
- 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
- -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
- -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
- 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
- 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
- -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
- 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
- -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
- 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
- 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
- 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
- -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
- -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
- 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
- -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
- 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
- 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
- -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
- -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
- 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
- -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
- 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
- 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
- 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
- -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
- 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
- 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
- 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
- -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
- 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
- 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
- -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
- 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
- -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
- -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
- -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
- 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
- -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
- 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
- -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
- -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
- -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
- -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
- -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
- -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
- -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
- -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
- -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
- -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
- -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
- -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
- -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
- -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
- -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
- -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
- -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
- -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
- -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
- -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
- -0.989171,0.146765,0,-3.599077,0.796217,0,
- -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.989171,0.146765,0,-3.599077,0.796217,0,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.996668,0.081567,0,-3.623861,0.911561,0,
- -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
- -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
- -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
- -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
- -0.844095,-0.536194,0,-3.601668,1.293049,0,
- -0.946116,-0.323827,0,-3.608593,1.163581,0,
- -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
- -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
- -0.946116,-0.323827,0,-3.608593,1.163581,0,
- -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
- -0.946116,-0.323827,0,-3.608593,1.163581,0,
- -0.997181,-0.075036,0,-3.622326,1.005378,0,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
- -0.997181,-0.075036,0,-3.622326,1.005378,0,
- -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
- -0.997181,-0.075036,0,-3.622326,1.005378,0,
- -0.996668,0.081567,0,-3.623861,0.911561,0,
- 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
- 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
- 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
- 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
- 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
- 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
- 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
- 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
- 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
- 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
- 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
- -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
- -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
- 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
- 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
- -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
- 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
- -0.999862,-0.016634,0,-3.900566,1.002504,0,
- -0.999862,-0.016634,0,-3.900566,1.002504,0,
- 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
- 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
- -0.999862,-0.016634,0,-3.900566,1.002504,0,
- 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
- -0.964752,0.26316,0,-3.87514,1.480358,0,
- -0.964752,0.26316,0,-3.87514,1.480358,0,
- 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
- 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
- -0.964752,0.26316,0,-3.87514,1.480358,0,
- 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
- -0.766357,0.642415,0,-3.712832,1.794492,0,
- -0.766357,0.642415,0,-3.712832,1.794492,0,
- 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
- 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
- -0.766357,0.642415,0,-3.712832,1.794492,0,
- 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
- -0.410619,0.911807,0,-3.47843,1.975409,0,
- -0.410619,0.911807,0,-3.47843,1.975409,0,
- 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
- 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
- -0.410619,0.911807,0,-3.47843,1.975409,0,
- 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
- -0.433128,-0.901332,0,-3.242148,2.021387,0,
- 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
- 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
- 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
- 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
- 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
- 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
- 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
- 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
- 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
- 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
- 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
- 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
- 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
- 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
- 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
- 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
- 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
- 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
- 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
- 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
- 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
- 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
- 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
- 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
- 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
- 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
- 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
- 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
- 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
- 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
- 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
- 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
- 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
- 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
- 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
- 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
- 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
- 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
- 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
- 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
- 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
- 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
- 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
- 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
- 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
- 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
- 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
- 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
- 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
- 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
- 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
- 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
- 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
- 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
- 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
- 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
- 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
- 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
- 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
- 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
- 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
- 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
- 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
- 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
- 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
- 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
- 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
- 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
- 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
- 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
- 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
- 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
- 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
- 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
- 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
- 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
- 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
- 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
- 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
- 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
- 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
- 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
- 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
- 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
- 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
- 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
- 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
- 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
- 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
- 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
- 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
- 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
- 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
- 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
- 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
- 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
- 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
- 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
- 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
- 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
- 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
- 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
- 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
- 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
- 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
- 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
- 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
- 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
- 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
- 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
- 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
- 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
- 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
- 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
- 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
- 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
- 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
- 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
- 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
- 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
- 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
- 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
- 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
- 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
- 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
- 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
- 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
- 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
- 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
- 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
- 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
- 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
- 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
- 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
- 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
- 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
- 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
- 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
- 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
- -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
- -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
- 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
- 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
- -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
- 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
- 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
- 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
- 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
- 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
- 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
- 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
- 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
- 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
- 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
- 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
- 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
- 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
- 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
- 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
- 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
- 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
- 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
- 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
- -0.153783,-0.988105,0,-3.507689,1.700214,0,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
- 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
- -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
- 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
- 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
- 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
- -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
- -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
- 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
- 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
- -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
- 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
- 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
- -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
- 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
- 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
- -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
- 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
- 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
- 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
- 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
- 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
- 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
- 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
- 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
- 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
- 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
- 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
- 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
- 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
- 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
- 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
- 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
- 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
- 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
- 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
- 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
- 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
- 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
- -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
- 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
- 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
- -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
- -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
- 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
- -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
- 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
- -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
- -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
- -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
- -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
- -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
- -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
- -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
- -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
- 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
- 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
- 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
- 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
- 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
- -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
- -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
- 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
- -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
- -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
- -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
- -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- 0.012502,-0.999922,0,-3.037562,2.001526,0,
- -0.433128,-0.901332,0,-3.242148,2.021387,0,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- -0.433128,-0.901332,0,-3.242148,2.021387,0,
- 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
- 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
- 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
- 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
- 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
- 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
- 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
- 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
- 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
- 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
- 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
- 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
- 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
- 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
- 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
- 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
- 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
- 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
- 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
- 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
- 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
- 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
- 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
- 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
- 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
- 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
- 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
- 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
- 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
- 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
- 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
- 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
- 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
- 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
- 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
- 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
- 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
- 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
- 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
- -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
- 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
- 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
- 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
- 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
- -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
- 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
- -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
- 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
- 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
- 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
- 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
- -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
- 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
- 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
- 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
- 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
- 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
- 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
- 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
- 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
- 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
- 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
- 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
- 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
- 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
- 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
- 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
- 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
- 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
- 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
- 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
- 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
- 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
- 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
- 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
- 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
- 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
- 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
- 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
- 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
- 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
- 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
- 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
- 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
- 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
- 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
- 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
- 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
- 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
- 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
- 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
- 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
- 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
- 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
- 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
- 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
- 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
- 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
- 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
- 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
- -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
- 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
- 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
- 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
- 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
- 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
- -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
- 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
- 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
- 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
- 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
- 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
- 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
- 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
- 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
- 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
- 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
- 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
- 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
- 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
- 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
- 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
- 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
- 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
- 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
- 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
- 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
- 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
- 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
- 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
- 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
- -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
- 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
- -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
- 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
- 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
- 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
- -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
- 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
- -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
- -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
- 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
- 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
- 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
- -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
- 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
- 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
- -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
- 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
- -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
- 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
- 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
- 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
- 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
- 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
- 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
- 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
- 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
- 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
- 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
- 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
- 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
- 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
- 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
- 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
- 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
- -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
- -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
- 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
- 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
- -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
- 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
- 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
- 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
- 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
- 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
- -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
- 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
- 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
- -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
- 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
- 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
- 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
- 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
- -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
- 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
- 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
- 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
- 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
- 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
- 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
- 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
- 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
- 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
- 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
- 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
- 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
- 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
- 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
- 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
- -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
- -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
- 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
- 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
- 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
- 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
- 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
- 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
- -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
- -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
- 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
- -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
- 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
- -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
- 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
- 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
- -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
- 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
- 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
- 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
- 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
- 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
- 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
- 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
- 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
- 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
- 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
- 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
- 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
- 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
- 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
- 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
- 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
- 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
- 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
- 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
- -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
- -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
- 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
- -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
- 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
- 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
- -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
- 0.027992,0.999608,0,5.588763,1.573846,0.000686,
- 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
- 0.027992,0.999608,0,5.588763,1.573846,0.000686,
- -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
- 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
- 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
- -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
- -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
- -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
- -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
- -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
- -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
- 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
- -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
- -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
- -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
- -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
- -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
- -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
- -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
- -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
- -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
- -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
- -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
- -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
- -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
- -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
- -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
- -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
- -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
- -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
- 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
- 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
- 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
- 0.027992,0.999608,0,5.588763,1.573846,0.000686,
- -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- 0.027992,0.999608,0,5.588763,1.573846,0.000686,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
- -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
- -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
- -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
- -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
- -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
- 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
- -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
- -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
- -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
- -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
- -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
- 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
- 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
- -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
- 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
- -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
- -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
- -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
- 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
- -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
- -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
- -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
- -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
- -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
- -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
- -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
- -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
- 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
- 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
- -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
- 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
- -0.016213,0.999869,0,5.908842,1.388968,0.001026,
- -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
- 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
- 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
- -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
- 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
- -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
- -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
- -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
- 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
- -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
- 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
- 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
- -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
- -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
- -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
- -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
- -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
- -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
- -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
- -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
- -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
- 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
- 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
- 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
- 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
- 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
- -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
- 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
- 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
- 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
- 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
- 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
- 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
- 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
- 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
- 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
- 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
- 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
- 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
- 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
- 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
- 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
- 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
- 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
- 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
- -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
- 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
- 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
- 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
- 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
- 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
- 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
- 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
- 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
- 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
- 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
- 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
- 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
- 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
- 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
- -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
- 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
- -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
- -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
- 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
- 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
- -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
- 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
- -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
- 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
- -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
- 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
- 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
- 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
- -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
- -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
- 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
- -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
- -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
- -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
- -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
- -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
- -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
- -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
- 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
- -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
- -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
- 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
- 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
- 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
- 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
- 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
- -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
- 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
- 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
- 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
- -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
- 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
- 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
- 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
- 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
- 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
- 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
- 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
- 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
- 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
- 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
- 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
- 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
- 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
- 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
- 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
- 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
- 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
- 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
- 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
- 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
- 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
- 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
- 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
- -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
- 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
- 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
- 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
- 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
- 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
- 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
- -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
- 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
- -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
- 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
- -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
- 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
- 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
- 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
- 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
- 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
- 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
- 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
- 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
- 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
- -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
- 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
- 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
- -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
- 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
- -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
- -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
- 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
- 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
- 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
- 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
- -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
- -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
- -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
- -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
- 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
- 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
- -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
- -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
- 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
- -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
- 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
- -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
- -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
- -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
- -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
- 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
- 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
- -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
- 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
- -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
- -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
- -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
- 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
- -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
- -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
- -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
- 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
- -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
- -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
- -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
- -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
- -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
- 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
- -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
- -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
- -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
- -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
- -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
- -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
- -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
- -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
- -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
- -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
- 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
- -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
- 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
- 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
- -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
- -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
- -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
- -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
- -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
- -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
- -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
- -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
- -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
- 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
- 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
- -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
- 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
- -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
- -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
- 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
- -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
- -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
- -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
- -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
- -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
- -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
- -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
- -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
- -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
- -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
- -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
- -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
- -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
- -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
- -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
- -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
- -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
- -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
- -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
- 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
- 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
- -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
- 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
- -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
- -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
- 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
- -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
- -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
- -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
- -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
- -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
- -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
- -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
- 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
- -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
- -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
- -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
- -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
- -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
- -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
- 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
- -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
- -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
- 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
- -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
- 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
- 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
- -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
- -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
- 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
- -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
- 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
- -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
- 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
- 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
- -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
- 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
- -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
- -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
- -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
- 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
- -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
- -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
- -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
- -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
- 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
- -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
- -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
- 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
- -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
- -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
- -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
- 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
- -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
- 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
- -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
- -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
- -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
- -0.016213,0.999869,0,5.908842,1.388968,0.001026,
- -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
- -0.016213,0.999869,0,5.908842,1.388968,0.001026,
- 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
- -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
- 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
- -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
- -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
- -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
- -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
- -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
- -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
- -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
- -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
- -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
- -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
- -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
- -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
- -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
- -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
- -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
- -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
- -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
- -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
- 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
- -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
- 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
- -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
- -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
- -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
- -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
- -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
- -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
- -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
- -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
- -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
- -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
- -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
- -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
- -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
- -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
- -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
- -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
- -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
- -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
- -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
- -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
- -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
- -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
- -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
- -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
- -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
- 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
- -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
- 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
- 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
- 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
- -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
- -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
- -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
- -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
- -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
- -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
- -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
- -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
- 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
- -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
- 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
- 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
- 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
- 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
- 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
- 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
- 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
- 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
- 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
- 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
- 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
- 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
- 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
- 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
- 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
- -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
- -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
- 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
- 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
- -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
- 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
- -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
- -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
- 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
- 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
- -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
- 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
- -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
- -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
- 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
- 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
- -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
- 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
- -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
- 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
- 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
- -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
- -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
- 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
- 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
- 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
- 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
- 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
- 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
- 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
- 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
- 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
- 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
- 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
- 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
- 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
- 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
- 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
- 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
- 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
- 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
- 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
- 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
- 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
- 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
- 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
- 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
- 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
- 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
- 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
- -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
- 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
- -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
- -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
- -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
- -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
- 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
- -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
- -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
- -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
- -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
- -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
- -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
- -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
- -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
- -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
- -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
- -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
- 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
- -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
- -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
- -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
- 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
- -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
- -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
- -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
- -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
- -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
- -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
- -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
- -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
- -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
- -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
- -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
- -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
- -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
- -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
- -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
- -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
- 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
- -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
- -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
- -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
- 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
- -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
- -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
- 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
- -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
- -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
- 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
- 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
- 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
- -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
- 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
- -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
- -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
- -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
- -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
- -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
- 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
- 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
- -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
- -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
- 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
- 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
- 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
- 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
- -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
- 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
- -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
- -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
- -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
- -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
- 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
- -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
- -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
- 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
- -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
- -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
- 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
- -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
- -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
- -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
- -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
- -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
- -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
- -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
- -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
- -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
- 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
- -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
- -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
- 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
- -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
- 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
- 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
- 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
- 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
- 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
- -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
- 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
- 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
- -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
- 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
- -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
- -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
- 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
- -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
- 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
- -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
- -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
- 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
- -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
- 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
- -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
- -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
- -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
- -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
- 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
- -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
- -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
- -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
- -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
- 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
- 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
- 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
- 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
- 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
- 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
- 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
- -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
- 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
- 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
- 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
- -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
- 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
- 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
- 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
- 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
- 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
- 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
- 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
- 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
- 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
- -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
- -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
- 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
- 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
- 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
- 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
- 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
- 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
- -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
- 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
- -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
- -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
- 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
- -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
- -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
- -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
- -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
- 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
- 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
- -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
- 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
- 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
- -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
- 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
- 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
- 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
- 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
- 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
- -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
- 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
- -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
- -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
- 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
- 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
- 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
- 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
- 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
- -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
- 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
- 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
- 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
- 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
- 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
- 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
- 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
- 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
- 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
- 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
- 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
- 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
- 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
- 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
- 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
- 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
- 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
- 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
- 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
- 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
- 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
- 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
- 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
- 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
- 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
- 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
- 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
- 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
- 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
- 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
- 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
- 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
- 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
- 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
- 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
- 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
- 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
- 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
- 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
- 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
- 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
- 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
- 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
- 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
- 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
- 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
- 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
- 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
- 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
- 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
- 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
- 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
- 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
- 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
- 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
- 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
- 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
- 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
- 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
- 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
- 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
- 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
- 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
- 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
- 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
- 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
- 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
- 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
- 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
- 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
- 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
- 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
- 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
- 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
- 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
- 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
- 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
- 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
- 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
- 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
- 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
- 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
- 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
- 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
- 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
- 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
- -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
- 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
- -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
- 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
- -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
- -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
- 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
- -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
- -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
- 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
- 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
- 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
- -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
- 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
- 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
- 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
- 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
- -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
- -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
- 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
- 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
- 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
- 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
- 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
- -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
- 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
- -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
- -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
- -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
- -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
- -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
- -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
- -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
- -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
- 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
- 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
- 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
- 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
- -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
- 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
- -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
- -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
- 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
- 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
- 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
- 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
- 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
- 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
- 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
- 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
- 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
- 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
- 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
- -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
- 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
- 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
- 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
- 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
- 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
- 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
- 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
- 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
- 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
- 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
- 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
- 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
- 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
- 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
- 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
- -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
- 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
- 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
- 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
- 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
- -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
- 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
- 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
- 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
- -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
- 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
- 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
- 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
- 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
- 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
- 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
- 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
- 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
- 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
- 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
- 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
- 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
- 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
- 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
- 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
- -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
- -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
- 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
- -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
- -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
- -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
- -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
- -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
- -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
- 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
- -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
- 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
- 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
- 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
- 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
- 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
- -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
- 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
- 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
- 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
- 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
- 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
- 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
- -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
- 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
- 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
- -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
- 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
- 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
- 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
- -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
- -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
- -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
- 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
- -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
- 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
- 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
- -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
- 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
- -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
- -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
- -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
- -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
- 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
- -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
- -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
- 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
- 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
- -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
- 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
- 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
- -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
- -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
- -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
- -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
- -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
- 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
- -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
- -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
- -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
- -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
- -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
- 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
- -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
- -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
- -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
- 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
- -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
- 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
- 0.072535,0.997366,0,-3.392806,1.769365,0,
- 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
- 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
- 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
- -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
- 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
- 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
- -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
- 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
- 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
- -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
- 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
- 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
- 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
- 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
- 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,13050,data,NULL};
-const struct gllist *cow_hide=&frame;
diff --git a/hacks/glx/cow_hoofs.c b/hacks/glx/cow_hoofs.c
deleted file mode 100644
index b66ef88..0000000
--- a/hacks/glx/cow_hoofs.c
+++ /dev/null
@@ -1,1037 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
- -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
- -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
- 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
- -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
- 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
- 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
- -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
- -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
- 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
- -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
- 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
- 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
- -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
- 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
- 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
- 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
- -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
- -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
- 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
- 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
- -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
- 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
- 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
- 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
- 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
- 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
- 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
- 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
- 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
- -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
- -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
- -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
- -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
- -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
- -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
- -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
- -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
- -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
- -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
- -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
- 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
- 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
- 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
- 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
- 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
- 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
- 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
- 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
- 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
- -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
- -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
- 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
- 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
- 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
- -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
- 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
- -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
- 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
- -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
- -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
- 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
- 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
- -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
- 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
- -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
- -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
- 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
- -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
- -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
- -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
- -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
- -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
- -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
- -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
- -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
- -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
- -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
- -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
- -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
- -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
- -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
- -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
- -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
- -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
- -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
- -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
- 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
- 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
- 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
- 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
- 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
- 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
- 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
- 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
- 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
- -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
- 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
- -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
- -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
- -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
- -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
- -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
- -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
- 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
- -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
- 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
- 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
- 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
- -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
- 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
- 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
- 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
- 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
- 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
- -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
- -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
- 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
- -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
- -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
- 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
- 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
- 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
- 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
- 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
- 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
- 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
- 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
- -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
- 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
- -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
- 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
- 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
- -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
- 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
- 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
- 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
- -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
- 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
- -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
- 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
- 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
- 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
- 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
- -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
- 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
- -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
- -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
- -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
- -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
- 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
- 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
- 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
- -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
- -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
- -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
- 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
- -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
- -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
- 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
- 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
- -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
- 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
- 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
- -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
- 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
- -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
- 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
- -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
- -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
- -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
- -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
- -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
- 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
- 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
- -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
- 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
- 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
- -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
- 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
- -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
- -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
- -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
- -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
- -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
- -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
- 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
- -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
- 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
- -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
- -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
- 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
- -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
- -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
- -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
- 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
- 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
- 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
- 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
- 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
- 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
- -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
- -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
- 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
- -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
- -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
- 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
- -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
- -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
- 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
- -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
- -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
- -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
- -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
- -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
- -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
- 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
- -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
- 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
- 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
- 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
- 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
- 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
- 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
- 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
- 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
- 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
- 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
- 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
- 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
- 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
- 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
- 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
- -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
- 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
- -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
- 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
- -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
- -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
- 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
- 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
- -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
- 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
- -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
- -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
- 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
- -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
- -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
- -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
- -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
- -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
- -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
- -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
- -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
- -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
- -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
- -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
- -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
- -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
- -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
- -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
- -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
- -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
- -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
- 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
- -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
- -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
- 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
- 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
- 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
- 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
- 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
- -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
- 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
- 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
- -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
- 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
- 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
- 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
- -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
- 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
- -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
- 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
- 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
- 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
- -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
- 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
- -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
- 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
- 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
- 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
- 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
- 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
- -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
- -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
- 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
- -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
- 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
- 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
- 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
- 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
- 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
- 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
- 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
- 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
- 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
- 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
- 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
- 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
- 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
- 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
- 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
- -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
- 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
- -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
- 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
- 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
- -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
- 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
- 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
- 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
- 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
- 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
- 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
- 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
- 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
- -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
- -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
- 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
- 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
- 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
- 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
- -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
- -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
- 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
- -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
- 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
- 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
- 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
- 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
- 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
- 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
- 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
- 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
- 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
- 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
- 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
- -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
- 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
- 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
- -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
- -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
- 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
- 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
- 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
- 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
- -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
- -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
- 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
- -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
- 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
- -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
- -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
- -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
- -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
- -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
- -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
- -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
- -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
- -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
- -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
- -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
- -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
- -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
- -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
- 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
- -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
- -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
- -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
- -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
- -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
- 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
- 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
- -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
- 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
- -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
- -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
- 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
- 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
- -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
- 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
- -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
- 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
- -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
- -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
- 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
- -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
- 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
- -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
- 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
- -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
- 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
- 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
- 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
- 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
- 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
- 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
- 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
- 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
- -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
- 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
- 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
- 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
- -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
- -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
- 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
- -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
- -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
- -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
- -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
- -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
- -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
- 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
- -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
- 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
- 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
- -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
- 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
- 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
- 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
- -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
- -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
- 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
- -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
- -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
- 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
- -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
- 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
- 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
- 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
- -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
- 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
- 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
- -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
- 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
- -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
- 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
- -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
- 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
- -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
- -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
- -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
- -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
- 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
- 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
- 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
- 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
- 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
- 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
- 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
- -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
- 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
- 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
- -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
- 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
- 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
- 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
- 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
- -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
- 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
- -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
- 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
- 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
- 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
- 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
- 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
- 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
- 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
- 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
- -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
- 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
- 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
- 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
- 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
- -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
- 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
- -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
- 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
- -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
- 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
- -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
- 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
- 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
- -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
- -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
- -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
- -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
- 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
- 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
- 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
- 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
- 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
- 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
- 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
- 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
- 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
- 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
- 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
- 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
- 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
- -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
- -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
- 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
- -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
- -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
- 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
- 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
- -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
- -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
- -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
- 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
- -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
- 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
- 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
- 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
- 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
- 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
- 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
- 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
- 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
- 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
- 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
- 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
- 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
- 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
- -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
- -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
- 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
- -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
- 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
- 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
- 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
- -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
- -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
- 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
- -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
- -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
- 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
- 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
- -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
- 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
- -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
- 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
- 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
- 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
- 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
- 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
- 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
- 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
- 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
- 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
- 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
- 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
- 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
- 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
- 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
- -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
- 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
- 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
- -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
- -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
- 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
- -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
- -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
- 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
- -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
- -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
- -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
- 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
- -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
- -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
- -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
- -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
- 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
- -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
- 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
- -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
- -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
- -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
- -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
- -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
- -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
- -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
- -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
- -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
- -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
- -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
- -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
- -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
- -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
- -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
- -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
- -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
- -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
- -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
- -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
- -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
- -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
- 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
- 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
- -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
- 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
- -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
- -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
- 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
- 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
- -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
- 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
- -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
- 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
- -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
- 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
- -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
- 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
- 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
- -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
- 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
- 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
- -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
- 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
- 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
- -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
- 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
- -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
- -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
- -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
- 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
- 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
- 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
- -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
- -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
- -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
- -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
- -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
- -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
- -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
- 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
- -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
- -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
- -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
- -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
- 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
- -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
- -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
- -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
- 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
- -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
- -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
- -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
- -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
- -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
- -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
- -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
- -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
- -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
- -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
- 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
- -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
- -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
- 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
- -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
- -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
- 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
- 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
- -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
- 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
- -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
- -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
- -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
- 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
- -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
- -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
- -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
- 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
- -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
- -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
- -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
- 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
- -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
- 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1032,data,NULL};
-const struct gllist *cow_hoofs=&frame;
diff --git a/hacks/glx/cow_horns.c b/hacks/glx/cow_horns.c
deleted file mode 100644
index 2d5dbe9..0000000
--- a/hacks/glx/cow_horns.c
+++ /dev/null
@@ -1,1025 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
- -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
- -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
- -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
- -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
- -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
- -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
- -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
- -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
- -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
- -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
- -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
- 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
- -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
- -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
- 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
- -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
- 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
- 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
- -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
- -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
- 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
- -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
- 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
- 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
- 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
- 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
- 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
- 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
- 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
- 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
- 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
- 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
- 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
- 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
- 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
- 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
- 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
- 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
- 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
- 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
- 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
- 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
- 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
- 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
- -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
- -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
- 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
- -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
- 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
- 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
- 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
- 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
- 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
- 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
- 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
- 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
- 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
- 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
- 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
- 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
- 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
- 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
- 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
- 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
- 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
- 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
- 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
- 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
- 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
- -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
- 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
- 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
- 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
- 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
- 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
- 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
- -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
- 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
- -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
- -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
- -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
- -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
- -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
- 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
- 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
- -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
- 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
- -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
- -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
- -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
- 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
- -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
- -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
- -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
- -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
- -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
- -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
- -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
- -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
- -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
- -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
- -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
- -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
- -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
- -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
- -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
- -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
- -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
- -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
- -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
- -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
- -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
- -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
- -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
- 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
- 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
- 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
- -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
- 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
- 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
- -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
- -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
- -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
- -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
- -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
- 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
- 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
- -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
- 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
- -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
- -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
- -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
- -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
- -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
- -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
- -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
- -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
- 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
- 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
- -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
- 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
- -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
- -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
- -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
- -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
- -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
- -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
- -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
- 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
- -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
- -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
- -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
- -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
- -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
- -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
- 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
- -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
- -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
- 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
- -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
- 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
- -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
- 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
- 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
- -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
- 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
- -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
- -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
- -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
- -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
- -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
- -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
- 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
- -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
- -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
- 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
- -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
- 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
- -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
- -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
- -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
- -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
- -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
- -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
- -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
- -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
- 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
- -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
- -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
- 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
- -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
- 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
- -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
- -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
- -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
- -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
- -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
- -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
- -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
- -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
- -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
- -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
- -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
- -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
- 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
- -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
- -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
- 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
- -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
- -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
- 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
- -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
- 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
- -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
- -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
- -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
- -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
- -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
- -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
- -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
- -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
- -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
- -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
- -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
- -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
- 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
- -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
- -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
- -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
- -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
- -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
- -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
- -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
- -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
- -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
- -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
- -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
- -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
- -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
- -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
- -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
- -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
- -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
- -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
- -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
- -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
- -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
- -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
- -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
- -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
- -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
- -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
- -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
- -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
- -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
- -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
- 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
- -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
- 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
- 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
- -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
- -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
- -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
- -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
- -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
- -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
- 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
- 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
- -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
- 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
- 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
- -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
- -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
- 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
- -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
- 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
- -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
- -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
- 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
- -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
- 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
- -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
- -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
- -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
- -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
- -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
- -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
- -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
- -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
- 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
- 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
- -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
- 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
- -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
- -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
- -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
- -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
- -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
- -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
- -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
- -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
- -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
- -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
- -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
- -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
- -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
- -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
- -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
- -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
- -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
- -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
- -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
- -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
- -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
- -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
- -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
- -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
- -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
- -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
- -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
- 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
- -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
- 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
- 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
- -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
- -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
- 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
- -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
- 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
- -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
- -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
- -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
- -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
- -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
- -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
- -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
- -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
- -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
- 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
- -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
- -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
- 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
- -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
- -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
- 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
- -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
- -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
- 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
- -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
- 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
- -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
- 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
- -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
- -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
- -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
- 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
- -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
- 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
- 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
- -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
- 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
- -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
- 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
- -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
- -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
- -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
- -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
- -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
- -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
- -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
- -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
- -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
- -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
- -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
- -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
- -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
- -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
- -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
- -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
- -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
- -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
- 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
- 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
- -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
- -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
- -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
- -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
- -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
- -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
- -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
- -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
- -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
- -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
- -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
- -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
- -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
- -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
- -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
- -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
- -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
- -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
- -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
- -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
- -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
- -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
- -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
- -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
- -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
- -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
- -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
- -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
- -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
- -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
- -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
- -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
- -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
- -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
- -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
- -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
- -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
- -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
- -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
- -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
- -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
- -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
- -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
- -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
- -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
- -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
- -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
- -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
- -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
- -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
- -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
- -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
- -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
- -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
- -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
- -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
- -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
- -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
- -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
- -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
- -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
- -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
- -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
- -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
- -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
- -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
- -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
- -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
- -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
- -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
- -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
- -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
- -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
- -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
- -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
- -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
- -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
- -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
- 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
- -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
- -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
- 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
- -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
- -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
- 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
- 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
- -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
- 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
- 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
- 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
- -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
- 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
- -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
- -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
- 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
- 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
- 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
- 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
- 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
- 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
- -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
- 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
- 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
- -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
- 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
- -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
- -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
- -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
- -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
- -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
- -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
- -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
- -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
- 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
- -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
- -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
- -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
- -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
- -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
- -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
- -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
- -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
- -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
- -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
- 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
- -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
- -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
- -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
- -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
- -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
- -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
- 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
- -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
- -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
- -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
- -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
- -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
- -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
- -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
- -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
- 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
- -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
- -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
- -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
- -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
- -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
- -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
- -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
- -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
- -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
- -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
- 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
- -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
- -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
- -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
- -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
- -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
- -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
- -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
- -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
- -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
- -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
- -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
- -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
- -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
- -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
- -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
- -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
- -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
- -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
- -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
- -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
- -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
- -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
- -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
- -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
- -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
- -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
- -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
- -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
- -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
- -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
- -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
- -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
- -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
- -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
- -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
- -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
- -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
- -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
- -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
- -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
- -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
- -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
- -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
- -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
- -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
- -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
- -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
- -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
- -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
- -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
- -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
- 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
- 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
- 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
- -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
- 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
- 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
- -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
- 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
- -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
- -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
- -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
- -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
- -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
- -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
- -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
- -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
- -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
- -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
- -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
- -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
- -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
- -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
- -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
- 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
- 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
- -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
- 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
- -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
- 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
- -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
- 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
- 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
- -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
- 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
- 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
- -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
- -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
- 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
- -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
- 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
- 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
- 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
- -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
- -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
- -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
- 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
- -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
- 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
- -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
- -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
- -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
- -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
- -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
- -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
- -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
- -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
- -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
- -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
- -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
- -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
- 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
- -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
- -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
- -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
- -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
- -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
- -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
- -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
- 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
- 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
- -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
- 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
- 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
- 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
- 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
- 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
- -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
- -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
- -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
- -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1020,data,NULL};
-const struct gllist *cow_horns=&frame;
diff --git a/hacks/glx/cow_tail.c b/hacks/glx/cow_tail.c
deleted file mode 100644
index 895f05c..0000000
--- a/hacks/glx/cow_tail.c
+++ /dev/null
@@ -1,464 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664,
- -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
- -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
- -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
- -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
- -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
- -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
- -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
- -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
- -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
- 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
- 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
- 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
- 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
- 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
- -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
- 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
- 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
- -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
- -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
- 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
- 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
- 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
- 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
- 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
- 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
- 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
- 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
- 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
- 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
- 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
- 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
- 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
- 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
- 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
- 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
- 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
- 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
- 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
- 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
- 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
- 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
- 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
- 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
- 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
- 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
- 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
- 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
- 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
- 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
- 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
- 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
- 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
- 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
- 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
- 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
- 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
- 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
- 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
- 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
- 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
- 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
- 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
- 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
- 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
- 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
- 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
- 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
- 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
- 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
- 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
- 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
- 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
- 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
- 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
- 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
- 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
- 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
- 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
- -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
- 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
- -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
- 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
- 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
- -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
- -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
- 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
- -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
- -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
- 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
- -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
- 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
- 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
- -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
- -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
- 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
- -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
- 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
- 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
- -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
- 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
- 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
- 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
- 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
- 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
- -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
- -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
- 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
- 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
- -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
- 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
- -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
- -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
- 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
- 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
- -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
- 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
- -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
- -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
- 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
- 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
- -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
- 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
- -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
- -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
- 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
- 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
- -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
- 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
- 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
- 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
- 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
- -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
- 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
- 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
- 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
- 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
- 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
- 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
- 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
- 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
- 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
- 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
- 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
- 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
- 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
- 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
- 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
- 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
- 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
- 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
- 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
- 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
- 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
- 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
- -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
- -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
- -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
- -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
- -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
- -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
- -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
- 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
- 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
- -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
- -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
- 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
- -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
- 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
- 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
- -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
- -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
- 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
- -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
- 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
- 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
- -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
- -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
- 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
- -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
- 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
- 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
- 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
- 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
- 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
- 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
- -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
- -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
- 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
- -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
- -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
- 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
- -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
- -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
- 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
- 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
- -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
- 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
- -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
- -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
- 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
- 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
- -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
- 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
- -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
- 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
- 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
- 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
- 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
- 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
- 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
- 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
- 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
- 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
- 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
- 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
- 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
- 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
- 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
- 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
- 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
- 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
- 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
- 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
- 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
- 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
- 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
- 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
- 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
- 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
- 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
- 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
- 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
- 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
- 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
- -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
- 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
- -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
- -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
- -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
- 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
- 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
- -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
- 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
- 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
- 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
- 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
- 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
- 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
- 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
- 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
- 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
- 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
- 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
- -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
- 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
- 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
- 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
- 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
- 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
- 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
- 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
- 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
- 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
- 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
- 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
- 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
- -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
- 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
- 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
- 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,459,data,NULL};
-const struct gllist *cow_tail=&frame;
diff --git a/hacks/glx/cow_udder.c b/hacks/glx/cow_udder.c
deleted file mode 100644
index 46df87c..0000000
--- a/hacks/glx/cow_udder.c
+++ /dev/null
@@ -1,1520 +0,0 @@
-#include "gllist.h"
-static const float data[]={
- 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
- -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
- 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
- -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
- 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
- -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
- -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
- 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
- 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
- -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
- -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
- 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
- -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
- -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
- -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
- 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
- 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
- -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
- -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
- 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
- -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
- 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
- -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
- -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
- -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
- 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
- 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
- -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
- 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
- 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
- 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
- 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
- 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
- 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
- -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
- -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
- 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
- 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
- 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
- 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
- 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
- -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
- 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
- -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
- 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
- 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
- -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
- 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
- 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
- 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
- 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
- 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
- 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
- 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
- -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
- 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
- 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
- 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
- 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
- -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
- -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
- 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
- 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
- -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
- -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
- 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
- -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
- -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
- -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
- -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
- -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
- -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
- -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
- 0.011286,0.999936,0,-1.395728,-1.723811,0,
- 0.106808,0.99428,0,-1.610025,-1.711571,0,
- -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
- 0.106808,0.99428,0,-1.610025,-1.711571,0,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- 0.106808,0.99428,0,-1.610025,-1.711571,0,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
- -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
- -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
- 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
- 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
- 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
- -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
- -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
- 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
- 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
- -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
- 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
- -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
- -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
- -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
- -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
- 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
- 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
- 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
- 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
- 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
- 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
- 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
- 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
- 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
- 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
- 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
- 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
- -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
- 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
- -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
- -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
- -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
- -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
- 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
- -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
- 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
- -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
- 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
- 0.058013,0.998316,0,-2.656867,-1.853045,0,
- 0.058013,0.998316,0,-2.656867,-1.853045,0,
- 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
- -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
- 0.058013,0.998316,0,-2.656867,-1.853045,0,
- -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
- 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
- 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
- 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
- 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
- -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
- 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
- -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
- -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
- 0.149455,0.988769,0,-2.092921,-1.839622,0,
- 0.149455,0.988769,0,-2.092921,-1.839622,0,
- -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
- -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
- 0.149455,0.988769,0,-2.092921,-1.839622,0,
- -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
- 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
- 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
- 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
- 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
- -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
- 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
- -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
- -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
- -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
- -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
- -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
- -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
- -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
- -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
- -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
- -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
- -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
- -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
- -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
- -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
- -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
- -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
- -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
- -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
- -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
- -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
- -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
- -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
- -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
- -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
- -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
- -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
- -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
- -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
- -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
- -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
- -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
- -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
- -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
- -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
- -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
- -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
- -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
- -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
- -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
- -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
- -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
- 0.170833,0.9853,0,-3.55232,0.219613,0,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- 0.170833,0.9853,0,-3.55232,0.219613,0,
- -0.57342,0.819261,0,-3.544507,0.467147,0,
- 0.170833,0.9853,0,-3.55232,0.219613,0,
- -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
- -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
- 0.170833,0.9853,0,-3.55232,0.219613,0,
- -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
- 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
- 0.098463,-0.995141,0,-3.637643,-0.356271,0,
- -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
- -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
- 0.098463,-0.995141,0,-3.637643,-0.356271,0,
- -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
- 0.353735,-0.935346,0,-3.673607,-0.720796,0,
- 0.353735,-0.935346,0,-3.673607,-0.720796,0,
- -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
- -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
- 0.353735,-0.935346,0,-3.673607,-0.720796,0,
- -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
- -0.34926,-0.937026,0,-3.678793,-0.926816,0,
- -0.34926,-0.937026,0,-3.678793,-0.926816,0,
- -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
- -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
- -0.34926,-0.937026,0,-3.678793,-0.926816,0,
- -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
- -0.164,-0.98646,0,-3.650579,-1.142448,0,
- -0.164,-0.98646,0,-3.650579,-1.142448,0,
- -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
- -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
- -0.164,-0.98646,0,-3.650579,-1.142448,0,
- -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
- 0.030921,-0.999522,0,-3.522115,-1.366623,0,
- 0.030921,-0.999522,0,-3.522115,-1.366623,0,
- -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
- -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
- 0.030921,-0.999522,0,-3.522115,-1.366623,0,
- -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
- 0.183204,-0.983075,0,-3.417689,-1.494416,0,
- 0.183204,-0.983075,0,-3.417689,-1.494416,0,
- -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
- 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
- 0.183204,-0.983075,0,-3.417689,-1.494416,0,
- 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
- -0.997516,0.070442,0,-3.271035,-1.609292,0,
- -0.997516,0.070442,0,-3.271035,-1.609292,0,
- 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
- 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
- -0.997516,0.070442,0,-3.271035,-1.609292,0,
- 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
- -0.99928,-0.037933,0,-3.1103,-1.69172,0,
- -0.99928,-0.037933,0,-3.1103,-1.69172,0,
- 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- -0.99928,-0.037933,0,-3.1103,-1.69172,0,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
- -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
- -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
- 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
- -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
- 0.098463,-0.995141,0,-3.637643,-0.356271,0,
- -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
- -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
- -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
- -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
- -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
- -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
- -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
- -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
- -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
- -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
- -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
- -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
- -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
- -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
- -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
- -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
- -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
- -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
- -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
- -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
- -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
- -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
- -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
- -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
- -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
- -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
- -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
- -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
- -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
- -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
- -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
- -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
- -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
- -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
- -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
- -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
- -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
- -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
- -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
- -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
- -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
- -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
- -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
- -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
- -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
- -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
- -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
- -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
- -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
- -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
- -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
- -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
- -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
- -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
- -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
- -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
- -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
- -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
- -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
- -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.57342,0.819261,0,-3.544507,0.467147,0,
- -0.989276,0.146061,0,-3.566995,0.656967,0,
- -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
- -0.989276,0.146061,0,-3.566995,0.656967,0,
- -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
- -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
- -0.989276,0.146061,0,-3.566995,0.656967,0,
- -0.989171,0.146765,0,-3.599077,0.796217,0,
- -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
- -0.989171,0.146765,0,-3.599077,0.796217,0,
- -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
- -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
- -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
- -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
- -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
- -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
- -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
- 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
- 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
- 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
- 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
- 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
- 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
- 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
- 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
- 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
- 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
- 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
- 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
- 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
- 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
- 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
- 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
- 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
- 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
- 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
- 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
- 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
- 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
- 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
- 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
- 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
- -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
- -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
- 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
- -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
- -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
- -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
- -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
- -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
- -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
- -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
- -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
- -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
- -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
- -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
- -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
- 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
- -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
- 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
- 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
- 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
- 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
- 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
- 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
- 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
- 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
- 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
- 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
- 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
- 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
- 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
- -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
- -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
- 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
- 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
- -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
- 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
- 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
- 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
- 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
- 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
- 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
- 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
- -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
- 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
- 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
- -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
- -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
- 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
- -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
- -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
- -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
- -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
- -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
- -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
- -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
- 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
- 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
- -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
- -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
- 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
- -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
- -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
- -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
- -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
- 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
- -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
- 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
- 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
- -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
- 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
- -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
- -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
- -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
- -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
- 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
- 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
- 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
- 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
- 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
- -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
- 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
- -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
- 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
- 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
- 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
- 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
- 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
- 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
- -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
- 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
- -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
- 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
- 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
- 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
- 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
- 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
- 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
- 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
- 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
- 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
- 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
- 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
- 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
- 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
- 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
- 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
- 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
- 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
- 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
- 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
- -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
- -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
- 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
- -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
- 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
- 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
- -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
- 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
- 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
- -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
- 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
- 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
- -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
- 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
- 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
- -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
- 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
- -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
- -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
- 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
- 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
- -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
- 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
- -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
- -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
- 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
- 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
- -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
- 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
- -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
- 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
- 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
- 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
- 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
- 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
- -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
- 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
- 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
- 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
- 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
- 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
- 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
- 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
- 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
- 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
- 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
- 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
- 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
- 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
- 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
- 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
- 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
- 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
- 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
- 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
- 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
- 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
- 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
- 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
- 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
- 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
- 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
- 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
- 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
- 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
- -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
- 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
- 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
- -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
- 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
- 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
- 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
- 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
- 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
- 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
- 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
- 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
- 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
- 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
- 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
- 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
- -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
- 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
- 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
- -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
- -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
- -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
- -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
- -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
- -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
- -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
- -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
- -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
- -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
- -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
- -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
- -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
- -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
- -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
- -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
- -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
- -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
- -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
- -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
- -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
- -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
- -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
- -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
- -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
- -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
- -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
- -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
- -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
- -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
- -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
- -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
- -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
- -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
- -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
- -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
- -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
- -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
- -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
- -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
- -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
- -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
- -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
- -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
- -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
- -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
- -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
- -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
- -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
- -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
- -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
- -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
- -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
- -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
- -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
- -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
- -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
- -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
- -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
- -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
- -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
- -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
- -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
- -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
- -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
- -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
- -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
- 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
- -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
- -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
- 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
- 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
- -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
- 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
- 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
- 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
- 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
- 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- 0.106808,0.99428,0,-1.610025,-1.711571,0,
- 0.011286,0.999936,0,-1.395728,-1.723811,0,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- 0.011286,0.999936,0,-1.395728,-1.723811,0,
- -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- 0.106808,0.99428,0,-1.610025,-1.711571,0,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- 0.106808,0.99428,0,-1.610025,-1.711571,0,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
- -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
- -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
- -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
- 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
- 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
- -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
- -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
- 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
- -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
- -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
- 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
- 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
- -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
- -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
- 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
- -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
- -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
- 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
- -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
- -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
- 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
- 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
- -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
- 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
- -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
- 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
- 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
- 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
- -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
- 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
- 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
- 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
- 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
- -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
- 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
- -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
- -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
- -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
- -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
- -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
- 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
- 0.058013,0.998316,0,-2.656867,-1.853045,0,
- 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
- 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
- 0.058013,0.998316,0,-2.656867,-1.853045,0,
- 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
- 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
- 0.058013,0.998316,0,-2.656867,-1.853045,0,
- 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
- 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
- 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
- 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
- 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
- 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
- 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
- 0.149455,0.988769,0,-2.092921,-1.839622,0,
- -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
- 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
- 0.149455,0.988769,0,-2.092921,-1.839622,0,
- 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
- 0.093777,0.995593,0,-2.348005,-1.869142,0,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
- -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
- 0.149455,0.988769,0,-2.092921,-1.839622,0,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
- 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
- -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
- 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
- -0.160087,-0.987103,0,-1.799827,-1.753136,0,
- 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
- 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
- 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
- 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
- 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
- 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
- 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
- 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
- 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
- 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
- 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
- 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
- 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
- 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
- -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
- 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
- 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
- -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
- 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
- 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
- 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
- -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
- 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
- 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
- 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
- -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
- -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
- 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
- -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
- -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
- -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
- 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
- -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
- -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
- 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
- -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
- 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
- -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
- -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
- -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
- -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
- -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.57342,0.819261,0,-3.544507,0.467147,0,
- 0.170833,0.9853,0,-3.55232,0.219613,0,
- -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
- -0.57342,0.819261,0,-3.544507,0.467147,0,
- -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
- -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
- 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
- -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
- -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
- 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
- -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
- 0.170833,0.9853,0,-3.55232,0.219613,0,
- 0.353735,-0.935346,0,-3.673607,-0.720796,0,
- -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
- 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
- 0.353735,-0.935346,0,-3.673607,-0.720796,0,
- 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
- 0.098463,-0.995141,0,-3.637643,-0.356271,0,
- -0.34926,-0.937026,0,-3.678793,-0.926816,0,
- 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
- -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
- -0.34926,-0.937026,0,-3.678793,-0.926816,0,
- -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
- 0.353735,-0.935346,0,-3.673607,-0.720796,0,
- -0.164,-0.98646,0,-3.650579,-1.142448,0,
- 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
- 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
- -0.164,-0.98646,0,-3.650579,-1.142448,0,
- 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
- -0.34926,-0.937026,0,-3.678793,-0.926816,0,
- 0.030921,-0.999522,0,-3.522115,-1.366623,0,
- 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
- 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
- 0.030921,-0.999522,0,-3.522115,-1.366623,0,
- 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
- -0.164,-0.98646,0,-3.650579,-1.142448,0,
- 0.183204,-0.983075,0,-3.417689,-1.494416,0,
- 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
- 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
- 0.183204,-0.983075,0,-3.417689,-1.494416,0,
- 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
- 0.030921,-0.999522,0,-3.522115,-1.366623,0,
- -0.997516,0.070442,0,-3.271035,-1.609292,0,
- 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
- 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
- -0.997516,0.070442,0,-3.271035,-1.609292,0,
- 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
- 0.183204,-0.983075,0,-3.417689,-1.494416,0,
- -0.99928,-0.037933,0,-3.1103,-1.69172,0,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
- -0.99928,-0.037933,0,-3.1103,-1.69172,0,
- 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
- -0.997516,0.070442,0,-3.271035,-1.609292,0,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- 0.0787,0.996898,0,-2.892162,-1.781087,0,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- -0.99928,-0.037933,0,-3.1103,-1.69172,0,
- 0.098463,-0.995141,0,-3.637643,-0.356271,0,
- 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
- -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
- 0.098463,-0.995141,0,-3.637643,-0.356271,0,
- -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
- 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
- -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
- -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
- -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
- 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
- -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
- -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
- 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
- -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
- -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
- -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
- -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
- -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
- -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
- -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
- 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
- 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
- -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
- -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
- 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
- -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
- -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
- 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
- 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
- -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
- 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
- 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
- -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
- -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
- -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
- -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
- -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
- -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
- -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
- -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
- -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
- -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
- -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
- -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
- -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
- -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
- -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
- -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
- -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
- -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
- -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
- -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
- -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
- -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
- -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
- -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
- -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
- -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
- -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
- -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
- -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
- -0.989276,0.146061,0,-3.566995,0.656967,0,
- -0.57342,0.819261,0,-3.544507,0.467147,0,
- -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
- -0.57342,0.819261,0,-3.544507,0.467147,0,
- -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
- -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
- -0.989171,0.146765,0,-3.599077,0.796217,0,
- -0.989276,0.146061,0,-3.566995,0.656967,0,
- -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
- -0.989276,0.146061,0,-3.566995,0.656967,0,
- -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
- -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
- -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
- -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
- -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
- -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
- 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
- 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
- -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
- 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
- -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
- 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
- -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
- -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
- 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
- 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
- -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
- 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
- -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
- 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
- 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
- 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
- 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
- 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
- -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
- 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
- -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
- 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
- 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
- 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
- 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
- -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
- 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
- -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
- -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
- -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
- 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
- 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
- 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
- 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
- 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
- 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
- -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
- -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
- 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
- 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
- -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
- 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
- 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
- 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
- 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
- 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
- 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
- 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
- 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
- -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
- 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
- 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
- -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
- 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
- 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
- -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
- 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
- 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
- -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
- 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
- -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
- -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
- 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
- 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
- -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
- 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
- -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
- 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
- -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
- 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
- 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
- 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
- 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
- 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
- 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
- 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
- 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
- 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
- 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
- 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
- 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
- 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
- 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
- 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
- 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
- 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
- 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
- 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
- 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
- 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
- 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
- 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
- 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
- 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
- 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
- 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
- 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
- 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
- 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
- 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
- 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
- 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
- -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
- -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
- 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
- -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
- -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
- -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
- 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
- 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
- -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
- -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
- 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
- -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
- 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
- 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
- -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
- 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
- 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
- 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
- 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
- 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
- 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
- -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
- 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
- -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
- 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
- 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
- -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
- 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
- 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
- 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
- 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
- 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
- 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
- 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
- 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
- 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
- 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
- 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
- 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
- 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
- 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
- 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
- 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
- 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
- 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
- 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
- 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
- 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
- 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
- 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
- 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
- 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
- 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
- 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
- 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
- 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
- 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
- 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
- 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
- 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
- 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
- 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
- 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
- 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
- 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
- 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
- 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
- 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
- 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
- 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
- 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
- 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
- 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
- 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
- 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
- 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
- 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
- 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
- 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
- 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
- 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
- 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
- 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
- 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
- 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
- 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
- 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
- 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
- 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
- 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
- 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
- -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
- 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
- -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
- -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
- 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
- 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
- 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
- -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
- 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
- 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
- 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
- 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
- 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
- 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
- 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
- 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
- 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
- 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
- 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
- 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
- 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
- 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
- -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
- 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
- -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
- 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
- -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
- -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
- -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664
-};
-static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1515,data,NULL};
-const struct gllist *cow_udder=&frame;
diff --git a/hacks/glx/crackberg.c b/hacks/glx/crackberg.c
deleted file mode 100644
index 95b49e4..0000000
--- a/hacks/glx/crackberg.c
+++ /dev/null
@@ -1,1483 +0,0 @@
-/***************************
- ** crackberg; Matus Telgarsky [ catachresis@cmu.edu ] 2005
- ** */
-#ifndef HAVE_JWXYZ
-# define XK_MISCELLANY
-# include <X11/keysymdef.h>
-#endif
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_crackberg 0
-
-#include "xlockmore.h"
-#ifdef USE_GL /* whole file */
-
-#define DEF_NSUBDIVS "4"
-#define DEF_BORING "False"
-#define DEF_CRACK "True"
-#define DEF_WATER "True"
-#define DEF_FLAT "True"
-#define DEF_COLOR "random"
-#define DEF_LIT "True"
-#define DEF_VISIBILITY "0.6"
-#define DEF_LETTERBOX "False"
-
-
-/***************************
- ** macros
- ** */
-
-#define M_RAD7_4 0.661437827766148
-#define M_SQRT3_2 0.866025403784439
-#define M_PI_180 0.0174532925199433
-#define M_180_PI 57.2957795130823
-#define MSPEED_SCALE 1.1
-#define AVE3(a,b,c) ( ((a) + (b) + (c)) / 3.0 )
-#define MAX_ZDELTA 0.35
-#define DISPLACE(h,d) (h+(random()/(double)RAND_MAX-0.5)*2*MAX_ZDELTA/(1<<d))
-#define MEAN(x,y) ( ((x) + (y)) / 2.0 )
-#define TCOORD(x,y) (cberg->heights[(cberg->epoints * (y) - ((y)-1)*(y)/2 + (x))])
-#define sNCOORD(x,y,p) (cberg->norms[3 * (cberg->epoints * (y) - ((y)-1)*(y)/2 + (x)) + (p)])
-#define SET_sNCOORD(x,y, down, a,b,c,d,e,f) \
- sNCOORD(x,y,0) = AVE3(a-d, 0.5 * (b-e), -0.5 * (c-f)); \
- sNCOORD(x,y,1) = ((down) ? -1 : +1) * AVE3(0.0, M_SQRT3_2 * (b-e), M_SQRT3_2 * (c-f)); \
- sNCOORD(x,y,2) = (2*dx)
-#define fNCOORD(x,y,w,p) \
- (cberg->norms[3 * (2*(y)*cberg->epoints-((y)+1)*((y)+1) + 1 + 2 * ((x)-1) + (w)) + (p)])
-#define SET_fNCOORDa(x,y, down, dz00,dz01) \
- fNCOORD(x,y,0,0) = (down) * (dy) * (dz01); \
- fNCOORD(x,y,0,1) = (down) * ((dz01) * (dx) / 2 - (dx) * (dz00)); \
- fNCOORD(x,y,0,2) = (down) * (dx) * (dy)
-#define SET_fNCOORDb(x,y, down, dz10,dz11) \
- fNCOORD(x,y,1,0) = (down) * (dy) * (dz10); \
- fNCOORD(x,y,1,1) = (down) * ((dz11) * (dx) - (dx) * (dz10) / 2); \
- fNCOORD(x,y,1,2) = (down) * (dx) * (dy)
-
-
-/***************************
- ** types
- ** */
-
-
-typedef struct _cberg_state cberg_state;
-typedef struct _Trile Trile;
-
-typedef struct {
- void (*init)(Trile *);
- void (*free)(Trile *);
- void (*draw)(Trile *);
- void (*init_iter)(Trile *, cberg_state *);
- void (*dying_iter)(Trile *, cberg_state *);
-} Morph;
-
-typedef struct {
- char *id;
- void (*land)(cberg_state *, double);
- void (*water)(cberg_state *, double);
- double bg[4];
-} Color;
-
-enum { TRILE_NEW, TRILE_INIT, TRILE_STABLE, TRILE_DYING, TRILE_DELETE };
-
-struct _Trile {
- int x,y; /*center coords; points up if (x+y)%2 == 0, else down*/
- short state;
- short visible;
- double *l,*r,*v; /*only edges need saving*/
- GLuint call_list;
-
- void *morph_data;
- const Morph *morph;
-
- struct _Trile *left, *right, *parent; /* for bst, NOT spatial */
- struct _Trile *next_free, *next0; /* for memory allocation */
-};
-
-enum { MOTION_AUTO = 0, MOTION_MANUAL = 1, MOTION_LROT= 2, MOTION_RROT = 4,
- MOTION_FORW = 8, MOTION_BACK = 16, MOTION_DEC = 32, MOTION_INC = 64,
- MOTION_LEFT = 128, MOTION_RIGHT = 256 };
-
-struct _cberg_state {
- GLXContext *glx_context;
- Trile *trile_head;
-
- double x,y,z, yaw,roll,pitch, dx,dy,dz, dyaw,droll,dpitch, elapsed;
- double prev_frame;
- int motion_state;
- double mspeed;
-
- double fovy, aspect, zNear, zFar;
-
- const Color *color;
-
- int count;
-
- unsigned int epoints, /*number of points to one edge*/
- tpoints, /*number points total*/
- ntris, /*number triangles per trile*/
- tnorms; /*number of normals*/
-
- double *heights, *norms;
- Trile *free_head; /* for trile_[alloc|free] */
- Trile *all_triles;
-
- double draw_elapsed;
-
- double dx0;
-
- double vs0r,vs0g,vs0b, vs1r, vs1g, vs1b,
- vf0r,vf0g,vf0b, vf1r, vf1g, vf1b;
-
- Bool button_down_p;
- int mouse_x, mouse_y;
- struct timeval paused;
-};
-
-
-
-/***************************
- ** globals
- ** */
-
-static unsigned int nsubdivs;
-static Bool crack, boring, do_water, flat, lit, letterbox;
-static float visibility;
-static char *color;
-
-static cberg_state *cbergs = NULL;
-
-static XrmOptionDescRec opts[] = {
- {"-nsubdivs", ".nsubdivs", XrmoptionSepArg, 0},
- {"-boring", ".boring", XrmoptionNoArg, "True"},
- {"-crack", ".crack", XrmoptionNoArg, "True"},
- {"-no-crack", ".crack", XrmoptionNoArg, "False"},
- {"-water", ".water", XrmoptionNoArg, "True"},
- {"-no-water", ".water", XrmoptionNoArg, "False"},
- {"-flat", ".flat", XrmoptionNoArg, "True"},
- {"-no-flat", ".flat", XrmoptionNoArg, "False"},
- {"-color", ".color", XrmoptionSepArg, 0},
- {"-lit", ".lit", XrmoptionNoArg, "True"},
- {"-no-lit", ".lit", XrmoptionNoArg, "False"},
- {"-visibility", ".visibility", XrmoptionSepArg, 0},
- {"-letterbox", ".letterbox", XrmoptionNoArg, "True"}
-};
-
-static argtype vars[] = {
- {&nsubdivs, "nsubdivs", "nsubdivs", DEF_NSUBDIVS, t_Int},
- {&boring, "boring", "boring", DEF_BORING, t_Bool},
- {&crack, "crack", "crack", DEF_CRACK, t_Bool},
- {&do_water, "water", "water", DEF_WATER, t_Bool},
- {&flat, "flat", "flat", DEF_FLAT, t_Bool},
- {&color, "color", "color", DEF_COLOR, t_String},
- {&lit, "lit", "lit", DEF_LIT, t_Bool},
- {&visibility, "visibility", "visibility", DEF_VISIBILITY, t_Float},
- {&letterbox, "letterbox", "letterbox", DEF_LETTERBOX, t_Bool}
-};
-
-ENTRYPOINT ModeSpecOpt crackberg_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/***************************
- ** Trile functions.
- ** first come all are regular trile functions
- ** */
-
-
-/* forward decls for trile_new */
-static Trile *triles_find(Trile *tr, int x, int y);
-static Trile *trile_alloc(cberg_state *cberg);
-static const Morph *select_morph(void);
-static const Color *select_color(cberg_state *);
-
-static void trile_calc_sides(cberg_state *cberg,
- Trile *new, int x, int y, Trile *root)
-{
- unsigned int i,j,k;
- int dv = ( (x + y) % 2 ? +1 : -1); /* we are pointing down or up*/
- Trile *l, *r, *v; /* v_ertical */
-
-
- if (root) {
- l = triles_find(root, x-1, y);
- r = triles_find(root, x+1, y);
- v = triles_find(root, x,y+dv);
- } else
- l = r = v = NULL;
-
- if (v) {
- for (i = 0; i != cberg->epoints; ++i)
- new->v[i] = v->v[i];
- } else {
- if (l) new->v[0] = l->l[0];
- else if (!root) new->v[0] = DISPLACE(0,0);
- else {
- Trile *tr; /* all of these tests needed.. */
- if ( (tr = triles_find(root, x-1, y + dv)) )
- new->v[0] = tr->l[0];
- else if ( (tr = triles_find(root, x-2, y)) )
- new->v[0] = tr->r[0];
- else if ( (tr = triles_find(root, x-2, y + dv)) )
- new->v[0] = tr->r[0];
- else
- new->v[0] = DISPLACE(0,0);
- }
-
- if (r) new->v[cberg->epoints-1] = r->l[0];
- else if (!root) new->v[cberg->epoints-1] = DISPLACE(0,0);
- else {
- Trile *tr;
- if ( (tr = triles_find(root, x+1, y + dv)) )
- new->v[cberg->epoints-1] = tr->l[0];
- else if ( (tr = triles_find(root, x+2, y)) )
- new->v[cberg->epoints-1] = tr->v[0];
- else if ( (tr = triles_find(root, x+2, y + dv)) )
- new->v[cberg->epoints-1] = tr->v[0];
- else
- new->v[cberg->epoints-1] = DISPLACE(0,0);
- }
-
- for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
- for (j = i; j < cberg->epoints; j += i * 2)
- new->v[j] = DISPLACE(MEAN(new->v[j-i], new->v[j+i]), k);
- }
-
- if (l) {
- for (i = 0; i != cberg->epoints; ++i)
- new->l[i] = l->r[i];
- } else {
- if (r) new->l[0] = r->v[0];
- else if (!root) new->l[0] = DISPLACE(0,0);
- else {
- Trile *tr;
- if ( (tr = triles_find(root, x-1, y-dv)) )
- new->l[0] = tr->r[0];
- else if ( (tr = triles_find(root, x+1, y-dv)) )
- new->l[0] = tr->v[0];
- else if ( (tr = triles_find(root, x, y-dv)) )
- new->l[0] = tr->l[0];
- else
- new->l[0] = DISPLACE(0,0);
- }
-
- new->l[cberg->epoints - 1] = new->v[0];
-
- for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
- for (j = i; j < cberg->epoints; j += i * 2)
- new->l[j] = DISPLACE(MEAN(new->l[j-i], new->l[j+i]), k);
- }
-
- if (r) {
- for (i = 0; i != cberg->epoints; ++i)
- new->r[i] = r->l[i];
- } else {
- new->r[0] = new->v[cberg->epoints - 1];
- new->r[cberg->epoints - 1] = new->l[0];
-
- for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
- for (j = i; j < cberg->epoints; j += i * 2)
- new->r[j] = DISPLACE(MEAN(new->r[j-i], new->r[j+i]), k);
- }
-}
-
-static void trile_calc_heights(cberg_state *cberg, Trile *new)
-{
- unsigned int i, j, k, h;
-
- for (i = 0; i < cberg->epoints - 1; ++i) { /* copy in sides */
- TCOORD(i,0) = new->v[i];
- TCOORD(cberg->epoints - 1 - i, i) = new->r[i];
- TCOORD(0, cberg->epoints - 1 - i) = new->l[i];
- }
-
- for (i = ((1 << nsubdivs) >> 2), k =1; i; i >>= 1, ++k)
- for (j = 1; j < (1 << k); ++j)
- for (h = 1; h <= (1<<k) - j; ++h) {
- TCOORD( i*(2*h - 1), i*(2*j - 1) ) = /*rights*/
- DISPLACE(MEAN(TCOORD( i*(2*h - 2), i*(2*j + 0) ),
- TCOORD( i*(2*h + 0), i*(2*j - 2) )), k);
-
- TCOORD( i*(2*h + 0), i*(2*j - 1) ) = /*lefts*/
- DISPLACE(MEAN(TCOORD( i*(2*h + 0), i*(2*j - 2) ),
- TCOORD( i*(2*h + 0), i*(2*j + 0) )), k);
-
- TCOORD( i*(2*h - 1), i*(2*j + 0) ) = /*verts*/
- DISPLACE(MEAN(TCOORD( i*(2*h - 2), i*(2*j + 0) ),
- TCOORD( i*(2*h + 0), i*(2*j + 0) )), k);
- }
-}
-
-static void trile_calc_flat_norms(cberg_state *cberg, Trile *new)
-{
- unsigned int x, y;
- int down = (((new->x + new->y) % 2) ? -1 : +1);
- double dz00,dz01,dz10,dz11, a,b,c,d;
- double dy = down * M_SQRT3_2 / (1 << nsubdivs);
- double dx = cberg->dx0;
-
- for (y = 0; y < cberg->epoints - 1; ++y) {
- a = TCOORD(0,y);
- b = TCOORD(0,y+1);
- for (x = 1; x < cberg->epoints - 1 - y; ++x) {
- c = TCOORD(x,y);
- d = TCOORD(x,y+1);
-
- dz00 = b-c;
- dz01 = a-c;
- dz10 = b-d;
- dz11 = c-d;
-
- SET_fNCOORDa(x,y, down, dz00,dz01);
- SET_fNCOORDb(x,y, down, dz10,dz11);
-
- a = c;
- b = d;
- }
-
- c = TCOORD(x,y);
- dz00 = b-c;
- dz01 = a-c;
- SET_fNCOORDa(x,y, down, dz00, dz01);
- }
-}
-
-static void trile_calc_smooth_norms(cberg_state *cberg, Trile *new)
-{
- unsigned int i,j, down = (new->x + new->y) % 2;
- double prev, cur, next;
- double dx = cberg->dx0;
-
- /** corners -- assume level (bah) **/
- cur = TCOORD(0,0);
- SET_sNCOORD(0,0, down,
- cur,cur,TCOORD(0,1),TCOORD(1,0),cur,cur);
- cur = TCOORD(cberg->epoints-1,0);
- SET_sNCOORD(cberg->epoints-1,0, down,
- TCOORD(cberg->epoints-2,0),TCOORD(cberg->epoints-2,1),cur,cur,cur,cur);
- cur = TCOORD(0,cberg->epoints-1);
- SET_sNCOORD(0,cberg->epoints-1, down,
- cur,cur,cur,cur,TCOORD(1,cberg->epoints-2),TCOORD(0,cberg->epoints-2));
-
-
- /** sides **/
- /* vert */
- prev = TCOORD(0,0);
- cur = TCOORD(1,0);
- for (i = 1; i < cberg->epoints - 1; ++i) {
- next = TCOORD(i+1,0);
- SET_sNCOORD(i,0, down, prev,TCOORD(i-1,1),TCOORD(i,1), next,cur,cur);
- prev = cur;
- cur = next;
- }
-
- /* right */
- prev = TCOORD(cberg->epoints-1,0);
- cur = TCOORD(cberg->epoints-2,0);
- for (i = 1; i < cberg->epoints - 1; ++i) {
- next = TCOORD(cberg->epoints-i-2,i+1);
- SET_sNCOORD(cberg->epoints-i-1,i, down, TCOORD(cberg->epoints-i-2,i),next,cur,
- cur,prev,TCOORD(cberg->epoints-i-1,i-1));
- prev = cur;
- cur = next;
- }
-
- /* left */
- prev = TCOORD(0,0);
- cur = TCOORD(0,1);
- for (i = 1; i < cberg->epoints - 1; ++i) {
- next = TCOORD(0,i+1);
- SET_sNCOORD(0,i, down, cur,cur,next,TCOORD(1,i),TCOORD(1,i-1),prev);
- prev = cur;
- cur = next;
- }
-
-
- /** fill in **/
- for (i = 1; i < cberg->epoints - 2; ++i) {
- prev = TCOORD(0,i);
- cur = TCOORD(1,i);
- for (j = 1; j < cberg->epoints - i - 1; ++j) {
- next = TCOORD(j+1,i);
- SET_sNCOORD(j,i, down, prev,TCOORD(j-1,i+1),TCOORD(j,i+1),
- next,TCOORD(j+1,i-1),TCOORD(j,i-1));
- prev = cur;
- cur = next;
- }
- }
-}
-
-static inline void trile_light(cberg_state *cberg,
- unsigned int x, unsigned int y,
- unsigned int which)
-{
- if (flat) {
- if (x) {
- glNormal3d(fNCOORD(x,y,which,0),
- fNCOORD(x,y,which,1),
- fNCOORD(x,y,which,2));
- } else { /* I get mesa errors and bizarre glitches without this!! */
- glNormal3d(fNCOORD(1,y,0,0),
- fNCOORD(1,y,0,1),
- fNCOORD(1,y,0,2));
- }
- } else {
- glNormal3d(sNCOORD(x,y+which,0),
- sNCOORD(x,y+which,1),
- sNCOORD(x,y+which,2));
- }
-}
-
-static inline void trile_draw_vertex(cberg_state *cberg, unsigned int ix,
- unsigned int iy, unsigned int which, double x,double y,
- double zcur, double z1, double z2)
-{
- glColor3d(0.0, 0.0, 0.0); /* don't ask. my card breaks otherwise. */
-
- if (do_water && zcur <= 0.0) {
- cberg->color->water(cberg, zcur); /* XXX use average-of-3 for color when flat?*/
- if (lit) glNormal3d(0.0,0.0,1.0);
- glVertex3d(x, y, 0.0);
- } else {
- cberg->color->land(cberg, zcur);
- if (lit) trile_light(cberg,ix,iy,which);
- glVertex3d(x, y, zcur);
- }
-}
-
-static void trile_render(cberg_state *cberg, Trile *new)
-{
- double cornerx = 0.5 * new->x - 0.5, cornery;
- double dy = M_SQRT3_2 / (1 << nsubdivs);
- double z0,z1,z2;
- int x,y;
-
- new->call_list = glGenLists(1);
- glNewList(new->call_list, GL_COMPILE);
-
- if ((new->x + new->y) % 2) { /*point down*/
- cornery = (new->y + 0.5)*M_SQRT3_2;
- glFrontFace(GL_CW);
- dy = -dy;
- } else
- cornery = (new->y - 0.5) * M_SQRT3_2;
-
- for (y = 0; y < cberg->epoints - 1; ++y) {
- double dx = cberg->dx0;
- glBegin(GL_TRIANGLE_STRIP);
- /* first three points all part of the same triangle.. */
- z0 = TCOORD(0,y);
- z1 = TCOORD(0,y+1);
- z2 = TCOORD(1,y);
- trile_draw_vertex(cberg, 0,y,0,
- cornerx,cornery, z0, z1, z2);
- trile_draw_vertex(cberg, 0,y,1,
- cornerx+0.5*dx,cornery+dy, z1, z0, z2);
-
- for (x = 1; x < cberg->epoints - 1 - y; ++x) {
- trile_draw_vertex(cberg, x,y,0,
- cornerx+x*dx,cornery, z2, z1, z0);
-
- z0 = TCOORD(x, y+1);
-
- trile_draw_vertex(cberg, x,y,1,
- cornerx+(x+0.5)*dx,cornery+dy, z0, z2, z1);
-
- z1 = z0;
- z0 = z2;
- z2 = TCOORD(x+1,y);
- }
- trile_draw_vertex(cberg, x,y,0,
- cornerx + x*dx, cornery, z2, z1, z0);
- glEnd();
-
- cornerx += dx/2;
- cornery += dy;
- }
-
- if ((new->x + new->y) % 2) /*point down*/
- glFrontFace(GL_CCW);
- glEndList();
-}
-
-static Trile *trile_new(cberg_state *cberg, int x,int y,Trile *parent,Trile *root)
-{
- Trile *new;
-
- new = trile_alloc(cberg);
-
- new->x = x;
- new->y = y;
- new->state = TRILE_NEW;
- new->parent = parent;
- new->left = new->right = NULL;
- new->visible = 1;
-
- new->morph = select_morph();
- new->morph->init(new);
-
- trile_calc_sides(cberg, new, x, y, root);
- trile_calc_heights(cberg, new);
-
- if (lit) {
- if (flat) trile_calc_flat_norms(cberg, new);
- else trile_calc_smooth_norms(cberg, new);
- }
-
- trile_render(cberg, new);
- return new;
-}
-
-static Trile *trile_alloc(cberg_state *cberg)
-{
- Trile *new;
-
- if (cberg->free_head) {
- new = cberg->free_head;
- cberg->free_head = cberg->free_head->next_free;
- } else {
- ++cberg->count;
- if (!(new = calloc(1, sizeof(Trile)))
- || !(new->l = (double *) calloc(sizeof(double), cberg->epoints * 3))) {
- perror(progname);
- exit(1);
- }
- new->r = new->l + cberg->epoints;
- new->v = new->r + cberg->epoints;
- new->next0 = cberg->all_triles;
- cberg->all_triles = new;
-#ifdef DEBUG
- printf("needed to alloc; [%d]\n", cberg->count);
-#endif
- }
- return new;
-}
-
-static void trile_free(cberg_state *cberg, Trile *tr)
-{
- glDeleteLists(tr->call_list, 1);
- tr->morph->free(tr);
- tr->next_free = cberg->free_head;
- cberg->free_head = tr;
-}
-
-
-static void trile_draw_vanilla(Trile *tr)
-{ glCallList(tr->call_list); }
-
-static void trile_draw(Trile *tr, void *ignore)
-{
- if (tr->state == TRILE_STABLE)
- trile_draw_vanilla(tr);
- else
- tr->morph->draw(tr);
-}
-
-
-/***************************
- ** Trile morph functions.
- ** select function at bottom (forward decls sucls)
- ** */
-
-
-/*** first the basic growing morph */
-
-static void grow_init(Trile *tr)
-{
- if (!tr->morph_data)
- tr->morph_data = (void *) malloc(sizeof(double));
- *((double *)tr->morph_data) = 0.02; /* not 0; avoid normals crapping */
-}
-
-static void grow_free(Trile *tr)
-{
- if (tr->morph_data) free(tr->morph_data);
- tr->morph_data = 0;
-}
-
-static void grow_draw(Trile *tr)
-{
- glPushMatrix();
- glScaled(1.0,1.0, *((double *)tr->morph_data));
- trile_draw_vanilla(tr);
- glPopMatrix();
-}
-
-static void grow_init_iter(Trile *tr, cberg_state *cberg)
-{
- *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
- if (*((double *)tr->morph_data) >= 1.0)
- tr->state = TRILE_STABLE;
-}
-
-static void grow_dying_iter(Trile *tr, cberg_state *cberg)
-{
- *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
- if (*((double *)tr->morph_data) <= 0.02) /* XXX avoid fast del/cons? */
- tr->state = TRILE_DELETE;
-}
-
-/**** falling morph ****/
-
-static void fall_init(Trile *tr)
-{
- if (!tr->morph_data)
- tr->morph_data = (void *) malloc(sizeof(double));
- *((double *)tr->morph_data) = 0.0;
-}
-
-static void fall_free(Trile *tr)
-{
- if (tr->morph_data) free(tr->morph_data);
- tr->morph_data = 0;
-}
-
-static void fall_draw(Trile *tr)
-{
- glPushMatrix();
- glTranslated(0.0,0.0,(0.5 - *((double *)tr->morph_data)) * 8);
- trile_draw_vanilla(tr);
- glPopMatrix();
-}
-
-static void fall_init_iter(Trile *tr, cberg_state *cberg)
-{
- *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
- if (*((double *)tr->morph_data) >= 0.5)
- tr->state = TRILE_STABLE;
-}
-
-static void fall_dying_iter(Trile *tr, cberg_state *cberg)
-{
- *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
- if (*((double *)tr->morph_data) <= 0.0) /* XXX avoid fast del/cons? */
- tr->state = TRILE_DELETE;
-}
-
-/**** yeast morph ****/
-
-static void yeast_init(Trile *tr)
-{
- if (!tr->morph_data)
- tr->morph_data = (void *) malloc(sizeof(double));
- *((double *)tr->morph_data) = 0.02;
-}
-
-static void yeast_free(Trile *tr)
-{
- if (tr->morph_data) free(tr->morph_data);
- tr->morph_data = 0;
-}
-
-static void yeast_draw(Trile *tr)
-{
- double x = tr->x * 0.5,
- y = tr->y * M_SQRT3_2,
- z = *((double *)tr->morph_data);
-
- glPushMatrix();
- glTranslated(x, y, 0);
- glRotated(z*360, 0,0,1);
- glScaled(z,z,z);
- glTranslated(-x, -y, 0);
- trile_draw_vanilla(tr);
- glPopMatrix();
-}
-
-static void yeast_init_iter(Trile *tr, cberg_state *cberg)
-{
- *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
- if (*((double *)tr->morph_data) >= 1.0)
- tr->state = TRILE_STABLE;
-}
-
-static void yeast_dying_iter(Trile *tr, cberg_state *cberg)
-{
- *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
- if (*((double *)tr->morph_data) <= 0.02) /* XXX avoid fast del/cons? */
- tr->state = TRILE_DELETE;
-}
-
-/**** identity morph ****/
-
-static void identity_init(Trile *tr)
-{ tr->state = TRILE_STABLE; }
-
-static void identity_free(Trile *tr)
-{}
-
-static void identity_draw(Trile *tr)
-{ trile_draw_vanilla(tr); }
-
-static void identity_init_iter(Trile *tr, cberg_state *cberg)
-{}
-
-static void identity_dying_iter(Trile *tr, cberg_state *cberg)
-{ tr->state = TRILE_DELETE; }
-
-/** now to handle selection **/
-
-static const Morph morphs[] = {
- {grow_init, grow_free, grow_draw, grow_init_iter, grow_dying_iter},
- {fall_init, fall_free, fall_draw, fall_init_iter, fall_dying_iter},
- {yeast_init, yeast_free, yeast_draw, yeast_init_iter, yeast_dying_iter},
- {identity_init, /*always put identity last to skip it..*/
- identity_free, identity_draw, identity_init_iter, identity_dying_iter}
-};
-
-static const Morph *select_morph()
-{
- int nmorphs = countof(morphs);
- if (crack)
- return &morphs[random() % (nmorphs-1)];
- else if (boring)
- return &morphs[nmorphs-1];
- else
- return morphs;
-}
-
-
-/***************************
- ** Trile superstructure functions.
- ** */
-
-
-static void triles_set_visible(cberg_state *cberg, Trile **root, int x, int y)
-{
- Trile *parent = NULL,
- *iter = *root;
- int goleft=0;
-
- while (iter != NULL) {
- parent = iter;
- goleft = (iter->x > x || (iter->x == x && iter->y > y));
- if (goleft)
- iter = iter->left;
- else if (iter->x == x && iter->y == y) {
- iter->visible = 1;
- return;
- } else
- iter = iter->right;
- }
-
- if (parent == NULL)
- *root = trile_new(cberg, x,y, NULL, NULL);
- else if (goleft)
- parent->left = trile_new(cberg, x,y, parent, *root);
- else
- parent->right = trile_new(cberg, x,y, parent, *root);
-}
-
-static unsigned int triles_foreach(Trile *root, void (*f)(Trile *, void *),
- void *data)
-{
- if (root == NULL)
- return 0;
-
- f(root, data);
- return 1 + triles_foreach(root->left, f, data)
- + triles_foreach(root->right, f, data);
-}
-
-static void triles_update_state(Trile **root, cberg_state *cberg)
-{
- int process_current = 1;
- if (*root == NULL)
- return;
-
- while (process_current) {
- if ( (*root)->visible ) {
- if ( (*root)->state == TRILE_INIT )
- (*root)->morph->init_iter(*root, cberg);
- else if ( (*root)->state == TRILE_DYING ) {
- (*root)->state = TRILE_INIT;
- (*root)->morph->init_iter(*root, cberg);
- } else if ( (*root)->state == TRILE_NEW )
- (*root)->state = TRILE_INIT;
-
- (*root)->visible = 0;
- } else {
- if ( (*root)->state == TRILE_STABLE )
- (*root)->state = TRILE_DYING;
- else if ( (*root)->state == TRILE_INIT ) {
- (*root)->state = TRILE_DYING;
- (*root)->morph->dying_iter(*root, cberg);
- } else if ( (*root)->state == TRILE_DYING )
- (*root)->morph->dying_iter(*root, cberg);
- }
-
- if ( (*root)->state == TRILE_DELETE ) {
- Trile *splice_me;
- process_current = 1;
-
- if ((*root)->left == NULL) {
- splice_me = (*root)->right;
- if (splice_me)
- splice_me->parent = (*root)->parent;
- else
- process_current = 0;
- } else if ((*root)->right == NULL) {
- splice_me = (*root)->left;
- splice_me->parent = (*root)->parent;
- } else {
- Trile *tmp;
- for (splice_me = (*root)->right; splice_me->left != NULL; )
- splice_me = splice_me->left;
- tmp = splice_me->right;
-
- if (tmp) tmp->parent = splice_me->parent;
-
- if (splice_me == splice_me->parent->left)
- splice_me->parent->left = tmp;
- else
- splice_me->parent->right = tmp;
-
- splice_me->parent = (*root)->parent;
- splice_me->left = (*root)->left;
- (*root)->left->parent = splice_me;
- splice_me->right = (*root)->right;
- if ((*root)->right)
- (*root)->right->parent = splice_me;
- }
- trile_free(cberg, *root);
- *root = splice_me;
- } else
- process_current = 0;
- }
-
- if (*root) {
- triles_update_state(&((*root)->left), cberg);
- triles_update_state(&((*root)->right), cberg);
- }
-}
-
-static Trile *triles_find(Trile *tr, int x, int y)
-{
- while (tr && !(tr->x == x && tr->y == y))
- if (x < tr->x || (x == tr->x && y < tr->y))
- tr = tr->left;
- else
- tr = tr->right;
- return tr;
-}
-
-
-/***************************
- ** Trile superstructure visibility functions.
- ** strategy fine, implementation lazy&retarded =/
- ** */
-
-#ifdef DEBUG
-static double x_shit, y_shit;
-#endif
-
-static void calc_points(cberg_state *cberg, double *x1,double *y1,
- double *x2,double *y2, double *x3,double *y3, double *x4,double *y4)
-{
- double zNear, x_nearcenter, y_nearcenter, nhalfwidth, x_center, y_center;
-
-
- /* could cache these.. bahhhhhhhhhhhhhh */
- double halfheight = tan(cberg->fovy / 2 * M_PI_180) * cberg->zNear;
- double fovx_2 = atan(halfheight * cberg->aspect / cberg->zNear) * M_180_PI;
- double zFar = cberg->zFar + M_RAD7_4;
- double fhalfwidth = zFar * tan(fovx_2 * M_PI_180)
- + M_RAD7_4 / cos(fovx_2 * M_PI_180);
- double x_farcenter = cberg->x + zFar * cos(cberg->yaw * M_PI_180);
- double y_farcenter = cberg->y + zFar * sin(cberg->yaw * M_PI_180);
- *x1 = x_farcenter + fhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
- *y1 = y_farcenter + fhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
- *x2 = x_farcenter - fhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
- *y2 = y_farcenter - fhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
-
-#ifdef DEBUG
- printf("pos (%.3f,%.3f) @ %.3f || fovx: %f || fovy: %f\n",
- cberg->x, cberg->y, cberg->yaw, fovx_2 * 2, cberg->fovy);
- printf("\tfarcenter: (%.3f,%.3f) || fhalfwidth: %.3f \n"
- "\tp1: (%.3f,%.3f) || p2: (%.3f,%.3f)\n",
- x_farcenter, y_farcenter, fhalfwidth, *x1, *y1, *x2, *y2);
-#endif
-
- if (cberg->z - halfheight <= 0) /* near view plane hits xy */
- zNear = cberg->zNear - M_RAD7_4;
- else /* use bottom of frustum */
- zNear = cberg->z / tan(cberg->fovy / 2 * M_PI_180) - M_RAD7_4;
- nhalfwidth = zNear * tan(fovx_2 * M_PI_180)
- + M_RAD7_4 / cos(fovx_2 * M_PI_180);
- x_nearcenter = cberg->x + zNear * cos(cberg->yaw * M_PI_180);
- y_nearcenter = cberg->y + zNear * sin(cberg->yaw * M_PI_180);
- *x3 = x_nearcenter - nhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
- *y3 = y_nearcenter - nhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
- *x4 = x_nearcenter + nhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
- *y4 = y_nearcenter + nhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
-
-#ifdef DEBUG
- printf("\tnearcenter: (%.3f,%.3f) || nhalfwidth: %.3f\n"
- "\tp3: (%.3f,%.3f) || p4: (%.3f,%.3f)\n",
- x_nearcenter, y_nearcenter, nhalfwidth, *x3, *y3, *x4, *y4);
-#endif
-
-
- /* center can be average or the intersection of diagonals.. */
-#if 0
- {
- double c = nhalfwidth * (zFar -zNear) / (fhalfwidth + nhalfwidth);
- x_center = x_nearcenter + c * cos(cberg->yaw * M_PI_180);
- y_center = y_nearcenter + c * sin(cberg->yaw * M_PI_180);
- }
-#else
- x_center = (x_nearcenter + x_farcenter) / 2;
- y_center = (y_nearcenter + y_farcenter) / 2;
-#endif
-#ifdef DEBUG
- x_shit = x_center;
- y_shit = y_center;
-#endif
-
-#define VSCALE(p) *x##p = visibility * *x##p + (1-visibility) * x_center; \
- *y##p = visibility * *y##p + (1-visibility) * y_center
-
- VSCALE(1);
- VSCALE(2);
- VSCALE(3);
- VSCALE(4);
-#undef VSCALE
-}
-
-/* this is pretty stupid.. */
-static inline void minmax4(double a, double b, double c, double d,
- double *min, double *max)
-{
- *min = *max = a;
-
- if (b > *max) *max = b;
- else if (b < *min) *min = b;
- if (c > *max) *max = c;
- else if (c < *min) *min = c;
- if (d > *max) *max = d;
- else if (d < *min) *min = d;
-}
-
-typedef struct {
- double min, max, start, dx;
-} LS;
-
-#define check_line(a, b) \
- if (fabs(y##a-y##b) > 0.001) { \
- ls[count].dx = (x##b-x##a)/(y##b-y##a); \
- if (y##b > y##a) { \
- ls[count].start = x##a; \
- ls[count].min = y##a; \
- ls[count].max = y##b; \
- } else { \
- ls[count].start = x##b; \
- ls[count].min = y##b; \
- ls[count].max = y##a; \
- } \
- ++count; \
- }
-
-static unsigned int build_ls(cberg_state *cberg,
- double x1, double y1, double x2, double y2,
- double x3, double y3, double x4, double y4, LS *ls,
- double *trough, double *peak)
-{
- unsigned int count = 0;
-
- check_line(1, 2);
- check_line(2, 3);
- check_line(3, 4);
- check_line(4, 1);
-
- minmax4(y1, y2, y3, y4, trough, peak);
- return count;
-}
-
-#undef check_line
-
-/*needs bullshit to avoid double counts on corners.*/
-static void find_bounds(double y, double *left, double *right, LS *ls,
- unsigned int nls)
-{
- double x;
- unsigned int i, set = 0;
-
- for (i = 0; i != nls; ++i)
- if (ls[i].min <= y && ls[i].max >= y) {
- x = (y - ls[i].min) * ls[i].dx + ls[i].start;
- if (!set) {
- *left = x;
- ++set;
- } else if (fabs(x - *left) > 0.001) {
- if (*left < x)
- *right = x;
- else {
- *right = *left;
- *left = x;
- }
- return;
- }
- }
-
- /* just in case we somehow blew up */
- *left = 3.0;
- *right = -3.0;
-}
-
-static void mark_visible(cberg_state *cberg)
-{
- double trough, peak, yval, left=0, right=0;
- double x1,y1, x2,y2, x3,y3, x4,y4;
- int start, stop, x, y;
- LS ls[4];
- unsigned int nls;
-
- calc_points(cberg, &x1,&y1, &x2,&y2, &x3,&y3, &x4,&y4);
- nls = build_ls(cberg, x1,y1, x2,y2, x3,y3, x4,y4, ls, &trough, &peak);
-
- start = (int) ceil(trough / M_SQRT3_2);
- stop = (int) floor(peak / M_SQRT3_2);
-
- for (y = start; y <= stop; ++y) {
- yval = y * M_SQRT3_2;
- find_bounds(yval, &left, &right, ls, nls);
- for (x = (int) ceil(left*2-1); x <= (int) floor(right*2); ++x)
- triles_set_visible(cberg, &(cberg->trile_head), x, y);
- }
-}
-
-
-/***************************
- ** color schemes
- ** */
-
-static void plain_land(cberg_state *cberg, double z)
-{ glColor3f(pow((z/0.35),4), z/0.35, pow((z/0.35),4)); }
-static void plain_water(cberg_state *cberg, double z)
-{ glColor3f(0.0, (z+0.35)*1.6, 0.8); }
-
-static void ice_land(cberg_state *cberg, double z)
-{ glColor3f((0.35 - z)/0.35, (0.35 - z)/0.35, 1.0); }
-static void ice_water(cberg_state *cberg, double z)
-{ glColor3f(0.0, (z+0.35)*1.6, 0.8); }
-
-
-static void magma_land(cberg_state *cberg, double z)
-{ glColor3f(z/0.35, z/0.2,0); }
-static void magma_lava(cberg_state *cberg, double z)
-{ glColor3f((z+0.35)*1.6, (z+0.35), 0.0); }
-
-static void vomit_solid(cberg_state *cberg, double z)
-{
- double norm = fabs(z) / 0.35;
- glColor3f(
- (1-norm) * cberg->vs0r + norm * cberg->vs1r,
- (1-norm) * cberg->vs0g + norm * cberg->vs1g,
- (1-norm) * cberg->vs0b + norm * cberg->vs1b
- );
-}
-static void vomit_fluid(cberg_state *cberg, double z)
-{
- double norm = z / -0.35;
- glColor3f(
- (1-norm) * cberg->vf0r + norm * cberg->vf1r,
- (1-norm) * cberg->vf0g + norm * cberg->vf1g,
- (1-norm) * cberg->vf0b + norm * cberg->vf1b
- );
-}
-
-
-static const Color colors[] = {
- {"plain", plain_land, plain_water, {0.0, 0.0, 0.0, 1.0}},
- {"ice", ice_land, ice_water, {0.0, 0.0, 0.0, 1.0}},
- {"magma", magma_land, magma_lava, {0.3, 0.3, 0.0, 1.0}},
- {"vomit", vomit_solid, vomit_fluid, {0.3, 0.3, 0.0, 1.0}}, /* no error! */
-};
-
-static const Color *select_color(cberg_state *cberg)
-{
- unsigned int ncolors = countof(colors);
- int idx = -1;
- if ( ! strcmp(color, "random") )
- idx = random() % ncolors;
- else {
- unsigned int i;
- for (i = 0; i != ncolors; ++i)
- if ( ! strcmp(colors[i].id, color) ) {
- idx = i;
- break;
- }
-
- if (idx == -1) {
- printf("invalid color scheme selected; valid choices are:\n");
- for (i = 0; i != ncolors; ++i)
- printf("\t%s\n", colors[i].id);
- printf("\t%s\n", "random");
- idx = 0;
- }
- }
-
- if ( ! strcmp(colors[idx].id, "vomit") ) { /* need to create it (ghetto) */
- cberg->vs0r = random()/(double)RAND_MAX;
- cberg->vs0g = random()/(double)RAND_MAX;
- cberg->vs0b = random()/(double)RAND_MAX;
- cberg->vs1r = random()/(double)RAND_MAX;
- cberg->vs1g = random()/(double)RAND_MAX;
- cberg->vs1b = random()/(double)RAND_MAX;
- cberg->vf0r = random()/(double)RAND_MAX;
- cberg->vf0g = random()/(double)RAND_MAX;
- cberg->vf0b = random()/(double)RAND_MAX;
- cberg->vf1r = random()/(double)RAND_MAX;
- cberg->vf1g = random()/(double)RAND_MAX;
- cberg->vf1b = random()/(double)RAND_MAX;
-
- glClearColor(random()/(double)RAND_MAX,
- random()/(double)RAND_MAX,
- random()/(double)RAND_MAX,
- 1.0);
- } else {
- glClearColor(colors[idx].bg[0],
- colors[idx].bg[1],
- colors[idx].bg[2],
- colors[idx].bg[3]);
- }
- return colors + idx;
-}
-
-
-/***************************
- ** misc helper functions
- ** */
-
-
-/* simple one for now.. */
-static inline double drunken_rando(double cur_val, double max, double width)
-{
- double r = random() / (double) RAND_MAX * 2;
- if (cur_val > 0)
- if (r >= 1)
- return cur_val + (r-1) * width * (1-cur_val/max);
- else
- return cur_val - r * width;
- else
- if (r >= 1)
- return cur_val - (r-1) * width * (1+cur_val/max);
- else
- return cur_val + r * width;
-}
-
-
-/***************************
- ** core crackberg routines
- ** */
-
-ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h);
-
-ENTRYPOINT void init_crackberg (ModeInfo *mi)
-{
- cberg_state *cberg;
-
- nsubdivs %= 16; /* just in case.. */
-
- MI_INIT(mi, cbergs);
-
- if (visibility > 1.0 || visibility < 0.2) {
- printf("visibility must be in range [0.2 .. 1.0]\n");
- visibility = 1.0;
- }
-
- cberg = &cbergs[MI_SCREEN(mi)];
-
- cberg->epoints = 1 + (1 << nsubdivs);
- cberg->tpoints = cberg->epoints * (cberg->epoints + 1) / 2;
- cberg->ntris = (1 << (nsubdivs << 1));
- cberg->tnorms = ( (flat) ? cberg->ntris : cberg->tpoints);
- cberg->dx0 = 1.0 / (1 << nsubdivs);
-
- cberg->heights = malloc(cberg->tpoints * sizeof(double));
- cberg->norms = malloc(3 * cberg->tnorms * sizeof(double));
-
- cberg->glx_context = init_GL(mi);
- cberg->motion_state = MOTION_AUTO;
- cberg->mspeed = 1.0;
- cberg->z = 0.5;
-
- cberg->fovy = 60.0;
- cberg->zNear = 0.5;
- cberg->zFar = 5.0;
-
- cberg->draw_elapsed = 1.0;
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glShadeModel((flat) ? GL_FLAT : GL_SMOOTH);
-# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- glPolygonMode(GL_FRONT_AND_BACK, (MI_IS_WIREFRAME(mi)) ? GL_LINE : GL_FILL);
-# endif
-
- if (lit) {
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_COLOR_MATERIAL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
- glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
- glEnable(GL_NORMALIZE);
- glEnable(GL_RESCALE_NORMAL);
- }
-
- cberg->color = select_color(cberg);
-
- reshape_crackberg(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-}
-
-ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h)
-{
- int h2;
- cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
-
- if (letterbox && (h2 = w * 9 / 16) < h) {
- glViewport(0, (h-h2)/2, w, h2);
- cberg->aspect = w/(double)h2;
- } else {
- glViewport (0, 0, w, h);
- cberg->aspect = w/(double)h;
- }
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(cberg->fovy, cberg->aspect, cberg->zNear, cberg->zFar);
- glMatrixMode(GL_MODELVIEW);
-}
-
-ENTRYPOINT Bool crackberg_handle_event (ModeInfo *mi, XEvent *ev)
-{
- cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
- KeySym keysym = 0;
- char c = 0;
- if (ev->xany.type == KeyPress || ev->xany.type == KeyRelease)
- XLookupString (&ev->xkey, &c, 1, &keysym, 0);
-
- if (ev->xany.type == KeyPress) {
- switch (keysym) {
- case XK_Left: cberg->motion_state |= MOTION_LROT; break;
- case XK_Prior: cberg->motion_state |= MOTION_LROT; break;
- case XK_Right: cberg->motion_state |= MOTION_RROT; break;
- case XK_Next: cberg->motion_state |= MOTION_RROT; break;
- case XK_Down: cberg->motion_state |= MOTION_BACK; break;
- case XK_Up: cberg->motion_state |= MOTION_FORW; break;
- case '1': cberg->motion_state |= MOTION_DEC; break;
- case '2': cberg->motion_state |= MOTION_INC; break;
- case 'a': cberg->motion_state |= MOTION_LEFT; break;
- case 'd': cberg->motion_state |= MOTION_RIGHT; break;
- case 's': cberg->motion_state |= MOTION_BACK; break;
- case 'w': cberg->motion_state |= MOTION_FORW; break;
- default: return False;
- }
- cberg->motion_state |= MOTION_MANUAL;
- } else if (ev->xany.type == KeyRelease) {
-#if 0
- XEvent peek_ev;
- if (XPending(mi->dpy)) {
- XPeekEvent(mi->dpy, &peek_ev);
- if (peek_ev.type == KeyPress
- && peek_ev.xkey.keycode == ev->xkey.keycode
- && peek_ev.xkey.time - ev->xkey.time < 2) {
- XNextEvent(mi->dpy, &peek_ev); /* drop bullshit repeat events */
- return False;
- }
- }
-#endif
-
- switch (keysym) {
- case XK_Left: cberg->motion_state &= ~MOTION_LROT; break;
- case XK_Prior: cberg->motion_state &= ~MOTION_LROT; break;
- case XK_Right: cberg->motion_state &= ~MOTION_RROT; break;
- case XK_Next: cberg->motion_state &= ~MOTION_RROT; break;
- case XK_Down: cberg->motion_state &= ~MOTION_BACK; break;
- case XK_Up: cberg->motion_state &= ~MOTION_FORW; break;
- case '1': cberg->motion_state &= ~MOTION_DEC; break;
- case '2': cberg->motion_state &= ~MOTION_INC; break;
- case 'a': cberg->motion_state &= ~MOTION_LEFT; break;
- case 'd': cberg->motion_state &= ~MOTION_RIGHT; break;
- case 's': cberg->motion_state &= ~MOTION_BACK; break;
- case 'w': cberg->motion_state &= ~MOTION_FORW; break;
- case ' ':
- if (cberg->motion_state == MOTION_MANUAL)
- cberg->motion_state = MOTION_AUTO;
- break;
- default: return False;
- }
- } else if (ev->xany.type == ButtonPress &&
- ev->xbutton.button == Button1) {
- cberg->button_down_p = True;
- cberg->mouse_x = ev->xbutton.x;
- cberg->mouse_y = ev->xbutton.y;
- cberg->motion_state = MOTION_MANUAL;
- cberg->paused.tv_sec = 0;
- } else if (ev->xany.type == ButtonRelease &&
- ev->xbutton.button == Button1) {
- cberg->button_down_p = False;
- cberg->motion_state = MOTION_AUTO;
- /* After mouse-up, don't go back into auto-motion mode for a second, so
- that repeated click-and-drag gestures don't fight with auto-motion. */
- gettimeofday(&cberg->paused, NULL);
- } else if (ev->xany.type == MotionNotify &&
- cberg->button_down_p) {
- int dx = ev->xmotion.x - cberg->mouse_x;
- int dy = ev->xmotion.y - cberg->mouse_y;
- cberg->mouse_x = ev->xmotion.x;
- cberg->mouse_y = ev->xmotion.y;
- cberg->motion_state = MOTION_MANUAL;
-
- /* Take the larger dimension, since motion_state doesn't scale */
- if (dx > 0 && dx > dy) dy = 0;
- if (dx < 0 && dx < dy) dy = 0;
- if (dy > 0 && dy > dx) dx = 0;
- if (dy < 0 && dy < dx) dx = 0;
-
- {
- int rot = current_device_rotation();
- int swap;
- while (rot <= -180) rot += 360;
- while (rot > 180) rot -= 360;
- if (rot > 135 || rot < -135) /* 180 */
- dx = -dx, dy = -dy;
- else if (rot > 45) /* 90 */
- swap = dx, dx = -dy, dy = swap;
- else if (rot < -45) /* 270 */
- swap = dx, dx = dy, dy = -swap;
- }
-
- if (dx > 0) cberg->motion_state |= MOTION_LEFT;
- else if (dx < 0) cberg->motion_state |= MOTION_RIGHT;
- else if (dy > 0) cberg->motion_state |= MOTION_FORW;
- else if (dy < 0) cberg->motion_state |= MOTION_BACK;
- } else
- return False;
- return True;
-}
-
-ENTRYPOINT void draw_crackberg (ModeInfo *mi)
-{
- cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
- struct timeval cur_frame_t;
- double cur_frame;
- static const float lpos[] = {2.0,0.0,-0.3,0.0};
-
- if (!cberg->glx_context) /*XXX does this get externally tweaked? it kinda*/
- return; /*XXX can't.. check it in crackberg_init*/
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cberg->glx_context);
-
- gettimeofday(&cur_frame_t, NULL);
- cur_frame = cur_frame_t.tv_sec + cur_frame_t.tv_usec / 1.0E6;
- if ( cberg->prev_frame ) { /*not first run */
-
- cberg->elapsed = cur_frame - cberg->prev_frame;
-
- if (cberg->motion_state == MOTION_AUTO &&
- cberg->paused.tv_sec < cur_frame_t.tv_sec) {
- cberg->x += cberg->dx * cberg->elapsed;
- cberg->y += cberg->dy * cberg->elapsed;
- /* cberg->z */
- /* cberg->pitch */
- /* cberg->roll */
- cberg->yaw += cberg->dyaw * cberg->elapsed;
-
- cberg->draw_elapsed += cberg->elapsed;
- if (cberg->draw_elapsed >= 0.8) {
- cberg->draw_elapsed = 0.0;
- cberg->dx = drunken_rando(cberg->dx, 2.5, 0.8);
- cberg->dy = drunken_rando(cberg->dy, 2.5, 0.8);
- /* cberg->dz */
- /* cberg->dpitch */
- /* cberg->droll */
- cberg->dyaw = drunken_rando(cberg->dyaw, 40.0, 8.0);
- }
- } else {
- double scale = cberg->elapsed * cberg->mspeed;
- if (cberg->motion_state & MOTION_BACK) {
- cberg->x -= cos(cberg->yaw * M_PI_180) * scale;
- cberg->y -= sin(cberg->yaw * M_PI_180) * scale;
- }
- if (cberg->motion_state & MOTION_FORW) {
- cberg->x += cos(cberg->yaw * M_PI_180) * scale;
- cberg->y += sin(cberg->yaw * M_PI_180) * scale;
- }
-
- if (cberg->motion_state & MOTION_LEFT) {
- cberg->x -= sin(cberg->yaw * M_PI_180) * scale;
- cberg->y += cos(cberg->yaw * M_PI_180) * scale;
- }
- if (cberg->motion_state & MOTION_RIGHT) {
- cberg->x += sin(cberg->yaw * M_PI_180) * scale;
- cberg->y -= cos(cberg->yaw * M_PI_180) * scale;
- }
-
- if (cberg->motion_state & MOTION_LROT)
- cberg->yaw += 45 * scale;
- if (cberg->motion_state & MOTION_RROT)
- cberg->yaw -= 45 * scale;
-
- if (cberg->motion_state & MOTION_DEC)
- cberg->mspeed /= pow(MSPEED_SCALE, cberg->draw_elapsed);
- if (cberg->motion_state & MOTION_INC)
- cberg->mspeed *= pow(MSPEED_SCALE, cberg->draw_elapsed);
-
- }
- }
- cberg->prev_frame = cur_frame;
-
- mark_visible(cberg);
- triles_update_state(&(cberg->trile_head), cberg);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glRotatef(current_device_rotation(), 0, 0, 1);
- gluLookAt(0,0,0, 1,0,0, 0,0,1);
- glLightfv(GL_LIGHT0, GL_POSITION, lpos);
- /*glRotated(cberg->roll, 1,0,0); / * XXX blah broken and unused for now..* /
- glRotated(cberg->pitch, 0,1,0); */
- glRotated(-cberg->yaw, 0,0,1); /* camera sees ->yaw over */
- glTranslated(-cberg->x, -cberg->y, -cberg->z);
-
- mi->polygon_count = cberg->ntris *
- triles_foreach(cberg->trile_head, trile_draw,(void *) cberg);
-
- if (mi->fps_p)
- do_fps(mi);
-
-#ifdef DEBUG
- glBegin(GL_LINES);
- glColor3f(1.0,0.0,0.0);
- glVertex3d(x_shit, y_shit, 0.0);
- glVertex3d(x_shit, y_shit, 1.0);
- glEnd();
-#endif
-
- glFinish();
- glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
-}
-
-/* uh */
-ENTRYPOINT void free_crackberg (ModeInfo *mi)
-{
- cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
- if (!cberg->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cberg->glx_context);
- while (cberg->all_triles) {
- Trile *n = cberg->all_triles;
- cberg->all_triles = n->next0;
- free (n->l);
- if (n->morph_data) free (n->morph_data);
- free (n);
- }
- if (cberg->norms) free(cberg->norms);
- if (cberg->heights) free(cberg->heights);
-}
-
-XSCREENSAVER_MODULE ("Crackberg", crackberg)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/crackberg.man b/hacks/glx/crackberg.man
deleted file mode 100644
index a633951..0000000
--- a/hacks/glx/crackberg.man
+++ /dev/null
@@ -1,123 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-crackberg \- Lose your way wandering some height fields, and enjoy candy.
-.SH SYNOPSIS
-.B crackberg
-[\-root]
-[\-window]
-[\-install]
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window-id \fIid\fP]
-[\-delay \fIusecs\fP]
-[\-fps]
-[\-crack]
-[\-lit]
-[\-boring]
-[\-letterbox]
-[\-flat]
-[\-wire]
-[\-nowater]
-[\-visibility \fIfloat\fP]
-[\-color \fIstring\fP]
-[\-nsubdivs \fIinteger\fP]
-.SH DESCRIPTION
-Flies through height maps, optionally animating the instantiation and
-destruction of generated tiles; by default, tiles 'grow' into place (height
-gradually increased up to correct value). In windowed mode the following key
-controls are available:
-.TP 8
-.B left, right
-Turn left and right.
-.TP 8
-.B a,w,s,d
-Move left, forwards, backwards, and to the right, respectively.
-.TP 8
-.B 1,2
-Decrease and increase manual speed, respectively.
-.TP 8
-.B Spacebar
-Return to automatic control.
-.SH OPTIONS
-.I crackberg
-accepts the following options:
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual
-class, or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Delay between frames; default 20000 (1/50th of a second).
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-crack
-Use all possible methods to animate tile instantiation.
-.TP 8
-.B \-boring
-Do not animate instatiation at all; use this to get standard landscape
-generator behavior.
-.TP 8
-.B \-letterbox
-Drawable window region has a 16:9 aspect ratio, regardless of actual
-window size.
-.TP 8
-.B \-lit
-Enable lighting.
-.TP 8
-.B \-flat
-Flat shading (OpenGL will use one color per primitive, rather than
-interpolating betwixt vertices).
-.TP 8
-.B \-wire
-Wireframe.
-.TP 8
-.B \-nowater
-Do not display 'water' (forces negative values to zero, and selects a
-different coloring method).
-.TP 8
-.B \-visibility \fIfloat\fP
-Value in range [0.2,1.0] (default 0.6) specifying proportion of viewable
-XY plane which is to be drawn upon.
-.TP 8
-.B \-color \fIstring\fP
-Selects color scheme. Use with no or bogus argument for current list.
-.TP 8
-.B \-nsubdivs \fIinteger\fP
-Number of times to recursively subdivide each triangular tile. Each
-increment increases total triangles by a factor of 4; for instance the default
-setting 4 results in 256 triangles per tile.
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2005 by Matus Telgarsky. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Matus Telgarsky <catachresis@cmu.edu>, 2005.
diff --git a/hacks/glx/crumbler.c b/hacks/glx/crumbler.c
deleted file mode 100644
index fccee8d..0000000
--- a/hacks/glx/crumbler.c
+++ /dev/null
@@ -1,922 +0,0 @@
-/* crumbler, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_crumbler 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "rotator.h"
-#include "quickhull.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_DENSITY "1.0"
-#define DEF_FRACTURE "0"
-
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-typedef struct {
- qh_vertex_t *verts; /* interior point cloud */
- int nverts, onverts;
- qh_vertex_t min, max; /* enclosing box */
- qh_vertex_t mid, vec;
- int polygon_count;
- GLuint dlist;
- int color;
- int color_shift;
-} chunk;
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- enum { IDLE, SPLIT, PAUSE, FLEE, ZOOM } state;
- GLfloat tick;
- Bool button_down_p;
- int nchunks;
- chunk **chunks;
- chunk *ghost;
-
- int ncolors;
- XColor *colors;
-} crumbler_configuration;
-
-static crumbler_configuration *bps = NULL;
-
-static Bool do_spin;
-static GLfloat speed;
-static GLfloat density;
-static int fracture;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-density", ".density", XrmoptionSepArg, 0 },
- { "-fracture",".fracture",XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" }
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&density, "density", "Density", DEF_DENSITY, t_Float},
- {&fracture, "fracture","Fracture",DEF_FRACTURE,t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt crumbler_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Create a roughly spherical cloud of N random points.
- */
-static void
-make_point_cloud (qh_vertex_t *verts, int nverts)
-{
- int i = 0;
- while (i < nverts)
- {
- verts[i].x = (0.5 - frand(1.0));
- verts[i].y = (0.5 - frand(1.0));
- verts[i].z = (0.5 - frand(1.0));
- if ((verts[i].x * verts[i].x +
- verts[i].y * verts[i].y +
- verts[i].z * verts[i].z)
- < 0.25)
- i++;
- }
-}
-
-static void crumbler_oom (void)
-{
-# ifdef HAVE_JWXYZ
- jwxyz_abort ("%s: out of memory, try reducing 'density'", progname);
-# else
- fprintf (stderr, "%s: out of memory, try reducing 'density'\n", progname);
- exit (1);
-# endif
-}
-
-
-static chunk *
-make_chunk (void)
-{
- chunk *c = (chunk *) calloc (1, sizeof(*c));
- if (!c) crumbler_oom();
- c->dlist = glGenLists (1);
- c->color_shift = 1 + (random() % 3) * RANDSIGN();
- return c;
-}
-
-/* Return False if out of memory */
-static Bool
-render_chunk (ModeInfo *mi, chunk *c)
-{
- int wire = MI_IS_WIREFRAME(mi);
- int i, j;
- qh_mesh_t m;
- GLfloat d;
-
- if (c->nverts <= 3)
- {
- fprintf (stderr, "%s: nverts %d\n", progname, c->nverts);
- abort();
- }
-
- c->polygon_count = 0;
- c->min.x = c->min.y = c->min.z = 999999;
- c->max.x = c->max.y = c->max.z = -999999;
-
- for (i = 0; i < c->nverts; i++)
- {
- if (c->verts[i].x < c->min.x) c->min.x = c->verts[i].x;
- if (c->verts[i].y < c->min.y) c->min.y = c->verts[i].y;
- if (c->verts[i].z < c->min.z) c->min.z = c->verts[i].z;
- if (c->verts[i].x > c->max.x) c->max.x = c->verts[i].x;
- if (c->verts[i].y > c->max.y) c->max.y = c->verts[i].y;
- if (c->verts[i].z > c->max.z) c->max.z = c->verts[i].z;
- }
-
- c->mid.x = (c->max.x + c->min.x) / 2;
- c->mid.y = (c->max.y + c->min.y) / 2;
- c->mid.z = (c->max.z + c->min.z) / 2;
-
- /* midpoint as normalized vector from origin */
- d = sqrt (c->mid.x * c->mid.x +
- c->mid.y * c->mid.y +
- c->mid.z * c->mid.z);
- c->vec.x = c->mid.x / d;
- c->vec.y = c->mid.y / d;
- c->vec.z = c->mid.z / d;
-
- if (c->nverts <= 3)
- {
- fprintf (stderr, "%s: nverts %d\n", progname, c->nverts);
- abort();
- }
-
- m = qh_quickhull3d (c->verts, c->nverts);
-
- if (!m.vertices) /* out of memory */
- {
- qh_free_mesh (m);
- return False;
- }
-
- glNewList (c->dlist, GL_COMPILE);
- if (! wire) glBegin (GL_TRIANGLES);
- for (i = 0, j = 0; i < m.nindices; i += 3, j++)
- {
- qh_vertex_t *v0 = &m.vertices[m.indices[i+0]];
- qh_vertex_t *v1 = &m.vertices[m.indices[i+1]];
- qh_vertex_t *v2 = &m.vertices[m.indices[i+2]];
- qh_vec3_t *n = &m.normals[m.normalindices[j]];
-
- if (i+2 >= m.nindices) abort();
- if (j >= m.nnormals) abort();
-
- glNormal3f (n->x, n->y, n->z);
- if (wire) glBegin(GL_LINE_LOOP);
- glVertex3f (v0->x, v0->y, v0->z);
- glVertex3f (v1->x, v1->y, v1->z);
- glVertex3f (v2->x, v2->y, v2->z);
- if (wire) glEnd();
- c->polygon_count++;
- }
- if (! wire) glEnd();
-
- if (wire)
- {
- glPointSize (1);
- glColor3f (0, 1, 0);
- glBegin (GL_POINTS);
- for (i = 0; i < c->nverts; i++)
- {
- if (i > 0 && i == c->onverts)
- {
- glEnd();
- glColor3f (1, 0, 0);
- glBegin (GL_POINTS);
- }
- glVertex3f (c->verts[i].x, c->verts[i].y, c->verts[i].z);
- }
- glEnd();
- }
-
- glEndList();
-
- qh_free_mesh (m);
- return True;
-}
-
-
-static void
-free_chunk (chunk *c)
-{
- if (c->dlist)
- glDeleteLists (c->dlist, 1);
- free (c->verts);
- free (c);
-}
-
-
-/* Make sure the chunk contains at least N points.
- As we subdivide, the number of points is reduced.
- This adds new points to the interior that do not
- affect the shape of the outer hull.
- */
-static void
-pad_chunk (chunk *c, int min)
-{
- /* Allocate a new array of size N
- Copy the old points into it
- while size < N
- pick two random points
- add a point that is somewhere along the line between them
- (that point will still be inside the old hull)
- */
- qh_vertex_t *verts;
- int i;
- if (c->nverts >= min) return;
- if (c->nverts <= 3) abort();
- verts = (qh_vertex_t *) calloc (min, sizeof(*verts));
- if (!verts) crumbler_oom();
- memcpy (verts, c->verts, c->nverts * sizeof(*verts));
- i = c->nverts;
- while (i < min)
- {
- qh_vertex_t v;
- int j0, j1;
- GLfloat r;
- j0 = random() % c->nverts;
- do {
- j1 = random() % c->nverts;
- } while (j0 == j1);
-
- r = 0.2 + frand(0.6);
-# undef R
-# define R(F) v.F = c->verts[j0].F + \
- r * (fabs (c->verts[j1].F - c->verts[j0].F)) \
- * (c->verts[j0].F > c->verts[j1].F ? -1 : 1)
- R(x);
- R(y);
- R(z);
-# undef R
-
- /* Sometimes quickhull.c is giving us concave and un-closed polygons.
- Maybe it gets confused if there are duplicate points? So reject
- this point if it is within epsilon of any earlier point.
- */
-# if 0 /* Nope, that's not it. */
- {
- Bool ok = True;
- int j;
- for (j = 0; j < i; j++)
- {
-
- double X = c->verts[j].x - v.x;
- double Y = c->verts[j].y - v.y;
- double Z = c->verts[j].z - v.z;
- double d2 = X*X + Y*Y + Z*Z;
- if (d2 < 0.0001)
- {
- /* fprintf (stderr, "## REJ %f\n",d2); */
- ok = False;
- break;
- }
- }
- if (! ok) continue;
- }
-# endif
-
- verts[i++] = v;
- }
-
-#if 0
- fprintf (stdout, " int n = %d;\n", min);
- fprintf (stdout, " qh_vertex_t v[] = {");
- for (i = 0; i < min; i++)
- fprintf(stdout,"{%f,%f,%f},", verts[i].x, verts[i].y, verts[i].z);
- fprintf (stdout, "};\n\n");
-#endif
-
- free (c->verts);
- c->verts = verts;
- c->onverts = c->nverts;
- c->nverts = min;
-
-#if 0
- qh_vertex_t *verts2 = (qh_vertex_t *) calloc (n, sizeof(*verts2));
- if (!verts2) crumbler_oom();
- memcpy (verts2, v, n * sizeof(*verts2));
- free (c->verts);
- c->verts = verts2;
- c->onverts = 0;
- c->nverts = n;
-#endif
-}
-
-
-/* Returns a list of N new chunks.
- */
-static chunk **
-split_chunk (ModeInfo *mi, chunk *c, int nchunks)
-{
- /* Pick N key-points from the cloud.
- Create N new chunks.
- For each old point:
- It goes in chunk N if it is closest to key-point N.
- Free old chunk.
- for each new chunk
- render_chunk
- */
- crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
- chunk **chunks;
- int *keys;
- int i, j;
- int retries = 0;
-
- RETRY:
- chunks = (chunk **) calloc (nchunks, sizeof(*chunks));
- if (!chunks) crumbler_oom();
- keys = (int *) calloc (nchunks, sizeof(*keys));
- if (!keys) crumbler_oom();
-
- for (i = 0; i < nchunks; i++)
- {
- /* Fill keys with random numbers that are not duplicates. */
- Bool ok = True;
- chunk *c2 = 0;
- if (nchunks >= c->nverts)
- {
- fprintf (stderr, "%s: nverts %d nchunks %d\n", progname,
- c->nverts, nchunks);
- abort();
- }
- do {
- keys[i] = random() % c->nverts;
- ok = True;
- for (j = 0; j < i; j++)
- if (keys[i] == keys[j])
- {
- ok = False;
- break;
- }
- } while (!ok);
-
- c2 = make_chunk();
- chunks[i] = c2;
- chunks[i]->nverts = 0;
- c2->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c2->verts));
- if (!c2->verts) crumbler_oom();
- c2->color = (c->color + (random() % (1 + (bp->ncolors / 3))))
- % bp->ncolors;
- }
-
- /* Add the verts to the approprate chunks
- */
- for (i = 0; i < c->nverts; i++)
- {
- qh_vertex_t *v0 = &c->verts[i];
- int target_chunk = -1;
- double target_d2 = 9999999;
- chunk *c2 = 0;
-
- for (j = 0; j < nchunks; j++)
- {
- qh_vertex_t *v1 = &c->verts[keys[j]];
- double X = v1->x - v0->x;
- double Y = v1->y - v0->y;
- double Z = v1->z - v0->z;
- double d2 = X*X + Y*Y + Z*Z;
- if (d2 < target_d2)
- {
- target_d2 = d2;
- target_chunk = j;
- }
- }
- if (target_chunk == -1) abort();
-
- c2 = chunks[target_chunk];
- c2->verts[c2->nverts++] = *v0;
- if (c2->nverts > c->nverts) abort();
- }
-
- free (keys);
- keys = 0;
-
- for (i = 0; i < nchunks; i++)
- {
- chunk *c2 = chunks[i];
-
- /* It is possible that the keys we have chosen have resulted in one or
- more cells that have 3 or fewer points in them. If that's the case,
- re-randomize.
- */
- if (c2->nverts <= 3)
- {
- for (j = 0; j < nchunks; j++)
- free_chunk (chunks[j]);
- free (chunks);
- chunks = 0;
- if (retries++ > 100)
- {
- fprintf(stderr, "%s: unsplittable\n", progname);
- abort();
- }
- goto RETRY;
- }
-
- if (i == 0) /* The one we're gonna keep */
- pad_chunk (c2, c->nverts);
- if (! render_chunk (mi, c2))
- crumbler_oom(); /* We are too far in to recover from this */
- }
-
- return chunks;
-}
-
-
-static void
-tick_crumbler (ModeInfo *mi)
-{
- crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat ts;
-
- if (bp->button_down_p) return;
-
- switch (bp->state) {
- case IDLE: ts = 0.02; break;
- case SPLIT: ts = 0.01; break;
- case PAUSE: ts = 0.008; break;
- case FLEE: ts = 0.005; break;
- case ZOOM: ts = 0.03; break;
- default: abort(); break;
- }
-
- bp->tick += ts * speed;
-
- if (bp->tick < 1) return;
-
- bp->tick = 0;
- bp->state = (bp->state + 1) % (ZOOM + 1);
-
- switch (bp->state) {
- case IDLE:
- {
- chunk *c = bp->chunks[0];
- int i;
-
- /* We already animated it zooming to full size. Now make it real. */
- GLfloat X = (c->max.x - c->min.x);
- GLfloat Y = (c->max.y - c->min.y);
- GLfloat Z = (c->max.z - c->min.z);
- GLfloat s = 1 / MAX(X, MAX(Y, Z));
-
- for (i = 0; i < c->nverts; i++)
- {
- c->verts[i].x *= s;
- c->verts[i].y *= s;
- c->verts[i].z *= s;
- }
-
- /* Re-render it to move the verts in the display list too.
- This also recomputes min, max and mid.
- */
- if (! render_chunk (mi, c))
- crumbler_oom(); /* We are too far in to recover from this */
- break;
- }
-
- case SPLIT:
- {
- chunk *c = bp->chunks[0];
- int frac = (fracture >= 2 ? fracture : 2 + (2 * (random() % 5)));
- chunk **chunks = split_chunk (mi, c, frac);
- if (bp->nchunks != 1) abort();
- if (bp->ghost) abort();
- bp->ghost = c;
- free (bp->chunks);
- bp->chunks = chunks;
- bp->nchunks = frac;
- break;
- }
-
- case PAUSE:
- break;
-
- case FLEE:
- if (bp->ghost) free_chunk (bp->ghost);
- bp->ghost = 0;
- break;
-
- case ZOOM:
- {
- chunk *c = bp->chunks[0];
- int i;
- for (i = 1; i < bp->nchunks; i++)
- free_chunk (bp->chunks[i]);
- bp->nchunks = 1;
-
- /* We already animated the remaining chunk moving toward the origin.
- Make it real.
- */
- for (i = 0; i < c->nverts; i++)
- {
- c->verts[i].x -= c->mid.x;
- c->verts[i].y -= c->mid.y;
- c->verts[i].z -= c->mid.z;
- }
-
- /* Re-render it to move the verts in the display list too.
- This also recomputes min, max and mid (now 0).
- */
- if (! render_chunk (mi, c))
- crumbler_oom(); /* We are too far in to recover from this */
- break;
- }
-
- default: abort(); break;
- }
-}
-
-
-static GLfloat
-ease_fn (GLfloat r)
-{
- return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
-}
-
-
-static GLfloat
-ease_ratio (GLfloat r)
-{
- GLfloat ease = 0.35;
- if (r <= 0) return 0;
- else if (r >= 1) return 1;
- else if (r <= ease) return ease * ease_fn (r / ease);
- else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
- else return r;
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_crumbler (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-crumbler_handle_event (ModeInfo *mi, XEvent *event)
-{
- crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_crumbler (ModeInfo *mi)
-{
- crumbler_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_crumbler (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- {
- double spin_speed = 0.5 * speed;
- double spin_accel = 0.3;
- double wander_speed = 0.01 * speed;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- bp->trackball = gltrackball_init (True);
- }
-
- bp->ncolors = 1024;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- if (!bp->colors) crumbler_oom();
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
-
- /* brighter colors, please... */
- for (i = 0; i < bp->ncolors; i++)
- {
-# undef R
-# define R(F) F = 65535 * (0.3 + 0.7 * ((F) / 65535.0))
- R (bp->colors[i].red);
- R (bp->colors[i].green);
- R (bp->colors[i].blue);
-# undef R
- }
-
- {
- double d2 = density;
- chunk *c;
-
- bp->nchunks = 1;
- bp->chunks = (chunk **) calloc (bp->nchunks, sizeof(*bp->chunks));
- if (! bp->chunks) crumbler_oom();
-
- c = make_chunk();
- if (! c) crumbler_oom();
-
- bp->chunks[0] = c;
-
- while (1)
- {
- c->nverts = 4500 * d2;
- c->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c->verts));
- if (c->verts)
- {
- make_point_cloud (c->verts, c->nverts);
-
- /* Let's shrink it to a point then zoom in. */
- bp->state = ZOOM;
- bp->tick = 0;
- for (i = 0; i < c->nverts; i++)
- {
- c->verts[i].x /= 500;
- c->verts[i].y /= 500;
- c->verts[i].z /= 500;
- }
-
- if (! render_chunk (mi, c))
- {
- free (c->verts);
- c->verts = 0;
- }
- }
-
- if (c->verts)
- break;
-
- if (d2 < 0.1)
- crumbler_oom();
- d2 *= 0.9;
- }
-
- if (density != d2)
- fprintf (stderr,
- "%s: out of memory: reduced density from %.01f to %0.1f\n",
- progname, density, d2);
- }
-}
-
-
-static void
-draw_chunk (ModeInfo *mi, chunk *c, GLfloat alpha)
-{
- crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat color[4];
-
- color[0] = bp->colors[c->color].red / 65536.0;
- color[1] = bp->colors[c->color].green / 65536.0;
- color[2] = bp->colors[c->color].blue / 65536.0;
- color[3] = alpha;
- glColor4fv (color);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
-
- c->color += c->color_shift;
- while (c->color < 0) c->color += bp->ncolors;
- while (c->color >= bp->ncolors) c->color -= bp->ncolors;
-
- glCallList (c->dlist);
- mi->polygon_count += c->polygon_count;
-}
-
-
-ENTRYPOINT void
-draw_crumbler (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GLfloat alpha = 1;
- int i;
-
- static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat bshiny = 128.0;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- tick_crumbler (mi);
-
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 15);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- mi->polygon_count = 0;
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
-
- if (do_wander)
- glScalef (10, 10, 10);
- else
- glScalef (13, 13, 13);
-
- alpha = 1;
- for (i = 0; i < bp->nchunks; i++)
- {
- chunk *c = bp->chunks[i];
-
- glPushMatrix();
-
- switch (bp->state) {
- case FLEE:
- {
- GLfloat r = ease_ratio (bp->tick);
- /* Move everybody toward the origin, so that chunk #0 ends up
- centered there. */
- glTranslatef (-r * c->mid.x,
- -r * c->mid.y,
- -r * c->mid.z);
- if (i != 0)
- {
- /* Move this chunk away from the center, along a vector from
- the origin to its midpoint. */
- GLfloat d2 = r * 6;
- glTranslatef (c->vec.x * d2, c->vec.y * d2, c->vec.z * d2);
- alpha = 1 - r;
- }
- }
- break;
-
- case ZOOM:
- {
- chunk *c = bp->chunks[0];
- GLfloat X = (c->max.x - c->min.x);
- GLfloat Y = (c->max.y - c->min.y);
- GLfloat Z = (c->max.z - c->min.z);
- GLfloat size0 = MAX(X, MAX(Y, Z));
- GLfloat size1 = 1.0;
- GLfloat r = 1 - ease_ratio (bp->tick);
- GLfloat s = 1 / (size0 + r * (size1 - size0));
- glScalef (s, s, s);
- }
- break;
-
- default:
- break;
- }
-
- draw_chunk (mi, c, alpha);
- glPopMatrix();
- }
-
- /* Draw the old one, fading out. */
- if (!wire && bp->state == SPLIT && bp->ghost)
- {
- GLfloat s;
- /* alpha = 1 - bp->tick; */
- alpha = 1;
- /* s = 0.7 + (0.3 * ease_ratio (1-bp->tick)); */
- s = 2 * ease_ratio ((1-bp->tick) / 2);
- s *= 1.01;
- glScalef (s, s, s);
- draw_chunk (mi, bp->ghost, alpha);
- }
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_crumbler (ModeInfo *mi)
-{
- crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->colors) free (bp->colors);
- for (i = 0; i < bp->nchunks; i++)
- free_chunk (bp->chunks[i]);
- if (bp->chunks) free (bp->chunks);
-}
-
-
-XSCREENSAVER_MODULE ("Crumbler", crumbler)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/crumbler.man b/hacks/glx/crumbler.man
deleted file mode 100644
index 629e513..0000000
--- a/hacks/glx/crumbler.man
+++ /dev/null
@@ -1,77 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-crumbler \- voronoi divisions of a sphere.
-.SH SYNOPSIS
-.B crumbler
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-density \fInumber\fP]
-[\-fracture \fInumber\fP]
-[\-no-wander]
-[\-no-spin]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Randomly subdivides a ball into voronoi chunks, then further subdivides one
-of the remaining pieces.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-density \fInumber\fP
-Density of the polygons mesh. 2.0 means twice as dense, 0.5 means half.
-.TP 8
-.B \-fracture \fInumber\fP
-How many times to fracture each object. 0 means random.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the object should spin.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c
deleted file mode 100644
index 7a1abcb..0000000
--- a/hacks/glx/cube21.c
+++ /dev/null
@@ -1,942 +0,0 @@
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Cube 21 - a Rubik-like puzzle. It changes its shape and has more than
- * 200 configurations. It is known better as Square-1, but it is called
- * Cube 21 in the Czech republic, where it was invented in 1992.
- *
- * This file is derived from cage.c,
- * "cage --- the Impossible Cage, an Escher like scene",
- * by Marcelo F. Vienna,
- * parts from gltext.c by Jamie Zawinski
- *
- * Vaclav (Vasek) Potocek
- * vasek.potocek@post.cz
- */
-
-/* TODO:
- * some simple "solve mode"
- * use rotator
- */
-
-/*-
- * Texture mapping is only available on RGBA contexts, Mono and color index
- * visuals DO NOT support texture mapping in OpenGL.
- *
- * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
- * mapping should work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
- * is not officially supported for both OpenGL and Mesa, but seems to not crash
- * Mesa.
- *
- * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
- */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_cube21 0
-#include "xlockmore.h"
-
-#include "gltrackball.h"
-
-#ifdef USE_GL
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_TEXTURE "True"
-#define DEF_RANDOMIZE "True"
-#define DEF_SPINSPEED "1.0"
-#define DEF_ROTSPEED "3.0"
-#define DEF_WANDERSPEED "0.02"
-#define DEF_WAIT "40.0"
-#define DEF_CUBESIZE "0.7"
-#define DEF_COLORMODE "six"
-
-#ifdef Pi
-#undef Pi
-#endif
-#define Pi M_PI
-
-#define SHUFFLE 100
-
-#define COS15 0.9659258263
-#define SIN15 0.2588190451
-#define COS30 0.8660254038
-#define SIN30 0.5000000000
-
-#define TEX_WIDTH 128
-#define TEX_HEIGHT 128
-#define TEX_GRAY 0.7, 0.7
-#define BORDER 3
-#define BORDER2 9
-
-#define rnd01() (random()%2)
-#define rndcolor() (frand(0.5)+0.3)
-
-/*************************************************************************/
-
-static Bool spin, wander, rndstart, tex;
-static float spinspeed, tspeed, wspeed, twait, size;
-static char *colmode_s;
-static int colmode;
-
-static argtype vars[] = {
- { &spin, "spin", "Spin", DEF_SPIN, t_Bool},
- { &wander, "wander", "Wander", DEF_WANDER, t_Bool},
- { &rndstart, "randomize", "Randomize", DEF_RANDOMIZE, t_Bool},
- { &tex, "texture", "Texture", DEF_TEXTURE, t_Bool},
- { &spinspeed, "spinspeed", "SpinSpeed", DEF_SPINSPEED, t_Float},
- { &tspeed, "rotspeed", "RotSpeed", DEF_ROTSPEED, t_Float},
- { &wspeed, "wanderspeed", "WanderSpeed", DEF_WANDERSPEED, t_Float},
- { &twait, "wait", "Wait", DEF_WAIT, t_Float},
- { &size, "cubesize", "CubeSize", DEF_CUBESIZE, t_Float},
- { &colmode_s, "colormode", "ColorMode", DEF_COLORMODE, t_String}
-};
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-randomize", ".randomize", XrmoptionNoArg, "True" },
- { "+randomize", ".randomize", XrmoptionNoArg, "False" },
- { "-texture", ".texture", XrmoptionNoArg, "True" },
- { "+texture", ".texture", XrmoptionNoArg, "False" },
- { "-spinspeed", ".spinspeed", XrmoptionSepArg, 0 },
- { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 },
- { "-rotspeed", ".rotspeed", XrmoptionSepArg, 0 },
- { "-wait", ".wait", XrmoptionSepArg, 0 },
- { "-cubesize", ".cubesize", XrmoptionSepArg, 0 },
- { "-colormode", ".colormode", XrmoptionSepArg, 0 }
-};
-
-ENTRYPOINT ModeSpecOpt cube21_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct cube21_description =
-{ "cube21", "init_cube21", "draw_cube21", NULL,
- "draw_cube21", "change_cube21", NULL, &cube21_opts,
- 25000, 1, 1, 1, 1.0, 4, "",
- "Shows randomly shuffling Cube 21", 0, NULL
-};
-#endif
-
-typedef enum {
- CUBE21_STATE_BASIC,
- CUBE21_PAUSE1 = CUBE21_STATE_BASIC,
- CUBE21_ROT_BASE,
- CUBE21_ROT_TOP = CUBE21_ROT_BASE,
- CUBE21_ROT_BOTTOM,
- CUBE21_PAUSE2,
- CUBE21_HALF_BASE,
- CUBE21_HALF1 = CUBE21_HALF_BASE,
- CUBE21_HALF2
-} cube21_state;
-
-typedef enum {
- CUBE21_COLOR_WHITE,
- CUBE21_COLOR_RANDOM,
- CUBE21_COLOR_SILVER,
- CUBE21_COLOR_TWORND,
- CUBE21_COLOR_CLASSIC,
- CUBE21_COLOR_SIXRND
-} cube21_cmode;
-
-typedef int pieces_t[2][13];
-typedef int cind_t[5][12];
-typedef GLfloat col_t[6][3];
-
-typedef struct {
- GLXContext *glx_context;
- GLfloat ratio;
- cube21_state state; /* type of "rotation" - shuffling */
- GLfloat xrot, yrot; /* "spin" - object rotation around axis */
- GLfloat posarg; /* position argument (for sine function) */
- GLfloat t, tmax; /* rotation clock */
- int hf[2], fr[2]; /* half flipped / face rotated flags */
- int rface, ramount; /* selected face and amount of rotation in multiplies of 30deg */
- int pieces[2][13]; /* locations of "narrow" and "wide" pieces */
- int cind[5][12]; /* color indices */
- GLfloat colors[6][3]; /* color map */
-
- Bool wire, cmat;
- unsigned char texture[TEX_HEIGHT][TEX_WIDTH];
-
- GLfloat texp, texq, posc[6];
- GLfloat color_inner[4];
-
- Bool button_down_p;
- trackball_state *trackball;
-
-} cube21_conf;
-
-static cube21_conf *cube21 = NULL;
-
-static const GLfloat shininess = 20.0;
-static const GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
-static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
-static const GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
-static const GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
-static const GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
-static const GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0};
-static const GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0};
-static const GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0};
-static const GLfloat zpos = -18.0;
-
-/*************************************************************************/
-
-static void find_matches(pieces_t pieces, int matches[12], int s)
-{
- int i, j = 1;
- for(i = 1; i<6; i++) {
- if(pieces[s][i] && pieces[s][i+6]) {
- matches[j++] = i;
- }
- }
- matches[0] = j;
- for(i = 1; i<matches[0]; i++) {
- matches[j++] = matches[i]-6;
- }
- matches[j++] = 6;
- matches[0] = j;
-}
-
-static void rot_face(pieces_t pieces, cind_t colors, int s, int o)
-{
- int i;
- int tmp[12], tmpc[2][12];
- int c0 = 2*s, c1 = c0+1;
- for(i = 0; i<12; i++) {
- tmp[i] = pieces[s][i];
- tmpc[0][i] = colors[c0][i];
- tmpc[1][i] = colors[c1][i];
- }
- if(o<0) o += 12;
- for(i = 0; i<12; i++, o++) {
- if(o==12) o = 0;
- pieces[s][i] = tmp[o];
- colors[c0][i] = tmpc[0][o];
- colors[c1][i] = tmpc[1][o];
- }
-}
-
-static void rot_halves(pieces_t pieces, cind_t colors, int hf[2], int s)
-{
- int ss = 6*s, i, j, k, t;
- for(i = 0; i<6; i++) {
- j = ss+i; k = ss+6-i;
- t = pieces[0][j];
- pieces[0][j] = pieces[1][k];
- pieces[1][k] = t;
- k--;
- t = colors[0][j];
- colors[0][j] = colors[2][k];
- colors[2][k] = t;
- t = colors[1][j];
- colors[1][j] = colors[3][k];
- colors[3][k] = t;
- }
- hf[s] ^= 1;
-}
-
-static void randomize(cube21_conf *cp)
-{
- int i, j, s;
- int matches[12];
- for(i = 0; i<SHUFFLE; i++) {
- s = rnd01();
- find_matches(cp->pieces, matches, s);
- j = matches[0]-1;
- j = random()%j;
- j = matches[j+1];
- rot_face(cp->pieces, cp->cind, s, j);
- s = rnd01();
- rot_halves(cp->pieces, cp->cind, cp->hf, s);
- }
-}
-
-static void finish(cube21_conf *cp)
-{
- int j, s;
- int matches[12];
- switch(cp->state) {
- case CUBE21_PAUSE1:
- s = rnd01();
- find_matches(cp->pieces, matches, s);
- j = matches[0]-1;
- j = random()%j;
- j = matches[j+1];
- if(j==6 && rnd01()) j = -6;
- cp->state = CUBE21_ROT_BASE+s;
- cp->tmax = 30.0*abs(j);
- cp->fr[0] = cp->fr[1] = 0;
- cp->rface = s;
- cp->ramount = j;
- break;
- case CUBE21_ROT_TOP:
- case CUBE21_ROT_BOTTOM:
- rot_face(cp->pieces, cp->cind, s = cp->rface, cp->ramount);
- cp->fr[s] = 1;
- s ^= 1;
- if(!cp->fr[s] && rnd01()) {
- find_matches(cp->pieces, matches, s);
- j = matches[0]-1;
- j = random()%j;
- j = matches[j+1];
- if(j==6 && rnd01()) j = -6;
- cp->state = CUBE21_ROT_BASE+s;
- cp->tmax = 30.0*abs(j);
- cp->rface = s;
- cp->ramount = j;
- break;
- } else {
- cp->state = CUBE21_PAUSE2;
- cp->tmax = twait;
- break;
- }
- case CUBE21_PAUSE2:
- s = rnd01();
- cp->ramount = -rnd01(); /* 0 or -1, only sign is significant in this case */
- cp->state = CUBE21_HALF_BASE+s;
- cp->tmax = 180.0;
- cp->rface = s;
- break;
- case CUBE21_HALF1:
- case CUBE21_HALF2:
- rot_halves(cp->pieces, cp->cind, cp->hf, cp->rface);
- cp->state = CUBE21_PAUSE1;
- cp->tmax = twait;
- break;
- }
- cp->t = 0;
-}
-
-static void draw_narrow_piece(ModeInfo *mi, cube21_conf *cp, GLfloat s, int c1, int c2, col_t colors)
-{
- GLfloat s1 = cp->posc[0]*s;
- glBegin(GL_TRIANGLES);
- glNormal3f(0.0, 0.0, s);
- if(cp->cmat) glColor3fv(colors[c1]);
- glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
- glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[1], 0.0, s);
- glTexCoord2f(cp->texp, 0.0); glVertex3f(cp->posc[2], cp->posc[3], s);
- mi->polygon_count++;
- glNormal3f(0.0, 0.0, -s);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(0.0, 0.0, s1);
- glVertex3f(cp->posc[1], 0.0, s1);
- glVertex3f(cp->posc[2], cp->posc[3], s1);
- mi->polygon_count++;
- glEnd();
- glBegin(GL_QUADS);
- glNormal3f(0.0, -1.0, 0.0);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(0.0, 0.0, s);
- glVertex3f(cp->posc[1], 0.0, s);
- glVertex3f(cp->posc[1], 0.0, s1);
- glVertex3f(0.0, 0.0, s1);
- mi->polygon_count++;
- glNormal3f(COS15, SIN15, 0.0);
- if(cp->cmat) glColor3fv(colors[c2]);
- glTexCoord2f(cp->texq, cp->texq); glVertex3f(cp->posc[1], 0.0, s);
- glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[2], cp->posc[3], s);
- glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[2], cp->posc[3], s1);
- glTexCoord2f(1.0, cp->texq); glVertex3f(cp->posc[1], 0.0, s1);
- mi->polygon_count++;
- glNormal3f(-SIN30, COS30, 0.0);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(0.0, 0.0, s);
- glVertex3f(cp->posc[2], cp->posc[3], s);
- glVertex3f(cp->posc[2], cp->posc[3], s1);
- glVertex3f(0.0, 0.0, s1);
- mi->polygon_count++;
- glEnd();
- glRotatef(30.0, 0.0, 0.0, 1.0);
-}
-
-static void draw_wide_piece(ModeInfo *mi, cube21_conf *cp, GLfloat s, int c1, int c2, int c3, col_t colors)
-{
- GLfloat s1 = cp->posc[0]*s;
- glBegin(GL_TRIANGLES);
- glNormal3f(0.0, 0.0, s);
- if(cp->cmat) glColor3fv(colors[c1]);
- glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
- glTexCoord2f(cp->texp, 0.0); glVertex3f(cp->posc[1], 0.0, s);
- glTexCoord2f(0.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
- glTexCoord2f(0.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
- glTexCoord2f(0.0, cp->texp); glVertex3f(cp->posc[3], cp->posc[2], s);
- glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
- glNormal3f(0.0, 0.0, -s);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(0.0, 0.0, s1);
- glVertex3f(cp->posc[1], 0.0, s1);
- glVertex3f(cp->posc[4], cp->posc[5], s1);
- glVertex3f(cp->posc[4], cp->posc[5], s1);
- glVertex3f(cp->posc[3], cp->posc[2], s1);
- glVertex3f(0.0, 0.0, s1);
- glEnd();
- glBegin(GL_QUADS);
- glNormal3f(0.0, -1.0, 0);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(0.0, 0.0, s);
- glVertex3f(cp->posc[1], 0.0, s);
- glVertex3f(cp->posc[1], 0.0, s1);
- glVertex3f(0.0, 0.0, s1);
- glNormal3f(COS15, -SIN15, 0.0);
- if(cp->cmat) glColor3fv(colors[c2]);
- glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[1], 0.0, s);
- glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
- glTexCoord2f(1.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s1);
- glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[1], 0.0, s1);
- glNormal3f(SIN15, COS15, 0.0);
- if(cp->cmat) glColor3fv(colors[c3]);
- glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], s);
- glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[3], cp->posc[2], s);
- glTexCoord2f(1.0, 0.0); glVertex3f(cp->posc[3], cp->posc[2], s1);
- glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], s1);
- glNormal3f(-COS30, SIN30, 0.0);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(0.0, 0.0, s);
- glVertex3f(cp->posc[3], cp->posc[2], s);
- glVertex3f(cp->posc[3], cp->posc[2], s1);
- glVertex3f(0.0, 0.0, s1);
- glEnd();
- glRotatef(60.0, 0.0, 0.0, 1.0);
-}
-
-static void draw_middle_piece(cube21_conf *cp, int s, cind_t cind, col_t colors)
-{
- s *= 6;
- glBegin(GL_QUADS);
- if(cp->cmat) glColor3fv(cp->color_inner);
- glNormal3f(0.0, 0.0, 1.0);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
- glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
- glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
- glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
- glNormal3f(0.0, 0.0, -1.0);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
- glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
- glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
- glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
- glNormal3f(0.0, -1.0, 0.0);
- glTexCoord2f(TEX_GRAY);
- glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
- glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
- glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
- glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
- glNormal3f(COS15, -SIN15, 0.0);
- if(cp->cmat) glColor3fv(colors[cind[4][s]]);
- glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
- glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
- glTexCoord2f(1.0, cp->texq); glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
- glTexCoord2f(cp->texq, cp->texq); glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
- glNormal3f(SIN15, COS15, 0.0);
- if(cp->cmat) glColor3fv(colors[cind[4][s+1]]);
- glTexCoord2f(0.0, 0.5); glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
- glTexCoord2f(cp->texq, 0.5); glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
- glTexCoord2f(cp->texq, 0.75); glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
- glTexCoord2f(0.0, 0.75); glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
- glNormal3f(-COS15, SIN15, 0.0);
- if(cp->cmat) glColor3fv(colors[cind[4][s+4]]);
- glTexCoord2f(0.0, 0.75); glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
- glTexCoord2f(1.0, 0.75); glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
- glTexCoord2f(1.0, 1.0); glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
- glTexCoord2f(0.0, 1.0); glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
- glEnd();
-}
-
-static void draw_middle(cube21_conf *cp)
-{
- if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
- draw_middle_piece(cp, 0, cp->cind, cp->colors);
- if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
- glRotatef(180.0, 0.0, 0.0, 1.0);
- if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
- draw_middle_piece(cp, 1, cp->cind, cp->colors);
- if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
-}
-
-static void draw_half_face(ModeInfo *mi, cube21_conf *cp, int s, int o)
-{
- int i, s1 = 1-s*2, s2 = s*2;
- for(i = o; i<o+6; i++) {
- if(cp->pieces[s][i+1])
- draw_narrow_piece(mi, cp, s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->colors);
- else {
- draw_wide_piece(mi, cp, s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->cind[s2+1][i+1], cp->colors);
- i++;
- }
- }
-}
-
-static void draw_top_face(ModeInfo *mi, cube21_conf *cp)
-{
- draw_half_face(mi, cp, 0, 0);
- draw_half_face(mi, cp, 0, 6);
-}
-
-static void draw_bottom_face(ModeInfo *mi, cube21_conf *cp)
-{
- draw_half_face(mi, cp, 1, 0);
- draw_half_face(mi, cp, 1, 6);
-}
-
-static Bool draw_main(ModeInfo *mi, cube21_conf *cp)
-{
- GLfloat theta = cp->ramount<0?cp->t:-cp->t;
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- if(wander)
- glTranslatef(3.0*cp->ratio*sin(13.0*cp->posarg), 3.0*sin(17.0*cp->posarg), zpos);
- else
- glTranslatef(0, 0, zpos);
- glScalef(size, size, size);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glRotatef(cp->xrot, 1.0, 0.0, 0.0);
- glRotatef(cp->yrot, 0.0, 1.0, 0.0);
-
- gltrackball_rotate (cp->trackball);
-
- if(cp->wire) glColor3f(0.7, 0.7, 0.7);
- switch(cp->state) {
- case CUBE21_PAUSE1:
- case CUBE21_PAUSE2:
- draw_top_face(mi, cp);
- draw_bottom_face(mi, cp);
- draw_middle(cp);
- break;
- case CUBE21_ROT_TOP:
- glRotatef(theta, 0.0, 0.0, 1.0);
- draw_top_face(mi, cp);
- glRotatef(-theta, 0.0, 0.0, 1.0);
- draw_bottom_face(mi, cp);
- draw_middle(cp);
- break;
- case CUBE21_ROT_BOTTOM:
- draw_top_face(mi, cp);
- glRotatef(theta, 0.0, 0.0, 1.0);
- draw_bottom_face(mi, cp);
- glRotatef(-theta, 0.0, 0.0, 1.0);
- draw_middle(cp);
- break;
- case CUBE21_HALF1:
- glRotatef(theta, 0.0, 1.0, 0.0);
- case CUBE21_HALF2:
- draw_half_face(mi, cp, 0, 0);
- glRotatef(-180.0, 0.0, 0.0, 1.0);
- draw_half_face(mi, cp, 1, 0);
- glRotatef(-180.0, 0.0, 0.0, 1.0);
- if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
- draw_middle_piece(cp, 0, cp->cind, cp->colors);
- if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
- if(cp->state==CUBE21_HALF1)
- glRotatef(-theta, 0.0, 1.0, 0.0);
- else
- glRotatef(theta, 0.0, 1.0, 0.0);
- glRotatef(180.0, 0.0, 0.0, 1.0);
- draw_half_face(mi, cp, 0, 6);
- glRotatef(-180.0, 0.0, 0.0, 1.0);
- draw_half_face(mi, cp, 1, 6);
- glRotatef(-180.0, 0.0, 0.0, 1.0);
- if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
- draw_middle_piece(cp, 1, cp->cind, cp->colors);
- break;
- }
- if(spin) {
- if((cp->xrot += spinspeed)>360.0) cp->xrot -= 360.0;
- if((cp->yrot += spinspeed)>360.0) cp->yrot -= 360.0;
- }
- if(wander)
- if((cp->posarg += wspeed/1000.0)>360.0) cp->posarg -= 360.0;
- if((cp->t += tspeed)>cp->tmax) finish(cp);
- return True;
-}
-
-static void parse_colmode(void)
-{
- if(!colmode_s) {
- colmode = CUBE21_COLOR_WHITE;
- return;
- }
- if(strstr(colmode_s, "se") || strstr(colmode_s, "sil")) colmode = CUBE21_COLOR_SILVER;
- else if(strstr(colmode_s, "ce") || strstr(colmode_s, "cla")) colmode = CUBE21_COLOR_CLASSIC;
- else if(strstr(colmode_s, "2") || strstr(colmode_s, "two")) colmode = CUBE21_COLOR_TWORND;
- else if(strstr(colmode_s, "6") || strstr(colmode_s, "six")) colmode = CUBE21_COLOR_SIXRND;
- else if(strstr(colmode_s, "1") || strstr(colmode_s, "ran") || strstr(colmode_s, "rnd")) colmode = CUBE21_COLOR_RANDOM;
- else colmode = CUBE21_COLOR_WHITE;
-}
-
-static void init_posc(cube21_conf *cp)
-{
- cp->texp = (1.0-tan(Pi/12.0))/2.0;
- cp->texq = 1.0-cp->texp;
- /* Some significant non-trivial coordinates
- * of the object. We need them exactly at GLfloat precision
- * for the edges to line up perfectly. */
- cp->posc[0] = tan(Pi/12); /* 0.268 */
- cp->posc[1] = 1.0/cos(Pi/12); /* 1.035 */
- cp->posc[2] = cos(Pi/6)/cos(Pi/12); /* 0.897 */
- cp->posc[3] = sin(Pi/6)/cos(Pi/12); /* 0.518 */
- cp->posc[4] = sqrt(2)*cos(Pi/6); /* 1.225 */
- cp->posc[5] = sqrt(2)*sin(Pi/6); /* 0.707 = 1/sqrt(2) */
-}
-
-static void draw_horz_line(cube21_conf *cp, int x1, int x2, int y)
-{
- int x, y0 = y, w;
- if(y<BORDER) y = -y;
- else y = -BORDER;
- for(; y<BORDER; y++) {
- if(y0+y>=TEX_HEIGHT) break;
- w = y*y*255/BORDER2;
- for(x=x1; x<=x2; x++)
- if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
- }
-}
-
-static void draw_vert_line(cube21_conf *cp, int x, int y1, int y2)
-{
- int x0 = x, y, w;
- if(x<BORDER) x = -x;
- else x = -BORDER;
- for(; x<BORDER; x++) {
- if(x0+x>=TEX_WIDTH) break;
- w = x*x*255/BORDER2;
- for(y=y1; y<=y2; y++)
- if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
- }
-}
-
-static void draw_slanted_horz(cube21_conf *cp, int x1, int y1, int x2, int y2)
-{
- int x, y, dx = x2-x1, dy = y2-y1, y0, w;
- for(x=x1; x<=x2; x++) {
- y0 = y1+(y2-y1)*(x-x1)/(x2-x1);
- for(y=-1-BORDER; y<2+BORDER; y++) {
- w = dx*(y0+y-y1)-dy*(x-x1);
- w = w*w/(dx*dx+dy*dy);
- w = w*255/BORDER2;
- if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
- }
- }
-}
-
-static void draw_slanted_vert(cube21_conf *cp, int x1, int y1, int x2, int y2)
-{
- int x, y, dx = x2-x1, dy = y2-y1, x0, w;
- for(y=y1; y<=y2; y++) {
- x0 = x1+(x2-x1)*(y-y1)/(y2-y1);
- for(x=-1-BORDER; x<2+BORDER; x++) {
- w = dy*(x0+x-x1)-dx*(y-y1);
- w = w*w/(dy*dy+dx*dx);
- w = w*255/BORDER2;
- if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
- }
- }
-}
-
-static void make_texture(cube21_conf *cp)
-{
- int x, y, x0, y0;
- float grayp[2] = {TEX_GRAY};
- for(y=0; y<TEX_HEIGHT; y++)
- for(x=0; x<TEX_WIDTH; x++)
- cp->texture[y][x] = 255;
- draw_horz_line(cp, 0, TEX_WIDTH-1, 0);
- draw_horz_line(cp, cp->texq*TEX_WIDTH, TEX_WIDTH-1, cp->texp*TEX_HEIGHT);
- draw_horz_line(cp, cp->texq*TEX_WIDTH, TEX_WIDTH-1, cp->texq*TEX_HEIGHT);
- draw_horz_line(cp, 0, cp->texq*TEX_WIDTH, TEX_HEIGHT/2);
- draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT*3/4);
- draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT-1);
- draw_vert_line(cp, 0, 0, TEX_HEIGHT-1);
- draw_vert_line(cp, cp->texq*TEX_WIDTH, 0, TEX_HEIGHT*3/4);
- draw_vert_line(cp, TEX_WIDTH-1, 0, TEX_HEIGHT-1);
- draw_slanted_horz(cp, 0, cp->texp*TEX_HEIGHT, TEX_WIDTH/2, TEX_HEIGHT/2);
- draw_slanted_vert(cp, cp->texp*TEX_WIDTH, 0, TEX_WIDTH/2, TEX_HEIGHT/2);
- draw_slanted_vert(cp, cp->texq*TEX_WIDTH, 0, TEX_WIDTH/2, TEX_HEIGHT/2);
- x0 = grayp[0]*TEX_WIDTH;
- y0 = grayp[1]*TEX_HEIGHT;
- for(y=-1; y<=1; y++)
- for(x=-1; x<=1; x++)
- cp->texture[y0+y][x0+x] = 100;
-}
-
-/* It doesn't look good */
-/*#define MIPMAP*/
-
-static void init_gl(ModeInfo *mi)
-{
- cube21_conf *cp = &cube21[MI_SCREEN(mi)];
-#ifdef MIPMAP
- int status;
-#endif
- parse_colmode();
- cp->wire = MI_IS_WIREFRAME(mi);
- cp->cmat = !cp->wire && (colmode != CUBE21_COLOR_WHITE);
- if(MI_IS_MONO(mi)) {
- tex = False;
- cp->cmat = False;
- }
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- cp->wire = 0;
-# endif
-
- if(cp->wire) {
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- return;
- }
- if(!tex)
- cp->color_inner[0] = cp->color_inner[1] = cp->color_inner[2] = 0.4;
- else
- cp->color_inner[0] = cp->color_inner[1] = cp->color_inner[2] = 1.0;
-
- glClearDepth(1.0);
- glDrawBuffer(GL_BACK);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glShadeModel(GL_FLAT);
- glDepthFunc(GL_LESS);
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_POSITION, position1);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_LIGHTING);
- glEnable(GL_NORMALIZE);
- glEnable(GL_COLOR_MATERIAL);
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
- glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
- if(!tex) return;
- glEnable(GL_TEXTURE_2D);
-#ifdef MIPMAP
- clear_gl_error();
- status = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEX_WIDTH, TEX_HEIGHT,
- GL_LUMINANCE, GL_UNSIGNED_BYTE, texture);
- if (status) {
- const char *s = gluErrorString(status);
- fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)"));
- exit (1);
- }
- check_gl_error("mipmapping");
-#else
- glTexImage2D(GL_TEXTURE_2D, 0, 1, TEX_WIDTH, TEX_HEIGHT,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, cp->texture);
-#endif
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-#ifdef MIPMAP
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-#else
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-#endif
-}
-
-static void init_cp(cube21_conf *cp)
-{
- int i, j;
- GLfloat ce_colors[6][3] = {
- {1.0, 1.0, 1.0},
- {1.0, 0.5, 0.0},
- {0.0, 0.9, 0.0},
- {0.8, 0.0, 0.0},
- {0.1, 0.1, 1.0},
- {0.9, 0.9, 0.0}
- };
- cp->state = CUBE21_STATE_BASIC;
- cp->xrot = -65.0; cp->yrot = 185.0;
- cp->posarg = (wspeed?random()%360:0.0);
- cp->t = 0.0; cp->tmax = twait;
- cp->hf[0] = cp->hf[1] = 0;
- cp->fr[0] = cp->fr[1] = 0;
- for(i=0;i<13;i++)
- cp->pieces[0][i] = cp->pieces[1][i] = (i%3==1?0:1);
- switch(colmode) {
- case CUBE21_COLOR_RANDOM:
- case CUBE21_COLOR_TWORND:
- case CUBE21_COLOR_SIXRND:
- for(i=0; i<6; i++)
- for(j=0; j<3; j++)
- cp->colors[i][j] = rndcolor();
- break;
- case CUBE21_COLOR_SILVER:
- cp->colors[0][0] = 1.0;
- cp->colors[0][1] = 1.0;
- cp->colors[0][2] = 1.0;
- cp->colors[1][0] = rndcolor();
- cp->colors[1][1] = rndcolor();
- cp->colors[1][2] = rndcolor();
- break;
- case CUBE21_COLOR_CLASSIC:
- for(i=0; i<6; i++)
- for(j=0; j<3; j++)
- cp->colors[i][j] = 0.2+0.7*ce_colors[i][j];
- break;
- }
- switch(colmode) {
- case CUBE21_COLOR_SILVER:
- case CUBE21_COLOR_TWORND:
- for(i=0; i<5; i++)
- for(j=0; j<12; j++)
- if(i==0) cp->cind[i][j] = 0;
- else if(i==2) cp->cind[i][j] = 1;
- else cp->cind[i][j] = ((j+5)%12)>=6?1:0;
- break;
- case CUBE21_COLOR_CLASSIC:
- case CUBE21_COLOR_SIXRND:
- for(i=0; i<5; i++)
- for(j=0; j<12; j++)
- if(i==0) cp->cind[i][j] = 4;
- else if(i==2) cp->cind[i][j] = 5;
- else cp->cind[i][j] = ((j+5)%12)/3;
- break;
- case CUBE21_COLOR_RANDOM:
- for(i=0; i<5; i++)
- for(j=0; j<12; j++)
- cp->cind[i][j] = 0;
- break;
- }
- if(rndstart) randomize(cp);
-}
-
-/*************************************************************************/
-
-ENTRYPOINT void reshape_cube21(ModeInfo *mi, int width, int height)
-{
- cube21_conf *cp = &cube21[MI_SCREEN(mi)];
- int y = 0;
- if(!height) height = 1;
- cp->ratio = (GLfloat)width/(GLfloat)height;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- cp->ratio = width / (GLfloat) height;
- cp->posarg = 0;
- }
-
- glViewport(0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(30.0, cp->ratio, 1.0, 100.0);
- glMatrixMode(GL_MODELVIEW);
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-ENTRYPOINT Bool
-cube21_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube21_conf *cp = &cube21[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, cp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &cp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void init_cube21(ModeInfo *mi)
-{
- cube21_conf *cp;
- MI_INIT(mi, cube21);
- cp = &cube21[MI_SCREEN(mi)];
-
- cp->trackball = gltrackball_init (False);
-
- if(!cp->texp) {
- init_posc(cp);
- make_texture(cp);
- }
-
-#ifdef HAVE_MOBILE
- size *= 2;
-#endif
-
- if ((cp->glx_context = init_GL(mi)) != NULL) {
- init_gl(mi);
- init_cp(cp);
- reshape_cube21(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-ENTRYPOINT void draw_cube21(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- cube21_conf *cp;
- if (!cube21) return;
- cp = &cube21[MI_SCREEN(mi)];
- MI_IS_DRAWN(mi) = True;
- if (!cp->glx_context) return;
- mi->polygon_count = 0;
- glXMakeCurrent(display, window, *cp->glx_context);
- if (!draw_main(mi, cp)) {
- MI_ABORT(mi);
- return;
- }
- if (MI_IS_FPS(mi)) do_fps (mi);
- glFlush();
- glXSwapBuffers(display, window);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void change_cube21(ModeInfo * mi)
-{
- cube21_conf *cp = &cube21[MI_SCREEN(mi)];
- if (!cp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cp->glx_context);
- init_gl(mi);
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void free_cube21(ModeInfo * mi)
-{
- cube21_conf *cp = &cube21[MI_SCREEN(mi)];
- if (!cp->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *cp->glx_context);
- gltrackball_free (cp->trackball);
-}
-
-XSCREENSAVER_MODULE ("Cube21", cube21)
-
-#endif
diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man
deleted file mode 100644
index a6e1ec2..0000000
--- a/hacks/glx/cube21.man
+++ /dev/null
@@ -1,147 +0,0 @@
-.TH XScreenSaver 1 "30-Aug-05" "X Version 11"
-.SH NAME
-cube21 \- animates the Cube 21 puzzle
-.SH SYNOPSIS
-.B cube21
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-install]
-[\-delay \fImicroseconds\fP]
-[\-texture] [\-no\-texture]
-[\-mono]
-[\-wireframe]
-[\-spin] [\-no\-spin]
-[\-wander] [\-no\-wander]
-[\-randomize] [\-no\-randomize]
-[\-spinspeed \fInumber\fP]
-[\-rotspeed \fInumber\fP]
-[\-wanderspeed \fInumber\fP]
-[\-wait \fInumber\fP]
-[\-cubesize \fInumber\fP]
-[\-colormode \fIarg\fP]
-[\-fps]
-.SH DESCRIPTION
-This program animates a puzzle known as Cube 21 or Square-1.
-Its moves are chosen randomly.
-.P
-Cube 21 is a Rubik-like puzzle invented in 1992. Its specialities are that
-it can change its shape and even the number of possible moves. It can have
-more than 200 different shapes and the total number of configurations
-(assuming colors) is several tens of billions.
-.SH OPTIONS
-.I cube21
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long to pause between frames. Default is 20000, or 0.02 second.
-.TP 8
-.B \-texture
-Use texture maps. This is the default.
-.TP 8
-.B \-no\-texture
-Use solid colors.
-.TP 8
-.B \-mono
-Disable both texture maps and colors.
-.TP 8
-.B \-wireframe
-Only draw outlines. Outlines of all pieces, not only the whole object, are drawn.
-.TP 8
-.B \-spin
-Spin the whole object around X, Y and Z axes. This is the default.
-.TP 8
-.B \-no\-spin
-Do not spin, showing the same three faces all the time.
-.TP 8
-.B \-wander
-Move the object around the screen. This is the default.
-.TP 8
-.B \-no\-wander
-Keep the object centered on the screen.
-.TP 8
-.B \-randomize
-Shuffle the puzzle randomly at startup. This is the default.
-.TP 8
-.B \-no\-randomize
-Do not shuffle at startup, begin at the shape of cube.
-.TP 8
-.B \-spinspeed \fInumber\fP
-The relative speed of spinning. Default is 1.0.
-.TP 8
-.B \-rotspeed \fInumber\fP
-The relative speed of the moves. Default is 3.0. Setting to \(<= 0.0
-makes the object stay at one configuration.
-.TP 8
-.B \-wanderspeed \fInumber\fP
-The relative speed of wandering around the screen. Default is 1.0.
-.TP 8
-.B \-wait \fInumber\fP
-How long to stay at ending position after each move. The meaning of
-the argument is again relative. Default is 40.0.
-.TP 8
-.B \-cubesize \fInumber\fP
-Size of the object. Value of 3.0 fills roughly all the screen (its height). Default is 0.7.
-.TP 8
-.B \-colormode \fIargument\fP
-How many and which colors should the object have. The colors are put on the piece
-faces so that the puzzle is solvable. The inner faces are not influenced.
-.RS
-.TP 8
-.BR se " or " silver
-Simulate the "Silver Edition" \- white and one random color.
-.TP 8
-.BR 2 " or " two
-Two random colors.
-.TP 8
-.BR ce " or " classic
-Simulate the "Classic Edition" \- white, yellow, orange, red, green and blue.
-.TP 8
-.BR 6 " or " six
-Six random colors.
-.TP 8
-.BR 1 " or " random " or " rnd
-One random color.
-.TP 8
-Anything else
-All faces white.
-.RE
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2005 by Vaclav Potocek. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Vaclav (Vasek) Potocek <vasek.potocek@post.cz>, 30-Aug-05.
diff --git a/hacks/glx/cubenetic.c b/hacks/glx/cubenetic.c
deleted file mode 100644
index 7524410..0000000
--- a/hacks/glx/cubenetic.c
+++ /dev/null
@@ -1,615 +0,0 @@
-/* cubenetic, Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*count: 5 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_cube 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPIN "XYZ"
-#define DEF_WANDER "True"
-#define DEF_TEXTURE "True"
-
-#define DEF_WAVES "3"
-#define DEF_WAVE_SPEED "80"
-#define DEF_WAVE_RADIUS "512"
-
-typedef struct {
- int color;
- GLfloat x, y, z;
- GLfloat w, h, d;
- int frame;
- GLfloat dx, dy, dz;
- GLfloat dw, dh, dd;
-} cube;
-
-typedef struct {
- int x, y;
- double xth, yth;
-} wave_src;
-
-typedef struct {
- int nwaves;
- int radius;
- int speed;
- wave_src *srcs;
- int *heights;
-} waves;
-
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLuint cube_list;
- GLuint texture_id;
- int cube_polys;
- int ncubes;
- cube *cubes;
- waves *waves;
-
- int texture_width, texture_height;
- unsigned char *texture;
-
- int ncolors;
- XColor *cube_colors;
- XColor *texture_colors;
-
-} cube_configuration;
-
-static cube_configuration *ccs = NULL;
-
-static char *do_spin;
-static Bool do_wander;
-static Bool do_texture;
-
-static int wave_count;
-static int wave_speed;
-static int wave_radius;
-static int texture_size = 256;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionSepArg, 0 },
- { "+spin", ".spin", XrmoptionNoArg, "" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- {"-texture", ".texture", XrmoptionNoArg, "true" },
- {"+texture", ".texture", XrmoptionNoArg, "false" },
- {"-waves", ".waves", XrmoptionSepArg, 0 },
- {"-wave-speed", ".waveSpeed", XrmoptionSepArg, 0 },
- {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&wave_count, "waves", "Waves", DEF_WAVES, t_Int},
- {&wave_speed, "waveSpeed", "WaveSpeed", DEF_WAVE_SPEED, t_Int},
- {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static int
-unit_cube (Bool wire)
-{
- int polys = 0;
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* front */
- glNormal3f (0, 0, 1);
- glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, 0.5);
- glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
- glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, 0.5);
- glTexCoord2f(1, 1); glVertex3f (-0.5, -0.5, 0.5);
- polys++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* back */
- glNormal3f (0, 0, -1);
- glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
- glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, -0.5);
- glTexCoord2f(1, 1); glVertex3f ( 0.5, 0.5, -0.5);
- glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, -0.5);
- polys++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* left */
- glNormal3f (-1, 0, 0);
- glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, 0.5);
- glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, -0.5);
- glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
- glTexCoord2f(0, 1); glVertex3f (-0.5, -0.5, 0.5);
- polys++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* right */
- glNormal3f (1, 0, 0);
- glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, -0.5);
- glTexCoord2f(1, 0); glVertex3f ( 0.5, 0.5, -0.5);
- glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
- glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, 0.5);
- polys++;
- glEnd();
-
- if (wire) return polys;
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* top */
- glNormal3f (0, 1, 0);
- glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
- glTexCoord2f(0, 1); glVertex3f ( 0.5, 0.5, -0.5);
- glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, -0.5);
- glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, 0.5);
- polys++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* bottom */
- glNormal3f (0, -1, 0);
- glTexCoord2f(1, 0); glVertex3f (-0.5, -0.5, 0.5);
- glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
- glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, -0.5);
- glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, 0.5);
- polys++;
- glEnd();
- return polys;
-}
-
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_cube (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- gluPerspective (30.0, 1/h, 1.0, 100.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-
-/* Waves.
- Adapted from ../hacks/interference.c by Hannu Mallat.
- */
-
-static void
-init_wave (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- waves *ww;
- int i;
- cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
- ww->nwaves = wave_count;
- ww->radius = wave_radius;
- ww->speed = wave_speed;
- ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
- ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
-
- for (i = 0; i < ww->radius; i++)
- {
- float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
- ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
- }
-
- for (i = 0; i < ww->nwaves; i++)
- {
- ww->srcs[i].xth = frand(2.0) * M_PI;
- ww->srcs[i].yth = frand(2.0) * M_PI;
- }
-}
-
-static void
-interference (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- waves *ww = cc->waves;
- int x, y, i;
-
- /* Move the wave origins around
- */
- for (i = 0; i < ww->nwaves; i++)
- {
- ww->srcs[i].xth += (ww->speed / 1000.0);
- if (ww->srcs[i].xth > 2*M_PI)
- ww->srcs[i].xth -= 2*M_PI;
- ww->srcs[i].yth += (ww->speed / 1000.0);
- if (ww->srcs[i].yth > 2*M_PI)
- ww->srcs[i].yth -= 2*M_PI;
-
- ww->srcs[i].x = (cc->texture_width/2 +
- (cos (ww->srcs[i].xth) *
- cc->texture_width / 2));
- ww->srcs[i].y = (cc->texture_height/2 +
- (cos (ww->srcs[i].yth) *
- cc->texture_height / 2));
- }
-
- /* Compute the effect of the waves on each pixel,
- and generate the output map.
- */
- for (y = 0; y < cc->texture_height; y++)
- for (x = 0; x < cc->texture_width; x++)
- {
- int result = 0;
- unsigned char *o;
- for (i = 0; i < ww->nwaves; i++)
- {
- int dx = x - ww->srcs[i].x;
- int dy = y - ww->srcs[i].y;
- int dist = sqrt (dx*dx + dy*dy);
- result += (dist > ww->radius ? 0 : ww->heights[dist]);
- }
- result %= cc->ncolors;
-
- o = cc->texture + (((y * cc->texture_width) + x) << 2);
- o[0] = (cc->texture_colors[result].red >> 8);
- o[1] = (cc->texture_colors[result].green >> 8);
- o[2] = (cc->texture_colors[result].blue >> 8);
- /* o[3] = 0xFF; */
- }
-}
-
-
-/* Textures
- */
-
-static void
-init_texture (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- int i;
-
- glEnable(GL_TEXTURE_2D);
-
- clear_gl_error();
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- glGenTextures (1, &cc->texture_id);
- glBindTexture (GL_TEXTURE_2D, cc->texture_id);
- check_gl_error("texture binding");
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- check_gl_error("texture initialization");
-
- cc->texture_width = texture_size;
- cc->texture_height = texture_size;
-
- i = texture_size * texture_size * 4;
- cc->texture = (unsigned char *) malloc (i);
- memset (cc->texture, 0xFF, i);
-}
-
-
-static void
-shuffle_texture (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- interference (mi);
- clear_gl_error();
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- cc->texture_width, cc->texture_height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- cc->texture);
- check_gl_error("texture");
-}
-
-
-static void
-reset_colors (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- double H[3], S[3], V[3];
- int shift = 60;
- H[0] = frand(360.0);
- H[1] = ((H[0] + shift) < 360) ? (H[0]+shift) : (H[0] + shift - 360);
- H[2] = ((H[1] + shift) < 360) ? (H[1]+shift) : (H[1] + shift - 360);
- S[0] = S[1] = S[2] = 1.0;
- V[0] = V[1] = V[2] = 1.0;
- make_color_loop(0, 0, 0,
- H[0], S[0], V[0],
- H[1], S[1], V[1],
- H[2], S[2], V[2],
- cc->texture_colors, &cc->ncolors,
- False, False);
-
- make_smooth_colormap (0, 0, 0,
- cc->cube_colors, &cc->ncolors,
- False, 0, False);
-}
-
-
-ENTRYPOINT Bool
-cube_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, cc->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &cc->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- reset_colors (mi);
- return True;
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_cube (ModeInfo *mi)
-{
- int i;
- cube_configuration *cc;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, ccs);
-
- cc = &ccs[MI_SCREEN(mi)];
-
- if ((cc->glx_context = init_GL(mi)) != NULL) {
- reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- if (!wire)
- {
- static const GLfloat pos[4] = {1.0, 0.5, 1.0, 0.0};
- static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- }
-
-
- {
- Bool spinx=False, spiny=False, spinz=False;
- double spin_speed = 1.0;
- double wander_speed = 0.05;
-
- char *s = do_spin;
- while (*s)
- {
- if (*s == 'x' || *s == 'X') spinx = True;
- else if (*s == 'y' || *s == 'Y') spiny = True;
- else if (*s == 'z' || *s == 'Z') spinz = True;
- else if (*s == '0') ;
- else
- {
- fprintf (stderr,
- "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
- progname, do_spin);
- exit (1);
- }
- s++;
- }
-
- cc->rot = make_rotator (spinx ? spin_speed : 0,
- spiny ? spin_speed : 0,
- spinz ? spin_speed : 0,
- 1.0,
- do_wander ? wander_speed : 0,
- (spinx && spiny && spinz));
- cc->trackball = gltrackball_init (True);
- }
-
- cc->ncolors = 256;
- cc->texture_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
- cc->cube_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
-
- reset_colors (mi);
-
- cc->ncubes = MI_COUNT (mi);
- cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
- for (i = 0; i < cc->ncubes; i++)
- {
- cube *cube = &cc->cubes[i];
- cube->color = random() % cc->ncolors;
- cube->w = 1.0;
- cube->h = 1.0;
- cube->d = 1.0;
- cube->dx = frand(0.1);
- cube->dy = frand(0.1);
- cube->dz = frand(0.1);
- cube->dw = frand(0.1);
- cube->dh = frand(0.1);
- cube->dd = frand(0.1);
- }
-
- if (wire)
- do_texture = False;
-
- if (do_texture)
- {
- init_texture (mi);
- init_wave (mi);
- shuffle_texture (mi);
- }
-
- cc->cube_list = glGenLists (1);
- glNewList (cc->cube_list, GL_COMPILE);
- cc->cube_polys = unit_cube (wire);
- glEndList ();
-}
-
-
-static void
-shuffle_cubes (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < cc->ncubes; i++)
- {
-# define SINOID(SCALE,FRAME,SIZE) \
- ((((1 + sin((FRAME * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
- cube *cube = &cc->cubes[i];
- cube->x = SINOID(cube->dx, cube->frame, 0.5);
- cube->y = SINOID(cube->dy, cube->frame, 0.5);
- cube->z = SINOID(cube->dz, cube->frame, 0.5);
- cube->w = SINOID(cube->dw, cube->frame, 0.9) + 1.0;
- cube->h = SINOID(cube->dh, cube->frame, 0.9) + 1.0;
- cube->d = SINOID(cube->dd, cube->frame, 0.9) + 1.0;
- cube->frame++;
-# undef SINOID
- }
-}
-
-
-ENTRYPOINT void
-draw_cube (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!cc->glx_context)
- return;
-
- mi->polygon_count = 0;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cc->glx_context);
-
- glShadeModel(GL_FLAT);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glScalef(1.1, 1.1, 1.1);
-
- {
- double x, y, z;
- get_position (cc->rot, &x, &y, &z, !cc->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 6,
- (z - 0.5) * 15);
-
- gltrackball_rotate (cc->trackball);
-
- get_rotation (cc->rot, &x, &y, &z, !cc->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- glScalef (2.5, 2.5, 2.5);
-
- for (i = 0; i < cc->ncubes; i++)
- {
- cube *cube = &cc->cubes[i];
- GLfloat color[4];
- color[0] = cc->cube_colors[cube->color].red / 65536.0;
- color[1] = cc->cube_colors[cube->color].green / 65536.0;
- color[2] = cc->cube_colors[cube->color].blue / 65536.0;
- color[3] = 1.0;
- cube->color++;
- if (cube->color >= cc->ncolors) cube->color = 0;
-
- glPushMatrix ();
- glTranslatef (cube->x, cube->y, cube->z);
- glScalef (cube->w, cube->h, cube->d);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
- glCallList (cc->cube_list);
- mi->polygon_count += cc->cube_polys;
- glPopMatrix ();
- }
-
- shuffle_cubes (mi);
- if (do_texture)
- shuffle_texture (mi);
-
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_cube (ModeInfo *mi)
-{
- cube_configuration *cc = &ccs[MI_SCREEN(mi)];
- if (!cc->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cc->glx_context);
- if (cc->waves) {
- free (cc->waves->srcs);
- free (cc->waves->heights);
- free (cc->waves);
- }
- if (glIsList(cc->cube_list)) glDeleteLists(cc->cube_list, 1);
- if (cc->rot) free_rotator (cc->rot);
- if (cc->trackball) gltrackball_free (cc->trackball);
- if (cc->texture_colors) free (cc->texture_colors);
- if (cc->cube_colors) free (cc->cube_colors);
- if (cc->texture) free (cc->texture);
- if (cc->texture_id) glDeleteTextures (1, &cc->texture_id);
-}
-
-XSCREENSAVER_MODULE_2 ("Cubenetic", cubenetic, cube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/cubenetic.man b/hacks/glx/cubenetic.man
deleted file mode 100644
index 5b087c2..0000000
--- a/hacks/glx/cubenetic.man
+++ /dev/null
@@ -1,89 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cubenetic \- cubist 3D undulating blob.
-.SH SYNOPSIS
-.B cubenetic
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-count \fInumber\fP]
-[\-no-wander]
-[\-no-spin]
-[\-spin \fI[XYZ]\fP]
-[\-wireframe]
-[\-no-texture]
-[\-wave-speed \fInumber\fP]
-[\-wave-radius \fInumber\fP]
-[\-waves \fInumber\fP]
-[\-fps]
-.SH DESCRIPTION
-Draws a pulsating set of overlapping boxes with ever-chaning blobby
-patterns undulating across their surfaces.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-count \fInumber\fP
-How many boxes make up the object. Default: 5.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin \fI[XYZ]\fP
-Around which axes should the object spin?
-.TP 8
-.B \-no-spin
-Don't spin.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-texture | \-no-texture
-Display Solid Colors.
-.TP 8
-.B \-wave-speed \fInumber\fP
-Surface Pattern Speed. 5 - 150. Default: 80.
-.TP 8
-.B \-wave-radius \fInumber\fP
-Surface Pattern Overlap. 5 - 600. Default: 512.
-.TP 8
-.B \-waves \fInumber\fP
-Surface Pattern Complexity. 1 - 20. Default: 3.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/cubestack.c b/hacks/glx/cubestack.c
deleted file mode 100644
index ef62ab4..0000000
--- a/hacks/glx/cubestack.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/* cubestack, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_cube 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_THICKNESS "0.13"
-#define DEF_OPACITY "0.7"
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- GLfloat state;
- GLfloat r;
- int length;
- int ncolors;
- XColor *colors;
- int ccolor;
-} cube_configuration;
-
-static cube_configuration *bps = NULL;
-
-static GLfloat speed;
-static GLfloat thickness;
-static GLfloat opacity;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-thickness", ".thickness", XrmoptionSepArg, 0 },
- { "-opacity", ".opacity", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
- {&opacity, "opacity", "Opacity", DEF_OPACITY, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static int
-draw_strut (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- GLfloat h;
-
- glPushMatrix();
- glFrontFace (GL_CCW);
- glNormal3f (0, 0, -1);
- glTranslatef (-0.5, -0.5, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
- glVertex3f (0, 0, 0);
- glVertex3f (1, 0, 0);
- glVertex3f (1 - thickness, thickness, 0);
- glVertex3f (thickness, thickness, 0);
- glEnd();
- polys += 2;
-
- h = 0.5 - thickness;
- if (h >= 0.25)
- {
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
- glVertex3f (0.5, 0.5, 0);
- glVertex3f (0.5 - thickness/2, 0.5 - thickness/2, 0);
- glVertex3f (0.5 - thickness/2, 0.5 - h/2, 0);
- glVertex3f (0.5 + thickness/2, 0.5 - h/2, 0);
- glVertex3f (0.5 + thickness/2, 0.5 - thickness/2, 0);
- glEnd();
- polys += 3;
- }
-
- glPopMatrix();
-
- return polys;
-}
-
-
-static int
-draw_face (ModeInfo *mi)
-{
- int i;
- int polys = 0;
- for (i = 0; i < 4; i++)
- {
- polys += draw_strut (mi);
- glRotatef (90, 0, 0, 1);
- }
- return polys;
-}
-
-
-static GLfloat
-ease_fn (GLfloat r)
-{
- return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
-}
-
-
-static GLfloat
-ease_ratio (GLfloat r)
-{
- GLfloat ease = 0.5;
- if (r <= 0) return 0;
- else if (r >= 1) return 1;
- else if (r <= ease) return ease * ease_fn (r / ease);
- else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
- else return r;
-}
-
-
-static int
-draw_cube_1 (ModeInfo *mi, GLfloat state, GLfloat color[4], Bool bottom_p)
-{
- int polys = 0;
- int istate = state;
- GLfloat r = state - istate;
- GLfloat a = color[3];
-
- r = ease_ratio (r);
-
-# define COLORIZE(R) \
- color[3] = a * R; \
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); \
- glColor4fv (color)
-
- if (bottom_p)
- {
- GLfloat r2 = (state < 0 ? 1 + state : 1);
- COLORIZE(r2);
- polys += draw_face (mi); /* Bottom */
- }
-
- if (state >= 0) /* Left */
- {
- GLfloat r2 = (istate == 0 ? r : 1);
- COLORIZE(r2);
- glPushMatrix();
- glTranslatef (-0.5, 0.5, 0);
- glRotatef (-r2 * 90, 0, 1, 0);
- glTranslatef (0.5, -0.5, 0);
- polys += draw_face (mi);
- glPopMatrix();
- }
-
- if (state >= 1) /* Back */
- {
- GLfloat r2 = (istate == 1 ? r : 1);
- COLORIZE(r2);
- glPushMatrix();
- glTranslatef (-0.5, 0.5, 0);
- glRotatef ( 90, 0, 1, 0);
- glRotatef (-90, 0, 0, 1);
- glRotatef (-r2 * 90, 0, 1, 0);
- glTranslatef (0.5, -0.5, 0);
- polys += draw_face (mi);
- glPopMatrix();
- }
-
- if (state >= 2) /* Right */
- {
- GLfloat r2 = (istate == 2 ? r : 1);
- COLORIZE(r2);
- glPushMatrix();
- glTranslatef (0.5, 0.5, 0);
- glRotatef ( 90, 0, 1, 0);
- glRotatef (-90, 0, 0, 1);
- glRotatef (-90, 0, 1, 0);
- glRotatef (-r2 * 90, 0, 1, 0);
- glTranslatef (-0.5, -0.5, 0);
- polys += draw_face (mi);
- glPopMatrix();
- }
-
- if (state >= 3) /* Front */
- {
- GLfloat r2 = (istate == 3 ? r : 1);
- COLORIZE(r2);
- glPushMatrix();
- glTranslatef (0.5, 0.5, 0);
- glRotatef ( 90, 0, 1, 0);
- glRotatef (-90, 0, 0, 1);
- glRotatef (-180, 0, 1, 0);
- glTranslatef (-1, 0, 0);
- glRotatef (-r2 * 90, 0, 1, 0);
- glTranslatef (0.5, -0.5, 0);
- polys += draw_face (mi);
- glPopMatrix();
- }
-
- if (state >= 4) /* Top */
- {
- GLfloat r2 = (istate == 4 ? r : 1);
- COLORIZE(r2);
- glPushMatrix();
- glTranslatef (0, 0, 1);
- glRotatef (-90, 0, 0, 1);
- glTranslatef (0.5, 0.5, 0);
- glRotatef (-90, 0, 1, 0);
- glRotatef (r2 * 90, 0, 1, 0);
- glTranslatef (-0.5, -0.5, 0);
- polys += draw_face (mi);
- glPopMatrix();
- }
-
- return polys;
-}
-
-
-static int
-draw_cubes (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- int polys = 0;
- GLfloat z = bp->state / 6;
- int i;
- GLfloat c[4];
- int c0 = bp->ccolor;
- GLfloat alpha = opacity;
-
- glPushMatrix();
- glTranslatef (0, 0, -1.5 - z);
-
- glTranslatef (0, 0, -bp->length);
- for (i = bp->length-1; i >= 0; i--)
- {
- int c1 = c0 - i - 1;
- if (c1 < 0) c1 += bp->ncolors;
- c[0] = bp->colors[c1].red / 65536.0;
- c[1] = bp->colors[c1].green / 65536.0;
- c[2] = bp->colors[c1].blue / 65536.0;
- c[3] = alpha;
-
- glTranslatef (0, 0, 1);
- polys += draw_cube_1 (mi, 5, c, i == bp->length - 1);
- }
-
- c[0] = bp->colors[c0].red / 65536.0;
- c[1] = bp->colors[c0].green / 65536.0;
- c[2] = bp->colors[c0].blue / 65536.0;
- c[3] = alpha;
- glTranslatef (0, 0, 1);
- polys += draw_cube_1 (mi, bp->state, c, bp->length == 0);
-
- glPopMatrix();
-
- return polys;
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_cube (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-cube_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c == ' ' || c == '\t')
- {
- bp->ncolors = 32;
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
- return True;
- }
- }
-
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_cube (ModeInfo *mi)
-{
- cube_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- glDisable (GL_LIGHTING);
- glEnable(GL_DEPTH_TEST);
- glShadeModel (GL_SMOOTH);
- glEnable (GL_NORMALIZE);
- glDisable (GL_CULL_FACE);
- glEnable (GL_BLEND);
- glDisable (GL_DEPTH_TEST);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE);
- }
-
- {
- double wander_speed = 0.005;
- bp->rot = make_rotator (0, 0, 0, 0,
- do_wander ? wander_speed : 0,
- False);
- bp->trackball = gltrackball_init (True);
- }
-
- if (thickness > 0.5)
- thickness = 0.5;
- if (thickness < 0.001)
- thickness = 0.001;
-
- bp->ncolors = 32;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
- bp->state = -1;
-}
-
-
-ENTRYPOINT void
-draw_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 4,
- (y - 0.5) * 4,
- (z - 0.5) * 2);
-
- gltrackball_rotate (bp->trackball);
- }
-
- mi->polygon_count = 0;
-
- glScalef (6, 6, 6);
- glRotatef (-45, 1, 0, 0);
- glRotatef (20, 0, 0, 1);
- glRotatef (bp->r, 0, 0, 1);
-
- mi->polygon_count = draw_cubes (mi);
- glPopMatrix ();
-
- if (!bp->button_down_p)
- {
- int max = 6;
- bp->state += speed * 0.015;
- bp->r += speed * 0.05;
- while (bp->r > 360)
- bp->r -= 360;
- while (bp->state > max)
- {
- bp->state -= max;
- bp->length++;
- bp->ccolor++;
- if (bp->ccolor > bp->ncolors)
- bp->ccolor = 0;
- }
-
- if (bp->length > 20)
- bp->length = 20;
- }
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->colors) free (bp->colors);
-}
-
-XSCREENSAVER_MODULE_2 ("CubeStack", cubestack, cube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/cubestack.man b/hacks/glx/cubestack.man
deleted file mode 100644
index 8e2a8e2..0000000
--- a/hacks/glx/cubestack.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cubestack \- An endless stack of unfolding, translucent cubes.
-.SH SYNOPSIS
-.B cubestack
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-thickness \fInumber\fP]
-[\-opacity \fInumber\fP]
-[\-no-wander]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-An endless stack of unfolding, translucent cubes.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-thickness \fInumber\fP
-Thickness of the face edges. 0.0 - 0.5. Default: 0.13.
-.TP 8
-.B \-opacity \fInumber\fP
-Opacity of the cubes. 0.01 - 1.0. Default: 0.7.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/cubestorm.c b/hacks/glx/cubestorm.c
deleted file mode 100644
index 681a17a..0000000
--- a/hacks/glx/cubestorm.c
+++ /dev/null
@@ -1,484 +0,0 @@
-/* cubestorm, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: " DEF_COUNT "\n" \
- "*showFPS: False \n" \
- "*fpsSolid: True \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-
-# define release_cube 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_THICKNESS "0.06"
-#define DEF_COUNT "4"
-#define DEF_LENGTH "200"
-
-typedef struct {
- GLfloat px, py, pz;
- GLfloat rx, ry, rz;
- int ccolor;
-} histcube;
-
-typedef struct {
- rotator *rot;
- int ccolor;
-} subcube;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *trackball;
- Bool button_down_p;
- Bool clear_p;
-
- GLuint cube_list;
-
- int ncolors;
- XColor *colors;
-
- subcube *subcubes;
-
- int hist_size, hist_count;
- histcube *hist;
-
-} cube_configuration;
-
-static cube_configuration *bps = NULL;
-
-static Bool do_spin;
-static Bool do_wander;
-static GLfloat speed;
-static GLfloat thickness;
-static int max_length;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-db", ".doubleBuffer", XrmoptionNoArg, "True"},
- { "+db", ".doubleBuffer", XrmoptionNoArg, "False"},
- { "-thickness", ".thickness", XrmoptionSepArg, 0 },
- { "-length", ".length", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
- {&max_length, "length", "Length", DEF_LENGTH, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static void
-draw_face (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
-
- int i;
- GLfloat t = thickness / 2;
- GLfloat a = -0.5;
- GLfloat b = 0.5;
-
- if (t <= 0) t = 0.001;
- else if (t > 0.5) t = 0.5;
-
- glPushMatrix();
- glFrontFace(GL_CW);
-
- for (i = 0; i < 4; i++)
- {
- glNormal3f (0, 0, -1);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (a, a, a);
- glVertex3f (b, a, a);
- glVertex3f (b-t, a+t, a);
- glVertex3f (a+t, a+t, a);
- glEnd();
-
- glNormal3f (0, 1, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (b-t, a+t, a);
- glVertex3f (b-t, a+t, a+t);
- glVertex3f (a+t, a+t, a+t);
- glVertex3f (a+t, a+t, a);
- glEnd();
-
- glRotatef(90, 0, 0, 1);
- }
- glPopMatrix();
-}
-
-static void
-draw_faces (ModeInfo *mi)
-{
- glPushMatrix();
- draw_face (mi);
- glRotatef (90, 0, 1, 0); draw_face (mi);
- glRotatef (90, 0, 1, 0); draw_face (mi);
- glRotatef (90, 0, 1, 0); draw_face (mi);
- glRotatef (90, 1, 0, 0); draw_face (mi);
- glRotatef (180, 1, 0, 0); draw_face (mi);
- glPopMatrix();
-}
-
-
-static void
-new_cube_colors (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- bp->ncolors = 128;
- if (bp->colors) free (bp->colors);
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
- for (i = 0; i < MI_COUNT(mi); i++)
- bp->subcubes[i].ccolor = random() % bp->ncolors;
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_cube (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 45.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-cube_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c == ' ')
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- return True;
- }
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- goto DEF;
- }
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- DEF:
- new_cube_colors (mi);
- return True;
- }
- return False;
-}
-
-
-ENTRYPOINT void
-init_cube (ModeInfo *mi)
-{
- cube_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- if (MI_COUNT(mi) <= 0) MI_COUNT(mi) = 1;
-
- bp->trackball = gltrackball_init (True);
- bp->subcubes = (subcube *) calloc (MI_COUNT(mi), sizeof(subcube));
-
- bp->hist_count = 0;
- bp->hist_size = 100;
- bp->hist = (histcube *) malloc (bp->hist_size * sizeof(*bp->hist));
-
- for (i = 0; i < MI_COUNT(mi); i++)
- {
- double wander_speed, spin_speed, spin_accel;
-
- if (i == 0)
- {
- wander_speed = 0.05 * speed;
- spin_speed = 10.0 * speed;
- spin_accel = 4.0 * speed;
- }
- else
- {
- wander_speed = 0;
- spin_speed = 4.0 * speed;
- spin_accel = 2.0 * speed;
- }
-
- bp->subcubes[i].rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- }
-
- bp->colors = 0;
- new_cube_colors (mi);
-
- reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- bp->cube_list = glGenLists (1);
- glNewList (bp->cube_list, GL_COMPILE);
- draw_faces (mi);
- glEndList ();
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-/* Originally, this program achieved the "accumulating cubes" effect by
- simply not clearing the depth or color buffers between frames. That
- doesn't work on modern systems, particularly mobile: you can no longer
- rely on your buffers being unmolested once you have yielded. So now we
- must save and re-render every polygon. Noof has the same problem and
- solves it by taking a screenshot of the frame buffer into a texture, but
- cubestorm needs to restore the depth buffer as well as the color buffer.
- */
-static void
-push_hist (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- double px, py, pz;
- double rx = 0, ry = 0, rz = 0;
- int i;
-
- if (bp->hist_count > max_length &&
- bp->hist_count > MI_COUNT(mi) &&
- !bp->button_down_p)
- {
- /* Drop history off of the end. */
- memmove (bp->hist,
- bp->hist + MI_COUNT(mi),
- (bp->hist_count - MI_COUNT(mi)) * sizeof(*bp->hist));
- bp->hist_count -= MI_COUNT(mi);
- }
-
- if (bp->hist_count + MI_COUNT(mi) >= bp->hist_size)
- {
- bp->hist_size = bp->hist_count + MI_COUNT(mi) + 100;
- bp->hist = (histcube *)
- realloc (bp->hist, bp->hist_size * sizeof(*bp->hist));
- }
-
- get_position (bp->subcubes[0].rot, &px, &py, &pz, !bp->button_down_p);
-
- for (i = 0; i < MI_COUNT(mi); i++)
- {
- subcube *sc = &bp->subcubes[i];
- histcube *hc = &bp->hist[bp->hist_count];
- double rx2, ry2, rz2;
-
- get_rotation (sc->rot, &rx2, &ry2, &rz2, !bp->button_down_p);
-
- if (i == 0) /* N+1 cubes rotate relative to cube 0 */
- rx = rx2, ry = ry2, rz = rz2;
- else
- rx2 += rx, ry2 += ry, rz2 += rz;
-
- hc->px = px;
- hc->py = py;
- hc->pz = pz;
- hc->rx = rx2;
- hc->ry = ry2;
- hc->rz = rz2;
- hc->ccolor = sc->ccolor;
- sc->ccolor++;
- if (sc->ccolor >= bp->ncolors)
- sc->ccolor = 0;
- bp->hist_count++;
- }
-}
-
-
-ENTRYPOINT void
-draw_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (bp->clear_p) /* we're in "no vapor trails" mode */
- {
- bp->hist_count = 0;
- if (! (random() % (int) (25 / speed)))
- bp->clear_p = False;
- }
- else
- {
- if (! (random() % (int) (200 / speed)))
- {
- bp->clear_p = True;
- new_cube_colors (mi);
- }
- }
-
- push_hist (mi);
- mi->polygon_count = 0;
- for (i = 0; i < bp->hist_count; i++)
- {
- GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat bshiny = 128.0;
-
- histcube *hc = &bp->hist[i];
-
- glPushMatrix();
- glScalef (1.1, 1.1, 1.1);
-
- glTranslatef((hc->px - 0.5) * 15,
- (hc->py - 0.5) * 15,
- (hc->pz - 0.5) * 30);
- gltrackball_rotate (bp->trackball);
-
- glScalef (4.0, 4.0, 4.0);
-
- glRotatef (hc->rx * 360, 1.0, 0.0, 0.0);
- glRotatef (hc->ry * 360, 0.0, 1.0, 0.0);
- glRotatef (hc->rz * 360, 0.0, 0.0, 1.0);
-
- bcolor[0] = bp->colors[hc->ccolor].red / 65536.0;
- bcolor[1] = bp->colors[hc->ccolor].green / 65536.0;
- bcolor[2] = bp->colors[hc->ccolor].blue / 65536.0;
-
- if (wire)
- glColor3f (bcolor[0], bcolor[1], bcolor[2]);
- else
- {
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
- }
-
- glCallList (bp->cube_list);
- mi->polygon_count += (4 * 2 * 6);
-
- glPopMatrix();
- }
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->subcubes) {
- for (i = 0; i < MI_COUNT(mi); i++)
- free_rotator (bp->subcubes[i].rot);
- free (bp->subcubes);
- }
- if (bp->hist) free (bp->hist);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->colors) free (bp->colors);
-
-}
-
-XSCREENSAVER_MODULE_2 ("CubeStorm", cubestorm, cube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/cubestorm.man b/hacks/glx/cubestorm.man
deleted file mode 100644
index aad0c97..0000000
--- a/hacks/glx/cubestorm.man
+++ /dev/null
@@ -1,77 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cubestorm \- a series of 3D boxes that fill space
-.SH SYNOPSIS
-.B cubestorm
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fIfloat\fP]
-[\-count \fIint\fP]
-[\-thickness \fIfloat\fP]
-[\-no-wander]
-[\-no-spin]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Draws a series of rotating 3D boxes that intersect each other and
-eventually fill space.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-speed \fInumber\fP
-Larger numbers mean run faster. Default: 1.0.
-.TP 8
-.B \-count \fInumber\fP
-Number of cubes. Default 4.
-.TP 8
-.B \-thickness \fIfloat\fP
-How thick the struts making up the cubes should be (0.0-1.0). Default 0.06.
-.TP 8
-.B \-wander | \-no-wander
-Whether the cubes should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the cubes should spin.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/cubetwist.c b/hacks/glx/cubetwist.c
deleted file mode 100644
index eed1901..0000000
--- a/hacks/glx/cubetwist.c
+++ /dev/null
@@ -1,596 +0,0 @@
-/* cubetwist, Copyright (c) 2016-2017 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_cube 0
-
-#include "xlockmore.h"
-#include "normals.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_FLAT "True"
-#define DEF_THICKNESS "0.0"
-#define DEF_DISPLACEMENT "0.0"
-
-typedef struct cube cube;
-struct cube {
- GLfloat size, thickness;
- XYZ pos, rot;
- GLfloat color[4];
- cube *next;
-};
-
-typedef struct oscillator oscillator;
-struct oscillator {
- double ratio, from, to, speed, *var;
- int remaining;
- oscillator *next;
-};
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- cube *cubes;
- oscillator *oscillators;
-} cube_configuration;
-
-static cube_configuration *bps = NULL;
-
-static Bool do_flat;
-static Bool do_spin;
-static GLfloat speed;
-static GLfloat thickness;
-static GLfloat displacement;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-flat", ".flat", XrmoptionNoArg, "True" },
- { "+flat", ".flat", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-thickness", ".thickness", XrmoptionSepArg, 0 },
- { "-displacement", ".displacement", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_flat, "flat", "flat", DEF_FLAT, t_Bool},
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
- {&displacement, "displacement", "Displacement", DEF_DISPLACEMENT, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static int
-draw_strut (ModeInfo *mi, cube *c)
-{
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
-
- glPushMatrix();
- glFrontFace (GL_CW);
- glNormal3f (0, 0, -1);
- glTranslatef (-c->size/2, -c->size/2, -c->size/2);
-
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
- glVertex3f (0, 0, 0);
- glVertex3f (c->size, 0, 0);
- glVertex3f (c->size - c->thickness, c->thickness, 0);
- glVertex3f (c->thickness, c->thickness, 0);
- glEnd();
- polys += 2;
-
- glNormal3f (0, 1, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
- glVertex3f (c->thickness, c->thickness, 0);
- glVertex3f (c->size - c->thickness, c->thickness, 0);
- glVertex3f (c->size - c->thickness, c->thickness, c->thickness);
- glVertex3f (c->thickness, c->thickness, c->thickness);
- glEnd();
- polys += 2;
- glPopMatrix();
-
- return polys;
-}
-
-
-static int
-draw_cubes (ModeInfo *mi, cube *c)
-{
- int polys = 0;
- int i, j;
-
- glColor4fv (c->color);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c->color);
-
- glPushMatrix();
- for (j = 0; j < 6; j++)
- {
- for (i = 0; i < 4; i++)
- {
- polys += draw_strut (mi, c);
- glRotatef (90, 0, 0, 1);
- }
- if (j == 3)
- glRotatef (90, 0, 0, 1);
- if (j < 4)
- glRotatef (90, 0, 1, 0);
- else
- glRotatef (180, 1, 0, 0);
- }
- glPopMatrix();
-
- if (c->next)
- {
- /* This leaves rotations on the prevailing matrix stack, but since
- this is a tail-call, that's fine. Don't blow the matrix stack. */
- glRotatef (c->rot.x, 1, 0, 0);
- glRotatef (c->rot.y, 0, 1, 0);
- glRotatef (c->rot.z, 0, 0, 1);
- glTranslatef (c->pos.x, c->pos.y, c->pos.z);
- c->next->pos = c->pos;
- c->next->rot = c->rot;
- polys += draw_cubes (mi, c->next);
- }
-
- check_gl_error("cubetwist");
- return polys;
-}
-
-
-static void
-make_cubes (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat step = 2 * (thickness + displacement);
- GLfloat size = 1.0;
- cube *tail = 0;
- GLfloat cc[4], cstep;
- int depth = 0;
- cube *c;
-
- cc[0] = 0.3 + frand(0.7);
- cc[1] = 0.3 + frand(0.7);
- cc[2] = 0.3 + frand(0.7);
- cc[3] = 1;
-
- if (bp->cubes) abort();
- while (1)
- {
- cube *c = (cube *) calloc (1, sizeof (*c));
- c->size = size;
- c->thickness = thickness;
- if (tail)
- tail->next = c;
- else
- bp->cubes = c;
- tail = c;
-
- depth++;
- size -= step;
- if (size <= step)
- break;
- }
-
- cstep = 0.8 / depth;
- for (c = bp->cubes; c; c = c->next)
- {
- memcpy (c->color, cc, sizeof(cc));
- cc[0] -= cstep;
- cc[1] -= cstep;
- cc[2] -= cstep;
- }
-}
-
-
-static GLfloat
-ease_fn (GLfloat r)
-{
- return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
-}
-
-
-static GLfloat
-ease_ratio (GLfloat r)
-{
- GLfloat ease = 0.5;
- if (r <= 0) return 0;
- else if (r >= 1) return 1;
- else if (r <= ease) return ease * ease_fn (r / ease);
- else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
- else return r;
-}
-
-
-static void
-tick_oscillators (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- oscillator *prev = 0;
- oscillator *a = bp->oscillators;
- GLfloat tick = 0.1 / speed;
-
- while (a)
- {
- oscillator *next = a->next;
- a->ratio += tick * a->speed;
- if (a->ratio > 1)
- a->ratio = 1;
-
- *a->var = a->from + (a->to - a->from) * ease_ratio (a->ratio);
-
- if (a->ratio < 1) /* mid cycle */
- prev = a;
- else if (--a->remaining <= 0) /* ended, and expired */
- {
- if (prev)
- prev->next = next;
- else
- bp->oscillators = next;
- free (a);
- }
- else /* keep going the other way */
- {
- GLfloat swap = a->from;
- a->from = a->to;
- a->to = swap;
- a->ratio = 0;
- prev = a;
- }
-
- a = next;
- }
-}
-
-
-static void
-add_oscillator (ModeInfo *mi, double *var, GLfloat speed, GLfloat to,
- int repeat)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- oscillator *a;
-
- /* If an oscillator is already running on this variable, don't
- add another. */
- for (a = bp->oscillators; a && a->next; a = a->next)
- if (a->var == var)
- return;
-
- a = (oscillator *) calloc (1, sizeof (*a));
- if (repeat <= 0) abort();
- a->ratio = 0;
- a->from = *var;
- a->to = to;
- a->speed = speed;
- a->var = var;
- a->remaining = repeat;
- a->next = bp->oscillators;
- bp->oscillators = a;
-# if 0
- fprintf (stderr, "%s: %3d %6.2f -> %6.2f %s\n",
- progname, repeat, *var, to,
- (var == &bp->midpoint.z ? "z" :
- var == &bp->tilt ? "tilt" :
- var == &bp->axial_radius ? "r" :
- var == &bp->speed ? "speed" : "?"));
-# endif
-}
-
-
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-add_random_oscillator (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- cube *c = bp->cubes;
- double s1 = speed * 0.07;
- double s2 = speed * 0.3;
- double disp = (thickness + displacement);
- int c1 = 1 + ((random() % 4) ? 0 : (random() % 3));
- int c2 = 2;
- int n = random() % 6;
-
- switch (n) {
- case 0: add_oscillator (mi, &c->rot.x, s1, 90 * RANDSIGN(), c1); break;
- case 1: add_oscillator (mi, &c->rot.y, s1, 90 * RANDSIGN(), c1); break;
- case 2: add_oscillator (mi, &c->rot.z, s1, 90 * RANDSIGN(), c1); break;
- case 3: add_oscillator (mi, &c->pos.x, s2, disp * RANDSIGN(), c2); break;
- case 4: add_oscillator (mi, &c->pos.y, s2, disp * RANDSIGN(), c2); break;
- case 5: add_oscillator (mi, &c->pos.z, s2, disp * RANDSIGN(), c2); break;
- default: abort(); break;
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_cube (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-cube_handle_event (ModeInfo *mi, XEvent *event)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c == ' ' || c == '\t')
- {
- while (bp->cubes)
- {
- cube *c = bp->cubes->next;
- free (bp->cubes);
- bp->cubes = c;
- }
-
- while (bp->oscillators)
- {
- oscillator *o = bp->oscillators->next;
- free (bp->oscillators);
- bp->oscillators = o;
- }
-
- if (random() & 1)
- {
- thickness = 0.03 + frand(0.02);
- displacement = (random() & 1) ? 0 : (thickness / 3);
- }
- else
- {
- thickness = 0.001 + frand(0.02);
- displacement = 0;
- }
-
- make_cubes (mi);
-
- return True;
- }
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_cube (ModeInfo *mi)
-{
- cube_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire && !do_flat)
- {
- GLfloat color[4] = {1, 1, 1, 1};
- GLfloat cspec[4] = {1, 1, 0, 1};
- static const GLfloat shiny = 30;
-
- static GLfloat pos0[4] = { 0.5, -1, -0.5, 0};
- static GLfloat pos1[4] = {-0.75, -1, 0, 0};
- static GLfloat amb[4] = {0, 0, 0, 1};
- static GLfloat dif[4] = {1, 1, 1, 1};
- static GLfloat spc[4] = {1, 1, 1, 1};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glLightfv(GL_LIGHT1, GL_POSITION, pos1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT1, GL_SPECULAR, spc);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
- glMateriali (GL_FRONT, GL_SHININESS, shiny);
- }
-
- {
- double spin_speed = 0.05;
- double wander_speed = 0.005;
- double spin_accel = 1.0;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- bp->trackball = gltrackball_init (True);
- }
-
- if (thickness > 0.5)
- thickness = 0.5;
- if (displacement > 0.5)
- displacement = 0.5;
-
- if (thickness <= 0.0001)
- {
- if (random() & 1)
- {
- thickness = 0.03 + frand(0.02);
- displacement = (random() & 1) ? 0 : (thickness / 3);
- }
- else
- {
- thickness = 0.001 + frand(0.02);
- displacement = 0;
- }
- }
-
- make_cubes (mi);
-}
-
-
-ENTRYPOINT void
-draw_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glScalef(1.1, 1.1, 1.1);
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 4,
- (y - 0.5) * 4,
- (z - 0.5) * 2);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- mi->polygon_count = 0;
-
- glScalef (6, 6, 6);
-
- mi->polygon_count = draw_cubes (mi, bp->cubes);
- glPopMatrix ();
-
- if (!bp->button_down_p)
- tick_oscillators (mi);
-
- if (! bp->oscillators &&
- !bp->button_down_p &&
- !(random() % 60))
- {
- bp->cubes->pos.x = bp->cubes->pos.y = bp->cubes->pos.z = 0;
- bp->cubes->rot.x = bp->cubes->rot.y = bp->cubes->rot.z = 0;
- add_random_oscillator (mi);
- }
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-ENTRYPOINT void
-free_cube (ModeInfo *mi)
-{
- cube_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- while (bp->cubes)
- {
- cube *c = bp->cubes->next;
- free (bp->cubes);
- bp->cubes = c;
- }
-
- while (bp->oscillators)
- {
- oscillator *o = bp->oscillators->next;
- free (bp->oscillators);
- bp->oscillators = o;
- }
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
-}
-
-
-XSCREENSAVER_MODULE_2 ("CubeTwist", cubetwist, cube)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/cubetwist.man b/hacks/glx/cubetwist.man
deleted file mode 100644
index 79efdd4..0000000
--- a/hacks/glx/cubetwist.man
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-cubetwist \- A series of nested cubes rotate and slide recursively.
-.SH SYNOPSIS
-.B cubetwist
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-thickness \fInumber\fP]
-[\-displacement \fInumber\fP]
-[\-no-flat]
-[\-no-wander]
-[\-no-spin]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-A series of nested cubes rotate and slide recursively.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-thickness \fInumber\fP
-Thickness of the cube edges. 0.005 - 0.2. Default: 0.05.
-.TP 8
-.B \-displacement \fInumber\fP
-Displacement between nested cubes. 0.0 - 0.2. Default: 0.01.
-.TP 8
-.B \-flat | \-no-flat
-Whether to use flat shading, or lighting. Default flat.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the object should spin.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/cubicgrid.c b/hacks/glx/cubicgrid.c
deleted file mode 100644
index 9d7d2ba..0000000
--- a/hacks/glx/cubicgrid.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Cubic Grid - a 3D lattice. The observer is located in the centre of
- * a spinning finite lattice. As it rotates, various view-throughs appear and
- * evolve. A simple idea with interesting results.
- *
- * Vasek Potocek (Dec-28-2007)
- * vasek.potocek@post.cz
- */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_cubicgrid 0
-#include "xlockmore.h"
-
-#ifdef USE_GL
-
-#define DEF_SPEED "1.0"
-#define DEF_DIV "30"
-#define DEF_ZOOM "20"
-#define DEF_BIGDOTS "True"
-#define DEF_SYMMETRY "random"
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-#undef RAND
-#define RAND(n) ((random() & 0x7fffffff) % ((long) (n)))
-
-#undef TOUPPER
-#define TOUPPER(x) ((x)&(~0x20))
-
-#include "rotator.h"
-#include "gltrackball.h"
-
-/*************************************************************************/
-
-enum HACKS_GLX_CUBICGRID_SYMMETRY {
- HACKS_GLX_CUBICGRID_SYMMETRY_CUBIC = 0,
- HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL = 1
-};
-
-static int ticks;
-static float size;
-static float speed;
-static Bool bigdots;
-static char *symmetry;
-static int symmetry_id;
-
-static argtype vars[] = {
- { &speed, "speed", "Speed", DEF_SPEED, t_Float },
- { &size, "zoom", "Zoom", DEF_ZOOM, t_Float },
- { &ticks, "ticks", "Ticks", DEF_DIV, t_Int },
- { &bigdots, "bigdots", "BigDots", DEF_BIGDOTS, t_Bool },
- { &symmetry,"symmetry", "Symmety", DEF_SYMMETRY, t_String },
-};
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-zoom", ".zoom", XrmoptionSepArg, 0 },
- { "-ticks", ".ticks", XrmoptionSepArg, 0 },
- { "-symmetry", ".symmetry", XrmoptionSepArg, 0 },
- { "-bigdots", ".bigdots", XrmoptionNoArg, "True" },
- { "+bigdots", ".bigdots", XrmoptionNoArg, "False" },
-};
-
-ENTRYPOINT ModeSpecOpt cubicgrid_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct cubicgrid_description =
-{ "cubicgrid", "init_cubicgrid", "draw_cubicgrid", NULL,
- "draw_cubicgrid", "change_cubicgrid", NULL, &cubicgrid_opts,
- 25000, 1, 1, 1, 1.0, 4, "",
- "Shows a rotating 3D lattice from inside", 0, NULL
-};
-#endif
-
-typedef struct {
- GLXContext *glx_context;
- GLfloat ratio;
- GLint list;
-
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- int npoints;
-} cubicgrid_conf;
-
-static cubicgrid_conf *cubicgrid = NULL;
-
-static const GLfloat zpos = -18.0;
-
-/*************************************************************************/
-
-ENTRYPOINT Bool
-cubicgrid_handle_event (ModeInfo *mi, XEvent *event)
-{
- cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, cp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &cp->button_down_p))
- return True;
-
- return False;
-}
-
-
-static Bool draw_main(ModeInfo *mi)
-{
- cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
- double x, y, z;
-
- glClear(GL_COLOR_BUFFER_BIT);
- glLoadIdentity();
-
- glRotatef (180, 1, 0, 0); /* Make trackball track the right way */
- glRotatef (180, 0, 1, 0);
-
- glTranslatef(0, 0, zpos);
-
- glScalef(size/ticks, size/ticks, size/ticks);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- gltrackball_rotate (cp->trackball);
-
- get_rotation (cp->rot, &x, &y, &z, !cp->button_down_p);
- glRotatef (-x * 360, 1.0, 0.0, 0.0);
- glRotatef (-y * 360, 0.0, 1.0, 0.0);
- glRotatef (-z * 360, 0.0, 0.0, 1.0);
-
- glTranslatef(-ticks/2.0, -ticks/2.0, -ticks/2.0);
- glCallList(cp->list);
- return True;
-}
-
-static void init_gl(ModeInfo *mi)
-{
- cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
- int x, y, z;
- float tf = ticks;
- float i, j, k;
- float sqrt_3 = sqrtf(3.0f);
- float sqrt_6 = sqrtf(6.0f);
-
- glDrawBuffer(GL_BACK);
- if(bigdots) {
- glPointSize(2.5);
- }
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glShadeModel(GL_FLAT);
-
- cp->list = glGenLists(1);
- glNewList(cp->list, GL_COMPILE);
- if(MI_IS_MONO(mi)) {
- glColor3f(1.0, 1.0, 1.0);
- glBegin(GL_POINTS);
- for(x = 0; x < ticks; x++) {
- for(y = 0; y < ticks; y++) {
- for(z = 0; z < ticks; z++) {
- if (symmetry_id == HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL) {
- i = 2*x+(y+z)%2;
- j = sqrt_3*(y+(1.0f/3.0f)*(z % 2));
- k = (2.0f/3.0f)*sqrt_6*z;
- glVertex3f(i, j, k);
- } else {
- glVertex3f(x, y, z);
- }
- cp->npoints++;
- }
- }
- }
- glEnd();
- }
- else
- {
- glBegin(GL_POINTS);
- for(x = 0; x < ticks; x++) {
- for(y = 0; y < ticks; y++) {
- for(z = 0; z < ticks; z++) {
- glColor3f(x/tf, y/tf, z/tf);
- if (symmetry_id == HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL) {
- i = 2*x+(y+z)%2;
- j = sqrt_3*(y+(1.0f/3.0f)*(z % 2));
- k = (2.0f/3.0f)*sqrt_6*z;
- glVertex3f(i, j, k);
- } else {
- glVertex3f(x, y, z);
- }
- cp->npoints++;
- }
- }
- }
- glEnd();
- }
- glEndList();
-}
-
-/*************************************************************************/
-
-ENTRYPOINT void reshape_cubicgrid(ModeInfo *mi, int width, int height)
-{
- cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
- int y = 0;
- if(!height) height = 1;
- cp->ratio = (GLfloat)width/(GLfloat)height;
-
- if (width > height * 3) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- cp->ratio = (GLfloat)width/(GLfloat)height;
- }
-
- glViewport(0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(30.0, cp->ratio, 1.0, 100.0);
- glMatrixMode(GL_MODELVIEW);
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-ENTRYPOINT void init_cubicgrid(ModeInfo *mi)
-{
- cubicgrid_conf *cp;
-
- MI_INIT(mi, cubicgrid);
- cp = &cubicgrid[MI_SCREEN(mi)];
-
- if (!symmetry || !*symmetry || !strcmp(symmetry, "random"))
- symmetry_id = RAND(2);
- else if (!strcmp(symmetry, "hexagonal"))
- symmetry_id = HACKS_GLX_CUBICGRID_SYMMETRY_HEXAGONAL;
- else if (!strcmp(symmetry, "cubic"))
- symmetry_id = HACKS_GLX_CUBICGRID_SYMMETRY_CUBIC;
- else {
- fprintf(stderr, "%s: unknown symmetry: %s\n", progname, symmetry);
- exit(1);
- }
-
- if ((cp->glx_context = init_GL(mi)) != NULL) {
- init_gl(mi);
- reshape_cubicgrid(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
-
- {
- double spin_speed = 0.045 * speed;
- double spin_accel = 0.005 * speed;
-
- cp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
- spin_accel, 0, True);
- cp->trackball = gltrackball_init (True);
- }
-}
-
-ENTRYPOINT void draw_cubicgrid(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- cubicgrid_conf *cp;
- if (!cubicgrid) return;
- cp = &cubicgrid[MI_SCREEN(mi)];
- MI_IS_DRAWN(mi) = True;
- if (!cp->glx_context) return;
- glXMakeCurrent(display, window, *cp->glx_context);
- if (!draw_main(mi)) {
- MI_ABORT(mi);
- return;
- }
- mi->polygon_count = cp->npoints;
- if (MI_IS_FPS(mi)) do_fps (mi);
- glFlush();
- glXSwapBuffers(display, window);
-}
-
-#ifndef STANDALONE
-ENTRYPOINT void change_cubicgrid(ModeInfo * mi)
-{
- cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
- if (!cp->glx_context) return;
- srand(time(NULL));
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cp->glx_context);
- init_gl(mi);
-}
-#endif /* !STANDALONE */
-
-ENTRYPOINT void free_cubicgrid(ModeInfo * mi)
-{
- cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
- if (!cp->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *cp->glx_context);
- gltrackball_free (cp->trackball);
- free_rotator (cp->rot);
- if (glIsList(cp->list)) glDeleteLists(cp->list, 1);
-}
-
-XSCREENSAVER_MODULE ("CubicGrid", cubicgrid)
-
-#endif
diff --git a/hacks/glx/cubicgrid.man b/hacks/glx/cubicgrid.man
deleted file mode 100644
index b83114d..0000000
--- a/hacks/glx/cubicgrid.man
+++ /dev/null
@@ -1,88 +0,0 @@
-.TH XScreenSaver 1 "Dec-28-07" "X Version 11"
-.SH NAME
-cubicgrid \- rotating 3D lattice seen from inside
-.SH SYNOPSIS
-.B cubicgrid
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-install]
-[\-delay \fImicroseconds\fP]
-[\-mono]
-[\-speed \fInumber\fP]
-[\-zoom \fInumber\fP]
-[\-ticks \fInumber\fP]
-[\-bigdots]
-[\-fps]
-[\-symmetry \fcrystalographic symmetry\fP]
-.SH DESCRIPTION
-This program shows the view of an observer located inside a set of points
-arranged to a 3D lattice. As the lattice rotates, various view-throughs appear
-and evolve. A simple idea with interesting results.
-.SH OPTIONS
-.I cubicgrid
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long to pause between frames. Default is 20000, or 0.02 second.
-.TP 8
-.B \-mono
-Draw in black and white. If not used, a fixed all-color scheme is chosen.
-.TP 8
-.B \-speed \fInumber\fP
-The maximum speed of the rotation. The actual speed and axis change smoothly
-for better effect. 0.5 - 10. The default is 1.0.
-.TP 8
-.B \-zoom \fInumber\fP
-Size of the lattice. Ideally it should fill all the screen, but one may find
-other values also interesting. 5 - 50. The default of 20 should do for common
-screen aspect ratios.
-.TP 8
-.B \-ticks \fInumber\fP
-The count of points drawn along every axis. 10 - 100. The default is 30.
-.TP 8
-.B \-bigdots
-Draw the points twice as big.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-symmetry \fSymmetry\fP
-Which crystalographic symmetry system to use. One of "auto", "cubic", or
-"hexagonal". "auto" will randomly select between symmetry systems.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2007 by Vasek Potocek. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear in
-all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Vasek Potocek <vasek.potocek@post.cz>, Dec-28-07.
diff --git a/hacks/glx/curlicue.h b/hacks/glx/curlicue.h
deleted file mode 100644
index 0963d6e..0000000
--- a/hacks/glx/curlicue.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/* curlicue.h --- A texture map containing a "curlicue" */
-
-#define TEX_DIMENSION 64
-static const unsigned char texture[TEX_DIMENSION*TEX_DIMENSION] = {
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 58, 43, 43, 43, 43, 45, 70, 70, 70,
- 70, 70, 70, 70, 74, 98, 98, 98,100,194,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 30,186,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1,111,244,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43,198,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 5,123,248,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 50,209,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 74,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,138, 4,
- 66,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 1,170,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,153, 0, 0,
- 0, 53,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 6,188,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,213, 7, 0, 0,
- 0, 0,226,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0, 0, 0, 0, 0, 47, 0, 0,
- 0, 0, 22,225,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,254, 54, 0, 0, 0,
- 0, 81,254,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0, 0, 0, 0, 56,247, 82, 0,
- 0, 0, 0, 59,253,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,152, 0, 0, 0, 0,
- 52,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0, 0, 0, 8,215,255,250, 56,
- 0, 0, 0, 0,142,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,241, 19, 0, 0, 0, 15,
- 220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0, 0, 0,129,255,255,255,230,
- 23, 0, 0, 0, 12,230,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,131, 0, 0, 0, 0,157,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0, 0, 49,250,255,255,255,255,
- 171, 0, 0, 0, 0,112,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,246, 19, 0, 0, 0, 54,253,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0, 5,208,255,255,255,255,255,
- 255, 77, 0, 0, 0, 9,231,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,163, 0, 0, 0, 0,186,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 0,121,255,255,255,255,255,255,
- 255,211, 2, 0, 0, 0,134,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255, 69, 0, 0, 0, 50,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 45, 41,247,255,255,255,255,255,255,
- 255,255, 73, 0, 0, 0, 38,254,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,237, 4, 0, 0, 0,145,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255, 52,201,255,255,255,255,255,255,255,
- 255,255,169, 0, 0, 0, 0,216,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,181, 0, 0, 0, 0,229,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,186,255,255,255,255,255,255,255,255,
- 255,255,247, 7, 0, 0, 0,150,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,130, 0, 0, 0, 42,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255, 67, 0, 0, 0, 91,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 79, 0, 0, 0, 95,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,120, 0, 0, 0, 56,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 55, 0, 0, 0,130,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,157, 0, 0, 0, 21,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 34, 0, 0, 0,161,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,179, 0, 0, 0, 2,250,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 27, 0, 0, 0,168,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,200, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 27, 0, 0, 0,168,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,200, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 27, 0, 0, 0,163,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,183, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 42, 0, 0, 0,135,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,161, 0, 0, 0, 17,254,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255, 76, 0, 0, 0,100,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,126, 0, 0, 0, 48,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,114, 0, 0, 0, 53,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255, 78, 0, 0, 0, 84,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,165, 0, 0, 0, 3,241,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,252, 16, 0, 0, 0,139,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,228, 0, 0, 0, 0,161,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,192, 0, 0, 0, 0,198,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255, 46, 0, 0, 0, 67,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255, 93, 0, 0, 0, 21,250,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,139, 0, 0, 0, 1,211,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,226, 7, 0, 0, 0,108,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,230, 6, 0, 0, 0, 79,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,106, 0, 0, 0, 1,206,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255, 97, 0, 0, 0, 0,183,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 202, 3, 0, 0, 0, 67,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,221, 8, 0, 0, 0, 27,
- 235,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,
- 40, 0, 0, 0, 0,198,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,126, 0, 0, 0, 0,
- 71,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,253, 85,
- 0, 0, 0, 0, 96,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,247, 44, 0, 0, 0,
- 0, 91,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,116, 0,
- 0, 0, 0, 25,233,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,216, 11, 0, 0,
- 0, 0, 90,251,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,252,112, 0, 0,
- 0, 0, 4,191,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,174, 4, 0,
- 0, 0, 0, 72,235,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,242, 84, 0, 0, 0,
- 0, 0,146,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,150, 1,
- 0, 0, 0, 0, 27,181,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,194, 39, 0, 0, 0, 0,
- 0,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,151,
- 4, 0, 0, 0, 0, 0, 77,209,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,216, 92, 1, 0, 0, 0, 0, 0,
- 125,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 175, 12, 0, 0, 0, 0, 0, 1, 70,164,241,255,255,255,255,255,
- 255,255,255,255,255,242,171, 77, 2, 0, 0, 0, 0, 0, 4,150,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,214, 41, 0, 0, 0, 0, 0, 0, 0, 4, 48, 98,138,163,163,
- 163,163,140,103, 55, 5, 0, 0, 0, 0, 0, 0, 0, 30,199,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,245,125, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105,240,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,222,100, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 83,210,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,228,136, 45, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 37,125,220,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,225,166,112, 74, 43, 32, 12,
- 8, 32, 40, 71,105,162,218,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-};
diff --git a/hacks/glx/dangerball.c b/hacks/glx/dangerball.c
deleted file mode 100644
index 18cc9d1..0000000
--- a/hacks/glx/dangerball.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/* dangerball, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 30 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_ball 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "sphere.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "0.05"
-
-#define SPIKE_FACES 12 /* how densely to render spikes */
-#define SMOOTH_SPIKES True
-#define SPHERE_SLICES 32 /* how densely to render spheres */
-#define SPHERE_STACKS 16
-
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLuint ball_list;
- GLuint spike_list;
-
- GLfloat pos;
- int *spikes;
-
- int ncolors;
- XColor *colors;
- int ccolor;
- int color_shift;
-
-} ball_configuration;
-
-static ball_configuration *bps = NULL;
-
-static Bool do_spin;
-static GLfloat speed;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" }
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_ball (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-randomize_spikes (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- bp->pos = 0;
- for (i = 0; i < MI_COUNT(mi); i++)
- {
- bp->spikes[i*2] = (random() % 360) - 180;
- bp->spikes[i*2+1] = (random() % 180) - 90;
- }
-
-# define ROT_SCALE 22
- for (i = 0; i < MI_COUNT(mi) * 2; i++)
- bp->spikes[i] = (bp->spikes[i] / ROT_SCALE) * ROT_SCALE;
-
- if ((random() % 3) == 0)
- bp->color_shift = random() % (bp->ncolors / 2);
- else
- bp->color_shift = 0;
-}
-
-static void
-draw_spikes (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat diam = 0.2;
- GLfloat pos = bp->pos;
- int i;
-
- if (pos < 0) pos = -pos;
-
- pos = (asin (0.5 + pos/2) - 0.5) * 2;
-
- for (i = 0; i < MI_COUNT(mi); i++)
- {
- glPushMatrix();
- glRotatef(bp->spikes[i*2], 0, 1, 0);
- glRotatef(bp->spikes[i*2+1], 0, 0, 1);
- glTranslatef(0.7, 0, 0);
- glRotatef(-90, 0, 0, 1);
- glScalef (diam, pos, diam);
- glCallList (bp->spike_list);
- glPopMatrix();
-
- mi->polygon_count += (SPIKE_FACES + 1);
- }
-}
-
-
-static void
-move_spikes (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (bp->pos >= 0) /* moving outward */
- {
- bp->pos += speed;
- if (bp->pos >= 1) /* reverse gears at apex */
- bp->pos = -1;
- }
- else /* moving inward */
- {
- bp->pos += speed;
- if (bp->pos >= 0) /* stop at end */
- randomize_spikes (mi);
- }
-}
-
-
-ENTRYPOINT Bool
-ball_handle_event (ModeInfo *mi, XEvent *event)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_ball (ModeInfo *mi)
-{
- ball_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- {
- double spin_speed = 10.0;
- double wander_speed = 0.12;
- double spin_accel = 2.0;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- bp->trackball = gltrackball_init (True);
- }
-
- bp->ncolors = 128;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
-
- bp->spikes = (int *) calloc(MI_COUNT(mi), sizeof(*bp->spikes) * 2);
-
- bp->ball_list = glGenLists (1);
- bp->spike_list = glGenLists (1);
-
- glNewList (bp->ball_list, GL_COMPILE);
- unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
- glEndList ();
-
- glNewList (bp->spike_list, GL_COMPILE);
- cone (0, 0, 0,
- 0, 1, 0,
- 1, 0, SPIKE_FACES, SMOOTH_SPIKES, False, wire);
- glEndList ();
-
- randomize_spikes (mi);
-}
-
-
-ENTRYPOINT void
-draw_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int c2;
-
- static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat sspec[4] = {0.0, 0.0, 0.0, 1.0};
- static const GLfloat bshiny = 128.0;
- static const GLfloat sshiny = 0.0;
-
- GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat scolor[4] = {0.0, 0.0, 0.0, 1.0};
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glScalef(1.1, 1.1, 1.1);
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 15);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- bcolor[0] = bp->colors[bp->ccolor].red / 65536.0;
- bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
- bcolor[2] = bp->colors[bp->ccolor].blue / 65536.0;
-
- c2 = (bp->ccolor + bp->color_shift) % bp->ncolors;
- scolor[0] = bp->colors[c2].red / 65536.0;
- scolor[1] = bp->colors[c2].green / 65536.0;
- scolor[2] = bp->colors[c2].blue / 65536.0;
-
- bp->ccolor++;
- if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
-
- mi->polygon_count = 0;
-
- glScalef (2.0, 2.0, 2.0);
-
- move_spikes (mi);
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
- glCallList (bp->ball_list);
- mi->polygon_count += (SPHERE_SLICES * SPHERE_STACKS);
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, sspec);
- glMaterialf (GL_FRONT, GL_SHININESS, sshiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, scolor);
- draw_spikes (mi);
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->colors) free (bp->colors);
- if (bp->spikes) free (bp->spikes);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (glIsList(bp->ball_list)) glDeleteLists(bp->ball_list, 1);
- if (glIsList(bp->spike_list)) glDeleteLists(bp->spike_list, 1);
-}
-
-XSCREENSAVER_MODULE_2 ("DangerBall", dangerball, ball)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/dangerball.man b/hacks/glx/dangerball.man
deleted file mode 100644
index f50dc03..0000000
--- a/hacks/glx/dangerball.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-dangerball \- a 3D ball that periodically extrudes spikes. Ouch!
-.SH SYNOPSIS
-.B dangerball
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-count \fInumber\fP]
-[\-no-wander]
-[\-no-spin]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Draws a ball that periodically extrudes many random spikes. Ouch!
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-speed \fInumber\fP
-Spike growth frequency. 0.0 - 0.25. Default: 0.05.
-.TP 8
-.B \-count \fInumber\fP
-Number o spikes. Default: 30.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the object should spin.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/deepstars.c b/hacks/glx/deepstars.c
deleted file mode 100644
index 5b530c5..0000000
--- a/hacks/glx/deepstars.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/* xscreensaver, Copyright (c) 2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_deepstars 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL /* whole file */
-
-#include "sphere.h"
-#include "gltrackball.h"
-
-#define DEF_SPEED "1.0"
-#define DEF_SMEAR "1.0"
-#define SMEAR_BASE 400
-#define SPEED_BASE 0.02
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-static GLfloat speed_arg, smear_arg;
-
-static XrmOptionDescRec opts[] = {
- {"-speed", ".speed", XrmoptionSepArg, 0 },
- {"-smear", ".smear", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&speed_arg, "speed" ,"Speed", DEF_SPEED, t_Float},
- {&smear_arg, "smear" ,"Smear", DEF_SMEAR, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt deepstars_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct deepstars_description =
-{"deepstars", "init_deepstars", "draw_deepstars", NULL,
- "draw_deepstars", "init_deepstars", "free_deepstars", &deepstars_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Animates texture mapped sphere (deepstars)", 0, NULL};
-#endif
-
-typedef struct {
- GLfloat *colors;
- GLuint starlist, groundlist;
- int ncolors, starcount, groundcount;
- GLXContext *glx_context;
- GLfloat z, latitude, facing;
- int smear, dsmear;
- trackball_state *trackball;
- Bool button_down_p;
-} starstruct;
-
-static starstruct *deepstarss = NULL;
-
-
-ENTRYPOINT void
-reshape_deepstars (ModeInfo *mi, int width, int height)
-{
- starstruct *gp = &deepstarss[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
-
- glViewport(0, 0, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -40);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-deepstars_handle_event (ModeInfo *mi, XEvent *event)
-{
- starstruct *gp = &deepstarss[MI_SCREEN(mi)];
-
- /* Neutralize any horizontal motion, and flip Y */
- GLfloat rot = current_device_rotation();
- Bool rotp = ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135));
-
- if (event->xany.type == ButtonPress ||
- event->xany.type == ButtonRelease)
- {
- if (rotp)
- {
- event->xbutton.y = MI_HEIGHT(mi) / 2;
- event->xbutton.x = MI_WIDTH(mi) - event->xbutton.x;
- }
- else
- {
- event->xbutton.x = MI_WIDTH(mi) / 2;
- event->xbutton.y = MI_HEIGHT(mi) - event->xbutton.y;
- }
- }
- else if (event->xany.type == MotionNotify)
- {
- if (rotp)
- {
- event->xmotion.y = MI_HEIGHT(mi) / 2;
- event->xmotion.x = MI_WIDTH(mi) - event->xmotion.x;
- }
- else
- {
- event->xmotion.x = MI_WIDTH(mi) / 2;
- event->xmotion.y = MI_HEIGHT(mi) - event->xmotion.y;
- }
- }
-
- if (gltrackball_event_handler (event, gp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &gp->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- if (gp->smear <= 1)
- gp->dsmear = 1;
- else
- gp->dsmear = gp->smear = 0;
- return True;
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_deepstars (ModeInfo * mi)
-{
- starstruct *gp;
- int screen = MI_SCREEN(mi);
-
- int i, j, k;
- int width = MI_WIDTH(mi);
- int height = MI_HEIGHT(mi);
- int size = (width > height ? width : height);
- int nstars = size * size / 80;
- int max_size = 3;
- GLfloat inc = 0.5;
- int sizes = max_size / inc;
- GLfloat scale = 1;
-
- MI_INIT (mi, deepstarss);
- gp = &deepstarss[screen];
-
- if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape_deepstars(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
-# ifdef HAVE_MOBILE
- scale *= 3;
- nstars /= 3;
-# else /* !HAVE_MOBILE */
- if (MI_WIDTH(mi) > 2560) { /* Retina displays */
- scale *= 2;
- nstars /= 2;
- }
-# endif /* !HAVE_MOBILE */
-
-
- gp->trackball = gltrackball_init (True);
-
- gp->latitude = 10 + frand(70);
- gp->facing = 10 * (frand(1.0)-0.5);
-
- /* Only need a small number of distinct star colors, and we have one
- display list for each color, so we can modify the alpha.
- */
- gp->ncolors = 16;
- gp->colors = (GLfloat *) malloc (4 * gp->ncolors * sizeof(*gp->colors));
-
- for (i = 0; i < gp->ncolors; i++)
- {
- GLfloat d = 0.1;
- GLfloat r = 0.15 + frand(0.3);
- GLfloat g = r + frand(d) - d;
- GLfloat b = r + frand(d) - d;
- gp->colors[i*4+0] = r;
- gp->colors[i*4+1] = g;
- gp->colors[i*4+2] = b;
- gp->colors[i*4+3] = 1;
- }
-
- gp->starcount = nstars / gp->ncolors;
- gp->starlist = glGenLists(gp->ncolors);
- for (i = 0; i < gp->ncolors; i++)
- {
- glNewList (gp->starlist + i, GL_COMPILE);
- for (j = 1; j <= sizes; j++)
- {
- glPointSize (inc * j * scale);
- glBegin (GL_POINTS);
- for (k = 0; k < gp->starcount / sizes; k++)
- {
- GLfloat x = frand(1)-0.5;
- GLfloat y = frand(1)-0.5;
- GLfloat z = ((random() & 1)
- ? frand(1)-0.5
- : (BELLRAND(1)-0.5)/20); /* milky way */
- GLfloat d = sqrt (x*x + y*y + z*z);
- x /= d;
- y /= d;
- z /= d;
- glVertex3f (x, y, z);
- }
- glEnd();
- }
- glEndList();
- }
-
- glDisable (GL_BLEND);
- gp->groundlist = glGenLists(1);
- glNewList(gp->groundlist, GL_COMPILE);
- {
- GLfloat inc = 0.5;
- glColor3f (0.02, 0.02, 0.05);
- glBegin (GL_QUAD_STRIP);
- gp->groundcount = 50;
- for (i = 0; i <= gp->groundcount; i++)
- {
- glVertex3f (i / (GLfloat) gp->groundcount, 0, 0);
- glVertex3f (i / (GLfloat) gp->groundcount, inc, 0);
- inc += 0.1 * (frand(1.0) - 0.5);
- }
- glEnd();
- }
- glEndList();
-}
-
-
-ENTRYPOINT void
-draw_deepstars (ModeInfo * mi)
-{
- starstruct *gp = &deepstarss[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int smear_change = 800;
- int sky_scale = 60;
- int i, j;
-
- if (!gp->glx_context)
- return;
-
- glDrawBuffer(GL_BACK);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glXMakeCurrent (dpy, window, *gp->glx_context);
-
- mi->polygon_count = 0;
-
- glEnable (GL_LINE_SMOOTH);
- glEnable (GL_POINT_SMOOTH);
- glDisable (GL_DEPTH_TEST);
- glDisable (GL_CULL_FACE);
-
- glPushMatrix();
-
- gltrackball_rotate (gp->trackball);
-
- /* At the equator, Polaris is on the horizon. In the Arctic, overhead. */
- glRotatef (180 - gp->latitude, 1, 0, 0);
- glRotatef (gp->facing, 0, 1, 0);
-
- if (gp->dsmear == 0 && !(random() % smear_change))
- gp->dsmear = 1;
- else if (gp->smear == SMEAR_BASE * smear_arg && !(random() % smear_change))
- gp->dsmear = -1;
-
- if (! gp->button_down_p)
- gp->smear += gp->dsmear;
- if (gp->smear < 1) gp->smear = 1;
- else if (gp->smear > SMEAR_BASE * smear_arg)
- gp->smear = SMEAR_BASE * smear_arg;
-
- if (!gp->button_down_p)
- gp->z -= SPEED_BASE * speed_arg;
-
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- for (i = 0; i < gp->smear; i++)
- {
- GLfloat alpha = 1 - (i / (GLfloat) gp->smear);
-
- glPushMatrix();
-
- glRotatef (gp->z - (-i * SPEED_BASE * speed_arg), 0, 0, 1);
-
-# if 0
- if (i == 0)
- {
- glBegin(GL_LINES);
- glVertex3f(0,0,0); glVertex3f(0,0,-3);
- glVertex3f(0,-1,0); glVertex3f(0,1,0);
- glVertex3f(-1,0,0); glVertex3f(1,0,0);
- glEnd();
-
- glPushMatrix();
- glRotatef (90, 1, 0, 0);
- glScalef (sky_scale, sky_scale, sky_scale);
- mi->polygon_count += unit_sphere (12, 24, 1);
- glPopMatrix();
- }
-# endif
-
- glRotatef (50, 1, 0, 0); /* Tilt milky way */
- glScalef (sky_scale, sky_scale, sky_scale);
-
- for (j = 0; j < gp->ncolors; j++)
- {
- gp->colors[j*4+3] = alpha;
- glColor4fv (&gp->colors[j*4]);
- glCallList (gp->starlist + j);
- mi->polygon_count += gp->starcount;
- }
- glPopMatrix();
- }
-
- glPopMatrix();
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- {
- glLoadIdentity();
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- {
- glLoadIdentity();
- glTranslatef (-1, -1, 0);
- glScalef (2, 0.7, 1);
- glCallList (gp->groundlist);
- mi->polygon_count += gp->groundcount;
- }
- glPopMatrix();
- }
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
- glMatrixMode(GL_MODELVIEW);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_deepstars (ModeInfo * mi)
-{
- starstruct *gp = &deepstarss[MI_SCREEN(mi)];
-
- if (!gp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
- if (gp->colors) free (gp->colors);
- if (glIsList(gp->groundlist)) glDeleteLists(gp->groundlist, 1);
- if (glIsList(gp->starlist)) glDeleteLists(gp->starlist, gp->ncolors);
- if (gp->trackball) gltrackball_free (gp->trackball);
-}
-
-
-XSCREENSAVER_MODULE ("DeepStars", deepstars)
-
-#endif
diff --git a/hacks/glx/deepstars.man b/hacks/glx/deepstars.man
deleted file mode 100644
index c95af2a..0000000
--- a/hacks/glx/deepstars.man
+++ /dev/null
@@ -1,57 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-deepstars \- screen saver.
-.SH SYNOPSIS
-.B deepstars
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-smear \fInumber\fP]
-.SH DESCRIPTION
-A long exposure of the night sky, showing star paths as vapor trails.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-smear \fInumber\fP
-How long the vapor trails should be.
-2.0 means twice as long, 0.5 means half as long.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2019 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/discoball.c b/hacks/glx/discoball.c
deleted file mode 100644
index e54d1b3..0000000
--- a/hacks/glx/discoball.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/* discoball, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 30 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_ball 0
-
-#include "xlockmore.h"
-#include "normals.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPIN "False"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-
-typedef struct tile tile;
-struct tile {
- XYZ position, normal;
- GLfloat size, tilt;
- tile *next;
-};
-
-
-typedef struct {
- XYZ normal;
- GLfloat color[4];
-} ray;
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- GLfloat th;
- trackball_state *trackball;
- Bool button_down_p;
- tile *tiles;
- int nrays;
- ray *rays;
-} ball_configuration;
-
-static ball_configuration *bps = NULL;
-
-static Bool do_spin;
-static GLfloat speed;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" }
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static XYZ
-normalize (XYZ p)
-{
- GLfloat d = sqrt(p.x*p.x + p.y*p.y * p.z*p.z);
- if (d < 0.0000001)
- p.x = p.y = p.z = 0;
- else
- {
- p.x /= d;
- p.y /= d;
- p.z /= d;
- }
-
- return p;
-}
-
-
-static void
-build_texture (ModeInfo *mi)
-{
- int x, y;
- int size = 128;
- int bpl = size * 2;
- unsigned char *data = malloc (bpl * size);
-
- for (y = 0; y < size; y++)
- {
- for (x = 0; x < size; x++)
- {
- unsigned char *c = &data [y * bpl + x * 2];
- GLfloat X = (x / (GLfloat) (size-1)) - 0.5;
- GLfloat Y = (y / (GLfloat) (size-1)) - 0.5;
- X = cos (X * X * 6.2);
- Y = cos (Y * Y * 6.2);
- X = X < Y ? X : Y;
- X *= 0.4;
- c[0] = 0xFF;
- c[1] = 0xFF * X;
- }
- }
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- check_gl_error ("texture param");
-
- glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, size, size, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
- check_gl_error ("light texture");
- free (data);
-}
-
-
-static int
-draw_rays (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- int i;
-
- glEnable (GL_TEXTURE_2D);
- glDisable (GL_LIGHTING);
- glEnable (GL_BLEND);
- glDisable (GL_DEPTH_TEST);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE);
-
- for (i = 0; i < bp->nrays; i++)
- {
- GLfloat x = bp->rays[i].normal.x;
- GLfloat y = bp->rays[i].normal.y;
- GLfloat z = bp->rays[i].normal.z;
- glPushMatrix();
-
- /* Orient to direction of ray. */
- glRotatef (-atan2 (x, y) * (180 / M_PI), 0, 0, 1);
- glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180 / M_PI), 1, 0, 0);
-
- glScalef (5, 5, 10);
- glTranslatef(0, 0, 1.1);
- glColor4fv (bp->rays[i].color);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glTexCoord2f (0, 0); glVertex3f (-0.5, 0, -1);
- glTexCoord2f (1, 0); glVertex3f ( 0.5, 0, -1);
- glTexCoord2f (1, 1); glVertex3f ( 0.5, 0, 1);
- glTexCoord2f (0, 1); glVertex3f (-0.5, 0, 1);
- glEnd();
- polys++;
- glPopMatrix();
- }
-
- glDisable (GL_TEXTURE_2D);
- glEnable (GL_LIGHTING);
- glDisable (GL_BLEND);
- glEnable (GL_DEPTH_TEST);
- glDisable (GL_FOG);
-
- return polys;
-}
-
-
-static int
-draw_ball_1 (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- tile *t;
- GLfloat m[4][4];
-
- glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]);
-
- glFrontFace (GL_CW);
-
-#if 0
- /* Draw the back rays.
- */
- if (! wire)
- {
- glPushMatrix();
- glLoadIdentity();
- glMultMatrixf (&m[0][0]);
- glTranslatef(0, 0, -4.1);
- glRotatef (bp->th, 0, 0, 1);
- polys += draw_rays (mi);
- glPopMatrix();
- }
- glClear(GL_DEPTH_BUFFER_BIT);
-#endif
-
-
- /* Instead of rendering polygons for the foam ball substrate, let's
- just billboard a quad down the middle to mask out the back-facing
- tiles. */
- {
- glPushMatrix();
- m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
- m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
- m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
- glLoadIdentity();
- glMultMatrixf (&m[0][0]);
- glScalef (40, 40, 40);
- glTranslatef (-0.5, -0.5, -0.01);
- if (! wire)
- glDisable (GL_LIGHTING);
- /* Draw into the depth buffer but not the frame buffer */
- glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
- glColor3f (0, 0, 0);
- glBegin (GL_QUADS);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0);
- glEnd();
- polys++;
- glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- if (! wire)
- glEnable (GL_LIGHTING);
- glPopMatrix();
- glColor3f (1, 1, 1);
- }
-
- /* Draw all the tiles.
- */
- for (t = bp->tiles; t; t = t->next)
- {
- GLfloat x = t->normal.x;
- GLfloat y = t->normal.y;
- GLfloat z = t->normal.z;
- GLfloat s = t->size / 2;
- glPushMatrix();
-
- /* Move to location of tile. */
- glTranslatef (t->position.x, t->position.y, t->position.z);
-
- /* Orient to direction tile is facing. */
- glRotatef (-atan2 (x, y) * (180 / M_PI), 0, 0, 1);
- glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180 / M_PI), 1, 0, 0);
-
- glRotatef (t->tilt, 0, 1, 0);
-
- glScalef (s, s, s);
- glNormal3f (0, 1, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (-1, 0, -1);
- glVertex3f ( 1, 0, -1);
- glVertex3f ( 1, 0, 1);
- glVertex3f (-1, 0, 1);
- glEnd();
- polys++;
-
- if (! wire)
- {
- GLfloat d = 0.2;
- glNormal3f (0, 0, -1);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (-1, 0, -1);
- glVertex3f (-1, -d, -1);
- glVertex3f ( 1, -d, -1);
- glVertex3f ( 1, 0, -1);
- glEnd();
- polys++;
-
- glNormal3f (0, 0, 1);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f ( 1, 0, 1);
- glVertex3f ( 1, -d, 1);
- glVertex3f (-1, -d, 1);
- glVertex3f (-1, 0, 1);
- glEnd();
- polys++;
-
- glNormal3f (1, 0, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f ( 1, 0, -1);
- glVertex3f ( 1, -d, -1);
- glVertex3f ( 1, -d, 1);
- glVertex3f ( 1, 0, 1);
- glEnd();
- polys++;
-
- glNormal3f (-1, 0, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (-1, 0, 1);
- glVertex3f (-1, -d, 1);
- glVertex3f (-1, -d, -1);
- glVertex3f (-1, 0, -1);
- glEnd();
- polys++;
- }
-
- glPopMatrix();
- }
-
- /* Draw the front rays.
- */
- if (! wire)
- {
- glPushMatrix();
- glLoadIdentity();
- glMultMatrixf (&m[0][0]);
- glTranslatef(0, 0, 4.1);
- glRotatef (-bp->th, 0, 0, 1);
- polys += draw_rays (mi);
- glPopMatrix();
- }
-
- return polys;
-}
-
-
-static GLfloat
-vector_angle (XYZ a, XYZ b)
-{
- double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
- double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
- double cc, angle;
-
- if (La == 0 || Lb == 0) return 0;
- if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
-
- /* dot product of two vectors is defined as:
- La * Lb * cos(angle between vectors)
- and is also defined as:
- ax*bx + ay*by + az*bz
- so:
- La * Lb * cos(angle) = ax*bx + ay*by + az*bz
- cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
- angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
- */
- cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
- if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
- angle = acos (cc);
-
- return (angle);
-}
-
-
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-static void
-build_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- int rows = MI_COUNT (mi);
-
- GLfloat tile_size = M_PI / rows;
- GLfloat th0, th1;
-
- struct { XYZ position; GLfloat strength; } dents[5];
- int dent_count = random() % countof(dents);
- int i;
- for (i = 0; i < dent_count; i++)
- {
- GLfloat dist;
- dents[i].position.x = RANDSIGN() * (2 - BELLRAND(0.2));
- dents[i].position.y = RANDSIGN() * (2 - BELLRAND(0.2));
- dents[i].position.z = RANDSIGN() * (2 - BELLRAND(0.2));
- dist = sqrt (dents[i].position.x * dents[i].position.x +
- dents[i].position.y * dents[i].position.y +
- dents[i].position.z * dents[i].position.z);
- dents[i].strength = dist - (1 - BELLRAND(0.3));
- dents[i].strength = dist - (1 - BELLRAND(0.3));
- }
-
-
- for (th1 = M_PI/2; th1 > -(M_PI/2 + tile_size/2); th1 -= tile_size)
- {
- GLfloat x = cos (th1);
- GLfloat y = sin (th1);
- GLfloat x0 = cos (th1 - tile_size/2);
- GLfloat x1 = cos (th1 + tile_size/2);
- GLfloat circ0 = M_PI * x0 * 2;
- GLfloat circ1 = M_PI * x1 * 2;
- GLfloat circ = (circ0 < circ1 ? circ0 : circ1);
- int row_tiles = floor ((circ < 0 ? 0 : circ) / tile_size);
- GLfloat spacing;
- GLfloat dropsy = 0.13 + frand(0.04);
-
- if (row_tiles <= 0) row_tiles = 1;
- spacing = M_PI*2 / row_tiles;
-
- for (th0 = 0; th0 < M_PI*2; th0 += spacing)
- {
- tile *t = (tile *) calloc (1, sizeof(*t));
- t->size = tile_size * 0.85;
- t->position.x = cos (th0) * x;
- t->position.y = sin (th0) * x;
- t->position.z = y;
-
- t->normal = t->position;
-
- /* Apply pressure on position from the dents. */
- for (i = 0; i < dent_count; i++)
- {
- GLfloat dist;
- XYZ direction;
-
- if (! (random() % 150)) /* Drop tiles randomly */
- {
- free (t);
- goto SKIP;
- }
-
- direction.x = t->position.x - dents[i].position.x;
- direction.y = t->position.y - dents[i].position.y;
- direction.z = t->position.z - dents[i].position.z;
- dist = sqrt (direction.x * direction.x +
- direction.y * direction.y +
- direction.z * direction.z);
- if (dist < dents[i].strength)
- {
- GLfloat s = 1 - (dents[i].strength - dist) * 0.66;
- XYZ n2 = t->normal;
- GLfloat angle = vector_angle (t->position, dents[i].position);
-
- /* Drop out the tiles near the apex of the dent. */
- if (angle < dropsy)
- {
- free (t);
- goto SKIP;
- }
-
- t->position.x *= s;
- t->position.y *= s;
- t->position.z *= s;
-
- direction = normalize (direction);
- n2.x -= direction.x;
- n2.y -= direction.y;
- n2.z -= direction.z;
-
- t->normal.x = (t->normal.x + n2.x) / 2;
- t->normal.y = (t->normal.y + n2.y) / 2;
- t->normal.z = (t->normal.z + n2.z) / 2;
- }
- }
-
- /* Skew the direction the tile is facing slightly. */
- t->normal.x += 0.12 - frand(0.06);
- t->normal.y += 0.12 - frand(0.06);
- t->normal.z += 0.12 - frand(0.06);
- t->tilt = 4 - BELLRAND(8);
-
- t->next = bp->tiles;
- bp->tiles = t;
- SKIP: ;
- }
- }
-
- bp->nrays = 5 + BELLRAND(10);
- bp->rays = (ray *) calloc (bp->nrays, sizeof(*bp->rays));
- for (i = 0; i < bp->nrays; i++)
- {
- GLfloat th = frand(M_PI * 2);
- bp->rays[i].normal.x = cos (th);
- bp->rays[i].normal.y = sin (th);
- bp->rays[i].normal.z = 1;
- bp->rays[i].normal = normalize (bp->rays[i].normal);
- bp->rays[i].color[0] = 0.9 + frand(0.1);
- bp->rays[i].color[1] = 0.6 + frand(0.4);
- bp->rays[i].color[2] = 0.6 + frand(0.2);
- bp->rays[i].color[3] = 1;
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_ball (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-ball_handle_event (ModeInfo *mi, XEvent *event)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_ball (ModeInfo *mi)
-{
- ball_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- if (! wire)
- build_texture (mi);
-
- reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- bp->th = 180 - frand(360);
-
- if (MI_COUNT(mi) < 10)
- MI_COUNT(mi) = 10;
- if (MI_COUNT(mi) > 200)
- MI_COUNT(mi) = 200;
-
- {
- double spin_speed = 0.1;
- double wander_speed = 0.003;
- double spin_accel = 1;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- False);
- bp->trackball = gltrackball_init (True);
- }
-
- build_ball (mi);
-
- if (!wire)
- {
- GLfloat color[4] = {0.5, 0.5, 0.5, 1};
- GLfloat cspec[4] = {1, 1, 1, 1};
- static const GLfloat shiny = 10;
-
- static GLfloat pos0[4] = { 0.5, -1, -0.5, 0};
- static GLfloat pos1[4] = {-0.75, -1, 0, 0};
- static GLfloat amb[4] = {0, 0, 0, 1};
- static GLfloat dif[4] = {1, 1, 1, 1};
- static GLfloat spc[4] = {1, 1, 1, 1};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- color[0] += frand(0.2);
- color[1] += frand(0.2);
- color[2] += frand(0.2);
-
- cspec[0] -= frand(0.2);
- cspec[1] -= frand(0.2);
- cspec[2] -= frand(0.2);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glLightfv(GL_LIGHT1, GL_POSITION, pos1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT1, GL_SPECULAR, spc);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
- glMateriali (GL_FRONT, GL_SHININESS, shiny);
- }
-}
-
-
-ENTRYPOINT void
-draw_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 6,
- (y - 0.5) * 6,
- (z - 0.5) * 2);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- mi->polygon_count = 0;
-
- glRotatef (50, 1, 0, 0);
-
- glScalef (4, 4, 4);
- glRotatef (bp->th, 0, 0, 1);
- if (! bp->button_down_p)
- {
- bp->th += (bp->th > 0 ? speed : -speed);
- while (bp->th > 360) bp->th -= 360;
- while (bp->th < -360) bp->th += 360;
- }
-
- mi->polygon_count += draw_ball_1 (mi);
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_ball (ModeInfo *mi)
-{
- ball_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- while (bp->tiles)
- {
- tile *t = bp->tiles->next;
- free (bp->tiles);
- bp->tiles = t;
- }
- if (bp->rays) free (bp->rays);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
-}
-
-XSCREENSAVER_MODULE_2 ("Discoball", discoball, ball)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/discoball.man b/hacks/glx/discoball.man
deleted file mode 100644
index 96c216a..0000000
--- a/hacks/glx/discoball.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-discoball \- A dusty, dented disco ball screen saver.
-.SH SYNOPSIS
-.B discoball
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-count \fInumber\fP]
-[\-no-wander]
-[\-spin]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-A dusty, dented disco ball. Woop woop.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-count \fInumber\fP
-Number of rows of tiles on the ball. 10 - 100. Default: 30.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the scene should spin.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/dnalogo.c b/hacks/glx/dnalogo.c
deleted file mode 100644
index bd79c5b..0000000
--- a/hacks/glx/dnalogo.c
+++ /dev/null
@@ -1,3656 +0,0 @@
-/* DNA Logo, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * DNA Lounge
- *
- * Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985.
- *
- * 375 Eleventh Street
- * San Francisco, CA
- * 94103
- *
- * https://www.dnalounge.com/
- * http://www.dnapizza.com/
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS __extension__ \
- "*delay: 25000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*doGasket: True \n" \
- "*doHelix: True \n" \
- "*doLadder: True \n" \
- "*doFrame: True \n" \
- "*wallFacets: 360 \n" \
- "*barFacets: 90 \n" \
- "*clockwise: False \n" \
- "*turns: 0.72 \n" \
- "*turnSpacing: 2.3 \n" \
- "*barSpacing: 0.268 \n" \
- "*wallHeight: 0.42 \n" \
- "*wallThickness: 0.12 \n" \
- "*barThickness: 0.058 \n" \
- "*wallTaper: 0.95 \n" \
- "*gasketSize: 2.0 \n" \
- "*gasketDepth: 0.15 \n" \
- "*gasketThickness: 0.4 \n" \
- "*frameSize: 1.28 \n" \
- "*frameDepth: 0.01 \n" \
- "*frameThickness: 0.03 \n" \
- "*triangleSize: 0.045 \n" \
- "*cwFacets: 3 \n" \
- "*cwDiscFacets: 64 \n" \
- "*cwSpread: 0.5 \n" \
- "*cwLineWidth: 0.18 \n" \
- "*cwThickness: 0.15 \n" \
- "*cwCapSize: 0.4 \n" \
- "*text: CODEWORD\n" \
- "*speed: 1.0 \n" \
- "*mode: both" "\n" \
- ".background: #000000\n" \
- ".foreground: #00AA00\n" \
- ".cwForeground: #FCA816\n" \
- ".cwBackground: #943225\n" \
- "*cwFont: " CWFONT "\n" \
- "*geometry: =640x640\n" \
-
-#define CWFONT "Yearling 28, OCR A Std 24, Courier 24"
-
-# define release_logo 0
-
-#undef DXF_OUTPUT_HACK
-
-#ifdef DXF_OUTPUT_HACK /* When this is defined, instead of rendering
- to the screen, we write a DXF CAD file to stdout.
- This is a kludge of shocking magnitude...
- Maybe there's some other way to intercept all
- glVertex3f calls than with a #define? */
-# define unit_tube dxf_unit_tube
-# define unit_cone dxf_unit_cone
-# define tube_1 dxf_tube_1
-# define tube dxf_tube
-# define cone dxf_cone
-#endif /* DXF_OUTPUT_HACK */
-
-#include "xlockmore.h"
-#include "normals.h"
-#include "tube.h"
-#include "sphere.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include "utf8wc.h"
-#include "texfont.h"
-
-#ifdef USE_GL /* whole file */
-
-#ifdef HAVE_JWZGLES
-# include "dnapizza.h"
-#else
-# define HAVE_TESS
-#endif
-
-typedef enum {
- HELIX_IN, HELIX, HELIX_OUT,
- PIZZA_IN, PIZZA, PIZZA_OUT,
- HELIX_AND_PIZZA,
-# ifdef CW
- CODEWORD_IN, CODEWORD, CODEWORD_OUT, CODEWORD_BLANK
-# endif
-} glyph_mode;
-
-typedef struct {
- Bool spinning_p;
- GLfloat position; /* 0.0 - 1.0 */
- GLfloat position_eased; /* 0.0 - 1.0, eased in and out */
- GLfloat easement; /* portion of path that is eased. <= 0.5 */
- GLfloat speed; /* how far along the path (may be negative) */
- GLfloat probability; /* relative likelyhood to start spinning */
-} spinner;
-
-typedef struct {
- GLXContext *glx_context;
-
- GLuint helix_list, helix_list_wire, helix_list_facetted;
- GLuint pizza_list, pizza_list_wire, pizza_list_facetted;
- GLuint gasket_list, gasket_list_wire;
- GLuint frame_list, frame_list_wire;
- int polys[7];
-
- int wall_facets;
- int bar_facets;
- Bool clockwise;
- GLfloat color[4];
-
- GLfloat turns;
- GLfloat turn_spacing;
- GLfloat bar_spacing;
- GLfloat wall_height;
- GLfloat wall_thickness;
- GLfloat bar_thickness;
- GLfloat wall_taper;
-
- GLfloat gasket_size;
- GLfloat gasket_depth;
- GLfloat gasket_thickness;
-
- GLfloat frame_size;
- GLfloat frame_depth;
- GLfloat frame_thickness;
- GLfloat triangle_size;
-
-# ifdef CW
- int codeword_facets, codeword_disc_facets;
- GLfloat codeword_spread, codeword_line_width, codeword_thickness;
- GLfloat codeword_cap_size;
- const char *codeword_text;
- char *codeword_text_out;
- int *codeword_text_points;
- XYZ *codeword_path;
- int codeword_path_npoints;
- int codeword_nguides;
- XYZ *codeword_guides;
- GLfloat codeword_color[4], codeword_bg[4];
- texture_font_data *font;
-# endif
-
-# ifdef DEBUG
- GLfloat persp_off, pos_off;
- texture_font_data *label_font;
-# endif
-
- GLfloat speed;
- glyph_mode mode;
- glyph_mode anim_state;
- GLfloat anim_ratio;
-
- spinner gasket_spinnerx, gasket_spinnery, gasket_spinnerz;
- spinner scene_spinnerx, scene_spinnery; /* for DNA */
-# ifdef CW
- rotator *scene_rot; /* for Codeword */
-# endif
- spinner helix_spinnerz;
- spinner pizza_spinnery, pizza_spinnerz;
- spinner frame_spinner;
-
- trackball_state *trackball;
- Bool button_down_p;
-
- int wire_overlay; /* frame countdown */
-
-} logo_configuration;
-
-static logo_configuration *dcs = NULL;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-pizza", ".mode", XrmoptionNoArg, "pizza" },
- { "-helix", ".mode", XrmoptionNoArg, "helix" },
- { "-both", ".mode", XrmoptionNoArg, "both" },
-# ifdef CW
- { "-codeword", ".mode", XrmoptionNoArg, "codeword" },
- { "-cw", ".mode", XrmoptionNoArg, "codeword" },
- { "-text", ".text", XrmoptionSepArg, 0 },
-# endif
-};
-
-ENTRYPOINT ModeSpecOpt logo_opts = {countof(opts), opts, 0, NULL, NULL};
-
-#define PROBABILITY_SCALE 600
-
-
-#ifdef DXF_OUTPUT_HACK
-
-# define glBegin dxf_glBegin
-# define glVertex3f dxf_glVertex3f
-# define glVertex3dv dxf_glVertex3dv
-# define glEnd dxf_glEnd
-# define glVertexPointer dxf_glVertexPointer
-# define glDrawArrays dxf_glDrawArrays
-
-static int dxf_type, dxf_point, dxf_point_total, dxf_layer, dxf_color;
-static GLfloat dxf_quads[4*4];
-
-static void
-dxf_glBegin (int type)
-{
- dxf_type = type;
- dxf_point = 0;
- dxf_point_total = 0;
-}
-
-static void
-dxf_glVertex3f (GLfloat ox, GLfloat oy, GLfloat oz)
-{
- int i = 0;
- GLfloat m[4*4];
- GLfloat x, y, z;
-
- /* Transform the point into modelview space. */
- glGetFloatv (GL_MODELVIEW_MATRIX, m);
- x = ox * m[0] + oy * m[4] + oz * m[8] + m[12];
- y = ox * m[1] + oy * m[5] + oz * m[9] + m[13];
- z = ox * m[2] + oy * m[6] + oz * m[10] + m[14];
-
- dxf_quads[dxf_point*3+0] = x;
- dxf_quads[dxf_point*3+1] = y;
- dxf_quads[dxf_point*3+2] = z;
- dxf_point++;
- dxf_point_total++;
-
- switch (dxf_type) {
- case GL_QUADS:
- if (dxf_point < 4) return;
-
- fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
- fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
- dxf_point = 0;
- break;
-
- case GL_QUAD_STRIP:
- if (dxf_point < 4) return;
-
- fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
- fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "12\n%.6f\n", dxf_quads[i+3]); /* funky quad strip */
- fprintf (stdout, "22\n%.6f\n", dxf_quads[i+4]); /* vert order: 1243. */
- fprintf (stdout, "32\n%.6f\n", dxf_quads[i+5]);
-
- fprintf (stdout, "13\n%.6f\n", dxf_quads[i]);
- fprintf (stdout, "23\n%.6f\n", dxf_quads[i+1]);
- fprintf (stdout, "33\n%.6f\n", dxf_quads[i+2]);
- i += 6;
-
- dxf_quads[0] = dxf_quads[6]; /* copy point 3 to pos 1 */
- dxf_quads[1] = dxf_quads[7];
- dxf_quads[2] = dxf_quads[8];
- dxf_quads[3] = dxf_quads[9]; /* copy point 4 to pos 2 */
- dxf_quads[4] = dxf_quads[10];
- dxf_quads[5] = dxf_quads[11];
- dxf_point = 2; /* leave those two points in queue */
- break;
-
- case GL_TRIANGLES:
- case GL_TRIANGLE_FAN:
- if (dxf_point < 3) return;
-
- fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
- fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
-
- i -= 3;
- fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
- fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
-
- dxf_point = 0;
- if (dxf_type == GL_TRIANGLE_FAN)
- {
- dxf_quads[3] = dxf_quads[6]; /* copy point 3 to point 2 */
- dxf_quads[4] = dxf_quads[7];
- dxf_quads[5] = dxf_quads[8];
- dxf_point = 2; /* leave two points in queue */
- }
- break;
-
- case GL_TRIANGLE_STRIP:
- if (dxf_point < 3) return;
-
- fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
-
- fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
-
- i -= 3;
- fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
- fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
-
- dxf_quads[0] = dxf_quads[3]; /* copy point 2 to pos 1 */
- dxf_quads[1] = dxf_quads[4];
- dxf_quads[2] = dxf_quads[5];
- dxf_quads[3] = dxf_quads[6]; /* copy point 3 to pos 2 */
- dxf_quads[4] = dxf_quads[7];
- dxf_quads[5] = dxf_quads[8];
- dxf_point = 2; /* leave those two points in queue */
- break;
-
- case GL_LINES:
- case GL_LINE_STRIP:
- case GL_LINE_LOOP:
-
- if (dxf_point_total == 1)
- {
- dxf_quads[6] = ox;
- dxf_quads[7] = oy;
- dxf_quads[8] = oz;
- }
-
- if (dxf_point < 2) return;
-
- fprintf (stdout, "0\nLINE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
-
- fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
-
- fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
- fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
-
- dxf_point = 0;
- if (dxf_type != GL_LINES)
- {
- dxf_quads[0] = dxf_quads[3];
- dxf_quads[1] = dxf_quads[4];
- dxf_quads[2] = dxf_quads[5];
- dxf_point = 1;
- }
- break;
-
- default:
- abort();
- break;
- }
-}
-
-
-static void
-dxf_glVertex3dv (const GLdouble *v)
-{
- glVertex3f (v[0], v[1], v[2]);
-}
-
-
-static void
-dxf_glEnd(void)
-{
- if (dxf_type == GL_LINE_LOOP) /* close loop */
- glVertex3f (dxf_quads[6], dxf_quads[7], dxf_quads[8]);
- dxf_type = -1;
- dxf_point = 0;
- dxf_point_total = 0;
-}
-
-
-static void
-dxf_start (void)
-{
- fprintf (stdout, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
- fprintf (stdout, "0\nSECTION\n2\nENTITIES\n");
-}
-
-static void
-dxf_end (void)
-{
- fprintf (stdout, "0\nENDSEC\n0\nEOF\n");
- exit (0);
-}
-
-
-static const GLvoid *dxf_vp;
-static GLsizei dxf_vp_size;
-static GLsizei dxf_vp_stride;
-
-static void
-dxf_glVertexPointer (GLint size, GLenum type, GLsizei stride,
- const GLvoid *pointer)
-{
- if (type != GL_FLOAT) abort();
- if (stride <= 0) abort();
- dxf_vp = pointer;
- dxf_vp_size = size;
- dxf_vp_stride = stride;
-}
-
-static void
-dxf_glDrawArrays (GLenum mode, GLint first, GLsizei count)
-{
- int i;
- unsigned char *a = (unsigned char *) dxf_vp;
- dxf_glBegin (mode);
- for (i = first; i < first+count; i++)
- {
- GLfloat *fa = (GLfloat *) a;
- dxf_glVertex3f (fa[0], fa[1], fa[2]);
- a += dxf_vp_stride;
- }
- dxf_glEnd();
-}
-
-
-# define XYZ tube_XYZ /* avoid conflict with normals.h */
-# include "tube.c" /* Yes, I really am including a C file. */
-# undef XYZ
-# define XYZ sphere_XYZ
-# define unit_sphere unit_sphere_dxf
-# define unit_dome unit_dome_dxf
-# include "sphere.c"
-# undef XYZ
-
-#endif /* DXF_OUTPUT_HACK */
-
-
-
-/* Calculate the angle (in radians) between two vectors.
- */
-static GLfloat
-vector_angle (double ax, double ay, double az,
- double bx, double by, double bz)
-{
- double La = sqrt (ax*ax + ay*ay + az*az);
- double Lb = sqrt (bx*bx + by*by + bz*bz);
- double cc, angle;
-
- if (La == 0 || Lb == 0) return 0;
- if (ax == bx && ay == by && az == bz) return 0;
-
- /* dot product of two vectors is defined as:
- La * Lb * cos(angle between vectors)
- and is also defined as:
- ax*bx + ay*by + az*bz
- so:
- La * Lb * cos(angle) = ax*bx + ay*by + az*bz
- cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
- angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
- */
- cc = (ax*bx + ay*by + az*bz) / (La * Lb);
- if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
- angle = acos (cc);
-
- return (angle);
-}
-
-
-# ifdef CW
-
-static void
-normalize (XYZ *p)
-{
- GLfloat d = sqrt (p->x*p->x + p->y*p->y + p->z*p->z);
- if (d != 0)
- {
- p->x /= d;
- p->y /= d;
- p->z /= d;
- }
- else
- {
- p->x = p->y = p->z = 0;
- }
-}
-
-
-static double
-dot (const XYZ u, const XYZ v)
-{
- return (u.x * v.x) + (u.y * v.y) + (u.z * v.z);
-}
-
-#endif /* CW */
-
-
-/* Make the helix
- */
-
-static int
-make_helix (logo_configuration *dc, int facetted, int wire)
-{
- int polys = 0;
- int wall_facets = dc->wall_facets / (facetted ? 10 : 1);
- GLfloat th;
- GLfloat max_th = M_PI * 2 * dc->turns;
- GLfloat th_inc = M_PI * 2 / wall_facets;
-
- GLfloat x1=0, y1=0, x2=0, y2=0;
- GLfloat x1b=0, y1b=0, x2b=0, y2b=0;
- GLfloat z1=0, z2=0;
- GLfloat h1=0, h2=0;
- GLfloat h1off=0, h2off=0;
- GLfloat z_inc = dc->turn_spacing / wall_facets;
-
- th = 0;
- x1 = 1;
- y1 = 0;
- x1b = 1;
- y1b = 0;
-
- z1 = -(dc->turn_spacing * dc->turns / 2);
-
- h1 = (dc->wall_taper > 0 ? 0 : dc->wall_height / 2);
- h1off = (dc->wall_taper > 0 ? -dc->wall_height / 2 : 0);
-
- if (!dc->clockwise)
- z1 = -z1, z_inc = -z_inc, h1off = -h1off;
-
- /* Leading end-cap
- */
- if (!wire && h1 > 0)
- {
- GLfloat nx, ny;
- glFrontFace(GL_CCW);
- glBegin(GL_QUADS);
- nx = cos (th + M_PI/2);
- ny = sin (th + M_PI/2);
- glNormal3f(nx, ny, 0);
- glVertex3f( x1, y1, z1 - h1 + h1off);
- glVertex3f( x1, y1, z1 + h1 + h1off);
- glVertex3f(x1b, y1b, z1 + h1 + h1off);
- glVertex3f(x1b, y1b, z1 - h1 + h1off);
- polys++;
- glEnd();
- }
-
- while (th + th_inc <= max_th)
- {
- GLfloat thick = dc->wall_thickness;
-
- th += th_inc;
-
- x2 = cos (th);
- y2 = sin (th);
- z2 = z1 + z_inc;
-
- h2 = h1;
- h2off = h1off;
-
- if (dc->wall_taper > 0)
- {
- h2off = 0;
- if (th < dc->wall_taper)
- {
- h2 = dc->wall_height/2 * cos (M_PI / 2
- * (1 - (th / dc->wall_taper)));
- if (dc->clockwise)
- h2off = h2 - dc->wall_height/2;
- else
- h2off = dc->wall_height/2 - h2;
-
- if (th + th_inc <= 0)
- thick = 0;
- else
- thick *= cos (M_PI / 2 * (1 - (th / dc->wall_taper)));
- }
- else if (th >= max_th - dc->wall_taper)
- {
- if (th + th_inc > max_th) /* edge case: always come to a point */
- h2 = 0;
- else
- h2 = dc->wall_height/2 * cos (M_PI / 2
- * (1 - ((max_th - th)
- / dc->wall_taper)));
- if (dc->clockwise)
- h2off = dc->wall_height/2 - h2;
- else
- h2off = h2 - dc->wall_height/2;
-
- if (th + th_inc > max_th)
- thick = 0;
- else
- thick *= cos(M_PI / 2 * (1 - ((max_th - th)/dc->wall_taper)));
- }
- }
-
- x2b = x2 * (1 - thick);
- y2b = y2 * (1 - thick);
-
- /* outer face
- */
- glFrontFace(GL_CW);
- glBegin(wire ? GL_LINES : GL_QUADS);
- glNormal3f(x1, y1, 0);
- glVertex3f(x1, y1, z1 - h1 + h1off);
- glVertex3f(x1, y1, z1 + h1 + h1off);
- glNormal3f(x2, y2, 0);
- glVertex3f(x2, y2, z2 + h2 + h2off);
- glVertex3f(x2, y2, z2 - h2 + h2off);
- polys++;
- glEnd();
-
- /* inner face
- */
- glFrontFace(GL_CCW);
- glBegin(wire ? GL_LINES : GL_QUADS);
- glNormal3f(-x1b, -y1b, 0);
- glVertex3f( x1b, y1b, z1 - h1 + h1off);
- glVertex3f( x1b, y1b, z1 + h1 + h1off);
- glNormal3f(-x2b, -y2b, 0);
- glVertex3f( x2b, y2b, z2 + h2 + h2off);
- glVertex3f( x2b, y2b, z2 - h2 + h2off);
- polys++;
- glEnd();
-
- /* top face
- */
- glFrontFace(GL_CCW);
- /* glNormal3f(0, 0, 1);*/
- do_normal (x2, y2, z2 + h2 + h2off,
- x2b, y2b, z2 + h2 + h2off,
- x1b, y1b, z1 + h1 + h1off);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f( x2, y2, z2 + h2 + h2off);
- glVertex3f( x2b, y2b, z2 + h2 + h2off);
- glVertex3f( x1b, y1b, z1 + h1 + h1off);
- glVertex3f( x1, y1, z1 + h1 + h1off);
- polys++;
- glEnd();
-
- /* bottom face
- */
- glFrontFace(GL_CCW);
- do_normal ( x1, y1, z1 - h1 + h1off,
- x1b, y1b, z1 - h1 + h1off,
- x2b, y2b, z2 - h2 + h2off);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glNormal3f(0, 0, -1);
- glVertex3f( x1, y1, z1 - h1 + h1off);
- glVertex3f( x1b, y1b, z1 - h1 + h1off);
- glVertex3f( x2b, y2b, z2 - h2 + h2off);
- glVertex3f( x2, y2, z2 - h2 + h2off);
- polys++;
- glEnd();
-
- x1 = x2;
- y1 = y2;
- x1b = x2b;
- y1b = y2b;
- z1 += z_inc;
- h1 = h2;
- h1off = h2off;
- }
-
- /* Trailing end-cap
- */
- if (!wire && h2 > 0)
- {
- GLfloat nx, ny;
- glFrontFace(GL_CW);
- glBegin(GL_QUADS);
- nx = cos (th + M_PI/2);
- ny = sin (th + M_PI/2);
- glNormal3f(nx, ny, 0);
- glVertex3f(x2, y2, z1 - h2 + h2off);
- glVertex3f(x2, y2, z1 + h2 + h2off);
- glVertex3f(x2b, y2b, z1 + h2 + h2off);
- glVertex3f(x2b, y2b, z1 - h2 + h2off);
- polys++;
- glEnd();
- }
- return polys;
-}
-
-
-static int
-make_ladder (logo_configuration *dc, int facetted, int wire)
-{
- int polys = 0;
- GLfloat th;
- GLfloat max_th = dc->turns * M_PI * 2;
- GLfloat max_z = dc->turns * dc->turn_spacing;
- GLfloat z_inc = dc->bar_spacing;
- GLfloat th_inc = M_PI * 2 * (dc->bar_spacing / dc->turn_spacing);
- GLfloat x, y, z;
-
- /* skip forward to center the bars in the helix... */
- int i;
- GLfloat usable_th = max_th - dc->wall_taper;
- GLfloat usable_z = max_z / (max_th / usable_th);
- int nbars = usable_z / dc->bar_spacing;
- GLfloat used_z, pad_z, pad_ratio;
-
- if (! (nbars & 1)) nbars--; /* always an odd number of bars */
-
- used_z = (nbars - 1) * dc->bar_spacing;
- pad_z = max_z - used_z;
- pad_ratio = pad_z / max_z;
-
- th = (max_th * pad_ratio/2);
- z = -(max_z / 2) + (max_z * pad_ratio/2);
-
- /* ##### WHYYYYYY */
- /* The image is not reflected across line y = -x and I don't know why. */
- th += M_PI * -0.035;
- z -= 0.08;
-
- if (!dc->clockwise)
- z = -z, z_inc = -z_inc;
-
- glFrontFace(GL_CCW);
- for (i = 0; i < nbars; i++)
- {
- int facets = dc->bar_facets / (facetted ? 14 : 1);
- if (facets <= 3) facets = 3;
- x = cos (th) * (1 - dc->wall_thickness);
- y = sin (th) * (1 - dc->wall_thickness);
- polys += tube ( x, y, z,
- -x, -y, z,
- dc->bar_thickness, 0, facets,
- True, True, wire);
- z += z_inc;
- th += th_inc;
- }
- return polys;
-}
-
-
-
-/* Make the gasket
- */
-
-
-static int
-make_gasket (logo_configuration *dc, int wire)
-{
- int polys = 0;
- int i;
- int points_size;
- int npoints = 0;
- int nctrls = 0;
- int res = 360/8;
- GLfloat d2r = M_PI / 180;
-
- GLfloat thick2 = (dc->gasket_thickness / dc->gasket_size) / 2;
-
- GLfloat *pointsx0, *pointsy0, *pointsx1, *pointsy1, *normals;
-
- GLfloat r0 = 0.750; /* 395 */
- GLfloat r1a = 0.825; /* bottom of wall below upper left hole */
- GLfloat r1b = 0.867; /* center of upper left hole */
- GLfloat r1c = 0.909; /* top of wall above hole */
- GLfloat r1 = 0.916; /* 471 */
- GLfloat r2 = 0.963; /* 490 */
- GLfloat r3 = 0.960; /* 499 */
- GLfloat r4 = 1.000; /* 507 */
- GLfloat r5 = 1.080; /* 553 */
-
- GLfloat ctrl_r[100], ctrl_th[100];
-
- glPushMatrix();
-
-# ifdef DXF_OUTPUT_HACK
- if (! wire) res *= 8;
-# endif
-
-# define POINT(r,th) \
- ctrl_r [nctrls] = r, \
- ctrl_th[nctrls] = (th * d2r), \
- nctrls++
-
- POINT (0.829, 0); /* top indentation, right half */
- POINT (0.831, 0.85);
- POINT (0.835, 1.81);
- POINT (0.841, 2.65);
- POINT (0.851, 3.30);
- POINT (0.862, 3.81);
- POINT (0.872, 3.95);
-
- POINT (r4, 4.0); /* moving clockwise... */
- POINT (r4, 47.0);
- POINT (r1, 47.0);
- POINT (r1, 53.0);
- POINT (r2, 55.5);
- POINT (r2, 72.3);
- POINT (r1, 74.0);
- POINT (r1, 100.0);
- POINT (r3, 102.5);
- POINT (r3, 132.0);
- POINT (r1, 133.0);
-
- POINT (r1, 180.7);
- POINT (r2, 183.6);
- POINT (r2, 210.0);
- POINT (r1, 212.0);
- POINT (r1, 223.2);
- POINT (r5, 223.2);
- POINT (r5, 225.0);
- POINT (r4, 225.0);
-
- POINT (r4, 316.8); /* upper left indentation */
- POINT (0.990, 316.87);
- POINT (0.880, 317.21);
- POINT (0.872, 317.45);
- POINT (0.869, 317.80);
- POINT (0.867, 318.10);
-
- POINT (0.867, 318.85);
- POINT (0.869, 319.15);
- POINT (0.872, 319.50);
- POINT (0.880, 319.74);
- POINT (0.990, 320.08);
-
- POINT (r4, 338.0);
- if (! wire)
- {
- POINT (r1a, 338.0); /* cut-out disc */
- POINT (r1a, 344.0);
- }
- POINT (r4, 344.0);
- POINT (r4, 356.0);
-
- POINT (0.872, 356.05); /* top indentation, left half */
- POINT (0.862, 356.19);
- POINT (0.851, 356.70);
- POINT (0.841, 357.35);
- POINT (0.835, 358.19);
- POINT (0.831, 359.15);
- POINT (0.829, 360);
-# undef POINT
-
- points_size = res + (nctrls * 2);
- pointsx0 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
- pointsy0 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
- pointsx1 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
- pointsy1 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
- normals = (GLfloat *) malloc (points_size * sizeof(GLfloat) * 2);
-
- npoints = 0;
- for (i = 1; i < nctrls; i++)
- {
- GLfloat from_r = ctrl_r [i-1];
- GLfloat from_th = ctrl_th[i-1];
- GLfloat to_r = ctrl_r [i];
- GLfloat to_th = ctrl_th[i];
-
- GLfloat step = 2*M_PI / res;
- int nsteps = 1 + ((to_th - from_th) / step);
- int j;
-
- for (j = 0; j < nsteps + (i == nctrls-1); j++)
- {
- GLfloat r = from_r + (j * (to_r - from_r) / nsteps);
- GLfloat th = from_th + (j * (to_th - from_th) / nsteps);
-
- GLfloat cth = cos(th) * dc->gasket_size;
- GLfloat sth = sin(th) * dc->gasket_size;
-
- pointsx0[npoints] = r0 * cth; /* inner ring */
- pointsy0[npoints] = r0 * sth;
- pointsx1[npoints] = r * cth; /* outer ring */
- pointsy1[npoints] = r * sth;
- npoints++;
-
- if (npoints >= points_size) abort();
- }
- }
-
- /* normals for the outer ring */
- for (i = 1; i < npoints; i++)
- {
- XYZ a, b, c, n;
- a.x = pointsx1[i-1];
- a.y = pointsy1[i-1];
- a.z = 0;
- b.x = pointsx1[i];
- b.y = pointsy1[i];
- b.z = 0;
- c = b;
- c.z = 1;
- n = calc_normal (a, b, c);
- normals[(i-1)*2 ] = n.x;
- normals[(i-1)*2+1] = n.y;
- }
-
- glRotatef(-90, 0, 1, 0);
- glRotatef(180, 0, 0, 1);
-
- if (wire)
- {
- GLfloat z;
- for (z = -thick2; z <= thick2; z += thick2*2)
- {
-# if 1
- /* inside edge */
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], pointsy0[i], z);
- polys += npoints;
- glEnd();
-
- /* outside edge */
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx1[i], pointsy1[i], z);
- polys += npoints;
- glEnd();
-# else
- for (i = 1; i < npoints; i++)
- {
- glBegin (GL_LINE_STRIP);
- glVertex3f (pointsx0[i-1], pointsy0[i-1], z);
- glVertex3f (pointsx0[i ], pointsy0[i ], z);
- glVertex3f (pointsx1[i ], pointsy1[i ], z);
- glVertex3f (pointsx1[i-1], pointsy1[i-1], z);
- glEnd();
- }
- polys += npoints;
-# endif
- }
-#if 1
- glBegin (GL_LINES);
- for (i = 0; i < npoints; i++)
- {
- /* inside rim */
- glVertex3f (pointsx0[i], pointsy0[i], -thick2);
- glVertex3f (pointsx0[i], pointsy0[i], thick2);
- /* outside rim */
- glVertex3f (pointsx1[i], pointsy1[i], -thick2);
- glVertex3f (pointsx1[i], pointsy1[i], thick2);
- }
- polys += npoints;
- glEnd();
-#endif
- }
- else
- {
- /* top */
- glFrontFace(GL_CW);
- glNormal3f(0, 0, -1);
- glBegin (GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glVertex3f (pointsx0[i], pointsy0[i], -thick2);
- glVertex3f (pointsx1[i], pointsy1[i], -thick2);
- }
- polys += npoints;
- glEnd();
-
- /* bottom */
- glFrontFace(GL_CCW);
- glNormal3f(0, 0, 1);
- glBegin (GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glVertex3f (pointsx0[i], pointsy0[i], thick2);
- glVertex3f (pointsx1[i], pointsy1[i], thick2);
- }
- polys += npoints;
- glEnd();
-
- /* inside edge */
- glFrontFace(GL_CW);
- glBegin (GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glNormal3f (-pointsx0[i], -pointsy0[i], 0);
- glVertex3f ( pointsx0[i], pointsy0[i], thick2);
- glVertex3f ( pointsx0[i], pointsy0[i], -thick2);
- }
- polys += npoints;
- glEnd();
-
- /* outside edge */
- glFrontFace(GL_CCW);
- glBegin (GL_QUADS);
- {
- for (i = 0; i < npoints-1; i++)
- {
- int ia = (i == 0 ? npoints-2 : i-1);
- int iz = (i == npoints-2 ? 0 : i+1);
- GLfloat x = pointsx1[i];
- GLfloat y = pointsy1[i];
- GLfloat xz = pointsx1[iz];
- GLfloat yz = pointsy1[iz];
-
- GLfloat nxa = normals[ia*2]; /* normal of [i-1 - i] face */
- GLfloat nya = normals[ia*2+1];
- GLfloat nx = normals[i*2]; /* normal of [i - i+1] face */
- GLfloat ny = normals[i*2+1];
- GLfloat nxz = normals[iz*2]; /* normal of [i+1 - i+2] face */
- GLfloat nyz = normals[iz*2+1];
-
- GLfloat anglea = vector_angle (nx, ny, 0, nxa, nya, 0);
- GLfloat anglez = vector_angle (nx, ny, 0, nxz, nyz, 0);
- GLfloat pointy = 0.6;
-
- if (anglea > pointy)
- {
- glNormal3f (nx, ny, 0);
- glVertex3f (x, y, thick2);
- glVertex3f (x, y, -thick2);
- }
- else
- {
- glNormal3f ((nxa + nx) / 2, (nya + ny) / 2, 0);
- glVertex3f (x, y, thick2);
- glVertex3f (x, y, -thick2);
- }
-
- if (anglez > pointy)
- {
- glNormal3f (nx, ny, 0);
- glVertex3f (xz, yz, -thick2);
- glVertex3f (xz, yz, thick2);
- }
- else
- {
- glNormal3f ((nx + nxz) / 2, (ny + nyz) / 2, 0);
- glVertex3f (xz, yz, -thick2);
- glVertex3f (xz, yz, thick2);
- }
- }
- polys += npoints;
- }
- glEnd();
- }
-
- /* Fill in the upper left hole...
- */
- {
- GLfloat th;
- npoints = 0;
-
- th = 338.0 * d2r;
- pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
- pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
- npoints++;
- pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
- pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
- npoints++;
-
- th = 344.0 * d2r;
- pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
- pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
- npoints++;
- pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
- pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
-
- if (! wire)
- {
- /* front wall */
- glNormal3f (0, 0, -1);
- glFrontFace(GL_CW);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (pointsx0[0], pointsy0[0], -thick2);
- glVertex3f (pointsx0[1], pointsy0[1], -thick2);
- glVertex3f (pointsx0[3], pointsy0[3], -thick2);
- glVertex3f (pointsx0[2], pointsy0[2], -thick2);
- glEnd();
- polys++;
-
- /* back wall */
- glNormal3f (0, 0, 1);
- glFrontFace(GL_CCW);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (pointsx0[0], pointsy0[0], thick2);
- glVertex3f (pointsx0[1], pointsy0[1], thick2);
- glVertex3f (pointsx0[3], pointsy0[3], thick2);
- glVertex3f (pointsx0[2], pointsy0[2], thick2);
- glEnd();
- polys++;
- }
-
- /* top wall */
- glFrontFace(GL_CW);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glNormal3f (pointsx0[1], pointsy0[1], 0);
- glVertex3f (pointsx0[1], pointsy0[1], thick2);
- glNormal3f (pointsx0[3], pointsy0[3], 0);
- glVertex3f (pointsx0[3], pointsy0[3], thick2);
- glVertex3f (pointsx0[3], pointsy0[3], -thick2);
- glNormal3f (pointsx0[1], pointsy0[1], 0);
- glVertex3f (pointsx0[1], pointsy0[1], -thick2);
- glEnd();
- polys++;
-
-
- /* Now make a donut.
- */
- {
- int nsteps = (wire ? 12 : 64);
- GLfloat r0 = 0.04;
- GLfloat r1 = 0.070;
- GLfloat th, cth, sth;
-
- glPushMatrix ();
-
- th = ((339.0 + 343.0) / 2) * d2r;
-
- glTranslatef (r1b * cos(th) * dc->gasket_size,
- r1b * sin(th) * dc->gasket_size,
- 0);
-
- npoints = 0;
- for (i = 0; i < nsteps; i++)
- {
- th = 2 * M_PI * i / nsteps;
- cth = cos (th) * dc->gasket_size;
- sth = sin (th) * dc->gasket_size;
- pointsx0[npoints] = r0 * cth;
- pointsy0[npoints] = r0 * sth;
- pointsx1[npoints] = r1 * cth;
- pointsy1[npoints] = r1 * sth;
- npoints++;
- polys++;
- }
-
- pointsx0[npoints] = pointsx0[0];
- pointsy0[npoints] = pointsy0[0];
- pointsx1[npoints] = pointsx1[0];
- pointsy1[npoints] = pointsy1[0];
- npoints++;
-
- if (wire)
- {
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], pointsy0[i], -thick2);
- polys += npoints;
- glEnd();
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], pointsy0[i], thick2);
- polys += npoints;
- glEnd();
-# if 0
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx1[i], pointsy1[i], -thick2);
- polys += npoints;
- glEnd();
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx1[i], pointsy1[i], thick2);
- polys += npoints;
- glEnd();
-# endif
- }
- else
- {
- /* top */
- glFrontFace(GL_CW);
- glNormal3f(0, 0, -1);
- glBegin (GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glVertex3f (pointsx0[i], pointsy0[i], -thick2);
- glVertex3f (pointsx1[i], pointsy1[i], -thick2);
- }
- polys += npoints;
- glEnd();
-
- /* bottom */
- glFrontFace(GL_CCW);
- glNormal3f(0, 0, 1);
- glBegin (GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glVertex3f (pointsx0[i], pointsy0[i], thick2);
- glVertex3f (pointsx1[i], pointsy1[i], thick2);
- }
- polys += npoints;
- glEnd();
- }
-
- /* inside edge */
- glFrontFace(GL_CW);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glNormal3f (-pointsx0[i], -pointsy0[i], 0);
- glVertex3f ( pointsx0[i], pointsy0[i], thick2);
- glVertex3f ( pointsx0[i], pointsy0[i], -thick2);
- }
- polys += npoints;
- glEnd();
-
- glPopMatrix();
- }
- }
-
-
- /* Attach the bottom-right dingus...
- */
- {
- GLfloat w = 0.05;
- GLfloat h = 0.19;
- GLfloat th;
-
- glRotatef (49.5, 0, 0, 1);
- glScalef (dc->gasket_size, dc->gasket_size, 1);
- glTranslatef (0, (r0+r1)/2, 0);
-
- /* buried box */
- if (! wire)
- {
- glFrontFace(GL_CCW);
- glBegin (wire ? GL_LINE_STRIP : GL_QUADS);
- glNormal3f (0, 0, -1);
- glVertex3f (-w/2, -h/2, -thick2); glVertex3f (-w/2, h/2, -thick2);
- glVertex3f ( w/2, h/2, -thick2); glVertex3f ( w/2, -h/2, -thick2);
- glNormal3f (1, 0, 0);
- glVertex3f ( w/2, -h/2, -thick2); glVertex3f ( w/2, h/2, -thick2);
- glVertex3f ( w/2, h/2, thick2); glVertex3f ( w/2, -h/2, thick2);
- glNormal3f (0, 0, 1);
- glVertex3f ( w/2, -h/2, thick2); glVertex3f ( w/2, h/2, thick2);
- glVertex3f (-w/2, h/2, thick2); glVertex3f (-w/2, -h/2, thick2);
- glNormal3f (-1, 0, 0);
- glVertex3f (-w/2, -h/2, thick2); glVertex3f (-w/2, h/2, thick2);
- glVertex3f (-w/2, h/2, -thick2); glVertex3f (-w/2, -h/2, -thick2);
- polys++;
- glEnd();
- }
-
- npoints = 0;
- for (th = (wire ? 0 : -0.1);
- th <= M_PI + 0.1;
- th += (M_PI / (wire ? 5 : 32)))
- {
- pointsx0[npoints] = w/2 * cos(th);
- pointsy0[npoints] = w/2 * sin(th);
- npoints++;
- polys++;
- }
-
- /* front inside curve */
- glNormal3f (0, 0, -1);
- glFrontFace(GL_CW);
- glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
- if (! wire) glVertex3f (0, h/2, -thick2);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], h/2 + pointsy0[i], -thick2);
- polys += npoints;
- glEnd();
-
- /* front outside curve */
- glFrontFace(GL_CCW);
- glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
- if (! wire) glVertex3f (0, -h/2, -thick2);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], -h/2 - pointsy0[i], -thick2);
- polys += npoints;
- glEnd();
-
- /* back inside curve */
- glNormal3f (0, 0, 1);
- glFrontFace(GL_CCW);
- glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
- if (! wire) glVertex3f (0, h/2, thick2);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], h/2 + pointsy0[i], thick2);
- polys += npoints;
- glEnd();
-
- /* back outside curve */
- glFrontFace(GL_CW);
- glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
- if (! wire) glVertex3f (0, -h/2, thick2);
- for (i = 0; i < npoints; i++)
- glVertex3f (pointsx0[i], -h/2 - pointsy0[i], thick2);
- polys += npoints;
- glEnd();
-
- /* inside curve */
- glFrontFace(GL_CCW);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glNormal3f (pointsx0[i], pointsy0[i], 0);
- glVertex3f (pointsx0[i], h/2 + pointsy0[i], thick2);
- glVertex3f (pointsx0[i], h/2 + pointsy0[i], -thick2);
- }
- polys += npoints;
- glEnd();
-
- /* outside curve */
- glFrontFace(GL_CW);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (i = 0; i < npoints; i++)
- {
- glNormal3f (pointsx0[i], -pointsy0[i], 0);
- glVertex3f (pointsx0[i], -h/2 - pointsy0[i], thick2);
- glVertex3f (pointsx0[i], -h/2 - pointsy0[i], -thick2);
- }
- polys += npoints;
- glEnd();
- }
-
- free (pointsx0);
- free (pointsy0);
- free (pointsx1);
- free (pointsy1);
- free (normals);
-
- glPopMatrix();
- return polys;
-}
-
-static int
-make_frame (logo_configuration *dc, int wire)
-{
- int polys = 0;
- int i, j;
- GLfloat x[20], y[20];
- GLfloat corner_cut = 0.5;
-
- glPushMatrix();
- glRotatef (90, 0, 1, 0);
- glScalef (4 * dc->frame_size,
- 4 * dc->frame_size,
- 4 * dc->frame_size);
-
- x[0] = -dc->frame_thickness;
- x[1] = -dc->frame_thickness * corner_cut;
- x[2] = 0;
- x[3] = 0.5 - dc->triangle_size;
- x[4] = 0.5;
- x[5] = 0.5 + dc->triangle_size;
- x[6] = 1;
- x[7] = 1 + dc->frame_thickness * corner_cut;
- x[8] = 1 + dc->frame_thickness;
-
- y[0] = -dc->frame_thickness;
- y[1] = -dc->frame_thickness * corner_cut;
- y[2] = 0;
- y[3] = dc->triangle_size;
-
- /* front and back
- */
- glTranslatef (-0.5, -0.5, dc->frame_depth / 4);
- if (! wire)
- for (j = 0; j <= 1; j++)
- {
- if (j) glTranslatef (0, 0, -dc->frame_depth / 2);
- glFrontFace (j ? GL_CCW : GL_CW);
- for (i = 0; i < 4; i++)
- {
- glNormal3f (0, 0, (j ? -1 : 1));
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- glVertex3f (x[0], y[1], 0); glVertex3f (x[0], y[2], 0);
- glVertex3f (x[1], y[0], 0); glVertex3f (x[1], y[2], 0);
- glVertex3f (x[3], y[0], 0); glVertex3f (x[3], y[2], 0);
- glVertex3f (x[4], y[0], 0); glVertex3f (x[4], y[3], 0);
- glVertex3f (x[5], y[0], 0); glVertex3f (x[5], y[2], 0);
- glVertex3f (x[7], y[0], 0); glVertex3f (x[7], y[2], 0);
- glVertex3f (x[8], y[1], 0); glVertex3f (x[8], y[2], 0);
- polys += 6;
- glEnd ();
- glTranslatef (0.5, 0.5, 0);
- glRotatef (90, 0, 0, 1);
- glTranslatef (-0.5, -0.5, 0);
- }
- }
-
- /* ledges
- */
- glFrontFace (GL_CCW);
- for (i = 0; i < 4; i++)
- {
- glNormal3f (0, 1, 0);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- glVertex3f (x[2], y[2], 0); glVertex3f (x[2], y[2], dc->frame_depth/2);
- glVertex3f (x[3], y[2], 0); glVertex3f (x[3], y[2], dc->frame_depth/2);
- glVertex3f (x[4], y[3], 0); glVertex3f (x[4], y[3], dc->frame_depth/2);
- glVertex3f (x[5], y[2], 0); glVertex3f (x[5], y[2], dc->frame_depth/2);
- glVertex3f (x[6], y[2], 0); glVertex3f (x[6], y[2], dc->frame_depth/2);
- polys += 4;
- glEnd ();
-
- glNormal3f (0, -1, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (x[7], y[0], 0);
- glVertex3f (x[7], y[0], dc->frame_depth/2);
- glVertex3f (x[1], y[0], dc->frame_depth/2);
- glVertex3f (x[1], y[0], 0);
- polys++;
- glEnd ();
-
- glNormal3f (1, -1, 0);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (x[8], y[1], 0);
- glVertex3f (x[8], y[1], dc->frame_depth/2);
- glVertex3f (x[7], y[0], dc->frame_depth/2);
- glVertex3f (x[7], y[0], 0);
- polys++;
- glEnd ();
-
- if (wire)
- {
- glNormal3f (0, 1, 0);
- for (j = 0; j <= 1; j++)
- {
- glBegin (GL_LINE_STRIP);
- glVertex3f (x[2], y[2], j*dc->frame_depth/2);
- glVertex3f (x[3], y[2], j*dc->frame_depth/2);
- glVertex3f (x[4], y[3], j*dc->frame_depth/2);
- glVertex3f (x[5], y[2], j*dc->frame_depth/2);
- glVertex3f (x[6], y[2], j*dc->frame_depth/2);
- polys += 4;
- glEnd ();
- }
- }
-
- glTranslatef (0.5, 0.5, 0);
- glRotatef (90, 0, 0, 1);
- glTranslatef (-0.5, -0.5, 0);
- }
-
- glPopMatrix();
- return polys;
-}
-
-
-/* Make some pizza.
- */
-
-#ifdef HAVE_TESS
-
-typedef struct {
- GLdouble *points;
- int i;
-} tess_out;
-
-
-static void
-tess_error_cb (GLenum errorCode)
-{
- fprintf (stderr, "%s: tesselation error: %s\n",
- progname, gluErrorString(errorCode));
- exit (0);
-}
-
-static void
-tess_combine_cb (GLdouble coords[3], GLdouble *d[4], GLfloat w[4],
- GLdouble **data_out)
-{
- GLdouble *new = (GLdouble *) malloc (3 * sizeof(*new));
- new[0] = coords[0];
- new[1] = coords[1];
- new[2] = coords[2];
- *data_out = new;
-}
-
-
-#if 0
-static void
-tess_vertex_cb (void *vertex_data, void *closure)
-{
- tess_out *to = (tess_out *) closure;
- GLdouble *v = (GLdouble *) vertex_data;
- to->points[to->i++] = v[0];
- to->points[to->i++] = v[1];
- to->points[to->i++] = v[2];
-}
-#endif
-
-static void
-tess_begin_cb (GLenum which)
-{
- glBegin(which);
-}
-
-static void
-tess_end_cb (void)
-{
- glEnd();
-}
-
-#endif /* HAVE_TESS */
-
-
-static int
-make_pizza (logo_configuration *dc, int facetted, int wire)
-{
- int polys = 0;
- int topfaces = (facetted ? 48 : 120);
- int discfaces = (facetted ? 12 : 120);
- int npoints = topfaces * 2 + 100;
- GLdouble *points = (GLdouble *) calloc (npoints * 3, sizeof(GLdouble));
- int nholes = 3;
- GLdouble *holes = (GLdouble *) calloc (topfaces*nholes*3, sizeof(GLdouble));
-
- GLfloat step = M_PI * 2 / 6 / topfaces;
- GLfloat thick2 = (dc->gasket_thickness / dc->gasket_size) / 4;
- GLfloat th, x, y, s;
- int i, j, k;
- int endpoints;
-
-# ifdef HAVE_TESS
- tess_out TO, *to = &TO;
- GLUtesselator *tess = gluNewTess();
-
- to->points = (GLdouble *) calloc (topfaces * 20, sizeof(GLdouble));
- to->i = 0;
-
-# ifndef _GLUfuncptr
-# define _GLUfuncptr void(*)(void)
-# endif
-
- gluTessCallback(tess,GLU_TESS_BEGIN, (_GLUfuncptr)tess_begin_cb);
- gluTessCallback(tess,GLU_TESS_VERTEX, (_GLUfuncptr)glVertex3dv);
- gluTessCallback(tess,GLU_TESS_END, (_GLUfuncptr)tess_end_cb);
- gluTessCallback(tess,GLU_TESS_COMBINE, (_GLUfuncptr)tess_combine_cb);
- gluTessCallback(tess,GLU_TESS_ERROR, (_GLUfuncptr)tess_error_cb);
-
- gluTessProperty (tess, GLU_TESS_BOUNDARY_ONLY, wire);
- gluTessProperty (tess,GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
-
-# endif /* HAVE_TESS */
-
- glPushMatrix();
-
- s = 1.9;
- glRotatef (180, 0, 0, 1);
- glScalef (s, s, s);
- glRotatef (90, 0, 1, 0);
- glTranslatef (-0.53, 0, 0);
- glRotatef (-30, 0, 0, 1);
-
- /* Compute the wedge */
- th = 0;
- j = 0;
-
- /* Edge 1 */
- {
- GLfloat edge[] = {
- 0.000, 0.000,
- 0.000, 0.210,
- 0.042, 0.230,
- 0.042, 0.616,
- 0.000, 0.641,
- };
- for (i = 0; i < countof(edge)/2; i++)
- {
- points[j++] = edge[i*2+1];
- points[j++] = edge[i*2];
- points[j++] = 0;
- }
- }
-
- s = 0.798; /* radius of end of slice, before crust gap */
- for (i = 0; i < topfaces; i++)
- {
- points[j++] = cos(th) * s;
- points[j++] = sin(th) * s;
- points[j++] = 0;
- th += step;
- }
-
- /* Edge 2 */
- {
- GLfloat edge[] = {
- 0.613, 0.353,
- 0.572, 0.376,
- 0.455, 0.309,
- 0.452, 0.260,
- 0.332, 0.192,
- 0.293, 0.216,
- 0.178, 0.149,
- 0.178, 0.102,
- };
- for (i = 0; i < countof(edge)/2; i++)
- {
- points[j++] = edge[i*2+1];
- points[j++] = edge[i*2];
- points[j++] = 0;
- }
- endpoints = j/3;
- }
-
-
- /* Draw the rim of the slice */
- glBegin (wire ? GL_LINES : GL_QUADS);
- x = points[0];
- y = points[1];
- for (i = (wire ? 0 : 1); i < endpoints; i++)
- {
- GLdouble *p = points + (i*3);
-
- do_normal (p[0], p[1], -thick2,
- p[0], p[1], thick2,
- x, y, thick2);
- if (!wire)
- {
- glVertex3f (x, y, -thick2);
- glVertex3f (x, y, thick2);
- }
- glVertex3f (p[0], p[1], thick2);
- glVertex3f (p[0], p[1], -thick2);
- x = p[0];
- y = p[1];
- polys++;
- }
-
- do_normal (points[0], points[1], -thick2,
- points[0], points[1], thick2,
- x, y, thick2);
- glVertex3f (x, y, -thick2);
- glVertex3f (x, y, thick2);
- glVertex3f (points[0], points[1], thick2);
- glVertex3f (points[0], points[1], -thick2);
- polys++;
- glEnd();
-
-# ifndef HAVE_TESS
- if (wire)
- {
- /* Outline of slice */
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < endpoints; i++)
- glVertex3f (points[i*3], points[i*3+1], -thick2);
- glEnd();
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < endpoints; i++)
- glVertex3f (points[i*3], points[i*3+1], thick2);
- glEnd();
- }
-# endif /* HAVE_TESS */
-
- /* Compute the holes */
- step = M_PI * 2 / discfaces;
- for (k = 0; k < nholes; k++)
- {
- GLdouble *p = holes + (discfaces * 3 * k);
- th = 0;
- j = 0;
- switch (k) {
- case 0: x = 0.34; y = 0.17; s = 0.05; break;
- case 1: x = 0.54; y = 0.17; s = 0.06; break;
- case 2: x = 0.55; y = 0.36; s = 0.06; break;
- default: abort(); break;
- }
- for (i = 0; i < discfaces; i++)
- {
- p[j++] = x + cos(M_PI*2 - th) * s;
- p[j++] = y + sin(M_PI*2 - th) * s;
- p[j++] = 0;
- th += step;
- }
- }
-
-
- /* Draw the inside rim of the holes */
- for (k = 0; k < nholes; k++)
- {
- GLdouble *p = holes + (discfaces * 3 * k);
-
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (i = 0; i < discfaces; i++)
- {
- GLdouble *p2 = p + (i*3);
- if (i > 0)
- do_normal (p2[0], p2[1], -thick2,
- p2[0], p2[1], thick2,
- p2[-3], p2[-2], thick2);
- glVertex3f (p2[0], p2[1], -thick2);
- glVertex3f (p2[0], p2[1], thick2);
- polys++;
- }
- glVertex3f (p[0], p[1], -thick2);
- glVertex3f (p[0], p[1], thick2);
- polys++;
- glEnd();
-# ifndef HAVE_TESS
- if (wire)
- {
- /* Outline of holes */
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < discfaces; i++)
- glVertex3f (p[i*3], p[i*3+1], -thick2);
- glEnd();
- glBegin (GL_LINE_LOOP);
- for (i = 0; i < discfaces; i++)
- glVertex3f (p[i*3], p[i*3+1], thick2);
- glEnd();
- }
-# endif /* !HAVE_TESS */
- }
-
-# ifdef HAVE_TESS
- glTranslatef (0, 0, -thick2);
- for (y = 0; y <= 1; y++)
- {
- if (y) glTranslatef (0, 0, thick2*2);
-
- /* A non-convex polygon */
- gluTessBeginPolygon (tess, to);
-
- glNormal3f (0, 0, (y > 0 ? 1 : -1));
- gluTessNormal (tess, 0, 0, (y > 0 ? 1 : -1));
- glFrontFace (GL_CCW);
-
- /* Tess the wedge */
- gluTessBeginContour (tess);
- for (i = 0; i < endpoints; i++)
- {
- GLdouble *p = points + (i*3);
- gluTessVertex (tess, p, p);
- polys++;
- }
- gluTessVertex (tess, points, points);
- gluTessEndContour (tess);
-
- /* Tess the holes */
- for (k = 0; k < nholes; k++)
- {
- GLdouble *p = holes + (discfaces * 3 * k);
- gluTessBeginContour (tess);
- for (i = 0; i < discfaces; i++)
- {
- GLdouble *p2 = p + (i*3);
- gluTessVertex (tess, p2, p2);
- polys++;
- }
- gluTessEndContour (tess);
- }
-
- gluTessEndPolygon (tess);
- }
-
- glTranslatef (0, 0, -thick2);
-
-# else /* !HAVE_TESS */
- if (! wire)
- {
- glTranslatef(0, 0, thick2);
- glNormal3f (0, 0, 1);
- glFrontFace (GL_CW);
-
- /* Sadly, jwzgl's glVertexPointer seems not to be recordable inside
- display lists. */
-# if 0
- glDisableClientState (GL_COLOR_ARRAY);
- glDisableClientState (GL_NORMAL_ARRAY);
- glDisableClientState (GL_TEXTURE_COORD_ARRAY);
- glEnableClientState (GL_VERTEX_ARRAY);
- glVertexPointer (3, GL_FLOAT, 0, dnapizza_triangles);
- glDrawArrays (GL_TRIANGLES, 0, countof (dnapizza_triangles) / 3);
-# else
- glBegin (GL_TRIANGLES);
- for (i = 0; i < countof (dnapizza_triangles); i += 3)
- glVertex3fv (dnapizza_triangles + i);
- glEnd();
-# endif
-
- glTranslatef(0, 0, -thick2*2);
- glNormal3f (0, 0, -1);
- glFrontFace (GL_CCW);
-
-# if 0
- glDrawArrays (GL_TRIANGLES, 0, countof (dnapizza_triangles) / 3);
-# else
- int i;
- glBegin (GL_TRIANGLES);
- for (i = 0; i < countof (dnapizza_triangles); i += 3)
- glVertex3fv (dnapizza_triangles + i);
- glEnd();
-# endif
-
- glTranslatef(0, 0, thick2);
- }
-# endif /* !HAVE_TESS */
-
-
- /* Compute the crust */
-
- s = 0.861; /* radius of inside of crust */
- step = M_PI * 2 / 6 / topfaces;
- th = 0;
- j = 0;
- for (i = 0; i < topfaces; i++)
- {
- points[j++] = cos(th) * s;
- points[j++] = sin(th) * s;
- points[j++] = 0;
- th += step;
- }
-
- s = 1;
- for (i = 0; i < topfaces; i++)
- {
- points[j++] = cos(th) * s;
- points[j++] = sin(th) * s;
- points[j++] = 0;
- th -= step;
- }
-
- /* Draw the rim of the crust */
- glFrontFace (GL_CCW);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (i = 0; i < topfaces * 2; i++)
- {
- GLdouble *p = points + (i*3);
- if (i == 0 || i == (topfaces*2)-1)
- glNormal3f (0, -1, 0);
- else if (i == topfaces-1 || i == topfaces)
- glNormal3f (0, 1, 0);
- else
- do_normal (p[-3], p[-2], thick2,
- p[0], p[1], thick2,
- p[0], p[1], -thick2);
- glVertex3f (p[0], p[1], -thick2);
- glVertex3f (p[0], p[1], thick2);
- polys++;
- }
- glVertex3f (points[0], points[1], -thick2);
- glVertex3f (points[0], points[1], thick2);
- polys++;
- glEnd();
-
- if (wire)
- {
- glBegin (GL_LINE_STRIP);
- for (i = 0; i < topfaces * 2; i++)
- {
- GLdouble *p = points + (i*3);
- glVertex3f (p[0], p[1], -thick2);
- polys++;
- }
- glVertex3f (points[0], points[1], -thick2);
- glEnd();
-
- glBegin (GL_LINE_STRIP);
- for (i = 0; i < topfaces * 2; i++)
- {
- GLdouble *p = points + (i*3);
- glVertex3f (p[0], p[1], thick2);
- polys++;
- }
- glVertex3f (points[0], points[1], thick2);
- glEnd();
- }
-
- /* Draw the top of the crust */
- if (! wire)
- {
- glFrontFace (GL_CW);
- glBegin (wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
- glNormal3f (0, 0, -1);
- if (!wire)
- for (i = 0; i < topfaces; i++)
- {
- int ii = topfaces + (topfaces - i - 1);
- GLdouble *p1 = points + (i*3);
- GLdouble *p2 = points + (ii*3);
- glVertex3f (p1[0], p1[1], -thick2);
- glVertex3f (p2[0], p2[1], -thick2);
- polys++;
- }
- polys++;
- glEnd();
-
- /* Draw the bottom of the crust */
- glFrontFace (GL_CCW);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- glNormal3f (0, 0, 1);
- for (i = 0; i < topfaces; i++)
- {
- int ii = topfaces + (topfaces - i - 1);
- GLdouble *p1 = points + (i*3);
- GLdouble *p2 = points + (ii*3);
- glVertex3f (p1[0], p1[1], thick2);
- glVertex3f (p2[0], p2[1], thick2);
- polys++;
- }
- polys++;
- glEnd();
- }
-
-# ifdef HAVE_TESS
- gluDeleteTess (tess);
- free (to->points);
-# endif /* HAVE_TESS */
-
- free (points);
- free (holes);
-
- glPopMatrix();
-
- return polys;
-}
-
-
-# ifdef CW
-
-/* Upcase string, convert Unicrud to ASCII, remove any non-letters.
- */
-static char *
-codeword_simplify_text (const char *s0)
-{
- char *s1 = utf8_to_latin1 ((s0 ? s0 : ""), True);
- int L = strlen(s1);
- char *s2 = (char *) malloc (L + 10);
- char *s3 = s2;
- int i;
- for (i = 0; i < L; i++)
- {
- char c = s1[i];
- if (c >= 'a' && c <= 'z')
- c -= 'a'-'A';
- if (c >= 'A' && c <= 'Z')
- *s3++ = c;
- }
- *s3 = 0;
- if (! *s2)
- strcpy (s2, "CODEWORD");
- return s2;
-}
-
-
-static void
-make_codeword_path (ModeInfo *mi)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- int letters = strlen (dc->codeword_text);
-
- GLfloat rtick = dc->codeword_spread;
- GLfloat iradius = rtick * dc->codeword_cap_size;
-
- int dial = 0;
- int letter;
- GLfloat last_r = 0;
-
- GLfloat inner_circum = M_PI * 2 * (iradius + rtick * 2);
- GLfloat outer_circum = M_PI * 2 * (iradius + rtick * (letters + 1));
- GLfloat facet_length = inner_circum / (26 * dc->codeword_facets);
- int outer_facets = ceil (outer_circum / facet_length);
-
- int *histo = (int *) calloc (letters * 26, sizeof(*histo));
- XYZ *points = (XYZ *) calloc (letters * outer_facets, sizeof (*points));
- int npoints = 0;
-
- for (letter = -1; letter < letters; letter++)
- {
- if (letter == -1) /* Inner starting point */
- {
- points[npoints].x = iradius;
- points[npoints].y = 0;
- last_r = iradius;
- npoints++;
- }
- else /* Add arc for this letter */
- {
- int direction = (letter & 1 ? -1 : 1);
- int v = (dc->codeword_text[letter] - 'A' + 1);
- int dial1 = dial + v * direction;
-
- GLfloat th;
- GLfloat th0 = M_PI * 2 / 26 * dial;
- GLfloat th1 = M_PI * 2 / 26 * dial1;
- GLfloat r = iradius + rtick * (letter + 2);
- GLfloat circum = M_PI * 2 * r;
- GLfloat arc_length = circum * v / 26;
- int arc_facets = ceil (fabs (arc_length / facet_length));
- GLfloat facet_th = (th1 - th0) / arc_facets;
-
- if (arc_facets > outer_facets) abort();
-
- /* Let's put some intermediate facets on the crossbars too,
- so that the animation doesn't speed up on those. */
- {
- GLfloat rr;
- for (rr = last_r + facet_length;
- rr <= r - facet_length;
- rr += facet_length)
- {
- points[npoints].x = rr * cos (th0);
- points[npoints].y = rr * sin (th0);
- npoints++;
- }
- last_r = r;
- }
-
-
- for (th = th0;
- (th0 < th1
- ? th <= th1 + facet_th
- : th >= th1 + facet_th);
- th += facet_th)
- {
- GLfloat th2 = th;
- if (th0 < th1 && th > th1)
- th2 = th1;
- if (th0 > th1 && th < th1)
- th2 = th1;
- points[npoints].x = r * cos (th2);
- points[npoints].y = r * sin (th2);
-
- /* Ugh, add point only if it differs from prev.
- Not sure how this happens. */
- if (npoints == 0 ||
- points[npoints-1].x != points[npoints].x ||
- points[npoints-1].y != points[npoints].y)
- npoints++;
- }
-
- /* Mark up the histo array to find the outer border. */
- {
- int i;
- for (i = dial;
- (direction > 0
- ? i <= dial1
- : i >= dial1);
- i += direction)
- {
- int x = (i + 26) % 26;
- int y;
- for (y = 0; y <= letter; y++)
- histo[y * 26 + x]++;
- }
- }
-
- dc->codeword_text_points[letter] = npoints;
-
- dial = dial1;
- }
- }
-
- if (npoints >= letters * outer_facets) abort();
-
-# if 0
- { /* Print histo */
- int x, y;
- for (y = 0; y < letters; y++)
- {
- fprintf (stderr, "%2d: ", y);
- for (x = 0; x < 26; x++)
- fprintf (stderr, "%x", histo[y * 26 + x]);
- fprintf (stderr, "\n");
- }
- fprintf (stderr, "\n");
- }
-# endif
-
-
- /* Find a gap in the outer edge, to draw guide dots. */
- {
- int x, y;
- int last_row = letters;
- int start_dial = -1, end_dial = -1;
-
- for (y = letters-1; y >= 0; y--)
- {
- for (x = 0; x < 26; x++)
- {
- if (histo[y * 26 + x] == 0)
- {
- if (last_row != y)
- start_dial = end_dial = -1;
- last_row = y;
- if (start_dial == -1)
- start_dial = x;
- end_dial = x;
- }
- }
- }
-
- if (last_row < letters-1 && start_dial >= 0)
- {
- GLfloat r = iradius + rtick * (last_row + 2);
- int i;
-
- dc->codeword_nguides = 0;
- dc->codeword_guides = (XYZ *)
- calloc (end_dial - start_dial + 1, sizeof (*dc->codeword_guides));
- for (i = start_dial; i <= end_dial; i++)
- {
- GLfloat th = i * M_PI * 2 / 26;
- GLfloat x = r * cos (th);
- GLfloat y = r * sin (th);
- dc->codeword_guides[dc->codeword_nguides].x = x;
- dc->codeword_guides[dc->codeword_nguides].y = y;
- dc->codeword_nguides++;
- }
- }
- free (histo);
- histo = 0;
- }
-
- dc->codeword_path_npoints = npoints;
- dc->codeword_path = points;
-}
-
-
-static int
-draw_codeword_cap (ModeInfo *mi)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
-
- int segments = dc->codeword_disc_facets;
- GLfloat size = dc->codeword_spread * dc->codeword_cap_size;
- GLfloat width = dc->codeword_line_width / 2;
- GLfloat thick = dc->codeword_thickness / 2;
- GLfloat r1 = size + width/2;
- GLfloat r2 = size - width/2;
- GLfloat facet, th, z;
-
- if (wire) segments = 12;
- facet = M_PI * 2 / segments;
-
- glPushMatrix();
-
- /* Top and bottom */
-
- for (z = -thick; z <= thick; z += thick*2)
- {
- glNormal3f (0, 0, (z < 0 ? -1 : 1));
- glFrontFace (z < 0 ? GL_CCW : GL_CW);
-
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (th = 0; th <= M_PI*2; th += facet)
- {
- GLfloat x = cos (th);
- GLfloat y = sin (th);
- glVertex3f (r1 * x, r1 * y, z);
- glVertex3f (r2 * x, r2 * y, z);
- }
- glEnd();
-
- if (wire)
- {
- glBegin (GL_LINE_LOOP);
- for (th = 0; th <= M_PI*2; th += facet)
- {
- GLfloat x = cos (th);
- GLfloat y = sin (th);
- glVertex3f (r1 * x, r1 * y, z);
- }
- glEnd();
- glBegin (GL_LINE_LOOP);
- for (th = 0; th <= M_PI*2; th += facet)
- {
- GLfloat x = cos (th);
- GLfloat y = sin (th);
- glVertex3f (r2 * x, r2 * y, z);
- }
- glEnd();
- }
- }
-
- /* Inside and outside */
-
- for (z = -1; z <= 1; z += 2)
- {
- glFrontFace (z < 0 ? GL_CCW : GL_CW);
-
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (th = 0; th <= M_PI*2; th += facet)
- {
- GLfloat th1 = th + facet;
- GLfloat x0 = cos (th);
- GLfloat y0 = sin (th);
- GLfloat x1 = cos (th1);
- GLfloat y1 = sin (th1);
- GLfloat r = z < 0 ? r1 : r2;
-
- if (z < 0)
- do_normal (r * x0, r * y0, thick,
- r * x0, r * y0, -thick,
- r * x1, r * y1, -thick);
- else
- do_normal (r * x1, r * y1, thick,
- r * x1, r * y1, -thick,
- r * x0, r * y0, -thick);
-
- glVertex3f (r * x0, r * y0, thick);
- glVertex3f (r * x0, r * y0, -thick);
- }
- glEnd();
- }
-
- glPopMatrix();
-
- return polys;
-}
-
-
-static int
-draw_codeword_guides (ModeInfo *mi, GLfloat anim_ratio)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
-
- int segments = dc->codeword_disc_facets;
- GLfloat s = dc->codeword_line_width / 2;
- GLfloat each = 1.0 / dc->codeword_nguides;
- int i;
-
- if (wire) segments = 6;
-
- for (i = 0; i < dc->codeword_nguides; i++)
- {
- GLfloat ratio;
- if (anim_ratio < i*each) ratio = 0;
- else if (anim_ratio >= (i+1)*each) ratio = 1;
- else ratio = (anim_ratio - i*each) / each;
-
- if (ratio <= 0) continue;
- if (ratio == 0) ratio = 0.001;
-
- glPushMatrix();
- glTranslatef (dc->codeword_guides[i].x,
- dc->codeword_guides[i].y,
- dc->codeword_guides[i].z);
-
- glScalef (ratio, ratio, ratio);
-
- /* If the line width and thickness are pretty close to each other,
- use spheres. Otherwise use tubes.
- */
- if (dc->codeword_thickness < dc->codeword_line_width * 1.3 &&
- dc->codeword_thickness > dc->codeword_line_width / 1.3)
- {
- glScalef (s, s, s);
- glFrontFace (GL_CCW);
- polys += unit_sphere (segments, segments, wire);
- }
- else
- {
- polys += tube (0, 0, -dc->codeword_thickness / 2,
- 0, 0, dc->codeword_thickness / 2,
- s, 0, segments, True, True, wire);
- }
-
- glPopMatrix();
- }
-
- return polys;
-}
-
-
-/* Compute the characters at which the cursor is currently pointing,
- and render it on the logo.
- */
-static void
-codeword_text_output (ModeInfo *mi, GLfloat anim_ratio)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- int i;
- int L = strlen (dc->codeword_text);
- int point = dc->codeword_path_npoints * anim_ratio;
- Bool hit = False;
-
- if (dc->anim_state == CODEWORD_BLANK)
- point = 0;
-
- for (i = 0; i < L; i++)
- {
- if (point >= dc->codeword_text_points[i])
- dc->codeword_text_out[i] = dc->codeword_text[i];
- else if (hit)
- dc->codeword_text_out[i] = 0;
- else
- {
- int steps = dc->codeword_text[i] - 'A' + 1;
- int last = (i > 0 ? dc->codeword_text_points[i-1] : 0);
- double ratio = ((point - last) /
- (double) (dc->codeword_text_points[i] - last));
- char chr = 'A' + (ratio * steps);
- if (ratio < 0.1) chr = 0;
- dc->codeword_text_out[i] = chr;
- hit = True;
- }
- }
- dc->codeword_text_out[i] = 0;
-
- if (*dc->codeword_text_out &&
- !strcmp (dc->codeword_text, "CODEWORD"))
- {
- int i;
- int L2 = strlen (dc->codeword_text_out);
- GLfloat ss = 0.01;
- int ascent, descent;
-
- glPushMatrix();
- glColor4fv (dc->codeword_color);
- glRotatef (90, 0, 1, 0);
- glRotatef (-90, 0, 0, 1);
-
- for (i = 0; i < L2; i++)
- {
- XCharStruct e;
- char buf[2];
- glPushMatrix();
- glRotatef ((i + 0.5) * 360 / 26.0, 0, 0, 1);
-
-# if 0
- {
- GLfloat th;
- glDisable(GL_LIGHTING);
- glBegin(GL_LINES);
- glVertex3f(0,0,0);
- glVertex3f(0,-4,0);
- glEnd();
- glBegin(GL_LINE_STRIP);
- for (th = M_PI * 1.45; th < M_PI * 1.55; th += 0.1)
- {
- GLfloat r = 3.85;
- glVertex3f (r * cos(th), r * sin(th), 0);
- }
- glEnd();
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- }
-# endif
-
- glTranslatef (0, -dc->codeword_spread * (L - 1), 0);
- glScalef (ss, ss, ss);
- buf[0] = dc->codeword_text_out[i] + ('a' - 'A');
- buf[1] = 0;
- texture_string_metrics (dc->font, buf, &e, &ascent, &descent);
-
- glTranslatef (-e.width * 1.0,
- -(ascent + descent + e.descent * 2.4), /* #### WTF */
- 0);
-
- glScalef (2, 2, 2);
-
-# if 0
- glDisable(GL_LIGHTING);
- glBegin(GL_LINE_LOOP);
- glVertex3f(0, 0, 0);
- glVertex3f(e.width, 0, 0);
- glVertex3f(e.width, e.ascent + e.descent, 0);
- glVertex3f(0, e.ascent + e.descent, 0);
- glEnd();
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
-# endif
-
- glDisable(GL_CULL_FACE); /* tell texfont.c to draw both sides */
- print_texture_string (dc->font, buf);
- glEnable(GL_CULL_FACE);
-
- glPopMatrix();
- }
- glPopMatrix();
- }
-}
-
-
-/* Convert the precomputed path to a thick line of polygons.
- We could actually precompute all of these polygons too,
- but it's fast enough.
- */
-static int
-draw_codeword_path (ModeInfo *mi)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
-
- GLfloat anim_ratio = (dc->anim_state == CODEWORD_IN ? dc->anim_ratio :
- dc->anim_state == CODEWORD_OUT ? 1 - dc->anim_ratio :
- dc->anim_state == CODEWORD_BLANK ? 0 :
- 1);
- int last_anim_point = 0;
-
- GLfloat width = dc->codeword_line_width / 2;
- GLfloat thick = dc->codeword_thickness / 2;
- int i, k;
- GLfloat j;
-
- int quad_size = (dc->codeword_path_npoints + 1) * 2;
- XYZ *quads = (XYZ *) calloc (quad_size, sizeof(*quads));
- XYZ *norms = (XYZ *) calloc (quad_size, sizeof(*norms));
- int nquads = 0;
-
- for (i = 0; i < dc->codeword_path_npoints; i++)
- {
- XYZ p1 = dc->codeword_path[i];
- XYZ p2 = (i < dc->codeword_path_npoints-1
- ? dc->codeword_path[i+1]
- : dc->codeword_path[i-1]);
- XYZ p1a, p1b;
-
- XYZ n; /* normal of the first line segment */
- n.x = -(p2.y - p1.y);
- n.y = (p2.x - p1.x);
- n.z = 0;
- normalize (&n);
-
- if (i == 0)
- {
- p1a.x = p1.x - width / 2 * n.x;
- p1a.y = p1.y - width / 2 * n.y;
- p1a.z = 0;
-
- p1b.x = p1.x + width / 2 * n.x;
- p1b.y = p1.y + width / 2 * n.y;
- p1b.z = 0;
- }
- else if (i == dc->codeword_path_npoints - 1)
- {
- p1b.x = p1.x - width / 2 * n.x;
- p1b.y = p1.y - width / 2 * n.y;
- p1b.z = 0;
-
- p1a.x = p1.x + width / 2 * n.x;
- p1a.y = p1.y + width / 2 * n.y;
- p1a.z = 0;
- }
- else
- {
- XYZ p0 = dc->codeword_path[i-1];
-
- XYZ t, t0, t1; /* tangent of corner between two line segments */
- XYZ m; /* miter line: normal of tangent */
- GLfloat d; /* length of miter */
-
- t0.x = p2.x - p1.x;
- t0.y = p2.y - p1.y;
- t0.z = p2.z - p1.z;
- normalize (&t0);
-
- t1.x = p1.x - p0.x;
- t1.y = p1.y - p0.y;
- t1.z = p1.z - p0.z;
- normalize (&t1);
-
- t.x = t0.x + t1.x;
- t.y = t0.y + t1.y;
- t.z = t0.z + t1.z;
- normalize (&t);
-
- m.x = -t.y;
- m.y = t.x;
- m.z = 0;
-
- /* find length of miter by projecting it on one of the normals */
- d = width / 2 / dot (m, n);
-
- p1a.x = p1.x - d * m.x;
- p1a.y = p1.y - d * m.y;
- p1a.z = 0;
-
- p1b.x = p1.x + d * m.x;
- p1b.y = p1.y + d * m.y;
- p1b.z = 0;
- }
-
- quads[nquads++] = p1a;
- quads[nquads++] = p1b;
-
- if (nquads >= quad_size) abort();
-
- if (i / (double) dc->codeword_path_npoints > anim_ratio)
- break;
-
- last_anim_point = i;
- }
-
-
- /* Compute normals for each point along the interior edge */
- for (k = 0; k <= 1; k++)
- {
- for (i = k; i < nquads-2; i += 2)
- {
- XYZ p1a = quads[i];
- XYZ p2a = quads[i+2];
- XYZ p1b = p1a;
- XYZ p2b = p2a;
- p1a.z = thick; /* a: top */
- p1b.z = -thick; /* b: bottom */
- p2a.z = thick;
- p2b.z = -thick;
-
- norms[i] = (k == 0
- ? calc_normal (p1a, p1b, p2b)
- : calc_normal (p2a, p2b, p1a));
- }
- }
-
- glPushMatrix();
- glColor4fv (dc->codeword_color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dc->codeword_color);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- codeword_text_output (mi, anim_ratio);
-
- glRotatef (90, 1, 0, 0);
- glRotatef (90, 0, 1, 0);
- glRotatef (-90, 0, 0, 1);
- glScalef (0.8, 0.8, 0.8);
-
- glNormal3f (0, 0, -1);
-
- if (anim_ratio <= 0)
- {
- polys += draw_codeword_cap (mi);
- goto DONE;
- }
-
-# if 0
- glColor3f (1, 0, 0);
- glBegin(GL_LINE_STRIP);
- for (i = 0; i < dc->codeword_path_npoints; i++)
- {
- glVertex3f (dc->codeword_path[i].x,
- dc->codeword_path[i].y,
- dc->codeword_path[i].z);
- polys++;
- }
- glEnd();
- glColor4fv (dc->codeword_color);
-# endif
-
- if (wire)
- {
- int k;
- GLfloat j;
- for (i = 0; i <= 1; i++)
- for (j = -thick; j <= thick; j += thick*2)
- {
- glBegin (GL_LINE_STRIP);
- for (k = i; k < nquads; k += 2)
- {
- glVertex3f (quads[k].x, quads[k].y, j);
- polys++;
- }
- glEnd();
- }
- }
-
- /* Top and bottom */
-
- for (j = -thick; j <= thick; j += thick*2)
- {
- if (j < 0)
- {
- glNormal3f (0, 0, -1);
- glFrontFace (GL_CW);
- }
- else
- {
- glNormal3f (0, 0, 1);
- glFrontFace (GL_CCW);
- }
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (i = 0; i < nquads; i += 2)
- {
- glVertex3f (quads[i+1].x, quads[i+1].y, j);
- glVertex3f (quads[i].x, quads[i].y, j);
- polys++;
- }
- glEnd();
- }
-
- /* Edges */
-
- for (k = 0; k <= 1; k++)
- {
- if (k > 0)
- {
- glNormal3f (0, 0, -1);
- glFrontFace (GL_CW);
- }
- else
- {
- glNormal3f (0, 0, 1);
- glFrontFace (GL_CCW);
- }
-
- glBegin (wire ? GL_LINES : GL_QUADS);
- for (i = k; i < nquads; i += 2)
- {
- XYZ p1a = quads[i];
- XYZ p2a = (i < nquads-2) ? quads[i+2] : p1a;
- XYZ p1b = p1a;
- XYZ p2b = p2a;
-
- XYZ n1 = norms[i];
- XYZ n2 = (i < nquads-2) ? norms[i+2] : n1;
-
- /* If the two normals are very similar, smooth the face.
- If they are different, it's a sharp turn, and use the
- same normal for both edges (not quite right, but close).
- */
- GLfloat angle = vector_angle (n1.x, n1.y, n1.z,
- n2.x, n2.y, n2.z);
- GLfloat pointy = 0.8;
-
- p1a.z = thick;
- p1b.z = -thick;
- p2a.z = thick;
- p2b.z = -thick;
-
- glNormal3f (n1.x, n1.y, n1.z);
- glVertex3f (p1a.x, p1a.y, p1a.z);
- glVertex3f (p1b.x, p1b.y, p1b.z);
-
- if (angle < pointy)
- glNormal3f (n2.x, n2.y, n2.z);
- glVertex3f (p2b.x, p2b.y, p2b.z);
- glVertex3f (p2a.x, p2a.y, p2a.z);
- polys++;
- }
- glEnd();
- }
-
-
- /* Only draw the guides when the path is almost complete;
- fade them in and out based on completeness. */
- {
- GLfloat size = 0.95;
- GLfloat r = (anim_ratio > size
- ? (anim_ratio - size) / (1 - size)
- : 0);
- polys += draw_codeword_guides (mi, r);
- }
-
-
- /* Draw the start and end caps */
- {
- int i;
- GLfloat x, y, z, x2, y2, z2, X, Y, Z;
- GLfloat r = dc->codeword_spread * dc->codeword_cap_size;
-
- i = 0;
- x = dc->codeword_path[i].x;
- y = dc->codeword_path[i].y;
- z = dc->codeword_path[i].z;
-
- x -= r;
-
- glPushMatrix();
- glTranslatef (x, y, z);
- polys += draw_codeword_cap (mi);
- glPopMatrix();
-
- /* end cap */
-
- i = last_anim_point + 1;
- if (i > dc->codeword_path_npoints - 1)
- i = dc->codeword_path_npoints - 1;
-
- x = dc->codeword_path[i].x;
- y = dc->codeword_path[i].y;
- z = dc->codeword_path[i].z;
-
- i--;
- x2 = dc->codeword_path[i].x;
- y2 = dc->codeword_path[i].y;
- z2 = dc->codeword_path[i].z;
-
- X = (x2 - x);
- Y = (y2 - y);
- Z = (z2 - z);
-
- glPushMatrix();
- glTranslatef (x, y, z);
- glRotatef (-atan2 (X, Y) * (180 / M_PI), 0, 0, 1);
- glRotatef ( atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI), 1, 0, 0);
- glTranslatef (0, -r, 0);
- polys += draw_codeword_cap (mi);
- glPopMatrix();
- }
-
- DONE:
-
- glPopMatrix();
-
- free (quads);
- free (norms);
-
- return polys;
-}
-
-#endif /* CW */
-
-
-ENTRYPOINT void
-reshape_logo (ModeInfo *mi, int width, int height)
-{
-# ifdef DEBUG
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
-# endif
- GLfloat h = (GLfloat) height / (GLfloat) width;
- GLfloat persp = 64; /* 30 */
- GLfloat pos = 13; /* 30 */
-
-# ifdef DEBUG
- persp += dc->persp_off;
- pos += dc->pos_off;
-# endif
-
- glViewport (0, 0, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (persp, 1/h, 1, 100);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0, 0, pos,
- 0, 0, 0,
- 0, 1, 0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-gl_init (ModeInfo *mi)
-{
-/* logo_configuration *dc = &dcs[MI_SCREEN(mi)]; */
- int wire = MI_IS_WIREFRAME(mi);
-
- GLfloat position[] = {0, 0, 0, 0};
- GLfloat direction[] = {3, -1, -3};
-
- position[0] = -direction[0];
- position[1] = -direction[1];
- position[2] = -direction[2];
-
- if (!wire)
- {
- glLightfv(GL_LIGHT0, GL_POSITION, position);
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);
- glShadeModel(GL_SMOOTH);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- }
-}
-
-
-ENTRYPOINT void
-init_logo (ModeInfo *mi)
-{
- logo_configuration *dc;
- int do_gasket = get_boolean_resource(mi->dpy, "doGasket", "Boolean");
- int do_helix = get_boolean_resource(mi->dpy, "doHelix", "Boolean");
- int do_ladder = (do_helix &&
- get_boolean_resource(mi->dpy, "doLadder", "Boolean"));
- int do_frame = get_boolean_resource(mi->dpy, "doFrame", "Boolean");
- GLfloat helix_rot = 147.0;
-
- if (!do_gasket && !do_helix)
- {
- fprintf (stderr, "%s: no helix or gasket?\n", progname);
- exit (1);
- }
-
- MI_INIT (mi, dcs);
-
- dc = &dcs[MI_SCREEN(mi)];
-
- if ((dc->glx_context = init_GL(mi)) != NULL) {
- gl_init(mi);
- reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- dc->wall_facets = get_integer_resource(mi->dpy, "wallFacets", "Integer");
- dc->bar_facets = get_integer_resource(mi->dpy, "barFacets", "Integer");
- dc->clockwise = get_boolean_resource(mi->dpy, "clockwise", "Boolean");
- dc->turns = get_float_resource(mi->dpy, "turns", "Float");
- dc->turn_spacing = get_float_resource(mi->dpy, "turnSpacing", "Float");
- dc->bar_spacing = get_float_resource(mi->dpy, "barSpacing", "Float");
- dc->wall_height = get_float_resource(mi->dpy, "wallHeight", "Float");
- dc->wall_thickness = get_float_resource(mi->dpy, "wallThickness", "Float");
- dc->bar_thickness = get_float_resource(mi->dpy, "barThickness", "Float");
- dc->wall_taper = get_float_resource(mi->dpy, "wallTaper", "Float");
-
- dc->gasket_size = get_float_resource(mi->dpy,"gasketSize", "Float");
- dc->gasket_depth = get_float_resource(mi->dpy,"gasketDepth", "Float");
- dc->gasket_thickness = get_float_resource(mi->dpy,"gasketThickness","Float");
-
- dc->frame_size = get_float_resource(mi->dpy, "frameSize", "Float");
- dc->frame_depth = get_float_resource(mi->dpy, "frameDepth", "Float");
- dc->frame_thickness = get_float_resource(mi->dpy, "frameThickness", "Float");
- dc->triangle_size = get_float_resource(mi->dpy, "triangleSize", "Float");
-
- dc->speed = get_float_resource(mi->dpy, "speed", "Float");
-# ifdef CW
- dc->codeword_text = get_string_resource(mi->dpy, "text", "String");
- dc->codeword_text = codeword_simplify_text (dc->codeword_text);
- dc->codeword_text_out =
- calloc (strlen(dc->codeword_text) + 1, sizeof(*dc->codeword_text_out));
- dc->codeword_text_points =
- (int *) calloc (strlen(dc->codeword_text) + 1,
- sizeof(*dc->codeword_text_points));
-
- dc->codeword_facets = get_integer_resource(mi->dpy, "cwFacets", "Integer");
- dc->codeword_disc_facets = get_integer_resource(mi->dpy,
- "cwDiscFacets", "Integer");
- dc->codeword_spread = get_float_resource(mi->dpy, "cwSpread", "Float");
- dc->codeword_line_width = get_float_resource(mi->dpy, "cwLineWidth", "Float");
- dc->codeword_thickness = get_float_resource(mi->dpy, "cwThickness", "Float");
- dc->codeword_cap_size = get_float_resource(mi->dpy, "cwCapSize", "Float");
-# endif
-
- {
- char *s = get_string_resource (MI_DISPLAY (mi), "mode", "String");
- if (!s || !*s || !strcasecmp (s, "helix"))
- dc->mode = HELIX;
- else if (!strcasecmp (s, "pizza"))
- dc->mode = PIZZA;
- else if (!strcasecmp (s, "both"))
- dc->mode = HELIX_AND_PIZZA;
-# ifdef CW
- else if (!strcasecmp (s, "codeword"))
- dc->mode = CODEWORD_IN;
-# endif
- else
- {
- fprintf (stderr,
- "%s: mode must be helix, pizza or both, not \"%s\"\n",
- progname, s);
- exit (1);
- }
- if (s) free (s);
-
- dc->anim_state = (dc->mode == HELIX_AND_PIZZA
- ? ((random() & 1) ? HELIX : PIZZA)
- : dc->mode);
- dc->anim_ratio = 0;
- }
-
-# ifdef CW
- if (dc->mode == CODEWORD_IN)
- dc->font = load_texture_font (MI_DISPLAY(mi), "cwFont");
-# endif
-
-# ifdef DEBUG
- dc->label_font = load_texture_font (MI_DISPLAY(mi), "fpsFont");
-# endif
-
- {
- XColor xcolor;
-
- char *color_name =
- get_string_resource (mi->dpy, "foreground", "Foreground");
- char *s2;
- for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
- if (*s2 == ' ' || *s2 == '\t')
- *s2 = 0;
- else
- break;
-
- if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
- {
- fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
- exit (1);
- }
-
- dc->color[0] = xcolor.red / 65535.0;
- dc->color[1] = xcolor.green / 65535.0;
- dc->color[2] = xcolor.blue / 65535.0;
- dc->color[3] = 1.0;
-
- free (color_name);
- color_name = get_string_resource (mi->dpy, "cwForeground", "Foreground");
- for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
- if (*s2 == ' ' || *s2 == '\t')
- *s2 = 0;
- else
- break;
-
- if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
- {
- fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
- exit (1);
- }
- free (color_name);
-
-# ifdef CW
- dc->codeword_color[0] = xcolor.red / 65535.0;
- dc->codeword_color[1] = xcolor.green / 65535.0;
- dc->codeword_color[2] = xcolor.blue / 65535.0;
- dc->codeword_color[3] = 1.0;
-
- color_name = get_string_resource (mi->dpy, "cwBackground", "Background");
- for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
- if (*s2 == ' ' || *s2 == '\t')
- *s2 = 0;
- else
- break;
-
- if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
- {
- fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
- exit (1);
- }
- free (color_name);
-
- dc->codeword_bg[0] = xcolor.red / 65535.0;
- dc->codeword_bg[1] = xcolor.green / 65535.0;
- dc->codeword_bg[2] = xcolor.blue / 65535.0;
- dc->codeword_bg[3] = 1.0;
-# endif /* CW */
- }
-
- dc->trackball = gltrackball_init (False);
-
- dc->gasket_spinnerx.probability = 0.1;
- dc->gasket_spinnery.probability = 0.1;
- dc->gasket_spinnerz.probability = 1.0;
- dc->gasket_spinnerx.easement = 0.08;
- dc->gasket_spinnery.easement = 0.08;
- dc->gasket_spinnerz.easement = 0.08;
-
- dc->helix_spinnerz.probability = 0.6;
- dc->helix_spinnerz.easement = 0.2;
-
- dc->pizza_spinnerz.probability = 0.6;
- dc->pizza_spinnery.probability = 0.6;
- dc->pizza_spinnerz.easement = 0.2;
- dc->pizza_spinnery.easement = 0.2;
-
- dc->frame_spinner.probability = 5.0;
- dc->frame_spinner.easement = 0.2;
-
- dc->scene_spinnerx.probability = 0.1;
- dc->scene_spinnery.probability = 0.0;
- dc->scene_spinnerx.easement = 0.1;
- dc->scene_spinnery.easement = 0.1;
-
-# ifdef CW
- if (dc->mode == CODEWORD_IN)
- {
- double tilt_speed = 0.003;
- dc->scene_rot = make_rotator (0, 0, 0, 0, tilt_speed, True);
- }
-# endif
-
- /* start the frame off-screen */
- dc->frame_spinner.spinning_p = True;
- dc->frame_spinner.position = 0.3;
- dc->frame_spinner.speed = 0.001;
-
- if (dc->speed > 0) /* start off with the gasket in motion */
- {
- dc->gasket_spinnerz.spinning_p = True;
- dc->gasket_spinnerz.speed = (0.002
- * ((random() & 1) ? 1 : -1)
- * dc->speed);
- }
-
-# ifdef DXF_OUTPUT_HACK
- {
-# if 0
- dc->frame_depth = dc->gasket_depth;
- dxf_layer = 1;
- dxf_color = 3;
- dxf_start();
- glPushMatrix();
- glRotatef(90, 1, 0, 0);
- glRotatef(90, 0, 0, 1);
- make_pizza (dc, 0, 0);
-
- glPushMatrix();
- glRotatef(helix_rot, 0, 0, 1);
- make_ladder (dc, 0, 0);
- make_helix (dc, 0, 0);
- glRotatef (180, 0, 0, 1);
- make_helix (dc, 0, 0);
- glPopMatrix();
-
- dxf_layer++;
- make_gasket (dc, 0);
- dxf_layer++;
- make_frame (dc, 0);
- glPopMatrix();
- dxf_end();
-# else
- dxf_start();
- glPushMatrix();
- glRotatef(90, 1, 0, 0);
- glRotatef(90, 0, 0, 1);
- dc->anim_state = CODEWORD;
- make_codeword_path (mi);
- draw_codeword_path (mi);
- glPopMatrix();
- dxf_end();
-# endif
- }
-# endif
-
- glPushMatrix();
- dc->helix_list = glGenLists (1);
- glNewList (dc->helix_list, GL_COMPILE);
- glRotatef(helix_rot, 0, 0, 1);
- if (do_ladder) dc->polys[0] += make_ladder (dc, 0, 0);
- if (do_helix) dc->polys[0] += make_helix (dc, 0, 0);
- glRotatef(180, 0, 0, 1);
- if (do_helix) dc->polys[0] += make_helix (dc, 0, 0);
- glEndList ();
- glPopMatrix();
-
- glPushMatrix();
- dc->helix_list_wire = glGenLists (1);
- glNewList (dc->helix_list_wire, GL_COMPILE);
-/* glRotatef(helix_rot, 0, 0, 1); wtf? */
- if (do_ladder) dc->polys[1] += make_ladder (dc, 1, 1);
- if (do_helix) dc->polys[1] += make_helix (dc, 1, 1);
- glRotatef(180, 0, 0, 1);
- if (do_helix) dc->polys[1] += make_helix (dc, 1, 1);
- glEndList ();
- glPopMatrix();
-
- glPushMatrix();
- dc->helix_list_facetted = glGenLists (1);
- glNewList (dc->helix_list_facetted, GL_COMPILE);
- glRotatef(helix_rot, 0, 0, 1);
- if (do_ladder) dc->polys[2] += make_ladder (dc, 1, 0);
- if (do_helix) dc->polys[2] += make_helix (dc, 1, 0);
- glRotatef(180, 0, 0, 1);
- if (do_helix) dc->polys[2] += make_helix (dc, 1, 0);
- glEndList ();
- glPopMatrix();
-
- dc->pizza_list = glGenLists (1);
- glNewList (dc->pizza_list, GL_COMPILE);
- if (do_frame) dc->polys[5] += make_pizza (dc, 0, 0);
- glEndList ();
-
- dc->pizza_list_wire = glGenLists (1);
- glNewList (dc->pizza_list_wire, GL_COMPILE);
- if (do_frame) dc->polys[6] += make_pizza (dc, 1, 1);
- glEndList ();
-
- dc->pizza_list_facetted = glGenLists (1);
- glNewList (dc->pizza_list_facetted, GL_COMPILE);
- if (do_frame) dc->polys[6] += make_pizza (dc, 1, 0);
- glEndList ();
-
- dc->gasket_list = glGenLists (1);
- glNewList (dc->gasket_list, GL_COMPILE);
- if (do_gasket) dc->polys[3] += make_gasket (dc, 0);
- glEndList ();
-
- dc->gasket_list_wire = glGenLists (1);
- glNewList (dc->gasket_list_wire, GL_COMPILE);
- if (do_gasket) dc->polys[4] += make_gasket (dc, 1);
- glEndList ();
-
- dc->frame_list = glGenLists (1);
- glNewList (dc->frame_list, GL_COMPILE);
- if (do_frame) dc->polys[5] += make_frame (dc, 0);
- glEndList ();
-
- dc->frame_list_wire = glGenLists (1);
- glNewList (dc->frame_list_wire, GL_COMPILE);
- if (do_frame) dc->polys[6] += make_frame (dc, 1);
- glEndList ();
-
-# ifdef CW
- make_codeword_path (mi);
-# endif
-
- /* When drawing both solid and wireframe objects,
- make sure the wireframe actually shows up! */
- glEnable (GL_POLYGON_OFFSET_FILL);
- glPolygonOffset (1.0, 1.0);
-}
-
-
-ENTRYPOINT Bool
-logo_handle_event (ModeInfo *mi, XEvent *event)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, dc->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &dc->button_down_p))
- return True;
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
-
-# ifdef DEBUG
- {
- GLfloat step = 0.1;
- if (c == 'a') dc->persp_off += step;
- else if (c == 'z') dc->persp_off -= step;
- else if (c == 's') dc->pos_off += step;
- else if (c == 'x') dc->pos_off -= step;
- else return False;
-
- /* dc->pos_off = -dc->persp_off; */
- reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- return True;
- }
-# endif
-
- if (c == ' ' || c == '\t')
- {
- switch (dc->anim_state) {
- case HELIX:
- dc->anim_state = HELIX_OUT;
- dc->anim_ratio = 0.0;
- return True;
- case PIZZA:
- dc->anim_state = PIZZA_OUT;
- dc->anim_ratio = 0.0;
- return True;
-# ifdef CW
- case CODEWORD:
- dc->anim_state = CODEWORD_OUT;
- dc->anim_ratio = 0.0;
- return True;
-# endif
- default:
- break;
- }
- }
- }
-
- return False;
-}
-
-
-static GLfloat
-spinner_ease (GLfloat x)
-{
- /* Smooth curve up, ending at slope = 1. */
- return cos ((x/2 + 1) * M_PI) + 1;
-}
-
-
-static void
-tick_spinner (ModeInfo *mi, spinner *s)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
-
- if (dc->speed == 0) return;
- if (dc->button_down_p) return;
-
- if (s->spinning_p)
- {
- s->position += s->speed;
- if (s->position >= 1.0 || s->position <= 0.0)
- {
- s->position = 0;
- s->position_eased = 0;
- s->spinning_p = False;
- }
- else if (s->easement > 0 && s->position <= s->easement)
- s->position_eased = (s->easement *
- spinner_ease (s->position / s->easement));
- else if (s->easement > 0 && s->position >= 1-s->easement)
- s->position_eased = (1 - s->easement *
- spinner_ease ((1 - s->position) / s->easement));
- else
- s->position_eased = s->position;
- }
- else if (s->probability &&
- (random() % (int) (PROBABILITY_SCALE / s->probability)) == 0)
- {
- GLfloat ss = 0.004;
- s->spinning_p = True;
- s->position = 0;
- do {
- s->speed = dc->speed * (frand(ss/3) + frand(ss/3) + frand(ss/3));
- } while (s->speed <= 0);
- if (random() & 1)
- {
- s->speed = -s->speed;
- s->position = 1.0;
- }
- }
-}
-
-
-static void
-link_spinners (ModeInfo *mi, spinner *s0, spinner *s1)
-{
- if (s0->spinning_p && !s1->spinning_p)
- {
- GLfloat op = s1->probability;
- s1->probability = PROBABILITY_SCALE;
- tick_spinner (mi, s1);
- s1->probability = op;
- }
-}
-
-
-ENTRYPOINT void
-draw_logo (ModeInfo *mi)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat gcolor[4];
- GLfloat specular[] = {0.8, 0.8, 0.8, 1.0};
- GLfloat shininess = 50.0;
- Bool pizza_p;
-# ifdef CW
- Bool codeword_p;
-# endif
-
- if (!dc->glx_context)
- return;
-
- mi->polygon_count = 0;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *dc->glx_context);
-
- if (!wire &&
- dc->wire_overlay == 0 &&
- (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
- dc->wire_overlay = ((random() % 200) +
- (random() % 200) +
- (random() % 200));
-
-# ifndef DEBUG
- tick_spinner (mi, &dc->gasket_spinnerx);
- tick_spinner (mi, &dc->gasket_spinnery);
- tick_spinner (mi, &dc->gasket_spinnerz);
- tick_spinner (mi, &dc->helix_spinnerz);
- tick_spinner (mi, &dc->pizza_spinnery);
- tick_spinner (mi, &dc->pizza_spinnerz);
- tick_spinner (mi, &dc->scene_spinnerx);
- tick_spinner (mi, &dc->scene_spinnery);
- tick_spinner (mi, &dc->frame_spinner);
- link_spinners (mi, &dc->scene_spinnerx, &dc->scene_spinnery);
-# endif /* DEBUG */
-
- switch (dc->anim_state)
- {
- case HELIX:
- if (dc->mode == HELIX_AND_PIZZA &&
- (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
- dc->anim_state = HELIX_OUT;
- break;
-
- case HELIX_OUT:
- dc->anim_ratio += 0.1 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = PIZZA_IN;
- }
- break;
-
- case PIZZA_IN:
- dc->anim_ratio += 0.1 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = PIZZA;
- }
- break;
-
- case PIZZA:
- if (dc->mode == HELIX_AND_PIZZA &&
- (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
- dc->anim_state = PIZZA_OUT;
- break;
-
- case PIZZA_OUT:
- dc->anim_ratio += 0.1 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = HELIX_IN;
- }
- break;
-
- case HELIX_IN:
- dc->anim_ratio += 0.1 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = HELIX;
- }
- break;
-
-
-# ifdef CW
- case CODEWORD_IN:
- dc->scene_spinnerx.probability = 0.2;
- dc->scene_spinnery.probability = 0.05;
- if (! dc->button_down_p)
- dc->anim_ratio += 0.004 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_state = CODEWORD;
- dc->anim_ratio = frand (0.5);
- }
- break;
-
- case CODEWORD:
- dc->scene_spinnerx.probability = 0.5;
- dc->scene_spinnery.probability = 0.2;
- if (! dc->button_down_p)
- dc->anim_ratio += (0.0005 + frand(0.002)) * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = CODEWORD_OUT;
- }
- break;
-
- case CODEWORD_OUT:
- dc->scene_spinnerx.probability = 0;
- dc->scene_spinnery.probability = 0;
- if (! dc->button_down_p)
- dc->anim_ratio += 0.02 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = CODEWORD_BLANK;
- }
- break;
-
- case CODEWORD_BLANK:
- dc->scene_spinnerx.probability = 0;
- dc->scene_spinnery.probability = 0;
- if (! dc->button_down_p)
- dc->anim_ratio += 0.01 * dc->speed;
- if (dc->anim_ratio >= 1.0)
- {
- dc->anim_ratio = 0.0;
- dc->anim_state = CODEWORD_IN;
- }
- break;
-# endif /* CW */
-
- default:
- abort();
- break;
- }
-
-# ifdef DEBUG
- dc->anim_state = HELIX;
- dc->wire_overlay = 0;
-# endif
-
- pizza_p = (dc->anim_state == PIZZA ||
- dc->anim_state == PIZZA_IN ||
- dc->anim_state == PIZZA_OUT);
-
-# ifdef CW
- codeword_p = (dc->anim_state == CODEWORD ||
- dc->anim_state == CODEWORD_IN ||
- dc->anim_state == CODEWORD_OUT ||
- dc->anim_state == CODEWORD_BLANK);
-# endif
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
- glRotatef(current_device_rotation(), 0, 0, 1);
- {
- GLfloat scale = 1.8;
- glScalef(scale, scale, scale);
-
- glColor3f(dc->color[0], dc->color[1], dc->color[2]);
-
-
- /* Draw frame before trackball rotation */
-# ifdef CW
- if (! codeword_p)
-# endif
- {
- GLfloat p = (dc->frame_spinner.position_eased >= 0
- ? dc->frame_spinner.position_eased
- : -dc->frame_spinner.position_eased);
- GLfloat size = (p > 0.5 ? 1-p : p);
- scale = 1 + (size * 10);
- glPushMatrix();
- /* gltrackball_rotate (dc->trackball); */
- glRotatef(90, 1, 0, 0);
- glRotatef(90, 0, 0, 1);
-
- glScalef (1, scale, scale);
- if (wire)
- {
- glDisable (GL_LIGHTING);
- glCallList (dc->frame_list_wire);
- mi->polygon_count += dc->polys[6];
- }
- else if (dc->wire_overlay != 0)
- {
- glCallList (dc->frame_list);
- glDisable (GL_LIGHTING);
- glColor3fv (dc->color);
- glCallList (dc->frame_list_wire);
- mi->polygon_count += dc->polys[6];
- if (!wire) glEnable (GL_LIGHTING);
- }
- else
- {
- glCallList (dc->frame_list);
- mi->polygon_count += dc->polys[5];
- }
- glPopMatrix();
- }
-
- gltrackball_rotate (dc->trackball);
-
- glRotatef(90, 1, 0, 0);
- glRotatef(90, 0, 0, 1);
-
-# ifdef CW
- if (! codeword_p)
-# endif
- {
- glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0);
- glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1);
-
- glPushMatrix();
-
- glRotatef (360 * dc->gasket_spinnerx.position_eased, 0, 1, 0);
- glRotatef (360 * dc->gasket_spinnery.position_eased, 0, 0, 1);
- glRotatef (360 * dc->gasket_spinnerz.position_eased, 1, 0, 0);
-
- memcpy (gcolor, dc->color, sizeof (dc->color));
- if (dc->wire_overlay != 0)
- {
- gcolor[0] = gcolor[1] = gcolor[2] = 0;
- specular[0] = specular[1] = specular[2] = 0;
- shininess = 0;
- }
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gcolor);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specular);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shininess);
-
- if (wire)
- {
- glDisable (GL_LIGHTING);
- glCallList (dc->gasket_list_wire);
- mi->polygon_count += dc->polys[4];
- }
- else if (dc->wire_overlay != 0)
- {
- glCallList (dc->gasket_list);
- glDisable (GL_LIGHTING);
- glColor3fv (dc->color);
- glCallList (dc->gasket_list_wire);
- mi->polygon_count += dc->polys[4];
- if (!wire) glEnable (GL_LIGHTING);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gcolor);
- }
- else
- {
- glCallList (dc->gasket_list);
- mi->polygon_count += dc->polys[3];
- }
- glPopMatrix();
-
- if (pizza_p)
- {
- glRotatef (360 * dc->pizza_spinnery.position_eased, 1, 0, 0);
- glRotatef (360 * dc->pizza_spinnerz.position_eased, 0, 0, 1);
- }
- else
- {
- glRotatef (360 * dc->helix_spinnerz.position_eased, 0, 0, 1);
- }
-
- scale = ((dc->anim_state == PIZZA_IN || dc->anim_state == HELIX_IN)
- ? dc->anim_ratio
- : ((dc->anim_state == PIZZA_OUT || dc->anim_state == HELIX_OUT)
- ? 1.0 - dc->anim_ratio
- : 1.0));
- if (scale <= 0) scale = 0.001;
- glScalef (scale, scale, scale);
-
- if (wire)
- {
- glDisable (GL_LIGHTING);
- if (pizza_p)
- glCallList (dc->pizza_list_wire);
- else
- glCallList (dc->helix_list_wire);
- mi->polygon_count += dc->polys[1];
- }
- else if (dc->wire_overlay != 0)
- {
- if (pizza_p)
- glCallList (dc->pizza_list_facetted);
- else
- glCallList (dc->helix_list_facetted);
-
- glDisable (GL_LIGHTING);
- glColor3fv (dc->color);
-
- if (pizza_p)
- glCallList (dc->pizza_list_wire);
- else
- glCallList (dc->helix_list_wire);
-
- mi->polygon_count += dc->polys[2];
- if (!wire) glEnable (GL_LIGHTING);
- }
- else
- {
- if (pizza_p)
- glCallList (dc->pizza_list);
- else
- glCallList (dc->helix_list);
- mi->polygon_count += dc->polys[0];
- }
- }
-# ifdef CW
- else /* codeword_p */
- {
-# if 0
- double max = 70; /* face front */
- double x, y, z;
- get_position (dc->scene_rot, &x, &y, &z, !dc->button_down_p);
- glRotatef (max/2 - x*max, 0, 0, 1);
- glRotatef (max/2 - y*max, 0, 1, 0);
- /* glRotatef (max/2 - z*max, 1, 0, 0); */
-# else
- glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0);
- glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1);
-# endif
-
- glClearColor (dc->codeword_bg[0],
- dc->codeword_bg[1],
- dc->codeword_bg[2],
- dc->codeword_bg[3]);
- mi->polygon_count += draw_codeword_path (mi);
- }
-# endif /* CW */
- }
- glPopMatrix();
-
- if (dc->wire_overlay > 0)
- dc->wire_overlay--;
-
-# ifdef DEBUG
- {
- char s[1024];
- sprintf (s, "a/z, s/x; per = %0.2f pos = %0.2f",
- dc->persp_off, dc->pos_off);
- glColor3f (1,1,1);
- print_texture_label (dpy, dc->label_font, MI_WIDTH(mi), MI_HEIGHT(mi),
- 1, s);
- }
-# endif
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_logo (ModeInfo *mi)
-{
- logo_configuration *dc = &dcs[MI_SCREEN(mi)];
- if (!dc->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *dc->glx_context);
- if (dc->trackball) gltrackball_free (dc->trackball);
-# ifdef CW
- if (dc->codeword_text) free (dc->codeword_text);
- if (dc->codeword_text_out) free (dc->codeword_text_out);
- if (dc->scene_rot) free_rotator (dc->scene_rot);
- if (dc->font) free_texture_font (dc->font);
-# endif
-# ifdef DEBUG
- if (dc->label_font) free_texture_font (dc->label_font);
-# endif
- glDeleteLists(dc->helix_list, 1);
- glDeleteLists(dc->helix_list_wire, 1);
- glDeleteLists(dc->helix_list_facetted, 1);
- glDeleteLists(dc->pizza_list, 1);
- glDeleteLists(dc->pizza_list_wire, 1);
- glDeleteLists(dc->pizza_list_facetted, 1);
- glDeleteLists(dc->gasket_list, 1);
- glDeleteLists(dc->gasket_list_wire, 1);
- glDeleteLists(dc->frame_list, 1);
- glDeleteLists(dc->frame_list_wire, 1);
-}
-
-XSCREENSAVER_MODULE_2 ("DNALogo", dnalogo, logo)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/dnapizza.h b/hacks/glx/dnapizza.h
deleted file mode 100644
index 6dd48b9..0000000
--- a/hacks/glx/dnapizza.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* DNA Pizza Logo, Copyright (c) 2011-2012 Jamie Zawinski <jwz@dnalounge.com>
-
- Since GLUtesselator doesn't exist in the iOS build, the slice shape
- of the DNA Pizza logo is hardcoded there, instead of being generated.
- (These vertexes were generated by GLUtesselator and saved.)
- */
-
-static const GLfloat dnapizza_triangles[]={
- 0.315,0.213301,0, 0.296699,0.195,0, 0.309,0.455,0,
- 0.296699,0.195,0, 0.29,0.17,0, 0.309,0.455,0,
- 0.309,0.455,0, 0.29,0.17,0, 0.26,0.452,0,
- 0.29,0.17,0, 0.23,0.042,0, 0.26,0.452,0,
- 0.26,0.452,0, 0.23,0.042,0, 0.216,0.293,0,
- 0.23,0.042,0, 0.21,0,0, 0.216,0.293,0,
- 0.216,0.293,0, 0.21,0,0, 0.149,0.178,0,
- 0.21,0,0, 0.102,0.178,0, 0.149,0.178,0,
- 0.376,0.572,0, 0.353,0.613,0, 0.411,0.68402,0,
- 0.376,0.572,0, 0.411,0.68402,0, 0.383301,0.195,0,
- 0.376,0.572,0, 0.383301,0.195,0, 0.365,0.213301,0,
- 0.376,0.572,0, 0.365,0.213301,0, 0.34,0.22,0,
- 0.376,0.572,0, 0.34,0.22,0, 0.315,0.213301,0,
- 0.376,0.572,0, 0.315,0.213301,0, 0.309,0.455,0,
- 0.39,0.17,0, 0.383301,0.195,0, 0.411,0.68402,0,
- 0.39,0.17,0, 0.411,0.68402,0, 0.48,0.17,0,
- 0.39,0.17,0, 0.48,0.17,0, 0.488039,0.14,0,
- 0.39,0.17,0, 0.488039,0.14,0, 0.51,0.118038,0,
- 0.39,0.17,0, 0.51,0.118038,0, 0.616,0.042,0,
- 0.39,0.17,0, 0.616,0.042,0, 0.383301,0.145,0,
- 0.798,0,0, 0.641,0,0, 0.645595,0.469053,0,
- 0.798,0,0, 0.645595,0.469053,0, 0.653683,0.457714,0,
- 0.798,0,0, 0.653683,0.457714,0, 0.661572,0.446236,0,
- 0.798,0,0, 0.661572,0.446236,0, 0.669259,0.434622,0,
- 0.798,0,0, 0.669259,0.434622,0, 0.676742,0.422876,0,
- 0.798,0,0, 0.676742,0.422876,0, 0.68402,0.411,0,
- 0.798,0,0, 0.68402,0.411,0, 0.691088,0.399,0,
- 0.798,0,0, 0.691088,0.399,0, 0.697947,0.386878,0,
- 0.798,0,0, 0.697947,0.386878,0, 0.704592,0.374638,0,
- 0.798,0,0, 0.704592,0.374638,0, 0.711023,0.362284,0,
- 0.798,0,0, 0.711023,0.362284,0, 0.717238,0.34982,0,
- 0.798,0,0, 0.717238,0.34982,0, 0.723234,0.337249,0,
- 0.798,0,0, 0.723234,0.337249,0, 0.729009,0.324576,0,
- 0.798,0,0, 0.729009,0.324576,0, 0.734563,0.311803,0,
- 0.798,0,0, 0.734563,0.311803,0, 0.739893,0.298936,0,
- 0.798,0,0, 0.739893,0.298936,0, 0.744997,0.285978,0,
- 0.798,0,0, 0.744997,0.285978,0, 0.749875,0.272932,0,
- 0.798,0,0, 0.749875,0.272932,0, 0.754524,0.259803,0,
- 0.798,0,0, 0.754524,0.259803,0, 0.758943,0.246596,0,
- 0.798,0,0, 0.758943,0.246596,0, 0.763131,0.233313,0,
- 0.798,0,0, 0.763131,0.233313,0, 0.767087,0.219959,0,
- 0.798,0,0, 0.767087,0.219959,0, 0.770809,0.206538,0,
- 0.798,0,0, 0.770809,0.206538,0, 0.774296,0.193054,0,
- 0.798,0,0, 0.774296,0.193054,0, 0.777547,0.179511,0,
- 0.798,0,0, 0.777547,0.179511,0, 0.780562,0.165914,0,
- 0.798,0,0, 0.780562,0.165914,0, 0.783338,0.152266,0,
- 0.798,0,0, 0.783338,0.152266,0, 0.785877,0.138571,0,
- 0.798,0,0, 0.785877,0.138571,0, 0.788175,0.124835,0,
- 0.798,0,0, 0.788175,0.124835,0, 0.790234,0.11106,0,
- 0.798,0,0, 0.790234,0.11106,0, 0.792052,0.097252,0,
- 0.798,0,0, 0.792052,0.097252,0, 0.793628,0.083414,0,
- 0.798,0,0, 0.793628,0.083414,0, 0.794963,0.06955,0,
- 0.798,0,0, 0.794963,0.06955,0, 0.796056,0.055666,0,
- 0.798,0,0, 0.796056,0.055666,0, 0.796906,0.041764,0,
- 0.798,0,0, 0.796906,0.041764,0, 0.797514,0.02785,0,
- 0.798,0,0, 0.797514,0.02785,0, 0.797878,0.013927,0,
- 0.641,0,0, 0.616,0.042,0, 0.620162,0.502198,0,
- 0.641,0,0, 0.620162,0.502198,0, 0.628833,0.491298,0,
- 0.641,0,0, 0.628833,0.491298,0, 0.637311,0.480248,0,
- 0.641,0,0, 0.637311,0.480248,0, 0.645595,0.469053,0,
- 0.616,0.042,0, 0.51,0.118038,0, 0.54,0.11,0,
- 0.616,0.042,0, 0.54,0.11,0, 0.57,0.118038,0,
- 0.616,0.042,0, 0.57,0.118038,0, 0.591962,0.14,0,
- 0.616,0.042,0, 0.591962,0.14,0, 0.6,0.17,0,
- 0.616,0.042,0, 0.6,0.17,0, 0.601962,0.33,0,
- 0.616,0.042,0, 0.601962,0.33,0, 0.61,0.36,0,
- 0.616,0.042,0, 0.61,0.36,0, 0.611303,0.512945,0,
- 0.616,0.042,0, 0.611303,0.512945,0, 0.620162,0.502198,0,
- 0.48,0.17,0, 0.411,0.68402,0, 0.422875,0.676743,0,
- 0.48,0.17,0, 0.422875,0.676743,0, 0.434622,0.669259,0,
- 0.48,0.17,0, 0.434622,0.669259,0, 0.446236,0.661572,0,
- 0.48,0.17,0, 0.446236,0.661572,0, 0.457714,0.653684,0,
- 0.48,0.17,0, 0.457714,0.653684,0, 0.469052,0.645596,0,
- 0.48,0.17,0, 0.469052,0.645596,0, 0.480248,0.637311,0,
- 0.48,0.17,0, 0.480248,0.637311,0, 0.488038,0.2,0,
- 0.616,0.042,0, 0.23,0.042,0, 0.315,0.126699,0,
- 0.616,0.042,0, 0.315,0.126699,0, 0.34,0.12,0,
- 0.616,0.042,0, 0.34,0.12,0, 0.365,0.126699,0,
- 0.616,0.042,0, 0.365,0.126699,0, 0.383301,0.145,0,
- 0.23,0.042,0, 0.29,0.17,0, 0.296699,0.145,0,
- 0.23,0.042,0, 0.296699,0.145,0, 0.315,0.126699,0,
- 0.58362,0.544235,0, 0.593029,0.533966,0, 0.601961,0.39,0,
- 0.593029,0.533966,0, 0.602258,0.523535,0, 0.601961,0.39,0,
- 0.601961,0.39,0, 0.602258,0.523535,0, 0.61,0.36,0,
- 0.602258,0.523535,0, 0.611303,0.512945,0, 0.61,0.36,0,
- 0.58,0.411962,0, 0.55,0.42,0, 0.554337,0.574033,0,
- 0.58,0.411962,0, 0.554337,0.574033,0, 0.564271,0.564271,0,
- 0.58,0.411962,0, 0.564271,0.564271,0, 0.574033,0.554338,0,
- 0.58,0.411962,0, 0.574033,0.554338,0, 0.58362,0.544235,0,
- 0.58,0.411962,0, 0.58362,0.544235,0, 0.601961,0.39,0,
- 0.55,0.42,0, 0.52,0.411962,0, 0.523535,0.602258,0,
- 0.55,0.42,0, 0.523535,0.602258,0, 0.533966,0.59303,0,
- 0.55,0.42,0, 0.533966,0.59303,0, 0.544235,0.58362,0,
- 0.55,0.42,0, 0.544235,0.58362,0, 0.554337,0.574033,0,
- 0.51,0.221962,0, 0.488038,0.2,0, 0.49,0.36,0,
- 0.488038,0.2,0, 0.491298,0.628833,0, 0.49,0.36,0,
- 0.49,0.36,0, 0.491298,0.628833,0, 0.498038,0.39,0,
- 0.491298,0.628833,0, 0.502197,0.620163,0, 0.498038,0.39,0,
- 0.498038,0.39,0, 0.502197,0.620163,0, 0.52,0.411962,0,
- 0.502197,0.620163,0, 0.512944,0.611304,0, 0.52,0.411962,0,
- 0.52,0.411962,0, 0.512944,0.611304,0, 0.523535,0.602258,0,
- 0.49,0.36,0, 0.498039,0.33,0, 0.51,0.221962,0,
- 0.498039,0.33,0, 0.52,0.308039,0, 0.51,0.221962,0,
- 0.51,0.221962,0, 0.52,0.308039,0, 0.54,0.23,0,
- 0.52,0.308039,0, 0.55,0.3,0, 0.54,0.23,0,
- 0.54,0.23,0, 0.55,0.3,0, 0.57,0.221962,0,
- 0.55,0.3,0, 0.58,0.308039,0, 0.57,0.221962,0,
- 0.57,0.221962,0, 0.58,0.308039,0, 0.591962,0.2,0,
- 0.58,0.308039,0, 0.601962,0.33,0, 0.591962,0.2,0,
- 0.591962,0.2,0, 0.601962,0.33,0, 0.6,0.17,0,
- 0.488038,0.2,0, 0.480248,0.637311,0, 0.491298,0.628833,0,
- 0.26,0.452,0, 0.216,0.293,0, 0.192,0.332,0,
- 0.102,0.178,0, 0.21,0,0, 0,0,0,
-};
diff --git a/hacks/glx/dolphin.c b/hacks/glx/dolphin.c
deleted file mode 100644
index 2ef4e33..0000000
--- a/hacks/glx/dolphin.c
+++ /dev/null
@@ -1,2061 +0,0 @@
-/* atlantis --- Shows moving 3D sea animals */
-
-#if 0
-static const char sccsid[] = "@(#)dolphin.c 1.2 98/06/16 xlockmore";
-#endif
-
-/* Copyright (c) E. Lassauge, 1998. */
-
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The original code for this mode was written by Mark J. Kilgard
- * as a demo for openGL programming.
- *
- * Porting it to xlock was possible by comparing the original Mesa's morph3d
- * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
- * (look at morph3d.c) for his indirect help.
- *
- * Thanks goes also to Brian Paul for making it possible and inexpensive
- * to use OpenGL at home.
- *
- * My e-mail address is lassauge@sagem.fr
- *
- * Eric Lassauge (May-13-1998)
- *
- */
-
-/**
- * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
- * ALL RIGHTS RESERVED
- * Permission to use, copy, modify, and distribute this software for
- * any purpose and without fee is hereby granted, provided that the above
- * copyright notice appear in all copies and that both the copyright notice
- * and this permission notice appear in supporting documentation, and that
- * the name of Silicon Graphics, Inc. not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission.
- *
- * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
- * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
- * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
- * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
- * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
- * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
- * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
- * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
- * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * US Government Users Restricted Rights
- * Use, duplication, or disclosure by the Government is subject to
- * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
- * (c)(1)(ii) of the Rights in Technical Data and Computer Software
- * clause at DFARS 252.227-7013 and/or in similar or successor
- * clauses in the FAR or the DOD or NASA FAR Supplement.
- * Unpublished-- rights reserved under the copyright laws of the
- * United States. Contractor/manufacturer is Silicon Graphics,
- * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
- *
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
- */
-
-#ifdef USE_GL
-
-#include "atlantis.h"
-
-/* *INDENT-OFF* */
-static const float N001[3] = {-0.005937, -0.101998, -0.994767};
-static const float N002[3] = {0.93678, -0.200803, 0.286569};
-static const float N003[3] = {-0.233062, 0.972058, 0.028007};
-#if 0
-static const float N004[3] = {0, 1, 0};
-#endif
-static const float N005[3] = {0.898117, 0.360171, 0.252315};
-static const float N006[3] = {-0.915437, 0.348456, 0.201378};
-static const float N007[3] = {0.602263, -0.777527, 0.18092};
-static const float N008[3] = {-0.906912, -0.412015, 0.088061};
-#if 0
-static const float N009[3] = {-0.015623, 0.999878, 0};
-static const float N010[3] = {0, -0.992278, 0.124035};
-static const float N011[3] = {0, -0.936329, -0.351123};
-#endif
-static const float N012[3] = {0.884408, -0.429417, -0.182821};
-static const float N013[3] = {0.921121, 0.311084, -0.234016};
-static const float N014[3] = {0.382635, 0.877882, -0.287948};
-static const float N015[3] = {-0.380046, 0.888166, -0.258316};
-static const float N016[3] = {-0.891515, 0.392238, -0.226607};
-static const float N017[3] = {-0.901419, -0.382002, -0.203763};
-static const float N018[3] = {-0.367225, -0.911091, -0.187243};
-static const float N019[3] = {0.339539, -0.924846, -0.171388};
-static const float N020[3] = {0.914706, -0.378617, -0.14129};
-static const float N021[3] = {0.950662, 0.262713, -0.164994};
-static const float N022[3] = {0.546359, 0.80146, -0.243218};
-static const float N023[3] = {-0.315796, 0.917068, -0.243431};
-static const float N024[3] = {-0.825687, 0.532277, -0.186875};
-static const float N025[3] = {-0.974763, -0.155232, -0.160435};
-static const float N026[3] = {-0.560596, -0.816658, -0.137119};
-static const float N027[3] = {0.38021, -0.910817, -0.160786};
-static const float N028[3] = {0.923772, -0.358322, -0.135093};
-static const float N029[3] = {0.951202, 0.275053, -0.139859};
-static const float N030[3] = {0.686099, 0.702548, -0.188932};
-static const float N031[3] = {-0.521865, 0.826719, -0.21022};
-static const float N032[3] = {-0.92382, 0.346739, -0.162258};
-static const float N033[3] = {-0.902095, -0.409995, -0.134646};
-static const float N034[3] = {-0.509115, -0.848498, -0.144404};
-static const float N035[3] = {0.456469, -0.880293, -0.129305};
-static const float N036[3] = {0.873401, -0.475489, -0.105266};
-static const float N037[3] = {0.970825, 0.179861, -0.158584};
-static const float N038[3] = {0.675609, 0.714187, -0.183004};
-static const float N039[3] = {-0.523574, 0.830212, -0.19136};
-static const float N040[3] = {-0.958895, 0.230808, -0.165071};
-static const float N041[3] = {-0.918285, -0.376803, -0.121542};
-static const float N042[3] = {-0.622467, -0.774167, -0.114888};
-static const float N043[3] = {0.404497, -0.908807, -0.102231};
-static const float N044[3] = {0.930538, -0.365155, -0.027588};
-static const float N045[3] = {0.92192, 0.374157, -0.100345};
-static const float N046[3] = {0.507346, 0.860739, 0.041562};
-static const float N047[3] = {-0.394646, 0.918815, -0.00573};
-static const float N048[3] = {-0.925411, 0.373024, -0.066837};
-static const float N049[3] = {-0.945337, -0.322309, -0.049551};
-static const float N050[3] = {-0.660437, -0.750557, -0.022072};
-static const float N051[3] = {0.488835, -0.87195, -0.027261};
-static const float N052[3] = {0.902599, -0.421397, 0.087969};
-static const float N053[3] = {0.938636, 0.322606, 0.12202};
-static const float N054[3] = {0.484605, 0.871078, 0.079878};
-static const float N055[3] = {-0.353607, 0.931559, 0.084619};
-static const float N056[3] = {-0.867759, 0.478564, 0.134054};
-static const float N057[3] = {-0.951583, -0.29603, 0.082794};
-static const float N058[3] = {-0.672355, -0.730209, 0.121384};
-static const float N059[3] = {0.528336, -0.842452, 0.105525};
-static const float N060[3] = {0.786913, -0.56476, 0.248627};
-#if 0
-static const float N061[3] = {0, 1, 0};
-#endif
-static const float N062[3] = {0.622098, 0.76523, 0.165584};
-static const float N063[3] = {-0.631711, 0.767816, 0.106773};
-static const float N064[3] = {-0.687886, 0.606351, 0.398938};
-static const float N065[3] = {-0.946327, -0.281623, 0.158598};
-static const float N066[3] = {-0.509549, -0.860437, 0.002776};
-static const float N067[3] = {0.462594, -0.876692, 0.131977};
-#if 0
-static const float N068[3] = {0, -0.992278, 0.124035};
-static const float N069[3] = {0, -0.970143, -0.242536};
-static const float N070[3] = {0.015502, 0.992159, -0.12402};
-#endif
-static const float N071[3] = {0, 1, 0};
-#if 0
-static const float N072[3] = {0, 1, 0};
-static const float N073[3] = {0, 1, 0};
-static const float N074[3] = {0, -1, 0};
-static const float N075[3] = {-0.242536, 0, -0.970143};
-static const float N076[3] = {-0.010336, -0.992225, -0.124028};
-#endif
-static const float N077[3] = {-0.88077, 0.461448, 0.106351};
-static const float N078[3] = {-0.88077, 0.461448, 0.106351};
-static const float N079[3] = {-0.88077, 0.461448, 0.106351};
-static const float N080[3] = {-0.88077, 0.461448, 0.106351};
-static const float N081[3] = {-0.571197, 0.816173, 0.087152};
-static const float N082[3] = {-0.88077, 0.461448, 0.106351};
-static const float N083[3] = {-0.571197, 0.816173, 0.087152};
-static const float N084[3] = {-0.571197, 0.816173, 0.087152};
-static const float N085[3] = {-0.88077, 0.461448, 0.106351};
-static const float N086[3] = {-0.571197, 0.816173, 0.087152};
-static const float N087[3] = {-0.88077, 0.461448, 0.106351};
-static const float N088[3] = {-0.88077, 0.461448, 0.106351};
-static const float N089[3] = {-0.88077, 0.461448, 0.106351};
-static const float N090[3] = {-0.88077, 0.461448, 0.106351};
-static const float N091[3] = {0, 1, 0};
-static const float N092[3] = {0, 1, 0};
-static const float N093[3] = {0, 1, 0};
-static const float N094[3] = {1, 0, 0};
-static const float N095[3] = {-1, 0, 0};
-#if 0
-static const float N096[3] = {0, 1, 0};
-#endif
-static const float N097[3] = {-0.697296, 0.702881, 0.140491};
-static const float N098[3] = {0.918864, 0.340821, 0.198819};
-static const float N099[3] = {-0.932737, 0.201195, 0.299202};
-static const float N100[3] = {0.029517, 0.981679, 0.188244};
-#if 0
-static const float N101[3] = {0, 1, 0};
-#endif
-static const float N102[3] = {0.813521, -0.204936, 0.544229};
-#if 0
-static const float N103[3] = {0, 1, 0};
-static const float N104[3] = {0, 1, 0};
-static const float N105[3] = {0, 1, 0};
-static const float N106[3] = {0, 1, 0};
-static const float N107[3] = {0, 1, 0};
-static const float N108[3] = {0, 1, 0};
-static const float N109[3] = {0, 1, 0};
-#endif
-static const float N110[3] = {-0.78148, -0.384779, 0.491155};
-static const float N111[3] = {-0.722243, 0.384927, 0.574627};
-static const float N112[3] = {-0.752278, 0.502679, 0.425901};
-static const float N113[3] = {0.547257, 0.36791, 0.751766};
-static const float N114[3] = {0.725949, -0.232568, 0.647233};
-static const float N115[3] = {-0.747182, -0.660786, 0.07128};
-static const float N116[3] = {0.931519, 0.200748, 0.30327};
-static const float N117[3] = {-0.828928, 0.313757, 0.463071};
-static const float N118[3] = {0.902554, -0.370967, 0.218587};
-static const float N119[3] = {-0.879257, -0.441851, 0.177973};
-static const float N120[3] = {0.642327, 0.611901, 0.461512};
-static const float N121[3] = {0.964817, -0.202322, 0.16791};
-static const float N122[3] = {0, 1, 0};
-#if 0
-static const float N123[3] = {-0.980734, 0.041447, 0.1909};
-static const float N124[3] = {-0.980734, 0.041447, 0.1909};
-static const float N125[3] = {-0.980734, 0.041447, 0.1909};
-static const float N126[3] = {0, 1, 0};
-static const float N127[3] = {0, 1, 0};
-static const float N128[3] = {0, 1, 0};
-static const float N129[3] = {0.96325, 0.004839, 0.268565};
-static const float N130[3] = {0.96325, 0.004839, 0.268565};
-static const float N131[3] = {0.96325, 0.004839, 0.268565};
-static const float N132[3] = {0, 1, 0};
-static const float N133[3] = {0, 1, 0};
-static const float N134[3] = {0, 1, 0};
-#endif
-static float P001[3] = {5.68, -300.95, 1324.7};
-static const float P002[3] = {338.69, -219.63, 9677.03};
-static const float P003[3] = {12.18, 474.59, 9138.14};
-#if 0
-static const float P004[3] = {-7.49, -388.91, 10896.74};
-#endif
-static const float P005[3] = {487.51, 198.05, 9350.78};
-static const float P006[3] = {-457.61, 68.74, 9427.85};
-static const float P007[3] = {156.52, -266.72, 10311.68};
-static const float P008[3] = {-185.56, -266.51, 10310.47};
-static float P009[3] = {124.39, -261.46, 1942.34};
-static float P010[3] = {-130.05, -261.46, 1946.03};
-static float P011[3] = {141.07, -320.11, 1239.38};
-static float P012[3] = {156.48, -360.12, 2073.41};
-static float P013[3] = {162, -175.88, 2064.44};
-static float P014[3] = {88.16, -87.72, 2064.02};
-static float P015[3] = {-65.21, -96.13, 2064.02};
-static float P016[3] = {-156.48, -180.96, 2064.44};
-static float P017[3] = {-162, -368.93, 2082.39};
-static float P018[3] = {-88.16, -439.22, 2082.39};
-static float P019[3] = {65.21, -440.32, 2083.39};
-static float P020[3] = {246.87, -356.02, 2576.95};
-static float P021[3] = {253.17, -111.15, 2567.15};
-static float P022[3] = {132.34, 51.41, 2559.84};
-static float P023[3] = {-97.88, 40.44, 2567.15};
-static float P024[3] = {-222.97, -117.49, 2567.15};
-static float P025[3] = {-252.22, -371.53, 2569.92};
-static float P026[3] = {-108.44, -518.19, 2586.75};
-static float P027[3] = {97.88, -524.79, 2586.75};
-static float P028[3] = {370.03, -421.19, 3419.7};
-static float P029[3] = {351.15, -16.98, 3423.17};
-static float P030[3] = {200.66, 248.46, 3430.37};
-static float P031[3] = {-148.42, 235.02, 3417.91};
-static float P032[3] = {-360.21, -30.27, 3416.84};
-static float P033[3] = {-357.9, -414.89, 3407.04};
-static float P034[3] = {-148.88, -631.35, 3409.9};
-static float P035[3] = {156.38, -632.59, 3419.7};
-static float P036[3] = {462.61, -469.21, 4431.51};
-static float P037[3] = {466.6, 102.25, 4434.98};
-static float P038[3] = {243.05, 474.34, 4562.02};
-static float P039[3] = {-191.23, 474.4, 4554.42};
-static float P040[3] = {-476.12, 111.05, 4451.11};
-static float P041[3] = {-473.36, -470.74, 4444.78};
-static float P042[3] = {-266.95, -748.41, 4447.78};
-static float P043[3] = {211.14, -749.91, 4429.73};
-static float P044[3] = {680.57, -370.27, 5943.46};
-static float P045[3] = {834.01, 363.09, 6360.63};
-static float P046[3] = {371.29, 804.51, 6486.26};
-static float P047[3] = {-291.43, 797.22, 6494.28};
-static float P048[3] = {-784.13, 370.75, 6378.01};
-static float P049[3] = {-743.29, -325.82, 5943.46};
-static float P050[3] = {-383.24, -804.77, 5943.46};
-static float P051[3] = {283.47, -846.09, 5943.46};
-static const float iP001[3] = {5.68, -300.95, 1324.7};
-#if 0
-static const float iP002[3] = {338.69, -219.63, 9677.03};
-static const float iP003[3] = {12.18, 624.93, 8956.39};
-static const float iP004[3] = {-7.49, -388.91, 10896.74};
-static const float iP005[3] = {487.51, 198.05, 9350.78};
-static const float iP006[3] = {-457.61, 199.04, 9353.01};
-static const float iP007[3] = {156.52, -266.72, 10311.68};
-static const float iP008[3] = {-185.56, -266.51, 10310.47};
-#endif
-static const float iP009[3] = {124.39, -261.46, 1942.34};
-static const float iP010[3] = {-130.05, -261.46, 1946.03};
-static const float iP011[3] = {141.07, -320.11, 1239.38};
-static const float iP012[3] = {156.48, -360.12, 2073.41};
-static const float iP013[3] = {162, -175.88, 2064.44};
-static const float iP014[3] = {88.16, -87.72, 2064.02};
-static const float iP015[3] = {-65.21, -96.13, 2064.02};
-static const float iP016[3] = {-156.48, -180.96, 2064.44};
-static const float iP017[3] = {-162, -368.93, 2082.39};
-static const float iP018[3] = {-88.16, -439.22, 2082.39};
-static const float iP019[3] = {65.21, -440.32, 2083.39};
-static const float iP020[3] = {246.87, -356.02, 2576.95};
-static const float iP021[3] = {253.17, -111.15, 2567.15};
-static const float iP022[3] = {132.34, 51.41, 2559.84};
-static const float iP023[3] = {-97.88, 40.44, 2567.15};
-static const float iP024[3] = {-222.97, -117.49, 2567.15};
-static const float iP025[3] = {-252.22, -371.53, 2569.92};
-static const float iP026[3] = {-108.44, -518.19, 2586.75};
-static const float iP027[3] = {97.88, -524.79, 2586.75};
-static const float iP028[3] = {370.03, -421.19, 3419.7};
-static const float iP029[3] = {351.15, -16.98, 3423.17};
-static const float iP030[3] = {200.66, 248.46, 3430.37};
-static const float iP031[3] = {-148.42, 235.02, 3417.91};
-static const float iP032[3] = {-360.21, -30.27, 3416.84};
-static const float iP033[3] = {-357.9, -414.89, 3407.04};
-static const float iP034[3] = {-148.88, -631.35, 3409.9};
-static const float iP035[3] = {156.38, -632.59, 3419.7};
-static const float iP036[3] = {462.61, -469.21, 4431.51};
-static const float iP037[3] = {466.6, 102.25, 4434.98};
-static const float iP038[3] = {243.05, 474.34, 4562.02};
-static const float iP039[3] = {-191.23, 474.4, 4554.42};
-static const float iP040[3] = {-476.12, 111.05, 4451.11};
-static const float iP041[3] = {-473.36, -470.74, 4444.78};
-static const float iP042[3] = {-266.95, -748.41, 4447.78};
-static const float iP043[3] = {211.14, -749.91, 4429.73};
-static const float iP044[3] = {680.57, -370.27, 5943.46};
-static const float iP045[3] = {834.01, 363.09, 6360.63};
-static const float iP046[3] = {371.29, 804.51, 6486.26};
-static const float iP047[3] = {-291.43, 797.22, 6494.28};
-static const float iP048[3] = {-784.13, 370.75, 6378.01};
-static const float iP049[3] = {-743.29, -325.82, 5943.46};
-static const float iP050[3] = {-383.24, -804.77, 5943.46};
-static const float iP051[3] = {283.47, -846.09, 5943.46};
-static const float P052[3] = {599.09, -300.15, 7894.03};
-static const float P053[3] = {735.48, 306.26, 7911.92};
-static const float P054[3] = {246.22, 558.53, 8460.5};
-static const float P055[3] = {-230.41, 559.84, 8473.23};
-static const float P056[3] = {-698.66, 320.83, 7902.59};
-static const float P057[3] = {-643.29, -299.16, 7902.59};
-static const float P058[3] = {-341.47, -719.3, 7902.59};
-static const float P059[3] = {252.57, -756.12, 7902.59};
-static const float P060[3] = {458.39, -265.31, 9355.44};
-#if 0
-static const float P061[3] = {433.38, -161.9, 9503.03};
-#endif
-static const float P062[3] = {224.04, 338.75, 9450.3};
-static const float P063[3] = {-165.71, 341.04, 9462.35};
-static const float P064[3] = {-298.11, 110.13, 10180.37};
-static const float P065[3] = {-473.99, -219.71, 9355.44};
-static const float P066[3] = {-211.97, -479.87, 9355.44};
-static const float P067[3] = {192.86, -491.45, 9348.73};
-static float P068[3] = {-136.29, -319.84, 1228.73};
-static float P069[3] = {1111.17, -314.14, 1314.19};
-static float P070[3] = {-1167.34, -321.61, 1319.45};
-static float P071[3] = {1404.86, -306.66, 1235.45};
-static float P072[3] = {-1409.73, -314.14, 1247.66};
-static float P073[3] = {1254.01, -296.87, 1544.58};
-static float P074[3] = {-1262.09, -291.7, 1504.26};
-static float P075[3] = {965.71, -269.26, 1742.65};
-static float P076[3] = {-900.97, -276.74, 1726.07};
-static const float iP068[3] = {-136.29, -319.84, 1228.73};
-static const float iP069[3] = {1111.17, -314.14, 1314.19};
-static const float iP070[3] = {-1167.34, -321.61, 1319.45};
-static const float iP071[3] = {1404.86, -306.66, 1235.45};
-static const float iP072[3] = {-1409.73, -314.14, 1247.66};
-static const float iP073[3] = {1254.01, -296.87, 1544.58};
-static const float iP074[3] = {-1262.09, -291.7, 1504.26};
-static const float iP075[3] = {965.71, -269.26, 1742.65};
-static const float iP076[3] = {-900.97, -276.74, 1726.07};
-static const float P077[3] = {1058, -448.81, 8194.66};
-static const float P078[3] = {-1016.51, -456.43, 8190.62};
-static const float P079[3] = {-1515.96, -676.45, 7754.93};
-static const float P080[3] = {1856.75, -830.34, 7296.56};
-static const float P081[3] = {1472.16, -497.38, 7399.68};
-static const float P082[3] = {-1775.26, -829.51, 7298.46};
-static const float P083[3] = {911.09, -252.51, 7510.99};
-static const float P084[3] = {-1451.94, -495.62, 7384.3};
-static const float P085[3] = {1598.75, -669.26, 7769.9};
-static const float P086[3] = {-836.53, -250.08, 7463.25};
-static const float P087[3] = {722.87, -158.18, 8006.41};
-static const float P088[3] = {-688.86, -162.28, 7993.89};
-static const float P089[3] = {-626.92, -185.3, 8364.98};
-static const float P090[3] = {647.72, -189.46, 8354.99};
-static float P091[3] = {0, 835.01, 5555.62};
-static float P092[3] = {0, 1350.18, 5220.86};
-static float P093[3] = {0, 1422.94, 5285.27};
-static float P094[3] = {0, 1296.75, 5650.19};
-static float P095[3] = {0, 795.63, 6493.88};
-static const float iP091[3] = {0, 835.01, 5555.62};
-static const float iP092[3] = {0, 1350.18, 5220.86};
-static const float iP093[3] = {0, 1422.94, 5285.27};
-static const float iP094[3] = {0, 1296.75, 5650.19};
-static const float iP095[3] = {0, 795.63, 6493.88};
-#if 0
-static const float P096[3] = {-447.38, -165.99, 9499.6};
-#endif
-static float P097[3] = {-194.91, -357.14, 10313.32};
-static float P098[3] = {135.35, -357.66, 10307.94};
-static const float iP097[3] = {-194.91, -357.14, 10313.32};
-static const float iP098[3] = {135.35, -357.66, 10307.94};
-static const float P099[3] = {-380.53, -221.14, 9677.98};
-static const float P100[3] = {0, 412.99, 9629.33};
-#if 0
-static const float P101[3] = {5.7, 567, 7862.98};
-#endif
-static float P102[3] = {59.51, -412.55, 10677.58};
-static const float iP102[3] = {59.51, -412.55, 10677.58};
-static const float P103[3] = {6.5, 484.74, 9009.94};
-#if 0
-static const float P104[3] = {-9.86, 567.62, 7858.65};
-#endif
-static const float P105[3] = {-41.86, 476.51, 9078.17};
-#if 0
-static const float P106[3] = {22.75, 568.13, 7782.83};
-static const float P107[3] = {58.93, 568.42, 7775.94};
-#endif
-static const float P108[3] = {49.2, 476.83, 9078.24};
-#if 0
-static const float P109[3] = {99.21, 566, 7858.65};
-#endif
-static float P110[3] = {-187.62, -410.04, 10674.12};
-static const float iP110[3] = {-187.62, -410.04, 10674.12};
-static float P111[3] = {-184.25, -318.7, 10723.88};
-static const float iP111[3] = {-184.25, -318.7, 10723.88};
-static const float P112[3] = {-179.61, -142.81, 10670.26};
-static const float P113[3] = {57.43, -147.94, 10675.26};
-static const float P114[3] = {54.06, -218.9, 10712.44};
-static const float P115[3] = {-186.35, -212.09, 10713.76};
-static const float P116[3] = {205.9, -84.61, 10275.97};
-static const float P117[3] = {-230.96, -83.26, 10280.09};
-static const float iP118[3] = {216.78, -509.17, 10098.94};
-static const float iP119[3] = {-313.21, -510.79, 10102.62};
-static float P118[3] = {216.78, -509.17, 10098.94};
-static float P119[3] = {-313.21, -510.79, 10102.62};
-static const float P120[3] = {217.95, 96.34, 10161.62};
-static float P121[3] = {71.99, -319.74, 10717.7};
-static const float iP121[3] = {71.99, -319.74, 10717.7};
-static float P122[3] = {0, 602.74, 5375.84};
-static const float iP122[3] = {0, 602.74, 5375.84};
-static const float P123[3] = {-448.94, -203.14, 9499.6};
-static const float P124[3] = {-442.64, -185.2, 9528.07};
-static const float P125[3] = {-441.07, -148.05, 9528.07};
-static const float P126[3] = {-443.43, -128.84, 9499.6};
-static const float P127[3] = {-456.87, -146.78, 9466.67};
-static const float P128[3] = {-453.68, -183.93, 9466.67};
-static const float P129[3] = {428.43, -124.08, 9503.03};
-static const float P130[3] = {419.73, -142.14, 9534.56};
-static const float P131[3] = {419.92, -179.96, 9534.56};
-static const float P132[3] = {431.2, -199.73, 9505.26};
-static const float P133[3] = {442.28, -181.67, 9475.96};
-static const float P134[3] = {442.08, -143.84, 9475.96};
-/* *INDENT-ON* */
-
-
-
-static void
-Dolphin001(GLenum cap)
-{
- glNormal3fv(N071);
- glBegin(cap);
- glVertex3fv(P001);
- glVertex3fv(P068);
- glVertex3fv(P010);
- glEnd();
- glBegin(cap);
- glVertex3fv(P068);
- glVertex3fv(P076);
- glVertex3fv(P010);
- glEnd();
- glBegin(cap);
- glVertex3fv(P068);
- glVertex3fv(P070);
- glVertex3fv(P076);
- glEnd();
- glBegin(cap);
- glVertex3fv(P076);
- glVertex3fv(P070);
- glVertex3fv(P074);
- glEnd();
- glBegin(cap);
- glVertex3fv(P070);
- glVertex3fv(P072);
- glVertex3fv(P074);
- glEnd();
- glNormal3fv(N119);
- glBegin(cap);
- glVertex3fv(P072);
- glVertex3fv(P070);
- glVertex3fv(P074);
- glEnd();
- glBegin(cap);
- glVertex3fv(P074);
- glVertex3fv(P070);
- glVertex3fv(P076);
- glEnd();
- glBegin(cap);
- glVertex3fv(P070);
- glVertex3fv(P068);
- glVertex3fv(P076);
- glEnd();
- glBegin(cap);
- glVertex3fv(P076);
- glVertex3fv(P068);
- glVertex3fv(P010);
- glEnd();
- glBegin(cap);
- glVertex3fv(P068);
- glVertex3fv(P001);
- glVertex3fv(P010);
- glEnd();
-}
-
-static void
-Dolphin002(GLenum cap)
-{
- glNormal3fv(N071);
- glBegin(cap);
- glVertex3fv(P011);
- glVertex3fv(P001);
- glVertex3fv(P009);
- glEnd();
- glBegin(cap);
- glVertex3fv(P075);
- glVertex3fv(P011);
- glVertex3fv(P009);
- glEnd();
- glBegin(cap);
- glVertex3fv(P069);
- glVertex3fv(P011);
- glVertex3fv(P075);
- glEnd();
- glBegin(cap);
- glVertex3fv(P069);
- glVertex3fv(P075);
- glVertex3fv(P073);
- glEnd();
- glBegin(cap);
- glVertex3fv(P071);
- glVertex3fv(P069);
- glVertex3fv(P073);
- glEnd();
- glNormal3fv(N119);
- glBegin(cap);
- glVertex3fv(P001);
- glVertex3fv(P011);
- glVertex3fv(P009);
- glEnd();
- glBegin(cap);
- glVertex3fv(P009);
- glVertex3fv(P011);
- glVertex3fv(P075);
- glEnd();
- glBegin(cap);
- glVertex3fv(P011);
- glVertex3fv(P069);
- glVertex3fv(P075);
- glEnd();
- glBegin(cap);
- glVertex3fv(P069);
- glVertex3fv(P073);
- glVertex3fv(P075);
- glEnd();
- glBegin(cap);
- glVertex3fv(P069);
- glVertex3fv(P071);
- glVertex3fv(P073);
- glEnd();
-}
-
-static void
-Dolphin003(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N018);
- glVertex3fv(P018);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N019);
- glVertex3fv(P019);
- glEnd();
- glBegin(cap);
- glNormal3fv(N019);
- glVertex3fv(P019);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N012);
- glVertex3fv(P012);
- glEnd();
- glBegin(cap);
- glNormal3fv(N017);
- glVertex3fv(P017);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N018);
- glVertex3fv(P018);
- glEnd();
- glBegin(cap);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N017);
- glVertex3fv(P017);
- glNormal3fv(N016);
- glVertex3fv(P016);
- glEnd();
- glBegin(cap);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N013);
- glVertex3fv(P013);
- glNormal3fv(N012);
- glVertex3fv(P012);
- glEnd();
- glBegin(cap);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N016);
- glVertex3fv(P016);
- glNormal3fv(N015);
- glVertex3fv(P015);
- glEnd();
- glBegin(cap);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N014);
- glVertex3fv(P014);
- glNormal3fv(N013);
- glVertex3fv(P013);
- glEnd();
- glBegin(cap);
- glNormal3fv(N001);
- glVertex3fv(P001);
- glNormal3fv(N015);
- glVertex3fv(P015);
- glNormal3fv(N014);
- glVertex3fv(P014);
- glEnd();
-}
-
-static void
-Dolphin004(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N014);
- glVertex3fv(P014);
- glNormal3fv(N015);
- glVertex3fv(P015);
- glNormal3fv(N023);
- glVertex3fv(P023);
- glNormal3fv(N022);
- glVertex3fv(P022);
- glEnd();
- glBegin(cap);
- glNormal3fv(N015);
- glVertex3fv(P015);
- glNormal3fv(N016);
- glVertex3fv(P016);
- glNormal3fv(N024);
- glVertex3fv(P024);
- glNormal3fv(N023);
- glVertex3fv(P023);
- glEnd();
- glBegin(cap);
- glNormal3fv(N016);
- glVertex3fv(P016);
- glNormal3fv(N017);
- glVertex3fv(P017);
- glNormal3fv(N025);
- glVertex3fv(P025);
- glNormal3fv(N024);
- glVertex3fv(P024);
- glEnd();
- glBegin(cap);
- glNormal3fv(N017);
- glVertex3fv(P017);
- glNormal3fv(N018);
- glVertex3fv(P018);
- glNormal3fv(N026);
- glVertex3fv(P026);
- glNormal3fv(N025);
- glVertex3fv(P025);
- glEnd();
- glBegin(cap);
- glNormal3fv(N013);
- glVertex3fv(P013);
- glNormal3fv(N014);
- glVertex3fv(P014);
- glNormal3fv(N022);
- glVertex3fv(P022);
- glNormal3fv(N021);
- glVertex3fv(P021);
- glEnd();
- glBegin(cap);
- glNormal3fv(N012);
- glVertex3fv(P012);
- glNormal3fv(N013);
- glVertex3fv(P013);
- glNormal3fv(N021);
- glVertex3fv(P021);
- glNormal3fv(N020);
- glVertex3fv(P020);
- glEnd();
- glBegin(cap);
- glNormal3fv(N018);
- glVertex3fv(P018);
- glNormal3fv(N019);
- glVertex3fv(P019);
- glNormal3fv(N027);
- glVertex3fv(P027);
- glNormal3fv(N026);
- glVertex3fv(P026);
- glEnd();
- glBegin(cap);
- glNormal3fv(N019);
- glVertex3fv(P019);
- glNormal3fv(N012);
- glVertex3fv(P012);
- glNormal3fv(N020);
- glVertex3fv(P020);
- glNormal3fv(N027);
- glVertex3fv(P027);
- glEnd();
-}
-
-static void
-Dolphin005(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N022);
- glVertex3fv(P022);
- glNormal3fv(N023);
- glVertex3fv(P023);
- glNormal3fv(N031);
- glVertex3fv(P031);
- glNormal3fv(N030);
- glVertex3fv(P030);
- glEnd();
- glBegin(cap);
- glNormal3fv(N021);
- glVertex3fv(P021);
- glNormal3fv(N022);
- glVertex3fv(P022);
- glNormal3fv(N030);
- glVertex3fv(P030);
- glEnd();
- glBegin(cap);
- glNormal3fv(N021);
- glVertex3fv(P021);
- glNormal3fv(N030);
- glVertex3fv(P030);
- glNormal3fv(N029);
- glVertex3fv(P029);
- glEnd();
- glBegin(cap);
- glNormal3fv(N023);
- glVertex3fv(P023);
- glNormal3fv(N024);
- glVertex3fv(P024);
- glNormal3fv(N031);
- glVertex3fv(P031);
- glEnd();
- glBegin(cap);
- glNormal3fv(N024);
- glVertex3fv(P024);
- glNormal3fv(N032);
- glVertex3fv(P032);
- glNormal3fv(N031);
- glVertex3fv(P031);
- glEnd();
- glBegin(cap);
- glNormal3fv(N024);
- glVertex3fv(P024);
- glNormal3fv(N025);
- glVertex3fv(P025);
- glNormal3fv(N032);
- glVertex3fv(P032);
- glEnd();
- glBegin(cap);
- glNormal3fv(N025);
- glVertex3fv(P025);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glNormal3fv(N032);
- glVertex3fv(P032);
- glEnd();
- glBegin(cap);
- glNormal3fv(N020);
- glVertex3fv(P020);
- glNormal3fv(N021);
- glVertex3fv(P021);
- glNormal3fv(N029);
- glVertex3fv(P029);
- glEnd();
- glBegin(cap);
- glNormal3fv(N020);
- glVertex3fv(P020);
- glNormal3fv(N029);
- glVertex3fv(P029);
- glNormal3fv(N028);
- glVertex3fv(P028);
- glEnd();
- glBegin(cap);
- glNormal3fv(N027);
- glVertex3fv(P027);
- glNormal3fv(N020);
- glVertex3fv(P020);
- glNormal3fv(N028);
- glVertex3fv(P028);
- glEnd();
- glBegin(cap);
- glNormal3fv(N027);
- glVertex3fv(P027);
- glNormal3fv(N028);
- glVertex3fv(P028);
- glNormal3fv(N035);
- glVertex3fv(P035);
- glEnd();
- glBegin(cap);
- glNormal3fv(N025);
- glVertex3fv(P025);
- glNormal3fv(N026);
- glVertex3fv(P026);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glEnd();
- glBegin(cap);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glNormal3fv(N026);
- glVertex3fv(P026);
- glNormal3fv(N034);
- glVertex3fv(P034);
- glEnd();
- glBegin(cap);
- glNormal3fv(N026);
- glVertex3fv(P026);
- glNormal3fv(N027);
- glVertex3fv(P027);
- glNormal3fv(N035);
- glVertex3fv(P035);
- glNormal3fv(N034);
- glVertex3fv(P034);
- glEnd();
-}
-
-static void
-Dolphin006(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N092);
- glVertex3fv(P092);
- glNormal3fv(N093);
- glVertex3fv(P093);
- glNormal3fv(N094);
- glVertex3fv(P094);
- glEnd();
- glBegin(cap);
- glNormal3fv(N093);
- glVertex3fv(P093);
- glNormal3fv(N092);
- glVertex3fv(P092);
- glNormal3fv(N094);
- glVertex3fv(P094);
- glEnd();
- glBegin(cap);
- glNormal3fv(N092);
- glVertex3fv(P092);
- glNormal3fv(N091);
- glVertex3fv(P091);
- glNormal3fv(N095);
- glVertex3fv(P095);
- glNormal3fv(N094);
- glVertex3fv(P094);
- glEnd();
- glBegin(cap);
- glNormal3fv(N091);
- glVertex3fv(P091);
- glNormal3fv(N092);
- glVertex3fv(P092);
- glNormal3fv(N094);
- glVertex3fv(P094);
- glNormal3fv(N095);
- glVertex3fv(P095);
- glEnd();
- glBegin(cap);
- glNormal3fv(N122);
- glVertex3fv(P122);
- glNormal3fv(N095);
- glVertex3fv(P095);
- glNormal3fv(N091);
- glVertex3fv(P091);
- glEnd();
- glBegin(cap);
- glNormal3fv(N122);
- glVertex3fv(P122);
- glNormal3fv(N091);
- glVertex3fv(P091);
- glNormal3fv(N095);
- glVertex3fv(P095);
- glEnd();
-}
-
-static void
-Dolphin007(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N030);
- glVertex3fv(P030);
- glNormal3fv(N031);
- glVertex3fv(P031);
- glNormal3fv(N039);
- glVertex3fv(P039);
- glNormal3fv(N038);
- glVertex3fv(P038);
- glEnd();
- glBegin(cap);
- glNormal3fv(N029);
- glVertex3fv(P029);
- glNormal3fv(N030);
- glVertex3fv(P030);
- glNormal3fv(N038);
- glVertex3fv(P038);
- glEnd();
- glBegin(cap);
- glNormal3fv(N029);
- glVertex3fv(P029);
- glNormal3fv(N038);
- glVertex3fv(P038);
- glNormal3fv(N037);
- glVertex3fv(P037);
- glEnd();
- glBegin(cap);
- glNormal3fv(N028);
- glVertex3fv(P028);
- glNormal3fv(N029);
- glVertex3fv(P029);
- glNormal3fv(N037);
- glVertex3fv(P037);
- glEnd();
- glBegin(cap);
- glNormal3fv(N028);
- glVertex3fv(P028);
- glNormal3fv(N037);
- glVertex3fv(P037);
- glNormal3fv(N036);
- glVertex3fv(P036);
- glEnd();
- glBegin(cap);
- glNormal3fv(N035);
- glVertex3fv(P035);
- glNormal3fv(N028);
- glVertex3fv(P028);
- glNormal3fv(N036);
- glVertex3fv(P036);
- glEnd();
- glBegin(cap);
- glNormal3fv(N035);
- glVertex3fv(P035);
- glNormal3fv(N036);
- glVertex3fv(P036);
- glNormal3fv(N043);
- glVertex3fv(P043);
- glEnd();
- glBegin(cap);
- glNormal3fv(N034);
- glVertex3fv(P034);
- glNormal3fv(N035);
- glVertex3fv(P035);
- glNormal3fv(N043);
- glVertex3fv(P043);
- glNormal3fv(N042);
- glVertex3fv(P042);
- glEnd();
- glBegin(cap);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glNormal3fv(N034);
- glVertex3fv(P034);
- glNormal3fv(N042);
- glVertex3fv(P042);
- glEnd();
- glBegin(cap);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glNormal3fv(N042);
- glVertex3fv(P042);
- glNormal3fv(N041);
- glVertex3fv(P041);
- glEnd();
- glBegin(cap);
- glNormal3fv(N031);
- glVertex3fv(P031);
- glNormal3fv(N032);
- glVertex3fv(P032);
- glNormal3fv(N039);
- glVertex3fv(P039);
- glEnd();
- glBegin(cap);
- glNormal3fv(N039);
- glVertex3fv(P039);
- glNormal3fv(N032);
- glVertex3fv(P032);
- glNormal3fv(N040);
- glVertex3fv(P040);
- glEnd();
- glBegin(cap);
- glNormal3fv(N032);
- glVertex3fv(P032);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glNormal3fv(N040);
- glVertex3fv(P040);
- glEnd();
- glBegin(cap);
- glNormal3fv(N040);
- glVertex3fv(P040);
- glNormal3fv(N033);
- glVertex3fv(P033);
- glNormal3fv(N041);
- glVertex3fv(P041);
- glEnd();
-}
-
-static void
-Dolphin008(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N042);
- glVertex3fv(P042);
- glNormal3fv(N043);
- glVertex3fv(P043);
- glNormal3fv(N051);
- glVertex3fv(P051);
- glNormal3fv(N050);
- glVertex3fv(P050);
- glEnd();
- glBegin(cap);
- glNormal3fv(N043);
- glVertex3fv(P043);
- glNormal3fv(N036);
- glVertex3fv(P036);
- glNormal3fv(N051);
- glVertex3fv(P051);
- glEnd();
- glBegin(cap);
- glNormal3fv(N051);
- glVertex3fv(P051);
- glNormal3fv(N036);
- glVertex3fv(P036);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glEnd();
- glBegin(cap);
- glNormal3fv(N041);
- glVertex3fv(P041);
- glNormal3fv(N042);
- glVertex3fv(P042);
- glNormal3fv(N050);
- glVertex3fv(P050);
- glEnd();
- glBegin(cap);
- glNormal3fv(N041);
- glVertex3fv(P041);
- glNormal3fv(N050);
- glVertex3fv(P050);
- glNormal3fv(N049);
- glVertex3fv(P049);
- glEnd();
- glBegin(cap);
- glNormal3fv(N036);
- glVertex3fv(P036);
- glNormal3fv(N037);
- glVertex3fv(P037);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glEnd();
- glBegin(cap);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glNormal3fv(N037);
- glVertex3fv(P037);
- glNormal3fv(N045);
- glVertex3fv(P045);
- glEnd();
- glBegin(cap);
- glNormal3fv(N040);
- glVertex3fv(P040);
- glNormal3fv(N041);
- glVertex3fv(P041);
- glNormal3fv(N049);
- glVertex3fv(P049);
- glEnd();
- glBegin(cap);
- glNormal3fv(N040);
- glVertex3fv(P040);
- glNormal3fv(N049);
- glVertex3fv(P049);
- glNormal3fv(N048);
- glVertex3fv(P048);
- glEnd();
- glBegin(cap);
- glNormal3fv(N039);
- glVertex3fv(P039);
- glNormal3fv(N040);
- glVertex3fv(P040);
- glNormal3fv(N048);
- glVertex3fv(P048);
- glEnd();
- glBegin(cap);
- glNormal3fv(N039);
- glVertex3fv(P039);
- glNormal3fv(N048);
- glVertex3fv(P048);
- glNormal3fv(N047);
- glVertex3fv(P047);
- glEnd();
- glBegin(cap);
- glNormal3fv(N037);
- glVertex3fv(P037);
- glNormal3fv(N038);
- glVertex3fv(P038);
- glNormal3fv(N045);
- glVertex3fv(P045);
- glEnd();
- glBegin(cap);
- glNormal3fv(N038);
- glVertex3fv(P038);
- glNormal3fv(N046);
- glVertex3fv(P046);
- glNormal3fv(N045);
- glVertex3fv(P045);
- glEnd();
- glBegin(cap);
- glNormal3fv(N038);
- glVertex3fv(P038);
- glNormal3fv(N039);
- glVertex3fv(P039);
- glNormal3fv(N047);
- glVertex3fv(P047);
- glNormal3fv(N046);
- glVertex3fv(P046);
- glEnd();
-}
-
-static void
-Dolphin009(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N050);
- glVertex3fv(P050);
- glNormal3fv(N051);
- glVertex3fv(P051);
- glNormal3fv(N059);
- glVertex3fv(P059);
- glNormal3fv(N058);
- glVertex3fv(P058);
- glEnd();
- glBegin(cap);
- glNormal3fv(N051);
- glVertex3fv(P051);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glNormal3fv(N059);
- glVertex3fv(P059);
- glEnd();
- glBegin(cap);
- glNormal3fv(N059);
- glVertex3fv(P059);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glNormal3fv(N052);
- glVertex3fv(P052);
- glEnd();
- glBegin(cap);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glNormal3fv(N045);
- glVertex3fv(P045);
- glNormal3fv(N053);
- glVertex3fv(P053);
- glEnd();
- glBegin(cap);
- glNormal3fv(N044);
- glVertex3fv(P044);
- glNormal3fv(N053);
- glVertex3fv(P053);
- glNormal3fv(N052);
- glVertex3fv(P052);
- glEnd();
- glBegin(cap);
- glNormal3fv(N049);
- glVertex3fv(P049);
- glNormal3fv(N050);
- glVertex3fv(P050);
- glNormal3fv(N058);
- glVertex3fv(P058);
- glEnd();
- glBegin(cap);
- glNormal3fv(N049);
- glVertex3fv(P049);
- glNormal3fv(N058);
- glVertex3fv(P058);
- glNormal3fv(N057);
- glVertex3fv(P057);
- glEnd();
- glBegin(cap);
- glNormal3fv(N048);
- glVertex3fv(P048);
- glNormal3fv(N049);
- glVertex3fv(P049);
- glNormal3fv(N057);
- glVertex3fv(P057);
- glEnd();
- glBegin(cap);
- glNormal3fv(N048);
- glVertex3fv(P048);
- glNormal3fv(N057);
- glVertex3fv(P057);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glEnd();
- glBegin(cap);
- glNormal3fv(N047);
- glVertex3fv(P047);
- glNormal3fv(N048);
- glVertex3fv(P048);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glEnd();
- glBegin(cap);
- glNormal3fv(N047);
- glVertex3fv(P047);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glNormal3fv(N055);
- glVertex3fv(P055);
- glEnd();
- glBegin(cap);
- glNormal3fv(N045);
- glVertex3fv(P045);
- glNormal3fv(N046);
- glVertex3fv(P046);
- glNormal3fv(N053);
- glVertex3fv(P053);
- glEnd();
- glBegin(cap);
- glNormal3fv(N046);
- glVertex3fv(P046);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glNormal3fv(N053);
- glVertex3fv(P053);
- glEnd();
- glBegin(cap);
- glNormal3fv(N046);
- glVertex3fv(P046);
- glNormal3fv(N047);
- glVertex3fv(P047);
- glNormal3fv(N055);
- glVertex3fv(P055);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glEnd();
-}
-
-static void
-Dolphin010(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N080);
- glVertex3fv(P080);
- glNormal3fv(N081);
- glVertex3fv(P081);
- glNormal3fv(N085);
- glVertex3fv(P085);
- glEnd();
- glBegin(cap);
- glNormal3fv(N081);
- glVertex3fv(P081);
- glNormal3fv(N083);
- glVertex3fv(P083);
- glNormal3fv(N085);
- glVertex3fv(P085);
- glEnd();
- glBegin(cap);
- glNormal3fv(N085);
- glVertex3fv(P085);
- glNormal3fv(N083);
- glVertex3fv(P083);
- glNormal3fv(N077);
- glVertex3fv(P077);
- glEnd();
- glBegin(cap);
- glNormal3fv(N083);
- glVertex3fv(P083);
- glNormal3fv(N087);
- glVertex3fv(P087);
- glNormal3fv(N077);
- glVertex3fv(P077);
- glEnd();
- glBegin(cap);
- glNormal3fv(N077);
- glVertex3fv(P077);
- glNormal3fv(N087);
- glVertex3fv(P087);
- glNormal3fv(N090);
- glVertex3fv(P090);
- glEnd();
- glBegin(cap);
- glNormal3fv(N081);
- glVertex3fv(P081);
- glNormal3fv(N080);
- glVertex3fv(P080);
- glNormal3fv(N085);
- glVertex3fv(P085);
- glEnd();
- glBegin(cap);
- glNormal3fv(N083);
- glVertex3fv(P083);
- glNormal3fv(N081);
- glVertex3fv(P081);
- glNormal3fv(N085);
- glVertex3fv(P085);
- glEnd();
- glBegin(cap);
- glNormal3fv(N083);
- glVertex3fv(P083);
- glNormal3fv(N085);
- glVertex3fv(P085);
- glNormal3fv(N077);
- glVertex3fv(P077);
- glEnd();
- glBegin(cap);
- glNormal3fv(N087);
- glVertex3fv(P087);
- glNormal3fv(N083);
- glVertex3fv(P083);
- glNormal3fv(N077);
- glVertex3fv(P077);
- glEnd();
- glBegin(cap);
- glNormal3fv(N087);
- glVertex3fv(P087);
- glNormal3fv(N077);
- glVertex3fv(P077);
- glNormal3fv(N090);
- glVertex3fv(P090);
- glEnd();
-}
-
-static void
-Dolphin011(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N082);
- glVertex3fv(P082);
- glNormal3fv(N084);
- glVertex3fv(P084);
- glNormal3fv(N079);
- glVertex3fv(P079);
- glEnd();
- glBegin(cap);
- glNormal3fv(N084);
- glVertex3fv(P084);
- glNormal3fv(N086);
- glVertex3fv(P086);
- glNormal3fv(N079);
- glVertex3fv(P079);
- glEnd();
- glBegin(cap);
- glNormal3fv(N079);
- glVertex3fv(P079);
- glNormal3fv(N086);
- glVertex3fv(P086);
- glNormal3fv(N078);
- glVertex3fv(P078);
- glEnd();
- glBegin(cap);
- glNormal3fv(N086);
- glVertex3fv(P086);
- glNormal3fv(N088);
- glVertex3fv(P088);
- glNormal3fv(N078);
- glVertex3fv(P078);
- glEnd();
- glBegin(cap);
- glNormal3fv(N078);
- glVertex3fv(P078);
- glNormal3fv(N088);
- glVertex3fv(P088);
- glNormal3fv(N089);
- glVertex3fv(P089);
- glEnd();
- glBegin(cap);
- glNormal3fv(N088);
- glVertex3fv(P088);
- glNormal3fv(N086);
- glVertex3fv(P086);
- glNormal3fv(N089);
- glVertex3fv(P089);
- glEnd();
- glBegin(cap);
- glNormal3fv(N089);
- glVertex3fv(P089);
- glNormal3fv(N086);
- glVertex3fv(P086);
- glNormal3fv(N078);
- glVertex3fv(P078);
- glEnd();
- glBegin(cap);
- glNormal3fv(N086);
- glVertex3fv(P086);
- glNormal3fv(N084);
- glVertex3fv(P084);
- glNormal3fv(N078);
- glVertex3fv(P078);
- glEnd();
- glBegin(cap);
- glNormal3fv(N078);
- glVertex3fv(P078);
- glNormal3fv(N084);
- glVertex3fv(P084);
- glNormal3fv(N079);
- glVertex3fv(P079);
- glEnd();
- glBegin(cap);
- glNormal3fv(N084);
- glVertex3fv(P084);
- glNormal3fv(N082);
- glVertex3fv(P082);
- glNormal3fv(N079);
- glVertex3fv(P079);
- glEnd();
-}
-
-static void
-Dolphin012(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N058);
- glVertex3fv(P058);
- glNormal3fv(N059);
- glVertex3fv(P059);
- glNormal3fv(N067);
- glVertex3fv(P067);
- glNormal3fv(N066);
- glVertex3fv(P066);
- glEnd();
- glBegin(cap);
- glNormal3fv(N059);
- glVertex3fv(P059);
- glNormal3fv(N052);
- glVertex3fv(P052);
- glNormal3fv(N060);
- glVertex3fv(P060);
- glEnd();
- glBegin(cap);
- glNormal3fv(N059);
- glVertex3fv(P059);
- glNormal3fv(N060);
- glVertex3fv(P060);
- glNormal3fv(N067);
- glVertex3fv(P067);
- glEnd();
- glBegin(cap);
- glNormal3fv(N058);
- glVertex3fv(P058);
- glNormal3fv(N066);
- glVertex3fv(P066);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glEnd();
- glBegin(cap);
- glNormal3fv(N058);
- glVertex3fv(P058);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glNormal3fv(N057);
- glVertex3fv(P057);
- glEnd();
- glBegin(cap);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glNormal3fv(N057);
- glVertex3fv(P057);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glEnd();
- glBegin(cap);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glNormal3fv(N006);
- glVertex3fv(P006);
- glEnd();
- glBegin(cap);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glNormal3fv(N006);
- glVertex3fv(P006);
- glNormal3fv(N063);
- glVertex3fv(P063);
- glEnd();
- glBegin(cap);
- glNormal3fv(N056);
- glVertex3fv(P056);
- glNormal3fv(N063);
- glVertex3fv(P063);
- glNormal3fv(N055);
- glVertex3fv(P055);
- glEnd();
- glBegin(cap);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glNormal3fv(N062);
- glVertex3fv(P062);
- glNormal3fv(N005);
- glVertex3fv(P005);
- glEnd();
- glBegin(cap);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glNormal3fv(N005);
- glVertex3fv(P005);
- glNormal3fv(N053);
- glVertex3fv(P053);
- glEnd();
- glBegin(cap);
- glNormal3fv(N052);
- glVertex3fv(P052);
- glNormal3fv(N053);
- glVertex3fv(P053);
- glNormal3fv(N005);
- glVertex3fv(P005);
- glNormal3fv(N060);
- glVertex3fv(P060);
- glEnd();
-}
-
-static void
-Dolphin013(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N116);
- glVertex3fv(P116);
- glNormal3fv(N117);
- glVertex3fv(P117);
- glNormal3fv(N112);
- glVertex3fv(P112);
- glNormal3fv(N113);
- glVertex3fv(P113);
- glEnd();
- glBegin(cap);
- glNormal3fv(N114);
- glVertex3fv(P114);
- glNormal3fv(N113);
- glVertex3fv(P113);
- glNormal3fv(N112);
- glVertex3fv(P112);
- glNormal3fv(N115);
- glVertex3fv(P115);
- glEnd();
- glBegin(cap);
- glNormal3fv(N114);
- glVertex3fv(P114);
- glNormal3fv(N116);
- glVertex3fv(P116);
- glNormal3fv(N113);
- glVertex3fv(P113);
- glEnd();
- glBegin(cap);
- glNormal3fv(N114);
- glVertex3fv(P114);
- glNormal3fv(N007);
- glVertex3fv(P007);
- glNormal3fv(N116);
- glVertex3fv(P116);
- glEnd();
- glBegin(cap);
- glNormal3fv(N007);
- glVertex3fv(P007);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glNormal3fv(N116);
- glVertex3fv(P116);
- glEnd();
- glBegin(cap);
- glVertex3fv(P002);
- glVertex3fv(P007);
- glVertex3fv(P008);
- glVertex3fv(P099);
- glEnd();
- glBegin(cap);
- glVertex3fv(P007);
- glVertex3fv(P114);
- glVertex3fv(P115);
- glVertex3fv(P008);
- glEnd();
- glBegin(cap);
- glNormal3fv(N117);
- glVertex3fv(P117);
- glNormal3fv(N099);
- glVertex3fv(P099);
- glNormal3fv(N008);
- glVertex3fv(P008);
- glEnd();
- glBegin(cap);
- glNormal3fv(N117);
- glVertex3fv(P117);
- glNormal3fv(N008);
- glVertex3fv(P008);
- glNormal3fv(N112);
- glVertex3fv(P112);
- glEnd();
- glBegin(cap);
- glNormal3fv(N112);
- glVertex3fv(P112);
- glNormal3fv(N008);
- glVertex3fv(P008);
- glNormal3fv(N115);
- glVertex3fv(P115);
- glEnd();
-}
-
-static void
-Dolphin014(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N111);
- glVertex3fv(P111);
- glNormal3fv(N110);
- glVertex3fv(P110);
- glNormal3fv(N102);
- glVertex3fv(P102);
- glNormal3fv(N121);
- glVertex3fv(P121);
- glEnd();
- glBegin(cap);
- glNormal3fv(N111);
- glVertex3fv(P111);
- glNormal3fv(N097);
- glVertex3fv(P097);
- glNormal3fv(N110);
- glVertex3fv(P110);
- glEnd();
- glBegin(cap);
- glNormal3fv(N097);
- glVertex3fv(P097);
- glNormal3fv(N119);
- glVertex3fv(P119);
- glNormal3fv(N110);
- glVertex3fv(P110);
- glEnd();
- glBegin(cap);
- glNormal3fv(N097);
- glVertex3fv(P097);
- glNormal3fv(N099);
- glVertex3fv(P099);
- glNormal3fv(N119);
- glVertex3fv(P119);
- glEnd();
- glBegin(cap);
- glNormal3fv(N099);
- glVertex3fv(P099);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glNormal3fv(N119);
- glVertex3fv(P119);
- glEnd();
- glBegin(cap);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glNormal3fv(N066);
- glVertex3fv(P066);
- glNormal3fv(N119);
- glVertex3fv(P119);
- glEnd();
- glBegin(cap);
- glVertex3fv(P098);
- glVertex3fv(P097);
- glVertex3fv(P111);
- glVertex3fv(P121);
- glEnd();
- glBegin(cap);
- glVertex3fv(P002);
- glVertex3fv(P099);
- glVertex3fv(P097);
- glVertex3fv(P098);
- glEnd();
- glBegin(cap);
- glNormal3fv(N110);
- glVertex3fv(P110);
- glNormal3fv(N119);
- glVertex3fv(P119);
- glNormal3fv(N118);
- glVertex3fv(P118);
- glNormal3fv(N102);
- glVertex3fv(P102);
- glEnd();
- glBegin(cap);
- glNormal3fv(N119);
- glVertex3fv(P119);
- glNormal3fv(N066);
- glVertex3fv(P066);
- glNormal3fv(N067);
- glVertex3fv(P067);
- glNormal3fv(N118);
- glVertex3fv(P118);
- glEnd();
- glBegin(cap);
- glNormal3fv(N067);
- glVertex3fv(P067);
- glNormal3fv(N060);
- glVertex3fv(P060);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glEnd();
- glBegin(cap);
- glNormal3fv(N067);
- glVertex3fv(P067);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glNormal3fv(N118);
- glVertex3fv(P118);
- glEnd();
- glBegin(cap);
- glNormal3fv(N118);
- glVertex3fv(P118);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glNormal3fv(N098);
- glVertex3fv(P098);
- glEnd();
- glBegin(cap);
- glNormal3fv(N118);
- glVertex3fv(P118);
- glNormal3fv(N098);
- glVertex3fv(P098);
- glNormal3fv(N102);
- glVertex3fv(P102);
- glEnd();
- glBegin(cap);
- glNormal3fv(N102);
- glVertex3fv(P102);
- glNormal3fv(N098);
- glVertex3fv(P098);
- glNormal3fv(N121);
- glVertex3fv(P121);
- glEnd();
-}
-
-static void
-Dolphin015(GLenum cap)
-{
- glBegin(cap);
- glNormal3fv(N055);
- glVertex3fv(P055);
- glNormal3fv(N003);
- glVertex3fv(P003);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glEnd();
- glBegin(cap);
- glNormal3fv(N003);
- glVertex3fv(P003);
- glNormal3fv(N055);
- glVertex3fv(P055);
- glNormal3fv(N063);
- glVertex3fv(P063);
- glEnd();
- glBegin(cap);
- glNormal3fv(N003);
- glVertex3fv(P003);
- glNormal3fv(N063);
- glVertex3fv(P063);
- glNormal3fv(N100);
- glVertex3fv(P100);
- glEnd();
- glBegin(cap);
- glNormal3fv(N003);
- glVertex3fv(P003);
- glNormal3fv(N100);
- glVertex3fv(P100);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glEnd();
- glBegin(cap);
- glNormal3fv(N054);
- glVertex3fv(P054);
- glNormal3fv(N100);
- glVertex3fv(P100);
- glNormal3fv(N062);
- glVertex3fv(P062);
- glEnd();
- glBegin(cap);
- glNormal3fv(N100);
- glVertex3fv(P100);
- glNormal3fv(N064);
- glVertex3fv(P064);
- glNormal3fv(N120);
- glVertex3fv(P120);
- glEnd();
- glBegin(cap);
- glNormal3fv(N100);
- glVertex3fv(P100);
- glNormal3fv(N063);
- glVertex3fv(P063);
- glNormal3fv(N064);
- glVertex3fv(P064);
- glEnd();
- glBegin(cap);
- glNormal3fv(N063);
- glVertex3fv(P063);
- glNormal3fv(N006);
- glVertex3fv(P006);
- glNormal3fv(N064);
- glVertex3fv(P064);
- glEnd();
- glBegin(cap);
- glNormal3fv(N064);
- glVertex3fv(P064);
- glNormal3fv(N006);
- glVertex3fv(P006);
- glNormal3fv(N099);
- glVertex3fv(P099);
- glEnd();
- glBegin(cap);
- glNormal3fv(N064);
- glVertex3fv(P064);
- glNormal3fv(N099);
- glVertex3fv(P099);
- glNormal3fv(N117);
- glVertex3fv(P117);
- glEnd();
- glBegin(cap);
- glNormal3fv(N120);
- glVertex3fv(P120);
- glNormal3fv(N064);
- glVertex3fv(P064);
- glNormal3fv(N117);
- glVertex3fv(P117);
- glNormal3fv(N116);
- glVertex3fv(P116);
- glEnd();
- glBegin(cap);
- glNormal3fv(N006);
- glVertex3fv(P006);
- glNormal3fv(N065);
- glVertex3fv(P065);
- glNormal3fv(N099);
- glVertex3fv(P099);
- glEnd();
- glBegin(cap);
- glNormal3fv(N062);
- glVertex3fv(P062);
- glNormal3fv(N100);
- glVertex3fv(P100);
- glNormal3fv(N120);
- glVertex3fv(P120);
- glEnd();
- glBegin(cap);
- glNormal3fv(N005);
- glVertex3fv(P005);
- glNormal3fv(N062);
- glVertex3fv(P062);
- glNormal3fv(N120);
- glVertex3fv(P120);
- glEnd();
- glBegin(cap);
- glNormal3fv(N005);
- glVertex3fv(P005);
- glNormal3fv(N120);
- glVertex3fv(P120);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glEnd();
- glBegin(cap);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glNormal3fv(N120);
- glVertex3fv(P120);
- glNormal3fv(N116);
- glVertex3fv(P116);
- glEnd();
- glBegin(cap);
- glNormal3fv(N060);
- glVertex3fv(P060);
- glNormal3fv(N005);
- glVertex3fv(P005);
- glNormal3fv(N002);
- glVertex3fv(P002);
- glEnd();
-}
-
-static void
-Dolphin016(GLenum cap)
-{
-
- glDisable(GL_DEPTH_TEST);
- glBegin(cap);
- glVertex3fv(P123);
- glVertex3fv(P124);
- glVertex3fv(P125);
- glVertex3fv(P126);
- glVertex3fv(P127);
- glVertex3fv(P128);
- glEnd();
- glBegin(cap);
- glVertex3fv(P129);
- glVertex3fv(P130);
- glVertex3fv(P131);
- glVertex3fv(P132);
- glVertex3fv(P133);
- glVertex3fv(P134);
- glEnd();
- glBegin(cap);
- glVertex3fv(P103);
- glVertex3fv(P105);
- glVertex3fv(P108);
- glEnd();
- glEnable(GL_DEPTH_TEST);
-}
-
-void
-DrawDolphin(fishRec * fish, int wire)
-{
- float seg0, seg1, seg2, seg3, seg4, seg5, seg6, seg7;
- float pitch, thrash, chomp;
- GLenum cap;
-
- fish->htail = (int) (fish->htail - (int) (10 * fish->v)) % 360;
-
- thrash = 70 * fish->v;
-
- seg0 = 1 * thrash * sin((fish->htail) * RRAD);
- seg3 = 1 * thrash * sin((fish->htail) * RRAD);
- seg1 = 2 * thrash * sin((fish->htail + 4) * RRAD);
- seg2 = 3 * thrash * sin((fish->htail + 6) * RRAD);
- seg4 = 4 * thrash * sin((fish->htail + 10) * RRAD);
- seg5 = 4.5 * thrash * sin((fish->htail + 15) * RRAD);
- seg6 = 5 * thrash * sin((fish->htail + 20) * RRAD);
- seg7 = 6 * thrash * sin((fish->htail + 30) * RRAD);
-
- pitch = fish->v * sin((fish->htail + 180) * RRAD);
-
-/* if (fish->v > 2) {
- chomp = -(fish->v - 2) * 200;
- }*/
- chomp = 100;
-
- P012[1] = iP012[1] + seg5;
- P013[1] = iP013[1] + seg5;
- P014[1] = iP014[1] + seg5;
- P015[1] = iP015[1] + seg5;
- P016[1] = iP016[1] + seg5;
- P017[1] = iP017[1] + seg5;
- P018[1] = iP018[1] + seg5;
- P019[1] = iP019[1] + seg5;
-
- P020[1] = iP020[1] + seg4;
- P021[1] = iP021[1] + seg4;
- P022[1] = iP022[1] + seg4;
- P023[1] = iP023[1] + seg4;
- P024[1] = iP024[1] + seg4;
- P025[1] = iP025[1] + seg4;
- P026[1] = iP026[1] + seg4;
- P027[1] = iP027[1] + seg4;
-
- P028[1] = iP028[1] + seg2;
- P029[1] = iP029[1] + seg2;
- P030[1] = iP030[1] + seg2;
- P031[1] = iP031[1] + seg2;
- P032[1] = iP032[1] + seg2;
- P033[1] = iP033[1] + seg2;
- P034[1] = iP034[1] + seg2;
- P035[1] = iP035[1] + seg2;
-
- P036[1] = iP036[1] + seg1;
- P037[1] = iP037[1] + seg1;
- P038[1] = iP038[1] + seg1;
- P039[1] = iP039[1] + seg1;
- P040[1] = iP040[1] + seg1;
- P041[1] = iP041[1] + seg1;
- P042[1] = iP042[1] + seg1;
- P043[1] = iP043[1] + seg1;
-
- P044[1] = iP044[1] + seg0;
- P045[1] = iP045[1] + seg0;
- P046[1] = iP046[1] + seg0;
- P047[1] = iP047[1] + seg0;
- P048[1] = iP048[1] + seg0;
- P049[1] = iP049[1] + seg0;
- P050[1] = iP050[1] + seg0;
- P051[1] = iP051[1] + seg0;
-
- P009[1] = iP009[1] + seg6;
- P010[1] = iP010[1] + seg6;
- P075[1] = iP075[1] + seg6;
- P076[1] = iP076[1] + seg6;
-
- P001[1] = iP001[1] + seg7;
- P011[1] = iP011[1] + seg7;
- P068[1] = iP068[1] + seg7;
- P069[1] = iP069[1] + seg7;
- P070[1] = iP070[1] + seg7;
- P071[1] = iP071[1] + seg7;
- P072[1] = iP072[1] + seg7;
- P073[1] = iP073[1] + seg7;
- P074[1] = iP074[1] + seg7;
-
- P091[1] = iP091[1] + seg3;
- P092[1] = iP092[1] + seg3;
- P093[1] = iP093[1] + seg3;
- P094[1] = iP094[1] + seg3;
- P095[1] = iP095[1] + seg3;
- P122[1] = iP122[1] + seg3 * 1.5;
-
- P097[1] = iP097[1] + chomp;
- P098[1] = iP098[1] + chomp;
- P102[1] = iP102[1] + chomp;
- P110[1] = iP110[1] + chomp;
- P111[1] = iP111[1] + chomp;
- P121[1] = iP121[1] + chomp;
- P118[1] = iP118[1] + chomp;
- P119[1] = iP119[1] + chomp;
-
- glPushMatrix();
-
- glRotatef(pitch, 1, 0, 0);
-
- glTranslatef(0, 0, 7000);
-
- glRotatef(180, 0, 1, 0);
-
- glEnable(GL_CULL_FACE);
- cap = wire ? GL_LINE_LOOP : GL_POLYGON;
- Dolphin014(cap);
- Dolphin010(cap);
- Dolphin009(cap);
- Dolphin012(cap);
- Dolphin013(cap);
- Dolphin006(cap);
- Dolphin002(cap);
- Dolphin001(cap);
- Dolphin003(cap);
- Dolphin015(cap);
- Dolphin004(cap);
- Dolphin005(cap);
- Dolphin007(cap);
- Dolphin008(cap);
- Dolphin011(cap);
- Dolphin016(cap);
- glDisable(GL_CULL_FACE);
-
- glPopMatrix();
-}
-#endif
diff --git a/hacks/glx/dropshadow.c b/hacks/glx/dropshadow.c
deleted file mode 100644
index a4a5987..0000000
--- a/hacks/glx/dropshadow.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/* dropshadow.c, Copyright (c) 2009 Jens Kilian <jjk@acm.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhackI.h"
-#include "dropshadow.h"
-
-#include <stdlib.h>
-
-/* (Alpha) texture data for drop shadow.
- */
-static int drop_shadow_width = 32;
-static int drop_shadow_height = 32;
-static unsigned char drop_shadow_data[] =
-{
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 3, 4, 6, 7, 9, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 9, 7, 6, 4, 3, 1, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 1, 3, 5, 9, 13, 16, 19, 19, 21, 21, 22, 22,
- 22, 22, 21, 21, 19, 19, 16, 13, 9, 5, 3, 1, 1, 0, 0, 0,
- 0, 0, 1, 1, 3, 5, 10, 16, 22, 28, 32, 35, 37, 37, 38, 38,
- 38, 38, 37, 37, 35, 32, 28, 22, 16, 10, 5, 3, 1, 1, 0, 0,
- 0, 0, 1, 1, 4, 9, 16, 25, 34, 43, 50, 55, 58, 59, 60, 60,
- 60, 60, 59, 58, 55, 50, 43, 34, 25, 16, 9, 4, 1, 1, 0, 0,
- 0, 0, 1, 3, 6, 13, 22, 34, 48, 61, 70, 77, 80, 82, 83, 84,
- 84, 83, 82, 80, 77, 70, 61, 48, 34, 22, 13, 6, 3, 1, 0, 0,
- 0, 0, 1, 3, 7, 16, 28, 43, 61, 76, 88, 97, 102, 103, 104, 104,
- 104, 104, 103, 102, 97, 88, 76, 61, 43, 28, 16, 7, 3, 1, 0, 0,
- 0, 1, 1, 4, 9, 19, 32, 51, 70, 88, 103, 112, 117, 120, 121, 121,
- 121, 121, 120, 117, 112, 103, 88, 70, 51, 32, 19, 9, 4, 1, 1, 0,
- 0, 1, 1, 4, 10, 20, 35, 55, 77, 97, 112, 122, 128, 130, 132, 133,
- 133, 132, 130, 128, 122, 112, 97, 77, 55, 35, 20, 10, 4, 1, 1, 0,
- 0, 1, 1, 4, 10, 21, 37, 58, 80, 101, 117, 128, 134, 137, 138, 139,
- 139, 138, 137, 134, 128, 117, 101, 80, 58, 37, 21, 10, 4, 1, 0, 0,
- 0, 0, 1, 4, 10, 21, 38, 59, 82, 103, 119, 130, 137, 139, 141, 142,
- 142, 141, 139, 137, 130, 119, 103, 82, 59, 38, 21, 10, 4, 1, 0, 0,
- 0, 0, 1, 4, 10, 22, 38, 59, 83, 104, 121, 132, 139, 141, 142, 142,
- 142, 142, 141, 139, 132, 121, 104, 83, 59, 38, 22, 10, 4, 1, 0, 0,
- 0, 0, 1, 4, 10, 22, 38, 60, 84, 104, 121, 133, 139, 142, 142, 142,
- 142, 142, 142, 139, 133, 121, 104, 84, 60, 38, 22, 10, 4, 1, 0, 0,
- 0, 0, 1, 4, 10, 22, 38, 60, 84, 104, 121, 133, 139, 142, 142, 142,
- 142, 142, 142, 139, 133, 121, 104, 84, 60, 38, 22, 10, 4, 1, 0, 0,
- 0, 0, 1, 4, 10, 22, 38, 59, 83, 104, 121, 132, 139, 141, 142, 142,
- 142, 142, 141, 139, 132, 121, 104, 83, 59, 38, 22, 10, 4, 1, 0, 0,
- 0, 0, 1, 4, 10, 21, 38, 59, 82, 103, 119, 130, 137, 139, 141, 142,
- 142, 141, 139, 137, 130, 119, 103, 82, 59, 38, 21, 10, 4, 1, 0, 0,
- 0, 1, 1, 4, 10, 21, 37, 58, 80, 101, 118, 128, 134, 137, 139, 139,
- 139, 139, 137, 134, 128, 117, 102, 80, 58, 37, 21, 10, 4, 1, 0, 0,
- 0, 1, 1, 4, 10, 20, 35, 55, 77, 97, 112, 122, 128, 130, 132, 133,
- 133, 132, 130, 128, 122, 112, 97, 77, 55, 35, 20, 10, 4, 1, 1, 0,
- 0, 1, 1, 4, 9, 19, 32, 51, 70, 88, 103, 112, 117, 120, 121, 121,
- 121, 121, 120, 117, 112, 103, 88, 70, 51, 32, 19, 9, 4, 1, 1, 0,
- 0, 0, 1, 3, 7, 16, 28, 43, 61, 76, 88, 97, 102, 103, 104, 104,
- 104, 104, 103, 102, 97, 88, 76, 61, 43, 28, 16, 7, 3, 1, 0, 0,
- 0, 0, 1, 3, 6, 13, 22, 34, 48, 61, 70, 77, 80, 82, 83, 84,
- 84, 83, 82, 80, 77, 70, 61, 48, 34, 22, 13, 6, 3, 1, 0, 0,
- 0, 0, 1, 1, 4, 9, 16, 25, 34, 43, 50, 55, 58, 59, 60, 60,
- 60, 60, 59, 58, 55, 50, 43, 34, 25, 16, 9, 4, 1, 1, 0, 0,
- 0, 0, 1, 1, 3, 5, 10, 16, 22, 28, 32, 35, 37, 37, 38, 38,
- 38, 38, 37, 37, 35, 32, 28, 22, 16, 10, 5, 3, 1, 1, 0, 0,
- 0, 0, 0, 1, 1, 3, 5, 9, 13, 16, 19, 19, 21, 21, 22, 22,
- 22, 22, 21, 21, 19, 19, 16, 13, 9, 5, 3, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 3, 4, 6, 7, 9, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 9, 7, 6, 4, 3, 1, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-GLuint
-init_drop_shadow(void)
-{
- GLuint t;
-
- glGenTextures (1, &t);
- if (t <= 0) abort();
-
- glBindTexture (GL_TEXTURE_2D, t);
-#if 0
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- gluBuild2DMipmaps (GL_TEXTURE_2D, GL_ALPHA,
- drop_shadow_width, drop_shadow_height,
- GL_ALPHA, GL_UNSIGNED_BYTE,
- drop_shadow_data);
-#else
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA,
- drop_shadow_width, drop_shadow_height, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE,
- drop_shadow_data);
-#endif
-
- return t;
-}
-
-void
-draw_drop_shadow (GLuint t,
- GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
- GLfloat r)
-{
- /* Inner and outer boundaries of shadow. */
- const GLfloat li = x, lo = li - r;
- const GLfloat ri = x + w, ro = ri + r;
- const GLfloat bi = y, bo = bi - r;
- const GLfloat ti = y + h, to = ti + r;
-
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glEnable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, t);
-
- glBegin (GL_QUADS);
-
- /* There's likely a better way to do this... */
- glTexCoord2f (0.0, 0.0); glVertex3f (lo, bo, z);
- glTexCoord2f (0.5, 0.0); glVertex3f (li, bo, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
- glTexCoord2f (0.0, 0.5); glVertex3f (lo, bi, z);
-
- glTexCoord2f (0.5, 0.0); glVertex3f (li, bo, z);
- glTexCoord2f (0.5, 0.0); glVertex3f (ri, bo, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
-
- glTexCoord2f (0.5, 0.0); glVertex3f (ri, bo, z);
- glTexCoord2f (1.0, 0.0); glVertex3f (ro, bo, z);
- glTexCoord2f (1.0, 0.5); glVertex3f (ro, bi, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
-
- glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
- glTexCoord2f (1.0, 0.5); glVertex3f (ro, bi, z);
- glTexCoord2f (1.0, 0.5); glVertex3f (ro, ti, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
-
- glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
- glTexCoord2f (1.0, 0.5); glVertex3f (ro, ti, z);
- glTexCoord2f (1.0, 1.0); glVertex3f (ro, to, z);
- glTexCoord2f (0.5, 1.0); glVertex3f (ri, to, z);
-
- glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
- glTexCoord2f (0.5, 1.0); glVertex3f (ri, to, z);
- glTexCoord2f (0.5, 1.0); glVertex3f (li, to, z);
-
- glTexCoord2f (0.0, 0.5); glVertex3f (lo, ti, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
- glTexCoord2f (0.5, 1.0); glVertex3f (li, to, z);
- glTexCoord2f (0.0, 1.0); glVertex3f (lo, to, z);
-
- glTexCoord2f (0.0, 0.5); glVertex3f (lo, bi, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
- glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
- glTexCoord2f (0.0, 0.5); glVertex3f (lo, ti, z);
-
- glEnd();
-}
diff --git a/hacks/glx/dropshadow.h b/hacks/glx/dropshadow.h
deleted file mode 100644
index 8c7179b..0000000
--- a/hacks/glx/dropshadow.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* dropshadow.h, Copyright (c) 2009 Jens Kilian <jjk@acm.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __DROPSHADOW_H__
-#define __DROPSHADOW_H__
-
-/* Initialize drop shadow texture, return a texture ID.
- */
-GLuint
-init_drop_shadow(void);
-
-/* Draw a drop shadow around a rectangle.
-
- t Texture ID (as returned by init_drop_shadow()).
- x, y, z; w, h Position (left bottom), depth and size of rectangle.
- r Radius of drop shadow.
-
- The shadow will be drawn using the current color.
- */
-
-void
-draw_drop_shadow (GLuint t,
- GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
- GLfloat r);
-
-#endif /* __DROPSHADOW_H__ */
diff --git a/hacks/glx/dxf2gl.pl b/hacks/glx/dxf2gl.pl
deleted file mode 100755
index 65b5a80..0000000
--- a/hacks/glx/dxf2gl.pl
+++ /dev/null
@@ -1,736 +0,0 @@
-#!/usr/bin/perl -w
-# Copyright © 2003-2018 Jamie Zawinski <jwz@jwz.org>
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation. No representations are made about the suitability of this
-# software for any purpose. It is provided "as is" without express or
-# implied warranty.
-#
-# Reads a DXF file, and emits C data suitable for use with OpenGL's
-# glInterleavedArrays() and glDrawArrays() routines.
-#
-# Options:
-#
-# --normalize Compute the bounding box of the object, and scale all
-# coordinates so that the object fits inside a unit cube.
-#
-# --smooth [DEG] When computing normals for the vertexes, average the
-# normals at any edge which is less than N degrees.
-# If this option is not specified, planar normals will be
-# used, resulting in a "faceted" object.
-#
-# --wireframe Emit lines instead of faces.
-#
-# --layers Emit a separate set of polygons for each layer in the
-# input file, instead of emitting the whole file as a
-# single unit.
-#
-# Created: 8-Mar-2003.
-
-require 5;
-use diagnostics;
-use strict;
-
-use POSIX qw(mktime strftime);
-use Math::Trig qw(acos);
-use Text::Wrap;
-
-my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.13 $' =~ m/\s(\d[.\d]+)\s/s);
-
-my $verbose = 0;
-
-
-# convert a vector to a unit vector
-sub normalize($$$) {
- my ($x, $y, $z) = @_;
- my $L = sqrt (($x * $x) + ($y * $y) + ($z * $z));
- if ($L != 0) {
- $x /= $L;
- $y /= $L;
- $z /= $L;
- } else {
- $x = $y = $z = 0;
- }
- return ($x, $y, $z);
-}
-
-
-# Calculate the unit normal at p0 given two other points p1,p2 on the
-# surface. The normal points in the direction of p1 crossproduct p2.
-#
-sub face_normal($$$$$$$$$) {
- my ($p0x, $p0y, $p0z,
- $p1x, $p1y, $p1z,
- $p2x, $p2y, $p2z) = @_;
-
- my ($nx, $ny, $nz);
- my ($pax, $pay, $paz);
- my ($pbx, $pby, $pbz);
-
- $pax = $p1x - $p0x;
- $pay = $p1y - $p0y;
- $paz = $p1z - $p0z;
- $pbx = $p2x - $p0x;
- $pby = $p2y - $p0y;
- $pbz = $p2z - $p0z;
- $nx = $pay * $pbz - $paz * $pby;
- $ny = $paz * $pbx - $pax * $pbz;
- $nz = $pax * $pby - $pay * $pbx;
-
- return (normalize ($nx, $ny, $nz));
-}
-
-
-my $pi = 3.141592653589793;
-my $radians_to_degrees = 180.0 / $pi;
-
-# Calculate the angle (in degrees) between two vectors.
-#
-sub vector_angle($$$$$$) {
- my ($x1, $y1, $z1,
- $x2, $y2, $z2) = @_;
-
- my $L1 = sqrt ($x1*$x1 + $y1*$y1 + $z1*$z1);
- my $L2 = sqrt ($x2*$x2 + $y2*$y2 + $z2*$z2);
-
- return 0 if ($L1 == 0 || $L2 == 0);
- return 0 if ($x1 == $x2 && $y1 == $y2 && $z1 == $z2);
-
- # dot product of two vectors is defined as:
- # $L1 * $L1 * cos(angle between vectors)
- # and is also defined as:
- # $x1*$x2 + $y1*$y2 + $z1*$z2
- # so:
- # $L1 * $L1 * cos($angle) = $x1*$x2 + $y1*$y2 + $z1*$z2
- # cos($angle) = ($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2)
- # $angle = acos (($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2));
- #
- my $cos = ($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2);
- $cos = 1 if ($cos > 1); # avoid fp rounding error (1.000001 => sqrt error)
- my $angle = acos ($cos);
-
- return ($angle * $radians_to_degrees);
-}
-
-
-# given a list of triangles ( [ X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, ]+ )
-# returns a list of the normals for each vertex. These are the smoothed
-# normals: the average of the normals of the participating faces.
-#
-sub compute_vertex_normals($@) {
- my ($smooth, @points) = @_;
- my $npoints = ($#points+1) / 3;
- my $nfaces = $npoints / 3;
-
- my @face_normals = ();
- my %point_faces;
-
- for (my $i = 0; $i < $nfaces; $i++) {
- my ($ax, $ay, $az, $bx, $by, $bz, $cx, $cy, $cz) =
- @points[($i*9) .. ($i*9)+8];
-
- # store the normal for each face in the $face_normals array
- # indexed by face number.
- #
- my @norm = face_normal ($ax, $ay, $az,
- $bx, $by, $bz,
- $cx, $cy, $cz);
- $face_normals[$i] = \@norm;
-
- # store in the %point_faces hash table a list of every face number
- # in which a point participates
-
- foreach my $p ("$ax $ay $az", "$bx $by $bz", "$cx $cy $cz") {
- my @flist = (defined($point_faces{$p}) ? @{$point_faces{$p}} : ());
- push @flist, $i;
- $point_faces{$p} = \@flist;
- }
- }
-
-
- # compute the normal for each vertex of each face.
- # (these points are not unique -- because there might be multiple
- # normals associated with the same vertex for different faces,
- # in the case where it's a sharp angle.)
- #
- my @normals = ();
- for (my $i = 0; $i < $nfaces; $i++) {
- my @verts = @points[($i*9) .. ($i*9)+8];
- error ("overshot in points?") unless defined($verts[8]);
-
- my @norm = @{$face_normals[$i]};
- error ("no normal $i?") unless defined($norm[2]);
-
- # iterate over the (three) vertexes in this face.
- #
- for (my $j = 0; $j < 3; $j++) {
- my ($x, $y, $z) = @verts[($j*3) .. ($j*3)+2];
- error ("overshot in verts?") unless defined($z);
-
- # Iterate over the faces in which this point participates.
- # But ignore any other faces that are at more than an N degree
- # angle from this point's face. Those are sharp edges.
- #
- my ($nx, $ny, $nz) = (0, 0, 0);
- my @faces = @{$point_faces{"$x $y $z"}};
- foreach my $fn (@faces) {
- my ($ax, $ay, $az, $bx, $by, $bz, $cx, $cy, $cz) =
- @points[($fn*9) .. ($fn*9)+8];
- my @fnorm = @{$face_normals[$fn]};
-
- # ignore any adjascent faces that are more than N degrees off.
- my $angle = vector_angle ($norm[0], $norm[1], $norm[2],
- $fnorm[0], $fnorm[1], $fnorm[2]);
- next if ($angle >= $smooth);
-
- $nx += $fnorm[0];
- $ny += $fnorm[1];
- $nz += $fnorm[2];
- }
-
- push @normals, normalize ($nx, $ny, $nz);
- }
- }
-
- return @normals;
-}
-
-
-sub parse_dxf($$$$$) {
- my ($filename, $dxf, $normalize_p, $wireframe_p, $layers_p) = @_;
-
- $dxf =~ s/\r\n/\n/gs; # CRLF
- $dxf =~ s/^[ \t\n]+|[ \t\n]+$//s; # leading/trailing whitespace
-
- # Convert whitespace within a line to _, e.g., "ObjectDBX Classes".
- # What the hell is up with this file format!
- 1 while ($dxf =~ s/([^ \t\n])[ \t\#]+([^ \t\n])/$1_$2/gs);
-
- $dxf =~ s/\r/\n/gs;
-
- # Turn blank lines into "", e.g., "$DIMBLK \n 1 \n \n 9 \n"
- $dxf =~ s/\n\n/\n""\n/gs;
-
- my @tokens = split (/[ \t\n]+/, $dxf); # tokenize
-
- my @entities = (); # parse
- while (@tokens) {
- my @elts = ();
- my $key = shift @tokens; # sectionize at "0 WORD"
- do {
- my $val = shift @tokens;
- push @elts, [ $key, $val ]; # contents are [CODE VAL]
- $key = shift @tokens;
- } while ($key && $key ne 0);
- unshift @tokens, $key if defined($key);
- push @entities, \@elts;
- }
- my %triangles; # list of points, indexed by layer name
- my %lines;
- my $error_count = 0;
-
- foreach my $entity (@entities) {
- my $header = shift @$entity;
- my ($code, $name) = @$header;
-
- if ($name eq 'SECTION' ||
- $name eq 'HEADER' ||
- $name eq 'ENDSEC' ||
- $name eq 'EOF') {
- print STDERR "$progname: $filename: ignoring \"$code $name\"\n"
- if ($verbose > 1);
-
- } elsif ($name eq '3DFACE') {
-
- my @points = ();
- my $pc = 0;
- my $layer = '';
-
- foreach my $entry (@$entity) {
- my ($key, $val) = @$entry;
- if ($key eq 8) { $layer = $val; # layer name
-
- } elsif ($key eq 10) { $pc++; $points[0] = $val; # X1
- } elsif ($key eq 20) { $pc++; $points[1] = $val; # Y1
- } elsif ($key eq 30) { $pc++; $points[2] = $val; # Z1
-
- } elsif ($key eq 11) { $pc++; $points[3] = $val; # X2
- } elsif ($key eq 21) { $pc++; $points[4] = $val; # Y2
- } elsif ($key eq 31) { $pc++; $points[5] = $val; # Z2
-
- } elsif ($key eq 12) { $pc++; $points[6] = $val; # X3
- } elsif ($key eq 22) { $pc++; $points[7] = $val; # Y3
- } elsif ($key eq 32) { $pc++; $points[8] = $val; # Z3
-
- } elsif ($key eq 13) { $pc++; $points[9] = $val; # X4
- } elsif ($key eq 23) { $pc++; $points[10] = $val; # Y4
- } elsif ($key eq 33) { $pc++; $points[11] = $val; # Z4
-
- } elsif ($key eq 62) { # color number
- } elsif ($key eq 70) { # invisible edge flag
- } else {
- print STDERR "$progname: $filename: WARNING:" .
- " unknown $name: \"$key $val\"\n";
- $error_count++;
- }
- }
-
- error ("got $pc points in $name") unless ($pc == 12);
-
- if ($points[6] != $points[9] ||
- $points[7] != $points[10] ||
- $points[8] != $points[11]) {
- error ("$filename: got a quad, not a triangle\n");
- } else {
- @points = @points[0 .. 8];
- }
-
- foreach (@points) { $_ += 0; } # convert strings to numbers
-
- $layer = '' unless $layers_p;
-
- $triangles{$layer} = [] unless defined ($triangles{$layer});
- push @{$triangles{$layer}}, @points;
-
- } elsif ($name eq 'LINE') {
-
- my @points = ();
- my $pc = 0;
- my $layer = '';
-
- foreach my $entry (@$entity) {
- my ($key, $val) = @$entry;
- if ($key eq 8) { $layer = $val; # layer name
-
- } elsif ($key eq 10) { $pc++; $points[0] = $val; # X1
- } elsif ($key eq 20) { $pc++; $points[1] = $val; # Y1
- } elsif ($key eq 30) { $pc++; $points[2] = $val; # Z1
-
- } elsif ($key eq 11) { $pc++; $points[3] = $val; # X2
- } elsif ($key eq 21) { $pc++; $points[4] = $val; # Y2
- } elsif ($key eq 31) { $pc++; $points[5] = $val; # Z2
-
- } elsif ($key eq 39) { # thickness
- } elsif ($key eq 62) { # color number
- } else {
- print STDERR "$progname: $filename: WARNING:" .
- " unknown $name: \"$key $val\"\n";
- $error_count++;
- }
- }
-
- error ("got $pc points in $name") unless ($pc == 6);
-
- foreach (@points) { $_ += 0; } # convert strings to numbers
-
- $layer = '' unless $layers_p;
-
- $lines{$layer} = [] unless defined ($lines{$layer});
- push @{$lines{$layer}}, @points;
-
- } elsif ($name =~ m/^\d+$/s) {
- error ("sequence lost: \"$code $name\"");
-
- } else {
- print STDERR "$progname: $filename: WARNING: unknown: \"$code $name\"\n";
- $error_count++;
- }
-
- error ("too many errors: bailing!") if ($error_count > 50);
- }
-
- if ($wireframe_p) {
-
- # Convert faces to lines.
- # Don't duplicate shared edges.
-
- foreach my $layer (keys %triangles) {
- my %dups;
- my @triangles = @{$triangles{$layer}};
- while (@triangles) {
- my $x1 = shift @triangles; # 0
- my $y1 = shift @triangles; # 1
- my $z1 = shift @triangles; # 2
- my $x2 = shift @triangles; # 3
- my $y2 = shift @triangles; # 4
- my $z2 = shift @triangles; # 5
- my $x3 = shift @triangles; # 6
- my $y3 = shift @triangles; # 7
- my $z3 = shift @triangles; # 8
-
- my $p = sub(@) {
- my ($x1, $y1, $z1, $x2, $y2, $z2) = @_;
- my $key1 = "$x1, $y1, $z1, $x2, $y2, $z2";
- my $key2 = "$x2, $y2, $z2, $x1, $y1, $z1";
- my $dup = $dups{$key1} || $dups{$key2};
- $dups{$key1} = 1;
- $dups{$key2} = 1;
- push @{$lines{$layer}}, @_ unless $dup;
- }
- ;
- $p->($x1, $y1, $z1, $x2, $y2, $z2);
- $p->($x2, $y2, $z2, $x3, $y3, $z3);
- $p->($x3, $y3, $z3, $x1, $y1, $z1);
- }
-
- @{$triangles{$layer}} = ();
- }
-
- } else {
- foreach my $layer (keys %lines) {
- my $n = @{$lines{$layer}};
- @{$lines{$layer}} = ();
- print STDERR "$progname: $filename: $layer: WARNING:" .
- " ignored $n stray LINE" . ($n == 1 ? "" : "s") . ".\n"
- if ($n);
- }
- }
-
-
- # find bounding box, and normalize
- #
- if ($normalize_p || $verbose) {
- my $minx = 999999999;
- my $miny = 999999999;
- my $minz = 999999999;
- my $maxx = -999999999;
- my $maxy = -999999999;
- my $maxz = -999999999;
- my $i = 0;
-
- foreach my $layer (keys %triangles) {
- my %dups;
- my @triangles = @{$triangles{$layer}};
-
- foreach my $n (@{$lines{$layer}}, @{$triangles{$layer}}) {
- if ($i == 0) { $minx = $n if ($n < $minx);
- $maxx = $n if ($n > $maxx); }
- elsif ($i == 1) { $miny = $n if ($n < $miny);
- $maxy = $n if ($n > $maxy); }
- else { $minz = $n if ($n < $minz);
- $maxz = $n if ($n > $maxz); }
- $i = 0 if (++$i == 3);
- }
- }
-
- my $w = ($maxx - $minx);
- my $h = ($maxy - $miny);
- my $d = ($maxz - $minz);
- my $sizea = ($w > $h ? $w : $h);
- my $sizeb = ($w > $d ? $w : $d);
- my $size = ($sizea > $sizeb ? $sizea : $sizeb);
-
- print STDERR "$progname: $filename: bbox is " .
- sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
- if ($verbose);
- print STDERR "$progname: $filename: center is " .
- sprintf("%.2f, %.2f, %.2f\n",
- $minx + $w / 2,
- $miny + $h / 2,
- $minz + $d / 2)
- if ($verbose);
-
- if ($normalize_p) {
- $w /= $size;
- $h /= $size;
- $d /= $size;
-
- print STDERR "$progname: $filename: dividing by " .
- sprintf("%.2f", $size) . " for bbox of " .
- sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
- if ($verbose);
- foreach my $layer (keys %triangles) {
- foreach my $n (@{$triangles{$layer}}) { $n /= $size; }
- foreach my $n (@{$lines{$layer}}) { $n /= $size; }
- }
- }
- }
-
- return ($wireframe_p ? \%lines : \%triangles);
-}
-
-
-sub generate_c_1($$$$$@) {
- my ($name, $outfile, $smooth, $wireframe_p, $normalize_p, @points) = @_;
-
- my $ccw_p = 1; # counter-clockwise winding rule for computing normals
-
- my $npoints = ($#points + 1) / 3;
- my $nfaces = ($wireframe_p ? $npoints/2 : $npoints/3);
-
- my @normals;
- if ($smooth && !$wireframe_p) {
- @normals = compute_vertex_normals ($smooth, @points);
-
- if ($#normals != $#points) {
- error ("computed " . (($#normals+1)/3) . " normals for " .
- (($#points+1)/3) . " points?");
- }
- }
-
- my $code .= "\nstatic const float ${name}_data[] = {\n";
-
- if ($wireframe_p) {
- my %dups;
- for (my $i = 0; $i < $nfaces; $i++) {
- my $ax = $points[$i*6];
- my $ay = $points[$i*6+1];
- my $az = $points[$i*6+2];
-
- my $bx = $points[$i*6+3];
- my $by = $points[$i*6+4];
- my $bz = $points[$i*6+5];
-
- my $lines = sprintf("\t" . "%.6f,%.6f,%.6f,\n" .
- "\t" . "%.6f,%.6f,%.6f,\n",
- $ax, $ay, $az,
- $bx, $by, $bz);
- $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
- $lines =~ s/\.,/,/g;
- $lines =~ s/-0,/0,/g;
-
- $code .= $lines;
- }
-
- } else {
- for (my $i = 0; $i < $nfaces; $i++) {
- my $ax = $points[$i*9];
- my $ay = $points[$i*9+1];
- my $az = $points[$i*9+2];
-
- my $bx = $points[$i*9+3];
- my $by = $points[$i*9+4];
- my $bz = $points[$i*9+5];
-
- my $cx = $points[$i*9+6];
- my $cy = $points[$i*9+7];
- my $cz = $points[$i*9+8];
-
- my ($nax, $nay, $naz,
- $nbx, $nby, $nbz,
- $ncx, $ncy, $ncz);
-
- if ($smooth) {
- $nax = $normals[$i*9];
- $nay = $normals[$i*9+1];
- $naz = $normals[$i*9+2];
-
- $nbx = $normals[$i*9+3];
- $nby = $normals[$i*9+4];
- $nbz = $normals[$i*9+5];
-
- $ncx = $normals[$i*9+6];
- $ncy = $normals[$i*9+7];
- $ncz = $normals[$i*9+8];
-
- } else {
- if ($ccw_p) {
- ($nax, $nay, $naz) = face_normal ($ax, $ay, $az,
- $bx, $by, $bz,
- $cx, $cy, $cz);
- } else {
- ($nax, $nay, $naz) = face_normal ($ax, $ay, $az,
- $cx, $cy, $cz,
- $bx, $by, $bz);
- }
- ($nbx, $nby, $nbz) = ($nax, $nay, $naz);
- ($ncx, $ncy, $ncz) = ($nax, $nay, $naz);
- }
-
- my $lines = sprintf("\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
- "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
- "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n",
- $nax, $nay, $naz, $ax, $ay, $az,
- $nbx, $nby, $nbz, $bx, $by, $bz,
- $ncx, $ncy, $ncz, $cx, $cy, $cz);
- $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
- $lines =~ s/\.,/,/g;
- $lines =~ s/-0,/0,/g;
-
- $code .= $lines;
- }
- }
-
- my $format = ($wireframe_p ? 'GL_V3F' : 'GL_N3F_V3F');
- my $primitive = ($wireframe_p ? 'GL_LINES' : 'GL_TRIANGLES');
-
- $code =~ s/,\n$//s;
- $code .= "\n};\n";
- $code .= "static const struct gllist ${name}_frame = {\n";
- $code .= " $format, $primitive, $npoints, ${name}_data, 0\n};\n";
- $code .= "const struct gllist *$name = &${name}_frame;\n";
-
- print STDERR "$progname: $outfile: $name: $npoints points, $nfaces faces.\n"
- if ($verbose);
-
- return ($code, $npoints, $nfaces);
-}
-
-
-sub generate_c($$$$$$) {
- my ($infile, $outfile, $smooth, $wireframe_p, $normalize_p, $layers) = @_;
-
- my $code = '';
-
- my $token = $outfile; # guess at a C token from the filename
- $token =~ s/\<[^<>]*\>//;
- $token =~ s@^.*/@@;
- $token =~ s/\.[^.]*$//;
- $token =~ s/[^a-z\d]/_/gi;
- $token =~ s/__+/_/g;
- $token =~ s/^_//g;
- $token =~ s/_$//g;
- $token =~ tr [A-Z] [a-z];
- $token = 'foo' if ($token eq '');
-
- my @layers = sort (keys %$layers);
-
- $infile =~ s@^.*/@@s;
- $code .= ("/* Generated from \"$infile\" on " .
- strftime ("%d-%b-%Y", localtime ()) . ".\n" .
- " " . ($wireframe_p
- ? "Wireframe."
- : ($smooth ?
- "Smoothed vertex normals at $smooth\x{00B0}." :
- "Faceted face normals.")) .
- ($normalize_p ? " Normalized to unit bounding box." : "") .
- "\n" .
- (@layers > 1
- ? wrap (" ", " ", "Components: " . join (", ", @layers)) . ".\n"
- : "") .
- " */\n\n");
-
- $code .= "#include \"gllist.h\"\n";
-
- my $npoints = 0;
- my $nfaces = 0;
-
- foreach my $layer (@layers) {
- my $name = $layer ? "${token}_${layer}" : $token;
- my ($c, $np, $nf) =
- generate_c_1 ($name, $outfile,
- $smooth, $wireframe_p, $normalize_p,
- @{$layers->{$layer}});
- $code .= $c;
- $npoints += $np;
- $nfaces += $nf;
- }
-
- print STDERR "$progname: $outfile: total: $npoints points, $nfaces faces.\n"
- if ($verbose && @layers > 1);
-
- return $code;
-}
-
-
-# Returns true if the two files differ (by running "cmp")
-#
-sub cmp_files($$) {
- my ($file1, $file2) = @_;
-
- my @cmd = ("cmp", "-s", "$file1", "$file2");
- print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
- if ($verbose > 3);
-
- system (@cmd);
- my $exit_value = $? >> 8;
- my $signal_num = $? & 127;
- my $dumped_core = $? & 128;
-
- error ("$cmd[0]: core dumped!") if ($dumped_core);
- error ("$cmd[0]: signal $signal_num!") if ($signal_num);
- return $exit_value;
-}
-
-
-sub dxf_to_gl($$$$$$) {
- my ($infile, $outfile, $smooth, $normalize_p, $wireframe_p, $layers_p) = @_;
-
- open (my $in, "<$infile") || error ("$infile: $!");
- my $filename = ($infile eq '-' ? "<stdin>" : $infile);
- print STDERR "$progname: reading $filename...\n"
- if ($verbose);
-
- local $/ = undef; # read entire file
- my $dxf = <$in>;
- close $in;
-
- my $data = parse_dxf ($filename, $dxf, $normalize_p, $wireframe_p, $layers_p);
-
- $filename = ($outfile eq '-' ? "<stdout>" : $outfile);
- my $code = generate_c ($infile, $filename, $smooth, $wireframe_p,
- $normalize_p, $data);
-
- if ($outfile eq '-') {
- print STDOUT $code;
- } else {
- my $tmp = "$outfile.tmp";
- open (my $out, '>:utf8', $tmp) || error ("$tmp: $!");
- print $out $code || error ("$filename: $!");
- close $out || error ("$filename: $!");
- if (cmp_files ($filename, $tmp)) {
- if (!rename ($tmp, $filename)) {
- unlink $tmp;
- error ("mv $tmp $filename: $!");
- }
- print STDERR "$progname: wrote $filename\n";
- } else {
- unlink "$tmp" || error ("rm $tmp: $!\n");
- print STDERR "$progname: $filename unchanged\n" if ($verbose);
- }
- }
-}
-
-
-sub error() {
- ($_) = @_;
- print STDERR "$progname: $_\n";
- exit 1;
-}
-
-sub usage() {
- print STDERR "usage: $progname " .
- "[--verbose] [--normalize] [--smooth] [--wireframe] [--layers]\n" .
- "[infile [outfile]]\n";
- exit 1;
-}
-
-sub main() {
- my ($infile, $outfile);
- my $normalize_p = 0;
- my $smooth = 0;
- my $wireframe_p = 0;
- my $layers_p = 0;
- while ($_ = $ARGV[0]) {
- shift @ARGV;
- if ($_ eq "--verbose") { $verbose++; }
- elsif (m/^-v+$/) { $verbose += length($_)-1; }
- elsif ($_ eq "--normalize") { $normalize_p = 1; }
- elsif ($_ eq "--smooth") {
- if ($ARGV[0] && $ARGV[0] =~ m/^(\d[\d.]*)%?$/s) {
- $smooth = 0 + $1;
- shift @ARGV;
- } else {
- $smooth = 30;
- }
- }
- elsif ($_ eq "--wireframe") { $wireframe_p = 1; }
- elsif ($_ eq "--layers") { $layers_p = 1; }
- elsif (m/^-./) { usage; }
- elsif (!defined($infile)) { $infile = $_; }
- elsif (!defined($outfile)) { $outfile = $_; }
- else { usage; }
- }
-
- $infile = "-" unless defined ($infile);
- $outfile = "-" unless defined ($outfile);
-
- dxf_to_gl ($infile, $outfile, $smooth, $normalize_p, $wireframe_p, $layers_p);
-}
-
-main;
-exit 0;
diff --git a/hacks/glx/dymaxionmap-coords.c b/hacks/glx/dymaxionmap-coords.c
deleted file mode 100644
index 8da6c02..0000000
--- a/hacks/glx/dymaxionmap-coords.c
+++ /dev/null
@@ -1,685 +0,0 @@
-/* http://www.rwgrayprojects.com/rbfnotes/maps/graymap6.html
- Slightly modified by jwz for xscreensaver
- */
-
-
-/**************************************************************/
-/* */
-/* This C program is copyrighted by Robert W. Gray and may */
-/* not be used in ANY for-profit project without written */
-/* permission. */
-/* */
-/**************************************************************/
-
-/* (Note: Robert Gray has kindly given me his permission to include
- this code in xscreensaver. -- Jamie Zawinski, Apr 2018.)
- */
-
-
-/**************************************************************/
-/* */
-/* This C program contains the Dymaxion map coordinate */
-/* transformation routines for converting longitude/latitude */
-/* points to (X, Y) points on the Dymaxion map. */
-/* */
-/* This version uses the exact transformation equations. */
-/**************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "dymaxionmap-coords.h"
-
-/************************************************************************/
-/* NOTE: in C, array indexing starts with element zero (0). I choose */
-/* to start my array indexing with elemennt one (1) so all arrays */
-/* are defined one element longer than they need to be. */
-/************************************************************************/
-
-/************************************************************************/
-/* global variables accessable to all procedures */
-/************************************************************************/
-
-static double v_x[13], v_y[13], v_z[13];
-static double center_x[21], center_y[21], center_z[21];
-static double garc, gt, gdve, gel;
-
-/********************************************/
-/* function pre-definitions */
-/********************************************/
-
-static double radians(double degrees);
-static void rotate(double angle, double *x, double *y);
-static void r2(int axis, double alpha, double *x, double *y, double *z);
-static void init_stuff(void);
-/*static void convert_s_t_p(double lng, double lat, double *x, double *y);*/
-static void s_to_c(double theta, double phi, double *x, double *y, double *z);
-static void c_to_s(double *theta, double *phi, double x, double y, double z);
-static void s_tri_info(double x, double y, double z,
- int *tri, int *lcd);
-static void dymax_point(int tri, int lcd,
- double x, double y, double z,
- double *dx, double *dy);
-static void conv_ll_t_sc(double lng, double lat, double *theta, double *phi);
-
-
-/****************************************/
-/* function definitions */
-/****************************************/
-
-
-void
-/* convert_s_t_p */
-dymaxion_convert
-(double lng, double lat, double *x, double *y)
-{
- /***********************************************************/
- /* This is the main control procedure. */
- /***********************************************************/
-
- double theta, phi;
- double hx, hy, hz;
- double px = 0, py = 0;
- int tri, hlcd;
-
- static int initted = 0;
- if (! initted) {
- init_stuff();
- initted = 1;
- }
-
- /* Convert the given (long.,lat.) coordinate into spherical */
- /* polar coordinates (r, theta, phi) with radius=1. */
- /* Angles are given in radians, NOT degrees. */
-
- conv_ll_t_sc(lng, lat, &theta, &phi);
-
- /* convert the spherical polar coordinates into cartesian */
- /* (x, y, z) coordinates. */
-
- s_to_c(theta, phi, &hx, &hy, &hz);
-
- /* determine which of the 20 spherical icosahedron triangles */
- /* the given point is in and the LCD triangle. */
-
- s_tri_info(hx, hy, hz, &tri, &hlcd);
-
- /* Determine the corresponding Fuller map plane (x, y) point */
-
- dymax_point(tri, hlcd, hx, hy, hz, &px, &py);
- *x = px;
- *y = py;
-
-} /* end convert_s_t_p */
-
-
-static void conv_ll_t_sc(double lng, double lat, double *theta, double *phi)
-{
- /* convert (long., lat.) point into spherical polar coordinates */
- /* with r=radius=1. Angles are given in radians. */
-
- double h_theta, h_phi;
-
- h_theta = 90.0 - lat ;
- h_phi = lng;
- if (lng < 0.0) {h_phi = lng + 360.0;}
- *theta = radians(h_theta);
- *phi = radians(h_phi);
-
-} /* end conv_ll_t_sc */
-
-
-static double radians(double degrees)
-{
- /* convert angles in degrees into angles in radians */
-
- double pi2, c1;
-
- pi2 = 2 * M_PI;
- c1 = pi2 / 360;
- return(c1 * degrees);
-
-} /* end of radians function */
-
-
-static void init_stuff()
-{
- /* initializes the global variables which includes the */
- /* vertix coordinates and mid-face coordinates. */
-
- double /* i, */ hold_x, hold_y, hold_z, magn;
- /* double theta, phi; */
-
- /* Cartesian coordinates for the 12 vertices of icosahedron */
-
- v_x[1] = 0.420152426708710003;
- v_y[1] = 0.078145249402782959;
- v_z[1] = 0.904082550615019298;
- v_x[2] = 0.995009439436241649 ;
- v_y[2] = -0.091347795276427931 ;
- v_z[2] = 0.040147175877166645 ;
- v_x[3] = 0.518836730327364437 ;
- v_y[3] = 0.835420380378235850 ;
- v_z[3] = 0.181331837557262454 ;
- v_x[4] = -0.414682225320335218 ;
- v_y[4] = 0.655962405434800777 ;
- v_z[4] = 0.630675807891475371 ;
- v_x[5] = -0.515455959944041808 ;
- v_y[5] = -0.381716898287133011 ;
- v_z[5] = 0.767200992517747538 ;
- v_x[6] = 0.355781402532944713 ;
- v_y[6] = -0.843580002466178147 ;
- v_z[6] = 0.402234226602925571 ;
- v_x[7] = 0.414682225320335218 ;
- v_y[7] = -0.655962405434800777 ;
- v_z[7] = -0.630675807891475371 ;
- v_x[8] = 0.515455959944041808 ;
- v_y[8] = 0.381716898287133011 ;
- v_z[8] = -0.767200992517747538 ;
- v_x[9] = -0.355781402532944713 ;
- v_y[9] = 0.843580002466178147 ;
- v_z[9] = -0.402234226602925571 ;
- v_x[10] = -0.995009439436241649 ;
- v_y[10] = 0.091347795276427931 ;
- v_z[10] = -0.040147175877166645 ;
- v_x[11] = -0.518836730327364437 ;
- v_y[11] = -0.835420380378235850 ;
- v_z[11] = -0.181331837557262454 ;
- v_x[12] = -0.420152426708710003 ;
- v_y[12] = -0.078145249402782959 ;
- v_z[12] = -0.904082550615019298 ;
-
- /* now calculate mid face coordinates */
-
- hold_x = (v_x[1] + v_x[2] + v_x[3]) / 3.0 ;
- hold_y = (v_y[1] + v_y[2] + v_y[3]) / 3.0 ;
- hold_z = (v_z[1] + v_z[2] + v_z[3]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[1] = hold_x / magn;
- center_y[1] = hold_y / magn;
- center_z[1] = hold_z / magn;
-
- hold_x = (v_x[1] + v_x[3] + v_x[4]) / 3.0 ;
- hold_y = (v_y[1] + v_y[3] + v_y[4]) / 3.0 ;
- hold_z = (v_z[1] + v_z[3] + v_z[4]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[2] = hold_x / magn;
- center_y[2] = hold_y / magn;
- center_z[2] = hold_z / magn;
-
- hold_x = (v_x[1] + v_x[4] + v_x[5]) / 3.0 ;
- hold_y = (v_y[1] + v_y[4] + v_y[5]) / 3.0 ;
- hold_z = (v_z[1] + v_z[4] + v_z[5]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[3] = hold_x / magn;
- center_y[3] = hold_y / magn;
- center_z[3] = hold_z / magn;
-
- hold_x = (v_x[1] + v_x[5] + v_x[6]) / 3.0 ;
- hold_y = (v_y[1] + v_y[5] + v_y[6]) / 3.0 ;
- hold_z = (v_z[1] + v_z[5] + v_z[6]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[4] = hold_x / magn;
- center_y[4] = hold_y / magn;
- center_z[4] = hold_z / magn;
-
- hold_x = (v_x[1] + v_x[2] + v_x[6]) / 3.0 ;
- hold_y = (v_y[1] + v_y[2] + v_y[6]) / 3.0 ;
- hold_z = (v_z[1] + v_z[2] + v_z[6]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[5] = hold_x / magn;
- center_y[5] = hold_y / magn;
- center_z[5] = hold_z / magn;
-
- hold_x = (v_x[2] + v_x[3] + v_x[8]) / 3.0 ;
- hold_y = (v_y[2] + v_y[3] + v_y[8]) / 3.0 ;
- hold_z = (v_z[2] + v_z[3] + v_z[8]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[6] = hold_x / magn;
- center_y[6] = hold_y / magn;
- center_z[6] = hold_z / magn;
-
- hold_x = (v_x[8] + v_x[3] + v_x[9]) / 3.0 ;
- hold_y = (v_y[8] + v_y[3] + v_y[9]) / 3.0 ;
- hold_z = (v_z[8] + v_z[3] + v_z[9]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[7] = hold_x / magn;
- center_y[7] = hold_y / magn;
- center_z[7] = hold_z / magn;
-
- hold_x = (v_x[9] + v_x[3] + v_x[4]) / 3.0 ;
- hold_y = (v_y[9] + v_y[3] + v_y[4]) / 3.0 ;
- hold_z = (v_z[9] + v_z[3] + v_z[4]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[8] = hold_x / magn;
- center_y[8] = hold_y / magn;
- center_z[8] = hold_z / magn;
-
- hold_x = (v_x[10] + v_x[9] + v_x[4]) / 3.0 ;
- hold_y = (v_y[10] + v_y[9] + v_y[4]) / 3.0 ;
- hold_z = (v_z[10] + v_z[9] + v_z[4]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[9] = hold_x / magn;
- center_y[9] = hold_y / magn;
- center_z[9] = hold_z / magn;
-
- hold_x = (v_x[5] + v_x[10] + v_x[4]) / 3.0 ;
- hold_y = (v_y[5] + v_y[10] + v_y[4]) / 3.0 ;
- hold_z = (v_z[5] + v_z[10] + v_z[4]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[10] = hold_x / magn;
- center_y[10] = hold_y / magn;
- center_z[10] = hold_z / magn;
-
- hold_x = (v_x[5] + v_x[11] + v_x[10]) / 3.0 ;
- hold_y = (v_y[5] + v_y[11] + v_y[10]) / 3.0 ;
- hold_z = (v_z[5] + v_z[11] + v_z[10]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[11] = hold_x / magn;
- center_y[11] = hold_y / magn;
- center_z[11] = hold_z / magn;
-
- hold_x = (v_x[5] + v_x[6] + v_x[11]) / 3.0 ;
- hold_y = (v_y[5] + v_y[6] + v_y[11]) / 3.0 ;
- hold_z = (v_z[5] + v_z[6] + v_z[11]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[12] = hold_x / magn;
- center_y[12] = hold_y / magn;
- center_z[12] = hold_z / magn;
-
- hold_x = (v_x[11] + v_x[6] + v_x[7]) / 3.0 ;
- hold_y = (v_y[11] + v_y[6] + v_y[7]) / 3.0 ;
- hold_z = (v_z[11] + v_z[6] + v_z[7]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[13] = hold_x / magn;
- center_y[13] = hold_y / magn;
- center_z[13] = hold_z / magn;
-
- hold_x = (v_x[7] + v_x[6] + v_x[2]) / 3.0 ;
- hold_y = (v_y[7] + v_y[6] + v_y[2]) / 3.0 ;
- hold_z = (v_z[7] + v_z[6] + v_z[2]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[14] = hold_x / magn;
- center_y[14] = hold_y / magn;
- center_z[14] = hold_z / magn;
-
- hold_x = (v_x[8] + v_x[7] + v_x[2]) / 3.0 ;
- hold_y = (v_y[8] + v_y[7] + v_y[2]) / 3.0 ;
- hold_z = (v_z[8] + v_z[7] + v_z[2]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[15] = hold_x / magn;
- center_y[15] = hold_y / magn;
- center_z[15] = hold_z / magn;
-
- hold_x = (v_x[12] + v_x[9] + v_x[8]) / 3.0 ;
- hold_y = (v_y[12] + v_y[9] + v_y[8]) / 3.0 ;
- hold_z = (v_z[12] + v_z[9] + v_z[8]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[16] = hold_x / magn;
- center_y[16] = hold_y / magn;
- center_z[16] = hold_z / magn;
-
- hold_x = (v_x[12] + v_x[9] + v_x[10]) / 3.0 ;
- hold_y = (v_y[12] + v_y[9] + v_y[10]) / 3.0 ;
- hold_z = (v_z[12] + v_z[9] + v_z[10]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[17] = hold_x / magn;
- center_y[17] = hold_y / magn;
- center_z[17] = hold_z / magn;
-
- hold_x = (v_x[12] + v_x[11] + v_x[10]) / 3.0 ;
- hold_y = (v_y[12] + v_y[11] + v_y[10]) / 3.0 ;
- hold_z = (v_z[12] + v_z[11] + v_z[10]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[18] = hold_x / magn;
- center_y[18] = hold_y / magn;
- center_z[18] = hold_z / magn;
-
- hold_x = (v_x[12] + v_x[11] + v_x[7]) / 3.0 ;
- hold_y = (v_y[12] + v_y[11] + v_y[7]) / 3.0 ;
- hold_z = (v_z[12] + v_z[11] + v_z[7]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[19] = hold_x / magn;
- center_y[19] = hold_y / magn;
- center_z[19] = hold_z / magn;
-
- hold_x = (v_x[12] + v_x[8] + v_x[7]) / 3.0 ;
- hold_y = (v_y[12] + v_y[8] + v_y[7]) / 3.0 ;
- hold_z = (v_z[12] + v_z[8] + v_z[7]) / 3.0 ;
- magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
- center_x[20] = hold_x / magn;
- center_y[20] = hold_y / magn;
- center_z[20] = hold_z / magn;
-
- garc = 2.0 * asin( sqrt( 5 - sqrt(5)) / sqrt(10) );
- gt = garc / 2.0;
-
- gdve = sqrt( 3 + sqrt(5) ) / sqrt( 5 + sqrt(5) );
- gel = sqrt(8) / sqrt(5 + sqrt(5));
-
-} /* end of int_stuff procedure */
-
-
-static void s_to_c(double theta, double phi, double *x, double *y, double *z)
-{
- /* Covert spherical polar coordinates to cartesian coordinates. */
- /* The angles are given in radians. */
-
- *x = sin(theta) * cos(phi);
- *y = sin(theta) * sin(phi);
- *z = cos(theta);
-
- } /* end s_to_c */
-
-
-static void c_to_s(double *lng, double *lat, double x, double y, double z)
- {
- /* convert cartesian coordinates into spherical polar coordinates. */
- /* The angles are given in radians. */
-
- double a;
-
- if (x>0.0 && y>0.0){a = radians(0.0);}
- if (x<0.0 && y>0.0){a = radians(180.0);}
- if (x<0.0 && y<0.0){a = radians(180.0);}
- if (x>0.0 && y<0.0){a = radians(360.0);}
- *lat = acos(z);
- if (x==0.0 && y>0.0){*lng = radians(90.0);}
- if (x==0.0 && y<0.0){*lng = radians(270.0);}
- if (x>0.0 && y==0.0){*lng = radians(0.0);}
- if (x<0.0 && y==0.0){*lng = radians(180.0);}
- if (x!=0.0 && y!=0.0){*lng = atan(y/x) + a;}
-
-} /* end c_to_s */
-
-
-void s_tri_info(double x, double y, double z,
- int *tri, int *lcd)
-{
- /* Determine which triangle and LCD triangle the point is in. */
-
- double h_dist1, h_dist2, h_dist3, h1, h2, h3;
- int i, h_tri, h_lcd ;
- int v1 = 0, v2 = 0, v3 = 0;
-
- h_tri = 0;
- h_dist1 = 9999.0;
-
- /* Which triangle face center is the closest to the given point */
- /* is the triangle in which the given point is in. */
-
- for (i = 1; i <=20; i = i + 1)
- {
- h1 = center_x[i] - x;
- h2 = center_y[i] - y;
- h3 = center_z[i] - z;
- h_dist2 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
- if (h_dist2 < h_dist1)
- {
- h_tri = i;
- h_dist1 = h_dist2;
- } /* end the if statement */
- } /* end the for statement */
-
- *tri = h_tri;
-
- /* Now the LCD triangle is determined. */
-
- switch (h_tri)
- {
- case 1: v1 = 1; v2 = 3; v3 = 2; break;
- case 2: v1 = 1; v2 = 4; v3 = 3; break;
- case 3: v1 = 1; v2 = 5; v3 = 4; break;
- case 4: v1 = 1; v2 = 6; v3 = 5; break;
- case 5: v1 = 1; v2 = 2; v3 = 6; break;
- case 6: v1 = 2; v2 = 3; v3 = 8; break;
- case 7: v1 = 3; v2 = 9; v3 = 8; break;
- case 8: v1 = 3; v2 = 4; v3 = 9; break;
- case 9: v1 = 4; v2 = 10; v3 = 9; break;
- case 10: v1 = 4; v2 = 5; v3 = 10; break;
- case 11: v1 = 5; v2 = 11; v3 = 10; break;
- case 12: v1 = 5; v2 = 6; v3 = 11; break;
- case 13: v1 = 6; v2 = 7; v3 = 11; break;
- case 14: v1 = 2; v2 = 7; v3 = 6; break;
- case 15: v1 = 2; v2 = 8; v3 = 7; break;
- case 16: v1 = 8; v2 = 9; v3 = 12; break;
- case 17: v1 = 9; v2 = 10; v3 = 12; break;
- case 18: v1 = 10; v2 = 11; v3 = 12; break;
- case 19: v1 = 11; v2 = 7; v3 = 12; break;
- case 20: v1 = 8; v2 = 12; v3 = 7; break;
- } /* end of switch statement */
-
- h1 = x - v_x[v1];
- h2 = y - v_y[v1];
- h3 = z - v_z[v1];
- h_dist1 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
-
- h1 = x - v_x[v2];
- h2 = y - v_y[v2];
- h3 = z - v_z[v2];
- h_dist2 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
-
- h1 = x - v_x[v3];
- h2 = y - v_y[v3];
- h3 = z - v_z[v3];
- h_dist3 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
-
- if ( (h_dist1 <= h_dist2) && (h_dist2 <= h_dist3) ) {h_lcd = 1; }
- if ( (h_dist1 <= h_dist3) && (h_dist3 <= h_dist2) ) {h_lcd = 6; }
- if ( (h_dist2 <= h_dist1) && (h_dist1 <= h_dist3) ) {h_lcd = 2; }
- if ( (h_dist2 <= h_dist3) && (h_dist3 <= h_dist1) ) {h_lcd = 3; }
- if ( (h_dist3 <= h_dist1) && (h_dist1 <= h_dist2) ) {h_lcd = 5; }
- if ( (h_dist3 <= h_dist2) && (h_dist2 <= h_dist1) ) {h_lcd = 4; }
-
- *lcd = h_lcd;
-
-} /* end s_tri_info */
-
-
-static void dymax_point(int tri, int lcd,
- double x, double y, double z,
- double *px, double *py)
-{
- int axis, v1 = 0;
- double hlng, hlat, h0x, h0y, h0z, h1x, h1y, h1z;
-
- double gs;
- double gx, gy, gz, ga1,ga2,ga3,ga1p,ga2p,ga3p,gxp,gyp/*,gzp*/;
-
-
- /* In order to rotate the given point into the template spherical */
- /* triangle, we need the spherical polar coordinates of the center */
- /* of the face and one of the face vertices. So set up which vertex */
- /* to use. */
-
- switch (tri)
- {
- case 1: v1 = 1; break;
- case 2: v1 = 1; break;
- case 3: v1 = 1; break;
- case 4: v1 = 1; break;
- case 5: v1 = 1; break;
- case 6: v1 = 2; break;
- case 7: v1 = 3; break;
- case 8: v1 = 3; break;
- case 9: v1 = 4; break;
- case 10: v1 = 4; break;
- case 11: v1 = 5; break;
- case 12: v1 = 5; break;
- case 13: v1 = 6; break;
- case 14: v1 = 2; break;
- case 15: v1 = 2; break;
- case 16: v1 = 8; break;
- case 17: v1 = 9; break;
- case 18: v1 = 10; break;
- case 19: v1 = 11; break;
- case 20: v1 = 8; break;
- } /* end of switch statement */
-
- h0x = x;
- h0y = y;
- h0z = z;
-
- h1x = v_x[v1];
- h1y = v_y[v1];
- h1z = v_z[v1];
-
- c_to_s(&hlng, &hlat, center_x[tri], center_y[tri], center_z[tri]);
-
- axis = 3;
- r2(axis,hlng,&h0x,&h0y,&h0z);
- r2(axis,hlng,&h1x,&h1y,&h1z);
-
- axis = 2;
- r2(axis,hlat,&h0x,&h0y,&h0z);
- r2(axis,hlat,&h1x,&h1y,&h1z);
-
- c_to_s(&hlng,&hlat,h1x,h1y,h1z);
- hlng = hlng - radians(90.0);
-
- axis = 3;
- r2(axis,hlng,&h0x,&h0y,&h0z);
-
- /* exact transformation equations */
-
- gz = sqrt(1 - h0x * h0x - h0y * h0y);
- gs = sqrt( 5 + 2 * sqrt(5) ) / ( gz * sqrt(15) );
-
- gxp = h0x * gs ;
- gyp = h0y * gs ;
-
- ga1p = 2.0 * gyp / sqrt(3.0) + (gel / 3.0) ;
- ga2p = gxp - (gyp / sqrt(3)) + (gel / 3.0) ;
- ga3p = (gel / 3.0) - gxp - (gyp / sqrt(3));
-
- ga1 = gt + atan( (ga1p - 0.5 * gel) / gdve);
- ga2 = gt + atan( (ga2p - 0.5 * gel) / gdve);
- ga3 = gt + atan( (ga3p - 0.5 * gel) / gdve);
-
- gx = 0.5 * (ga2 - ga3) ;
-
- gy = (1.0 / (2.0 * sqrt(3)) ) * (2 * ga1 - ga2 - ga3);
-
- /* Re-scale so plane triangle edge length is 1. */
-
- x = gx / garc;
- y = gy / garc;
-
- /* rotate and translate to correct position */
-
- switch (tri)
- {
- case 1: rotate(240.0,&x, &y);
- *px = x + 2.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
- case 2: rotate(300.0, &x, &y); *px = x + 2.0;
- *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
- case 3: rotate(0.0, &x, &y);
- *px = x + 2.5; *py = y + 2.0 / sqrt(3.0); break;
- case 4: rotate(60.0, &x, &y);
- *px = x + 3.0; *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
- case 5: rotate(180.0, &x, &y);
- *px = x + 2.5; *py = y + 4.0 * sqrt(3.0) / 3.0; break;
- case 6: rotate(300.0, &x, &y);
- *px = x + 1.5; *py = y + 4.0 * sqrt(3.0) / 3.0; break;
- case 7: rotate(300.0, &x, &y);
- *px = x + 1.0; *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
- case 8: rotate(0.0, &x, &y);
- *px = x + 1.5; *py = y + 2.0 / sqrt(3.0); break;
- case 9: if (lcd > 2)
- {
- rotate(300.0, &x, &y);
- *px = x + 1.5; *py = y + 1.0 / sqrt(3.0);
- }
- else
- {
- rotate(0.0, &x, &y);
- *px = x + 2.0; *py = y + 1.0 / (2.0 * sqrt(3.0));
- }
- break;
-
- case 10: rotate(60.0, &x, &y);
- *px = x + 2.5; *py = y + 1.0 / sqrt(3.0); break;
- case 11: rotate(60.0, &x, &y);
- *px = x + 3.5; *py = y + 1.0 / sqrt(3.0); break;
- case 12: rotate(120.0, &x, &y);
- *px = x + 3.5; *py = y + 2.0 / sqrt(3.0); break;
- case 13: rotate(60.0, &x, &y);
- *px = x + 4.0; *py = y + 5.0 / (2.0 * sqrt(3.0)); break;
- case 14: rotate(0.0, &x, &y);
- *px = x + 4.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
- case 15: rotate(0.0, &x, &y);
- *px = x + 5.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
- case 16: if (lcd < 4)
- {
- rotate(60.0, &x, &y);
- *px = x + 0.5; *py = y + 1.0 / sqrt(3.0);
- }
- else
- {
- rotate(0.0, &x, &y);
- *px = x + 5.5; *py = y + 2.0 / sqrt(3.0);
- }
- break;
- case 17: rotate(0.0, &x, &y);
- *px = x + 1.0; *py = y + 1.0 / (2.0 * sqrt(3.0)); break;
- case 18: rotate(120.0, &x, &y);
- *px = x + 4.0; *py = y + 1.0 / (2.0 * sqrt(3.0)); break;
- case 19: rotate(120.0, &x, &y);
- *px = x + 4.5; *py = y + 2.0 / sqrt(3.0); break;
- case 20: rotate(300.0, &x, &y);
- *px = x + 5.0; *py = y + 5.0 / (2.0 * sqrt(3.0)); break;
-
- } /* end switch statement */
-
-} /* end of dymax_point */
-
-
-static void rotate(double angle, double *x, double *y)
-{
- /* Rotate the point to correct orientation in XY-plane. */
-
- double ha, hx, hy ;
-
- ha = radians(angle);
- hx = *x;
- hy = *y;
- *x = hx * cos(ha) - hy * sin(ha);
- *y = hx * sin(ha) + hy * cos(ha);
-
-} /* end rotate procedure */
-
-
-static void r2(int axis, double alpha, double *x, double *y, double *z)
-{
- /* Rotate a 3-D point about the specified axis. */
-
- double a, b, c;
-
- a = *x;
- b = *y;
- c = *z;
- if (axis == 1)
- {
- *y = b * cos(alpha) + c * sin(alpha);
- *z = c * cos(alpha) - b * sin(alpha);
- }
-
- if (axis == 2)
- {
- *x = a * cos(alpha) - c * sin(alpha);
- *z = a * sin(alpha) + c * cos(alpha);
- }
-
- if (axis == 3)
- {
- *x = a * cos(alpha) + b * sin(alpha);
- *y = b * cos(alpha) - a * sin(alpha);
- }
-
-} /* end of r2 */
-
diff --git a/hacks/glx/dymaxionmap-coords.h b/hacks/glx/dymaxionmap-coords.h
deleted file mode 100644
index fad4a04..0000000
--- a/hacks/glx/dymaxionmap-coords.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __DYMAXIONMAP_COORDS_H__
-#define __DYMAXIONMAP_COORDS_H__
-
-void dymaxion_convert (double lng, double lat, double *x, double *y);
-
-#endif /* __DYMAXIONMAP_COORDS_H__ */
diff --git a/hacks/glx/dymaxionmap.c b/hacks/glx/dymaxionmap.c
deleted file mode 100644
index 1527daa..0000000
--- a/hacks/glx/dymaxionmap.c
+++ /dev/null
@@ -1,1652 +0,0 @@
-/* dymaxionmap --- Buckminster Fuller's unwrapped icosahedral globe.
- * Copyright (c) 2016-2018 Jamie Zawinski.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- */
-
-#define LABEL_FONT "sans-serif bold 24"
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*labelFont: " LABEL_FONT "\n"
-# define release_planet 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL /* whole file */
-
-#include "sphere.h"
-#include "normals.h"
-#include "texfont.h"
-#include "dymaxionmap-coords.h"
-
-#define DEF_ROTATE "True"
-#define DEF_ROLL "True"
-#define DEF_WANDER "True"
-#define DEF_TEXTURE "True"
-#define DEF_STARS "True"
-#define DEF_GRID "True"
-#define DEF_SPEED "1.0"
-#define DEF_IMAGE "BUILTIN_FLAT"
-#define DEF_IMAGE2 "NONE"
-#define DEF_FRAMES "720"
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static int do_roll;
-static int do_wander;
-static int do_texture;
-static int do_stars;
-static int do_grid;
-static int frames;
-static GLfloat speed;
-static char *which_image;
-static char *which_image2;
-
-static XrmOptionDescRec opts[] = {
- {"-speed", ".speed", XrmoptionSepArg, 0 },
- {"-roll", ".roll", XrmoptionNoArg, "true" },
- {"+roll", ".roll", XrmoptionNoArg, "false" },
- {"-wander", ".wander", XrmoptionNoArg, "true" },
- {"+wander", ".wander", XrmoptionNoArg, "false" },
- {"-texture", ".texture", XrmoptionNoArg, "true" },
- {"+texture", ".texture", XrmoptionNoArg, "false" },
- {"-stars", ".stars", XrmoptionNoArg, "true" },
- {"+stars", ".stars", XrmoptionNoArg, "false" },
- {"-grid", ".grid", XrmoptionNoArg, "true" },
- {"+grid", ".grid", XrmoptionNoArg, "false" },
- {"-flat", ".image", XrmoptionNoArg, "BUILTIN_FLAT" },
- {"-satellite",".image", XrmoptionNoArg, "BUILTIN_SAT" },
- {"-image", ".image", XrmoptionSepArg, 0 },
- {"-image2", ".image2", XrmoptionSepArg, 0 },
- {"-frames", ".frames", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_stars, "stars", "Stars", DEF_STARS, t_Bool},
- {&do_grid, "grid", "Grid", DEF_GRID, t_Bool},
- {&which_image, "image", "Image", DEF_IMAGE, t_String},
- {&which_image2,"image2", "Image2", DEF_IMAGE2, t_String},
- {&frames, "frames", "Frames", DEF_FRAMES, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct planet_description =
-{"planet", "init_planet", "draw_planet", NULL,
- "draw_planet", "init_planet", "free_planet", &planet_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Buckminster Fuller's unwrapped icosahedral globe", 0, NULL};
-#endif
-
-# ifdef __GNUC__
- __extension__ /* don't warn about "string length is greater than the length
- ISO C89 compilers are required to support" when including
- the following XPM file... */
-# endif
-
-#include "images/gen/earth_flat_png.h"
-#include "images/gen/earth_png.h"
-#include "images/gen/earth_night_png.h"
-#include "images/gen/ground_png.h"
-
-#include "ximage-loader.h"
-#include "rotator.h"
-#include "gltrackball.h"
-
-
-typedef struct {
- GLXContext *glx_context;
- GLuint starlist;
- int starcount;
- rotator *rot, *rot2;
- trackball_state *trackball;
- Bool button_down_p;
- enum { STARTUP, FLAT, FOLD,
- ICO, STEL_IN, AXIS, SPIN, STEL, STEL_OUT,
- ICO2, UNFOLD } state;
- GLfloat ratio;
- GLuint tex1, tex2;
- texture_font_data *font_data;
- int loading_sw, loading_sh;
-
- XImage *day, *night, *dusk, *cvt;
- XImage **images; /* One image for each frame of time-of-day. */
- int nimages;
-
- double current_frame;
- Bool cache_p;
- long delay;
-
-} planetstruct;
-
-
-static planetstruct *planets = NULL;
-
-
-static double
-double_time (void)
-{
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- return (now.tv_sec + ((double) now.tv_usec * 0.000001));
-}
-
-
-/* Draw faint latitude and longitude lines into the RGBA XImage.
- */
-static void
-add_grid_lines (XImage *image)
-{
- int i;
- int off = 24;
- for (i = 0; i < 24; i++)
- {
- int x = (i + 0.5) * image->width / (double) 24;
- int y;
- for (y = 0; y < image->height; y++)
- {
- unsigned long rgba = XGetPixel (image, x, y);
- int r = (rgba >> 24) & 0xFF;
- int g = (rgba >> 16) & 0xFF;
- int b = (rgba >> 8) & 0xFF;
- int a = (rgba >> 0) & 0xFF;
- int off2 = (((r + g + b) / 3) < 0x7F ? off : -off);
- r = MAX (0, MIN (0xFF, r + off2));
- g = MAX (0, MIN (0xFF, g + off2));
- b = MAX (0, MIN (0xFF, b + off2));
- XPutPixel (image, x, y, (r << 24) | (g << 16) | (b << 8) | a);
- }
- }
-
- for (i = 1; i < 11; i++)
- {
- int y = i * image->height / (double) 12;
- int x;
- for (x = 0; x < image->width; x++)
- {
- unsigned long rgba = XGetPixel (image, x, y);
- int r = (rgba >> 24) & 0xFF;
- int g = (rgba >> 16) & 0xFF;
- int b = (rgba >> 8) & 0xFF;
- int a = (rgba >> 0) & 0xFF;
- int off2 = (((r + g + b) / 3) < 0x7F ? off : -off);
- r = MAX (0, MIN (0xFF, r + off2));
- g = MAX (0, MIN (0xFF, g + off2));
- b = MAX (0, MIN (0xFF, b + off2));
- XPutPixel (image, x, y, (r << 24) | (g << 16) | (b << 8) | a);
- }
- }
-}
-
-
-static void
-adjust_brightness (XImage *image, double amount)
-{
- uint32_t *in = (uint32_t *) image->data;
- int i;
- int end = image->height * image->bytes_per_line / 4;
- for (i = 0; i < end; i++)
- {
- uint32_t p = *in;
- /* #### Why is this ABGR instead of RGBA? */
- uint32_t a = (p >> 24) & 0xFF;
- uint32_t g = (p >> 16) & 0xFF;
- uint32_t b = (p >> 8) & 0xFF;
- uint32_t r = (p >> 0) & 0xFF;
- r = MAX(0, MIN(0xFF, (long) (r * amount)));
- g = MAX(0, MIN(0xFF, (long) (g * amount)));
- b = MAX(0, MIN(0xFF, (long) (b * amount)));
- p = (a << 24) | (g << 16) | (b << 8) | r;
- *in++ = p;
- }
-}
-
-
-static GLfloat
-vector_angle (XYZ a, XYZ b)
-{
- double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
- double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
- double cc, angle;
-
- if (La == 0 || Lb == 0) return 0;
- if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
-
- /* dot product of two vectors is defined as:
- La * Lb * cos(angle between vectors)
- and is also defined as:
- ax*bx + ay*by + az*bz
- so:
- La * Lb * cos(angle) = ax*bx + ay*by + az*bz
- cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
- angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
- */
- cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
- if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
- angle = acos (cc);
-
- return (angle);
-}
-
-
-/* Creates a grayscale image encoding the day/night terminator for a random
- axial tilt.
- */
-static XImage *
-create_daylight_mask (Display *dpy, Visual *v, int w, int h)
-{
- XImage *image = XCreateImage (dpy, v, 8, ZPixmap, 0, 0, w, h, 8, 0);
- int x, y;
-# undef sun /* Doh */
- XYZ sun;
- double axial_tilt = frand(23.4) / (180/M_PI) * RANDSIGN();
- double dusk = M_PI * 0.035;
- sun.x = 0;
- sun.y = cos (axial_tilt);
- sun.z = sin (axial_tilt);
-
- image->data = (char *) malloc (image->height * image->bytes_per_line);
-
- for (y = 0; y < image->height; y++)
- {
- double lat = -M_PI_2 + (M_PI * (y / (double) image->height));
- double cosL = cos(lat);
- double sinL = sin(lat);
- for (x = 0; x < image->width; x++)
- {
- double lon = -M_PI_2 + (M_PI * 2 * (x / (double) image->width));
- XYZ v;
- double a;
- unsigned long p;
- v.x = cos(lon) * cosL;
- v.y = sin(lon) * cosL;
- v.z = sinL;
- a = vector_angle (sun, v);
- a -= M_PI_2;
- a = (a < -dusk ? 1 : a >= dusk ? 0 : (dusk - a) / (dusk * 2));
- p = 0xFF & (unsigned long) (a * 0xFF);
- XPutPixel (image, x, y, p);
- }
- }
- return image;
-}
-
-
-static void
-load_images (ModeInfo *mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- int i;
-
- if (which_image && !strcmp (which_image, "BUILTIN_FLAT"))
- {
- which_image = strdup("BUILTIN_FLAT");
- which_image2 = strdup("BUILTIN_FLAT");
- }
- else if (which_image && !strcmp (which_image, "BUILTIN_SAT"))
- {
- which_image = strdup("BUILTIN_DAY");
- which_image2 = strdup("BUILTIN_NIGHT");
- }
-
- if (!which_image) which_image = strdup("");
- if (!which_image2) which_image2 = strdup("");
-
- for (i = 0; i < 2; i++)
- {
- char *s = (i == 0 ? which_image : which_image2);
- XImage *image;
- if (!strcmp (s, "BUILTIN_DAY"))
- image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
- earth_png, sizeof(earth_png));
- else if (!strcmp (s, "BUILTIN_NIGHT"))
- image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
- earth_night_png,sizeof(earth_night_png));
- else if (!strcmp (s, "BUILTIN") ||
- !strcmp (s, "BUILTIN_FLAT") ||
- (i == 0 && !strcmp (s, "")))
- image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
- earth_flat_png, sizeof(earth_flat_png));
- else if (!strcmp (s, "NONE"))
- image = 0;
- else if (*s)
- image = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi), s);
- else
- image = 0;
-
- /* if (image) fprintf (stderr, "%s: %d: loaded %s\n", progname, i, s); */
-
- if (i == 0)
- gp->day = image;
- else
- gp->night = image;
- }
-
- if (gp->night && !gp->day)
- gp->day = gp->night, gp->night = 0;
-
- gp->nimages = frames;
- gp->current_frame = random() % gp->nimages;
-
- if (gp->nimages < 1)
- gp->nimages = 1;
-
- if (gp->nimages < 2 && gp->night)
- {
- XDestroyImage (gp->night);
- gp->night = 0;
- gp->nimages = 1;
- }
-
- if (! gp->night)
- gp->nimages = 1;
-
- if (do_grid)
- {
- if (gp->day) add_grid_lines (gp->day);
- if (gp->night) add_grid_lines (gp->night);
- }
-
- if (gp->day && gp->night && !gp->dusk)
- {
- if (gp->day->width != gp->night->width ||
- gp->day->height != gp->night->height)
- {
- fprintf (stderr, "%s: day and night images must be the same size"
- " (%dx%d vs %dx%d)\n", progname,
- gp->day->width, gp->day->height,
- gp->night->width, gp->night->height);
- exit (1);
- }
- gp->dusk = create_daylight_mask (MI_DISPLAY (mi), MI_VISUAL (mi),
- gp->day->width, gp->day->height);
- }
-
- /* Make the day image brighter, because that's easier than doing it
- with GL lights. */
- adjust_brightness (gp->day, 1.4);
-
- if (!strcmp (which_image, which_image2))
- /* If day and night are the same image, make night way darker. */
- adjust_brightness (gp->night, 0.2);
- else if (gp->night)
- /* Otherwise make it just a little darker. */
- adjust_brightness (gp->night, 0.7);
-
-
- gp->images = (XImage **) calloc (gp->nimages, sizeof(*gp->images));
-
- /* Create 'cvt', a map that projects each pixel from Equirectangular to
- Dymaxion. It is 2x the width/height of the source images. We iterate
- by half pixel to make sure we hit every pixel in 'out'. It would be
- cleaner to iterate over 'out' instead of over 'in' but
- dymaxionmap-coords.c only goes forward. This is... not super fast.
- */
- {
- double W = 5.5;
- double H = 3 * sqrt(3)/2;
- int x2, y2;
- int w = gp->day->width;
- int h = gp->day->height;
- uint32_t *out;
-
- gp->cvt = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi), 32, ZPixmap, 0, 0,
- gp->day->width*2, gp->day->height*2, 32, 0);
- gp->cvt->data = (char *)
- malloc (gp->cvt->height * gp->cvt->bytes_per_line);
- out = (uint32_t *) gp->cvt->data;
-
- for (y2 = 0; y2 < h*2; y2++)
- {
- double y = (double) y2/2;
- double lat = -90 + (180 * (y / (double) h));
- for (x2 = 0; x2 < w*2; x2++)
- {
- double x = (double) x2/2;
- double lon = -180 + (360 * x / w);
- double ox, oy;
- dymaxion_convert (lon, lat, &ox, &oy);
- ox = w - (w * ox / W);
- oy = (h * oy / H);
-
- *out++ = (((((uint32_t) ox) & 0xFFFF) << 16) |
- ((((uint32_t) oy) & 0xFFFF)));
- }
- }
- }
-
- /* A 128 GB iPhone 6s dies at around 540 frames, ~1 GB of XImages.
- A 16 GB iPad Air 2 dies at around 320 frames, ~640 MB.
- Caching on mobile doesn't matter much: we can just run at 100% CPU.
-
- On some systems it would be more efficient to cache the images inside
- a texture on the GPU instead of moving it from RAM to GPU every few
- frames; but on other systems, we'd just run out of GPU memory instead. */
- {
- unsigned long cache_size = (gp->day->width * gp->day->height * 4 *
- gp->nimages);
-# ifdef HAVE_MOBILE
- unsigned long max = 320 * 1024 * 1024L; /* 320 MB */
-# else
- /*unsigned long max = 2 * 1024 * 1024 * 1024L;*/ /* 2 GB */
- unsigned long max = 0x80000000L; /* 2 GB */
-# endif
- gp->cache_p = (cache_size < max);
- }
-}
-
-
-static void
-cache_current_frame (ModeInfo *mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- XImage *blended, *dymaxion;
- int i, x, y, w, h, end, xoff;
- uint32_t *day, *night, *cvt, *out;
- uint8_t *dusk;
-
- if (gp->images[(int) gp->current_frame])
- return;
-
- xoff = (gp->dusk
- ? gp->dusk->width * ((double) gp->current_frame / gp->nimages)
- : 0);
-
- w = gp->day->width;
- h = gp->day->height;
-
- if (!gp->night)
- blended = gp->day;
- else
- {
- /* Blend the foreground and background images through the dusk map.
- */
- blended = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
- gp->day->depth, ZPixmap, 0, 0, w, h, 32, 0);
- if (!blended) abort();
- blended->data = (char *) malloc (h * blended->bytes_per_line);
- if (!blended->data) abort();
-
- end = blended->height * blended->bytes_per_line / 4;
- day = (uint32_t *) gp->day->data;
- night = (uint32_t *) gp->night->data;
- dusk = (uint8_t *) gp->dusk->data;
- out = (uint32_t *) blended->data;
-
- for (i = 0; i < end; i++)
- {
- uint32_t d = *day++;
- uint32_t n = *night++;
- uint32_t x = i % w;
- uint32_t y = i / w;
- double r = dusk[y * w + ((x + xoff) % w)] / 256.0;
- double r2 = 1-r;
-# define ADD(M) (((unsigned long) \
- ((((d >> M) & 0xFF) * r) + \
- (((n >> M) & 0xFF) * r2))) \
- << M)
- /* #### Why is this ABGR instead of RGBA? */
- *out++ = (0xFF << 24) | ADD(16) | ADD(8) | ADD(0);
-# undef ADD
- }
- }
-
- /* Convert blended Equirectangular to Dymaxion through the 'cvt' map.
- */
- dymaxion = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
- gp->day->depth, ZPixmap, 0, 0, w, h, 32, 0);
- dymaxion->data = (char *) calloc (h, dymaxion->bytes_per_line);
-
- day = (uint32_t *) blended->data;
- out = (uint32_t *) dymaxion->data;
- cvt = (uint32_t *) gp->cvt->data;
-
- for (y = 0; y < h*2; y++)
- for (x = 0; x < w*2; x++)
- {
- unsigned long m = *cvt++;
- unsigned long dx = (m >> 16) & 0xFFFF;
- unsigned long dy = m & 0xFFFF;
- unsigned long p = day[(y>>1) * w + (x>>1)];
- unsigned long p2 = out[dy * w + dx];
- if (p2 & 0xFF000000)
- /* RGBA nonzero alpha: initialized. Average with existing,
- otherwise the grid lines look terrible. */
- p = (((((p>>24) & 0xFF) + ((p2>>24) & 0xFF)) >> 1) << 24 |
- ((((p>>16) & 0xFF) + ((p2>>16) & 0xFF)) >> 1) << 16 |
- ((((p>> 8) & 0xFF) + ((p2>> 8) & 0xFF)) >> 1) << 8 |
- ((((p>> 0) & 0xFF) + ((p2>> 0) & 0xFF)) >> 1) << 0);
- out[dy * w + dx] = p;
- }
-
- /* Fill in the triangles that are not a part of The World with the
- color of the ocean to avoid texture-tearing on the folded edges.
- */
- out = (uint32_t *) dymaxion->data;
- end = dymaxion->height * dymaxion->bytes_per_line / 4;
- {
- double lat = -48.44, lon = -123.39; /* R'Lyeh */
- int x = (lon + 180) * blended->width / 360.0;
- int y = (lat + 90) * blended->height / 180.0;
- unsigned long ocean = XGetPixel (gp->day, x, y);
- for (i = 0; i < end; i++)
- {
- uint32_t p = *out;
- if (! (p & 0xFF000000)) /* AGBR */
- *out = ocean;
- out++;
- }
- }
-
- if (blended != gp->day)
- XDestroyImage (blended);
-
- gp->images[(int) gp->current_frame] = dymaxion;
-
- if (!gp->cache_p) /* Keep only one image around; recompute every time. */
- {
- i = ((int) gp->current_frame) - 1;
- if (i < 0) i = gp->nimages - 1;
- if (gp->images[i])
- {
- XDestroyImage (gp->images[i]);
- gp->images[i] = 0;
- }
- }
-}
-
-
-static void
-setup_texture (ModeInfo * mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- XImage *ground;
-
- glGenTextures (1, &gp->tex1);
- glBindTexture (GL_TEXTURE_2D, gp->tex1);
-
- /* Must be after glBindTexture */
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- load_images (mi);
-
- glGenTextures (1, &gp->tex2);
- glBindTexture (GL_TEXTURE_2D, gp->tex2);
-
- /* Must be after glBindTexture */
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- /* The underground image can go on flat, without the dymaxion transform. */
- ground = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
- ground_png, sizeof(ground_png));
- clear_gl_error();
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- /* glPixelStorei(GL_UNPACK_ROW_LENGTH, ground->width); */
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- ground->width, ground->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, ground->data);
- check_gl_error ("ground texture");
- XDestroyImage (ground);
-}
-
-
-static void
-init_stars (ModeInfo *mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- int i, j;
- int width = MI_WIDTH(mi);
- int height = MI_HEIGHT(mi);
- int size = (width > height ? width : height);
- int nstars = size * size / 80;
- int max_size = 3;
- GLfloat inc = 0.5;
- int steps = max_size / inc;
- GLfloat scale = 1;
-
- if (MI_WIDTH(mi) > 2560) { /* Retina displays */
- scale *= 2;
- nstars /= 2;
- }
-
- gp->starlist = glGenLists(1);
- glNewList(gp->starlist, GL_COMPILE);
- for (j = 1; j <= steps; j++)
- {
- glPointSize(inc * j * scale);
- glBegin (GL_POINTS);
- for (i = 0; i < nstars / steps; i++)
- {
- GLfloat d = 0.1;
- GLfloat r = 0.15 + frand(0.3);
- GLfloat g = r + frand(d) - d;
- GLfloat b = r + frand(d) - d;
-
- GLfloat x = frand(1)-0.5;
- GLfloat y = frand(1)-0.5;
- GLfloat z = ((random() & 1)
- ? frand(1)-0.5
- : (BELLRAND(1)-0.5)/12); /* milky way */
- d = sqrt (x*x + y*y + z*z);
- x /= d;
- y /= d;
- z /= d;
- glColor3f (r, g, b);
- glVertex3f (x, y, z);
- gp->starcount++;
- }
- glEnd ();
- }
- glEndList ();
-
- check_gl_error("stars initialization");
-}
-
-
-ENTRYPOINT void
-reshape_planet (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- glViewport(0, 0, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -40);
-
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (h, h, h);
- }
-# endif
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-static void
-do_normal2 (ModeInfo *mi, Bool frontp, XYZ a, XYZ b, XYZ c)
-{
- XYZ n = (frontp
- ? calc_normal (a, b, c)
- : calc_normal (b, a, c));
- glNormal3f (n.x, n.y, n.z);
-
-# if 0
- if (frontp && MI_IS_WIREFRAME(mi))
- {
- glBegin (GL_LINES);
- glVertex3f ((a.x + b.x + c.x) / 3,
- (a.y + b.y + c.y) / 3,
- (a.z + b.z + c.z) / 3);
- glVertex3f ((a.x + b.x + c.x) / 3 + n.x,
- (a.y + b.y + c.y) / 3 + n.y,
- (a.z + b.z + c.z) / 3 + n.z);
- glEnd();
- }
-# endif
-}
-
-
-static void
-triangle0 (ModeInfo *mi, Bool frontp, GLfloat stel_ratio, int facemask,
- XYZ *corners_ret)
-{
- /* Render a triangle as six sub-triangles.
- Facemask bits 0-5 indicate which sub-triangle to draw.
-
- A
- / \
- / | \
- / | \
- / 0 | 1 \
- E /_ | _\ F
- / \_ | _/ \
- / 5 \D/ 2 \
- / / | \ \
- / / 4 | 3 \ \
- / / | \ \
- B ----------------------- C
- G
- */
-
- Bool wire = MI_IS_WIREFRAME(mi);
- GLfloat h = sqrt(3) / 2;
- GLfloat h2 = sqrt(h*h - (h/2)*(h/2)) - 0.5;
- XYZ A, B, C, D, E, F, G;
- XYZ tA, tB, tC, tD, tE, tF, tG;
- XYZ a, b, c;
- XYZ ta, tb, tc;
- A.x = 0; A.y = h; A.z = 0;
- B.x = -0.5, B.y = 0; B.z = 0;
- C.x = 0.5, C.y = 0; C.z = 0;
- D.x = 0; D.y = h/3; D.z = 0;
- E.x = -h2; E.y = h/2; E.z = 0;
- F.x = h2; F.y = h/2; F.z = 0;
- G.x = 0; G.y = 0; G.z = 0;
-
- /* When tweaking object XY to stellate, don't change texture coordinates. */
- tA = A; tB = B; tC = C; tD = D; tE = E; tF = F; tG = G;
-
- /* Eyeballed this to find the depth of stellation that seems to most
- approximate a sphere.
- */
- D.z = 0.193 * stel_ratio;
-
- /* We want to raise E, F and G as well but we can't just shift Z:
- we need to keep them on the same vector from the center of the sphere,
- which means also changing F and G's X and Y.
- */
- E.z = F.z = G.z = 0.132 * stel_ratio;
- {
- double magic_x = 0.044;
- double magic_y = 0.028;
- /* G.x stays 0 */
- G.y -= sqrt (magic_x*magic_x + magic_y*magic_y) * stel_ratio;
- E.x -= magic_x * stel_ratio;
- E.y += magic_y * stel_ratio;
- F.x += magic_x * stel_ratio;
- F.y += magic_y * stel_ratio;
- }
-
-
- if (facemask & 1<<0)
- {
- a = E; b = D; c = A;
- ta = tE; tb = tD; tc = tA;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
- if (facemask & 1<<1)
- {
- a = D; b = F; c = A;
- ta = tD; tb = tF; tc = tA;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
- if (facemask & 1<<2)
- {
- a = D; b = C; c = F;
- ta = tD; tb = tC; tc = tF;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
- if (facemask & 1<<3)
- {
- a = G; b = C; c = D;
- ta = tG; tb = tC; tc = tD;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
- if (facemask & 1<<4)
- {
- a = B; b = G; c = D;
- ta = tB; tb = tG; tc = tD;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
- if (facemask & 1<<5)
- {
- a = B; b = D; c = E;
- ta = tB; tb = tD; tc = tE;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
- if (facemask & 1<<6)
- {
- a = E; b = D; c = A;
- ta = tE; tb = tD; tc = tA;
- do_normal2 (mi, frontp, a, b, c);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
- glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
- glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
- glEnd();
- mi->polygon_count++;
- }
-
- if (corners_ret)
- {
- corners_ret[0] = A;
- corners_ret[1] = B;
- corners_ret[2] = C;
- corners_ret[3] = D;
- corners_ret[4] = E;
- corners_ret[5] = F;
- corners_ret[6] = G;
- }
-}
-
-
-/* The segments, numbered arbitrarily from the top left:
- ________ _ ________
- \ /\ /\ \ |\ /
- \ 0 / \ / \3> | \ 5 /
- \ / 1 \ / 2 \| ..|4 \ /-6-..
- ___________\/______\/______\/______\/______\
- | /\ /\ /\ /\ /\
- |7 / \ 9 / \ 11 / \ 13 / \ 15 / \
- | / 8 \ / 10 \ / 12 \ / 14 \ / 16 \
- |/______\/______\/______\/______\/______\
- \ /\ / /\ /\
- \ 17 / \ 18 / / \ 20 / \
- \ / \ / / 19 \ / 21 \
- \/ \/ /______\/______\
-
- Each triangle can be connected to at most two other triangles.
- We start from the middle, #12, and work our way to the edges.
- Its centroid is 0,0.
-
- (Note that dymaxionmap-coords.c uses a different numbering system.)
- */
-static void
-triangle (ModeInfo *mi, int which, Bool frontp,
- GLfloat fold_ratio, GLfloat stel_ratio)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- const GLfloat fg[] = { 1, 1, 1, 1 };
- const GLfloat bg[] = { 0.3, 0.3, 0.3, 1 };
- int a = -1, b = -1;
- GLfloat max = acos (sqrt(5)/3);
- GLfloat rot = -max * fold_ratio / (M_PI/180);
- Bool wire = MI_IS_WIREFRAME(mi);
- XYZ corners[7];
-
- glColor3fv (fg);
- if (!wire)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fg);
-
- switch (which) {
- case 3: /* One third of the face. */
- triangle0 (mi, frontp, stel_ratio, 1<<3 | 1<<4, corners);
- break;
- case 4: /* Two thirds of the face: convex. */
- triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3 | 1<<4, corners);
- break;
- case 6: /* One half of the face. */
- triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3, corners);
- break;
- case 7: /* One half of the face. */
- triangle0 (mi, frontp, stel_ratio, 1<<2 | 1<<3 | 1<<4, corners);
- break;
- default: /* Full face. */
- triangle0 (mi, frontp, stel_ratio, 0x3F, corners);
- break;
- }
-
- if (wire)
- {
- char tag[20];
- glColor3fv (bg);
- sprintf (tag, "%d", which);
- glPushMatrix();
- glTranslatef (-0.1, 0.2, 0);
- glScalef (0.005, 0.005, 0.005);
- print_texture_string (gp->font_data, tag);
- glPopMatrix();
- mi->polygon_count++;
- }
-
-
- /* The connection hierarchy of the faces starting at the middle, #12. */
- switch (which) {
- case 0: break;
- case 1: a = 0; b = -1; break;
- case 2: a = -1; b = 3; break;
- case 3: break;
- case 4: a = -1; b = 5; break;
- case 5: a = -1; b = 6; break;
- case 7: break;
- case 6: break;
- case 8: a = 17; b = 7; break;
- case 9: a = 8; b = -1; break;
- case 10: a = 18; b = 9; break;
- case 11: a = 10; b = 1; break;
- case 12: a = 11; b = 13; break;
- case 13: a = 2; b = 14; break;
- case 14: a = 15; b = 20; break;
- case 15: a = 4; b = 16; break;
- case 16: break;
- case 17: break;
- case 18: break;
- case 19: break;
- case 20: a = 21; b = 19; break;
- case 21: break;
- default: abort(); break;
- }
-
- if (a != -1)
- {
- glPushMatrix();
- glTranslatef (-0.5, 0, 0); /* Move model matrix to upper left */
- glRotatef (60, 0, 0, 1);
- glTranslatef ( 0.5, 0, 0);
-
- glMatrixMode(GL_TEXTURE);
- /* glPushMatrix(); */
- glTranslatef (-0.5, 0, 0); /* Move texture matrix the same way */
- glRotatef (60, 0, 0, 1);
- glTranslatef ( 0.5, 0, 0);
-
- glMatrixMode(GL_MODELVIEW);
-
- glRotatef (rot, 1, 0, 0);
- triangle (mi, a, frontp, fold_ratio, stel_ratio);
-
- /* This should just be a PopMatrix on the TEXTURE stack, but
- fucking iOS has GL_MAX_TEXTURE_STACK_DEPTH == 4! WTF!
- So we have to undo our rotations and translations manually.
- */
- glMatrixMode(GL_TEXTURE);
- /* glPopMatrix(); */
- glTranslatef (-0.5, 0, 0);
- glRotatef (-60, 0, 0, 1);
- glTranslatef (0.5, 0, 0);
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- }
-
- if (b != -1)
- {
- glPushMatrix();
- glTranslatef (0.5, 0, 0); /* Move model matrix to upper right */
- glRotatef (-60, 0, 0, 1);
- glTranslatef (-0.5, 0, 0);
-
- glMatrixMode(GL_TEXTURE);
- /* glPushMatrix(); */
- glTranslatef (0.5, 0, 0); /* Move texture matrix the same way */
- glRotatef (-60, 0, 0, 1);
- glTranslatef (-0.5, 0, 0);
-
- glMatrixMode(GL_MODELVIEW);
-
- glRotatef (rot, 1, 0, 0);
- triangle (mi, b, frontp, fold_ratio, stel_ratio);
-
- /* See above. Grr. */
- glMatrixMode(GL_TEXTURE);
- /* glPopMatrix(); */
- glTranslatef (0.5, 0, 0);
- glRotatef (60, 0, 0, 1);
- glTranslatef (-0.5, 0, 0);
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- }
-
-
- /* Draw a border around the edge of the world.
- */
- if (!wire && frontp && stel_ratio == 0 && fold_ratio < 0.95)
- {
- int edges = 0;
- GLfloat c[] = { 0, 0.2, 0.5, 1 };
- c[3] = 1-fold_ratio;
-
- switch (which)
- {
- case 0: edges = 1<<0 | 1<<2; break;
- case 1: edges = 1<<2; break;
- case 2: edges = 1<<0; break;
- case 3: edges = 1<<3 | 1<<4; break;
- case 4: edges = 1<<3 | 1<<5; break;
- case 5: edges = 1<<0 | 1<<6; break;
- case 6: edges = 1<<2 | 1<<7; break;
- case 16: edges = 1<<0 | 1<<2; break;
- case 21: edges = 1<<0 | 1<<2; break;
- case 19: edges = 1<<0 | 1<<2; break;
- case 12: edges = 1<<1; break;
- case 18: edges = 1<<0 | 1<<2; break;
- case 17: edges = 1<<0 | 1<<2; break;
- case 7: edges = 1<<8 | 1<<9; break;
- case 9: edges = 1<<2; break;
- default: break;
- }
-
- glDisable (GL_TEXTURE_2D);
- glDisable (GL_LIGHTING);
- glLineWidth (2);
- glColor4fv (c);
- glBegin (GL_LINES);
- if (edges & 1<<0)
- {
- glVertex3f (corners[0].x, corners[0].y, corners[0].z);
- glVertex3f (corners[1].x, corners[1].y, corners[1].z);
- }
- if (edges & 1<<1)
- {
- glVertex3f (corners[1].x, corners[1].y, corners[1].z);
- glVertex3f (corners[2].x, corners[2].y, corners[2].z);
- }
- if (edges & 1<<2)
- {
- glVertex3f (corners[2].x, corners[2].y, corners[2].z);
- glVertex3f (corners[0].x, corners[0].y, corners[0].z);
- }
- if (edges & 1<<3)
- {
- glVertex3f (corners[1].x, corners[1].y, corners[1].z);
- glVertex3f (corners[3].x, corners[3].y, corners[3].z);
- }
- if (edges & 1<<4)
- {
- glVertex3f (corners[3].x, corners[3].y, corners[3].z);
- glVertex3f (corners[2].x, corners[2].y, corners[2].z);
- }
- if (edges & 1<<5)
- {
- glVertex3f (corners[3].x, corners[3].y, corners[3].z);
- glVertex3f (corners[0].x, corners[0].y, corners[0].z);
- }
- if (edges & 1<<6)
- {
- glVertex3f (corners[0].x, corners[0].y, corners[0].z);
- glVertex3f (corners[5].x, corners[5].y, corners[5].z);
- }
- if (edges & 1<<7)
- {
- glVertex3f (corners[0].x, corners[0].y, corners[0].z);
- glVertex3f (corners[6].x, corners[6].y, corners[6].z);
- }
- if (edges & 1<<8)
- {
- glVertex3f (corners[1].x, corners[1].y, corners[1].z);
- glVertex3f (corners[5].x, corners[5].y, corners[5].z);
- }
- if (edges & 1<<9)
- {
- glVertex3f (corners[5].x, corners[5].y, corners[5].z);
- glVertex3f (corners[2].x, corners[2].y, corners[2].z);
- }
- glEnd();
- glEnable (GL_TEXTURE_2D);
- glEnable (GL_LIGHTING);
- }
-}
-
-
-static void
-draw_triangles (ModeInfo *mi, GLfloat fold_ratio, GLfloat stel_ratio)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- Bool wire = MI_IS_WIREFRAME(mi);
- GLfloat h = sqrt(3) / 2;
- GLfloat c = h / 3;
-
- glTranslatef (0, -h/3, 0); /* Center on face 12 */
-
- /* When closed, center on midpoint of icosahedron. Eyeballed this. */
- glTranslatef (0, 0, fold_ratio * 0.754);
-
- glFrontFace (GL_CCW);
-
- /* Adjust the texture matrix so that it has the same coordinate space
- as the model. */
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- {
- GLfloat texw = 5.5;
- GLfloat texh = 3 * h;
- GLfloat midx = 2.5;
- GLfloat midy = 3 * c;
- glScalef (1/texw, -1/texh, 1);
- glTranslatef (midx, midy, 0);
- }
- glMatrixMode(GL_MODELVIEW);
-
-
-
- /* Front faces */
-
- if (wire)
- glDisable (GL_TEXTURE_2D);
- else if (do_texture)
- {
- glEnable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, gp->tex1);
- }
- else
- glDisable (GL_TEXTURE_2D);
-
- triangle (mi, 12, True, fold_ratio, stel_ratio);
-
- /* Back faces */
-
- if (wire)
- glDisable (GL_TEXTURE_2D);
- else if (do_texture)
- {
- glEnable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, gp->tex2);
- }
- else
- glDisable (GL_TEXTURE_2D);
-
- glFrontFace (GL_CW);
-
- triangle (mi, 12, False, fold_ratio, 0);
-
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
-}
-
-
-static void
-align_axis (ModeInfo *mi, int undo)
-{
- /* Rotate so that an axis is lined up with the north and south poles
- on the map, which are not in the center of their faces, or any
- other easily computable spot. */
-
- GLfloat r1 = 20.5;
- GLfloat r2 = 28.5;
-
- if (undo)
- {
- glRotatef (-r2, 0, 1, 0);
- glRotatef ( r2, 1, 0, 0);
- glRotatef (-r1, 1, 0, 0);
- }
- else
- {
- glRotatef (r1, 1, 0, 0);
- glRotatef (-r2, 1, 0, 0);
- glRotatef ( r2, 0, 1, 0);
- }
-}
-
-
-static void
-draw_axis (ModeInfo *mi)
-{
- GLfloat s;
- glDisable (GL_TEXTURE_2D);
- glDisable (GL_LIGHTING);
- glPushMatrix();
-
- align_axis (mi, 0);
- glTranslatef (0.34, 0.39, -0.61);
-
- s = 0.96;
- glScalef (s, s, s); /* tighten up the enclosing sphere */
-
- glLineWidth (1);
- glColor3f (0.5, 0.5, 0);
-
- glRotatef (90, 1, 0, 0); /* unit_sphere is off by 90 */
- glRotatef (9.5, 0, 1, 0); /* line up the time zones */
- glFrontFace (GL_CCW);
- unit_sphere (12, 24, True);
- glBegin(GL_LINES);
- glVertex3f(0, -2, 0);
- glVertex3f(0, 2, 0);
- glEnd();
-
- glPopMatrix();
-}
-
-
-
-
-ENTRYPOINT Bool
-planet_handle_event (ModeInfo *mi, XEvent *event)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, gp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &gp->button_down_p))
- return True;
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
- {
- int i;
- double cf = gp->current_frame;
-
- /* Switch between the satellite and flat map, preserving position. */
- if (gp->day) XDestroyImage (gp->day);
- if (gp->night) XDestroyImage (gp->night);
- if (gp->cvt) XDestroyImage (gp->cvt);
- gp->day = 0;
- gp->night = 0;
- gp->cvt = 0;
-
- for (i = 0; i < gp->nimages; i++)
- if (gp->images[i]) XDestroyImage (gp->images[i]);
- free (gp->images);
- gp->images = 0;
-
- which_image = strdup (!strcmp (which_image, "BUILTIN_DAY")
- ? "BUILTIN_FLAT" : "BUILTIN_DAY");
- which_image2 = strdup (!strcmp (which_image2, "BUILTIN_NIGHT")
- ? "BUILTIN_FLAT" : "BUILTIN_NIGHT");
- load_images (mi);
- gp->current_frame = cf;
-# if 0
- switch (gp->state) {
- case FLAT: case ICO: case STEL: case AXIS: case ICO2:
- gp->ratio = 1;
- break;
- default:
- break;
- }
-# endif
- return True;
- }
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_planet (ModeInfo * mi)
-{
- planetstruct *gp;
- int screen = MI_SCREEN(mi);
- Bool wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, planets);
- gp = &planets[screen];
-
- if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- gp->state = STARTUP;
- gp->ratio = 0;
- gp->font_data = load_texture_font (mi->dpy, "labelFont");
- gp->delay = MI_DELAY(mi);
-
- {
- double spin_speed = 0.1;
- double wander_speed = 0.002;
- gp->rot = make_rotator (do_roll ? spin_speed : 0,
- do_roll ? spin_speed : 0,
- 0, 1,
- do_wander ? wander_speed : 0,
- False);
- gp->rot2 = make_rotator (0, 0, 0, 0, wander_speed, False);
- gp->trackball = gltrackball_init (True);
- }
-
- if (wire)
- do_texture = False;
-
- if (do_texture)
- setup_texture (mi);
-
- if (do_stars)
- init_stars (mi);
-
- glEnable (GL_DEPTH_TEST);
- glEnable (GL_NORMALIZE);
- glEnable (GL_CULL_FACE);
-
- if (!wire)
- {
- GLfloat pos[4] = {1, 1, 1, 0};
- GLfloat amb[4] = {0, 0, 0, 1};
- GLfloat dif[4] = {1, 1, 1, 1};
- GLfloat spc[4] = {0, 1, 1, 1};
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-}
-
-
-static GLfloat
-ease_fn (GLfloat r)
-{
- return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
-}
-
-
-static GLfloat
-ease_ratio (GLfloat r)
-{
- GLfloat ease = 0.35;
- if (r <= 0) return 0;
- else if (r >= 1) return 1;
- else if (r <= ease) return ease * ease_fn (r / ease);
- else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
- else return r;
-}
-
-
-ENTRYPOINT void
-draw_planet (ModeInfo * mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- long delay = gp->delay;
- double x, y, z;
-
- if (!gp->glx_context)
- return;
-
- glDrawBuffer(GL_BACK);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glXMakeCurrent (dpy, window, *gp->glx_context);
-
- mi->polygon_count = 0;
-
- if (! gp->button_down_p)
- switch (gp->state) {
- case STARTUP: gp->ratio += speed * 0.01; break;
- case FLAT: gp->ratio += speed * 0.005 *
- /* Stay flat longer if animating day and night. */
- (gp->nimages <= 1 ? 1 : 0.3);
- break;
- case FOLD: gp->ratio += speed * 0.01; break;
- case ICO: gp->ratio += speed * 0.01; break;
- case STEL_IN: gp->ratio += speed * 0.05; break;
- case STEL: gp->ratio += speed * 0.01; break;
- case STEL_OUT: gp->ratio += speed * 0.07; break;
- case ICO2: gp->ratio += speed * 0.07; break;
- case AXIS: gp->ratio += speed * 0.02; break;
- case SPIN: gp->ratio += speed * 0.005; break;
- case UNFOLD: gp->ratio += speed * 0.01; break;
- default: abort();
- }
-
- if (gp->ratio > 1.0)
- {
- gp->ratio = 0;
- switch (gp->state) {
- case STARTUP: gp->state = FLAT; break;
- case FLAT: gp->state = FOLD; break;
- case FOLD: gp->state = ICO; break;
- case ICO: gp->state = STEL_IN; break;
- case STEL_IN: gp->state = STEL; break;
- case STEL:
- {
- int i = (random() << 9) % 7;
- gp->state = (i < 3 ? STEL_OUT :
- i < 6 ? SPIN : AXIS);
- }
- break;
- case AXIS: gp->state = STEL_OUT; break;
- case SPIN: gp->state = STEL_OUT; break;
- case STEL_OUT: gp->state = ICO2; break;
- case ICO2: gp->state = UNFOLD; break;
- case UNFOLD: gp->state = FLAT; break;
- default: abort();
- }
- }
-
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_POINT_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- glPushMatrix();
-
- gltrackball_rotate (gp->trackball);
- glRotatef (current_device_rotation(), 0, 0, 1);
-
-# ifdef HAVE_MOBILE /* Fill more of the screen. */
- {
- int size = MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? MI_WIDTH(mi) : MI_HEIGHT(mi);
- GLfloat s = (size > 768 ? 1.4 : /* iPad */
- 2); /* iPhone */
- glScalef (s, s, s);
- if (MI_WIDTH(mi) < MI_HEIGHT(mi))
- glRotatef (90, 0, 0, 1);
- }
-# endif
-
- if (gp->state != STARTUP)
- {
- get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
- x = (x - 0.5) * 3;
- y = (y - 0.5) * 3;
- z = 0;
- glTranslatef(x, y, z);
- }
-
- if (do_roll && gp->state != STARTUP)
- {
- double max = 65;
- get_position (gp->rot2, &x, &y, 0, !gp->button_down_p);
- glRotatef (max/2 - x*max, 1, 0, 0);
- glRotatef (max/2 - y*max, 0, 1, 0);
- }
-
- if (do_stars)
- {
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_LIGHTING);
- glPushMatrix();
- glScalef (60, 60, 60);
- glRotatef (90, 1, 0, 0);
- glRotatef (35, 1, 0, 0);
- glCallList (gp->starlist);
- mi->polygon_count += gp->starcount;
- glPopMatrix();
- glClear(GL_DEPTH_BUFFER_BIT);
- }
-
- if (! wire)
- {
- glEnable (GL_LIGHTING);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- if (do_texture)
- glEnable(GL_TEXTURE_2D);
-
- if (do_texture /* && !gp->button_down_p */)
- {
- int i;
- int prev = gp->current_frame;
-
- /* By default, advance terminator by about an hour every 5 seconds. */
- gp->current_frame += 0.1 * speed * (gp->nimages / 360.0);
- while (gp->current_frame >= gp->nimages)
- gp->current_frame -= gp->nimages;
- i = gp->current_frame;
-
- /* Load the current image into the texture.
- */
- if (i != prev || !gp->images[i])
- {
- double start = double_time();
- cache_current_frame (mi);
-
- glBindTexture (GL_TEXTURE_2D, gp->tex1);
-
- /* Must be after glBindTexture */
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- gp->images[i]->width,
- gp->images[i]->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- gp->images[i]->data);
- check_gl_error ("texture");
-
- /* If caching the image took a bunch of time, deduct that from
- our per-frame delay to keep the timing a little smoother. */
- delay -= 1000000 * (double_time() - start);
- if (delay < 0) delay = 0;
- }
- }
-
- glTranslatef (-0.5, -0.4, 0);
- glScalef (2.6, 2.6, 2.6);
-
- {
- GLfloat fold_ratio = 0;
- GLfloat stel_ratio = 0;
- switch (gp->state) {
- case FOLD: fold_ratio = gp->ratio; break;
- case UNFOLD: fold_ratio = 1 - gp->ratio; break;
- case ICO: case ICO2: fold_ratio = 1; break;
- case STEL: case AXIS: case SPIN: fold_ratio = 1; stel_ratio = 1; break;
- case STEL_IN: fold_ratio = 1; stel_ratio = gp->ratio; break;
- case STEL_OUT: fold_ratio = 1; stel_ratio = 1 - gp->ratio; break;
- case STARTUP: /* Tilt in from flat */
- glRotatef (-90 * ease_ratio (1 - gp->ratio), 1, 0, 0);
- break;
-
- default: break;
- }
-
-# ifdef HAVE_MOBILE /* Enlarge the icosahedron a bit to make it more visible */
- {
- GLfloat s = 1 + 1.3 * ease_ratio (fold_ratio);
- glScalef (s, s, s);
- }
-# endif
-
- if (gp->state == SPIN)
- {
- align_axis (mi, 0);
- glRotatef (ease_ratio (gp->ratio) * 360 * 3, 0, 0, 1);
- align_axis (mi, 1);
- }
-
- draw_triangles (mi, ease_ratio (fold_ratio), ease_ratio (stel_ratio));
-
- if (gp->state == AXIS)
- draw_axis(mi);
- }
-
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-
- MI_DELAY(mi) = delay;
-}
-
-
-ENTRYPOINT void
-free_planet (ModeInfo * mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- int i;
-
- if (!gp->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
-
- if (gp->font_data) free_texture_font (gp->font_data);
- if (gp->trackball) gltrackball_free (gp->trackball);
- if (gp->rot) free_rotator (gp->rot);
- if (gp->rot2) free_rotator (gp->rot2);
-
- if (gp->day) XDestroyImage (gp->day);
- if (gp->night) XDestroyImage (gp->night);
- if (gp->dusk) XDestroyImage (gp->dusk);
- if (gp->cvt) XDestroyImage (gp->cvt);
-
- if (gp->images) {
- for (i = 0; i < gp->nimages; i++)
- if (gp->images[i]) XDestroyImage (gp->images[i]);
- free (gp->images);
- }
-
- if (glIsList(gp->starlist)) glDeleteLists(gp->starlist, 1);
- if (gp->tex1) glDeleteTextures (1, &gp->tex1);
- if (gp->tex2) glDeleteTextures (1, &gp->tex2);
-}
-
-
-XSCREENSAVER_MODULE_2 ("DymaxionMap", dymaxionmap, planet)
-
-#endif
diff --git a/hacks/glx/dymaxionmap.man b/hacks/glx/dymaxionmap.man
deleted file mode 100644
index c41e495..0000000
--- a/hacks/glx/dymaxionmap.man
+++ /dev/null
@@ -1,117 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-dymaxionmap \- An animation of Buckminster Fuller's unwrapped icosahedral globe.
-.SH SYNOPSIS
-.B dymaxionmap
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fIratio\fP]
-[\-no-wander]
-[\-no-roll]
-[\-no-stars]
-[\-no-grid]
-[\-flat]
-[\-satellite]
-[\-image \fIfile\fP]
-[\-image2 \fIfile\fP]
-[\-frames \fInumber\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Buckminster Fuller's map of the Earth projected onto the surface of an
-unfolded icosahedron. It depicts the Earth's continents as one island, or
-nearly contiguous land masses.
-
-This screen saver animates the progression of the dusk terminator across
-the flattened globe. It includes both satellite and flat-colored map
-imagery, and can load and convert other Equirectangular-projected maps.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
-.TP 8
-.B \-speed \fIratio\fP
-Speed of the animation. 0.5 means half as fast, 2 means twice as fast.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen. Default yes.
-.TP 8
-.B \-roll | \-no-roll
-Whether the object should roll randomly. Default yes.
-.TP 8
-.B \-stars | \-no-stars
-Whether to display a star field. Default yes.
-.TP 8
-.B \-grid | \-no-grid
-Whether to overlay a latitude/longitude grid over the map. Default yes.
-.TP 8
-.B \-flat
-Display a flat-colored map of the Earth. This is the default.
-.TP 8
-.B \-satellite
-Display a day-time satellite map of the Earth.
-.TP 8
-.B \-image \fIfile\fP
-An image to use for the day-time map.
-.TP 8
-.B \-image2 \fIfile\fP
-An image to use for the night-time map.
-The two images can be the same: the night-time one will be darkened.
-.TP 8
-.B \-frames \fInumber\fP
-The number of frames in the day/night animation. Default 720.
-Larger numbers are smoother, but use more memory.
-The day/night animation happens if \fIimage2\fP is set, or
-if \fIframes\fP is greater than 1.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR glplanet (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2016-2018 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-
-"Dymaxion Map" and "The Fuller Projection Map" are trademarks of
-The Buckminster Fuller Institute.
-
-The original Dymaxion Map image is copyright \(co 1982 by
-The Buckminster Fuller Institute. (This program does not use their
-imagery, only similar trigonometry.)
-
-The Dymaxion Map was covered by now-expired US Patent 2,393,676
-(Richard Buckminster Fuller, 1946).
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/e_textures.h b/hacks/glx/e_textures.h
deleted file mode 100644
index 7f9457e..0000000
--- a/hacks/glx/e_textures.h
+++ /dev/null
@@ -1,1478 +0,0 @@
-static unsigned char WoodTextureWidth = 199;
-static unsigned char WoodTextureHeight = 37;
-static unsigned char WoodTextureData[] =
-{
- 84, 30, 12, 84, 26, 12, 108, 42, 28, 100, 38, 28, 108, 42, 28,
- 108, 46, 28, 100, 38, 28, 108, 46, 28, 108, 42, 28, 108, 42, 20,
- 108, 42, 28, 108, 38, 20, 108, 42, 20, 108, 42, 28, 116, 42, 28,
- 108, 42, 20, 108, 46, 28, 100, 34, 12, 108, 42, 20, 108, 42, 20,
- 108, 42, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20, 108, 42, 20,
- 108, 42, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
- 108, 42, 20, 108, 42, 20, 108, 42, 28, 108, 42, 20, 108, 42, 20,
- 100, 38, 20, 100, 38, 20, 100, 38, 20, 108, 38, 20, 116, 50, 28,
- 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 108, 42, 20,
- 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
- 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20,
- 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 42, 20, 108, 42, 20,
- 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 100, 38, 20,
- 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
- 108, 42, 20, 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
- 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
- 100, 38, 20, 100, 34, 12, 100, 34, 12, 100, 38, 20, 108, 38, 20,
- 100, 38, 20, 108, 38, 20, 108, 42, 20, 100, 38, 20, 108, 42, 20,
- 108, 42, 28, 108, 46, 20, 108, 38, 20, 108, 42, 20, 108, 46, 28,
- 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
- 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20,
- 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 54, 36, 116, 54, 36,
- 116, 54, 28, 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 42, 20,
- 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
- 116, 46, 28, 108, 42, 28, 116, 50, 36, 116, 50, 36, 100, 38, 20,
- 108, 42, 28, 108, 38, 20, 100, 38, 20, 108, 38, 20, 108, 42, 28,
- 108, 46, 28, 116, 46, 28, 108, 42, 28, 108, 42, 28, 108, 42, 20,
- 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
- 108, 42, 28, 108, 42, 20, 100, 38, 20, 116, 50, 28, 108, 46, 28,
- 108, 42, 20, 108, 42, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
- 108, 46, 28, 108, 46, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
- 116, 50, 28, 108, 46, 28, 108, 46, 28, 108, 42, 20, 116, 46, 28,
- 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 46, 28, 116, 50, 28,
- 116, 50, 28, 116, 50, 36, 124, 54, 36, 116, 54, 36, 116, 54, 28,
- 116, 50, 28, 116, 50, 28, 108, 46, 28, 116, 46, 28, 108, 46, 28,
- 116, 50, 28, 116, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
- 116, 50, 28, 108, 46, 28, 108, 46, 20, 124, 50, 36, 116, 54, 28,
- 124, 54, 28, 116, 54, 28, 116, 54, 28, 116, 54, 28, 124, 54, 36,
- 124, 58, 36, 124, 50, 36, 116, 46, 28, 116, 46, 28, 116, 42, 28,
- 116, 50, 36, 124, 66, 44, 108, 58, 36, 84, 30, 12, 100, 42, 20,
- 116, 54, 36, 140, 82, 68, 148, 86, 68, 148, 86, 68, 156, 90, 76,
- 148, 86, 68, 156, 86, 76, 156, 86, 68, 148, 86, 68, 156, 86, 68,
- 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 86, 68,
- 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
- 164, 98, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 84,
- 164, 98, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
- 164, 102, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76,
- 164, 94, 68, 164, 94, 68, 164, 98, 76, 172, 106, 84, 164, 98, 76,
- 164, 98, 76, 164, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 94, 68, 164, 98, 76, 164, 98, 76, 164, 102, 76,
- 164, 94, 76, 156, 94, 68, 172, 102, 84, 172, 106, 84, 172, 102, 84,
- 164, 98, 76, 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
- 164, 94, 76, 156, 94, 68, 164, 98, 76, 164, 102, 76, 164, 98, 76,
- 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 102, 76,
- 172, 106, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 172, 102, 84,
- 172, 106, 84, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 110, 84,
- 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
- 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 114, 92,
- 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 122, 108, 188, 126, 108,
- 188, 118, 100, 196, 130, 108, 204, 134, 116, 188, 126, 108, 196, 122, 108,
- 180, 118, 100, 180, 110, 92, 180, 114, 100, 180, 118, 100, 188, 118, 100,
- 188, 122, 108, 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 118, 100,
- 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
- 172, 110, 92, 172, 106, 84, 180, 114, 92, 172, 106, 92, 172, 102, 84,
- 172, 106, 84, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 106, 84,
- 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
- 164, 102, 84, 164, 102, 76, 172, 106, 84, 172, 110, 92, 180, 110, 92,
- 172, 110, 84, 172, 114, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
- 172, 106, 92, 172, 106, 84, 172, 106, 84, 164, 102, 84, 180, 114, 100,
- 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92,
- 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
- 172, 110, 92, 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 118, 100,
- 196, 126, 100, 196, 122, 108, 196, 126, 108, 196, 130, 116, 196, 134, 116,
- 204, 142, 124, 164, 106, 84, 100, 42, 20, 84, 26, 4, 132, 78, 68,
- 188, 122, 108, 188, 122, 108, 188, 126, 116, 196, 134, 116, 188, 122, 108,
- 188, 126, 108, 188, 126, 108, 188, 122, 108, 196, 126, 108, 196, 130, 108,
- 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 126, 108, 188, 126, 108,
- 196, 130, 108, 196, 130, 108, 196, 134, 116, 196, 130, 108, 196, 130, 108,
- 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 188, 126, 108,
- 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 196, 130, 108,
- 196, 134, 116, 204, 142, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108,
- 188, 126, 108, 196, 126, 100, 196, 134, 108, 196, 130, 108, 188, 126, 100,
- 188, 122, 100, 188, 126, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100,
- 188, 126, 100, 196, 130, 108, 204, 134, 108, 196, 134, 116, 196, 134, 108,
- 196, 130, 108, 196, 126, 108, 196, 130, 108, 196, 130, 108, 196, 130, 108,
- 188, 126, 108, 196, 126, 108, 196, 134, 108, 196, 130, 108, 196, 130, 108,
- 188, 122, 100, 196, 130, 108, 196, 130, 108, 196, 134, 108, 196, 130, 108,
- 188, 126, 100, 196, 130, 108, 196, 134, 108, 204, 134, 116, 204, 138, 116,
- 204, 138, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108, 196, 134, 108,
- 204, 134, 116, 196, 134, 116, 196, 134, 108, 196, 130, 108, 196, 130, 108,
- 204, 134, 116, 204, 138, 116, 204, 138, 116, 196, 130, 108, 196, 130, 108,
- 188, 122, 100, 180, 118, 92, 188, 118, 100, 196, 130, 108, 196, 130, 108,
- 188, 126, 100, 188, 122, 100, 188, 122, 100, 204, 134, 108, 196, 134, 116,
- 204, 134, 116, 196, 134, 108, 196, 130, 108, 204, 134, 108, 204, 138, 116,
- 204, 138, 116, 212, 142, 124, 204, 142, 116, 204, 134, 116, 204, 138, 116,
- 204, 138, 116, 204, 138, 116, 204, 134, 108, 188, 126, 108, 196, 130, 108,
- 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 138, 116, 212, 146, 124,
- 204, 142, 116, 204, 138, 116, 212, 146, 124, 212, 142, 124, 204, 138, 124,
- 204, 138, 124, 204, 138, 124, 204, 138, 116, 212, 142, 124, 204, 138, 124,
- 196, 130, 116, 204, 134, 116, 204, 138, 116, 204, 138, 124, 204, 138, 116,
- 204, 138, 124, 204, 134, 116, 204, 138, 124, 212, 142, 124, 204, 138, 116,
- 196, 134, 116, 196, 130, 108, 196, 134, 116, 204, 138, 116, 204, 142, 124,
- 212, 142, 124, 204, 138, 116, 204, 138, 116, 204, 138, 116, 204, 138, 116,
- 204, 138, 124, 204, 142, 124, 204, 142, 116, 204, 138, 124, 196, 134, 108,
- 196, 134, 116, 196, 134, 116, 196, 130, 116, 196, 130, 108, 188, 126, 108,
- 196, 126, 108, 188, 130, 108, 188, 126, 108, 188, 122, 100, 180, 118, 100,
- 188, 118, 100, 188, 126, 108, 196, 130, 108, 196, 126, 108, 188, 126, 108,
- 188, 122, 100, 188, 122, 108, 188, 126, 108, 196, 126, 108, 196, 130, 108,
- 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 134, 108, 196, 134, 116,
- 196, 134, 108, 196, 130, 108, 196, 126, 108, 188, 122, 108, 188, 122, 100,
- 188, 122, 100, 196, 130, 108, 196, 130, 100, 196, 130, 108, 196, 130, 100,
- 188, 130, 108, 196, 130, 108, 196, 134, 108, 204, 138, 116, 204, 130, 108,
- 204, 134, 116, 204, 134, 116, 204, 134, 116, 204, 138, 124, 204, 146, 124,
- 156, 102, 84, 84, 26, 4, 84, 26, 4, 116, 58, 36, 164, 106, 92,
- 164, 102, 84, 164, 106, 92, 172, 110, 92, 156, 98, 84, 172, 102, 84,
- 172, 102, 84, 180, 110, 92, 180, 118, 100, 180, 118, 100, 180, 110, 92,
- 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 106, 92,
- 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 92, 172, 110, 92,
- 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 76,
- 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
- 180, 110, 92, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 106, 84,
- 172, 110, 84, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84,
- 172, 102, 76, 172, 102, 84, 172, 102, 84, 164, 102, 76, 164, 94, 76,
- 172, 102, 84, 172, 110, 92, 172, 110, 84, 172, 102, 84, 164, 98, 76,
- 172, 102, 76, 172, 106, 84, 172, 110, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84,
- 172, 102, 76, 172, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84,
- 172, 106, 84, 180, 110, 92, 172, 110, 84, 180, 118, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 180, 118, 92,
- 188, 122, 100, 188, 118, 100, 180, 114, 92, 180, 118, 92, 180, 114, 92,
- 180, 118, 92, 188, 118, 100, 180, 118, 92, 180, 114, 92, 180, 118, 92,
- 180, 110, 84, 180, 110, 92, 180, 118, 92, 188, 122, 100, 188, 114, 100,
- 180, 114, 92, 180, 114, 92, 196, 126, 108, 188, 126, 100, 188, 122, 100,
- 188, 118, 100, 180, 118, 100, 180, 114, 92, 188, 118, 100, 188, 122, 100,
- 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 188, 122, 100,
- 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 110, 84, 172, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
- 188, 122, 100, 180, 106, 92, 172, 110, 92, 172, 102, 84, 172, 102, 84,
- 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84,
- 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
- 172, 106, 84, 172, 106, 92, 172, 110, 84, 164, 102, 84, 164, 98, 76,
- 164, 94, 76, 164, 98, 76, 172, 110, 92, 180, 114, 92, 180, 118, 100,
- 180, 118, 100, 188, 122, 100, 180, 122, 108, 188, 122, 100, 188, 122, 100,
- 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 126, 108,
- 188, 122, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
- 180, 118, 100, 180, 110, 92, 172, 110, 92, 172, 106, 84, 180, 110, 92,
- 180, 118, 92, 180, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 84,
- 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
- 180, 114, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
- 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
- 180, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 92,
- 180, 118, 92, 188, 118, 100, 188, 122, 100, 180, 114, 100, 180, 110, 92,
- 188, 114, 100, 180, 110, 92, 172, 110, 92, 180, 126, 108, 148, 98, 76,
- 84, 26, 4, 84, 26, 12, 108, 50, 36, 164, 102, 84, 164, 98, 84,
- 156, 94, 76, 164, 98, 84, 148, 86, 68, 156, 90, 76, 156, 94, 84,
- 164, 90, 76, 164, 98, 84, 172, 102, 84, 164, 94, 76, 156, 90, 68,
- 164, 94, 76, 164, 98, 84, 164, 94, 76, 164, 98, 76, 164, 98, 84,
- 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 164, 102, 84, 164, 94, 68, 164, 94, 76, 156, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 98, 76,
- 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84,
- 172, 110, 84, 172, 106, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
- 164, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76, 172, 106, 84,
- 180, 110, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 106, 84,
- 180, 114, 92, 172, 106, 84, 164, 102, 76, 164, 98, 76, 172, 106, 84,
- 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
- 180, 114, 92, 188, 118, 100, 180, 114, 92, 172, 110, 84, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 172, 110, 92, 172, 106, 84, 164, 102, 76,
- 172, 102, 76, 164, 102, 84, 180, 110, 84, 180, 118, 92, 188, 118, 100,
- 188, 122, 100, 180, 118, 92, 180, 110, 92, 180, 110, 84, 172, 106, 92,
- 180, 114, 84, 180, 114, 100, 188, 122, 100, 188, 122, 100, 180, 114, 92,
- 172, 110, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92,
- 180, 118, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 102, 76,
- 164, 102, 76, 172, 102, 84, 172, 110, 84, 180, 114, 92, 172, 110, 84,
- 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 118, 100, 188, 118, 92,
- 180, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 188, 118, 92,
- 180, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
- 180, 114, 92, 188, 122, 100, 188, 126, 108, 188, 118, 100, 172, 110, 92,
- 172, 102, 84, 172, 106, 84, 180, 106, 92, 164, 98, 76, 172, 102, 84,
- 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
- 172, 102, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
- 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
- 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 122, 100,
- 188, 122, 108, 196, 126, 108, 180, 118, 92, 188, 118, 100, 180, 118, 100,
- 180, 118, 100, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 118, 100,
- 180, 110, 92, 172, 110, 84, 172, 106, 92, 172, 110, 92, 188, 118, 100,
- 180, 118, 100, 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 114, 92,
- 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
- 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 110, 92,
- 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 172, 106, 84,
- 180, 110, 84, 180, 118, 92, 188, 122, 100, 180, 118, 100, 180, 118, 92,
- 180, 118, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, 188, 118, 108,
- 188, 118, 100, 188, 122, 100, 188, 130, 108, 156, 102, 84, 84, 26, 12,
- 84, 30, 12, 108, 46, 28, 140, 82, 68, 156, 90, 76, 156, 94, 84,
- 156, 94, 84, 156, 94, 76, 164, 94, 76, 156, 90, 76, 164, 94, 76,
- 156, 94, 76, 156, 90, 68, 156, 90, 68, 164, 90, 76, 156, 90, 68,
- 148, 82, 60, 148, 78, 60, 164, 98, 76, 164, 94, 76, 156, 90, 68,
- 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 76,
- 164, 94, 68, 156, 94, 76, 156, 94, 68, 156, 90, 68, 156, 90, 68,
- 172, 102, 76, 180, 114, 92, 188, 118, 92, 172, 106, 84, 180, 106, 84,
- 172, 106, 84, 164, 98, 76, 164, 94, 68, 164, 98, 76, 172, 102, 84,
- 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 180, 110, 92,
- 172, 110, 84, 172, 98, 76, 164, 98, 76, 172, 106, 84, 180, 118, 92,
- 180, 106, 84, 180, 106, 84, 172, 106, 84, 172, 110, 84, 180, 110, 92,
- 180, 110, 84, 172, 102, 76, 164, 98, 76, 164, 94, 68, 172, 106, 84,
- 180, 114, 92, 172, 106, 84, 164, 98, 76, 172, 98, 76, 172, 106, 84,
- 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 92,
- 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 188, 118, 92,
- 188, 114, 92, 172, 106, 84, 172, 102, 76, 172, 106, 84, 188, 118, 92,
- 188, 122, 100, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
- 180, 114, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
- 180, 106, 84, 180, 114, 84, 172, 102, 76, 164, 94, 76, 172, 106, 84,
- 180, 110, 84, 172, 106, 84, 172, 106, 84, 188, 122, 100, 188, 118, 92,
- 180, 118, 92, 188, 118, 100, 196, 122, 100, 188, 122, 100, 180, 118, 92,
- 180, 110, 84, 188, 114, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92,
- 188, 114, 92, 180, 114, 92, 180, 114, 84, 180, 114, 92, 180, 110, 92,
- 180, 110, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 110, 92,
- 188, 118, 100, 180, 118, 92, 180, 110, 92, 180, 114, 100, 180, 118, 100,
- 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 102, 84,
- 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 118, 92, 180, 118, 100,
- 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100, 180, 118, 92,
- 180, 118, 100, 188, 122, 108, 188, 122, 100, 188, 118, 100, 180, 114, 92,
- 180, 114, 92, 172, 110, 92, 172, 110, 92, 172, 106, 84, 188, 122, 100,
- 180, 114, 100, 172, 106, 84, 172, 110, 84, 180, 114, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
- 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
- 164, 106, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 172, 110, 92,
- 180, 110, 84, 172, 110, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
- 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 100, 188, 118, 92,
- 188, 118, 100, 180, 110, 92, 180, 110, 92, 188, 118, 100, 188, 118, 100,
- 180, 118, 100, 180, 122, 108, 148, 90, 68, 84, 30, 12, 92, 34, 12,
- 116, 58, 44, 156, 90, 76, 156, 94, 76, 156, 94, 76, 156, 90, 76,
- 148, 86, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68, 156, 86, 68,
- 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68, 148, 78, 60,
- 140, 74, 52, 148, 82, 68, 148, 82, 60, 148, 86, 68, 156, 90, 68,
- 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 148, 86, 68,
- 156, 86, 68, 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76,
- 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76,
- 172, 106, 84, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
- 172, 102, 84, 164, 94, 68, 164, 94, 76, 172, 102, 76, 180, 110, 84,
- 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
- 164, 98, 76, 164, 98, 76, 172, 102, 76, 180, 110, 92, 180, 110, 92,
- 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84, 180, 110, 92,
- 172, 102, 84, 164, 98, 76, 156, 94, 68, 172, 106, 84, 188, 114, 92,
- 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
- 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
- 172, 110, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 76,
- 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
- 188, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 172, 106, 84,
- 180, 114, 92, 172, 106, 84, 164, 94, 68, 172, 106, 84, 180, 114, 92,
- 188, 118, 92, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
- 180, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 172, 106, 84,
- 180, 114, 92, 180, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
- 172, 102, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84, 164, 102, 84,
- 172, 102, 84, 164, 94, 76, 156, 90, 68, 164, 94, 76, 180, 106, 92,
- 172, 102, 84, 164, 98, 84, 180, 110, 84, 180, 110, 92, 164, 98, 84,
- 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76, 164, 102, 84,
- 164, 102, 84, 172, 102, 84, 164, 106, 84, 172, 106, 92, 172, 106, 92,
- 172, 110, 92, 180, 110, 84, 180, 118, 100, 188, 118, 100, 180, 118, 100,
- 180, 114, 92, 172, 114, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
- 180, 118, 100, 180, 118, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
- 172, 110, 92, 180, 110, 92, 172, 114, 92, 188, 118, 100, 180, 114, 92,
- 172, 110, 92, 172, 106, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
- 164, 102, 84, 172, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
- 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
- 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 92,
- 188, 122, 92, 180, 122, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
- 196, 122, 100, 188, 118, 100, 196, 122, 108, 180, 114, 100, 180, 114, 100,
- 180, 126, 108, 148, 98, 76, 92, 34, 12, 84, 26, 12, 116, 58, 36,
- 148, 90, 76, 148, 90, 76, 140, 82, 68, 148, 82, 68, 140, 78, 60,
- 156, 86, 68, 148, 86, 68, 156, 90, 68, 156, 90, 76, 164, 94, 76,
- 156, 90, 76, 156, 90, 68, 148, 82, 68, 148, 78, 60, 140, 78, 60,
- 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 156, 94, 76,
- 164, 94, 76, 156, 94, 76, 148, 86, 68, 148, 82, 60, 148, 86, 68,
- 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 94, 76,
- 164, 102, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
- 180, 114, 84, 180, 110, 84, 172, 102, 76, 180, 106, 84, 172, 106, 76,
- 172, 98, 76, 164, 98, 68, 172, 106, 76, 172, 106, 84, 180, 110, 84,
- 172, 98, 76, 180, 106, 84, 180, 110, 84, 180, 110, 84, 172, 98, 76,
- 172, 98, 76, 180, 106, 84, 180, 114, 84, 188, 114, 92, 180, 110, 84,
- 180, 110, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
- 164, 98, 68, 164, 94, 68, 180, 106, 84, 188, 118, 92, 180, 114, 92,
- 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 76,
- 180, 106, 84, 180, 110, 84, 180, 114, 92, 188, 114, 92, 180, 110, 84,
- 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 180, 114, 84,
- 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
- 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 188, 118, 92,
- 180, 118, 92, 188, 118, 92, 196, 122, 100, 172, 106, 84, 188, 114, 84,
- 172, 106, 84, 164, 98, 68, 172, 102, 76, 180, 106, 84, 180, 110, 84,
- 188, 118, 92, 188, 122, 92, 188, 114, 92, 180, 110, 92, 180, 114, 84,
- 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 102, 84, 188, 122, 92,
- 180, 110, 84, 164, 102, 76, 172, 102, 76, 172, 98, 76, 172, 102, 76,
- 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84,
- 172, 102, 76, 164, 90, 76, 172, 98, 76, 180, 110, 92, 172, 102, 76,
- 172, 102, 84, 180, 106, 84, 180, 110, 84, 172, 102, 84, 172, 98, 76,
- 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 164, 98, 76,
- 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
- 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
- 172, 106, 92, 172, 106, 84, 164, 106, 84, 172, 106, 84, 180, 114, 92,
- 180, 110, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 172, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 118, 92, 172, 110, 92, 172, 106, 84,
- 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84, 164, 94, 76,
- 164, 98, 76, 172, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 92,
- 172, 110, 84, 172, 106, 92, 164, 102, 84, 172, 110, 92, 180, 110, 92,
- 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
- 180, 118, 92, 180, 114, 92, 188, 114, 92, 180, 118, 92, 180, 118, 100,
- 180, 118, 92, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 110, 92,
- 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 114, 92,
- 140, 90, 68, 84, 26, 12, 84, 30, 12, 116, 58, 44, 156, 90, 76,
- 156, 90, 76, 148, 86, 68, 148, 86, 76, 148, 86, 68, 156, 90, 76,
- 156, 90, 76, 164, 94, 84, 164, 98, 76, 164, 94, 76, 156, 90, 68,
- 156, 86, 68, 156, 86, 60, 156, 90, 68, 156, 90, 76, 164, 94, 76,
- 156, 94, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 156, 94, 76, 156, 94, 68, 148, 78, 60, 148, 86, 68, 156, 90, 68,
- 156, 90, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 164, 98, 76,
- 164, 94, 68, 172, 98, 76, 180, 106, 84, 188, 118, 92, 188, 118, 92,
- 188, 118, 100, 180, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
- 172, 98, 76, 172, 106, 84, 180, 106, 84, 164, 98, 68, 172, 102, 76,
- 180, 114, 84, 196, 122, 100, 188, 118, 92, 172, 106, 76, 172, 102, 76,
- 180, 110, 84, 188, 122, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84,
- 188, 114, 84, 188, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
- 164, 94, 68, 180, 110, 84, 188, 118, 92, 188, 118, 92, 188, 114, 92,
- 180, 114, 92, 188, 114, 84, 180, 114, 92, 180, 106, 84, 180, 110, 84,
- 180, 114, 84, 188, 114, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84,
- 180, 106, 84, 180, 114, 84, 188, 114, 92, 188, 114, 92, 180, 114, 92,
- 188, 118, 92, 196, 122, 100, 188, 122, 92, 180, 114, 92, 188, 114, 92,
- 180, 110, 84, 180, 114, 84, 188, 118, 92, 188, 122, 92, 188, 118, 92,
- 188, 118, 92, 188, 122, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
- 188, 114, 92, 188, 122, 100, 196, 126, 100, 188, 118, 92, 188, 114, 92,
- 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 188, 118, 92,
- 188, 118, 92, 188, 118, 92, 180, 114, 84, 196, 126, 100, 188, 114, 92,
- 180, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 76, 172, 106, 76,
- 180, 110, 84, 188, 118, 92, 180, 110, 92, 180, 114, 92, 180, 106, 92,
- 164, 98, 76, 180, 106, 84, 188, 114, 100, 180, 106, 84, 180, 110, 92,
- 180, 110, 92, 188, 114, 92, 180, 110, 92, 172, 106, 84, 172, 98, 76,
- 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 102, 84,
- 172, 106, 84, 172, 110, 92, 180, 118, 92, 180, 114, 100, 180, 118, 100,
- 188, 122, 108, 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 106, 84,
- 164, 102, 84, 172, 102, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
- 172, 106, 92, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
- 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
- 172, 110, 92, 180, 110, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
- 172, 106, 84, 180, 114, 92, 172, 106, 84, 164, 102, 84, 172, 110, 84,
- 172, 106, 84, 164, 98, 76, 172, 102, 84, 164, 106, 84, 172, 106, 84,
- 172, 106, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92,
- 180, 106, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
- 172, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92, 180, 106, 84,
- 188, 114, 100, 188, 118, 100, 180, 114, 100, 180, 126, 108, 148, 90, 68,
- 84, 30, 12, 92, 34, 12, 124, 66, 44, 156, 98, 84, 164, 102, 84,
- 164, 98, 84, 164, 98, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
- 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68,
- 156, 86, 68, 156, 86, 68, 164, 94, 68, 156, 90, 76, 156, 94, 68,
- 156, 90, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 102, 84, 148, 82, 60, 148, 86, 68, 156, 90, 68, 156, 90, 68,
- 148, 86, 68, 148, 82, 60, 156, 86, 68, 156, 94, 68, 156, 86, 68,
- 164, 98, 68, 180, 110, 84, 188, 118, 92, 196, 122, 92, 196, 122, 100,
- 188, 118, 92, 188, 118, 92, 180, 110, 92, 172, 106, 76, 172, 106, 76,
- 180, 106, 84, 180, 106, 84, 172, 102, 76, 180, 110, 84, 188, 118, 92,
- 196, 126, 100, 188, 118, 100, 180, 110, 84, 172, 106, 84, 188, 114, 84,
- 188, 122, 100, 196, 122, 100, 188, 118, 92, 180, 114, 84, 180, 114, 92,
- 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 172, 102, 76,
- 180, 110, 84, 196, 122, 100, 188, 122, 92, 188, 118, 92, 188, 118, 92,
- 188, 122, 92, 188, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
- 180, 110, 92, 180, 114, 84, 188, 114, 92, 180, 114, 84, 188, 114, 92,
- 180, 114, 92, 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84,
- 188, 118, 92, 188, 114, 92, 180, 114, 84, 188, 118, 92, 180, 114, 92,
- 188, 114, 92, 188, 122, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92,
- 196, 122, 100, 180, 114, 92, 188, 118, 92, 180, 110, 84, 180, 110, 84,
- 196, 130, 100, 204, 134, 108, 196, 126, 100, 188, 118, 100, 188, 122, 92,
- 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 122, 100, 196, 122, 100,
- 196, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 110, 84,
- 180, 110, 84, 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 110, 84,
- 180, 110, 92, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 94, 68,
- 172, 106, 84, 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 110, 84,
- 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
- 172, 106, 84, 172, 102, 84, 172, 102, 76, 164, 102, 84, 172, 110, 92,
- 180, 114, 92, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 126, 108,
- 188, 122, 100, 180, 118, 100, 172, 110, 92, 164, 106, 84, 172, 102, 84,
- 172, 106, 84, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
- 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
- 172, 110, 92, 172, 110, 92, 172, 110, 84, 180, 110, 92, 172, 114, 92,
- 180, 110, 92, 172, 106, 92, 172, 106, 84, 156, 94, 68, 172, 106, 92,
- 180, 114, 92, 172, 102, 84, 164, 102, 84, 180, 110, 92, 172, 106, 92,
- 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 102, 84,
- 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 106, 84,
- 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 180, 114, 100,
- 188, 118, 100, 180, 118, 100, 188, 126, 100, 148, 94, 76, 92, 34, 12,
- 92, 34, 12, 116, 62, 44, 156, 94, 76, 164, 94, 84, 156, 94, 76,
- 156, 94, 76, 148, 86, 68, 148, 86, 76, 148, 82, 68, 148, 78, 60,
- 148, 82, 68, 156, 90, 68, 156, 94, 76, 164, 90, 76, 156, 90, 68,
- 148, 82, 68, 148, 82, 60, 164, 94, 76, 156, 94, 76, 156, 94, 68,
- 164, 94, 76, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
- 156, 90, 68, 156, 90, 68, 156, 94, 76, 156, 90, 68, 148, 86, 68,
- 148, 86, 68, 156, 90, 68, 156, 90, 68, 164, 98, 76, 172, 106, 84,
- 180, 110, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 110, 84,
- 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 180, 114, 84,
- 180, 114, 84, 180, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
- 188, 118, 92, 188, 114, 92, 180, 114, 92, 188, 114, 84, 180, 110, 84,
- 196, 122, 100, 188, 118, 92, 188, 114, 92, 188, 114, 92, 188, 118, 92,
- 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 106, 84, 188, 114, 92,
- 196, 122, 100, 188, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 100,
- 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 92, 188, 114, 92,
- 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 92, 196, 122, 100,
- 188, 126, 100, 188, 118, 92, 180, 110, 84, 188, 114, 92, 188, 122, 100,
- 196, 126, 100, 188, 118, 100, 196, 122, 92, 188, 114, 92, 180, 114, 92,
- 196, 122, 92, 188, 122, 100, 188, 118, 92, 196, 122, 100, 196, 126, 100,
- 188, 118, 92, 188, 118, 92, 172, 98, 76, 164, 94, 68, 180, 110, 92,
- 188, 122, 92, 188, 114, 92, 180, 114, 84, 204, 130, 108, 196, 126, 100,
- 188, 118, 92, 188, 122, 92, 196, 122, 100, 188, 122, 92, 188, 122, 92,
- 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
- 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 106, 84, 180, 110, 92,
- 180, 106, 84, 172, 102, 76, 172, 98, 76, 164, 94, 76, 180, 106, 84,
- 180, 110, 92, 180, 106, 84, 172, 102, 76, 172, 98, 84, 172, 102, 76,
- 180, 110, 84, 180, 110, 84, 180, 106, 84, 180, 110, 92, 180, 114, 92,
- 172, 110, 92, 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 118, 100,
- 188, 122, 100, 180, 122, 100, 188, 118, 100, 188, 126, 108, 188, 118, 100,
- 180, 114, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
- 180, 114, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 164, 102, 84,
- 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84,
- 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92,
- 172, 114, 92, 180, 110, 92, 164, 98, 76, 172, 110, 92, 180, 114, 92,
- 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84,
- 172, 106, 84, 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
- 172, 110, 92, 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 84, 172, 110, 84, 172, 114, 92, 172, 110, 92, 172, 110, 84,
- 172, 110, 84, 180, 106, 92, 172, 102, 84, 180, 106, 92, 172, 106, 92,
- 172, 106, 92, 180, 122, 100, 148, 98, 76, 92, 34, 12, 100, 42, 28,
- 116, 54, 36, 148, 86, 68, 148, 90, 76, 148, 86, 76, 148, 86, 76,
- 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60,
- 148, 82, 60, 156, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68,
- 148, 86, 68, 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
- 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
- 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 94, 76, 164, 94, 76,
- 156, 94, 76, 164, 98, 76, 180, 110, 84, 188, 114, 84, 188, 114, 92,
- 180, 106, 84, 188, 114, 84, 188, 118, 92, 188, 114, 92, 188, 118, 92,
- 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 114, 92, 188, 118, 92,
- 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
- 188, 118, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84, 196, 122, 100,
- 188, 118, 92, 180, 114, 84, 188, 114, 92, 188, 122, 92, 196, 122, 100,
- 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 118, 92, 196, 122, 100,
- 196, 122, 92, 188, 118, 92, 188, 118, 100, 196, 122, 92, 188, 118, 92,
- 196, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 92, 196, 122, 100,
- 188, 122, 92, 196, 122, 100, 196, 122, 100, 196, 122, 100, 196, 122, 92,
- 188, 114, 92, 180, 110, 84, 188, 114, 84, 188, 118, 92, 196, 122, 92,
- 188, 118, 92, 188, 122, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
- 196, 122, 92, 188, 118, 92, 188, 118, 92, 196, 126, 100, 204, 130, 108,
- 204, 134, 108, 188, 122, 92, 180, 106, 84, 188, 114, 92, 188, 118, 92,
- 188, 118, 92, 196, 122, 100, 204, 134, 108, 196, 130, 100, 196, 122, 100,
- 188, 122, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
- 188, 114, 84, 180, 110, 84, 180, 110, 84, 188, 114, 92, 180, 110, 84,
- 180, 106, 84, 180, 106, 84, 188, 114, 92, 188, 118, 92, 188, 114, 92,
- 180, 110, 92, 180, 106, 84, 172, 102, 84, 180, 110, 84, 188, 118, 92,
- 180, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 92,
- 188, 114, 92, 180, 110, 92, 180, 110, 84, 188, 114, 92, 188, 114, 100,
- 180, 114, 92, 172, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 108,
- 188, 122, 100, 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92,
- 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
- 180, 110, 92, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
- 164, 106, 84, 172, 106, 84, 180, 110, 92, 172, 114, 92, 180, 110, 92,
- 172, 110, 92, 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 110, 84,
- 180, 110, 92, 164, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 106, 84, 180, 114, 92,
- 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 110, 84,
- 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 84, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 114, 92, 180, 114, 92,
- 188, 118, 100, 188, 114, 92, 196, 122, 108, 188, 118, 100, 180, 118, 100,
- 188, 130, 108, 156, 106, 84, 100, 42, 28, 84, 30, 12, 116, 54, 36,
- 156, 90, 76, 156, 90, 76, 156, 90, 68, 156, 94, 76, 148, 86, 68,
- 164, 94, 84, 156, 94, 76, 156, 90, 76, 148, 86, 68, 148, 78, 60,
- 148, 78, 60, 148, 86, 68, 164, 94, 76, 164, 94, 76, 172, 98, 84,
- 164, 98, 76, 164, 102, 76, 172, 106, 84, 180, 110, 92, 180, 118, 100,
- 180, 118, 100, 180, 110, 92, 172, 110, 92, 164, 98, 76, 164, 94, 76,
- 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 172, 102, 84,
- 164, 102, 76, 188, 118, 92, 188, 122, 100, 196, 122, 100, 188, 114, 92,
- 180, 114, 92, 188, 114, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92,
- 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
- 196, 122, 100, 196, 122, 100, 188, 122, 92, 196, 122, 100, 196, 126, 100,
- 196, 122, 100, 188, 118, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
- 188, 114, 92, 188, 118, 92, 196, 122, 100, 196, 126, 100, 196, 122, 100,
- 188, 118, 92, 188, 114, 84, 188, 122, 92, 196, 122, 100, 188, 122, 92,
- 188, 118, 92, 196, 122, 100, 196, 122, 92, 188, 118, 92, 196, 122, 100,
- 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 126, 100, 196, 126, 100,
- 196, 122, 100, 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 122, 100,
- 188, 118, 92, 188, 118, 100, 196, 126, 100, 196, 126, 100, 196, 122, 100,
- 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 122, 100, 196, 122, 92,
- 188, 114, 92, 188, 114, 92, 188, 122, 92, 188, 114, 92, 204, 130, 108,
- 196, 126, 100, 188, 118, 92, 188, 118, 92, 188, 118, 92, 196, 122, 100,
- 196, 126, 100, 204, 130, 108, 196, 126, 100, 196, 122, 100, 188, 118, 92,
- 196, 122, 100, 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
- 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 114, 84,
- 188, 114, 92, 196, 126, 100, 196, 122, 100, 188, 114, 92, 180, 110, 84,
- 180, 106, 84, 172, 98, 76, 180, 110, 92, 188, 114, 92, 172, 102, 84,
- 196, 126, 100, 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 114, 92,
- 180, 110, 84, 188, 114, 92, 188, 114, 92, 188, 122, 100, 180, 118, 100,
- 180, 114, 92, 180, 118, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100,
- 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 110, 92, 180, 114, 100,
- 180, 118, 100, 188, 118, 100, 172, 114, 92, 172, 106, 84, 172, 110, 92,
- 172, 106, 92, 172, 102, 84, 164, 102, 84, 172, 102, 76, 172, 106, 84,
- 172, 106, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92,
- 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
- 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 118, 100, 180, 118, 100,
- 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92, 172, 114, 92,
- 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
- 172, 106, 84, 180, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 118, 92, 180, 118, 92, 180, 114, 92, 180, 118, 92, 188, 114, 100,
- 180, 110, 92, 188, 122, 108, 188, 122, 100, 180, 118, 108, 188, 126, 108,
- 148, 90, 76, 84, 30, 12, 92, 38, 28, 140, 78, 60, 156, 90, 68,
- 156, 90, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
- 164, 94, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 86, 68,
- 148, 86, 68, 156, 86, 68, 156, 94, 76, 164, 102, 76, 180, 110, 92,
- 172, 102, 84, 172, 98, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100,
- 188, 114, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 90, 68,
- 156, 86, 68, 164, 94, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
- 188, 114, 92, 196, 126, 100, 196, 126, 100, 188, 118, 92, 180, 110, 92,
- 188, 118, 92, 196, 130, 108, 196, 126, 100, 196, 122, 100, 188, 126, 100,
- 196, 126, 108, 196, 126, 100, 196, 122, 100, 180, 118, 92, 188, 114, 92,
- 188, 118, 92, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
- 188, 118, 92, 188, 118, 92, 196, 126, 100, 188, 122, 100, 196, 122, 100,
- 188, 122, 100, 196, 126, 100, 196, 130, 100, 196, 126, 108, 196, 130, 100,
- 196, 122, 100, 188, 122, 100, 196, 126, 108, 196, 126, 100, 204, 130, 108,
- 196, 130, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100, 196, 126, 100,
- 188, 122, 100, 196, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 100,
- 196, 130, 100, 196, 130, 108, 196, 130, 100, 196, 126, 100, 196, 126, 100,
- 204, 130, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100, 196, 122, 100,
- 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 126, 108, 196, 130, 100,
- 196, 122, 100, 188, 122, 100, 196, 126, 100, 204, 134, 108, 204, 134, 108,
- 196, 126, 100, 188, 114, 92, 188, 118, 92, 188, 122, 100, 196, 126, 100,
- 196, 130, 108, 196, 126, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100,
- 188, 122, 92, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
- 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, 188, 118, 92,
- 188, 118, 100, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100,
- 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 100,
- 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 102, 84, 172, 106, 84,
- 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
- 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
- 196, 130, 108, 180, 114, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
- 172, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92,
- 180, 114, 92, 180, 110, 92, 164, 102, 84, 164, 98, 84, 172, 102, 84,
- 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
- 172, 106, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84,
- 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
- 180, 114, 92, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
- 180, 110, 92, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 110, 92,
- 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
- 180, 118, 100, 180, 114, 92, 180, 114, 92, 172, 102, 84, 172, 102, 84,
- 180, 106, 92, 164, 94, 84, 156, 94, 76, 172, 110, 100, 140, 82, 68,
- 92, 38, 28, 92, 34, 20, 124, 58, 44, 140, 78, 60, 148, 86, 68,
- 156, 90, 68, 156, 94, 76, 164, 94, 76, 148, 90, 68, 156, 90, 68,
- 164, 94, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 148, 86, 60,
- 148, 86, 68, 156, 90, 68, 164, 94, 76, 164, 98, 76, 156, 94, 76,
- 156, 94, 76, 172, 98, 84, 180, 110, 92, 180, 118, 100, 188, 114, 100,
- 180, 114, 92, 172, 102, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76,
- 156, 90, 68, 164, 94, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
- 180, 110, 92, 196, 126, 100, 196, 126, 108, 204, 130, 100, 196, 126, 108,
- 196, 130, 108, 196, 126, 100, 188, 122, 100, 196, 122, 100, 196, 126, 100,
- 196, 126, 100, 188, 122, 100, 188, 118, 92, 196, 130, 108, 196, 134, 108,
- 204, 134, 108, 204, 134, 108, 196, 130, 108, 196, 130, 108, 196, 126, 108,
- 196, 130, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100, 196, 126, 100,
- 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100,
- 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
- 196, 126, 100, 196, 126, 108, 204, 130, 108, 196, 130, 108, 196, 130, 108,
- 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108, 204, 130, 108,
- 196, 130, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100, 196, 126, 108,
- 196, 130, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100, 188, 126, 100,
- 196, 126, 100, 196, 126, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100,
- 196, 122, 100, 188, 126, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100,
- 180, 114, 92, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 118, 92,
- 188, 122, 100, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100,
- 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 122, 92, 188, 118, 100,
- 188, 118, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 180, 118, 92,
- 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 188, 118, 92, 196, 126, 100, 188, 118, 100,
- 188, 122, 100, 188, 118, 92, 180, 110, 84, 180, 114, 92, 188, 122, 100,
- 188, 122, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 106, 84,
- 164, 94, 76, 164, 102, 84, 180, 114, 92, 180, 118, 100, 172, 106, 84,
- 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84,
- 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
- 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
- 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 172, 110, 92,
- 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
- 188, 118, 92, 180, 118, 100, 180, 118, 100, 188, 118, 100, 180, 110, 92,
- 172, 110, 100, 180, 114, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
- 188, 122, 100, 188, 118, 100, 180, 106, 84, 172, 102, 84, 188, 114, 100,
- 164, 98, 76, 164, 98, 84, 172, 110, 100, 132, 78, 68, 92, 34, 20,
- 92, 34, 20, 132, 70, 52, 156, 90, 68, 164, 102, 76, 164, 98, 76,
- 164, 98, 84, 164, 98, 76, 156, 90, 68, 156, 94, 76, 148, 82, 60,
- 148, 86, 68, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
- 148, 82, 60, 148, 86, 68, 148, 82, 68, 148, 82, 60, 156, 82, 68,
- 156, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
- 164, 102, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 156, 82, 60,
- 140, 78, 60, 140, 70, 52, 132, 70, 52, 156, 82, 60, 172, 98, 76,
- 188, 114, 92, 196, 122, 100, 196, 126, 100, 196, 126, 108, 196, 130, 108,
- 196, 130, 108, 196, 126, 100, 188, 126, 100, 196, 126, 100, 188, 126, 100,
- 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
- 196, 130, 108, 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100,
- 196, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
- 188, 126, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
- 196, 126, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
- 188, 126, 100, 196, 126, 100, 196, 126, 100, 196, 130, 108, 196, 126, 100,
- 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 122, 100, 196, 130, 108,
- 196, 130, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 204, 130, 108,
- 196, 130, 108, 196, 126, 108, 196, 130, 108, 204, 134, 108, 196, 130, 108,
- 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 134, 108,
- 204, 130, 108, 204, 134, 116, 196, 130, 108, 196, 122, 100, 188, 122, 100,
- 196, 126, 108, 196, 126, 100, 196, 126, 100, 188, 118, 100, 188, 118, 92,
- 188, 118, 92, 188, 122, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100,
- 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100,
- 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
- 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 114, 92,
- 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 122, 100,
- 188, 122, 100, 180, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 100,
- 188, 118, 100, 180, 118, 100, 180, 118, 100, 188, 122, 100, 188, 122, 100,
- 188, 122, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 164, 102, 76,
- 164, 102, 84, 188, 118, 100, 180, 118, 100, 172, 106, 84, 164, 102, 84,
- 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
- 172, 106, 84, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92,
- 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92, 180, 110, 84,
- 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92,
- 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 106, 92, 172, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 100, 180, 114, 92,
- 180, 114, 92, 180, 114, 100, 180, 118, 92, 180, 122, 100, 188, 122, 100,
- 188, 122, 100, 188, 118, 100, 180, 110, 92, 188, 114, 100, 172, 102, 92,
- 172, 106, 92, 180, 118, 100, 132, 78, 68, 92, 34, 20, 92, 34, 20,
- 132, 74, 60, 156, 90, 68, 164, 94, 76, 148, 90, 68, 156, 86, 68,
- 156, 90, 68, 156, 90, 68, 164, 98, 84, 156, 90, 68, 156, 90, 68,
- 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 102, 76,
- 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
- 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 110, 92, 164, 98, 84, 164, 94, 76,
- 156, 90, 68, 156, 90, 68, 172, 102, 84, 180, 110, 92, 188, 118, 92,
- 196, 122, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
- 188, 118, 100, 188, 118, 100, 180, 114, 92, 188, 114, 92, 188, 118, 100,
- 188, 118, 92, 196, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100,
- 180, 118, 92, 188, 118, 92, 188, 122, 100, 196, 122, 100, 196, 126, 108,
- 188, 126, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100, 196, 122, 100,
- 188, 122, 100, 188, 118, 92, 180, 110, 92, 180, 114, 92, 188, 118, 92,
- 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 114, 92, 188, 114, 92,
- 188, 126, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 196, 126, 108,
- 188, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100,
- 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 126, 100, 188, 122, 100,
- 188, 118, 92, 196, 130, 108, 196, 130, 108, 196, 126, 108, 196, 126, 100,
- 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108,
- 196, 130, 100, 196, 122, 100, 180, 118, 92, 188, 118, 92, 188, 122, 100,
- 196, 126, 100, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 114, 92,
- 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 188, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 92,
- 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 92, 188, 114, 92,
- 188, 122, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 118, 92,
- 196, 122, 100, 188, 118, 100, 180, 114, 92, 188, 122, 100, 188, 118, 92,
- 180, 110, 92, 180, 114, 84, 188, 118, 100, 180, 118, 92, 188, 118, 100,
- 188, 122, 100, 188, 122, 100, 188, 122, 108, 188, 122, 100, 188, 122, 100,
- 180, 114, 92, 172, 106, 84, 164, 98, 84, 156, 94, 76, 164, 94, 76,
- 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 106, 84, 188, 122, 100,
- 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
- 180, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92,
- 180, 110, 84, 172, 110, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
- 172, 106, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
- 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92,
- 172, 106, 84, 172, 106, 92, 180, 110, 92, 172, 110, 92, 180, 106, 92,
- 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
- 188, 118, 100, 188, 114, 100, 188, 118, 100, 180, 110, 92, 180, 118, 108,
- 180, 122, 108, 132, 78, 68, 92, 34, 20, 92, 34, 20, 108, 50, 28,
- 132, 66, 52, 140, 74, 52, 132, 70, 52, 140, 74, 52, 140, 78, 60,
- 148, 86, 60, 164, 94, 76, 156, 94, 68, 156, 94, 76, 164, 98, 76,
- 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84,
- 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
- 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 188, 114, 100,
- 188, 122, 100, 180, 110, 84, 188, 114, 92, 180, 114, 92, 188, 114, 92,
- 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 84,
- 180, 114, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
- 180, 110, 92, 188, 118, 92, 188, 122, 100, 180, 114, 84, 180, 110, 92,
- 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 106, 84,
- 172, 106, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84,
- 172, 110, 92, 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 118, 92,
- 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 92, 188, 118, 100,
- 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
- 188, 114, 92, 188, 118, 92, 188, 122, 92, 188, 118, 100, 196, 122, 92,
- 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100, 188, 118, 92,
- 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 118, 92, 188, 114, 92,
- 172, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 92, 180, 110, 84,
- 172, 110, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
- 172, 106, 76, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
- 172, 106, 84, 172, 102, 84, 172, 102, 76, 180, 106, 84, 180, 114, 92,
- 188, 118, 92, 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 110, 84,
- 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92, 172, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84, 164, 98, 84,
- 156, 94, 76, 140, 74, 52, 140, 78, 60, 148, 86, 68, 156, 90, 68,
- 156, 94, 76, 156, 98, 76, 172, 102, 84, 172, 110, 92, 172, 106, 92,
- 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
- 172, 102, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
- 172, 106, 84, 172, 106, 84, 172, 110, 92, 164, 102, 84, 172, 102, 84,
- 164, 106, 84, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 92, 172, 106, 92, 164, 102, 84, 172, 102, 84,
- 164, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
- 180, 106, 92, 180, 110, 92, 172, 102, 92, 172, 114, 100, 180, 118, 100,
- 132, 74, 60, 92, 34, 20, 92, 34, 12, 124, 58, 44, 148, 78, 60,
- 148, 90, 68, 156, 86, 68, 156, 94, 76, 156, 94, 76, 156, 90, 68,
- 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76,
- 164, 98, 76, 164, 98, 84, 164, 98, 76, 156, 98, 76, 164, 94, 76,
- 164, 98, 76, 164, 98, 84, 164, 98, 84, 172, 102, 76, 164, 102, 84,
- 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, 180, 106, 84,
- 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
- 180, 110, 92, 180, 106, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92,
- 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
- 188, 122, 100, 188, 122, 100, 188, 118, 92, 180, 118, 92, 188, 118, 92,
- 188, 118, 100, 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 118, 92,
- 188, 122, 100, 196, 130, 108, 188, 114, 92, 180, 114, 92, 180, 118, 92,
- 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 180, 110, 84,
- 180, 110, 92, 180, 114, 84, 180, 114, 92, 180, 114, 92, 188, 118, 92,
- 188, 118, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
- 188, 122, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100,
- 196, 122, 100, 188, 126, 100, 188, 122, 100, 188, 122, 92, 188, 122, 100,
- 196, 122, 100, 188, 126, 100, 196, 122, 100, 188, 118, 92, 180, 118, 92,
- 188, 118, 100, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100,
- 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 114, 92,
- 180, 110, 84, 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
- 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 92,
- 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84,
- 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
- 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
- 172, 110, 84, 172, 110, 84, 180, 110, 92, 188, 118, 92, 188, 118, 92,
- 180, 114, 92, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
- 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92,
- 172, 110, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 94, 76,
- 156, 94, 68, 172, 102, 76, 172, 110, 92, 172, 110, 84, 172, 106, 92,
- 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92,
- 172, 106, 84, 172, 106, 92, 172, 102, 84, 172, 102, 84, 172, 106, 92,
- 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
- 172, 106, 84, 172, 102, 84, 172, 106, 92, 172, 102, 84, 164, 98, 76,
- 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
- 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 98, 76,
- 172, 102, 84, 172, 102, 84, 172, 102, 84, 164, 98, 84, 164, 102, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 98, 76,
- 172, 98, 84, 164, 94, 84, 172, 110, 92, 172, 110, 100, 116, 62, 52,
- 92, 34, 12, 92, 34, 20, 148, 90, 68, 172, 106, 84, 172, 110, 92,
- 172, 106, 84, 172, 110, 84, 180, 110, 92, 164, 102, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 110, 92, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84,
- 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92,
- 180, 110, 92, 188, 118, 100, 188, 114, 100, 180, 114, 92, 180, 110, 92,
- 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
- 188, 118, 92, 196, 122, 100, 196, 126, 108, 204, 130, 108, 188, 122, 100,
- 188, 118, 100, 180, 118, 92, 180, 114, 92, 188, 122, 100, 196, 122, 100,
- 188, 122, 100, 188, 118, 92, 180, 110, 92, 196, 122, 100, 188, 126, 100,
- 196, 126, 100, 188, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 108,
- 196, 130, 108, 196, 130, 108, 196, 126, 100, 196, 126, 108, 196, 130, 108,
- 196, 134, 108, 204, 134, 108, 196, 130, 108, 188, 126, 108, 188, 118, 92,
- 180, 114, 92, 180, 106, 84, 180, 110, 84, 180, 114, 92, 180, 118, 92,
- 188, 118, 92, 180, 118, 92, 188, 126, 100, 188, 122, 100, 196, 126, 100,
- 196, 126, 100, 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
- 196, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
- 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, 188, 118, 92,
- 180, 114, 92, 188, 118, 92, 188, 118, 100, 188, 122, 92, 188, 122, 100,
- 196, 122, 100, 180, 118, 92, 188, 118, 92, 180, 114, 92, 172, 110, 84,
- 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 118, 92,
- 188, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
- 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 114, 84,
- 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
- 180, 114, 84, 180, 114, 92, 180, 118, 92, 180, 110, 92, 172, 106, 84,
- 180, 110, 84, 180, 110, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84,
- 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
- 172, 110, 84, 172, 106, 92, 172, 106, 84, 164, 98, 76, 180, 118, 100,
- 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92, 172, 106, 92,
- 172, 106, 84, 164, 102, 84, 180, 106, 84, 172, 106, 92, 180, 110, 92,
- 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
- 172, 98, 84, 164, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
- 180, 106, 84, 172, 110, 92, 180, 106, 92, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76,
- 164, 98, 76, 164, 98, 84, 164, 98, 76, 172, 102, 84, 164, 102, 84,
- 172, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 172, 102, 84,
- 172, 102, 92, 164, 102, 84, 172, 102, 84, 164, 106, 84, 164, 106, 84,
- 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 102, 84,
- 164, 94, 84, 172, 106, 92, 164, 106, 92, 116, 62, 52, 92, 34, 20,
- 100, 46, 28, 148, 86, 76, 164, 98, 76, 164, 98, 76, 156, 90, 76,
- 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 164, 102, 84,
- 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 110, 92,
- 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 106, 92, 172, 106, 84,
- 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
- 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 180, 106, 92,
- 180, 110, 84, 172, 106, 84, 172, 102, 84, 180, 110, 92, 172, 102, 76,
- 172, 98, 76, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 98, 76,
- 164, 94, 76, 164, 98, 76, 172, 102, 76, 172, 110, 84, 172, 106, 84,
- 172, 98, 76, 156, 94, 68, 164, 94, 68, 164, 94, 76, 164, 98, 76,
- 164, 94, 68, 164, 94, 68, 156, 90, 68, 164, 94, 68, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
- 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 164, 98, 76,
- 148, 86, 60, 148, 82, 60, 156, 90, 68, 164, 94, 76, 164, 98, 76,
- 164, 94, 76, 172, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
- 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 172, 106, 84,
- 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84,
- 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 102, 84, 172, 102, 76,
- 164, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 114, 92,
- 172, 102, 76, 172, 106, 84, 172, 102, 84, 164, 94, 76, 164, 98, 76,
- 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 172, 98, 76,
- 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 164, 102, 76,
- 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 102, 76, 164, 102, 76,
- 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 84,
- 172, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
- 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 164, 98, 76,
- 164, 102, 76, 156, 90, 68, 164, 94, 68, 164, 98, 76, 164, 98, 76,
- 164, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
- 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68,
- 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 90, 68,
- 156, 94, 76, 156, 86, 68, 156, 90, 68, 164, 98, 76, 164, 94, 76,
- 164, 94, 76, 164, 98, 76, 172, 102, 84, 180, 114, 92, 164, 102, 76,
- 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
- 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92, 172, 110, 92,
- 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
- 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
- 172, 110, 92, 172, 110, 84, 172, 106, 84, 172, 102, 92, 172, 106, 84,
- 172, 106, 92, 172, 110, 92, 172, 110, 92, 172, 110, 92, 180, 106, 84,
- 172, 106, 84, 180, 106, 92, 180, 110, 92, 180, 110, 100, 172, 102, 84,
- 180, 114, 100, 172, 110, 100, 124, 66, 52, 100, 46, 28, 100, 42, 28,
- 148, 78, 68, 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 156, 90, 68, 148, 82, 60, 148, 82, 68, 148, 86, 60,
- 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 90, 68, 148, 86, 68,
- 156, 90, 68, 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76,
- 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
- 156, 90, 68, 164, 94, 76, 164, 98, 76, 164, 94, 76, 156, 86, 68,
- 156, 94, 76, 180, 110, 92, 172, 98, 76, 172, 102, 76, 172, 102, 84,
- 164, 98, 76, 172, 98, 76, 180, 110, 84, 188, 122, 100, 188, 118, 92,
- 180, 114, 92, 188, 118, 100, 188, 118, 92, 188, 122, 100, 180, 114, 92,
- 180, 110, 92, 172, 102, 76, 172, 106, 84, 188, 118, 92, 188, 122, 100,
- 188, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 172, 102, 76,
- 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 114, 92, 188, 118, 92,
- 188, 114, 92, 180, 114, 92, 188, 114, 92, 188, 118, 100, 188, 118, 92,
- 180, 114, 92, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
- 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76, 164, 98, 76,
- 172, 102, 76, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84,
- 180, 110, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 106, 84,
- 180, 110, 92, 172, 106, 76, 172, 110, 84, 180, 110, 92, 180, 110, 84,
- 180, 106, 84, 172, 106, 84, 180, 106, 84, 172, 110, 84, 180, 110, 84,
- 172, 102, 84, 172, 102, 76, 172, 102, 76, 164, 94, 68, 164, 98, 76,
- 172, 102, 76, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 94, 76,
- 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76,
- 164, 102, 84, 172, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
- 156, 90, 68, 156, 90, 68, 164, 94, 76, 172, 102, 76, 172, 106, 84,
- 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76,
- 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
- 164, 94, 68, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 102, 76,
- 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
- 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
- 164, 98, 76, 156, 94, 76, 156, 86, 68, 148, 86, 68, 148, 82, 60,
- 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 82, 60,
- 148, 86, 68, 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68,
- 148, 78, 60, 148, 82, 60, 156, 86, 68, 156, 90, 76, 156, 90, 68,
- 156, 86, 68, 148, 86, 60, 156, 86, 68, 148, 86, 68, 148, 86, 68,
- 156, 90, 68, 156, 90, 68, 164, 94, 76, 156, 94, 76, 156, 86, 68,
- 156, 90, 68, 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
- 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68,
- 156, 90, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 106, 84,
- 172, 102, 84, 164, 90, 76, 172, 102, 84, 172, 102, 84, 164, 102, 92,
- 164, 102, 92, 124, 70, 60, 100, 42, 28, 84, 30, 12, 132, 70, 52,
- 140, 74, 60, 148, 78, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60,
- 140, 78, 60, 140, 74, 52, 148, 78, 60, 148, 82, 60, 148, 82, 60,
- 148, 82, 68, 156, 86, 60, 156, 90, 68, 156, 90, 68, 156, 90, 76,
- 148, 82, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68,
- 156, 86, 68, 156, 90, 68, 164, 90, 76, 172, 102, 84, 156, 94, 76,
- 156, 90, 68, 172, 98, 84, 164, 102, 84, 164, 94, 76, 164, 94, 76,
- 172, 102, 84, 180, 110, 84, 180, 110, 92, 188, 114, 92, 180, 110, 84,
- 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 92, 180, 118, 92,
- 188, 114, 92, 188, 118, 92, 180, 118, 92, 180, 114, 92, 180, 110, 84,
- 180, 114, 92, 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 114, 92, 180, 114, 92,
- 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84,
- 172, 102, 84, 172, 106, 76, 180, 110, 92, 188, 118, 92, 188, 118, 100,
- 188, 118, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84,
- 180, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
- 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 106, 84, 180, 110, 84,
- 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
- 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 172, 106, 84,
- 172, 106, 84, 180, 106, 84, 180, 110, 92, 180, 110, 92, 172, 106, 76,
- 172, 106, 84, 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 106, 84,
- 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 98, 76, 164, 102, 76,
- 172, 102, 84, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 102, 76,
- 164, 102, 84, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 94, 68,
- 164, 94, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 172, 106, 84,
- 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 76,
- 172, 102, 76, 164, 98, 76, 172, 102, 84, 172, 106, 76, 164, 94, 76,
- 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 84, 164, 98, 76,
- 156, 94, 76, 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 94, 76,
- 156, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, 156, 86, 68,
- 156, 90, 68, 164, 94, 76, 164, 94, 76, 156, 90, 68, 156, 86, 68,
- 156, 86, 68, 156, 94, 76, 164, 98, 76, 164, 94, 76, 156, 90, 76,
- 156, 86, 68, 148, 90, 68, 156, 90, 68, 156, 94, 68, 156, 94, 76,
- 156, 94, 76, 156, 94, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76,
- 164, 94, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
- 156, 90, 68, 164, 94, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
- 164, 102, 76, 156, 98, 76, 164, 98, 76, 164, 94, 68, 156, 82, 68,
- 132, 66, 44, 140, 70, 52, 148, 78, 68, 156, 90, 76, 156, 102, 84,
- 124, 66, 52, 84, 30, 12, 92, 38, 28, 132, 66, 52, 140, 74, 52,
- 132, 74, 60, 132, 66, 44, 124, 66, 44, 140, 70, 52, 140, 78, 60,
- 148, 82, 60, 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 86, 68,
- 148, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76, 164, 90, 68,
- 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84, 164, 98, 84,
- 172, 98, 76, 164, 102, 84, 172, 102, 84, 172, 98, 84, 164, 98, 76,
- 172, 102, 84, 180, 110, 84, 180, 110, 92, 172, 110, 92, 172, 102, 76,
- 180, 106, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 106, 84,
- 172, 102, 84, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 188, 114, 92, 180, 110, 92, 172, 110, 84, 188, 118, 100,
- 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
- 180, 114, 92, 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 102, 84, 172, 102, 76,
- 172, 102, 76, 172, 110, 84, 188, 118, 100, 188, 122, 100, 188, 118, 92,
- 188, 118, 100, 188, 122, 92, 188, 122, 100, 172, 110, 84, 180, 110, 92,
- 180, 114, 84, 180, 114, 92, 188, 114, 92, 180, 118, 92, 188, 114, 92,
- 180, 118, 92, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84,
- 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 106, 84,
- 180, 106, 84, 172, 110, 92, 180, 110, 84, 180, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 106, 84, 172, 110, 84,
- 172, 102, 84, 172, 102, 84, 164, 102, 76, 172, 102, 76, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 76,
- 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 98, 76, 172, 102, 76,
- 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
- 172, 106, 84, 180, 110, 92, 180, 110, 84, 172, 110, 84, 172, 102, 84,
- 172, 102, 76, 172, 106, 84, 180, 110, 84, 164, 98, 76, 164, 98, 76,
- 172, 106, 84, 164, 102, 76, 172, 102, 84, 164, 98, 84, 164, 98, 76,
- 172, 106, 84, 172, 110, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
- 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
- 156, 94, 76, 164, 98, 76, 172, 106, 84, 172, 102, 76, 164, 98, 84,
- 172, 102, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
- 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
- 172, 102, 84, 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
- 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
- 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 76, 164, 98, 76,
- 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 94, 76,
- 164, 98, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, 164, 102, 84,
- 164, 98, 76, 156, 94, 68, 156, 90, 68, 156, 86, 68, 132, 62, 44,
- 140, 66, 52, 140, 74, 60, 156, 94, 84, 172, 110, 100, 132, 74, 60,
- 92, 38, 28, 116, 58, 44, 164, 106, 84, 180, 114, 92, 180, 114, 92,
- 172, 106, 84, 172, 106, 84, 172, 110, 92, 188, 122, 100, 188, 126, 100,
- 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 92, 180, 110, 92, 164, 102, 84, 172, 106, 84,
- 180, 106, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 84, 180, 114, 92, 180, 114, 100, 180, 114, 92,
- 180, 114, 100, 188, 122, 100, 188, 122, 100, 188, 114, 92, 180, 114, 92,
- 188, 114, 92, 188, 114, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84,
- 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
- 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 110, 84,
- 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 114, 92,
- 188, 118, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92,
- 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 106, 76,
- 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
- 180, 106, 84, 172, 110, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84,
- 164, 94, 68, 164, 98, 76, 172, 106, 84, 180, 110, 84, 172, 106, 84,
- 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 76, 172, 102, 76, 172, 102, 84, 164, 102, 76, 172, 102, 84,
- 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, 180, 110, 84,
- 180, 110, 92, 180, 114, 84, 180, 110, 92, 172, 106, 84, 180, 106, 84,
- 172, 110, 84, 180, 106, 84, 172, 110, 92, 180, 106, 84, 172, 106, 84,
- 180, 110, 84, 172, 106, 84, 164, 98, 76, 172, 98, 76, 180, 110, 84,
- 172, 106, 84, 172, 102, 84, 164, 98, 76, 164, 102, 84, 172, 106, 84,
- 172, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
- 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 98, 76, 156, 90, 68,
- 156, 90, 68, 164, 98, 84, 164, 98, 84, 172, 102, 76, 172, 102, 84,
- 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84, 172, 106, 84,
- 172, 98, 84, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 106, 84,
- 172, 106, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 76,
- 156, 94, 76, 164, 102, 76, 172, 102, 84, 164, 102, 84, 164, 102, 76,
- 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 98, 84, 164, 98, 84,
- 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 102, 84,
- 164, 98, 76, 164, 98, 76, 172, 102, 84, 164, 90, 68, 164, 90, 76,
- 164, 94, 76, 164, 102, 92, 172, 114, 100, 140, 82, 68, 116, 58, 44,
- 116, 62, 52, 148, 86, 68, 164, 98, 76, 164, 102, 84, 164, 98, 76,
- 156, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84,
- 164, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
- 164, 98, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 172, 106, 84,
- 180, 110, 84, 172, 110, 92, 180, 110, 84, 172, 106, 92, 172, 106, 84,
- 164, 90, 76, 172, 106, 84, 180, 110, 92, 172, 98, 84, 164, 98, 76,
- 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
- 188, 114, 92, 188, 118, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
- 180, 110, 84, 180, 114, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84,
- 172, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
- 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 110, 92,
- 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 110, 84, 180, 110, 84,
- 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 110, 84,
- 180, 110, 92, 180, 114, 92, 180, 114, 92, 172, 106, 84, 172, 102, 84,
- 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
- 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
- 172, 102, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
- 172, 102, 84, 172, 102, 76, 172, 106, 84, 172, 102, 76, 156, 90, 68,
- 164, 94, 68, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 98, 76,
- 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84,
- 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 180, 106, 84,
- 172, 106, 84, 164, 102, 76, 172, 102, 76, 172, 110, 92, 180, 110, 84,
- 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 180, 114, 84, 172, 106, 84, 180, 106, 84,
- 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 110, 84, 180, 114, 92,
- 164, 98, 84, 156, 98, 76, 164, 98, 76, 172, 106, 84, 172, 110, 92,
- 172, 106, 84, 164, 102, 76, 164, 102, 84, 156, 90, 68, 156, 90, 68,
- 156, 94, 76, 164, 102, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76,
- 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76,
- 164, 98, 84, 172, 98, 76, 172, 102, 84, 172, 106, 92, 164, 98, 76,
- 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 102, 84,
- 164, 98, 76, 156, 90, 68, 164, 98, 76, 164, 98, 76, 164, 98, 84,
- 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 98, 84, 164, 102, 76,
- 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 164, 102, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84,
- 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 106, 84, 172, 102, 84,
- 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 92, 164, 98, 84,
- 164, 102, 92, 156, 98, 84, 132, 74, 60, 116, 62, 52, 116, 58, 44,
- 148, 86, 68, 164, 94, 76, 164, 102, 84, 164, 102, 76, 164, 98, 76,
- 164, 98, 76, 164, 102, 84, 164, 98, 76, 172, 106, 84, 172, 106, 84,
- 172, 106, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 180, 114, 92,
- 180, 114, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
- 180, 110, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 84,
- 180, 114, 92, 188, 122, 100, 180, 114, 92, 172, 102, 84, 180, 106, 92,
- 188, 118, 100, 188, 122, 100, 172, 102, 84, 172, 106, 84, 180, 106, 84,
- 180, 110, 84, 180, 110, 84, 180, 106, 92, 172, 102, 76, 172, 102, 84,
- 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92,
- 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 76, 164, 98, 76,
- 172, 102, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 172, 102, 84,
- 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84,
- 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84,
- 180, 110, 92, 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 84, 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92, 180, 110, 92,
- 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
- 172, 102, 76, 172, 102, 84, 172, 102, 84, 172, 106, 76, 164, 98, 76,
- 164, 98, 76, 172, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 76,
- 164, 98, 76, 172, 106, 84, 172, 102, 84, 164, 94, 68, 164, 94, 76,
- 172, 102, 76, 172, 102, 76, 164, 102, 84, 172, 102, 76, 164, 98, 76,
- 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
- 164, 102, 76, 172, 98, 76, 164, 102, 76, 172, 106, 84, 172, 102, 76,
- 172, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84, 172, 102, 84,
- 172, 102, 76, 172, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 84,
- 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84,
- 156, 90, 68, 164, 94, 68, 172, 110, 84, 180, 114, 92, 172, 102, 76,
- 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 102, 84,
- 164, 98, 76, 164, 98, 84, 156, 94, 76, 164, 98, 76, 164, 98, 84,
- 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84,
- 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 172, 102, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
- 164, 94, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 164, 94, 76,
- 156, 90, 68, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
- 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
- 164, 98, 76, 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 102, 84,
- 164, 98, 84, 164, 102, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
- 172, 98, 84, 164, 98, 76, 172, 98, 84, 164, 94, 76, 164, 98, 84,
- 156, 98, 84, 124, 70, 60, 116, 58, 44, 116, 62, 44, 164, 98, 76,
- 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 102, 84, 172, 102, 84,
- 172, 106, 84, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
- 172, 102, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
- 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 114, 92, 180, 106, 92, 164, 102, 84, 180, 106, 84, 180, 114, 100,
- 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 118, 100,
- 188, 118, 100, 188, 114, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
- 188, 114, 92, 188, 122, 100, 172, 106, 84, 172, 106, 84, 180, 110, 84,
- 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84, 180, 110, 84,
- 180, 114, 92, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
- 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84,
- 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
- 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 106, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 114, 92,
- 180, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
- 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
- 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 106, 84, 172, 102, 76,
- 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 84,
- 164, 98, 76, 172, 106, 76, 172, 102, 84, 164, 98, 76, 172, 102, 76,
- 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
- 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 98, 76,
- 164, 102, 84, 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76,
- 172, 106, 84, 172, 106, 84, 172, 98, 76, 172, 102, 76, 172, 106, 84,
- 172, 106, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84, 156, 94, 68,
- 164, 90, 68, 172, 106, 84, 180, 110, 84, 164, 102, 84, 164, 98, 76,
- 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 172, 106, 84, 172, 106, 84, 164, 98, 76,
- 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
- 164, 98, 84, 172, 102, 84, 172, 98, 76, 164, 98, 76, 164, 94, 76,
- 164, 98, 76, 172, 102, 84, 164, 98, 84, 164, 94, 76, 164, 94, 76,
- 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
- 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
- 172, 102, 76, 164, 102, 84, 164, 102, 76, 172, 102, 84, 164, 102, 76,
- 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 84,
- 164, 102, 76, 164, 102, 84, 172, 98, 84, 164, 102, 84, 164, 98, 76,
- 164, 102, 84, 156, 98, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
- 172, 98, 84, 172, 98, 84, 164, 90, 76, 172, 106, 92, 164, 106, 92,
- 132, 70, 60, 116, 62, 44, 116, 58, 44, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 156, 90, 68, 156, 90, 68, 164, 98, 76, 164, 102, 84,
- 164, 98, 76, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 92, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
- 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 110, 92,
- 172, 106, 84, 164, 98, 76, 180, 110, 92, 180, 110, 92, 180, 114, 92,
- 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
- 180, 114, 92, 188, 118, 92, 188, 118, 100, 180, 110, 84, 180, 110, 92,
- 188, 118, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
- 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 180, 110, 92,
- 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
- 180, 110, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84, 180, 110, 92,
- 180, 110, 84, 180, 118, 100, 188, 114, 92, 180, 114, 92, 180, 110, 92,
- 188, 122, 100, 188, 118, 92, 180, 114, 100, 180, 114, 84, 180, 110, 92,
- 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84,
- 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
- 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
- 172, 102, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 110, 84,
- 180, 110, 84, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 110, 84, 180, 114, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
- 180, 110, 84, 172, 102, 76, 172, 102, 76, 172, 102, 76, 164, 94, 76,
- 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
- 180, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
- 180, 110, 84, 180, 110, 92, 172, 106, 76, 172, 102, 84, 172, 106, 84,
- 172, 106, 84, 172, 102, 76, 164, 102, 76, 180, 106, 84, 164, 98, 76,
- 164, 102, 76, 180, 110, 84, 172, 110, 84, 164, 94, 76, 156, 94, 68,
- 172, 102, 84, 172, 106, 84, 172, 106, 92, 164, 102, 84, 164, 98, 76,
- 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 84,
- 156, 90, 68, 164, 102, 84, 164, 102, 84, 156, 86, 68, 148, 86, 68,
- 172, 102, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
- 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
- 164, 98, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 164, 94, 76,
- 172, 98, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68, 148, 90, 68,
- 156, 94, 76, 164, 94, 76, 164, 102, 84, 164, 102, 84, 164, 102, 84,
- 164, 98, 76, 164, 98, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
- 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 102, 76, 164, 98, 84,
- 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
- 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 94, 84,
- 164, 98, 84, 156, 94, 76, 164, 106, 92, 164, 102, 92, 124, 66, 52,
- 116, 58, 44, 116, 58, 36, 164, 106, 92, 172, 106, 84, 164, 106, 84,
- 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 84,
- 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, 172, 106, 92,
- 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
- 172, 110, 92, 180, 110, 92, 188, 118, 92, 188, 118, 100, 180, 114, 100,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100,
- 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
- 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
- 180, 106, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100, 180, 110, 92,
- 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
- 172, 106, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100, 188, 118, 100,
- 180, 118, 92, 188, 114, 100, 180, 118, 92, 188, 118, 100, 188, 118, 100,
- 188, 118, 100, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
- 188, 118, 100, 180, 114, 92, 188, 114, 92, 180, 114, 100, 180, 114, 92,
- 180, 110, 92, 172, 106, 84, 188, 118, 92, 180, 114, 92, 172, 110, 84,
- 172, 110, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84,
- 172, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
- 172, 102, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 84, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
- 180, 110, 84, 172, 106, 84, 172, 106, 76, 172, 102, 84, 164, 102, 76,
- 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76,
- 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 172, 106, 84,
- 172, 106, 84, 172, 102, 84, 180, 106, 84, 172, 106, 84, 180, 106, 92,
- 172, 106, 84, 180, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, 172, 98, 76,
- 164, 102, 76, 172, 110, 84, 180, 118, 92, 172, 106, 84, 172, 110, 84,
- 172, 102, 84, 172, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 68, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76,
- 164, 98, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 84, 164, 106, 84, 164, 98, 76, 164, 98, 76, 156, 94, 76,
- 156, 94, 76, 164, 94, 76, 164, 98, 76, 172, 102, 84, 164, 102, 84,
- 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76,
- 164, 102, 76, 164, 94, 76, 156, 94, 76, 148, 86, 68, 164, 94, 76,
- 164, 102, 84, 164, 102, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
- 164, 94, 84, 164, 90, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84,
- 164, 94, 76, 164, 94, 76, 172, 102, 84, 164, 98, 76, 172, 98, 84,
- 164, 98, 84, 172, 110, 92, 164, 102, 84, 124, 66, 52, 116, 58, 36,
- 108, 46, 28, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
- 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84, 172, 110, 92,
- 180, 114, 92, 180, 118, 100, 180, 110, 92, 172, 106, 84, 180, 110, 92,
- 180, 110, 92, 180, 114, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92,
- 180, 114, 100, 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
- 180, 110, 92, 172, 106, 92, 180, 106, 84, 180, 114, 92, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
- 180, 110, 92, 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 106, 84,
- 180, 106, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 84,
- 180, 106, 92, 180, 114, 92, 188, 118, 100, 188, 118, 100, 180, 114, 92,
- 180, 110, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 180, 118, 100,
- 188, 118, 100, 188, 118, 100, 188, 118, 100, 196, 126, 108, 188, 122, 100,
- 188, 118, 100, 188, 118, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
- 180, 114, 92, 188, 118, 100, 180, 118, 92, 180, 110, 84, 180, 110, 92,
- 180, 114, 84, 180, 114, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92,
- 180, 110, 84, 180, 110, 92, 180, 110, 92, 188, 114, 84, 180, 110, 92,
- 180, 110, 84, 188, 114, 92, 188, 114, 92, 180, 118, 92, 188, 118, 100,
- 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 118, 92,
- 180, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
- 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 102, 84,
- 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
- 164, 98, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
- 172, 106, 84, 172, 110, 92, 180, 106, 92, 172, 110, 92, 180, 110, 84,
- 172, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84, 172, 106, 84,
- 180, 114, 84, 180, 118, 92, 180, 110, 84, 172, 110, 84, 172, 110, 84,
- 172, 106, 84, 164, 102, 76, 172, 102, 76, 164, 102, 76, 164, 102, 84,
- 172, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
- 164, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84, 164, 98, 76,
- 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
- 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
- 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
- 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 102, 84, 164, 98, 84,
- 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 102, 84, 172, 106, 84,
- 172, 110, 92, 172, 102, 84, 164, 102, 76, 172, 102, 84, 164, 106, 84,
- 164, 98, 84, 164, 98, 76, 164, 98, 84, 156, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 84, 164, 98, 84, 164, 94, 76,
- 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84, 164, 98, 84,
- 164, 94, 76, 156, 94, 84, 156, 94, 76, 156, 94, 76, 156, 90, 76,
- 164, 98, 84, 156, 90, 76, 116, 54, 36, 108, 46, 28, 116, 54, 36,
- 172, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
- 172, 106, 92, 164, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 188, 114, 100, 180, 114, 92, 180, 110, 92,
- 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 92,
- 172, 110, 84, 172, 106, 92, 180, 110, 84, 180, 110, 92, 180, 110, 92,
- 180, 110, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84, 180, 114, 92,
- 180, 114, 100, 180, 114, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84,
- 172, 106, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 172, 106, 84,
- 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
- 180, 114, 92, 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92,
- 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84,
- 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 110, 92, 172, 110, 84,
- 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 110, 84, 172, 110, 84,
- 180, 110, 92, 180, 114, 84, 172, 110, 84, 172, 102, 84, 172, 106, 76,
- 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 84,
- 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 92, 180, 110, 84,
- 180, 110, 92, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
- 172, 106, 84, 164, 102, 84, 172, 102, 76, 164, 102, 76, 172, 102, 84,
- 172, 106, 76, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 106, 84,
- 180, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84, 172, 102, 84,
- 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
- 180, 106, 84, 172, 106, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
- 172, 114, 92, 180, 110, 84, 172, 114, 92, 180, 110, 84, 172, 114, 92,
- 180, 110, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
- 164, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 164, 98, 76,
- 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 164, 98, 76,
- 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76,
- 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76, 164, 98, 76,
- 164, 102, 84, 164, 102, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76,
- 156, 94, 68, 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
- 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 156, 94, 76, 156, 86, 68, 156, 94, 68, 164, 98, 76, 164, 98, 76,
- 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 98, 76,
- 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 156, 94, 76,
- 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 76,
- 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 94, 76,
- 164, 98, 84, 164, 94, 76, 164, 98, 84, 156, 94, 76, 164, 102, 84,
- 156, 94, 76, 116, 58, 36, 116, 54, 36, 116, 58, 36, 180, 114, 100,
- 180, 118, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
- 180, 110, 92, 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
- 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 100,
- 180, 114, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 188, 122, 100,
- 196, 126, 108, 188, 122, 108, 196, 126, 100, 188, 122, 108, 188, 122, 100,
- 188, 118, 100, 180, 118, 100, 188, 114, 100, 180, 118, 100, 188, 118, 100,
- 188, 118, 100, 196, 126, 108, 188, 126, 100, 196, 126, 108, 188, 122, 100,
- 180, 114, 100, 180, 114, 92, 188, 122, 100, 196, 122, 108, 196, 126, 108,
- 196, 126, 100, 188, 118, 100, 180, 114, 100, 188, 114, 92, 180, 118, 100,
- 188, 122, 100, 188, 118, 100, 188, 114, 100, 188, 118, 100, 188, 122, 100,
- 196, 122, 108, 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 130, 108,
- 196, 130, 116, 196, 130, 108, 196, 126, 108, 188, 118, 100, 180, 114, 100,
- 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
- 172, 106, 84, 180, 106, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92,
- 180, 118, 92, 180, 118, 92, 180, 118, 92, 188, 118, 92, 180, 118, 92,
- 180, 118, 92, 188, 118, 100, 180, 114, 84, 180, 110, 92, 188, 114, 92,
- 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
- 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84,
- 180, 110, 92, 180, 110, 84, 180, 110, 84, 188, 118, 92, 180, 114, 92,
- 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
- 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 122, 108,
- 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 114, 92,
- 180, 114, 92, 180, 114, 100, 188, 114, 92, 180, 118, 100, 188, 118, 100,
- 188, 118, 100, 188, 118, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
- 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 180, 118, 92,
- 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 76,
- 164, 102, 76, 164, 102, 84, 172, 102, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 76, 164, 102, 84, 164, 98, 76, 164, 102, 76, 164, 98, 76,
- 156, 98, 76, 164, 98, 84, 164, 98, 76, 156, 94, 76, 164, 94, 68,
- 156, 94, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 84, 164, 98, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
- 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
- 156, 98, 76, 164, 98, 76, 164, 98, 84, 156, 98, 76, 156, 94, 68,
- 164, 94, 76, 164, 98, 76, 164, 102, 84, 164, 102, 84, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 68,
- 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 68,
- 156, 94, 76, 172, 98, 84, 164, 98, 84, 172, 98, 76, 164, 94, 84,
- 172, 98, 84, 164, 98, 84, 164, 98, 84, 172, 98, 84, 164, 98, 84,
- 164, 98, 84, 164, 106, 84, 164, 102, 84, 172, 110, 92, 164, 98, 84,
- 124, 66, 44, 116, 58, 36, 116, 50, 36, 172, 106, 84, 164, 102, 84,
- 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
- 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 106, 84, 172, 102, 84,
- 164, 102, 76, 172, 102, 84, 164, 102, 84, 172, 106, 84, 172, 102, 84,
- 180, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
- 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
- 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92,
- 180, 118, 92, 180, 114, 100, 180, 110, 92, 180, 110, 92, 180, 106, 92,
- 172, 102, 84, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
- 180, 110, 92, 180, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
- 172, 110, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
- 180, 110, 92, 180, 110, 92, 180, 110, 92, 188, 114, 100, 188, 122, 100,
- 188, 118, 100, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 76,
- 172, 102, 84, 172, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84,
- 172, 106, 84, 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
- 172, 106, 84, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 106, 84,
- 172, 110, 92, 180, 110, 84, 172, 110, 92, 180, 110, 84, 180, 110, 92,
- 180, 114, 92, 180, 114, 92, 188, 114, 92, 188, 114, 92, 180, 110, 92,
- 180, 110, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84,
- 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 106, 84, 172, 106, 84,
- 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
- 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100,
- 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 102, 84,
- 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84, 172, 110, 92,
- 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
- 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84, 172, 106, 92,
- 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 84, 164, 102, 76,
- 164, 98, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
- 172, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 84, 164, 98, 76,
- 172, 102, 76, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 164, 94, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 84, 172, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
- 164, 98, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 94, 76,
- 156, 94, 76, 164, 94, 68, 164, 94, 76, 164, 94, 76, 156, 94, 76,
- 164, 94, 76, 164, 90, 76, 156, 94, 76, 164, 94, 76, 164, 94, 76,
- 156, 94, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
- 164, 102, 84, 164, 102, 84, 172, 106, 92, 156, 94, 76, 124, 62, 44,
- 116, 50, 36, 108, 50, 28, 156, 86, 68, 156, 90, 68, 148, 86, 68,
- 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 86, 68, 148, 90, 68,
- 156, 90, 68, 156, 90, 76, 156, 94, 76, 156, 90, 68, 148, 86, 68,
- 156, 86, 68, 156, 90, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68,
- 156, 90, 68, 164, 90, 76, 156, 90, 68, 156, 90, 76, 164, 90, 68,
- 156, 90, 76, 164, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
- 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 86, 76,
- 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 90, 68,
- 164, 90, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
- 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
- 156, 90, 68, 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 76,
- 156, 90, 68, 148, 86, 68, 156, 86, 68, 164, 94, 76, 164, 94, 76,
- 156, 90, 68, 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
- 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
- 156, 90, 68, 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
- 164, 94, 76, 156, 94, 68, 156, 90, 68, 156, 94, 68, 164, 94, 68,
- 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
- 164, 90, 76, 164, 90, 68, 164, 90, 76, 164, 94, 76, 156, 94, 68,
- 164, 94, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 164, 94, 76,
- 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
- 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68, 156, 90, 76,
- 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 68, 156, 90, 76,
- 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 86, 68,
- 164, 90, 76, 156, 90, 68, 164, 90, 76, 156, 94, 68, 164, 94, 76,
- 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 94, 76,
- 156, 94, 76, 156, 90, 76, 148, 86, 68, 164, 98, 84, 164, 98, 76,
- 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
- 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 94, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 164, 98, 76,
- 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
- 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
- 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 84,
- 156, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
- 164, 98, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68, 156, 90, 68,
- 156, 94, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 148, 90, 68,
- 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 90, 68, 156, 94, 76,
- 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 68, 156, 82, 68,
- 156, 86, 76, 156, 90, 76, 156, 86, 76, 148, 86, 68, 156, 86, 68,
- 156, 86, 76, 156, 90, 68, 156, 94, 76, 164, 94, 84, 164, 98, 84,
- 156, 94, 76, 156, 98, 76, 148, 86, 68, 116, 54, 36, 108, 50, 28,
- 108, 50, 36, 140, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
- 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60,
- 148, 82, 60, 148, 82, 60, 148, 78, 60, 140, 74, 52, 140, 74, 52,
- 140, 78, 60, 148, 82, 60, 140, 70, 52, 140, 74, 52, 148, 74, 60,
- 140, 78, 60, 148, 74, 60, 140, 74, 52, 140, 74, 52, 140, 78, 60,
- 140, 74, 52, 148, 78, 60, 140, 74, 60, 148, 78, 60, 148, 74, 60,
- 148, 78, 60, 148, 74, 60, 148, 78, 60, 140, 70, 52, 140, 70, 52,
- 148, 74, 60, 140, 74, 60, 148, 78, 60, 148, 78, 68, 140, 78, 60,
- 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60, 148, 74, 60,
- 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
- 148, 74, 60, 148, 78, 60, 140, 78, 60, 148, 74, 60, 140, 74, 52,
- 140, 70, 52, 140, 74, 52, 140, 78, 60, 148, 78, 60, 148, 78, 60,
- 148, 78, 60, 148, 78, 60, 148, 82, 60, 140, 74, 52, 140, 74, 52,
- 140, 78, 60, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
- 140, 78, 60, 140, 82, 60, 148, 82, 60, 148, 86, 68, 148, 86, 60,
- 140, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 70, 52,
- 140, 70, 52, 140, 74, 52, 140, 70, 52, 140, 74, 52, 140, 70, 52,
- 140, 74, 52, 140, 74, 52, 140, 78, 60, 148, 74, 60, 140, 74, 52,
- 140, 74, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60, 148, 78, 60,
- 156, 82, 60, 148, 82, 68, 156, 82, 60, 148, 82, 68, 148, 82, 60,
- 156, 82, 68, 148, 82, 60, 148, 82, 68, 148, 82, 60, 148, 82, 60,
- 148, 82, 60, 148, 82, 68, 148, 78, 60, 156, 82, 60, 148, 82, 68,
- 148, 82, 60, 156, 82, 60, 148, 82, 60, 156, 82, 68, 148, 82, 60,
- 156, 86, 68, 148, 82, 60, 156, 82, 68, 148, 82, 60, 148, 82, 68,
- 148, 82, 68, 148, 82, 68, 148, 86, 68, 148, 82, 68, 156, 86, 68,
- 148, 82, 68, 148, 82, 60, 148, 82, 68, 140, 78, 60, 148, 78, 68,
- 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
- 148, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
- 140, 78, 60, 148, 78, 60, 148, 82, 60, 140, 78, 60, 148, 78, 60,
- 140, 78, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 78, 60,
- 148, 82, 60, 140, 74, 52, 140, 78, 60, 148, 78, 60, 140, 78, 60,
- 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
- 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60, 148, 82, 60,
- 148, 78, 60, 140, 78, 60, 148, 86, 60, 148, 82, 68, 148, 82, 60,
- 148, 82, 60, 140, 78, 60, 148, 82, 60, 148, 78, 60, 148, 78, 60,
- 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
- 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 82, 68, 148, 82, 68,
- 148, 86, 68, 156, 82, 68, 148, 82, 68, 148, 82, 68, 148, 82, 68,
- 148, 86, 68, 148, 82, 68, 148, 78, 60, 140, 82, 60, 140, 74, 60,
- 140, 78, 60, 140, 74, 60, 116, 50, 36, 108, 50, 36, 108, 50, 28,
- 108, 42, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 116, 46, 28,
- 108, 42, 20, 116, 46, 28, 108, 42, 20, 108, 46, 28, 108, 46, 28,
- 116, 46, 28, 108, 46, 20, 108, 42, 20, 100, 42, 20, 108, 42, 20,
- 108, 42, 28, 108, 42, 20, 116, 46, 28, 116, 46, 28, 116, 46, 28,
- 108, 42, 20, 108, 38, 20, 108, 42, 28, 116, 42, 28, 108, 42, 20,
- 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 50, 28, 108, 46, 28,
- 116, 46, 28, 108, 42, 20, 108, 42, 28, 116, 42, 28, 108, 46, 28,
- 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 42, 28, 108, 42, 20,
- 116, 46, 28, 108, 42, 20, 116, 46, 28, 108, 46, 28, 108, 42, 20,
- 116, 42, 28, 108, 38, 20, 108, 42, 28, 116, 46, 28, 108, 46, 28,
- 116, 46, 28, 108, 42, 20, 108, 42, 20, 116, 42, 28, 116, 46, 28,
- 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 46, 28, 116, 46, 28,
- 116, 46, 28, 116, 50, 28, 116, 46, 28, 116, 50, 36, 124, 50, 36,
- 116, 50, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28,
- 108, 46, 20, 108, 50, 28, 116, 50, 28, 116, 54, 28, 108, 46, 28,
- 108, 46, 20, 108, 42, 20, 108, 42, 20, 116, 50, 28, 116, 46, 28,
- 116, 46, 28, 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 46, 28,
- 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 42, 28,
- 116, 46, 28, 116, 46, 28, 116, 50, 28, 124, 50, 36, 124, 58, 36,
- 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
- 124, 58, 36, 124, 54, 36, 132, 62, 44, 124, 54, 36, 124, 58, 36,
- 124, 58, 36, 124, 58, 36, 124, 54, 44, 124, 58, 36, 132, 62, 44,
- 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
- 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
- 124, 58, 44, 124, 54, 36, 124, 58, 44, 124, 58, 36, 124, 58, 44,
- 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44, 124, 58, 44,
- 124, 58, 44, 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44,
- 124, 62, 44, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 62, 44,
- 124, 62, 44, 132, 62, 44, 116, 58, 36, 124, 58, 36, 124, 58, 44,
- 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 58, 36,
- 124, 62, 44, 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44,
- 132, 62, 44, 124, 66, 44, 132, 62, 44, 124, 62, 44, 124, 58, 36,
- 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44, 124, 62, 44,
- 124, 58, 36, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 58, 44,
- 124, 58, 36, 124, 58, 36, 116, 58, 36, 124, 58, 36, 124, 58, 36,
- 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
- 124, 58, 36, 124, 58, 36, 124, 50, 36, 124, 54, 36, 124, 54, 36,
- 124, 54, 36, 116, 54, 36, 116, 50, 36, 124, 54, 36, 124, 54, 44,
- 124, 54, 36, 116, 54, 36, 116, 54, 36, 108, 46, 28, 124, 58, 44,
- 124, 58, 44, 100, 42, 20, 108, 50, 28
-};
diff --git a/hacks/glx/endgame.c b/hacks/glx/endgame.c
deleted file mode 100644
index 724af95..0000000
--- a/hacks/glx/endgame.c
+++ /dev/null
@@ -1,983 +0,0 @@
-/*
- * endgame.c
- * plays through a chess game ending. enjoy.
- *
- * version 1.0 - June 6, 2002
- *
- * Copyright (C) 2002-2008 Blair Tennessy (tennessb@unbc.ca)
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_chess 0
-# include "xlockmore.h"
-
-#else
-# include "xlock.h"
-#endif
-
-#ifdef USE_GL
-
-#define BOARDSIZE 8
-#define WHITES 5
-
-#include "gltrackball.h"
-#include "chessmodels.h"
-#include "chessgames.h"
-
-#define DEF_ROTATE "True"
-#define DEF_REFLECTIONS "True"
-#define DEF_SHADOWS "True"
-#define DEF_SMOOTH "True"
-#define DEF_CLASSIC "False"
-
-
-static XrmOptionDescRec opts[] = {
- {"+rotate", ".chess.rotate", XrmoptionNoArg, "false" },
- {"-rotate", ".chess.rotate", XrmoptionNoArg, "true" },
- {"+reflections", ".chess.reflections", XrmoptionNoArg, "false" },
- {"-reflections", ".chess.reflections", XrmoptionNoArg, "true" },
- {"+shadows", ".chess.shadows", XrmoptionNoArg, "false" },
- {"-shadows", ".chess.shadows", XrmoptionNoArg, "true" },
- {"+smooth", ".chess.smooth", XrmoptionNoArg, "false" },
- {"-smooth", ".chess.smooth", XrmoptionNoArg, "true" },
- {"+classic", ".chess.classic", XrmoptionNoArg, "false" },
- {"-classic", ".chess.classic", XrmoptionNoArg, "true" },
-};
-
-static int rotate, reflections, smooth, shadows, classic;
-
-static argtype vars[] = {
- {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
- {&reflections, "reflections", "Reflections", DEF_REFLECTIONS, t_Bool},
- {&shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
- {&smooth, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
- {&classic, "classic", "Classic", DEF_CLASSIC, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt chess_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct chess_description =
-{"chess", "init_chess", "draw_chess", NULL,
- "draw_chess", "init_chess", NULL, &chess_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Chess", 0, NULL};
-
-#endif
-
-#define checkImageWidth 16
-#define checkImageHeight 16
-
-typedef struct {
- GLXContext *glx_context;
- Window window;
- trackball_state *trackball;
- Bool button_down_p;
-
- ChessGame game;
- int oldwhite;
-
- /** definition of white/black (orange/gray) colors */
- GLfloat colors[2][3];
-
- GLubyte checkImage[checkImageWidth][checkImageHeight][3];
- GLuint piecetexture, boardtexture;
-
- int mpiece, tpiece, steps, done;
- double from[2], to[2];
- double dx, dz;
- int moving, take, mc, count, wire;
- double theta;
-
- GLfloat position[4];
- GLfloat position2[4];
-
- GLfloat mod;
-
- GLfloat ground[4];
-
- int oldgame;
-
- int poly_counts[PIECES]; /* polygon count of each type of piece */
-
-
-} Chesscreen;
-
-static Chesscreen *qs = NULL;
-
-static const GLfloat MaterialShadow[] = {0.0, 0.0, 0.0, 0.3};
-
-
-/* i prefer silvertip */
-static const GLfloat whites[WHITES][3] =
- {
- {1.0, 0.55, 0.1},
- {0.8, 0.52, 0.8},
- {0.43, 0.54, 0.76},
- {0.2, 0.2, 0.2},
- {0.35, 0.60, 0.35},
- };
-
-static void build_colors(Chesscreen *cs)
-{
-
- /* find new white */
- int newwhite = cs->oldwhite;
- while(newwhite == cs->oldwhite)
- newwhite = random()%WHITES;
- cs->oldwhite = newwhite;
-
- cs->colors[0][0] = whites[cs->oldwhite][0];
- cs->colors[0][1] = whites[cs->oldwhite][1];
- cs->colors[0][2] = whites[cs->oldwhite][2];
-}
-
-/* build piece texture */
-static void make_piece_texture(Chesscreen *cs)
-{
- int i, j, c;
-
- for (i = 0; i < checkImageWidth; i++) {
- for (j = 0; j < checkImageHeight; j++) {
- c = ((j%2) == 0 || i%2 == 0) ? 240 : 180+random()%16;
- cs->checkImage[i][j][0] = (GLubyte) c;
- cs->checkImage[i][j][1] = (GLubyte) c;
- cs->checkImage[i][j][2] = (GLubyte) c;
- }
- }
-
- glGenTextures(1, &cs->piecetexture);
- glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
-
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
- checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
- &cs->checkImage[0][0]);
-}
-
-/* build board texture (uniform noise in [180,180+50]) */
-static void make_board_texture(Chesscreen *cs)
-{
- int i, j, c;
-
- for (i = 0; i < checkImageWidth; i++) {
- for (j = 0; j < checkImageHeight; j++) {
- c = 180 + random()%51;
- cs->checkImage[i][j][0] = (GLubyte) c;
- cs->checkImage[i][j][1] = (GLubyte) c;
- cs->checkImage[i][j][2] = (GLubyte) c;
- }
- }
-
- glGenTextures(1, &cs->boardtexture);
- glBindTexture(GL_TEXTURE_2D, cs->boardtexture);
-
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
- checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
- &cs->checkImage[0][0]);
-}
-
-/** handle X event (trackball) */
-ENTRYPOINT Bool chess_handle_event (ModeInfo *mi, XEvent *event)
-{
- Chesscreen *cs = &qs[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, cs->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &cs->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- cs->done = 1;
- return True;
- }
-
- return False;
-}
-
-static const GLfloat diffuse2[] = {1.0, 1.0, 1.0, 1.0};
-/*static const GLfloat ambient2[] = {0.7, 0.7, 0.7, 1.0};*/
-static const GLfloat shininess[] = {60.0};
-static const GLfloat specular[] = {0.4, 0.4, 0.4, 1.0};
-
-/* configure lighting */
-static void setup_lights(Chesscreen *cs)
-{
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse2);
- glEnable(GL_LIGHT0);
-
-/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient2); */
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
-
- glLightfv(GL_LIGHT1, GL_SPECULAR, diffuse2);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2);
- glEnable(GL_LIGHT1);
-}
-
-/* draw pieces */
-static void drawPieces(ModeInfo *mi, Chesscreen *cs)
-{
- int i, j;
-
- for(i = 0; i < BOARDSIZE; ++i) {
- for(j = 0; j < BOARDSIZE; ++j) {
- if(cs->game.board[i][j]) {
- int c = cs->game.board[i][j]/PIECES;
- glColor3fv(cs->colors[c]);
- glCallList(cs->game.board[i][j]%PIECES);
- mi->polygon_count += cs->poly_counts[cs->game.board[i][j]%PIECES];
- }
-
- glTranslatef(1.0, 0.0, 0.0);
- }
-
- glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
- }
-
- glTranslatef(0.0, 0.0, -1.0*BOARDSIZE);
-}
-
-/* draw pieces */
-static void drawPiecesShadow(ModeInfo *mi, Chesscreen *cs)
-{
- int i, j;
-
- for(i = 0; i < BOARDSIZE; ++i) {
- for(j = 0; j < BOARDSIZE; ++j) {
- if(cs->game.board[i][j]) {
- glColor4f(0.0, 0.0, 0.0, 0.4);
- glCallList(cs->game.board[i][j]%PIECES);
- mi->polygon_count += cs->poly_counts[cs->game.board[i][j]%PIECES];
- }
-
- glTranslatef(1.0, 0.0, 0.0);
- }
-
- glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
- }
-
- glTranslatef(0.0, 0.0, -1.0*BOARDSIZE);
-}
-
-/* draw a moving piece */
-static void drawMovingPiece(ModeInfo *mi, Chesscreen *cs, int shadow)
-{
- int piece = cs->mpiece % PIECES;
-
- if (piece == NONE) return;
-
- glPushMatrix();
-
- if(shadow) glColor4fv(MaterialShadow);
- else glColor3fv(cs->colors[cs->mpiece/PIECES]);
-
- /** assume a queening. should be more general */
- if((cs->mpiece == PAWN && fabs(cs->to[0]) < 0.01) ||
- (cs->mpiece == BPAWN && fabs(cs->to[0]-7.0) < 0.01)) {
- glTranslatef(cs->from[1]+cs->steps*cs->dx, 0.0, cs->from[0]+cs->steps*cs->dz);
-
- glColor4f(shadow ? MaterialShadow[0] : cs->colors[cs->mpiece/7][0],
- shadow ? MaterialShadow[1] : cs->colors[cs->mpiece/7][1],
- shadow ? MaterialShadow[2] : cs->colors[cs->mpiece/7][2],
- (fabs(50.0-cs->steps))/50.0);
-
- piece = cs->steps < 50 ? PAWN : QUEEN;
-
- /* what a kludge */
- if(cs->steps == 99)
- cs->mpiece = cs->mpiece == PAWN ? QUEEN : BQUEEN;
- }
- else if(cs->mpiece % PIECES == KNIGHT) {
- /* If there is nothing in the path of a knight, move it by sliding,
- just like the other pieces. But if there are any pieces on the
- middle two squares in its path, the knight would intersect them,
- so in that case, move it in an airborne arc. */
- GLfloat y;
- int i, j;
- Bool blocked_p = False;
- int fromx = MIN(cs->from[1], cs->to[1]);
- int fromy = MIN(cs->from[0], cs->to[0]);
- int tox = MAX(cs->from[1], cs->to[1]);
- int toy = MAX(cs->from[0], cs->to[0]);
- if (fromx == tox-2) fromx = tox = fromx+1;
- if (fromy == toy-2) fromy = toy = fromy+1;
- for (i = fromy; i <= toy; i++) {
- for (j = fromx; j <= tox; j++) {
- if (cs->game.board[i][j]) {
- blocked_p = True;
- break;
- }
- }
- }
-
- if (!blocked_p)
- goto SLIDE;
-
- /* Move by hopping. */
- y = 1.5 * sin (M_PI * cs->steps / 100.0);
- glTranslatef(cs->from[1]+cs->steps*cs->dx, y,
- cs->from[0]+cs->steps*cs->dz);
-
- } else {
- SLIDE:
- /* Move by sliding. */
- glTranslatef(cs->from[1]+cs->steps*cs->dx, 0.0, cs->from[0]+cs->steps*cs->dz);
- }
-
-
- if(!cs->wire)
- glEnable(GL_BLEND);
-
- glCallList(piece);
- mi->polygon_count += cs->poly_counts[cs->mpiece % PIECES];
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
-
- glPopMatrix();
-
- if(!cs->wire)
- glDisable(GL_BLEND);
-}
-
-/** code to squish a taken piece */
-static void drawTakePiece(ModeInfo *mi, Chesscreen *cs, int shadow)
-{
- if(!cs->wire)
- glEnable(GL_BLEND);
-
- glColor4f(shadow ? MaterialShadow[0] : cs->colors[cs->tpiece/7][0],
- shadow ? MaterialShadow[1] : cs->colors[cs->tpiece/7][1],
- shadow ? MaterialShadow[2] : cs->colors[cs->tpiece/7][2],
- (100-1.6*cs->steps)/100.0);
-
- glTranslatef(cs->to[1], 0.0, cs->to[0]);
-
- if(cs->mpiece % PIECES == KNIGHT)
- glScalef(1.0+cs->steps/100.0, 1.0, 1.0+cs->steps/100.0);
- else
- glScalef(1.0, 1 - cs->steps/50.0 > 0.01 ? 1 - cs->steps/50.0 : 0.01, 1.0);
- glCallList(cs->tpiece % 7);
- mi->polygon_count += cs->poly_counts[cs->tpiece % PIECES];
-
- if(!cs->wire)
- glDisable(GL_BLEND);
-}
-
-/** draw board */
-static void drawBoard(ModeInfo *mi, Chesscreen *cs)
-{
- int i, j;
-
- glBegin(GL_QUADS);
-
- for(i = 0; i < BOARDSIZE; ++i)
- for(j = 0; j < BOARDSIZE; ++j) {
- double ma1 = (i+j)%2 == 0 ? cs->mod*i : 0.0;
- double mb1 = (i+j)%2 == 0 ? cs->mod*j : 0.0;
- double ma2 = (i+j)%2 == 0 ? cs->mod*(i+1.0) : 0.01;
- double mb2 = (i+j)%2 == 0 ? cs->mod*(j+1.0) : 0.01;
-
- /*glColor3fv(colors[(i+j)%2]);*/
- glColor4f(cs->colors[(i+j)%2][0], cs->colors[(i+j)%2][1],
- cs->colors[(i+j)%2][2], 0.65);
-
- glNormal3f(0.0, 1.0, 0.0);
-/* glTexCoord2f(mod*i, mod*(j+1.0)); */
- glTexCoord2f(ma1, mb2);
- glVertex3f(i, 0.0, j + 1.0);
-/* glTexCoord2f(mod*(i+1.0), mod*(j+1.0)); */
- glTexCoord2f(ma2, mb2);
- glVertex3f(i + 1.0, 0.0, j + 1.0);
- glTexCoord2f(ma2, mb1);
-/* glTexCoord2f(mod*(i+1.0), mod*j); */
- glVertex3f(i + 1.0, 0.0, j);
- glTexCoord2f(ma1, mb1);
-/* glTexCoord2f(mod*i, mod*j); */
- glVertex3f(i, 0.0, j);
-
- mi->polygon_count++;
- }
- glEnd();
-
- {
- GLfloat off = 0.01;
- GLfloat w = BOARDSIZE;
- GLfloat h = 0.1;
-
- /* Give the board a slight lip. */
- /* #### oops, normals are wrong here, but you can't tell */
-
- glColor3f(0.3, 0.3, 0.3);
- glBegin (GL_QUADS);
- glVertex3f (0, 0, 0);
- glVertex3f (0, -h, 0);
- glVertex3f (0, -h, w);
- glVertex3f (0, 0, w);
-
- glVertex3f (0, 0, w);
- glVertex3f (0, -h, w);
- glVertex3f (w, -h, w);
- glVertex3f (w, 0, w);
-
- glVertex3f (w, 0, w);
- glVertex3f (w, -h, w);
- glVertex3f (w, -h, 0);
- glVertex3f (w, 0, 0);
-
- glVertex3f (w, 0, 0);
- glVertex3f (w, -h, 0);
- glVertex3f (0, -h, 0);
- glVertex3f (0, 0, 0);
-
- glVertex3f (0, -h, 0);
- glVertex3f (w, -h, 0);
- glVertex3f (w, -h, w);
- glVertex3f (0, -h, w);
- glEnd();
- mi->polygon_count += 4;
-
- /* Fill in the underside of the board with an invisible black box
- to hide the reflections that are not on tiles. Probably there's
- a way to do this with stencils instead.
- */
- w -= off*2;
- h = 5;
-
- glPushMatrix();
- glTranslatef (off, 0, off);
- glDisable(GL_LIGHTING);
- glColor3f(0,0,0);
- glBegin (GL_QUADS);
- glVertex3f (0, 0, 0);
- glVertex3f (0, -h, 0);
- glVertex3f (0, -h, w);
- glVertex3f (0, 0, w);
-
- glVertex3f (0, 0, w);
- glVertex3f (0, -h, w);
- glVertex3f (w, -h, w);
- glVertex3f (w, 0, w);
-
- glVertex3f (w, 0, w);
- glVertex3f (w, -h, w);
- glVertex3f (w, -h, 0);
- glVertex3f (w, 0, 0);
-
- glVertex3f (w, 0, 0);
- glVertex3f (w, -h, 0);
- glVertex3f (0, -h, 0);
- glVertex3f (0, 0, 0);
-
- glVertex3f (0, -h, 0);
- glVertex3f (w, -h, 0);
- glVertex3f (w, -h, w);
- glVertex3f (0, -h, w);
- glEnd();
- mi->polygon_count += 4;
- glPopMatrix();
- if (!cs->wire)
- glEnable(GL_LIGHTING);
- }
-}
-
-static void draw_pieces(ModeInfo *mi, Chesscreen *cs, int wire)
-{
- if (!cs->wire) {
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-
- glColor4f(0.5, 0.5, 0.5, 1.0);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
- }
-
- drawPieces(mi, cs);
- if(cs->moving) drawMovingPiece(mi, cs, 0);
- if(cs->take) drawTakePiece(mi, cs, 0);
- glDisable(GL_TEXTURE_2D);
-}
-
-static void draw_shadow_pieces(ModeInfo *mi, Chesscreen *cs, int wire)
-{
- if (!cs->wire) {
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- }
-
- /* use the stencil */
- glDisable(GL_LIGHTING);
- glDisable(GL_COLOR_MATERIAL);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
-
- glClear(GL_STENCIL_BUFFER_BIT);
- glColorMask(0,0,0,0);
- glEnable(GL_STENCIL_TEST);
-
- glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL);
- glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
-
-
- glPushMatrix();
- glTranslatef(0.0, 0.001, 0.0);
-
- /* draw the pieces */
- drawPiecesShadow(mi, cs);
- if(cs->moving) drawMovingPiece(mi, cs, shadows);
- if(cs->take) drawTakePiece(mi, cs, shadows);
-
- glPopMatrix();
-
-
- /* turn on drawing into colour buffer */
- glColorMask(1,1,1,1);
-
- /* programming with effect */
- glDisable(GL_LIGHTING);
- glDisable(GL_COLOR_MATERIAL);
- glDisable(GL_TEXTURE_2D);
-
- /* now draw the union of the shadows */
-
- /*
- <todo>
- want to keep alpha values (alpha is involved in transition
- effects of the active pieces).
- </todo>
- */
- glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFFL);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
-
- glEnable(GL_BLEND);
-
- glColor4fv(MaterialShadow);
-
- /* draw the board generously to fill the shadows */
- glBegin(GL_QUADS);
-
- glVertex3f(-1.0, 0.0, -1.0);
- glVertex3f(-1.0, 0.0, BOARDSIZE + 1.0);
- glVertex3f(1.0 + BOARDSIZE, 0.0, BOARDSIZE + 1.0);
- glVertex3f(1.0 + BOARDSIZE, 0.0, -1.0);
-
- glEnd();
-
- glDisable(GL_STENCIL_TEST);
-
- /* "pop" attributes */
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_COLOR_MATERIAL);
- glEnable(GL_LIGHTING);
- glEnable(GL_CULL_FACE);
-
-
-
-}
-
-enum {X, Y, Z, W};
-enum {A, B, C, D};
-
-/* create a matrix that will project the desired shadow */
-static void shadowmatrix(GLfloat shadowMat[4][4],
- GLfloat groundplane[4],
- GLfloat lightpos[4])
-{
- GLfloat dot;
-
- /* find dot product between light position vector and ground plane normal */
- dot = groundplane[X] * lightpos[X] +
- groundplane[Y] * lightpos[Y] +
- groundplane[Z] * lightpos[Z] +
- groundplane[W] * lightpos[W];
-
- shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
- shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
- shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
- shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
-
- shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
- shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
- shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
- shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
-
- shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
- shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
- shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
- shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
-
- shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
- shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
- shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
- shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
-}
-
-/** reflectionboard */
-static void draw_reflections(ModeInfo *mi, Chesscreen *cs)
-{
- int i, j;
-
- glEnable(GL_STENCIL_TEST);
- glStencilFunc(GL_ALWAYS, 1, 1);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- glColorMask(0,0,0,0);
- glDisable(GL_CULL_FACE);
-
- glDisable(GL_DEPTH_TEST);
- glBegin(GL_QUADS);
-
- /* only draw white squares */
- for(i = 0; i < BOARDSIZE; ++i) {
- for(j = (BOARDSIZE+i) % 2; j < BOARDSIZE; j += 2) {
- glVertex3f(i, 0.0, j + 1.0);
- glVertex3f(i + 1.0, 0.0, j + 1.0);
- glVertex3f(i + 1.0, 0.0, j);
- glVertex3f(i, 0.0, j);
- mi->polygon_count++;
- }
- }
- glEnd();
- glEnable(GL_DEPTH_TEST);
-
- glColorMask(1, 1, 1, 1);
- glStencilFunc(GL_EQUAL, 1, 1);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
-
- glPushMatrix();
- glScalef(1.0, -1.0, 1.0);
- glTranslatef(0.5, 0.0, 0.5);
-
- glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
- draw_pieces(mi, cs, cs->wire);
- glPopMatrix();
-
- glDisable(GL_STENCIL_TEST);
- glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
-
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glColorMask(1,1,1,1);
-}
-
-/** draws the scene */
-static void display(ModeInfo *mi, Chesscreen *cs)
-{
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-
- mi->polygon_count = 0;
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- /** setup perspectiv */
- glTranslatef(0.0, 0.0, -1.5*BOARDSIZE);
- glRotatef(30.0, 1.0, 0.0, 0.0);
- gltrackball_rotate (cs->trackball);
-
- if (rotate)
- glRotatef(cs->theta*100, 0.0, 1.0, 0.0);
- glTranslatef(-0.5*BOARDSIZE, 0.0, -0.5*BOARDSIZE);
-
-/* cs->position[0] = 4.0 + 1.0*-sin(cs->theta*100*M_PI/180.0); */
-/* cs->position[2] = 4.0 + 1.0* cos(cs->theta*100*M_PI/180.0); */
-/* cs->position[1] = 5.0; */
-
- /* this is the lone light that the shadow matrix is generated from */
- cs->position[0] = 1.0;
- cs->position[2] = 1.0;
- cs->position[1] = 16.0;
-
- cs->position2[0] = 4.0 + 8.0*-sin(cs->theta*100*M_PI/180.0);
- cs->position2[2] = 4.0 + 8.0* cos(cs->theta*100*M_PI/180.0);
-
- if (!cs->wire) {
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
- glLightfv(GL_LIGHT1, GL_POSITION, cs->position2);
- glEnable(GL_LIGHT0);
- }
-
- /** draw board, pieces */
- if(!cs->wire) {
- glEnable(GL_LIGHTING);
- glEnable(GL_COLOR_MATERIAL);
-
- if(reflections && !cs->wire) {
- draw_reflections(mi, cs);
- glEnable(GL_BLEND);
- }
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, cs->boardtexture);
- drawBoard(mi, cs);
- glDisable(GL_TEXTURE_2D);
-
- if(shadows) {
- /* render shadows */
- GLfloat m[4][4];
- shadowmatrix(m, cs->ground, cs->position);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
- glEnable(GL_BLEND);
- glDisable(GL_LIGHTING);
- glDisable(GL_DEPTH_TEST);
-
- /* display ant shadow */
- glPushMatrix();
- glTranslatef(0.0, 0.001, 0.0);
- glMultMatrixf(m[0]);
- glTranslatef(0.5, 0.01, 0.5);
- draw_shadow_pieces(mi, cs, cs->wire);
- glPopMatrix();
-
- glEnable(GL_LIGHTING);
- glDisable(GL_BLEND);
- glEnable(GL_DEPTH_TEST);
- }
-
- if(reflections)
- glDisable(GL_BLEND);
- }
- else
- drawBoard(mi, cs);
-
- glTranslatef(0.5, 0.0, 0.5);
- draw_pieces(mi, cs, cs->wire);
-
- if(!cs->wire) {
- glDisable(GL_COLOR_MATERIAL);
- glDisable(GL_LIGHTING);
- }
-
- if (!cs->button_down_p)
- cs->theta += .002;
-}
-
-/** reshape handler */
-ENTRYPOINT void reshape_chess(ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0,y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45, 1/h, 2.0, 30.0);
- glMatrixMode(GL_MODELVIEW);
-}
-
-/** initialization handler */
-ENTRYPOINT void init_chess(ModeInfo *mi)
-{
- Chesscreen *cs;
- int screen = MI_SCREEN(mi);
-
- MI_INIT(mi, qs);
-
- cs = &qs[screen];
- cs->window = MI_WINDOW(mi);
- cs->wire = MI_IS_WIREFRAME(mi);
- cs->trackball = gltrackball_init (False);
-
- cs->oldwhite = -1;
-
- cs->colors[0][0] = 1.0;
- cs->colors[0][1] = 0.5;
- cs->colors[0][2] = 0.0;
-
- cs->colors[1][0] = 0.6;
- cs->colors[1][1] = 0.6;
- cs->colors[1][2] = 0.6;
-
- cs->done = 1;
- cs->count = 99;
- cs->mod = 1.4;
-
-/* cs->position[0] = 0.0; */
-/* cs->position[1] = 5.0; */
-/* cs->position[2] = 5.0; */
-/* cs->position[3] = 1.0; */
-
- cs->position[0] = 0.0;
- cs->position[1] = 24.0;
- cs->position[2] = 2.0;
- cs->position[3] = 1.0;
-
-
- cs->position2[0] = 5.0;
- cs->position2[1] = 5.0;
- cs->position2[2] = 5.0;
- cs->position2[3] = 1.0;
-
- cs->ground[0] = 0.0;
- cs->ground[1] = 1.0;
- cs->ground[2] = 0.0;
- cs->ground[3] = -0.00001;
-
- cs->oldgame = -1;
-
-
- if((cs->glx_context = init_GL(mi)))
- reshape_chess(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- else
- MI_CLEARWINDOW(mi);
-
- if (!cs->wire) {
- glDepthFunc(GL_LEQUAL);
- glClearStencil(0);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- make_piece_texture(cs);
- make_board_texture(cs);
- }
- chessmodels_gen_lists( classic, cs->poly_counts);
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- cs->wire = 0;
-# endif
-
- if(!cs->wire) {
- setup_lights(cs);
- glColorMaterial(GL_FRONT, GL_DIFFUSE);
- glShadeModel(smooth ? GL_SMOOTH : GL_FLAT);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_DEPTH_TEST);
- }
- else
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-}
-
-/** does dirty work drawing scene, moving pieces */
-ENTRYPOINT void draw_chess(ModeInfo *mi)
-{
- Chesscreen *cs = &qs[MI_SCREEN(mi)];
- Window w = MI_WINDOW(mi);
- Display *disp = MI_DISPLAY(mi);
-
- if(!cs->glx_context)
- return;
-
- glXMakeCurrent(disp, w, *cs->glx_context);
-
- /** code for moving a piece */
- if(cs->moving && ++cs->steps == 100) {
- cs->moving = cs->count = cs->steps = cs->take = 0;
- cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]] = cs->mpiece;
- ++cs->mc;
-
- if(cs->mc == cs->game.movecount) {
- cs->done = 1;
- cs->mc = 0;
- }
- }
-
- if(++cs->count == 100) {
- if(!cs->done) {
- cs->mpiece = cs->game.board[cs->game.moves[cs->mc][0]][cs->game.moves[cs->mc][1]];
- cs->game.board[cs->game.moves[cs->mc][0]][cs->game.moves[cs->mc][1]] = NONE;
-
- if((cs->tpiece = cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]])) {
- cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]] = NONE;
- cs->take = 1;
- }
-
- cs->from[0] = cs->game.moves[cs->mc][0];
- cs->from[1] = cs->game.moves[cs->mc][1];
- cs->to[0] = cs->game.moves[cs->mc][2];
- cs->to[1] = cs->game.moves[cs->mc][3];
-
- cs->dz = (cs->to[0] - cs->from[0]) / 100;
- cs->dx = (cs->to[1] - cs->from[1]) / 100;
- cs->steps = 0;
- cs->moving = 1;
- }
- else if(cs->done == 1) {
- int newgame = cs->oldgame;
- while(newgame == cs->oldgame)
- newgame = random()%GAMES;
-
- /* mod the mod */
- cs->mod = 0.6 + (random()%20)/10.0;
-
- /* same old game */
- cs->oldgame = newgame;
- cs->game = games[cs->oldgame];
- build_colors(cs);
- cs->done = 2;
- cs->count = 0;
- }
- else {
- cs->done = 0;
- cs->count = 0;
- }
- }
-
- /* set lighting */
- if(cs->done) {
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION,
- cs->done == 1 ? 1.0+0.1*cs->count : 100.0/cs->count);
- glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION,
- cs->done == 1 ? 1.0+0.1*cs->count : 100.0/cs->count);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.14);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.14);
- }
-
- display(mi, cs);
-
- if(mi->fps_p) do_fps(mi);
- glFinish();
- glXSwapBuffers(disp, w);
-}
-
-
-ENTRYPOINT void free_chess(ModeInfo *mi)
-{
- Chesscreen *cs = &qs[MI_SCREEN(mi)];
- int i;
- if (!cs->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *cs->glx_context);
- gltrackball_free (cs->trackball);
- if (cs->piecetexture) glDeleteTextures (1, &cs->piecetexture);
- if (cs->boardtexture) glDeleteTextures (1, &cs->boardtexture);
-
- /* this is horrible! List numbers are hardcoded! */
- for (i = 1; i <= 20; i++)
- if (glIsList(i)) glDeleteLists(i, 1);
-}
-
-XSCREENSAVER_MODULE_2 ("Endgame", endgame, chess)
-
-#endif
diff --git a/hacks/glx/endgame.man b/hacks/glx/endgame.man
deleted file mode 100644
index c43cf64..0000000
--- a/hacks/glx/endgame.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "5-May-2004"
-.SH NAME
-endgame \- endgame chess screensaver
-.SH SYNOPSIS
-.B endgame
-[\-display \fIhost:display.screen\fP]
-[\-window]
-[\-root]
-[\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fImicroseconds\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-endgame replays a brilliant chess ending
-.SH OPTIONS
-.I endgame
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-shadows
-Project pieces against the board with dark blend.
-.TP 8
-.B \-reflections
-Reflect pieces in light board squares.
-.TP 8
-.B \-classic
-Use the original low-polygon piece models.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH BUGS
-It's not unknown for this and other OpenGL hacks to fail under hardware accelaration (UtahGLX) and take the X server with them. Texture images must be 16x16 or 32x32 or 64x64 etc.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2002 by Blair Tennessy. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Blair Tennessy <tennessb@unbc.ca>, 20-April-2002.
-
diff --git a/hacks/glx/energystream.c b/hacks/glx/energystream.c
deleted file mode 100644
index b20abb7..0000000
--- a/hacks/glx/energystream.c
+++ /dev/null
@@ -1,535 +0,0 @@
-/* energystream, Copyright (c) 2016 Eugene Sandulenko <sev@scummvm.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Based on Public Domain code by konrad "yoghurt" zagorowicz
- * for Tesla demo by Sunflower (http://www.pouet.net/prod.php?which=33)
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 30 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_stream 0
-
-#include "xlockmore.h"
-#include "gltrackball.h"
-#include "rotator.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-static float change_time = 0;
-static float change_time1 = 25;
-static float change_time2 = 40;
-static float change_time3 = 60;
-
-#define DEF_STREAMS "16"
-
-#include <sys/time.h>
-#include <time.h>
-
-typedef struct timeval streamtime;
-
-#define GETSECS(t) ((t).tv_sec)
-#define GETMSECS(t) ((t).tv_usec/1000)
-
-#define DEF_SPIN "False"
-#define DEF_WANDER "False"
-#define DEF_SPEED "1.0"
-
-
-typedef struct {
- float x, y, z;
-} Vector;
-
-typedef struct {
- Vector *flares;
- int num_flares;
- GLuint flare_tex;
- float speed;
-} flare_stream;
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- time_t start_time;
-
- int num_streams;
- flare_stream *streams;
-
-} stream_configuration;
-
-static stream_configuration *ess = NULL;
-
-static int num_streams;
-static Bool do_spin;
-static GLfloat global_speed;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-streams", ".streams", XrmoptionSepArg, 0 },
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" }
-};
-
-static argtype vars[] = {
- {&num_streams, "streams", "Streams", DEF_STREAMS, t_Int},
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&global_speed, "speed", "Speed", DEF_SPEED, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt stream_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-static void gettime(streamtime *t)
-{
-#ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(t, &tzp);
-#else /* !GETTIMEOFDAY_TWO_ARGS */
- gettimeofday(t);
-#endif /* !GETTIMEOFDAY_TWO_ARGS */
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_stream (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- glViewport (0, 0, (GLint) width, (GLint) height);
-
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode (GL_MODELVIEW);
- glLoadIdentity ();
- gluLookAt (0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear (GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-stream_handle_event (ModeInfo *mi, XEvent *event)
-{
- stream_configuration *es = &ess[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, es->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &es->button_down_p))
- return True;
-
- return False;
-}
-
-#define TEX_WIDTH 256
-#define TEX_HEIGHT 256
-#define COEFF 0.2
-
-static GLuint gen_texture (void)
-{
- int x, y, i;
- float color;
- GLuint tex;
-
- unsigned char *texture = (unsigned char *)calloc (TEX_WIDTH * TEX_HEIGHT, 4);
- unsigned char *ptr = texture;
-
- float tint[3];
- for (i = 0; i < 3; i++)
- tint[i] = 1.0 * random() / RAND_MAX;
-
- for (y = 0; y < TEX_HEIGHT; y++) {
- for (x = 0; x < TEX_WIDTH; x++) {
- color = 255 - sqrt((x - TEX_WIDTH / 2) * (x - TEX_WIDTH / 2) / COEFF
- + (y - TEX_HEIGHT / 2) * (y - TEX_HEIGHT / 2) / COEFF);
-
- if (color < 0)
- color = 0;
-
- for (i = 0; i < 3; i++)
- ptr[i] = (unsigned char)(color * tint[i]);
- ptr[3] = color ? 255 : 0;
-
- ptr += 4;
- }
- }
-
- glGenTextures (1, &tex);
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture (GL_TEXTURE_2D, tex);
-#endif /* HAVE_GLBINDTEXTURE */
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
- clear_gl_error ();
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
- check_gl_error ("texture");
-
- /* Texture parameters, LINEAR scaling for better texture quality */
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- free (texture);
-
- return tex;
-}
-
-static inline void vector_copy (Vector *a, Vector *b)
-{
- a->x = b->x;
- a->y = b->y;
- a->z = b->z;
-}
-
-/* a += b */
-static inline void vector_add (Vector *a, Vector *b)
-{
- a->x += b->x;
- a->y += b->y;
- a->z += b->z;
-}
-
-/* a -= b */
-static inline void vector_sub (Vector *a, Vector *b)
-{
- a->x -= b->x;
- a->y -= b->y;
- a->z -= b->z;
-}
-
-static void init_flare_stream (flare_stream *s, int num_flares, float bx, float by, float bz, float speed)
-{
- int i;
-
- s->flares = (Vector *) calloc (num_flares, sizeof (Vector));
- s->num_flares = num_flares;
- s->flare_tex = gen_texture();
- s->speed = speed;
-
- for (i = 0; i != s->num_flares; i++)
- {
- s->flares[i].x = -800.0f * random() / RAND_MAX - 1150 + bx;
- s->flares[i].y = 10.0f * random() / RAND_MAX - 20 + by;
- s->flares[i].z = 10.0f * random() / RAND_MAX - 20 + bz;
- }
-}
-
-static void render_flare_stream (flare_stream *s, float cur_time, Vector *vx, Vector *vy, float alpha)
-{
- float fMultipler = 1;
- int i;
-
- if (s->flare_tex == -1)
- return;
- if (!s->num_flares)
- return;
-
- if (cur_time < change_time)
- return;
-
- cur_time -= change_time;
-
- glColor4f (1.0, 1, 1, alpha);
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture (GL_TEXTURE_2D, s->flare_tex);
-#endif
-
- glBegin (GL_QUADS);
-
- if (cur_time + change_time > change_time1)
- {
- if (cur_time + change_time > change_time2)
- {
- fMultipler = 2.5;
- }
- else
- fMultipler = 2;
- }
-
- for (i = 0; i != s->num_flares; i++)
- {
- Vector flare_pos;
- Vector cc;
-
- flare_pos.x = fmod (s->flares[i].x + cur_time * s->speed * fMultipler, 800) - 400;
- flare_pos.y = s->flares[i].y + 2 * sin (cur_time * 7 + s->flares[i].x);
- flare_pos.z = s->flares[i].z + 2 * cos (cur_time * 7 + i * 3.14);
-
- glTexCoord2f (0, 0);
- vector_copy (&cc, &flare_pos);
- vector_sub (&cc, vx);
- vector_add (&cc, vy);
- glVertex3fv ((float *)&cc);
-
- glTexCoord2f ( 1, 0 );
- vector_copy (&cc, &flare_pos);
- vector_add (&cc, vx);
- vector_add (&cc, vy);
- glVertex3fv ((float *)&cc);
-
- glTexCoord2f ( 1, 1 );
- vector_copy (&cc, &flare_pos);
- vector_add (&cc, vx);
- vector_sub (&cc, vy);
- glVertex3fv ((float *)&cc);
-
- glTexCoord2f ( 0, 1 );
- vector_copy (&cc, &flare_pos);
- vector_sub (&cc, vx);
- vector_sub (&cc, vy);
- glVertex3fv ((float *)&cc);
- }
-
- glEnd ();
-}
-
-ENTRYPOINT void
-init_stream (ModeInfo *mi)
-{
- stream_configuration *es;
- streamtime current_time;
-
- MI_INIT (mi, ess);
-
- es = &ess[MI_SCREEN(mi)];
-
- es->glx_context = init_GL (mi);
-
- reshape_stream (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- gettime (&current_time);
- es->start_time = GETSECS(current_time) * 1000 + GETMSECS(current_time);
-
- es->num_streams = num_streams;
-
- es->streams = (flare_stream *) calloc (es->num_streams, sizeof(flare_stream));
-
- init_flare_stream (&es->streams[0], 150, 0, 50, 0, 300);
- init_flare_stream (&es->streams[1], 150, 0, 0, 0, 150);
- init_flare_stream (&es->streams[2], 150, 0, 90, 60, 250);
- init_flare_stream (&es->streams[3], 150, 0, -100, 30, 160);
- init_flare_stream (&es->streams[4], 150, 0, 50, -100, 340);
- init_flare_stream (&es->streams[5], 150, 0, -50, 50, 270 );
- init_flare_stream (&es->streams[6], 150, 0, 100, 50, 180);
- init_flare_stream (&es->streams[7], 150, 0, -30, 90, 130);
-
- init_flare_stream (&es->streams[8], 150, 0, 150, 10, 200);
- init_flare_stream (&es->streams[9], 150, 0, 100, -100, 210);
- init_flare_stream (&es->streams[10], 150, 0, 190, 160, 220);
- init_flare_stream (&es->streams[11], 150, 0, -200, 130, 230);
- init_flare_stream (&es->streams[12], 150, 0, 150, -200, 240);
- init_flare_stream (&es->streams[13], 150, 0, -150, 250, 160);
- init_flare_stream (&es->streams[14], 150, 0, 200, 150, 230);
- init_flare_stream (&es->streams[15], 150, 0, -130, 190, 250);
-
- {
- double spin_speed = 0.5 * global_speed;
- double wander_speed = 0.02 * global_speed;
- double spin_accel = 1.1;
-
- es->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- es->trackball = gltrackball_init (True);
- }
-}
-
-ENTRYPOINT void
-free_stream (ModeInfo * mi)
-{
- stream_configuration *es = &ess[MI_SCREEN(mi)];
- int i;
-
- if (!es->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *es->glx_context);
-
- if (es->trackball) gltrackball_free (es->trackball);
- if (es->rot) free_rotator (es->rot);
-
- for (i = 0; i < es->num_streams; i++) {
- free (es->streams[i].flares);
- glDeleteTextures (1, &es->streams[i].flare_tex);
- }
-
- if (es->streams) free (es->streams);
-
-}
-
-
-static void inverse_matrix (float m[16]) {
- double a,b,c,d,e,f,g,h,i,j,k,l;
- register double dW;
-
- a = m[ 0]; b = m[ 1]; c = m[ 2];
- d = m[ 4]; e = m[ 5]; f = m[ 6];
- g = m[ 8]; h = m[ 9]; i = m[10];
- j = m[12]; k = m[13]; l = m[14];
-
- dW = 1.0 / (a * (e * i - f * h)
- - (b * (d * i - f * g)
- + c * (e * g - d * h)));
-
- m[ 0]= (float)((e * i - f * h) * dW);
- m[ 1]= (float)((c * h - b * i) * dW);
- m[ 2]= (float)((b * f - c * e) * dW);
-
- m[ 4]= (float)((f * g - d * i) * dW);
- m[ 5]= (float)((a * i - c * g) * dW);
- m[ 6]= (float)((c * d - a * f) * dW);
-
- m[ 8]= (float)((d * h - e * g) * dW);
- m[ 9]= (float)((b * g - a * h) * dW);
- m[10]= (float)((a * e - b * d) * dW);
-
- m[12]= (float)((e * (g * l - i * j)
- + f * (h * j - g * k)
- - d * (h * l - i * k)) * dW);
- m[13]= (float)((a * (h * l - i * k)
- + b * (i * j - g * l)
- + c * (g * k - h * j)) * dW);
- m[14]= (float)((b * (d * l - f * j)
- + c * (e * j - d * k)
- - a * (e * l - f * k)) * dW);
-}
-
-ENTRYPOINT void
-draw_stream (ModeInfo *mi)
-{
- stream_configuration *es = &ess[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- streamtime current_time;
- float cur_time;
- int i;
- float alpha = 1.0;
- Vector vx;
- Vector vy;
- GLfloat m[4*4];
-
- if (!es->glx_context)
- return;
-
- gettime (&current_time);
-
- cur_time = (float)(GETSECS(current_time) * 1000 + GETMSECS(current_time) - es->start_time) / 1000.0;
- cur_time *= global_speed;
-
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *es->glx_context);
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
- glFrustum (-.6f, .6f, -.45f, .45f, 1, 1000);
-
- glMatrixMode (GL_MODELVIEW);
- glLoadIdentity ();
-
- glEnable (GL_LIGHTING);
- glEnable (GL_TEXTURE_2D);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE);
- glDisable (GL_CULL_FACE);
- glDisable (GL_DEPTH_TEST);
- glDepthMask (0);
-
- glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
-
- glTranslatef (0, 0, -300);
- glRotatef (cur_time * 30, 1, 0, 0);
- glRotatef (30 * sin(cur_time / 3) + 10, 0, 0, 1);
-
- {
- double x, y, z;
- get_position (es->rot, &x, &y, &z, !es->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 15);
-
- gltrackball_rotate (es->trackball);
-
- get_rotation (es->rot, &x, &y, &z, !es->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- if (cur_time > change_time1)
- {
- if (cur_time > change_time2)
- {
- glRotatef (90, 0, 1, 0);
-
- if (cur_time > change_time3)
- es->start_time = GETSECS(current_time) * 1000 + GETMSECS(current_time) - 5000;
- }
- else
- {
- glRotatef (180, 0, 1, 0);
- }
- }
-
- glEnable ( GL_FOG);
- glFogf (GL_FOG_START, 200);
- glFogf (GL_FOG_END, 500);
- glFogf (GL_FOG_MODE, GL_LINEAR);
-
- glGetFloatv (GL_MODELVIEW_MATRIX, m);
-
- inverse_matrix (m);
-
- vx.x = m[0] * 10;
- vx.y = m[1] * 10;
- vx.z = m[2] * 10;
-
- vy.x = m[4] * 10;
- vy.y = m[5] * 10;
- vy.z = m[6] * 10;
-
- mi->polygon_count = 0;
-
- for (i = 0; i != es->num_streams; i++)
- {
- mi->polygon_count += es->streams[i].num_flares;
- render_flare_stream (&es->streams[i], cur_time, &vx, &vy, alpha);
- }
-
- glDisable (GL_TEXTURE_2D);
- glDisable (GL_LIGHTING);
- glDisable (GL_FOG);
- glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers (dpy, window);
-}
-
-XSCREENSAVER_MODULE_2("EnergyStream", energystream, stream)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/energystream.man b/hacks/glx/energystream.man
deleted file mode 100644
index e149d84..0000000
--- a/hacks/glx/energystream.man
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-energystream \- a flow of particles which form an energy stream
-.SH SYNOPSIS
-.B energystream
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-no-wander]
-[\-no-spin]
-[\-fps]
-.SH DESCRIPTION
-Draws a set of flowing particles with camera flying around and through it.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-wander | \-no-wander
-Whether the camera should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the camera should spin.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2016 by Eugene Sandulenko. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Eugene Sandulenko.
diff --git a/hacks/glx/engine.c b/hacks/glx/engine.c
deleted file mode 100644
index cdc68f9..0000000
--- a/hacks/glx/engine.c
+++ /dev/null
@@ -1,1014 +0,0 @@
-/*
- * engine.c - GL representation of a 4 stroke engine
- *
- * version 2.00
- *
- * Copyright (C) 2001 Ben Buxton (bb@cactii.net)
- * modified by Ed Beroset (beroset@mindspring.com)
- * new to 2.0 version is:
- * - command line argument to specify number of cylinders
- * - command line argument to specify included angle of engine
- * - removed broken command line argument to specify rotation speed
- * - included crankshaft shapes and firing orders for real engines
- * verified using the Bosch _Automotive Handbook_, 5th edition, pp 402,403
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
- "*titleFont: sans-serif 18\n" \
-
-# define release_engine 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#include "texfont.h"
-#include "rotator.h"
-#include "gltrackball.h"
-
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-
-#ifdef USE_GL
-
-#define DEF_ENGINE "(none)"
-#define DEF_TITLES "False"
-#define DEF_SPIN "True"
-#define DEF_MOVE "True"
-
-static char *which_engine;
-static int move;
-static int spin;
-static Bool do_titles;
-
-static XrmOptionDescRec opts[] = {
- {"-engine", ".engine.engine", XrmoptionSepArg, DEF_ENGINE },
- {"-move", ".engine.move", XrmoptionNoArg, "True" },
- {"+move", ".engine.move", XrmoptionNoArg, "False" },
- {"-spin", ".engine.spin", XrmoptionNoArg, "True" },
- {"+spin", ".engine.spin", XrmoptionNoArg, "False" },
- { "-titles", ".engine.titles", XrmoptionNoArg, "True" },
- { "+titles", ".engine.titles", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&which_engine, "engine", "Engine", DEF_ENGINE, t_String},
- {&move, "move", "Move", DEF_MOVE, t_Bool},
- {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt engine_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct engine_description =
-{"engine", "init_engine", "draw_engine", NULL,
- "draw_engine", "init_engine", NULL, &engine_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "A four stroke engine", 0, NULL};
-
-#endif
-
-/* these defines are used to provide symbolic means
- * by which to refer to various portions or multiples
- * of a cyle in degrees
- */
-#define HALFREV 180
-#define ONEREV 360
-#define TWOREV 720
-
-#define MOVE_MULT 0.05
-
-#define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
-
-
-typedef struct {
- GLXContext *glx_context;
- Window window;
- GLfloat x, y, z; /* position */
- GLfloat dx, dy, dz; /* position */
- GLfloat an1, an2, an3; /* internal angle */
- GLfloat nx, ny, nz; /* spin vector */
- GLfloat a; /* spin angle */
- GLfloat da; /* spin speed */
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- texture_font_data *font_data;
- char *engine_name;
- int engineType;
- int movepaused;
-
- float crankOffset;
- float crankWidth;
-
- int win_w, win_h;
-
- float sin_table[TWOREV];
- float cos_table[TWOREV];
- float tan_table[TWOREV];
-
- GLfloat boom_red[4];
- GLfloat boom_lpos[4];
- GLfloat boom_d, boom_wd;
- int boom_time;
-
- GLfloat viewer[3], lookat[3];
-
- int display_a;
- GLfloat ln[730], yp[730], ang[730];
- int ln_init;
- int lastPlug;
-
- GLuint shaft_list, piston_list;
- int shaft_polys, piston_polys;
-
-} Engine;
-
-static Engine *engine = NULL;
-
-static const GLfloat lightpos[] = {7.0, 7.0, 12, 1.0};
-static const GLfloat light_sp[] = {0.8, 0.8, 0.8, 0.5};
-static const GLfloat red[] = {1.0, 0, 0, 1.0};
-static const GLfloat green[] = {0.0, 1, 0, 1.0};
-static const GLfloat blue[] = {0, 0, 1, 1.0};
-static const GLfloat white[] = {1.0, 1, 1, 1.0};
-static const GLfloat yellow_t[] = {1, 1, 0, 0.4};
-
-static GLvoid normal(GLfloat [], GLfloat [], GLfloat [],
- GLfloat *, GLfloat *, GLfloat *);
-
-/*
- * this table represents both the firing order and included angle of engine.
- * To simplify things, we always number from 0 starting at the flywheel and
- * moving down the crankshaft toward the back of the engine. This doesn't
- * always match manufacturer's schemes. For example, the Porsche 911 engine
- * is a flat six with the following configuration (Porsche's numbering):
- *
- * 3 2 1
- * |= firing order is 1-6-2-4-3-5 in this diagram
- * 6 5 4
- *
- * We renumber these using our scheme but preserve the effective firing order:
- *
- * 0 2 4
- * |= firing order is 4-1-2-5-0-3 in this diagram
- * 1 3 5
- *
- * To avoid going completely insane, we also reorder these so the newly
- * renumbered cylinder 0 is always first: 0-3-4-1-2-5
- *
- * For a flat 6, the included angle is 180 degrees (0 would be a inline
- * engine). Because these are all four-stroke engines, each piston goes
- * through 720 degrees of rotation for each time the spark plug sparks,
- * so in this case, we would use the following angles:
- *
- * cylinder firing order angle
- * -------- ------------ -----
- * 0 0 0
- * 1 3 360
- * 2 4 240
- * 3 1 600
- * 4 2 480
- * 5 5 120
- *
- */
-
-typedef struct
-{
- int cylinders;
- int includedAngle;
- int pistonAngle[12]; /* twelve cylinders should suffice... */
- int speed; /* step size in degrees for engine speed */
- const char *engineName; /* currently unused */
-} engine_type;
-
-static const engine_type engines[] = {
- { 3, 0, { 0, 240, 480, 0, 0, 0,
- 0, 0, 0, 0, 0, 0 }, 12,
- "Honda Insight" },
- { 4, 0, { 0, 180, 540, 360, 0, 0,
- 0, 0, 0, 0, 0, 0 }, 12,
- "BMW M3" },
- { 4, 180, { 0, 360, 180, 540, 0, 0,
- 0, 0, 0, 0, 0, 0 }, 12,
- "VW Beetle" },
- { 5, 0, { 0, 576, 144, 432, 288, 0,
- 0, 0, 0, 0, 0, 0 }, 12,
- "Audi Quattro" },
- { 6, 0, { 0, 240, 480, 120, 600, 360,
- 0, 0, 0, 0, 0, 0 }, 12,
- "BMW M5" },
- { 6, 90, { 0, 360, 480, 120, 240, 600,
- 0, 0, 0, 0, 0, 0 }, 12,
- "Subaru XT" },
- { 6, 180, { 0, 360, 240, 600, 480, 120,
- 0, 0, 0, 0, 0, 0 }, 12,
- "Porsche 911" },
- { 8, 90, { 0, 450, 90, 180, 270, 360,
- 540, 630, 0, 0, 0, 0 }, 15,
- "Corvette Z06" },
- {10, 90, { 0, 72, 432, 504, 288, 360,
- 144, 216, 576, 648, 0, 0 }, 12,
- "Dodge Viper" },
- {12, 60, { 0, 300, 240, 540, 480, 60,
- 120, 420, 600, 180, 360, 660 }, 12,
- "Jaguar XKE" },
-};
-
-/* this define is just a little shorter way of referring to members of the
- * table above
- */
-#define ENG engines[e->engineType]
-
-/* given a number of cylinders and an included angle, finds matching engine */
-static int
-find_engine(char *name)
-{
- unsigned int i;
- char *s;
-
- if (!name || !*name || !strcasecmp (name, "(none)"))
- return (random() % countof(engines));
-
- for (s = name; *s; s++)
- if (*s == '-' || *s == '_') *s = ' ';
-
- for (i = 0; i < countof(engines); i++) {
- if (!strcasecmp(name, engines[i].engineName))
- return i;
- }
-
- fprintf (stderr, "%s: unknown engine type \"%s\"\n", progname, name);
- fprintf (stderr, "%s: available models are:\n", progname);
- for (i = 0; i < countof(engines); i++) {
- fprintf (stderr, "\t %-13s (%d cylinders",
- engines[i].engineName, engines[i].cylinders);
- if (engines[i].includedAngle == 0)
- fprintf (stderr, ")\n");
- else if (engines[i].includedAngle == 180)
- fprintf (stderr, ", flat)\n");
- else
- fprintf (stderr, ", V)\n");
- }
- exit(1);
-}
-
-/* we use trig tables to speed things up - 200 calls to sin()
- in one frame can be a bit harsh..
-*/
-
-static void make_tables(Engine *e)
-{
- int i;
- float f;
-
- f = ONEREV / (M_PI * 2);
- for (i = 0 ; i < TWOREV ; i++) {
- e->sin_table[i] = sin(i/f);
- }
- for (i = 0 ; i < TWOREV ; i++) {
- e->cos_table[i] = cos(i/f);
- }
- for (i = 0 ; i < TWOREV ; i++) {
- e->tan_table[i] = tan(i/f);
- }
-}
-
-/* if inner and outer are the same, we draw a cylinder, not a tube */
-/* for a tube, endcaps is 0 (none), 1 (left), 2 (right) or 3(both) */
-/* angle is how far around the axis to go (up to 360) */
-
-static int cylinder (Engine *e, GLfloat x, GLfloat y, GLfloat z,
- float length, float outer, float inner, int endcaps, int sang, int eang)
-{
- int polys = 0;
- int a; /* current angle around cylinder */
- int b = 0; /* previous */
- int angle, norm, step, sangle;
- float z1, y1, z2, y2, ex=0;
- float Z1, Y1, Z2, Y2, xl;
- GLfloat y2c[TWOREV], z2c[TWOREV];
- int nsegs, tube = 0;
-
- glPushMatrix();
- nsegs = outer*(MAX(e->win_w, e->win_h)/200);
- nsegs = MAX(nsegs, 6);
- nsegs = MAX(nsegs, 40);
- if (nsegs % 2)
- nsegs += 1;
- sangle = sang;
- angle = eang;
- z1 = e->cos_table[sangle]*outer+z; y1 = e->sin_table[sangle] * outer+y;
- Z1 = e->cos_table[sangle] * inner+z; Y1 = e->sin_table[sangle]*inner+y ;
- Z2 = z;
- Y2 = y;
- xl = x + length;
- if (inner < outer && endcaps < 3) tube = 1;
- step = ONEREV/nsegs;
-
- glBegin(GL_QUADS);
- for (a = sangle ; a <= angle || b <= angle ; a+= step) {
- y2=outer*(float)e->sin_table[a]+y;
- z2=outer*(float)e->cos_table[a]+z;
- if (endcaps) {
- y2c[a] = y2;
- z2c[a] = z2; /* cache for later */
- }
- if (tube) {
- Y2=inner*(float)e->sin_table[a]+y;
- Z2=inner*(float)e->cos_table[a]+z;
- }
- glNormal3f(0, y1, z1);
- glVertex3f(x,y1,z1);
- glVertex3f(xl,y1,z1);
- glNormal3f(0, y2, z2);
- glVertex3f(xl,y2,z2);
- glVertex3f(x,y2,z2);
- polys++;
- if (a == sangle && angle - sangle < ONEREV) {
- if (tube)
- glVertex3f(x, Y1, Z1);
- else
- glVertex3f(x, y, z);
- glVertex3f(x, y1, z1);
- glVertex3f(xl, y1, z1);
- if (tube)
- glVertex3f(xl, Z1, Z1);
- else
- glVertex3f(xl, y, z);
- polys++;
- }
- if (tube) {
- if (endcaps != 1) {
- glNormal3f(-1, 0, 0); /* left end */
- glVertex3f(x, y1, z1);
- glVertex3f(x, y2, z2);
- glVertex3f(x, Y2, Z2);
- glVertex3f(x, Y1, Z1);
- polys++;
- }
-
- glNormal3f(0, -Y1, -Z1); /* inner surface */
- glVertex3f(x, Y1, Z1);
- glVertex3f(xl, Y1, Z1);
- glNormal3f(0, -Y2, -Z2);
- glVertex3f(xl, Y2, Z2);
- glVertex3f(x, Y2, Z2);
- polys++;
-
- if (endcaps != 2) {
- glNormal3f(1, 0, 0); /* right end */
- glVertex3f(xl, y1, z1);
- glVertex3f(xl, y2, z2);
- glVertex3f(xl, Y2, Z2);
- glVertex3f(xl, Y1, Z1);
- polys++;
- }
- }
-
- z1=z2; y1=y2;
- Z1=Z2; Y1=Y2;
- b = a;
- }
- glEnd();
-
- if (angle - sangle < ONEREV) {
- GLfloat nx, ny, nz;
- GLfloat v1[3], v2[3], v3[3];
- v1[0] = x; v1[1] = y; v1[2] = z;
- v2[0] = x; v2[1] = y1; v2[2] = z1;
- v3[0] = xl; v3[1] = y1; v3[2] = z1;
- normal(&v2[0], &v1[0], &v3[0], &nx, &ny, &nz);
- glBegin(GL_QUADS);
- glNormal3f(nx, ny, nz);
- glVertex3f(x, y, z);
- glVertex3f(x, y1, z1);
- glVertex3f(xl, y1, z1);
- glVertex3f(xl, y, z);
- polys++;
- glEnd();
- }
- if (endcaps) {
- GLfloat end, start;
- if (tube) {
- if (endcaps == 1) {
- end = 0;
- start = 0;
- } else if (endcaps == 2) {
- start = end = length+0.01;
- } else {
- end = length+0.02; start = -0.01;
- }
- norm = (ex == length+0.01) ? -1 : 1;
- } else {
- end = length;
- start = 0;
- norm = -1;
- }
-
- for(ex = start ; ex <= end ; ex += length) {
- z1 = outer*e->cos_table[sangle]+z;
- y1 = y+e->sin_table[sangle]*outer;
- step = ONEREV/nsegs;
- glBegin(GL_TRIANGLES);
- b = 0;
- for (a = sangle ; a <= angle || b <= angle; a+= step) {
- glNormal3f(norm, 0, 0);
- glVertex3f(x+ex,y, z);
- glVertex3f(x+ex,y1,z1);
- glVertex3f(x+ex,y2c[a],z2c[a]);
- polys++;
- y1 = y2c[a]; z1 = z2c[a];
- b = a;
- }
- if (!tube) norm = 1;
- glEnd();
- }
- }
- glPopMatrix();
- return polys;
-}
-
-/* this is just a convenience function to make a solid rod */
-static int rod (Engine *e, GLfloat x, GLfloat y, GLfloat z, float length, float diameter)
-{
- return cylinder(e, x, y, z, length, diameter, diameter, 3, 0, ONEREV);
-}
-
-static GLvoid normal(GLfloat v1[], GLfloat v2[], GLfloat v3[],
- GLfloat *nx, GLfloat *ny, GLfloat *nz)
-{
- GLfloat x, y, z, X, Y, Z;
-
- x = v2[0]-v1[0];
- y = v2[1]-v1[1];
- z = v2[2]-v1[2];
- X = v3[0]-v1[0];
- Y = v3[1]-v1[1];
- Z = v3[2]-v1[2];
-
- *nx = Y*z - Z*y;
- *ny = Z*x - X*z;
- *nz = X*y - Y*x;
-
-}
-
-
-
-static int Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
- GLfloat t)
-{
- int polys = 0;
- GLfloat yh;
- GLfloat xw;
- GLfloat zt;
-
- yh = y+h; xw = x+w; zt = z - t;
-
- glBegin(GL_QUADS); /* front */
- glNormal3f(0, 0, 1);
- glVertex3f(x, y, z);
- glVertex3f(x, yh, z);
- glVertex3f(xw, yh, z);
- glVertex3f(xw, y, z);
- polys++;
- /* back */
- glNormal3f(0, 0, -1);
- glVertex3f(x, y, zt);
- glVertex3f(x, yh, zt);
- glVertex3f(xw, yh, zt);
- glVertex3f(xw, y, zt);
- polys++;
- /* top */
- glNormal3f(0, 1, 0);
- glVertex3f(x, yh, z);
- glVertex3f(x, yh, zt);
- glVertex3f(xw, yh, zt);
- glVertex3f(xw, yh, z);
- polys++;
- /* bottom */
- glNormal3f(0, -1, 0);
- glVertex3f(x, y, z);
- glVertex3f(x, y, zt);
- glVertex3f(xw, y, zt);
- glVertex3f(xw, y, z);
- polys++;
- /* left */
- glNormal3f(-1, 0, 0);
- glVertex3f(x, y, z);
- glVertex3f(x, y, zt);
- glVertex3f(x, yh, zt);
- glVertex3f(x, yh, z);
- polys++;
- /* right */
- glNormal3f(1, 0, 0);
- glVertex3f(xw, y, z);
- glVertex3f(xw, y, zt);
- glVertex3f(xw, yh, zt);
- glVertex3f(xw, yh, z);
- polys++;
- glEnd();
- return polys;
-}
-
-static int makepiston(Engine *e)
-{
- int polys = 0;
- GLfloat colour[] = {0.6, 0.6, 0.6, 1.0};
-
- /* if (e->piston_list) glDeleteLists(1, e->piston_list); */
- if (! e->piston_list) e->piston_list = glGenLists(1);
- glNewList(e->piston_list, GL_COMPILE);
- glRotatef(90, 0, 0, 1);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colour);
- glMaterialfv(GL_FRONT, GL_SPECULAR, colour);
- glMateriali(GL_FRONT, GL_SHININESS, 20);
- polys += cylinder(e, 0, 0, 0, 2, 1, 0.7, 2, 0, ONEREV); /* body */
- colour[0] = colour[1] = colour[2] = 0.2;
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colour);
- polys += cylinder(e, 1.6, 0, 0, 0.1, 1.05, 1.05, 0, 0, ONEREV); /* ring */
- polys += cylinder(e, 1.8, 0, 0, 0.1, 1.05, 1.05, 0, 0, ONEREV); /* ring */
- glEndList();
- return polys;
-}
-
-static int CrankBit(Engine *e, GLfloat x)
-{
- int polys = 0;
- polys += Rect(x, -1.4, 0.5, 0.2, 1.8, 1);
- polys += cylinder(e, x, -0.5, 0, 0.2, 2, 2, 1, 60, 120);
- return polys;
-}
-
-static int boom(Engine *e, GLfloat x, GLfloat y, int s)
-{
- int polys = 0;
- int flameOut = 720/ENG.speed/ENG.cylinders;
-
- if (e->boom_time == 0 && s) {
- e->boom_red[0] = e->boom_red[1] = 0;
- e->boom_d = 0.05;
- e->boom_time++;
- glEnable(GL_LIGHT1);
- } else if (e->boom_time == 0 && !s) {
- return polys;
- } else if (e->boom_time >= 8 && e->boom_time < flameOut && !s) {
- e->boom_time++;
- e->boom_red[0] -= 0.2; e->boom_red[1] -= 0.1;
- e->boom_d-= 0.04;
- } else if (e->boom_time >= flameOut) {
- e->boom_time = 0;
- glDisable(GL_LIGHT1);
- return polys;
- } else {
- e->boom_red[0] += 0.2; e->boom_red[1] += 0.1;
- e->boom_d += 0.04;
- e->boom_time++;
- }
- e->boom_lpos[0] = x-e->boom_d; e->boom_lpos[1] = y;
- glLightfv(GL_LIGHT1, GL_POSITION, e->boom_lpos);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, e->boom_red);
- glLightfv(GL_LIGHT1, GL_SPECULAR, e->boom_red);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 1.3);
- glLighti(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0);
-
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, e->boom_red);
- e->boom_wd = e->boom_d*3;
- if (e->boom_wd > 0.7) e->boom_wd = 0.7;
- glEnable(GL_BLEND);
- glDepthMask(GL_FALSE);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- polys += rod(e, x, y, 0, e->boom_d, e->boom_wd);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- return polys;
-}
-
-static int display(ModeInfo *mi)
-{
- Engine *e = &engine[MI_SCREEN(mi)];
- int polys = 0;
- GLfloat zb, yb;
- float rightSide;
- int half;
- int sides;
- int j, b;
-
- glEnable(GL_LIGHTING);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- gluLookAt(e->viewer[0], e->viewer[1], e->viewer[2],
- e->lookat[0], e->lookat[1], e->lookat[2],
- 0.0, 1.0, 0.0);
- glPushMatrix();
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_sp);
-
- if (move) {
- double x, y, z;
- get_position (e->rot, &x, &y, &z, !e->button_down_p);
- glTranslatef(x*16-9, y*14-7, z*16-10);
- }
-
- if (spin) {
- double x, y, z;
-
- gltrackball_rotate (e->trackball);
-
- get_rotation(e->rot, &x, &y, &z, !e->button_down_p);
- glRotatef(x*ONEREV, 1.0, 0.0, 0.0);
- glRotatef(y*ONEREV, 0.0, 1.0, 0.0);
- glRotatef(x*ONEREV, 0.0, 0.0, 1.0);
- }
-
-/* So the rotation appears around the centre of the engine */
- glTranslatef(-5, 0, 0);
-
-/* crankshaft */
- glPushMatrix();
- glRotatef(e->display_a, 1, 0, 0);
- glCallList(e->shaft_list);
- polys += e->shaft_polys;
- glPopMatrix();
-
- /* init the ln[] matrix for speed */
- if (e->ln_init == 0) {
- for (e->ln_init = 0 ; e->ln_init < countof(e->sin_table) ; e->ln_init++) {
- zb = e->sin_table[e->ln_init];
- yb = e->cos_table[e->ln_init];
- /* y ordinate of piston */
- e->yp[e->ln_init] = yb + sqrt(25 - (zb*zb));
- /* length of rod */
- e->ln[e->ln_init] = sqrt(zb*zb + (yb-e->yp[e->ln_init])*(yb-e->yp[e->ln_init]));
- /* angle of connecting rod */
- e->ang[e->ln_init] = asin(zb/5)*57;
- e->ang[e->ln_init] *= -1;
- }
- }
-
- glPushMatrix();
- sides = (ENG.includedAngle == 0) ? 1 : 2;
- for (half = 0; half < sides; half++, glRotatef(ENG.includedAngle,1,0,0))
- {
- /* pistons */
- /* glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white); */
- for (j = 0; j < ENG.cylinders; j += sides)
- {
- b = (e->display_a + ENG.pistonAngle[j+half]) % ONEREV;
- glPushMatrix();
- glTranslatef(e->crankWidth/2 + e->crankOffset*(j+half), e->yp[b]-0.3, 0);
- glCallList(e->piston_list);
- polys += e->piston_polys;
- glPopMatrix();
- }
- /* spark plugs */
- glPushMatrix();
- glRotatef(90, 0, 0, 1);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
- for (j = 0; j < ENG.cylinders; j += sides)
- {
- polys += cylinder(e, 8.5, -e->crankWidth/2-e->crankOffset*(j+half), 0,
- 0.5, 0.4, 0.3, 1, 0, ONEREV);
- }
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white);
- for (j = 0; j < ENG.cylinders; j += sides)
- {
- polys += rod(e, 8, -e->crankWidth/2-e->crankOffset*(j+half), 0, 0.5, 0.2);
- polys += rod(e, 9, -e->crankWidth/2-e->crankOffset*(j+half), 0, 1, 0.15);
- }
-
- /* rod */
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
- for (j = 0; j < ENG.cylinders; j += sides)
- {
- b = (e->display_a+HALFREV+ENG.pistonAngle[j+half]) % TWOREV;
- glPushMatrix();
- glRotatef(e->ang[b], 0, 1, 0);
- polys += rod(e,
- -e->cos_table[b],
- -e->crankWidth/2-e->crankOffset*(j+half),
- -e->sin_table[b],
- e->ln[b], 0.2);
- glPopMatrix();
- }
- glPopMatrix();
-
- /* engine block */
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, yellow_t);
- glEnable(GL_BLEND);
- glDepthMask(GL_FALSE);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- rightSide = (sides > 1) ? 0 : 1.6;
- /* left plate */
- polys += Rect(-e->crankWidth/2, -0.5, 1, 0.2, 9, 2);
- /* right plate */
- polys += Rect(0.3+e->crankOffset*ENG.cylinders-rightSide, -0.5, 1, 0.2, 9, 2);
- /* head plate */
- polys += Rect(-e->crankWidth/2+0.2, 8.3, 1,
- e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 2);
- /* front rail */
- polys += Rect(-e->crankWidth/2+0.2, 3, 1,
- e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 0.2);
- /* back rail */
- polys += Rect(-e->crankWidth/2+0.2, 3, -1+0.2,
- e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 0.2);
- /* plates between cylinders */
- for (j=0; j < ENG.cylinders - (sides == 1); j += sides)
- polys += Rect(0.4+e->crankWidth+e->crankOffset*(j-half), 3, 1, 1, 5.3, 2);
- glDepthMask(GL_TRUE);
- }
- glPopMatrix();
-
- /* see which of our plugs should fire now, if any */
- for (j = 0; j < ENG.cylinders; j++)
- {
- if (0 == ((e->display_a + ENG.pistonAngle[j]) % TWOREV))
- {
- glPushMatrix();
- if (j & 1)
- glRotatef(ENG.includedAngle,1,0,0);
- glRotatef(90, 0, 0, 1);
- polys += boom(e, 8, -e->crankWidth/2-e->crankOffset*j, 1);
- e->lastPlug = j;
- glPopMatrix();
- }
- }
-
- if (e->lastPlug != j)
- {
- /* this code causes the last plug explosion to dim gradually */
- if (e->lastPlug & 1)
- glRotatef(ENG.includedAngle, 1, 0, 0);
- glRotatef(90, 0, 0, 1);
- polys += boom(e, 8, -e->crankWidth/2-e->crankOffset*e->lastPlug, 0);
- }
- glDisable(GL_BLEND);
-
- e->display_a += ENG.speed;
- if (e->display_a >= TWOREV)
- e->display_a = 0;
- glPopMatrix();
- glFlush();
- return polys;
-}
-
-static int makeshaft (Engine *e)
-{
- int polys = 0;
- int j;
- float crankThick = 0.2;
- float crankDiam = 0.3;
-
- /* if (e->shaft_list) glDeleteLists(1, e->shaft_list); */
- if (! e->shaft_list) e->shaft_list = glGenLists(1);
- glNewList(e->shaft_list, GL_COMPILE);
-
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
- /* draw the flywheel */
- polys += cylinder(e, -2.5, 0, 0, 1, 3, 2.5, 0, 0, ONEREV);
- polys += Rect(-2, -0.3, 2.8, 0.5, 0.6, 5.6);
- polys += Rect(-2, -2.8, 0.3, 0.5, 5.6, 0.6);
-
- /* now make each of the shaft bits between the cranks,
- * starting from the flywheel end which is at X-coord 0.
- * the first cranskhaft bit is always 2 units long
- */
- polys += rod(e, -2, 0, 0, 2, crankDiam);
-
- /* Each crank is crankWidth units wide and the total width of a
- * cylinder assembly is 3.3 units. For inline engines, there is just
- * a single crank per cylinder width. For other engine
- * configurations, there is a crank between each pair of adjacent
- * cylinders on one side of the engine, so the crankOffset length is
- * halved.
- */
- e->crankOffset = 3.3;
- if (ENG.includedAngle != 0)
- e->crankOffset /= 2;
- for (j = 0; j < ENG.cylinders - 1; j++)
- polys += rod(e,
- e->crankWidth - crankThick + e->crankOffset*j, 0, 0,
- e->crankOffset - e->crankWidth + 2 * crankThick, crankDiam);
- /* the last bit connects to the engine wall on the non-flywheel end */
- polys += rod(e, e->crankWidth - crankThick + e->crankOffset*j, 0, 0, 0.9, crankDiam);
-
-
- for (j = 0; j < ENG.cylinders; j++)
- {
- glPushMatrix();
- if (j & 1)
- glRotatef(HALFREV+ENG.pistonAngle[j]+ENG.includedAngle,1,0,0);
- else
- glRotatef(HALFREV+ENG.pistonAngle[j],1,0,0);
- /* draw wrist pin */
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
- polys += rod(e, e->crankOffset*j, -1.0, 0.0, e->crankWidth, crankDiam);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
- /* draw right part of crank */
- polys += CrankBit(e, e->crankOffset*j);
- /* draw left part of crank */
- polys += CrankBit(e, e->crankWidth-crankThick+e->crankOffset*j);
- glPopMatrix();
- }
- glEndList();
- return polys;
-}
-
-
-ENTRYPOINT void reshape_engine(ModeInfo *mi, int width, int height)
-{
- Engine *e = &engine[MI_SCREEN(mi)];
- double h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(40, 1/h, 1.5, 70.0);
- glMatrixMode(GL_MODELVIEW);
- e->win_h = height;
- e->win_w = width;
-}
-
-
-ENTRYPOINT void init_engine(ModeInfo *mi)
-{
- int screen = MI_SCREEN(mi);
- Engine *e;
-
- MI_INIT(mi, engine);
- e = &engine[screen];
- e->window = MI_WINDOW(mi);
-
- e->x = e->y = e->z = e->a = e->an1 = e->nx = e->ny = e->nz =
- e->dx = e->dy = e->dz = e->da = 0;
-
- if (move) {
- e->dx = (float)(random() % 1000)/30000;
- e->dy = (float)(random() % 1000)/30000;
- e->dz = (float)(random() % 1000)/30000;
- } else {
- e->viewer[0] = 0; e->viewer[1] = 2; e->viewer[2] = 18;
- e->lookat[0] = 0; e->lookat[1] = 0; e->lookat[2] = 0;
-
- }
- if (spin) {
- e->da = (float)(random() % 1000)/125 - 4;
- e->nx = (float)(random() % 100) / 100;
- e->ny = (float)(random() % 100) / 100;
- e->nz = (float)(random() % 100) / 100;
- }
-
- {
- double spin_speed = 0.5;
- double wander_speed = 0.01;
-
- e->crankWidth = 1.5;
- e->boom_red[3] = 0.9;
- e->boom_lpos[3] = 1;
-
- e->viewer[2] = 30;
-
- e->rot = make_rotator (spin ? spin_speed : 0,
- spin ? spin_speed : 0,
- spin ? spin_speed : 0,
- 1.0,
- move ? wander_speed : 0,
- True);
-
- e->trackball = gltrackball_init (True);
- }
-
- if (!e->glx_context && /* re-initting breaks print_texture_label */
- (e->glx_context = init_GL(mi)) != NULL) {
- reshape_engine(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_NORMALIZE);
- make_tables(e);
- e->engineType = find_engine(which_engine);
-
- if (!e->engine_name)
- e->engine_name = malloc(200);
- sprintf (e->engine_name,
- "%s\n%s%d%s",
- engines[e->engineType].engineName,
- (engines[e->engineType].includedAngle == 0 ? "" :
- engines[e->engineType].includedAngle == 180 ? "Flat " : "V"),
- engines[e->engineType].cylinders,
- (engines[e->engineType].includedAngle == 0 ? " Cylinder" : "")
- );
-
- e->shaft_polys = makeshaft(e);
- e->piston_polys = makepiston(e);
-
- if (!e->font_data)
- e->font_data = load_texture_font (mi->dpy, "titleFont");
-}
-
-ENTRYPOINT Bool
-engine_handle_event (ModeInfo *mi, XEvent *event)
-{
- Engine *e = &engine[MI_SCREEN(mi)];
-
- if (event->xany.type == ButtonPress &&
- event->xbutton.button == Button1)
- {
- return True;
- }
- else if (event->xany.type == ButtonRelease &&
- event->xbutton.button == Button1) {
- e->movepaused = 0;
- }
-
- if (gltrackball_event_handler (event, e->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &e->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- which_engine = NULL; /* randomize */
- init_engine(mi);
- return True;
- }
-
- return False;
-}
-
-ENTRYPOINT void draw_engine(ModeInfo *mi)
-{
- Engine *e = &engine[MI_SCREEN(mi)];
- Window w = MI_WINDOW(mi);
- Display *disp = MI_DISPLAY(mi);
-
- if (!e->glx_context)
- return;
-
- glXMakeCurrent(disp, w, *e->glx_context);
-
-
- mi->polygon_count = display(mi);
-
- glColor3f (1, 1, 0);
- if (do_titles)
- print_texture_label (mi->dpy, e->font_data,
- mi->xgwa.width, mi->xgwa.height,
- 1, e->engine_name);
-
- if(mi->fps_p) do_fps(mi);
- glFinish();
- glXSwapBuffers(disp, w);
-}
-
-
-ENTRYPOINT void free_engine(ModeInfo *mi)
-{
- Engine *e = &engine[MI_SCREEN(mi)];
- if (!e->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *e->glx_context);
- if (e->font_data) free_texture_font (e->font_data);
- free (e->engine_name);
- gltrackball_free (e->trackball);
- free_rotator (e->rot);
- if (glIsList(e->piston_list)) glDeleteLists(e->piston_list, 1);
- if (glIsList(e->shaft_list)) glDeleteLists(e->shaft_list, 1);
-}
-
-XSCREENSAVER_MODULE ("Engine", engine)
-
-#endif
diff --git a/hacks/glx/engine.man b/hacks/glx/engine.man
deleted file mode 100644
index ff9d644..0000000
--- a/hacks/glx/engine.man
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-engine \- draws a 3D four-stroke engine.
-.SH SYNOPSIS
-.B engine
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-engine \fIname\fP]
-[\-delay \fInumber\fP]
-[\-no-move]
-[\-no-spin]
-[\-no-title]
-[\-fps]
-.SH DESCRIPTION
-Draws a simple four-stroke engine that floats around the screen.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-engine \fIname\fP
-What kind of engine to draw. Default: random.
-Known models are:
-"Honda Insight" (3),
-"BMW M3" (4),
-"VW Beetle" (flat 4),
-"Audi Quattro" (5),
-"BMW M5" (6),
-"Subaru XT" (V6),
-"Porsche 911" (flat 6),
-"Corvette Z06" (V8),
-"Dodge Viper" (V10),
-and
-"Jaguar XKE" (V12).
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-move | \-no-move
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the object should spin.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-title | \-no-title
-Whether to display the name of the engine being rendered.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Ben Buxton.
diff --git a/hacks/glx/erase-gl.c b/hacks/glx/erase-gl.c
deleted file mode 100644
index 8515dd9..0000000
--- a/hacks/glx/erase-gl.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (c) 2017 Dave Odell <dmo2118@gmail.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * xlockmore.c has references to erase_window, but it never calls these when
- * running OpenGL hacks. Using this in place of regular utils/erase.c saves a
- * tiny bit of code/disk space with a native X11 build, where everything is
- * statically linked together.
- *
- * (Linux, amd64, CFLAGS='-O2 -g')
- * Before: -rwxr-xr-x 1 david david 545848 Aug 9 20:42 hilbert
- * After: -rwxr-xr-x 1 david david 519344 Aug 9 20:41 hilbert
- *
- * (Linux, amd64, CFLAGS=-O2)
- * Before: -rwxr-xr-x 1 david david 150168 Aug 9 20:40 hilbert
- * After: -rwxr-xr-x 1 david david 141256 Aug 9 20:39 hilbert
- */
-
-#include "utils.h"
-#include "erase.h"
-
-void
-eraser_free (eraser_state *st)
-{
-}
-
-
-eraser_state *
-erase_window (Display *dpy, Window window, eraser_state *st)
-{
- return st;
-}
diff --git a/hacks/glx/esper.c b/hacks/glx/esper.c
deleted file mode 100644
index bbc0aa6..0000000
--- a/hacks/glx/esper.c
+++ /dev/null
@@ -1,2481 +0,0 @@
-/* esper, Copyright © 2017-2021 Jamie Zawinski <jwz@jwz.org>
- * Enhance 224 to 176. Pull out track right. Center in pull back.
- * Pull back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
- * Gimme a hardcopy right there.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-/*
- The Esper machine has a 4:3 display, about 12" diagonal.
- The display is overlayed with a 10x7 grid of blue lines.
- The scene goes approximately like this:
-
- "Enhance 224 To 176."
-
- ZM 0000 NS 0000 EW 0000
-
- The reticle is displayed centered.
- It moves in 8 steps with 3 frame blur to move to around to grid 1,4.
-
- ZM 0000 NS 0000 EW 0000
- ZM 0000 NS 0001 EW 0001
- ZM 0000 NS 0001 EW 0002
- ZM 0000 NS 0002 EW 0003
- ZM 0000 NS 0003 EW 0005
- ZM 0000 NS 0004 EW 0008
- ZM 0000 NS 0015 EW 0011
-
- These numbers appear to have little relation to what we are
- actually seeing on the screen. Also the same numbers are
- repeated later when looking at totally different parts of
- the photograph.
-
- ZM 0000 NS 0117 EW 0334
-
- The box appears: 8 steps, final box is 1.5x2.25 at -0.5,4.0.
-
- ZM 4086 NS 0117 EW 0334
-
- The box blinks yellow 5x.
- The image's zoom-and-pan takes 8 steps, with no text on the screen.
- The zoom is in discreet steps, with flashes.
- The grid stays the same size the whole time.
- The flashes look like solarization to blue.
- When the zoom is finished, there is still no text.
-
- "Enhance." Goes 4 more ticks down the same hole?
- "Stop." Moves up a little bit at the end.
-
- Then with no instructions, it goes 20 ticks by itself, off camera.
-
- "Move in." 10 ticks.
- "Stop." (We are looking at a fist in the picture.)
- "Pull out track right."
- "Stop." (We are looking at a newspaper.)
- "Center and pull back."
- "Stop." (We just passed the round mirror.)
- "Track 45 right."
- "Stop."
- "Center and stop."
-
- This time there was no grid until it stopped, then the grid showed up.
- There is video tearing at the bottom.
-
- "Enhance 34 to 36."
-
- ZM 0000 NS 0063 EW 0185
- ZM 0000 NS 0197 EW 0334
- ZM 3841 NS 0197 EW 0334
-
- It kind of zooms in to the center wobbly and willy-nilly.
- We are now looking at a glass.
-
- "Pan right and pull back." (There is no grid while moving again.)
- "Stop."
-
- Ok, at this point, we enter fantasy-land. From here on, the images
- shown are very high resolution with no noise. And suddenly the
- UI on the Esper is *way* higher resolution. My theory is that from
- this point on in the scene, we are not looking at the literal Esper
- machine, but instead the movie is presenting Decard's perception of
- it. We're seeing the room, not the photo of the room. The map has
- become the territory.
-
- "Enhance 34 to 46."
-
- ZM 0000 NS 0197 EW 0334
-
- This has the reticle and box only, no grid, ends with no grid.
-
- "Pull back."
- "Wait a minute. Go right."
- "Stop."
- Now it's going around the corner or something.
-
- "Enhance 57 19."
- This has a reticle then box, but the image started zooming early.
-
- "Track 45 left."
- zooms out and moves left
-
- "Stop." (O hai Zhora.)
- "Enhance 15 to 23."
-
- ZM 3852 NS 0197 EW 0334
-
- "Gimme a hardcopy right there."
-
- The printer polaroid is WAY lower resolution than the image we see on
- the "screen" -- in keeping with my theory that we were not seeing the
- screen.
-
-
- TODO:
-
- * There's a glitch at the top/bottom of the texfont textures.
- * "Pull back" isn't quite symmetric: zoom origin is slightly off.
- * Maybe display text like "Pull right" and "Stop".
-*/
-
-
-/* Use a small point size to keep it nice and grainy. */
-#define TITLE_FONT \
- "OCR A Std 10, Lucida Console 10, Monaco 10, Courier 10, monospace 10"
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*wireframe: False \n" \
- "*showFPS: False \n" \
- "*fpsTop: True \n" \
- "*useSHM: True \n" \
- "*titleFont: " TITLE_FONT "\n" \
- "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
- "*grabDesktopImages: False \n" \
- "*chooseRandomImages: True \n" \
- "*gridColor: #4444FF\n" \
- "*reticleColor: #FFFF77\n" \
- "*textColor: #FFFFBB\n" \
-
-# define refresh_esper 0
-# define release_esper 0
-# include "xlockmore.h"
-
-#undef RANDSIGN
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-#ifdef USE_GL
-
-#undef SMOOTH
-#define USE_ASYNC_LOADER
-
-# define DEF_GRID_SIZE "11"
-# define DEF_GRID_THICKNESS "15"
-# define DEF_TITLES "True"
-# define DEF_SPEED "1.0"
-# define DEF_DEBUG "False"
-
-#include "grab-ximage.h"
-#include "texfont.h"
-
-#ifdef HAVE_XSHM_EXTENSION
-# include "xshm.h" /* to get <sys/shm.h> */
-#endif
-
-
-typedef struct {
- double x, y, w, h;
-} rect;
-
-typedef struct {
- ModeInfo *mi;
- unsigned long id; /* unique */
- char *title; /* the filename of this image */
- int w, h; /* size in pixels of the image */
- int tw, th; /* size in pixels of the texture */
- XRectangle geom; /* where in the image the bits are */
- Bool loaded_p; /* whether the image has finished loading */
-# ifdef USE_ASYNC_LOADER
- texture_loader_t *loader; /* asynchronous image loader */
-# endif
- Bool used_p; /* whether the image has yet appeared
- on screen */
- GLuint texid; /* which texture contains the image */
- int refcount; /* how many sprites refer to this image */
-} image;
-
-
-typedef enum {
- BLANK,
- GRID_ON,
- IMAGE_LOAD,
- IMAGE_UNLOAD,
- IMAGE_FORCE_UNLOAD,
- REPOSITION,
- RETICLE_ON,
- RETICLE_MOVE,
- BOX_MOVE,
- IMAGE_ZOOM,
- MANUAL_RETICLE_ON,
- MANUAL_RETICLE,
- MANUAL_BOX_ON,
- MANUAL_BOX
-} anim_state;
-
-typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
-typedef enum { IMAGE, RETICLE, BOX, GRID, FLASH, TEXT } sprite_type;
-
-typedef struct {
- unsigned long id; /* unique */
- sprite_type type;
- image *img; /* type = IMAGE */
- unsigned long text_id; /* type = TEXT */
- char *text;
- GLfloat opacity;
- GLfloat thickness_scale; /* line and image types */
- Bool throb_p;
- double start_time; /* when this animation began */
- double duration; /* lifetime of sprite in seconds; 0 = inf */
- double fade_duration; /* speed of fade in and fade out */
- double pause_duration; /* delay before fade-in starts */
- Bool remain_p; /* pause forever before fade-out */
- rect from, to, current; /* the journey this image is taking */
- sprite_state state; /* the state we're in right now */
- double state_time; /* time of last state change */
- int frame_count; /* frames since last state change */
- Bool fatbits_p; /* For image texture rendering */
- Bool back_p; /* If BOX, zooming out, not in */
-} sprite;
-
-
-typedef struct {
- GLXContext *glx_context;
- int nimages; /* how many images are loaded or loading now */
- image *images[10]; /* pointers to the images */
-
- int nsprites; /* how many sprites are animating right now */
- sprite *sprites[100]; /* pointers to the live sprites */
-
- double now; /* current time in seconds */
- double dawn_of_time; /* when the program launched */
- double image_load_time; /* time when we last loaded a new image */
-
- texture_font_data *font_data;
-
- int sprite_id, image_id; /* debugging id counters */
-
- GLfloat grid_color[4], reticle_color[4], text_color[4];
-
- anim_state anim_state; /* Counters for global animation state, */
- double anim_start, anim_duration;
-
- Bool button_down_p;
-
-} esper_state;
-
-static esper_state *sss = NULL;
-
-
-/* Command-line arguments
- */
-static int grid_size;
-static int grid_thickness;
-
-static Bool do_titles; /* Display image titles. */
-static GLfloat speed;
-static Bool debug_p; /* Be loud and do weird things. */
-
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-titles", ".titles", XrmoptionNoArg, "True" },
- { "-no-titles", ".titles", XrmoptionNoArg, "False" },
- { "-debug", ".debug", XrmoptionNoArg, "True" },
-};
-
-static argtype vars[] = {
- { &grid_size, "gridSize", "GridSize", DEF_GRID_SIZE, t_Int},
- { &grid_thickness,"gridThickness","GridThickness",DEF_GRID_THICKNESS, t_Int},
- { &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
- { &speed, "speed", "Speed", DEF_SPEED, t_Float},
- { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt esper_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Returns the current time in seconds as a double.
- */
-static double
-double_time (void)
-{
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- return (now.tv_sec + ((double) now.tv_usec * 0.000001));
-}
-
-static const char *
-state_name (anim_state s)
-{
- switch (s) {
- case BLANK: return "BLANK";
- case GRID_ON: return "GRID_ON";
- case IMAGE_LOAD: return "IMAGE_LOAD";
- case IMAGE_UNLOAD: return "IMAGE_UNLOAD";
- case IMAGE_FORCE_UNLOAD: return "IMAGE_FORCE_UNLOAD";
- case REPOSITION: return "REPOSITION";
- case RETICLE_ON: return "RETICLE_ON";
- case RETICLE_MOVE: return "RETICLE_MOVE";
- case BOX_MOVE: return "BOX_MOVE";
- case IMAGE_ZOOM: return "IMAGE_ZOOM";
- case MANUAL_BOX_ON: return "MANUAL_BOX_ON";
- case MANUAL_BOX: return "MANUAL_BOX";
- case MANUAL_RETICLE_ON: return "MANUAL_RETICLE_ON";
- case MANUAL_RETICLE: return "MANUAL_RETICLE";
- default: return "UNKNOWN";
- }
-}
-
-
-static void image_loaded_cb (const char *filename, XRectangle *geom,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure);
-
-
-/* Allocate an image structure and start a file loading in the background.
- */
-static image *
-alloc_image (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- image *img = (image *) calloc (1, sizeof (*img));
-
- img->id = ++ss->image_id;
- img->loaded_p = False;
- img->used_p = False;
- img->mi = mi;
-
- glGenTextures (1, &img->texid);
- if (img->texid <= 0) abort();
-
- ss->image_load_time = ss->now;
-
- if (wire)
- image_loaded_cb (0, 0, 0, 0, 0, 0, img);
- else
- {
- /* If possible, load images at much higher resolution than the window,
- to facilitate deep zooms.
- */
- int max_max = 4096; /* ~12 megapixels */
- int max = 0;
-
-# if defined(HAVE_XSHM_EXTENSION) && \
- !defined(HAVE_MOBILE) && \
- !defined(HAVE_COCOA)
-
- /* Try not to ask for an image larger than the SHM segment size.
- If XSHM fails in a real-X11 world, it can take a staggeringly long
- time to transfer the image bits from the server over Xproto -- like,
- *18 seconds* for 4096 px and 8 seconds for 3072 px on MacOS XQuartz.
- What madness is this?
- */
- unsigned long shmmax = 0;
-
-# if defined(SHMMAX)
- /* Linux 2.6 defines this to be 0x2000000, but on CentOS 6.9,
- "sysctl kernel.shmmax" reports a luxurious 0x1000000000. */
- shmmax = SHMMAX;
-# elif defined(__APPLE__)
- /* MacOS 10.13 "sysctl kern.sysv.shmmax" is paltry: */
- shmmax = 0x400000;
-# elif defined(__linux__)
- {
- /* Raspbian 10.6 = 0xFEFFFFFF, CentOS 7.7 = 0xFFFFFFFFFEFFFFFF */
- FILE *fp = fopen ("/proc/sys/kernel/shmmax", "r");
- if (fp)
- {
- int result = fscanf (fp, "%lu", &shmmax);
- if (!result || result == EOF)
- shmmax = 0; /* Just go with max_max. */
- fclose (fp);
- }
- }
-# endif /* !SHMMAX */
-
- if (shmmax)
- {
- /* Roughly, bytes => NxN. b = (n/8)*4n = n*n*4, so n^2 = 2b, so: */
- unsigned long n = sqrt(shmmax)/2;
- if (n < max_max)
- max_max = n;
- }
-# endif /* HAVE_XSHM_EXTENSION and real X11 */
-
- glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max);
- if (max > max_max) max = max_max;
-
- /* Never ask for an image smaller than the window, even if that
- will make XSHM fall back to Xproto. */
- if (max < MI_WIDTH(mi) || max < MI_HEIGHT(mi))
- max = 0;
-
-# ifdef USE_ASYNC_LOADER
- img->loader = alloc_texture_loader (mi->xgwa.screen, mi->window,
- *ss->glx_context, 0, 0, False,
- img->texid);
-# else
- load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
- max, max, False, img->texid, image_loaded_cb, img);
-# endif
- }
-
- ss->images[ss->nimages++] = img;
- if (ss->nimages >= countof(ss->images)) abort();
-
- return img;
-}
-
-
-/* Callback that tells us that the texture has been loaded.
- */
-static void
-image_loaded_cb (const char *filename, XRectangle *geom,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- image *img = (image *) closure;
- ModeInfo *mi = img->mi;
- int ow, oh;
- /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
-
- int wire = MI_IS_WIREFRAME(mi);
-
- if (wire)
- {
- img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
- img->h = MI_HEIGHT (mi);
- img->geom.width = img->w;
- img->geom.height = img->h;
- goto DONE;
- }
-
-# ifdef USE_ASYNC_LOADER
- if (img->loader)
- {
- texture_loader_t *loader = img->loader;
- img->loader = 0;
- free_texture_loader (loader);
- }
-# endif
-
- if (image_width == 0 || image_height == 0)
- exit (1);
-
- img->w = image_width;
- img->h = image_height;
- img->tw = texture_width;
- img->th = texture_height;
- img->geom = *geom;
- img->title = (filename ? strdup (filename) : 0);
-
- ow = img->geom.width;
- oh = img->geom.height;
-
- /* If the image's width doesn't come back as the width of the screen,
- then the image must have been scaled down (due to insufficient
- texture memory.) Scale up the coordinates to stretch the image
- to fill the window.
- */
- if (img->w != MI_WIDTH(mi))
- {
- double scale = (double) MI_WIDTH(mi) / img->w;
- img->w *= scale;
- img->h *= scale;
- img->tw *= scale;
- img->th *= scale;
- img->geom.x *= scale;
- img->geom.y *= scale;
- img->geom.width *= scale;
- img->geom.height *= scale;
- }
-
- /* xscreensaver-getimage returns paths relative to the image directory
- now, so leave the sub-directory part in. Unless it's an absolute path.
- */
- if (img->title && img->title[0] == '/')
- {
- /* strip filename to part between last "/" and last ".". */
- char *s = strrchr (img->title, '/');
- if (s) strcpy (img->title, s+1);
- s = strrchr (img->title, '.');
- if (s) *s = 0;
- }
-
-# if !(__APPLE__ && TARGET_IPHONE_SIMULATOR || !defined(__OPTIMIZE__))
- if (debug_p)
-# endif
- fprintf (stderr, "%s: loaded %lu \"%s\" %dx%d\n",
- progname, img->id, (img->title ? img->title : "(null)"),
- ow, oh);
- DONE:
-
- img->loaded_p = True;
-}
-
-
-
-/* Free the image and texture, after nobody is referencing it.
- */
-static void
-destroy_image (ModeInfo *mi, image *img)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- Bool freed_p = False;
- int i;
-
- if (!img) abort();
- if (!img->loaded_p) abort();
- if (!img->used_p) abort();
- if (img->texid <= 0) abort();
- if (img->refcount != 0) abort();
-
- for (i = 0; i < ss->nimages; i++) /* unlink it from the list */
- if (ss->images[i] == img)
- {
- int j;
- for (j = i; j < ss->nimages-1; j++) /* pull remainder forward */
- ss->images[j] = ss->images[j+1];
- ss->images[j] = 0;
- ss->nimages--;
- freed_p = True;
- break;
- }
-
- if (!freed_p) abort();
-
- if (debug_p)
- fprintf (stderr, "%s: unloaded img %2lu: \"%s\"\n",
- progname, img->id, (img->title ? img->title : "(null)"));
-
- if (img->title) free (img->title);
- glDeleteTextures (1, &img->texid);
- free (img);
-}
-
-
-/* Return an image to use for a sprite.
- If it's time for a new one, get a new one.
- Otherwise, use an old one.
- Might return 0 if the machine is really slow.
- */
-static image *
-get_image (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- image *img = 0;
- image *loading_img = 0;
- int i;
-
- for (i = 0; i < ss->nimages; i++)
- {
- image *img2 = ss->images[i];
- if (!img2) abort();
- if (!img2->loaded_p)
- loading_img = img2;
- else
- img = img2;
- }
-
- /* Make sure that there is always one unused image in the pipe.
- */
- if (!img && !loading_img)
- alloc_image (mi);
-
- return img;
-}
-
-
-/* Allocate a new sprite and start its animation going.
- */
-static sprite *
-new_sprite (ModeInfo *mi, sprite_type type)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- image *img = (type == IMAGE ? get_image (mi) : 0);
- sprite *sp;
-
- if (type == IMAGE && !img)
- {
- /* Oops, no images yet! The machine is probably hurting bad.
- Let's give it some time before thrashing again. */
- usleep (250000);
- return 0;
- }
-
- sp = (sprite *) calloc (1, sizeof (*sp));
- sp->id = ++ss->sprite_id;
- sp->type = type;
- sp->start_time = ss->now;
- sp->state_time = sp->start_time;
- sp->thickness_scale = 1;
- sp->throb_p = True;
- sp->to.x = 0.5;
- sp->to.y = 0.5;
- sp->to.w = 1.0;
- sp->to.h = 1.0;
-
- if (img)
- {
- sp->img = img;
- sp->img->refcount++;
- sp->img->used_p = True;
- sp->duration = 0; /* forever, until further notice */
- sp->fade_duration = 0.5;
-
- /* Scale the sprite so that the image bits fill the window. */
- {
- double w = MI_WIDTH(mi);
- double h = MI_HEIGHT(mi);
- double r;
- r = ((img->geom.height / (double) img->geom.width) * (w / h));
- if (r > 1)
- sp->to.h *= r;
- else
- sp->to.w /= r;
- }
-
- /* Pan to a random spot */
- if (sp->to.h > 1)
- sp->to.y += frand ((sp->to.h - 1) / 2) * RANDSIGN();
- if (sp->to.w > 1)
- sp->to.x += frand ((sp->to.w - 1) / 2) * RANDSIGN();
- }
-
- sp->from = sp->current = sp->to;
-
- ss->sprites[ss->nsprites++] = sp;
- if (ss->nsprites >= countof(ss->sprites)) abort();
-
- return sp;
-}
-
-
-static sprite *
-copy_sprite (ModeInfo *mi, sprite *old)
-{
- sprite *sp = new_sprite (mi, (sprite_type) ~0L);
- int id;
- double tt;
- if (!sp) abort();
- tt = sp->start_time;
- id = sp->id;
- memcpy (sp, old, sizeof(*sp));
- sp->id = id;
- sp->state = NEW;
- sp->state_time = sp->start_time = tt;
- if (sp->img)
- sp->img->refcount++;
- return sp;
-}
-
-
-/* Free the given sprite, and decrement the reference count on its image.
- */
-static void
-destroy_sprite (ModeInfo *mi, sprite *sp)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- Bool freed_p = False;
- image *img;
- int i;
-
- if (!sp) abort();
- if (sp->state != DEAD) abort();
- img = sp->img;
-
- if (sp->type != IMAGE)
- {
- if (img) abort();
- }
- else
- {
- if (!img) abort();
- if (!img->loaded_p) abort();
- if (!img->used_p) abort();
- if (img->refcount <= 0) abort();
- }
-
- for (i = 0; i < ss->nsprites; i++) /* unlink it from the list */
- if (ss->sprites[i] == sp)
- {
- int j;
- for (j = i; j < ss->nsprites-1; j++) /* pull remainder forward */
- ss->sprites[j] = ss->sprites[j+1];
- ss->sprites[j] = 0;
- ss->nsprites--;
- freed_p = True;
- break;
- }
-
- if (!freed_p) abort();
- if (sp->text) free (sp->text);
- free (sp);
- sp = 0;
-
- if (img)
- {
- img->refcount--;
- if (img->refcount < 0) abort();
- if (img->refcount == 0)
- destroy_image (mi, img);
- }
-}
-
-
-/* Updates the sprite for the current frame of the animation based on
- its creation time compared to the current wall clock.
- */
-static void
-tick_sprite (ModeInfo *mi, sprite *sp)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- image *img = sp->img;
- double now = ss->now;
- double secs;
- double ratio;
- GLfloat visible = sp->duration + sp->fade_duration * 2;
- GLfloat total = sp->pause_duration + visible;
-
- if (sp->type != IMAGE)
- {
- if (sp->img) abort();
- }
- else
- {
- if (! sp->img) abort();
- if (! img->loaded_p) abort();
- }
-
- /* pause fade duration fade
- |------------|------------|---------|-----------|
- ....----====##########====----....
- from current to
- */
-
- secs = now - sp->start_time;
- ratio = (visible <= 0 ? 1 : ((secs - sp->pause_duration) / visible));
- if (ratio < 0) ratio = 0;
- else if (ratio > 1) ratio = 1;
-
- sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
- sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
- sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
- sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
-
- sp->thickness_scale = 1;
-
- if (secs < sp->pause_duration)
- {
- sp->state = IN;
- sp->opacity = 0;
- }
- else if (secs < sp->pause_duration + sp->fade_duration)
- {
- sp->state = IN;
- sp->opacity = (secs - sp->pause_duration) / (GLfloat) sp->fade_duration;
- }
- else if (sp->duration == 0 || /* 0 means infinite lifetime */
- sp->remain_p ||
- secs < sp->pause_duration + sp->fade_duration + sp->duration)
- {
- sp->state = FULL;
- sp->opacity = 1;
-
- /* Just after reaching full opacity, pulse the width up and down. */
- if (sp->fade_duration > 0 &&
- secs < sp->pause_duration + sp->fade_duration * 2)
- {
- GLfloat f = ((secs - (sp->pause_duration + sp->fade_duration)) /
- sp->fade_duration);
- if (sp->throb_p)
- sp->thickness_scale = 1 + 3 * (f > 0.5 ? 1-f : f);
- }
- }
- else if (secs < total)
- {
- sp->state = OUT;
- sp->opacity = (total - secs) / sp->fade_duration;
- }
- else
- {
- sp->state = DEAD;
- sp->opacity = 0;
- }
-
- sp->frame_count++;
-}
-
-
-/* Draw the given sprite at the phase of its animation dictated by
- its creation time compared to the current wall clock.
- */
-static void
-draw_image_sprite (ModeInfo *mi, sprite *sp)
-{
- /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
- int wire = MI_IS_WIREFRAME(mi);
- image *img = sp->img;
-
- if (! sp->img) abort();
- if (! img->loaded_p) abort();
-
- glPushMatrix();
- {
- GLfloat s = 1 + (sp->thickness_scale - 1) / 40.0;
- glTranslatef (0.5, 0.5, 0);
- glScalef (s, s, 1);
- glTranslatef (-0.5, -0.5, 0);
-
- glTranslatef (sp->current.x, sp->current.y, 0);
- glScalef (sp->current.w, sp->current.h, 1);
-
- glTranslatef (-0.5, -0.5, 0);
-
- if (wire) /* Draw a grid inside the box */
- {
- GLfloat dy = 0.1;
- GLfloat dx = dy * img->w / img->h;
- GLfloat x, y;
-
- if (sp->id & 1)
- glColor4f (sp->opacity, 0, 0, 1);
- else
- glColor4f (0, 0, sp->opacity, 1);
-
- glBegin(GL_LINES);
- glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
-
- for (y = 0; y < 1+dy; y += dy)
- {
- GLfloat yy = (y > 1 ? 1 : y);
- for (x = 0.5; x < 1+dx; x += dx)
- {
- GLfloat xx = (x > 1 ? 1 : x);
- glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
- glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
- }
- for (x = 0.5; x > -dx; x -= dx)
- {
- GLfloat xx = (x < 0 ? 0 : x);
- glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
- glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
- }
- }
- glEnd();
- }
- else /* Draw the texture quad */
- {
- GLfloat texw = img->geom.width / (GLfloat) img->tw;
- GLfloat texh = img->geom.height / (GLfloat) img->th;
- GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
- GLfloat texy1 = img->geom.y / (GLfloat) img->th;
- GLfloat texx2 = texx1 + texw;
- GLfloat texy2 = texy1 + texh;
- GLfloat o = sp->opacity;
- GLint mag = (sp->fatbits_p ? GL_NEAREST : GL_LINEAR);
-
- glBindTexture (GL_TEXTURE_2D, img->texid);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
-
- /* o = 1 - sin ((1 - o*o*o) * M_PI/2); */
- glColor4f (1, 1, 1, o);
-
- glNormal3f (0, 0, 1);
- glBegin (GL_QUADS);
- glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
- glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
- glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
- glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
- glEnd();
-
- if (debug_p) /* Draw a border around the image */
- {
- if (!wire) glDisable (GL_TEXTURE_2D);
- glColor4f (sp->opacity, 0, 0, 1);
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0);
- glEnd();
- if (!wire) glEnable (GL_TEXTURE_2D);
- }
- }
- }
- glPopMatrix();
-}
-
-
-static void
-draw_line_sprite (ModeInfo *mi, sprite *sp)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int w = MI_WIDTH(mi);
- int h = MI_HEIGHT(mi);
- int wh = (w > h ? w : h);
- int gs = (sp->type == RETICLE ? grid_size+1 : grid_size);
- int sx = wh / (gs + 1);
- int sy;
- int k;
- GLfloat t = grid_thickness * sp->thickness_scale;
- int fade;
- GLfloat color[4];
-
- GLfloat x = w * sp->current.x;
- GLfloat y = h * sp->current.y;
- GLfloat bw = w * sp->current.w;
- GLfloat bh = h * sp->current.h;
-
- if (MI_WIDTH(mi) > 2560) t *= 3; /* Retina displays */
-
- if (sx < 10) sx = 10;
- sy = sx;
-
- if (t > sx/3) t = sx/3;
- if (t < 1) t = 1;
- fade = t;
- if (fade < 1) fade = 1;
-
- if (t <= 0 || sp->opacity <= 0) return;
-
- glPushMatrix();
- glLoadIdentity();
-
- if (debug_p)
- {
- GLfloat s = 0.75;
- glScalef (s, s, s);
- }
-
- glOrtho (0, w, 0, h, -1, 1);
-
- switch (sp->type) {
- case GRID: memcpy (color, ss->grid_color, sizeof(color)); break;
- case RETICLE: memcpy (color, ss->reticle_color, sizeof(color)); break;
- case BOX: memcpy (color, ss->reticle_color, sizeof(color)); break;
- default: abort();
- }
-
- if (sp->type == GRID)
- {
- GLfloat s = 1 + (sp->thickness_scale - 1) / 120.0;
- glTranslatef (w/2, h/2, 0);
- glScalef (s, s, 1);
- glTranslatef (-w/2, -h/2, 0);
- }
-
- glColor4fv (color);
-
- if (!wire) glDisable (GL_TEXTURE_2D);
-
- for (k = 0; k < fade; k++)
- {
- GLfloat t2 = t * (1 - (k / (fade * 1.0)));
- if (t2 <= 0) break;
- color[3] = sp->opacity / fade;
- glColor4fv (color);
-
- glBegin (wire ? GL_LINES : GL_QUADS);
-
- switch (sp->type) {
- case GRID:
- {
- GLfloat xoff = (w - sx * (w / sx)) / 2.0;
- GLfloat yoff = (h - sy * (h / sy)) / 2.0;
- for (y = -sy/2+t2/2; y < h; y += sy)
- for (x = -sx/2-t2/2; x < w; x += sx)
- {
- glVertex3f (xoff+x+t2, yoff+y, 0);
- glVertex3f (xoff+x+t2, yoff+y+sy-t2, 0);
- glVertex3f (xoff+x, yoff+y+sy-t2, 0);
- glVertex3f (xoff+x, yoff+y, 0);
- mi->polygon_count++;
-
- glVertex3f (xoff+x, yoff+y-t2, 0);
- glVertex3f (xoff+x+sx, yoff+y-t2, 0);
- glVertex3f (xoff+x+sx, yoff+y, 0);
- glVertex3f (xoff+x, yoff+y, 0);
- mi->polygon_count++;
- }
- }
- break;
-
- case BOX:
- glVertex3f (x-bw/2-t2/2, y-bh/2-t2/2, 0);
- glVertex3f (x+bw/2+t2/2, y-bh/2-t2/2, 0);
- glVertex3f (x+bw/2+t2/2, y-bh/2+t2/2, 0);
- glVertex3f (x-bw/2-t2/2, y-bh/2+t2/2, 0);
- mi->polygon_count++;
-
- glVertex3f (x-bw/2-t2/2, y+bh/2-t2/2, 0);
- glVertex3f (x+bw/2+t2/2, y+bh/2-t2/2, 0);
- glVertex3f (x+bw/2+t2/2, y+bh/2+t2/2, 0);
- glVertex3f (x-bw/2-t2/2, y+bh/2+t2/2, 0);
- mi->polygon_count++;
-
- glVertex3f (x-bw/2+t2/2, y-bh/2+t2/2, 0);
- glVertex3f (x-bw/2+t2/2, y+bh/2-t2/2, 0);
- glVertex3f (x-bw/2-t2/2, y+bh/2-t2/2, 0);
- glVertex3f (x-bw/2-t2/2, y-bh/2+t2/2, 0);
- mi->polygon_count++;
-
- glVertex3f (x+bw/2+t2/2, y-bh/2+t2/2, 0);
- glVertex3f (x+bw/2+t2/2, y+bh/2-t2/2, 0);
- glVertex3f (x+bw/2-t2/2, y+bh/2-t2/2, 0);
- glVertex3f (x+bw/2-t2/2, y-bh/2+t2/2, 0);
- mi->polygon_count++;
- break;
-
- case RETICLE:
- glVertex3f (x+t2/2, y+sy/2-t2/2, 0);
- glVertex3f (x+t2/2, h, 0);
- glVertex3f (x-t2/2, h, 0);
- glVertex3f (x-t2/2, y+sy/2-t2/2, 0);
- mi->polygon_count++;
-
- glVertex3f (x-t2/2, y-sy/2+t2/2, 0);
- glVertex3f (x-t2/2, 0, 0);
- glVertex3f (x+t2/2, 0, 0);
- glVertex3f (x+t2/2, y-sy/2+t2/2, 0);
- mi->polygon_count++;
-
- glVertex3f (x-sx/2+t2/2, y+t2/2, 0);
- glVertex3f (0, y+t2/2, 0);
- glVertex3f (0, y-t2/2, 0);
- glVertex3f (x-sx/2+t2/2, y-t2/2, 0);
- mi->polygon_count++;
-
- glVertex3f (x+sx/2-t2/2, y-t2/2, 0);
- glVertex3f (w, y-t2/2, 0);
- glVertex3f (w, y+t2/2, 0);
- glVertex3f (x+sx/2-t2/2, y+t2/2, 0);
- mi->polygon_count++;
- break;
-
- default: abort();
- }
- glEnd();
- }
-
- glPopMatrix();
-
- if (!wire) glEnable (GL_TEXTURE_2D);
-}
-
-
-static sprite * find_newest_sprite (ModeInfo *, sprite_type);
-static void compute_image_rect (rect *, sprite *, Bool);
-
-static void
-draw_text_sprite (ModeInfo *mi, sprite *sp)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat w = MI_WIDTH(mi);
- GLfloat h = MI_HEIGHT(mi);
- GLfloat s;
- int x, y, z;
- XCharStruct e;
- sprite *target = 0;
- char text[255];
- GLfloat color[4];
- int i;
-
- if (sp->opacity <= 0)
- return;
-
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp2 = ss->sprites[i];
- if (sp2->id == sp->text_id && sp2->state != DEAD)
- {
- target = sp2;
- break;
- }
- }
-
- if (target)
- {
- rect r;
- sprite *img;
-
- if (target->opacity <= 0 &&
- (target->state == NEW || target->state == IN))
- return;
-
- r = target->current;
-
- img = find_newest_sprite (mi, IMAGE);
- if (img)
- compute_image_rect (&r, img, target->back_p);
-
- mi->recursion_depth = (img
- ? MIN (img->current.w, img->current.h)
- : 0);
-
- x = abs ((int) (r.x * 10000)) % 10000;
- y = abs ((int) (r.y * 10000)) % 10000;
- z = abs ((int) (r.w * 10000)) % 10000;
-
- sprintf (text, "ZM %04d NS %04d EW %04d", z, y, x);
-
- if ((x == 0 || x == 5000) && /* startup */
- (y == 0 || y == 5000) &&
- (z == 0 || z == 5000))
- *text = 0;
-
- if (do_titles &&
- target->type == IMAGE &&
- target->remain_p) /* The initial background image */
- {
- char *s = (target->img &&
- target->img->title && *target->img->title
- ? target->img->title
- : "Loading");
- int L = strlen (s);
- int i = (L > 23 ? L-23 : 0);
- sprintf (text, ">>%-23s", target->img->title + i);
- for (s = text; *s; s++)
- if (*s >= 'a' && *s <= 'z') *s += ('A'-'a');
- else if (*s == '/' || *s == '-' || *s == '.') *s = '_';
- }
-
- if (!*text) return;
-
- if (sp->text) free (sp->text);
- sp->text = strdup (text);
- }
- else if (sp->text && *sp->text)
- /* The target sprite might be dead, but we saved our last text. */
- strcpy (text, sp->text);
- else
- /* No target, no saved text. */
- return;
-
- texture_string_metrics (ss->font_data, text, &e, 0, 0);
-
- glPushMatrix();
- glLoadIdentity();
- glOrtho (0, 1, 0, 1, -1, 1);
-
- /* Scale the text to fit N characters horizontally. */
- {
-# ifdef HAVE_MOBILE
- GLfloat c = 25;
-# else /* desktop */
- GLfloat c = (MI_WIDTH(mi) <= 640 ? 25 :
- MI_WIDTH(mi) <= 1280 ? 32 : 64);
-# endif
- s = w / (e.ascent * c);
- }
- w /= s;
- h /= s;
- x = (w - e.width) / 2;
- y = e.ascent + e.descent * 2;
-
- glScalef (1.0/w, 1.0/h, 1);
- glTranslatef (x, y, 0);
-
- memcpy (color, ss->text_color, sizeof(color));
- color[3] = sp->opacity;
- glColor4fv (color);
-
- if (wire)
- glEnable (GL_TEXTURE_2D);
-
-#ifndef HAVE_ANDROID /* Doesn't work -- prevents image loading? */
- print_texture_string (ss->font_data, text);
-# endif
- mi->polygon_count++;
-
- if (wire)
- glDisable (GL_TEXTURE_2D);
- glPopMatrix();
-}
-
-
-static void
-draw_flash_sprite (ModeInfo *mi, sprite *sp)
-{
- /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat o = sp->opacity;
-
- if (o <= 0) return;
- o = 0.7; /* Too fast to see, so keep it consistent */
-
- glPushMatrix();
- if (!wire)
- glDisable (GL_TEXTURE_2D);
- glColor4f (0, 0, 1, o);
- glColorMask (0, 0, 1, 1); /* write only into blue and alpha channels */
- glBegin (GL_QUADS);
- glVertex3f (0, 0, 0);
- glVertex3f (1, 0, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (0, 1, 0);
- glEnd();
- glColorMask (1, 1, 1, 1);
- if (!wire)
- glEnable (GL_TEXTURE_2D);
- glPopMatrix();
-}
-
-
-static void
-draw_sprite (ModeInfo *mi, sprite *sp)
-{
- glEnable (GL_BLEND);
- switch (sp->type) {
- case IMAGE:
- draw_image_sprite (mi, sp);
- break;
- case RETICLE:
- case BOX:
- case GRID:
- draw_line_sprite (mi, sp);
- break;
- case TEXT:
- draw_text_sprite (mi, sp);
- break;
- case FLASH:
- draw_flash_sprite (mi, sp);
- break;
- default:
- abort();
- }
-}
-
-
-static void
-tick_sprites (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int i;
-
-# ifdef USE_ASYNC_LOADER
- double end_by_time = ss->now + ((double) mi->pause) / 2000000;
- for (i = 0; i < ss->nimages; i++)
- {
- image *img = ss->images[i];
- if (img->loader)
- {
- if (texture_loader_failed (img->loader))
- abort();
- step_texture_loader (img->loader, end_by_time - double_time(),
- image_loaded_cb, img);
- }
- }
-# endif
-
- for (i = 0; i < ss->nsprites; i++)
- tick_sprite (mi, ss->sprites[i]);
-
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- if (sp->state == DEAD)
- {
- destroy_sprite (mi, sp);
- i--;
- }
- }
-}
-
-
-static void
-draw_sprites (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int i;
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
-/*
- {
- GLfloat rot = current_device_rotation();
- glTranslatef (0.5, 0.5, 0);
- glRotatef(rot, 0, 0, 1);
- if ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135))
- {
- GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
- glScalef (s, 1/s, 1);
- }
- glTranslatef (-0.5, -0.5, 0);
- }
-*/
-
- /* Draw the images first, then the overlays. */
- for (i = 0; i < ss->nsprites; i++)
- if (ss->sprites[i]->type == IMAGE)
- draw_sprite (mi, ss->sprites[i]);
- for (i = 0; i < ss->nsprites; i++)
- if (ss->sprites[i]->type != IMAGE)
- draw_sprite (mi, ss->sprites[i]);
-
- glPopMatrix();
-
- if (debug_p) /* draw a white box (the "screen") */
- {
- int wire = MI_IS_WIREFRAME(mi);
-
- if (!wire) glDisable (GL_TEXTURE_2D);
-
- glColor4f (1, 1, 1, 1);
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0);
- glEnd();
-
- if (!wire) glEnable (GL_TEXTURE_2D);
- }
-}
-
-
-static void
-fadeout_sprite (ModeInfo *mi, sprite *sp)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
-
- /* If it hasn't faded in yet, don't fade out. */
- if (ss->now <= sp->start_time + sp->pause_duration)
- sp->fade_duration = 0;
-
- /* Pretend it's at the point where it should fade out. */
- sp->pause_duration = 0;
- sp->duration = 9999;
- sp->remain_p = False;
- sp->start_time = ss->now - sp->duration;
-}
-
-static void
-fadeout_sprites (ModeInfo *mi, sprite_type type)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- if (sp->type == type)
- fadeout_sprite (mi, sp);
- }
-}
-
-
-static sprite *
-find_newest_sprite (ModeInfo *mi, sprite_type type)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- sprite *sp = 0;
- int i;
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp2 = ss->sprites[i];
- if (sp2->type == type &&
- (!sp ||
- (sp->start_time < sp2->start_time &&
- ss->now >= sp2->start_time + sp2->pause_duration)))
- sp = sp2;
- }
- return sp;
-}
-
-
-/* Enqueue a text sprite describing the given sprite that runs at the
- same time.
- */
-static sprite *
-push_text_sprite (ModeInfo *mi, sprite *sp)
-{
- /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
- sprite *sp2 = new_sprite (mi, TEXT);
- if (!sp2) abort();
- sp2->text_id = sp->id;
- sp2->fade_duration = sp->fade_duration;
- sp2->duration = sp->duration;
- sp2->pause_duration = sp->pause_duration;
- return sp2;
-}
-
-
-/* Enqueue a flash sprite that fires at the same time.
- */
-#ifndef SMOOTH
-static sprite *
-push_flash_sprite (ModeInfo *mi, sprite *sp)
-{
- /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
- sprite *sp2 = new_sprite (mi, FLASH);
- if (!sp2) abort();
- if (sp->type != IMAGE) abort();
- sp2->text_id = sp->id;
- sp2->duration = MAX (0.07 / speed, 0.07);
- sp2->fade_duration = 0; /* Fading these is too fast to see */
- sp2->pause_duration = sp->pause_duration + (sp->fade_duration * 0.3);
- return sp2;
-}
-#endif /* !SMOOTH */
-
-
-/* Set the sprite's duration based on distance travelled.
- */
-static void
-compute_sprite_duration (ModeInfo *mi, sprite *sp, Bool blink_p)
-{
- /* Compute max distance traveled by any point (corners or center). */
- /* (cpp is the devil) */
-# define L(F) (sp->F.x - sp->F.w/2) /* delta of left edge, from/to */
-# define R(F) (1-(sp->F.x + sp->F.w/2)) /* right */
-# define B(F) (sp->F.y - sp->F.h/2) /* top */
-# define T(F) (1-(sp->F.y + sp->F.h/2)) /* bottom */
-# define D(F,G) sqrt(F(from)*F(from) + G(to)*G(to)) /* corner traveled */
- double BL = D(B,L);
- double BR = D(B,R);
- double TL = D(T,L);
- double TR = D(T,R);
- double cx = sp->to.x - sp->from.x;
- double cy = sp->to.y - sp->from.y;
- double C = sqrt(cx*cx + cy*cy);
- double dist = MAX (BL, MAX (BR, MAX (TL, MAX (TR, C))));
-# undef L
-# undef R
-# undef B
-# undef T
-# undef D
-
- int steps = 1 + dist * 28;
- if (steps > 10) steps = 10;
-
- sp->duration = steps * 0.2 / speed;
-
-# ifndef SMOOTH
- sp->duration += 1.5 / speed; /* For linger added by animate_sprite_path() */
- if (blink_p) sp->duration += 0.6 / speed;
-# endif
-}
-
-
-/* Convert the sprite to a jerky transition.
- Instead of smoothly animating, move in discrete steps,
- using multiple staggered sprites.
- */
-static void
-animate_sprite_path (ModeInfo *mi, sprite *sp, Bool blink_p)
-{
-# ifndef SMOOTH
- /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
- double dx = sp->to.x - sp->from.x;
- double dy = sp->to.y - sp->from.y;
- double dw = sp->to.w - sp->from.w;
- double dh = sp->to.h - sp->from.h;
- double linger = 1.5 / speed;
- double blinger = 0.6 / speed;
- double dur = sp->duration - linger - (blink_p ? blinger : 0);
- int steps = dur / 0.3 * speed; /* step duration in seconds */
- int i;
-
- if (sp->type == IMAGE)
- steps *= 0.8;
-
- if (steps < 2) steps = 2;
- if (steps > 10) steps = 10;
-
- /* if (dur <= 0.01) abort(); */
- if (dur < 0.01)
- linger = blinger = 0;
-
- for (i = 0; i <= steps; i++)
- {
- sprite *sp2 = copy_sprite (mi, sp);
- if (!sp2) abort();
-
- sp2->to.x = (sp->current.x + i * dx / steps);
- sp2->to.y = (sp->current.y + i * dy / steps);
- sp2->to.w = (sp->current.w + i * dw / steps);
- sp2->to.h = (sp->current.h + i * dh / steps);
- sp2->current = sp2->from = sp2->to;
- sp2->duration = dur / steps;
- sp2->pause_duration += i * sp2->duration;
- sp2->remain_p = False;
- sp2->fatbits_p = True;
-
- if (i == steps)
- sp2->duration += linger; /* last one lingers for a bit */
-
- if (i == steps && !blink_p)
- {
- sp2->remain_p = sp->remain_p;
- sp2->fatbits_p = False;
- }
-
- if (sp2->type == IMAGE && i > 0)
- push_flash_sprite (mi, sp2);
-
- if (sp2->type == RETICLE || sp2->type == BOX)
- {
- sp2 = push_text_sprite (mi, sp2);
- if (i == steps)
- sp2->duration += linger * 2;
- }
- }
-
- if (blink_p && blinger) /* last one blinks before vanishing */
- {
- int blinkers = 3;
- for (i = 1; i <= blinkers; i++)
- {
- sprite *sp2 = copy_sprite (mi, sp);
- if (!sp2) abort();
-
- sp2->current = sp2->from = sp->to;
- sp2->duration = blinger / blinkers;
- sp2->pause_duration += dur + linger + i * sp2->duration;
- sp2->remain_p = False;
- if (i == blinkers)
- {
- sp2->remain_p = sp->remain_p;
- sp2->fatbits_p = False;
- }
- }
- }
-
- /* Fade out the template sprite. It might not have even appeared yet. */
- fadeout_sprite (mi, sp);
-# endif
-}
-
-
-/* Input rect is of a reticle or box.
- Output rect is what the image's rect should be so that the only part
- visible is the part indicated by the input rect.
- */
-static void
-compute_image_rect (rect *r, sprite *img, Bool inverse_p)
-{
- double scale = (inverse_p ? 1/r->w : r->w);
- double dx = r->x - 0.5;
- double dy = r->y - 0.5;
-
- /* Adjust size and center by zoom factor */
- r->w = img->current.w / scale;
- r->h = img->current.h / scale;
- r->x = 0.5 + (img->current.x - 0.5) / scale;
- r->y = 0.5 + (img->current.y - 0.5) / scale;
-
- /* Move center */
-
- if (inverse_p)
- {
- dx = -dx; /* #### Close but not quite right */
- dy = -dy;
- }
-
- r->x -= dx / scale;
- r->y -= dy / scale;
-}
-
-
-/* Sets 'to' such that the image zooms out so that the only part visible
- is the part indicated by the box.
- */
-static void
-track_box_with_image (ModeInfo *mi, sprite *sp, sprite *img)
-{
- rect r = sp->current;
- compute_image_rect (&r, img, sp->back_p);
- img->to = r;
-
- /* Never zoom out too far. */
- if (img->to.w < 1 && img->to.h < 1)
- {
- if (img->to.w > img->to.h)
- {
- img->to.w = img->to.w / img->to.h;
- img->to.h = 1;
- }
- else
- {
- img->to.h = img->to.h / img->to.w;
- img->to.w = 1;
- }
- }
-
- /* Never pan beyond the bounds of the image. */
- if (img->to.x < -img->to.w/2+1) img->to.x = -img->to.w/2+1;
- if (img->to.x > img->to.w/2) img->to.x = img->to.w/2;
- if (img->to.y < -img->to.h/2+1) img->to.y = -img->to.h/2+1;
- if (img->to.y > img->to.h/2) img->to.y = img->to.h/2;
-}
-
-
-static void
-tick_animation (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- anim_state prev_state = ss->anim_state;
- sprite *sp = 0;
- int i;
-
- switch (ss->anim_state) {
- case BLANK:
- ss->anim_state = GRID_ON;
- break;
- case GRID_ON:
- ss->anim_state = IMAGE_LOAD;
- break;
- case IMAGE_LOAD:
- /* Only advance once an image has loaded. */
- if (find_newest_sprite (mi, IMAGE))
- ss->anim_state = RETICLE_ON;
- else {
- ss->anim_state = IMAGE_LOAD;
- }
- break;
- case RETICLE_ON:
- ss->anim_state = RETICLE_MOVE;
- break;
- case RETICLE_MOVE:
- if (random() % 6)
- ss->anim_state = BOX_MOVE;
- else
- ss->anim_state = IMAGE_ZOOM;
- break;
- case BOX_MOVE:
- ss->anim_state = IMAGE_ZOOM;
- break;
- case IMAGE_ZOOM:
- {
- sprite *sp = find_newest_sprite (mi, IMAGE);
- double depth = (sp
- ? MIN (sp->current.w, sp->current.h)
- : 0);
- if (depth > 20)
- ss->anim_state = IMAGE_UNLOAD;
- else
- ss->anim_state = RETICLE_ON;
- }
- break;
- case IMAGE_FORCE_UNLOAD:
- ss->anim_state = IMAGE_UNLOAD;
- break;
- case IMAGE_UNLOAD:
- ss->anim_state = IMAGE_LOAD;
- break;
- case MANUAL_BOX_ON:
- ss->anim_state = MANUAL_BOX;
- break;
- case MANUAL_BOX:
- break;
- case MANUAL_RETICLE_ON:
- ss->anim_state = MANUAL_RETICLE;
- break;
- case MANUAL_RETICLE:
- break;
- default:
- abort();
- break;
- }
-
- ss->anim_start = ss->now;
- ss->anim_duration = 0;
-
- if (debug_p)
- fprintf (stderr, "%s: entering %s\n",
- progname, state_name (ss->anim_state));
-
- switch (ss->anim_state) {
-
- case GRID_ON: /* Start the grid fading in. */
- if (! find_newest_sprite (mi, GRID))
- {
- sp = new_sprite (mi, GRID);
- if (!sp) abort();
- sp->fade_duration = 1.0 / speed;
- sp->duration = 2.0 / speed;
- sp->remain_p = True;
- ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
- sp->duration);
- }
- break;
-
- case IMAGE_LOAD:
- fadeout_sprites (mi, IMAGE);
- sp = new_sprite (mi, IMAGE);
- if (! sp)
- {
- if (debug_p) fprintf (stderr, "%s: image load failed\n", progname);
- break;
- }
-
- sp->fade_duration = 0.5 / speed;
- sp->duration = sp->fade_duration * 3;
- sp->remain_p = True;
- /* If we zoom in, we lose the pulse at the end. */
- /* sp->from.w = sp->from.h = 0.0001; */
- sp->current = sp->from;
-
- ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
- sp->duration);
-
- sp = push_text_sprite (mi, sp);
- sp->fade_duration = 0.2 / speed;
- sp->pause_duration = 0;
- sp->duration = 2.5 / speed;
- break;
-
- case IMAGE_FORCE_UNLOAD:
- break;
-
- case IMAGE_UNLOAD:
- sp = find_newest_sprite (mi, IMAGE);
- if (sp)
- sp->fade_duration = ((prev_state == IMAGE_FORCE_UNLOAD ? 0.2 : 3.0)
- / speed);
- fadeout_sprites (mi, IMAGE);
- fadeout_sprites (mi, RETICLE);
- fadeout_sprites (mi, BOX);
- fadeout_sprites (mi, TEXT);
- ss->anim_duration = (sp ? sp->fade_duration : 0) + 3.5 / speed;
- break;
-
- case RETICLE_ON: /* Display reticle at center. */
- fadeout_sprites (mi, TEXT);
- sp = new_sprite (mi, RETICLE);
- if (!sp) abort();
- sp->fade_duration = 0.2 / speed;
- sp->pause_duration = 1.0 / speed;
- sp->duration = 1.5 / speed;
- ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
- sp->duration);
- ss->anim_duration -= sp->fade_duration * 2;
- break;
-
- case RETICLE_MOVE:
- /* Reticle has faded in. Now move it to somewhere else.
- Create N new reticle sprites, wih staggered pause_durations.
- */
- {
- GLfloat ox = 0.5;
- GLfloat oy = 0.5;
- GLfloat nx, ny, dist;
-
- do { /* pick a new position not too near the old */
- nx = 0.3 + BELLRAND(0.4);
- ny = 0.3 + BELLRAND(0.4);
- dist = sqrt ((nx-ox)*(nx-ox) + (ny-oy)*(ny-oy));
- } while (dist < 0.1);
-
- sp = new_sprite (mi, RETICLE);
- if (!sp) abort();
-
- sp->from.x = ox;
- sp->from.y = oy;
- sp->current = sp->to = sp->from;
- sp->to.x = nx;
- sp->to.y = ny;
- sp->fade_duration = 0.2 / speed;
- sp->pause_duration = 0;
- compute_sprite_duration (mi, sp, False);
-
- ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
- sp->duration - 0.1);
- animate_sprite_path (mi, sp, False);
- }
- break;
-
- case BOX_MOVE:
- /* Reticle has moved, and faded out.
- Start the box zooming into place.
- */
- {
- GLfloat ox = 0.5;
- GLfloat oy = 0.5;
- GLfloat nx, ny;
- GLfloat z;
-
- /* Find the last-added reticle, for our destination position. */
- sp = 0;
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp2 = ss->sprites[i];
- if (sp2->type == RETICLE &&
- (!sp || sp->start_time < sp2->start_time))
- sp = sp2;
- }
- if (sp)
- {
- nx = sp->to.x;
- ny = sp->to.y;
- }
- else
- {
- nx = ny = 0.5;
- if (debug_p)
- fprintf (stderr, "%s: no reticle before box?\n", progname);
- }
-
- z = 0.3 + frand(0.5);
-
- /* Ensure that the selected box is contained within the screen */
- {
- double margin = 0.005;
- double maxw = 2 * MIN (1 - margin - nx, nx - margin);
- double maxh = 2 * MIN (1 - margin - ny, ny - margin);
- double max = MIN (maxw, maxh);
- if (z > max) z = max;
- }
-
- sp = new_sprite (mi, BOX);
- if (!sp) abort();
- sp->from.x = ox;
- sp->from.y = oy;
- sp->from.w = 1.0;
- sp->from.h = 1.0;
- sp->current = sp->from;
- sp->to.x = nx;
- sp->to.y = ny;
- sp->to.w = z;
- sp->to.h = z;
-
- /* Maybe zoom out instead of in.
- */
- {
- sprite *img = find_newest_sprite (mi, IMAGE);
- double depth = MIN (img->current.w, img->current.h);
- if (depth > 1 && /* if zoomed in */
- (depth < 6 ? !(random() % 5) : /* 20% */
- depth < 12 ? !(random() % 2) : /* 50% */
- (random() % 3))) /* 66% */
- {
- sp->back_p = True;
- if (depth < 1.5 && z < 0.8)
- {
- z = 0.8; /* don't zoom out much past 100% */
- sp->to.w = z;
- sp->to.h = z;
- }
- }
- }
-
- sp->fade_duration = 0.2 / speed;
- sp->pause_duration = 2.0 / speed;
- compute_sprite_duration (mi, sp, True);
- ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
- sp->duration - 0.1);
- animate_sprite_path (mi, sp, True);
- }
- break;
-
- case IMAGE_ZOOM:
-
- /* Box has moved, and faded out.
- Or, if no box, then just a reticle.
- Zoom the underlying image to track the box's position. */
- {
- sprite *img, *img2;
-
- /* Find latest box or reticle, for our destination position. */
- sp = find_newest_sprite (mi, BOX);
- if (! sp)
- sp = find_newest_sprite (mi, RETICLE);
- if (! sp)
- {
- if (debug_p)
- fprintf (stderr, "%s: no box or reticle before image\n",
- progname);
- break;
- }
-
- img = find_newest_sprite (mi, IMAGE);
- if (!img)
- {
- if (debug_p)
- fprintf (stderr, "%s: no image?\n", progname);
- break;
- }
-
- img2 = copy_sprite (mi, img);
- if (!img2) abort();
-
- img2->from = img->current;
-
- fadeout_sprite (mi, img);
-
- track_box_with_image (mi, sp, img2);
-
- img2->fade_duration = 0.2 / speed;
- img2->pause_duration = 0.5 / speed;
- img2->remain_p = True;
- img2->throb_p = False;
- compute_sprite_duration (mi, img2, False);
-
- img->start_time += img2->pause_duration;
-
- ss->anim_duration = (img2->pause_duration + img2->fade_duration * 2 +
- img2->duration);
- animate_sprite_path (mi, img2, False);
- fadeout_sprites (mi, TEXT);
- }
- break;
-
- case MANUAL_BOX_ON:
- case MANUAL_RETICLE_ON:
- break;
-
- case MANUAL_BOX:
- case MANUAL_RETICLE:
- {
- sprite_type tt = (ss->anim_state == MANUAL_BOX ? BOX : RETICLE);
- sprite *osp = find_newest_sprite (mi, tt);
- fadeout_sprites (mi, RETICLE);
- fadeout_sprites (mi, BOX);
-
- sp = new_sprite (mi, tt);
- if (!sp) abort();
- if (osp)
- sp->from = osp->current;
- else
- {
- sp->from.x = 0.5;
- sp->from.y = 0.5;
- sp->from.w = 0.5;
- sp->from.h = 0.5;
- }
- sp->to = sp->current = sp->from;
- sp->fade_duration = 0.2 / speed;
- sp->duration = 0.2 / speed;
- sp->remain_p = True;
- sp->throb_p = False;
- ss->anim_duration = 9999;
- }
- break;
-
- default:
- fprintf (stderr,"%s: unknown state %d\n",
- progname, (int) ss->anim_state);
- abort();
- }
-}
-
-
-/* Copied from gltrackball.c, sigh.
- */
-static void
-adjust_for_device_rotation (double *x, double *y, double *w, double *h)
-{
- int rot = (int) current_device_rotation();
- int swap;
-
- while (rot <= -180) rot += 360;
- while (rot > 180) rot -= 360;
-
- if (rot > 135 || rot < -135) /* 180 */
- {
- *x = *w - *x;
- *y = *h - *y;
- }
- else if (rot > 45) /* 90 */
- {
- swap = *x; *x = *y; *y = swap;
- swap = *w; *w = *h; *h = swap;
- *x = *w - *x;
- }
- else if (rot < -45) /* 270 */
- {
- swap = *x; *x = *y; *y = swap;
- swap = *w; *w = *h; *h = swap;
- *y = *h - *y;
- }
-}
-
-
-ENTRYPOINT Bool
-esper_handle_event (ModeInfo *mi, XEvent *event)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
-
- if (event->xany.type == Expose ||
- event->xany.type == GraphicsExpose ||
- event->xany.type == VisibilityNotify)
- {
- return False;
- }
- else if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- sprite *sp = 0;
- double delta = 0.025;
- double margin = 0.005;
- Bool ok = False;
-
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
-
- if (c == '\t')
- {
- ss->anim_state = IMAGE_FORCE_UNLOAD;
- return True;
- }
-
- if (! find_newest_sprite (mi, IMAGE))
- return False; /* Too early */
-
- ss->now = double_time();
-
-# define BONK() do { \
- if (ss->anim_state != MANUAL_BOX_ON && \
- ss->anim_state != MANUAL_BOX) { \
- ss->anim_state = MANUAL_BOX_ON; \
- tick_animation (mi); \
- } \
- sp = find_newest_sprite (mi, BOX); \
- if (!sp) abort() ; \
- sp->from = sp->current; \
- sp->to = sp->from; \
- sp->start_time = ss->now - sp->fade_duration; \
- ok = True; \
- } while(0)
-
- if (keysym == XK_Left || c == ',' || c == '<')
- {
- BONK();
- sp->to.x -= delta;
- }
- else if (keysym == XK_Right || c == '.' || c == '>')
- {
- BONK();
- sp->to.x += delta;
- }
- else if (keysym == XK_Down || c == '-')
- {
- BONK();
- sp->to.y -= delta;
- }
- else if (keysym == XK_Up || c == '=')
- {
- BONK();
- sp->to.y += delta, ok = True;
- }
- else if (keysym == XK_Prior || c == '+')
- {
- BONK();
- sp->to.w += delta;
- sp->to.h = sp->to.w * sp->from.w / sp->from.h;
- }
- else if (keysym == XK_Next || c == '_')
- {
- BONK();
- sp->to.w -= delta;
- sp->to.h = sp->to.w * sp->from.w / sp->from.h;
- }
- else if ((c == ' ' || c == '\t') && debug_p &&
- ss->anim_state == MANUAL_BOX)
- {
- BONK(); /* Null motion: just flash the current image. */
- }
- else if ((keysym == XK_Home || c == ' ' || c == '\t') &&
- ss->anim_state == MANUAL_BOX)
- {
- BONK();
- sp->to.x = 0.5;
- sp->to.y = 0.5;
- sp->to.w = 0.5;
- sp->to.h = 0.5;
- }
- else if ((c == '\r' || c == '\n' || c == 033) &&
- ss->anim_state == MANUAL_BOX)
- {
- BONK();
- ss->anim_state = BOX_MOVE;
- ss->anim_duration = 9999;
- ss->anim_start = ss->now - ss->anim_duration;
- fadeout_sprite (mi, sp);
- return True;
- }
- else
- return False;
-
- if (! ok)
- return False;
-
- /* Keep it on screen */
- if (sp->to.w > 1 - margin)
- {
- GLfloat r = sp->to.h / sp->to.w;
- sp->to.w = 1-margin;
- sp->to.h = (1-margin) * r;
- }
- if (sp->to.h > 1)
- {
- GLfloat r = sp->to.h / sp->to.w;
- sp->to.w = (1-margin) / r;
- sp->to.h = 1-margin;
- }
-
- if (sp->to.x - sp->to.w/2 < margin)
- sp->to.x = sp->to.w/2 + margin;
- if (sp->to.y - sp->to.h/2 < margin)
- sp->to.y = sp->to.h/2 + margin;
-
- if (sp->to.x + sp->to.w/2 >= 1 + margin)
- sp->to.x = 1 - (sp->to.w/2 + margin);
- if (sp->to.y + sp->to.h/2 >= 1 + margin)
- sp->to.y = 1 - (sp->to.h/2 + margin);
-
- /* Now let's give a momentary glimpse of what the image would do. */
- if (debug_p)
- {
- sprite *img = 0;
- int i;
-
- /* Find the lingering image */
- /* img = find__sprite (mi, IMAGE); */
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp2 = ss->sprites[i];
- if (sp2->type == IMAGE &&
- sp2->remain_p &&
- (!img ||
- (img->start_time < sp2->start_time &&
- ss->now >= sp2->start_time + sp2->pause_duration)))
- img = sp2;
- }
-
- if (!img) abort();
- img = copy_sprite (mi, img);
- img->pause_duration = 0;
- img->fade_duration = 0.1 / speed;
- img->duration = 0.5 / speed;
- img->start_time = ss->now;
- img->remain_p = False;
- track_box_with_image (mi, sp, img);
- img->from = img->current = img->to;
- }
-
- return True;
- }
- else if (event->xany.type == ButtonPress &&
- event->xbutton.button == Button1)
- {
- ss->button_down_p = 1;
- return True;
- }
- else if (event->xany.type == ButtonRelease &&
- event->xbutton.button == Button1)
- {
- ss->button_down_p = 0;
-
- if (ss->anim_state == MANUAL_BOX)
- {
- sprite *sp = find_newest_sprite (mi, BOX);
- if (sp) fadeout_sprite (mi, sp);
- ss->anim_state = BOX_MOVE;
- ss->anim_duration = 9999;
- ss->anim_start = ss->now - ss->anim_duration;
- }
- else if (ss->anim_state == MANUAL_RETICLE)
- {
- sprite *sp = find_newest_sprite (mi, RETICLE);
- if (sp) fadeout_sprite (mi, sp);
- ss->anim_state = RETICLE_MOVE;
- ss->anim_duration = 9999;
- ss->anim_start = ss->now - ss->anim_duration;
- }
- return True;
- }
- else if (event->xany.type == MotionNotify &&
- ss->button_down_p &&
- (ss->anim_state == MANUAL_RETICLE ||
- ss->anim_state == RETICLE_MOVE))
- {
- sprite *sp = 0;
- double x = event->xmotion.x;
- double y = event->xmotion.y;
- double w = MI_WIDTH(mi);
- double h = MI_HEIGHT(mi);
-
- adjust_for_device_rotation (&x, &y, &w, &h);
- x = x/w;
- y = 1-y/h;
-
- if (ss->anim_state != MANUAL_RETICLE_ON &&
- ss->anim_state != MANUAL_RETICLE)
- {
- ss->anim_state = MANUAL_RETICLE_ON;
- tick_animation (mi);
- }
- sp = find_newest_sprite (mi, RETICLE);
- if (!sp) abort();
- sp->from = sp->current;
- sp->to = sp->from;
- sp->start_time = ss->now - sp->fade_duration;
- sp->remain_p = True;
-
- sp->current.x = MIN (0.95, MAX (0.05, x));
- sp->current.y = MIN (0.95, MAX (0.05, y));
- sp->from = sp->to = sp->current;
-
- /* Don't update the text sprite more often than once a second. */
- {
- sprite *sp2 = find_newest_sprite (mi, TEXT);
- if (!sp2 || sp2->start_time < ss->now-1)
- {
- fadeout_sprites (mi, TEXT);
- sp = push_text_sprite (mi, sp);
- sp->remain_p = True;
- }
- }
-
- return True;
- }
- else if (event->xany.type == MotionNotify &&
- ss->button_down_p &&
- (ss->anim_state == MANUAL_BOX ||
- ss->anim_state == BOX_MOVE))
- {
- sprite *sp = 0;
- double x = event->xmotion.x;
- double y = event->xmotion.y;
- double w = MI_WIDTH(mi);
- double h = MI_HEIGHT(mi);
- double max;
- Bool ok = True;
-
- adjust_for_device_rotation (&x, &y, &w, &h);
- x = x/w;
- y = 1-y/h;
-
- BONK();
- max = (2 * (0.5 - MAX (fabs (sp->current.x - 0.5),
- fabs (sp->current.y - 0.5)))
- * 0.95);
-
- x = fabs (x - sp->current.x);
- y = fabs (y - sp->current.y);
-
- if (x > y)
- sp->current.w = sp->current.h = MIN (max, MAX (0.05, 2*x));
- else
- sp->current.w = sp->current.h = MIN (max, MAX (0.05, 2*y));
- sp->from = sp->to = sp->current;
-
- /* Don't update the text sprite more often than once a second. */
- {
- sprite *sp2 = find_newest_sprite (mi, TEXT);
- if (!sp2 || sp2->start_time < ss->now-1)
- {
- fadeout_sprites (mi, TEXT);
- sp = push_text_sprite (mi, sp);
- sp->remain_p = True;
- }
- }
-
- return ok;
- }
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- ss->anim_state = IMAGE_FORCE_UNLOAD;
- return True;
- }
-# undef BONK
-
- return False;
-}
-
-
-ENTRYPOINT void
-reshape_esper (ModeInfo *mi, int width, int height)
-{
- GLfloat s;
-
- glViewport (0, 0, width, height);
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity();
- glRotatef (current_device_rotation(), 0, 0, 1);
- glMatrixMode (GL_MODELVIEW);
- glLoadIdentity();
-
- s = 2;
-
- if (debug_p)
- {
- s *= 0.75;
- if (s < 0.1) s = 0.1;
- }
-
- glScalef (s, s, s);
- glTranslatef (-0.5, -0.5, 0);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- /* Stretch each existing image to match new window aspect. */
- {
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- if (sp && sp->type == IMAGE && sp->img && sp->img->loaded_p)
- {
- GLfloat sp_asp = sp->current.h / sp->current.w;
- GLfloat img_asp = (sp->img->geom.height /
- (GLfloat) sp->img->geom.width);
- GLfloat new_win = (MI_WIDTH(mi) / (double) MI_HEIGHT(mi));
- GLfloat old_win = sp_asp / img_asp;
- GLfloat r = old_win / new_win;
- if (img_asp > 1)
- {
- sp->from.h /= r;
- sp->current.h /= r;
- sp->to.h /= r;
- }
- else
- {
- sp->from.w *= r;
- sp->current.w *= r;
- sp->to.w *= r;
- }
- }
- }
- }
-}
-
-
-static void
-parse_color (ModeInfo *mi, char *key, GLfloat color[4])
-{
- XColor xcolor;
- char *string = get_string_resource (mi->dpy, key, "EsperColor");
- if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
- {
- fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
- key, string);
- exit (1);
- }
- free (string);
-
- color[0] = xcolor.red / 65536.0;
- color[1] = xcolor.green / 65536.0;
- color[2] = xcolor.blue / 65536.0;
- color[3] = 1;
-}
-
-
-ENTRYPOINT void
-init_esper (ModeInfo *mi)
-{
- int screen = MI_SCREEN(mi);
- esper_state *ss;
-
- MI_INIT (mi, sss);
- ss = &sss[screen];
-
- if ((ss->glx_context = init_GL(mi)) != NULL) {
- reshape_esper (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
-
- parse_color (mi, "gridColor", ss->grid_color);
- parse_color (mi, "reticleColor", ss->reticle_color);
- parse_color (mi, "textColor", ss->text_color);
-
- ss->font_data = load_texture_font (mi->dpy, "titleFont");
-
- ss->now = double_time();
- ss->dawn_of_time = ss->now;
-
- alloc_image (mi);
-
- ss->anim_state = BLANK;
- ss->anim_start = 0;
- ss->anim_duration = 0;
-}
-
-
-ENTRYPOINT void
-draw_esper (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
-
- if (!ss->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ss->glx_context);
-
- mi->polygon_count = 0;
-
- ss->now = double_time();
-
- glDisable (GL_LIGHTING);
- glDisable (GL_DEPTH_TEST);
- glDepthMask (GL_FALSE);
- glEnable (GL_CULL_FACE);
- glCullFace (GL_BACK);
-
- if (! wire)
- {
- glEnable (GL_TEXTURE_2D);
- glShadeModel (GL_SMOOTH);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- tick_sprites (mi);
- draw_sprites (mi);
- if (ss->now >= ss->anim_start + ss->anim_duration)
- tick_animation (mi);
-
- if (mi->fps_p) do_fps (mi);
-
- glFinish();
- glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
-}
-
-
-ENTRYPOINT void
-free_esper (ModeInfo *mi)
-{
- esper_state *ss = &sss[MI_SCREEN(mi)];
- int i;
- if (!ss->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ss->glx_context);
-
- if (ss->font_data) free_texture_font (ss->font_data);
- for (i = 0; i < ss->nimages; i++) {
- if (ss->images[i]) {
- if (ss->images[i]->title) free (ss->images[i]->title);
- if (ss->images[i]->texid) glDeleteTextures (1, &ss->images[i]->texid);
- free (ss->images[i]);
- }
- }
- for (i = 0; i < countof(ss->sprites); i++) {
- if (ss->sprites[i]) {
- if (ss->sprites[i]->text) free (ss->sprites[i]->text);
- if (ss->sprites[i]) free (ss->sprites[i]);
- }
- }
-}
-
-XSCREENSAVER_MODULE ("Esper", esper)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/esper.man b/hacks/glx/esper.man
deleted file mode 100644
index 48a4e78..0000000
--- a/hacks/glx/esper.man
+++ /dev/null
@@ -1,68 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-esper \- Enhance 224 to 176. Go right. Enhance 57 19. Track 45 left.
-.SH SYNOPSIS
-.B esper
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-titles]
-[\-fps]
-.SH DESCRIPTION
-"Enhance 224 to 176. Pull out track right. Center in pull back. Pull back.
-Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left. Gimme a
-hardcopy right there."
-
-The Esper Machine was a voice-controlled forensic device used by LAPD
-in 2019, as documented in the 1982 film, \fIBlade Runner.\fP It was
-capable of enhancing photographs to an extreme degree, including
-reconstructing different viewpoints within the space from the
-reflections on various objects in the photograph.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-titles | \-no-titles
-Show file names. Boolean.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the top of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2017 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/etruscanvenus.c b/hacks/glx/etruscanvenus.c
deleted file mode 100644
index 80a8d9b..0000000
--- a/hacks/glx/etruscanvenus.c
+++ /dev/null
@@ -1,2776 +0,0 @@
-/* etruscanvenus --- Shows a 3d immersion of a Klein bottle that
- rotates in 3d or on which you can walk and that can deform smoothly
- between the Etruscan Venus surface, the Roman surface, the Boy
- surface surface, and the Ida surface. */
-
-#if 0
-static const char sccsid[] = "@(#)etruscanvenus.c 1.1 05/01/20 xlockmore";
-#endif
-
-/* Copyright (c) 2019-2021 Carsten Steger <carsten@mirsanmir.org>. */
-
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * REVISION HISTORY:
- * C. Steger - 05/01/20: Initial version
- * C. Steger - 20/12/20: Added per-fragment shading
- * C. Steger - 20/12/30: Make the shader code work under macOS and iOS
- */
-
-/*
- * This program shows a 3d immersion of a Klein bottle that smoothly
- * deforms between the Etruscan Venus surface, the Roman surface, the
- * Boy surface, and the Ida surface. You can walk on the Klein bottle
- * or turn it in 3d. Topologically, all surfaces are Klein bottles,
- * even the Roman and Boy surfaces, which are doubly covered and
- * therefore appear to be an immersed real projective plane. The
- * smooth deformation between these surfaces was constructed by George
- * K. Francis.
- *
- * The Klein bottle is a non-orientable surface. To make this
- * apparent, the two-sided color mode can be used. Alternatively,
- * orientation markers (curling arrows) can be drawn as a texture map
- * on the surface of the Klein bottle. While walking on the Klein
- * bottle, you will notice that the orientation of the curling arrows
- * changes (which it must because the Klein bottle is non-orientable).
- * Since all the surfaces except the Ida surface have points where the
- * surface normal is not well defined for some points, walking is only
- * performed on the Ida surface.
- *
- * As mentioned above, the Roman and Boy surfaces are doubly covered
- * and therefore appear to be an immersed real projective plane.
- * Since some of the parameter names are based on this interpretation
- * of the surface, the geometry of the real projective plane will be
- * briefly disussed. The real projective plane is a model for the
- * projective geometry in 2d space. One point can be singled out as
- * the origin. A line can be singled out as the line at infinity,
- * i.e., a line that lies at an infinite distance to the origin. The
- * line at infinity is topologically a circle. Points on the line at
- * infinity are also used to model directions in projective geometry.
- * Direction and distance bands refer to this interpretation of the
- * surface. If direction bands are used, the bands extend from the
- * origin of the projective plane in different directions to the line
- * at infinity and back to the origin. If distance bands are used,
- * the bands lie at constant distances to the origin. The same
- * interpretation is used for distance and direction colors. Although
- * there is no conceptually equivalent geometric interpretation for
- * the two Klein bottle surfaces (the Etruscan Venus and Ida
- * surfaces), the smooth deformation between the surfaces results in a
- * natural extension of these concepts to the Klein bottle surfaces.
- *
- * The immersed surfaces can be projected to the screen either
- * perspectively or orthographically. When using the walking mode,
- * perspective projection to the screen will be used.
- *
- * There are three display modes for the Klein bottle: mesh
- * (wireframe), solid, or transparent. Furthermore, the appearance of
- * the surface can be as a solid object or as a set of see-through
- * bands. The bands can be distance bands or direction bands, as
- * explained above.
- *
- * The colors with with the Klein bottle is drawn can be set to
- * one-sided, two-sided, distance, or direction. In one-sided mode,
- * the surface is drawn with the same color on both sides of the
- * underlying triangles. In two-sided mode, the surface is drawn with
- * red on one side of the underlying triangles and green on the other
- * side. Since the surface actually only has one side, the color
- * jumps from red to green along a line on the surface. This mode
- * enables you to see that the surface is non-orientable. In distance
- * mode, the surface is displayed with fully saturated colors that
- * depend on the distance of the points on the projective plane to the
- * origin, as described above. If the surface is displayed as
- * distance bands, each band will be displayed with a different color.
- * In direction mode, the surface is displayed with fully saturated
- * colors that depend on the angle of the points on the projective
- * plane with respect to the origin (see above for an explanation).
- * If the surface is displayed as direction bands, each band will be
- * displayed with a different color. The colors used to color the
- * surface can either be static or can be changed dynamically.
- *
- * The rotation speed for each of the three coordinate axes around
- * which the Klein bottle rotates can be chosen.
- *
- * Furthermore, in the walking mode the walking direction in the 2d
- * base square of the surface and the walking speed can be chosen.
- * The walking direction is measured as an angle in degrees in the 2d
- * square that forms the coordinate system of the surface. A value of
- * 0 or 180 means that the walk is along a circle at a randomly chosen
- * distance from the origin (parallel to a distance band). A value of
- * 90 or 270 means that the walk is directly along a direction band.
- * Any other value results in a curved path along the surface. As
- * noted above, walking is performed only on the Ida surface.
- *
- * By default, the immersion of the Klein bottle smoothly deforms
- * between the Etruscan Venus surface, the Roman surface, the Boy
- * surface, and the Ida surface. It is possible to choose the speed
- * of the deformation. Furthermore, it is possible to switch the
- * deformation off. It is also possible to determine the initial
- * deformation of the immersion. This is mostly useful if the
- * deformation is switched off, in which case it will determine the
- * appearance of the surface. A value of 0 corresponds to the
- * Etruscan Venus surface, a value of 1000 to the Roman surface, a
- * value of 2000 to the Boy surface, and a value of 3000 to the Ida
- * surface.
- *
- * This program is inspired by George K. Francis's book "A Topological
- * Picturebook", Springer, 1987, by George K. Francis's paper "The
- * Etruscan Venus" in P. Concus, R. Finn, and D. A. Hoffman:
- * "Geometric Analysis and Computer Graphics", Springer, 1991, and by
- * a video entitled "The Etruscan Venus" by Donna J. Cox, George
- * K. Francis, and Raymond L. Idaszak, presented at SIGGRAPH 1989.
- */
-
-#include "curlicue.h"
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define DISP_WIREFRAME 0
-#define DISP_SURFACE 1
-#define DISP_TRANSPARENT 2
-#define NUM_DISPLAY_MODES 3
-
-#define APPEARANCE_SOLID 0
-#define APPEARANCE_DISTANCE_BANDS 1
-#define APPEARANCE_DIRECTION_BANDS 2
-#define NUM_APPEARANCES 3
-
-#define COLORS_ONESIDED 0
-#define COLORS_TWOSIDED 1
-#define COLORS_DISTANCE 2
-#define COLORS_DIRECTION 3
-#define NUM_COLORS 4
-
-#define VIEW_WALK 0
-#define VIEW_TURN 1
-#define NUM_VIEW_MODES 2
-
-#define DISP_PERSPECTIVE 0
-#define DISP_ORTHOGRAPHIC 1
-#define NUM_DISP_MODES 2
-
-#define DEF_DISPLAY_MODE "random"
-#define DEF_APPEARANCE "random"
-#define DEF_COLORS "random"
-#define DEF_VIEW_MODE "random"
-#define DEF_MARKS "False"
-#define DEF_CHANGE_COLORS "True"
-#define DEF_DEFORM "True"
-#define DEF_PROJECTION "random"
-#define DEF_SPEEDX "1.1"
-#define DEF_SPEEDY "1.3"
-#define DEF_SPEEDZ "1.5"
-#define DEF_WALK_DIRECTION "83.0"
-#define DEF_WALK_SPEED "20.0"
-#define DEF_DEFORM_SPEED "10.0"
-#define DEF_INIT_DEFORM "0.0"
-
-
-#ifdef STANDALONE
-# define DEFAULTS "*delay: 25000 \n" \
- "*showFPS: False \n" \
- "*prefersGLSL: True \n" \
-
-# define release_etruscanvenus 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL
-
-#include "glsl-utils.h"
-#include "gltrackball.h"
-
-#include <float.h>
-
-
-#ifdef USE_MODULES
-ModStruct etruscanvenus_description =
-{"etruscanvenus", "init_etruscanvenus", "draw_etruscanvenus",
- NULL, "draw_etruscanvenus", "change_etruscanvenus",
- "free_etruscanvenus", &etruscanvenus_opts, 25000, 1, 1, 1, 1.0, 4, "",
- "Rotate a 3d immersion of a Klein bottle in 3d or walk on it",
- 0, NULL};
-
-#endif
-
-
-static char *mode;
-static char *appear;
-static char *color_mode;
-static char *view_mode;
-static Bool marks;
-static Bool deform;
-static Bool change_colors;
-static char *proj;
-static float speed_x;
-static float speed_y;
-static float speed_z;
-static float walk_direction;
-static float walk_speed;
-static float deform_speed;
-static float init_deform;
-
-
-static XrmOptionDescRec opts[] =
-{
- {"-mode", ".displayMode", XrmoptionSepArg, 0 },
- {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
- {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
- {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
- {"-appearance", ".appearance", XrmoptionSepArg, 0 },
- {"-solid", ".appearance", XrmoptionNoArg, "solid" },
- {"-distance-bands", ".appearance", XrmoptionNoArg, "distance-bands" },
- {"-direction-bands", ".appearance", XrmoptionNoArg, "direction-bands" },
- {"-colors", ".colors", XrmoptionSepArg, 0 },
- {"-onesided-colors", ".colors", XrmoptionNoArg, "one-sided" },
- {"-twosided-colors", ".colors", XrmoptionNoArg, "two-sided" },
- {"-distance-colors", ".colors", XrmoptionNoArg, "distance" },
- {"-direction-colors", ".colors", XrmoptionNoArg, "direction" },
- {"-change-colors", ".changeColors", XrmoptionNoArg, "on"},
- {"+change-colors", ".changeColors", XrmoptionNoArg, "off"},
- {"-view-mode", ".viewMode", XrmoptionSepArg, 0 },
- {"-walk", ".viewMode", XrmoptionNoArg, "walk" },
- {"-turn", ".viewMode", XrmoptionNoArg, "turn" },
- {"-deform", ".deform", XrmoptionNoArg, "on"},
- {"+deform", ".deform", XrmoptionNoArg, "off"},
- {"-orientation-marks", ".marks", XrmoptionNoArg, "on"},
- {"+orientation-marks", ".marks", XrmoptionNoArg, "off"},
- {"-projection", ".projection", XrmoptionSepArg, 0 },
- {"-perspective", ".projection", XrmoptionNoArg, "perspective" },
- {"-orthographic", ".projection", XrmoptionNoArg, "orthographic" },
- {"-speed-x", ".speedx", XrmoptionSepArg, 0 },
- {"-speed-y", ".speedy", XrmoptionSepArg, 0 },
- {"-speed-z", ".speedz", XrmoptionSepArg, 0 },
- {"-walk-direction", ".walkDirection", XrmoptionSepArg, 0 },
- {"-walk-speed", ".walkSpeed", XrmoptionSepArg, 0 },
- {"-deformation-speed", ".deformSpeed", XrmoptionSepArg, 0 },
- {"-initial-deformation", ".initDeform", XrmoptionSepArg, 0 },
- {"-etruscan-venus", ".initDeform", XrmoptionNoArg, "0.0" },
- {"-roman", ".initDeform", XrmoptionNoArg, "1000.0" },
- {"-boy", ".initDeform", XrmoptionNoArg, "2000.0" },
- {"-ida", ".initDeform", XrmoptionNoArg, "3000.0" },
-};
-
-static argtype vars[] =
-{
- { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
- { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
- { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
- { &change_colors, "changeColors", "ChangeColors", DEF_CHANGE_COLORS, t_Bool },
- { &view_mode, "viewMode", "ViewMode", DEF_VIEW_MODE, t_String },
- { &deform, "deform", "Deform", DEF_DEFORM, t_Bool },
- { &marks, "marks", "Marks", DEF_MARKS, t_Bool },
- { &proj, "projection", "Projection", DEF_PROJECTION, t_String },
- { &speed_x, "speedx", "Speedx", DEF_SPEEDX, t_Float},
- { &speed_y, "speedy", "Speedy", DEF_SPEEDY, t_Float},
- { &speed_z, "speedz", "Speedz", DEF_SPEEDZ, t_Float},
- { &walk_direction, "walkDirection", "WalkDirection", DEF_WALK_DIRECTION, t_Float},
- { &walk_speed, "walkSpeed", "WalkSpeed", DEF_WALK_SPEED, t_Float},
- { &deform_speed, "deformSpeed", "DeformSpeed", DEF_DEFORM_SPEED, t_Float},
- { &init_deform, "initDeform", "InitDeform", DEF_INIT_DEFORM, t_Float },
-};
-
-ENTRYPOINT ModeSpecOpt etruscanvenus_opts =
-{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, NULL};
-
-
-/* Offset by which we walk above the surface */
-#define DELTAY 0.01
-
-/* Color change speeds */
-#define DRHO 0.7
-#define DSIGMA 1.1
-#define DTAU 1.7
-
-/* Number of subdivisions of the surface */
-#define NUMU 192
-#define NUMV 128
-
-/* Number of subdivisions per band */
-#define NUMBDIR 8
-#define NUMBDIST 4
-
-/* Constants that are used to calculate the approximate center of the
- surface in the z direction. */
-#define Z1 (0.8141179221194051)
-#define Z2 (0.1359276851926206)
-#define Z3 (1.1581097545867050)
-#define Z4 (0.7186549129158579)
-#define Z5 (2.5393401559381240)
-
-/* Constants that are used to calculate the approximate radius of the
- surface. */
-#define R1 (1.308007044714129)
-#define R2 (4.005205981405042)
-#define R3 (-2.893994600199527)
-#define R4 (-1.266709537162707)
-
-
-typedef struct {
- GLint WindH, WindW;
- GLXContext *glx_context;
- /* Options */
- int display_mode;
- int appearance;
- int colors;
- Bool change_colors;
- int view;
- int projection;
- Bool marks;
- /* 3D rotation angles */
- float alpha, beta, delta;
- /* Color rotation angles */
- float rho, sigma, tau;
- /* Movement parameters */
- float umove, vmove, dumove, dvmove;
- int side;
- /* Deformation parameters */
- float dd;
- int defdir;
- /* The viewing offset in 3d */
- float offset3d[3];
- /* The 3d coordinates of the surface and their normals */
- float *ev;
- float *evn;
- /* The precomputed colors of the surface */
- float *col;
- /* The precomputed texture coordinates of the surface */
- float *tex;
- /* The "curlicue" texture */
- GLuint tex_name;
- /* Aspect ratio of the current window */
- float aspect;
- /* Trackball states */
- trackball_state *trackball;
- Bool button_pressed;
- /* A random factor to modify the rotation speeds */
- float speed_scale;
-#ifdef HAVE_GLSL
- GLfloat *uv;
- GLuint *indices;
- Bool use_shaders, buffers_initialized;
- GLuint shader_program;
- GLint vertex_uv_index, vertex_t_index, color_index;
- GLint mat_mv_index, mat_p_index, db_index, dl_index;
- GLint bool_textures_index, draw_lines_index;
- GLint glbl_ambient_index, lt_ambient_index;
- GLint lt_diffuse_index, lt_specular_index;
- GLint lt_direction_index, lt_halfvect_index;
- GLint front_ambient_index, back_ambient_index;
- GLint front_diffuse_index, back_diffuse_index;
- GLint specular_index, shininess_index;
- GLint texture_sampler_index;
- GLuint vertex_uv_buffer, vertex_t_buffer;
- GLuint color_buffer, indices_buffer;
- GLint ni, ne, nt;
-#endif /* HAVE_GLSL */
-} etruscanvenusstruct;
-
-static etruscanvenusstruct *etruscanvenus = (etruscanvenusstruct *) NULL;
-
-
-#ifdef HAVE_GLSL
-
-/* The GLSL versions that correspond to different versions of OpenGL. */
-static const GLchar *shader_version_2_1 =
- "#version 120\n";
-static const GLchar *shader_version_3_0 =
- "#version 130\n";
-static const GLchar *shader_version_3_0_es =
- "#version 300 es\n"
- "precision highp float;\n"
- "precision highp int;\n";
-
-/* The vertex shader code is composed of code fragments that depend on
- the OpenGL version and code fragments that are version-independent.
- They are concatenated by glsl_CompileAndLinkShaders in the function
- init_glsl(). */
-static const GLchar *vertex_shader_attribs_2_1 =
- "attribute vec3 VertexUV;\n"
- "attribute vec4 VertexT;\n"
- "attribute vec4 VertexColor;\n"
- "\n"
- "varying vec3 Normal;\n"
- "varying vec4 Color;\n"
- "varying vec4 TexCoord;\n"
- "\n";
-static const GLchar *vertex_shader_attribs_3_0 =
- "in vec3 VertexUV;\n"
- "in vec4 VertexT;\n"
- "in vec4 VertexColor;\n"
- "\n"
- "out vec3 Normal;\n"
- "out vec4 Color;\n"
- "out vec4 TexCoord;\n"
- "\n";
-static const GLchar *vertex_shader_main =
- "uniform mat4 MatModelView;\n"
- "uniform mat4 MatProj;\n"
- "uniform float DB;\n"
- "uniform float DL;\n"
- "uniform bool BoolTextures;\n"
- "\n"
- "void main (void)\n"
- "{\n"
- " const float EPSILON = 1.19e-6f;\n"
- " const float M_SQRT2 = 1.41421356237f;\n"
- " float u = VertexUV.x;\n"
- " float v = VertexUV.y;\n"
- " float bosqrt2 = DB/M_SQRT2;\n"
- " float b2osqrt2 = 2.0f*bosqrt2;\n"
- " float b3osqrt2 = 3.0f*bosqrt2;\n"
- " float cu = cos(u);\n"
- " float su = sin(u);\n"
- " float c2u = cos(2.0f*u);\n"
- " float s2u = sin(2.0f*u);\n"
- " float c3u = cos(3.0f*u);\n"
- " float s3u = sin(3.0f*u);\n"
- " float cv = cos(v);\n"
- " float sv = sin(v);\n"
- " float c2v = cos(2.0f*v);\n"
- " float s2v = sin(2.0f*v);\n"
- " float nom = (1.0f-DL+DL*cv);\n"
- " float den = (1.0f-bosqrt2*s3u*s2v);\n"
- " float f = nom/den;\n"
- " float fx = c2u*cv+cu*sv;\n"
- " float fy = s2u*cv-su*sv;\n"
- " float fz = M_SQRT2*cv;\n"
- " vec3 x = f*vec3(fx,fy,fz);\n"
- " float nomv = -DL*sv;\n"
- " float denu = -b3osqrt2*c3u*s2v;\n"
- " float denv = -b2osqrt2*s3u*c2v;\n"
- " float den2 = 1.0f/(den*den);\n"
- " float fu = -nom*denu*den2;\n"
- " float fv = (den*nomv-nom*denv)*den2;\n"
- " float fxu = -su*sv-2.0f*s2u*cv;\n"
- " float fxv = cu*cv-c2u*sv;\n"
- " float fyu = 2.0f*c2u*cv-cu*sv;\n"
- " float fyv = -s2u*sv-su*cv;\n"
- " float fzv = -M_SQRT2*sv;\n"
- " vec3 xu = vec3(fu*fx+f*fxu,fu*fy+f*fyu,fu*fz);\n"
- " vec3 xv = vec3(fv*fx+f*fxv,fv*fy+f*fyv,fv*fz+f*fzv);\n"
- " vec3 n = cross(xu,xv);\n"
- " float t = length(n);\n"
- " if (t < EPSILON)\n"
- " {\n"
- " u += 0.01f;\n"
- " v += 0.01f;\n"
- " cu = cos(u);\n"
- " su = sin(u);\n"
- " c2u = cos(2.0f*u);\n"
- " s2u = sin(2.0f*u);\n"
- " c3u = cos(3.0f*u);\n"
- " s3u = sin(3.0f*u);\n"
- " cv = cos(v);\n"
- " sv = sin(v);\n"
- " c2v = cos(2.0f*v);\n"
- " s2v = sin(2.0f*v);\n"
- " nom = (1.0f-DL+DL*cv);\n"
- " den = (1.0f-bosqrt2*s3u*s2v);\n"
- " f = nom/den;\n"
- " fx = c2u*cv+cu*sv;\n"
- " fy = s2u*cv-su*sv;\n"
- " fz = M_SQRT2*cv;\n"
- " nomv = -DL*sv;\n"
- " denu = -b3osqrt2*c3u*s2v;\n"
- " denv = -b2osqrt2*s3u*c2v;\n"
- " den2 = 1.0f/(den*den);\n"
- " fu = -nom*denu*den2;\n"
- " fv = (den*nomv-nom*denv)*den2;\n"
- " fxu = -su*sv-2.0f*s2u*cv;\n"
- " fxv = cu*cv-c2u*sv;\n"
- " fyu = 2.0f*c2u*cv-cu*sv;\n"
- " fyv = -s2u*sv-su*cv;\n"
- " fzv = -M_SQRT2*sv;\n"
- " xu = vec3(fu*fx+f*fxu,fu*fy+f*fyu,fu*fz);\n"
- " xv = vec3(fv*fx+f*fxv,fv*fy+f*fyv,fv*fz+f*fzv);\n"
- " }\n"
- " vec4 Position = MatModelView*vec4(x,1.0f);\n"
- " vec4 pu = MatModelView*vec4(xu,0.0f);\n"
- " vec4 pv = MatModelView*vec4(xv,0.0f);\n"
- " Normal = normalize(cross(pu.xyz,pv.xyz));\n"
- " gl_Position = MatProj*Position;\n"
- " Color = VertexColor;\n"
- " if (BoolTextures)\n"
- " TexCoord = VertexT;\n"
- "}\n";
-
-/* The fragment shader code is composed of code fragments that depend on
- the OpenGL version and code fragments that are version-independent.
- They are concatenated by glsl_CompileAndLinkShaders in the function
- init_glsl(). */
-static const GLchar *fragment_shader_attribs_2_1 =
- "varying vec3 Normal;\n"
- "varying vec4 Color;\n"
- "varying vec4 TexCoord;\n"
- "\n";
-static const GLchar *fragment_shader_attribs_3_0 =
- "in vec3 Normal;\n"
- "in vec4 Color;\n"
- "in vec4 TexCoord;\n"
- "\n"
- "out vec4 FragColor;\n"
- "\n";
-static const GLchar *fragment_shader_main =
- "uniform bool DrawLines;\n"
- "uniform vec4 LtGlblAmbient;\n"
- "uniform vec4 LtAmbient, LtDiffuse, LtSpecular;\n"
- "uniform vec3 LtDirection, LtHalfVector;\n"
- "uniform vec4 MatFrontAmbient, MatBackAmbient;\n"
- "uniform vec4 MatFrontDiffuse, MatBackDiffuse;\n"
- "uniform vec4 MatSpecular;\n"
- "uniform float MatShininess;\n"
- "uniform bool BoolTextures;\n"
- "uniform sampler2D TextureSampler;"
- "\n"
- "void main (void)\n"
- "{\n"
- " vec4 color;\n"
- " if (DrawLines)\n"
- " {\n"
- " color = Color;\n"
- " }\n"
- " else\n"
- " {\n"
- " vec3 normalDirection;\n"
- " vec4 ambientColor, diffuseColor, sceneColor;\n"
- " vec4 ambientLighting, diffuseReflection, specularReflection;\n"
- " float ndotl, ndoth, pf;\n"
- " \n"
- " if (gl_FrontFacing)\n"
- " {\n"
- " normalDirection = normalize(Normal);\n"
- " sceneColor = Color*MatFrontAmbient*LtGlblAmbient;\n"
- " ambientColor = Color*MatFrontAmbient;\n"
- " diffuseColor = Color*MatFrontDiffuse;\n"
- " }\n"
- " else\n"
- " {\n"
- " normalDirection = -normalize(Normal);\n"
- " sceneColor = Color*MatBackAmbient*LtGlblAmbient;\n"
- " ambientColor = Color*MatBackAmbient;\n"
- " diffuseColor = Color*MatBackDiffuse;\n"
- " }\n"
- " \n"
- " ndotl = max(0.0,dot(normalDirection,LtDirection));\n"
- " ndoth = max(0.0,dot(normalDirection,LtHalfVector));\n"
- " if (ndotl == 0.0)\n"
- " pf = 0.0;\n"
- " else\n"
- " pf = pow(ndoth,MatShininess);\n"
- " ambientLighting = ambientColor*LtAmbient;\n"
- " diffuseReflection = LtDiffuse*diffuseColor*ndotl;\n"
- " specularReflection = LtSpecular*MatSpecular*pf;\n"
- " color = sceneColor+ambientLighting+diffuseReflection;\n";
-static const GLchar *fragment_shader_out_2_1 =
- " if (BoolTextures)\n"
- " color *= texture2D(TextureSampler,TexCoord.st);"
- " color += specularReflection;\n"
- " }\n"
- " gl_FragColor = clamp(color,0.0,1.0);\n"
- "}\n";
-static const GLchar *fragment_shader_out_3_0 =
- " if (BoolTextures)\n"
- " color *= texture(TextureSampler,TexCoord.st);"
- " color += specularReflection;\n"
- " }\n"
- " FragColor = clamp(color,0.0,1.0);\n"
- "}\n";
-
-#endif /* HAVE_GLSL */
-
-
-/* Add a rotation around the x-axis to the matrix m. */
-static void rotatex(float m[3][3], float phi)
-{
- float c, s, u, v;
- int i;
-
- phi *= M_PI/180.0;
- c = cos(phi);
- s = sin(phi);
- for (i=0; i<3; i++)
- {
- u = m[i][1];
- v = m[i][2];
- m[i][1] = c*u+s*v;
- m[i][2] = -s*u+c*v;
- }
-}
-
-
-/* Add a rotation around the y-axis to the matrix m. */
-static void rotatey(float m[3][3], float phi)
-{
- float c, s, u, v;
- int i;
-
- phi *= M_PI/180.0;
- c = cos(phi);
- s = sin(phi);
- for (i=0; i<3; i++)
- {
- u = m[i][0];
- v = m[i][2];
- m[i][0] = c*u-s*v;
- m[i][2] = s*u+c*v;
- }
-}
-
-
-/* Add a rotation around the z-axis to the matrix m. */
-static void rotatez(float m[3][3], float phi)
-{
- float c, s, u, v;
- int i;
-
- phi *= M_PI/180.0;
- c = cos(phi);
- s = sin(phi);
- for (i=0; i<3; i++)
- {
- u = m[i][0];
- v = m[i][1];
- m[i][0] = c*u+s*v;
- m[i][1] = -s*u+c*v;
- }
-}
-
-
-/* Compute the rotation matrix m from the rotation angles. */
-static void rotateall(float al, float be, float de, float m[3][3])
-{
- int i, j;
-
- for (i=0; i<3; i++)
- for (j=0; j<3; j++)
- m[i][j] = (i==j);
- rotatex(m,al);
- rotatey(m,be);
- rotatez(m,de);
-}
-
-
-/* Multiply two rotation matrices: o=m*n. */
-static void mult_rotmat(float m[3][3], float n[3][3], float o[3][3])
-{
- int i, j, k;
-
- for (i=0; i<3; i++)
- {
- for (j=0; j<3; j++)
- {
- o[i][j] = 0.0;
- for (k=0; k<3; k++)
- o[i][j] += m[i][k]*n[k][j];
- }
- }
-}
-
-
-/* Compute a 3D rotation matrix from a unit quaternion. */
-static void quat_to_rotmat(float p[4], float m[3][3])
-{
- double al, be, de;
- double r00, r01, r02, r12, r22;
-
- r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
- r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
- r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
- r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
- r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
-
- al = atan2(-r12,r22)*180.0/M_PI;
- be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
- de = atan2(-r01,r00)*180.0/M_PI;
-
- rotateall(al,be,de,m);
-}
-
-
-/* Compute a fully saturated and bright color based on an angle and,
- optionally, a color rotation matrix. */
-static void color(etruscanvenusstruct *ev, double angle, float mat[3][3],
- float col[4])
-{
- int s;
- double t, ca, sa;
- float m;
-
- if (!ev->change_colors)
- {
- if (ev->colors == COLORS_ONESIDED || ev->colors == COLORS_TWOSIDED)
- return;
-
- if (angle >= 0.0)
- angle = fmod(angle,2.0*M_PI);
- else
- angle = fmod(angle,-2.0*M_PI);
- s = floor(angle/(M_PI/3));
- t = angle/(M_PI/3)-s;
- if (s >= 6)
- s = 0;
- switch (s)
- {
- case 0:
- col[0] = 1.0;
- col[1] = t;
- col[2] = 0.0;
- break;
- case 1:
- col[0] = 1.0-t;
- col[1] = 1.0;
- col[2] = 0.0;
- break;
- case 2:
- col[0] = 0.0;
- col[1] = 1.0;
- col[2] = t;
- break;
- case 3:
- col[0] = 0.0;
- col[1] = 1.0-t;
- col[2] = 1.0;
- break;
- case 4:
- col[0] = t;
- col[1] = 0.0;
- col[2] = 1.0;
- break;
- case 5:
- col[0] = 1.0;
- col[1] = 0.0;
- col[2] = 1.0-t;
- break;
- }
- }
- else /* ev->change_colors */
- {
- if (ev->colors == COLORS_ONESIDED || ev->colors == COLORS_TWOSIDED)
- {
- col[0] = mat[0][2];
- col[1] = mat[1][2];
- col[2] = mat[2][2];
- }
- else
- {
- ca = cos(angle);
- sa = sin(angle);
- col[0] = ca*mat[0][0]+sa*mat[0][1];
- col[1] = ca*mat[1][0]+sa*mat[1][1];
- col[2] = ca*mat[2][0]+sa*mat[2][1];
- }
- m = 0.5f/fmaxf(fmaxf(fabsf(col[0]),fabsf(col[1])),fabsf(col[2]));
- col[0] = m*col[0]+0.5f;
- col[1] = m*col[1]+0.5f;
- col[2] = m*col[2]+0.5f;
- }
- if (ev->display_mode == DISP_TRANSPARENT)
- col[3] = 0.7;
- else
- col[3] = 1.0;
-}
-
-
-/* Set up the surface colors and texture. */
-static void setup_etruscan_venus_color_texture(ModeInfo *mi, double umin,
- double umax, double vmin,
- double vmax, int numu, int numv)
-{
- int i, j, k;
- double u, v, ur, vr, vc;
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- ur = umax-umin;
- vr = vmax-vmin;
- for (i=0; i<=numv; i++)
- {
- for (j=0; j<=numu; j++)
- {
- k = i*(numu+1)+j;
- u = ur*j/numu+umin;
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- v = -vr*i/numv+vmin;
- else
- v = vr*i/numv+vmin;
- if (!ev->change_colors)
- {
- if (ev->colors == COLORS_DISTANCE)
- {
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- vc = -4.0*v;
- else
- vc = 4.0*v;
- if (vc >= 4.0*M_PI)
- vc -= 4.0*M_PI;
- if (vc >= 2.0*M_PI)
- vc = 4.0*M_PI-vc;
- color(ev,vc,NULL,&ev->col[4*k]);
- }
- else /* ev->colors == COLORS_DIRECTION */
- {
- color(ev,u,NULL,&ev->col[4*k]);
- }
- }
- ev->tex[2*k+0] = 48*u/(2.0*M_PI);
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- ev->tex[2*k+1] = 64*v/(2.0*M_PI)-0.5;
- else
- ev->tex[2*k+1] = 64*v/(2.0*M_PI);
- }
- }
-}
-
-
-/* Compute the current walk frame, i.e., the coordinate system of the
- point and direction at which the viewer is currently walking on the
- surface. */
-static void compute_walk_frame(etruscanvenusstruct *ev, float db,
- float dl, float radius, float oz,
- float mat[3][3])
-{
- float p[3], pu[3], pv[3], pm[3], n[3], b[3];
- int l, m;
- float u, v;
- float xx[3], xxu[3], xxv[3];
- float r, t;
- float cv, sv, c2v, s2v, cu, su, c2u, s2u, c3u, s3u;
- float bosqrt2, b2osqrt2, b3osqrt2, nom, den, nomv, denu, denv, den2;
- float f, fx, fy, fz, x, y, z;
- float fu, fv, fxu, fxv, fyu, fyv, fzv, xu, xv, yu, yv, zu, zv;
-
- u = ev->umove;
- v = ev->vmove;
- u = 0.5f*u;
- bosqrt2 = db/(float)M_SQRT2;
- b2osqrt2 = 2.0f*bosqrt2;
- b3osqrt2 = 3.0f*bosqrt2;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- c3u = cosf(3.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- c2v = cosf(2.0f*v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- x = f*fx;
- y = f*fy;
- z = f*fz;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0f/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0f*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0f*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -(float)M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- xx[0] = x;
- xx[1] = y;
- xx[2] = z-oz;
- n[0] = yu*zv-zu*yv;
- n[1] = zu*xv-xu*zv;
- n[2] = xu*yv-yu*xv;
- t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
- /* Avoid degenerate tangential plane basis vectors as much as possible. */
- if (t < 10.0f*FLT_EPSILON)
- {
- u += 0.01f;
- v += 0.01f;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- c3u = cosf(3.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- c2v = cosf(2.0f*v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0f/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0f*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0f*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -(float)M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- }
- xxu[0] = xu;
- xxu[1] = yu;
- xxu[2] = zu;
- xxv[0] = xv;
- xxv[1] = yv;
- xxv[2] = zv;
- for (l=0; l<3; l++)
- {
- p[l] = xx[l]*radius;
- pu[l] = xxu[l]*radius;
- pv[l] = xxv[l]*radius;
- }
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0f/(ev->side*4.0f*sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- pm[0] = 0.5f*pu[0]*ev->dumove+pv[0]*ev->dvmove;
- pm[1] = 0.5f*pu[1]*ev->dumove+pv[1]*ev->dvmove;
- pm[2] = 0.5f*pu[2]*ev->dumove+pv[2]*ev->dvmove;
- t = 1.0f/(4.0f*sqrtf(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
- pm[0] *= t;
- pm[1] *= t;
- pm[2] *= t;
- b[0] = n[1]*pm[2]-n[2]*pm[1];
- b[1] = n[2]*pm[0]-n[0]*pm[2];
- b[2] = n[0]*pm[1]-n[1]*pm[0];
- t = 1.0f/(4.0f*sqrtf(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
- b[0] *= t;
- b[1] *= t;
- b[2] *= t;
-
- /* Compute alpha, beta, gamma from the three basis vectors.
- | -b[0] -b[1] -b[2] |
- m = | n[0] n[1] n[2] |
- | -pm[0] -pm[1] -pm[2] |
- */
- ev->alpha = atan2f(-n[2],-pm[2])*180.0f/(float)M_PI;
- ev->beta = atan2f(-b[2],sqrtf(b[0]*b[0]+b[1]*b[1]))*180.0f/(float)M_PI;
- ev->delta = atan2f(b[1],-b[0])*180.0f/(float)M_PI;
-
- /* Compute the rotation that rotates the surface in 3D. */
- rotateall(ev->alpha,ev->beta,ev->delta,mat);
-
- u = ev->umove;
- v = ev->vmove;
- u = 0.5f*u;
- bosqrt2 = db/(float)M_SQRT2;
- b2osqrt2 = 2.0f*bosqrt2;
- b3osqrt2 = 3.0f*bosqrt2;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- x = f*fx;
- y = f*fy;
- z = f*fz;
- xx[0] = x;
- xx[1] = y;
- xx[2] = z-oz;
- for (l=0; l<3; l++)
- {
- r = 0.0f;
- for (m=0; m<3; m++)
- r += mat[l][m]*xx[m];
- p[l] = r*radius;
- }
-
- ev->offset3d[0] = -p[0];
- ev->offset3d[1] = -p[1]-DELTAY;
- ev->offset3d[2] = -p[2];
-}
-
-
-/* Draw a 3d immersion of the surface using OpenGL's fixed functionality. */
-static int etruscan_venus_ff(ModeInfo *mi, double umin, double umax,
- double vmin, double vmax, int numu, int numv)
-{
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
- static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
- static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
- static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
- float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float p[3], pu[3], pv[3], n[3], mat[3][3], matc[3][3];
- int i, j, k, l, m, o;
- float u, v, ur, vr, oz, vc;
- float xx[3], xxu[3], xxv[3];
- float r, s, t;
- float dd, bb, ll, db, dl, radius;
- float cv, sv, c2v, s2v, cu, su, c2u, s2u, c3u, s3u;
- float bosqrt2, b2osqrt2, b3osqrt2, nom, den, nomv, denu, denv, den2;
- float f, fx, fy, fz, x, y, z;
- float fu, fv, fxu, fxv, fyu, fyv, fzv, xu, xv, yu, yv, zu, zv;
- float qu[4], r1[3][3], r2[3][3];
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
- int polys;
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (ev->projection == DISP_PERSPECTIVE || ev->view == VIEW_WALK)
- {
- if (ev->view == VIEW_WALK)
- gluPerspective(60.0,ev->aspect,0.01,10.0);
- else
- gluPerspective(60.0,ev->aspect,0.1,10.0);
- }
- else
- {
- if (ev->aspect >= 1.0)
- glOrtho(-ev->aspect,ev->aspect,-1.0,1.0,0.1,10.0);
- else
- glOrtho(-1.0,1.0,-1.0/ev->aspect,1.0/ev->aspect,0.1,10.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- if (ev->display_mode == DISP_SURFACE)
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glDepthMask(GL_TRUE);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glDisable(GL_BLEND);
- }
- else if (ev->display_mode == DISP_TRANSPARENT)
- {
- glDisable(GL_DEPTH_TEST);
- glDepthMask(GL_FALSE);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
- glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position);
- glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
- glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glDepthMask(GL_TRUE);
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- glDisable(GL_BLEND);
- }
-
- if (ev->marks)
- {
- glEnable(GL_TEXTURE_2D);
-#ifndef HAVE_JWZGLES
- glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
-#endif
- }
- else
- {
- glDisable(GL_TEXTURE_2D);
-#ifndef HAVE_JWZGLES
- glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);
-#endif
- }
-
- dd = ev->dd;
- if (dd < 1.0f)
- {
- bb = 0.0f;
- ll = dd;
- }
- else if (dd < 2.0f)
- {
- bb = dd-1.0f;
- ll = 1.0;
- }
- else if (dd < 3.0f)
- {
- bb = 1.0f;
- ll = 3.0f-dd;
- }
- else /* dd < 4.0f */
- {
- bb = 4.0f-dd;
- ll = 0.0f;
- }
- db = ((6.0f*bb-15.0f)*bb+10.0f)*bb*bb*bb;
- dl = ((6.0f*ll-15.0f)*ll+10.0f)*ll*ll*ll;
- /* Calculate the approximate center of the surface in the z direction. */
- oz = (Z1*(sinf(0.5f*M_PI*powf(dl,Z3))+Z2*sinf(1.5f*M_PI*powf(dl,Z3)))*
- expf(Z4*powf(db,Z5)));
- /* Calculate the approximate radius of the surface. */
- r = R1+(db-0.5f)*(dl-0.5f)+R2*expf(R3*(1.0f-db))*expf(R4*dl);
- radius = 0.8f/r;
-
- if (ev->change_colors)
- rotateall(ev->rho,ev->sigma,ev->tau,matc);
-
- if (ev->view == VIEW_WALK)
- {
- /* Compute the walk frame. */
- compute_walk_frame(ev,db,dl,radius,oz,mat);
- }
- else
- {
- /* Compute the rotation that rotates the surface in 3D, including the
- trackball rotations. */
- rotateall(ev->alpha,ev->beta,ev->delta,r1);
-
- gltrackball_get_quaternion(ev->trackball,qu);
- quat_to_rotmat(qu,r2);
-
- mult_rotmat(r2,r1,mat);
- }
-
- if (!ev->change_colors)
- {
- if (ev->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_oneside);
- if (ev->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_trans_oneside);
- }
- else
- {
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- mat_diff_oneside);
- }
- }
- else if (ev->colors == COLORS_TWOSIDED)
- {
- glColor3fv(mat_diff_red);
- if (ev->display_mode == DISP_TRANSPARENT)
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
- }
- else
- {
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
- }
- }
- }
- else /* ev->change_colors */
- {
- color(ev,0.0,matc,mat_diff_dyn);
- if (ev->colors == COLORS_ONESIDED)
- {
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- }
- else if (ev->colors == COLORS_TWOSIDED)
- {
- mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
- mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
- mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
- mat_diff_dyn_compl[3] = mat_diff_dyn[3];
- glColor3fv(mat_diff_dyn);
- glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn);
- glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_dyn_compl);
- }
- }
- glBindTexture(GL_TEXTURE_2D,ev->tex_name);
-
- ur = umax-umin;
- vr = vmax-vmin;
-
- /* Set up the surface coordinates and normals. */
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- {
- for (i=0; i<=numv; i++)
- {
- if ((i & (NUMBDIST-1)) >= NUMBDIST/4+1 &&
- (i & (NUMBDIST-1)) < 3*NUMBDIST/4)
- continue;
- for (j=0; j<=numu; j++)
- {
- o = i*(numu+1)+j;
- u = ur*j/numu+umin;
- v = -vr*i/numv+vmin;
- if (ev->change_colors)
- {
- /* Compute the colors dynamically. */
- if (ev->colors == COLORS_DISTANCE)
- {
- vc = -4.0f*v;
- if (vc >= 4.0f*M_PI)
- vc -= 4.0f*M_PI;
- if (vc >= 2.0f*M_PI)
- vc = 4.0f*M_PI-vc;
- color(ev,vc,matc,&ev->col[4*o]);
- }
- else if (ev->colors == COLORS_DIRECTION)
- {
- color(ev,u,matc,&ev->col[4*o]);
- }
- }
- u = 0.5f*u;
- bosqrt2 = db/(float)M_SQRT2;
- b2osqrt2 = 2.0f*bosqrt2;
- b3osqrt2 = 3.0f*bosqrt2;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- c3u = cosf(3.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- c2v = cosf(2.0f*v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- x = f*fx;
- y = f*fy;
- z = f*fz;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0f/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0f*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0f*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -(float)M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- xx[0] = x;
- xx[1] = y;
- xx[2] = z-oz;
- n[0] = yu*zv-zu*yv;
- n[1] = zu*xv-xu*zv;
- n[2] = xu*yv-yu*xv;
- t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
- /* Avoid degenerate tangential plane basis vectors as much as
- possible. */
- if (t < 10.0f*FLT_EPSILON)
- {
- u += 0.01f;
- v += 0.01f;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- c3u = cosf(3.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- c2v = cosf(2.0f*v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0f/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0f*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0f*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -(float)M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- }
- xxu[0] = xu;
- xxu[1] = yu;
- xxu[2] = zu;
- xxv[0] = xv;
- xxv[1] = yv;
- xxv[2] = zv;
- for (l=0; l<3; l++)
- {
- r = 0.0f;
- s = 0.0f;
- t = 0.0f;
- for (m=0; m<3; m++)
- {
- r += mat[l][m]*xx[m];
- s += mat[l][m]*xxu[m];
- t += mat[l][m]*xxv[m];
- }
- p[l] = r*radius+ev->offset3d[l];
- pu[l] = s*radius;
- pv[l] = t*radius;
- }
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- ev->ev[3*o+0] = p[0];
- ev->ev[3*o+1] = p[1];
- ev->ev[3*o+2] = p[2];
- ev->evn[3*o+0] = n[0];
- ev->evn[3*o+1] = n[1];
- ev->evn[3*o+2] = n[2];
- }
- }
- }
- else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
- {
- for (j=0; j<=numu; j++)
- {
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
- ((j & (NUMBDIR-1)) >= NUMBDIR/2+1))
- continue;
- for (i=0; i<=numv; i++)
- {
- o = i*(numu+1)+j;
- u = ur*j/numu+umin;
- v = vr*i/numv+vmin;
- if (ev->change_colors)
- {
- /* Compute the colors dynamically. */
- if (ev->colors == COLORS_DISTANCE)
- {
- vc = 4.0f*v;
- if (vc >= 4.0f*M_PI)
- vc -= 4.0f*M_PI;
- if (vc >= 2.0f*M_PI)
- vc = 4.0f*M_PI-vc;
- color(ev,vc,matc,&ev->col[4*o]);
- }
- else if (ev->colors == COLORS_DIRECTION)
- {
- color(ev,u,matc,&ev->col[4*o]);
- }
- }
- u = 0.5f*u;
- bosqrt2 = db/(float)M_SQRT2;
- b2osqrt2 = 2.0f*bosqrt2;
- b3osqrt2 = 3.0f*bosqrt2;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- c3u = cosf(3.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- c2v = cosf(2.0f*v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- x = f*fx;
- y = f*fy;
- z = f*fz;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0f/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0f*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0f*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -(float)M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- xx[0] = x;
- xx[1] = y;
- xx[2] = z-oz;
- n[0] = yu*zv-zu*yv;
- n[1] = zu*xv-xu*zv;
- n[2] = xu*yv-yu*xv;
- t = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
- /* Avoid degenerate tangential plane basis vectors as much as
- possible. */
- if (t < 10.0f*FLT_EPSILON)
- {
- u += 0.01f;
- v += 0.01f;
- cu = cosf(u);
- su = sinf(u);
- c2u = cosf(2.0f*u);
- s2u = sinf(2.0f*u);
- c3u = cosf(3.0f*u);
- s3u = sinf(3.0f*u);
- cv = cosf(v);
- sv = sinf(v);
- c2v = cosf(2.0f*v);
- s2v = sinf(2.0f*v);
- nom = (1.0f-dl+dl*cv);
- den = (1.0f-bosqrt2*s3u*s2v);
- f = nom/den;
- fx = c2u*cv+cu*sv;
- fy = s2u*cv-su*sv;
- fz = (float)M_SQRT2*cv;
- nomv = -dl*sv;
- denu = -b3osqrt2*c3u*s2v;
- denv = -b2osqrt2*s3u*c2v;
- den2 = 1.0f/(den*den);
- fu = -nom*denu*den2;
- fv = (den*nomv-nom*denv)*den2;
- fxu = -su*sv-2.0f*s2u*cv;
- fxv = cu*cv-c2u*sv;
- fyu = 2.0f*c2u*cv-cu*sv;
- fyv = -s2u*sv-su*cv;
- fzv = -(float)M_SQRT2*sv;
- xu = fu*fx+f*fxu;
- xv = fv*fx+f*fxv;
- yu = fu*fy+f*fyu;
- yv = fv*fy+f*fyv;
- zu = fu*fz;
- zv = fv*fz+f*fzv;
- }
- xxu[0] = xu;
- xxu[1] = yu;
- xxu[2] = zu;
- xxv[0] = xv;
- xxv[1] = yv;
- xxv[2] = zv;
- for (l=0; l<3; l++)
- {
- r = 0.0f;
- s = 0.0f;
- t = 0.0f;
- for (m=0; m<3; m++)
- {
- r += mat[l][m]*xx[m];
- s += mat[l][m]*xxu[m];
- t += mat[l][m]*xxv[m];
- }
- p[l] = r*radius+ev->offset3d[l];
- pu[l] = s*radius;
- pv[l] = t*radius;
- }
- n[0] = pu[1]*pv[2]-pu[2]*pv[1];
- n[1] = pu[2]*pv[0]-pu[0]*pv[2];
- n[2] = pu[0]*pv[1]-pu[1]*pv[0];
- t = 1.0f/sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
- n[0] *= t;
- n[1] *= t;
- n[2] *= t;
- ev->ev[3*o+0] = p[0];
- ev->ev[3*o+1] = p[1];
- ev->ev[3*o+2] = p[2];
- ev->evn[3*o+0] = n[0];
- ev->evn[3*o+1] = n[1];
- ev->evn[3*o+2] = n[2];
- }
- }
- }
-
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- {
- for (i=0; i<numv; i++)
- {
- if ((i & (NUMBDIST-1)) >= NUMBDIST/4 &&
- (i & (NUMBDIST-1)) < 3*NUMBDIST/4)
- continue;
- if (ev->display_mode == DISP_WIREFRAME)
- glBegin(GL_QUAD_STRIP);
- else
- glBegin(GL_TRIANGLE_STRIP);
- for (j=0; j<=numu; j++)
- {
- for (k=0; k<=1; k++)
- {
- l = i+k;
- m = j;
- o = l*(numu+1)+m;
- glTexCoord2fv(&ev->tex[2*o]);
- if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
- {
- glColor3fv(&ev->col[4*o]);
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- &ev->col[4*o]);
- }
- glNormal3fv(&ev->evn[3*o]);
- glVertex3fv(&ev->ev[3*o]);
- }
- }
- glEnd();
- }
- polys = numv*(numu+1);
- }
- else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
- {
- for (j=0; j<numu; j++)
- {
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
- ((j & (NUMBDIR-1)) >= NUMBDIR/2))
- continue;
- if (ev->display_mode == DISP_WIREFRAME)
- glBegin(GL_QUAD_STRIP);
- else
- glBegin(GL_TRIANGLE_STRIP);
- for (i=0; i<=numv; i++)
- {
- for (k=0; k<=1; k++)
- {
- l = i;
- m = j+k;
- o = l*(numu+1)+m;
- glTexCoord2fv(&ev->tex[2*o]);
- if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
- {
- glColor3fv(&ev->col[4*o]);
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
- &ev->col[4*o]);
- }
- glNormal3fv(&ev->evn[3*o]);
- glVertex3fv(&ev->ev[3*o]);
- }
- }
- glEnd();
- }
- polys = 2*numu*(numv+1);
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS)
- polys /= 2;
- }
-
- return polys;
-}
-
-
-#ifdef HAVE_GLSL
-
-/* Draw a 3d immersion of the surface using OpenGL's programmable
- functionality. */
-static int etruscan_venus_pf(ModeInfo *mi, double umin, double umax,
- double vmin, double vmax, int numu, int numv)
-{
- static const GLfloat light_model_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
- static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
- static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
- static const GLfloat mat_diff_oneside[] = { 0.9, 0.4, 0.3, 1.0 };
- static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
- static const GLfloat mat_diff_trans_oneside[] = { 0.9, 0.4, 0.3, 0.7 };
- static const GLfloat mat_diff_white[] = { 1.0, 1.0, 1.0, 1.0 };
- GLfloat light_direction[3], half_vector[3], len;
- GLfloat p_mat[16], mv_mat[16], rot_mat[16];
- float mat_diff_dyn[4], mat_diff_dyn_compl[4];
- float mat[3][3], matc[3][3];
- int i, j, k, l, m, o;
- float u, v, ur, vr, oz, vc;
- float r;
- float dd, bb, ll, db, dl, radius;
- float qu[4], r1[3][3], r2[3][3];
- GLsizeiptr index_offset;
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
- int polys;
-
- if (!ev->use_shaders)
- return 0;
-
- dd = ev->dd;
- if (dd < 1.0f)
- {
- bb = 0.0f;
- ll = dd;
- }
- else if (dd < 2.0f)
- {
- bb = dd-1.0f;
- ll = 1.0;
- }
- else if (dd < 3.0f)
- {
- bb = 1.0f;
- ll = 3.0f-dd;
- }
- else /* dd < 4.0f */
- {
- bb = 4.0f-dd;
- ll = 0.0f;
- }
- db = ((6.0f*bb-15.0f)*bb+10.0f)*bb*bb*bb;
- dl = ((6.0f*ll-15.0f)*ll+10.0f)*ll*ll*ll;
- /* Calculate the approximate center of the surface in the z direction. */
- oz = (Z1*(sinf(0.5f*M_PI*powf(dl,Z3))+Z2*sinf(1.5f*M_PI*powf(dl,Z3)))*
- expf(Z4*powf(db,Z5)));
- /* Calculate the approximate radius of the surface. */
- r = R1+(db-0.5f)*(dl-0.5f)+R2*expf(R3*(1.0f-db))*expf(R4*dl);
- radius = 0.8f/r;
-
- if (!ev->buffers_initialized)
- {
- /* The u and v values need to be computed once (or each time the value
- of appearance changes, once we support that). */
- ur = umax-umin;
- vr = vmax-vmin;
- for (j=0; j<=numu; j++)
- {
- for (i=0; i<=numv; i++)
- {
- o = i*(numu+1)+j;
- u = 0.5f*ur*j/numu+umin;
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- v = -vr*i/numv+vmin;
- else
- v = vr*i/numv+vmin;
- ev->uv[2*o+0] = u;
- ev->uv[2*o+1] = v;
- }
- }
- glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_uv_buffer);
- glBufferData(GL_ARRAY_BUFFER,2*(numu+1)*(numv+1)*sizeof(GLfloat),
- ev->uv,GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER,0);
-
- glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_t_buffer);
- glBufferData(GL_ARRAY_BUFFER,2*(numu+1)*(numv+1)*sizeof(GLfloat),
- ev->tex,GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER,0);
-
- if (!ev->change_colors &&
- ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
- {
- glBindBuffer(GL_ARRAY_BUFFER,ev->color_buffer);
- glBufferData(GL_ARRAY_BUFFER,4*(numu+1)*(numv+1)*sizeof(GLfloat),
- ev->col,GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER,0);
- }
-
- /* The indices only need to be computed once (or each time the value of
- appearance changes, once we support that). */
- ev->ni = 0;
- ev->ne = 0;
- ev->nt = 0;
- if (ev->display_mode != DISP_WIREFRAME)
- {
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- {
- for (i=0; i<numv; i++)
- {
- if ((i & (NUMBDIST-1)) >= NUMBDIST/4 &&
- (i & (NUMBDIST-1)) < 3*NUMBDIST/4)
- continue;
- for (j=0; j<=numu; j++)
- {
- for (k=0; k<=1; k++)
- {
- l = i+k;
- m = j;
- o = l*(numu+1)+m;
- ev->indices[ev->ni++] = o;
- }
- }
- ev->ne++;
- }
- ev->nt = 2*(numu+1);
- }
- else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
- {
- for (j=0; j<numu; j++)
- {
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
- ((j & (NUMBDIR-1)) >= NUMBDIR/2))
- continue;
- for (i=0; i<=numv; i++)
- {
- for (k=0; k<=1; k++)
- {
- l = i;
- m = j+k;
- o = l*(numu+1)+m;
- ev->indices[ev->ni++] = o;
- }
- }
- ev->ne++;
- }
- ev->nt = 2*(numv+1);
- }
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- {
- for (i=0; i<=numv; i++)
- {
- if ((i & (NUMBDIST-1)) > NUMBDIST/4 &&
- (i & (NUMBDIST-1)) < 3*NUMBDIST/4)
- continue;
- if ((i & (NUMBDIST-1)) == NUMBDIST/4)
- {
- for (j=0; j<numu; j++)
- {
- ev->indices[ev->ni++] = i*(numu+1)+j;
- ev->indices[ev->ni++] = i*(numu+1)+j+1;
- }
- continue;
- }
- for (j=0; j<numu; j++)
- {
- ev->indices[ev->ni++] = i*(numu+1)+j;
- ev->indices[ev->ni++] = i*(numu+1)+j+1;
- if (i < numv)
- {
- ev->indices[ev->ni++] = i*(numu+1)+j;
- ev->indices[ev->ni++] = (i+1)*(numu+1)+j;
- }
- }
- }
- }
- else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
- {
- for (j=0; j<numu; j++)
- {
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
- ((j & (NUMBDIR-1)) > NUMBDIR/2))
- continue;
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS &&
- ((j & (NUMBDIR-1)) == NUMBDIR/2))
- {
- for (i=0; i<numv; i++)
- {
- ev->indices[ev->ni++] = i*(numu+1)+j;
- ev->indices[ev->ni++] = (i+1)*(numu+1)+j;
- }
- continue;
- }
- for (i=0; i<=numv; i++)
- {
- ev->indices[ev->ni++] = i*(numu+1)+j;
- ev->indices[ev->ni++] = i*(numu+1)+j+1;
- if (i < numv)
- {
- ev->indices[ev->ni++] = i*(numu+1)+j;
- ev->indices[ev->ni++] = (i+1)*(numu+1)+j;
- }
- }
- }
- }
- ev->ne = 1;
- }
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ev->indices_buffer);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER,ev->ni*sizeof(GLuint),
- ev->indices,GL_STATIC_DRAW);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
-
- ev->buffers_initialized = True;
- }
-
- if (ev->change_colors)
- rotateall(ev->rho,ev->sigma,ev->tau,matc);
-
- if (ev->view == VIEW_WALK)
- {
- /* Compute the walk frame. */
- compute_walk_frame(ev,db,dl,radius,oz,mat);
- }
- else
- {
- /* Compute the rotation that rotates the surface in 3D, including the
- trackball rotations. */
- rotateall(ev->alpha,ev->beta,ev->delta,r1);
-
- gltrackball_get_quaternion(ev->trackball,qu);
- quat_to_rotmat(qu,r2);
-
- mult_rotmat(r2,r1,mat);
- }
-
- if (ev->change_colors &&
- (ev->colors == COLORS_DISTANCE || ev->colors == COLORS_DIRECTION))
- {
- ur = umax-umin;
- vr = vmax-vmin;
- for (j=0; j<=numu; j++)
- {
- for (i=0; i<=numv; i++)
- {
- o = i*(numu+1)+j;
- u = ur*j/numu+umin;
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- v = -vr*i/numv+vmin;
- else
- v = vr*i/numv+vmin;
- if (ev->colors == COLORS_DISTANCE)
- {
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- vc = -4.0f*v;
- else
- vc = 4.0f*v;
- if (vc >= 4.0f*M_PI)
- vc -= 4.0f*M_PI;
- if (vc >= 2.0f*M_PI)
- vc = 4.0f*M_PI-vc;
- color(ev,vc,matc,&ev->col[4*o]);
- }
- else if (ev->colors == COLORS_DIRECTION)
- {
- color(ev,u,matc,&ev->col[4*o]);
- }
- }
- }
- }
-
- glUseProgram(ev->shader_program);
-
- glUniform1f(ev->db_index,db);
- glUniform1f(ev->dl_index,dl);
-
- glsl_Identity(p_mat);
- if (ev->projection == DISP_PERSPECTIVE || ev->view == VIEW_WALK)
- {
- if (ev->view == VIEW_WALK)
- glsl_Perspective(p_mat,60.0f,ev->aspect,0.01f,10.0f);
- else
- glsl_Perspective(p_mat,60.0f,ev->aspect,0.1f,10.0f);
- }
- else
- {
- if (ev->aspect >= 1.0)
- glsl_Orthographic(p_mat,-ev->aspect,ev->aspect,-1.0f,1.0f,
- 0.1f,10.0f);
- else
- glsl_Orthographic(p_mat,-1.0f,1.0f,-1.0f/ev->aspect,1.0f/ev->aspect,
- 0.1f,10.0f);
- }
- glUniformMatrix4fv(ev->mat_p_index,1,GL_FALSE,p_mat);
- glsl_Identity(rot_mat);
- for (i=0; i<3; i++)
- for (j=0; j<3; j++)
- rot_mat[GLSL__LINCOOR(i,j,4)] = mat[i][j];
- glsl_Identity(mv_mat);
- glsl_Translate(mv_mat,ev->offset3d[0],ev->offset3d[1],ev->offset3d[2]);
- glsl_Scale(mv_mat,radius,radius,radius);
- glsl_MultMatrix(mv_mat,rot_mat);
- glsl_Translate(mv_mat,0.0f,0.0f,-oz);
- glUniformMatrix4fv(ev->mat_mv_index,1,GL_FALSE,mv_mat);
-
- len = sqrtf(light_position[0]*light_position[0]+
- light_position[1]*light_position[1]+
- light_position[2]*light_position[2]);
- light_direction[0] = light_position[0]/len;
- light_direction[1] = light_position[1]/len;
- light_direction[2] = light_position[2]/len;
- half_vector[0] = light_direction[0];
- half_vector[1] = light_direction[1];
- half_vector[2] = light_direction[2]+1.0f;
- len = sqrtf(half_vector[0]*half_vector[0]+
- half_vector[1]*half_vector[1]+
- half_vector[2]*half_vector[2]);
- half_vector[0] /= len;
- half_vector[1] /= len;
- half_vector[2] /= len;
-
- glUniform4fv(ev->front_ambient_index,1,mat_diff_white);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_white);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_white);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_white);
- glVertexAttrib4f(ev->color_index,1.0f,1.0f,1.0f,1.0f);
-
- if (ev->display_mode == DISP_SURFACE)
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- glUniform4fv(ev->glbl_ambient_index,1,light_model_ambient);
- glUniform4fv(ev->lt_ambient_index,1,light_ambient);
- glUniform4fv(ev->lt_diffuse_index,1,light_diffuse);
- glUniform4fv(ev->lt_specular_index,1,light_specular);
- glUniform3fv(ev->lt_direction_index,1,light_direction);
- glUniform3fv(ev->lt_halfvect_index,1,half_vector);
- glUniform4fv(ev->specular_index,1,mat_specular);
- glUniform1f(ev->shininess_index,50.0f);
- glUniform1i(ev->draw_lines_index,GL_FALSE);
- }
- else if (ev->display_mode == DISP_TRANSPARENT)
- {
- glDisable(GL_DEPTH_TEST);
- glDepthMask(GL_FALSE);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glUniform4fv(ev->glbl_ambient_index,1,light_model_ambient);
- glUniform4fv(ev->lt_ambient_index,1,light_ambient);
- glUniform4fv(ev->lt_diffuse_index,1,light_diffuse);
- glUniform4fv(ev->lt_specular_index,1,light_specular);
- glUniform3fv(ev->lt_direction_index,1,light_direction);
- glUniform3fv(ev->lt_halfvect_index,1,half_vector);
- glUniform4fv(ev->specular_index,1,mat_specular);
- glUniform1f(ev->shininess_index,50.0f);
- glUniform1i(ev->draw_lines_index,GL_FALSE);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- glUniform1i(ev->draw_lines_index,GL_TRUE);
- }
-
- if (ev->marks)
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
-
- if (!ev->change_colors)
- {
- if (ev->colors == COLORS_ONESIDED)
- {
- if (ev->display_mode == DISP_TRANSPARENT)
- {
- glUniform4fv(ev->front_ambient_index,1,mat_diff_trans_oneside);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_trans_oneside);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_trans_oneside);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_trans_oneside);
- }
- else if (ev->display_mode == DISP_SURFACE)
- {
- glUniform4fv(ev->front_ambient_index,1,mat_diff_oneside);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_oneside);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_oneside);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_oneside);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glVertexAttrib4fv(ev->color_index,mat_diff_oneside);
- }
- }
- else if (ev->colors == COLORS_TWOSIDED)
- {
- if (ev->display_mode == DISP_TRANSPARENT)
- {
- glUniform4fv(ev->front_ambient_index,1,mat_diff_trans_red);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_trans_red);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_trans_green);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_trans_green);
- }
- else if (ev->display_mode == DISP_SURFACE)
- {
- glUniform4fv(ev->front_ambient_index,1,mat_diff_red);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_red);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_green);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_green);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glVertexAttrib4fv(ev->color_index,mat_diff_red);
- }
- }
- }
- else /* ev->change_colors */
- {
- color(ev,0.0,matc,mat_diff_dyn);
- if (ev->colors == COLORS_ONESIDED)
- {
- if (ev->display_mode == DISP_TRANSPARENT ||
- ev->display_mode == DISP_SURFACE)
- {
- glUniform4fv(ev->front_ambient_index,1,mat_diff_dyn);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_dyn);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_dyn);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_dyn);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glVertexAttrib4fv(ev->color_index,mat_diff_dyn);
- }
- }
- else if (ev->colors == COLORS_TWOSIDED)
- {
- if (ev->display_mode == DISP_TRANSPARENT ||
- ev->display_mode == DISP_SURFACE)
- {
- mat_diff_dyn_compl[0] = 1.0f-mat_diff_dyn[0];
- mat_diff_dyn_compl[1] = 1.0f-mat_diff_dyn[1];
- mat_diff_dyn_compl[2] = 1.0f-mat_diff_dyn[2];
- mat_diff_dyn_compl[3] = mat_diff_dyn[3];
- glUniform4fv(ev->front_ambient_index,1,mat_diff_dyn);
- glUniform4fv(ev->front_diffuse_index,1,mat_diff_dyn);
- glUniform4fv(ev->back_ambient_index,1,mat_diff_dyn_compl);
- glUniform4fv(ev->back_diffuse_index,1,mat_diff_dyn_compl);
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glVertexAttrib4fv(ev->color_index,mat_diff_dyn);
- }
- }
- }
-
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D,ev->tex_name);
- glUniform1i(ev->texture_sampler_index,0);
- glUniform1i(ev->bool_textures_index,marks);
-
- glEnableVertexAttribArray(ev->vertex_uv_index);
- glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_uv_buffer);
- glVertexAttribPointer(ev->vertex_uv_index,2,GL_FLOAT,GL_FALSE,0,0);
-
- glEnableVertexAttribArray(ev->vertex_t_index);
- glBindBuffer(GL_ARRAY_BUFFER,ev->vertex_t_buffer);
- glVertexAttribPointer(ev->vertex_t_index,2,GL_FLOAT,GL_FALSE,0,0);
-
- if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
- {
- glEnableVertexAttribArray(ev->color_index);
- glBindBuffer(GL_ARRAY_BUFFER,ev->color_buffer);
- if (ev->change_colors)
- glBufferData(GL_ARRAY_BUFFER,4*(numu+1)*(numv+1)*sizeof(GLfloat),
- ev->col,GL_STREAM_DRAW);
- glVertexAttribPointer(ev->color_index,4,GL_FLOAT,GL_FALSE,0,0);
- }
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ev->indices_buffer);
-
- if (ev->display_mode != DISP_WIREFRAME)
- {
- for (i=0; i<ev->ne; i++)
- {
- index_offset = ev->nt*i*sizeof(GLuint);
- glDrawElements(GL_TRIANGLE_STRIP,ev->nt,GL_UNSIGNED_INT,
- (const GLvoid *)index_offset);
- }
- }
- else /* ev->display_mode == DISP_WIREFRAME */
- {
- glLineWidth(1.0f);
- index_offset = 0;
- glDrawElements(GL_LINES,ev->ni,GL_UNSIGNED_INT,
- (const void *)index_offset);
- }
-
- glDisableVertexAttribArray(ev->vertex_uv_index);
- if (ev->marks)
- glDisableVertexAttribArray(ev->vertex_t_index);
- if (ev->colors != COLORS_ONESIDED && ev->colors != COLORS_TWOSIDED)
- glDisableVertexAttribArray(ev->color_index);
- glBindBuffer(GL_ARRAY_BUFFER,0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
-
- glUseProgram(0);
-
- if (ev->appearance == APPEARANCE_DISTANCE_BANDS)
- {
- polys = numv*(numu+1);
- }
- else /* ev->appearance != APPEARANCE_DISTANCE_BANDS */
- {
- polys = 2*numu*(numv+1);
- if (ev->appearance == APPEARANCE_DIRECTION_BANDS)
- polys /= 2;
- }
-
- return polys;
-}
-
-#endif /* HAVE_GLSL */
-
-
-/* Generate a texture image that shows the orientation reversal. */
-static void gen_texture(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
- glGenTextures(1,&ev->tex_name);
- glBindTexture(GL_TEXTURE_2D,ev->tex_name);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
- glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE,TEX_DIMENSION,TEX_DIMENSION,0,
- GL_LUMINANCE,GL_UNSIGNED_BYTE,texture);
-}
-
-
-#ifdef HAVE_GLSL
-
-static void init_glsl(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
- GLint gl_major, gl_minor, glsl_major, glsl_minor;
- GLboolean gl_gles3;
- const GLchar *vertex_shader_source[3];
- const GLchar *fragment_shader_source[4];
-
- ev->uv = calloc(2*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->indices = calloc(4*(NUMU+1)*(NUMV+1),sizeof(float));
-
- /* Determine whether to use shaders to render the Klein bottle. */
- ev->use_shaders = False;
- ev->buffers_initialized = False;
- ev->shader_program = 0;
- ev->ni = 0;
- ev->ne = 0;
- ev->nt = 0;
-
- if (!glsl_GetGlAndGlslVersions(&gl_major,&gl_minor,&glsl_major,&glsl_minor,
- &gl_gles3))
- return;
- if (!gl_gles3)
- {
- if (gl_major < 3 ||
- (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 30)))
- {
- if ((gl_major < 2 || (gl_major == 2 && gl_minor < 1)) ||
- (glsl_major < 1 || (glsl_major == 1 && glsl_minor < 20)))
- return;
- /* We have at least OpenGL 2.1 and at least GLSL 1.20. */
- vertex_shader_source[0] = shader_version_2_1;
- vertex_shader_source[1] = vertex_shader_attribs_2_1;
- vertex_shader_source[2] = vertex_shader_main;
- fragment_shader_source[0] = shader_version_2_1;
- fragment_shader_source[1] = fragment_shader_attribs_2_1;
- fragment_shader_source[2] = fragment_shader_main;
- fragment_shader_source[3] = fragment_shader_out_2_1;
- }
- else
- {
- /* We have at least OpenGL 3.0 and at least GLSL 1.30. */
- vertex_shader_source[0] = shader_version_3_0;
- vertex_shader_source[1] = vertex_shader_attribs_3_0;
- vertex_shader_source[2] = vertex_shader_main;
- fragment_shader_source[0] = shader_version_3_0;
- fragment_shader_source[1] = fragment_shader_attribs_3_0;
- fragment_shader_source[2] = fragment_shader_main;
- fragment_shader_source[3] = fragment_shader_out_3_0;
- }
- }
- else /* gl_gles3 */
- {
- if (gl_major < 3 || glsl_major < 3)
- return;
- /* We have at least OpenGL ES 3.0 and at least GLSL ES 3.0. */
- vertex_shader_source[0] = shader_version_3_0_es;
- vertex_shader_source[1] = vertex_shader_attribs_3_0;
- vertex_shader_source[2] = vertex_shader_main;
- fragment_shader_source[0] = shader_version_3_0_es;
- fragment_shader_source[1] = fragment_shader_attribs_3_0;
- fragment_shader_source[2] = fragment_shader_main;
- fragment_shader_source[3] = fragment_shader_out_3_0;
- }
- if (!glsl_CompileAndLinkShaders(3,vertex_shader_source,
- 4,fragment_shader_source,
- &ev->shader_program))
- return;
- ev->vertex_uv_index = glGetAttribLocation(ev->shader_program,"VertexUV");
- ev->vertex_t_index = glGetAttribLocation(ev->shader_program,"VertexT");
- ev->color_index = glGetAttribLocation(ev->shader_program,"VertexColor");
- if (ev->vertex_uv_index == -1 || ev->vertex_t_index == -1 ||
- ev->color_index == -1)
- {
- glDeleteProgram(ev->shader_program);
- return;
- }
- ev->mat_mv_index = glGetUniformLocation(ev->shader_program,
- "MatModelView");
- ev->mat_p_index = glGetUniformLocation(ev->shader_program,
- "MatProj");
- ev->db_index = glGetUniformLocation(ev->shader_program,
- "DB");
- ev->dl_index = glGetUniformLocation(ev->shader_program,
- "DL");
- ev->bool_textures_index = glGetUniformLocation(ev->shader_program,
- "BoolTextures");
- ev->draw_lines_index = glGetUniformLocation(ev->shader_program,
- "DrawLines");
- ev->glbl_ambient_index = glGetUniformLocation(ev->shader_program,
- "LtGlblAmbient");
- ev->lt_ambient_index = glGetUniformLocation(ev->shader_program,
- "LtAmbient");
- ev->lt_diffuse_index = glGetUniformLocation(ev->shader_program,
- "LtDiffuse");
- ev->lt_specular_index = glGetUniformLocation(ev->shader_program,
- "LtSpecular");
- ev->lt_direction_index = glGetUniformLocation(ev->shader_program,
- "LtDirection");
- ev->lt_halfvect_index = glGetUniformLocation(ev->shader_program,
- "LtHalfVector");
- ev->front_ambient_index = glGetUniformLocation(ev->shader_program,
- "MatFrontAmbient");
- ev->back_ambient_index = glGetUniformLocation(ev->shader_program,
- "MatBackAmbient");
- ev->front_diffuse_index = glGetUniformLocation(ev->shader_program,
- "MatFrontDiffuse");
- ev->back_diffuse_index = glGetUniformLocation(ev->shader_program,
- "MatBackDiffuse");
- ev->specular_index = glGetUniformLocation(ev->shader_program,
- "MatSpecular");
- ev->shininess_index = glGetUniformLocation(ev->shader_program,
- "MatShininess");
- ev->texture_sampler_index = glGetUniformLocation(ev->shader_program,
- "TextureSampler");
- if (ev->mat_mv_index == -1 || ev->mat_p_index == -1 ||
- ev->db_index == -1 || ev->dl_index == -1 ||
- ev->bool_textures_index == -1 || ev->draw_lines_index == -1 ||
- ev->glbl_ambient_index == -1 || ev->lt_ambient_index == -1 ||
- ev->lt_diffuse_index == -1 || ev->lt_specular_index == -1 ||
- ev->lt_direction_index == -1 || ev->lt_halfvect_index == -1 ||
- ev->front_ambient_index == -1 || ev->back_ambient_index == -1 ||
- ev->front_diffuse_index == -1 || ev->back_diffuse_index == -1 ||
- ev->specular_index == -1 || ev->shininess_index == -1 ||
- ev->texture_sampler_index == -1)
- {
- glDeleteProgram(ev->shader_program);
- return;
- }
-
- glGenBuffers(1,&ev->vertex_uv_buffer);
- glGenBuffers(1,&ev->vertex_t_buffer);
- glGenBuffers(1,&ev->color_buffer);
- glGenBuffers(1,&ev->indices_buffer);
-
- ev->use_shaders = True;
-}
-
-#endif /* HAVE_GLSL */
-
-
-static void init(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- if (deform_speed == 0.0)
- deform_speed = 10.0;
-
- if (init_deform < 0.0)
- init_deform = 0.0;
- if (init_deform >= 4000.0)
- init_deform = 0.0;
-
- if (walk_speed == 0.0)
- walk_speed = 20.0;
-
- if (ev->view == VIEW_TURN)
- {
- ev->alpha = frand(360.0);
- ev->beta = frand(360.0);
- ev->delta = frand(360.0);
- }
- else
- {
- ev->alpha = 0.0;
- ev->beta = 0.0;
- ev->delta = 0.0;
- }
- ev->umove = frand(2.0*M_PI);
- ev->vmove = frand(2.0*M_PI);
- ev->dumove = 0.0;
- ev->dvmove = 0.0;
- ev->side = 1;
-
- ev->dd = init_deform*0.001;
- ev->defdir = 1;
-
- ev->rho = frand(360.0);
- ev->sigma = frand(360.0);
- ev->tau = frand(360.0);
-
- ev->offset3d[0] = 0.0;
- ev->offset3d[1] = 0.0;
- ev->offset3d[2] = -2.0;
-
- ev->ev = calloc(3*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->evn = calloc(3*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->col = calloc(4*(NUMU+1)*(NUMV+1),sizeof(float));
- ev->tex = calloc(2*(NUMU+1)*(NUMV+1),sizeof(float));
-
- gen_texture(mi);
- setup_etruscan_venus_color_texture(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,NUMU,NUMV);
-
-#ifdef HAVE_GLSL
- init_glsl(mi);
-#endif /* HAVE_GLSL */
-
-#ifdef HAVE_ANDROID
- /* glPolygonMode(...,GL_LINE) is not supported for an OpenGL ES 1.1
- context. */
- if (!ev->use_shaders && ev->display_mode == DISP_WIREFRAME)
- ev->display_mode = DISP_SURFACE;
-#endif /* HAVE_ANDROID */
-}
-
-
-/* Redisplay the Klein bottle. */
-static void display_etruscanvenus(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- if (!ev->button_pressed)
- {
- if (deform)
- {
- ev->dd += ev->defdir*deform_speed*0.001;
- if (ev->dd < 0.0)
- ev->dd += 4.0;
- if (ev->dd >= 4.0)
- ev->dd -= 4.0;
- /* Randomly change the deformation direction at one of the four
- surface types in 10% of the cases. */
- if (fabs(round(ev->dd)-ev->dd) <= deform_speed*0.0005)
- {
- if (LRAND() % 10 == 0)
- ev->defdir = -ev->defdir;
- }
- }
- if (ev->view == VIEW_TURN)
- {
- ev->alpha += speed_x*ev->speed_scale;
- if (ev->alpha >= 360.0)
- ev->alpha -= 360.0;
- ev->beta += speed_y*ev->speed_scale;
- if (ev->beta >= 360.0)
- ev->beta -= 360.0;
- ev->delta += speed_z*ev->speed_scale;
- if (ev->delta >= 360.0)
- ev->delta -= 360.0;
- }
- if (ev->view == VIEW_WALK)
- {
- ev->dumove = cos(walk_direction*M_PI/180.0)*walk_speed*M_PI/4096.0;
- ev->dvmove = sin(walk_direction*M_PI/180.0)*walk_speed*M_PI/4096.0;
- ev->umove += ev->dumove;
- if (ev->umove >= 2.0*M_PI)
- {
- ev->umove -= 2.0*M_PI;
- ev->vmove = 2.0*M_PI-ev->vmove;
- ev->side = -ev->side;
- }
- if (ev->umove < 0.0)
- {
- ev->umove += 2.0*M_PI;
- ev->vmove = 2.0*M_PI-ev->vmove;
- ev->side = -ev->side;
- }
- ev->vmove += ev->dvmove;
- if (ev->vmove >= 2.0*M_PI)
- ev->vmove -= 2.0*M_PI;
- if (ev->vmove < 0.0)
- ev->vmove += 2.0*M_PI;
- }
- if (ev->change_colors)
- {
- ev->rho += DRHO;
- if (ev->rho >= 360.0)
- ev->rho -= 360.0;
- ev->sigma += DSIGMA;
- if (ev->sigma >= 360.0)
- ev->sigma -= 360.0;
- ev->tau += DTAU;
- if (ev->tau >= 360.0)
- ev->tau -= 360.0;
- }
- }
-
-#ifdef HAVE_GLSL
- if (ev->use_shaders)
- mi->polygon_count = etruscan_venus_pf(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,
- NUMU,NUMV);
- else
-#endif /* HAVE_GLSL */
- mi->polygon_count = etruscan_venus_ff(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,
- NUMU,NUMV);
-}
-
-
-ENTRYPOINT void reshape_etruscanvenus(ModeInfo *mi, int width, int height)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- }
-
- ev->WindW = (GLint)width;
- ev->WindH = (GLint)height;
- glViewport(0,y,width,height);
- ev->aspect = (GLfloat)width/(GLfloat)height;
-}
-
-
-ENTRYPOINT Bool etruscanvenus_handle_event(ModeInfo *mi, XEvent *event)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- if (event->xany.type == ButtonPress && event->xbutton.button == Button1)
- {
- ev->button_pressed = True;
- gltrackball_start(ev->trackball, event->xbutton.x, event->xbutton.y,
- MI_WIDTH(mi), MI_HEIGHT(mi));
- return True;
- }
- else if (event->xany.type == ButtonRelease &&
- event->xbutton.button == Button1)
- {
- ev->button_pressed = False;
- return True;
- }
- else if (event->xany.type == MotionNotify && ev->button_pressed)
- {
- gltrackball_track(ev->trackball, event->xmotion.x, event->xmotion.y,
- MI_WIDTH(mi), MI_HEIGHT(mi));
- return True;
- }
-
- return False;
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- * Xlock hooks.
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- */
-
-/*
- *-----------------------------------------------------------------------------
- * Initialize etruscanvenus. Called each time the window changes.
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void init_etruscanvenus(ModeInfo *mi)
-{
- etruscanvenusstruct *ev;
-
- MI_INIT (mi, etruscanvenus);
- ev = &etruscanvenus[MI_SCREEN(mi)];
-
- ev->trackball = gltrackball_init(True);
- ev->button_pressed = False;
-
- /* Set the display mode. */
- if (!strcasecmp(mode,"random"))
- {
- ev->display_mode = random() % NUM_DISPLAY_MODES;
- }
- else if (!strcasecmp(mode,"wireframe"))
- {
- ev->display_mode = DISP_WIREFRAME;
- }
- else if (!strcasecmp(mode,"surface"))
- {
- ev->display_mode = DISP_SURFACE;
- }
- else if (!strcasecmp(mode,"transparent"))
- {
- ev->display_mode = DISP_TRANSPARENT;
- }
- else
- {
- ev->display_mode = random() % NUM_DISPLAY_MODES;
- }
-
- ev->marks = marks;
-
- /* Orientation marks don't make sense in wireframe mode. */
- if (ev->display_mode == DISP_WIREFRAME)
- ev->marks = False;
-
- /* Set the appearance. */
- if (!strcasecmp(appear,"random"))
- {
- ev->appearance = random() % NUM_APPEARANCES;
- }
- else if (!strcasecmp(appear,"solid"))
- {
- ev->appearance = APPEARANCE_SOLID;
- }
- else if (!strcasecmp(appear,"distance-bands"))
- {
- ev->appearance = APPEARANCE_DISTANCE_BANDS;
- }
- else if (!strcasecmp(appear,"direction-bands"))
- {
- ev->appearance = APPEARANCE_DIRECTION_BANDS;
- }
- else
- {
- ev->appearance = random() % NUM_APPEARANCES;
- }
-
- /* Set the color mode. */
- if (!strcasecmp(color_mode,"random"))
- {
- ev->colors = random() % NUM_COLORS;
- }
- else if (!strcasecmp(color_mode,"one-sided"))
- {
- ev->colors = COLORS_ONESIDED;
- }
- else if (!strcasecmp(color_mode,"two-sided"))
- {
- ev->colors = COLORS_TWOSIDED;
- }
- else if (!strcasecmp(color_mode,"distance"))
- {
- ev->colors = COLORS_DISTANCE;
- }
- else if (!strcasecmp(color_mode,"direction"))
- {
- ev->colors = COLORS_DIRECTION;
- }
- else
- {
- ev->colors = random() % NUM_COLORS;
- }
-
- ev->change_colors = change_colors;
-
- /* Set the view mode. */
- if (!strcasecmp(view_mode,"random"))
- {
- /* Select the walking mode only in 10% of the cases. */
- if (LRAND() % 10 == 0)
- ev->view = VIEW_WALK;
- else
- ev->view = VIEW_TURN;
- }
- else if (!strcasecmp(view_mode,"walk"))
- {
- ev->view = VIEW_WALK;
- }
- else if (!strcasecmp(view_mode,"turn"))
- {
- ev->view = VIEW_TURN;
- }
- else
- {
- /* Select the walking mode only in 10% of the cases. */
- if (LRAND() % 10 == 0)
- ev->view = VIEW_WALK;
- else
- ev->view = VIEW_TURN;
- }
-
- if (ev->view == VIEW_WALK)
- {
- /* Walking only works on the Ida surface. Therefore, set the initial
- deformation to the Ida surface and switch off the deformation. */
- init_deform = 3000.0;
- deform = False;
- }
-
- /* Set the 3d projection mode. */
- if (!strcasecmp(proj,"random"))
- {
- /* Orthographic projection only makes sense in turn mode. */
- if (ev->view == VIEW_TURN)
- ev->projection = random() % NUM_DISP_MODES;
- else
- ev->projection = DISP_PERSPECTIVE;
- }
- else if (!strcasecmp(proj,"perspective"))
- {
- ev->projection = DISP_PERSPECTIVE;
- }
- else if (!strcasecmp(proj,"orthographic"))
- {
- ev->projection = DISP_ORTHOGRAPHIC;
- }
- else
- {
- /* Orthographic projection only makes sense in turn mode. */
- if (ev->view == VIEW_TURN)
- ev->projection = random() % NUM_DISP_MODES;
- else
- ev->projection = DISP_PERSPECTIVE;
- }
-
- /* Make multiple screens rotate at slightly different rates. */
- ev->speed_scale = 0.9+frand(0.3);
-
- if ((ev->glx_context = init_GL(mi)) != NULL)
- {
- reshape_etruscanvenus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
- init(mi);
- }
- else
- {
- MI_CLEARWINDOW(mi);
- }
-}
-
-/*
- *-----------------------------------------------------------------------------
- * Called by the mainline code periodically to update the display.
- *-----------------------------------------------------------------------------
- */
-ENTRYPOINT void draw_etruscanvenus(ModeInfo *mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- etruscanvenusstruct *ev;
-
- if (etruscanvenus == NULL)
- return;
- ev = &etruscanvenus[MI_SCREEN(mi)];
-
- MI_IS_DRAWN(mi) = True;
- if (!ev->glx_context)
- return;
-
- glXMakeCurrent(display, window, *ev->glx_context);
-
- glClearColor(0.0f,0.0f,0.0f,1.0f);
- glClearDepth(1.0f);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
-
- display_etruscanvenus(mi);
-
- if (MI_IS_FPS(mi))
- do_fps (mi);
-
- glFlush();
-
- glXSwapBuffers(display,window);
-}
-
-
-#ifndef STANDALONE
-ENTRYPOINT void change_etruscanvenus(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- if (!ev->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ev->glx_context);
- init(mi);
-}
-#endif /* !STANDALONE */
-
-
-ENTRYPOINT void free_etruscanvenus(ModeInfo *mi)
-{
- etruscanvenusstruct *ev = &etruscanvenus[MI_SCREEN(mi)];
-
- if (!ev->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ev->glx_context);
-
- if (ev->ev) free(ev->ev);
- if (ev->evn) free(ev->evn);
- if (ev->col) free(ev->col);
- if (ev->tex) free(ev->tex);
- gltrackball_free(ev->trackball);
- if (ev->tex_name) glDeleteTextures(1, &ev->tex_name);
-#ifdef HAVE_GLSL
- if (ev->uv) free(ev->uv);
- if (ev->indices) free(ev->indices);
- if (ev->use_shaders)
- {
- glDeleteBuffers(1,&ev->vertex_uv_buffer);
- glDeleteBuffers(1,&ev->vertex_t_buffer);
- glDeleteBuffers(1,&ev->color_buffer);
- glDeleteBuffers(1,&ev->indices_buffer);
- if (ev->shader_program != 0)
- {
- glUseProgram(0);
- glDeleteProgram(ev->shader_program);
- }
- }
-#endif /* HAVE_GLSL */
-}
-
-
-XSCREENSAVER_MODULE ("EtruscanVenus", etruscanvenus)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/etruscanvenus.man b/hacks/glx/etruscanvenus.man
deleted file mode 100644
index 9517274..0000000
--- a/hacks/glx/etruscanvenus.man
+++ /dev/null
@@ -1,372 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-etruscanvenus \- Draws a 3d immersion of a Klein bottle that smoothly
-deforms between the Etruscan Venus surface, the Roman surface, the Boy
-surface surface, and the Ida surface.
-.SH SYNOPSIS
-.B etruscanvenus
-[\-display \fIhost:display.screen\fP]
-[\-install]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fIusecs\fP]
-[\-fps]
-[\-mode \fIdisplay-mode\fP]
-[\-wireframe]
-[\-surface]
-[\-transparent]
-[\-appearance \fIappearance\fP]
-[\-solid]
-[\-distance-bands]
-[\-direction-bands]
-[\-colors \fIcolor-scheme\fP]
-[\-onesided-colors]
-[\-twosided-colors]
-[\-distance-colors]
-[\-direction-colors]
-[\-no-change-colors]
-[\-view-mode \fIview-mode\fP]
-[\-walk]
-[\-turn]
-[\-no-deform]
-[\-deformation-speed \fIfloat\fP]
-[\-initial-deformation \fIfloat\fP]
-[\-etruscan-venus]
-[\-roman]
-[\-boy]
-[\-ida]
-[\-orientation-marks]
-[\-projection \fImode\fP]
-[\-perspective]
-[\-orthographic]
-[\-speed-x \fIfloat\fP]
-[\-speed-y \fIfloat\fP]
-[\-speed-z \fIfloat\fP]
-[\-walk-direction \fIfloat\fP]
-[\-walk-speed \fIfloat\fP]
-.SH DESCRIPTION
-The \fIetruscanvenus\fP program shows a 3d immersion of a Klein bottle
-that smoothly deforms between the Etruscan Venus surface, the Roman
-surface, the Boy surface, and the Ida surface. You can walk on the
-Klein bottle or turn it in 3d. Topologically, all surfaces are Klein
-bottles, even the Roman and Boy surfaces, which are doubly covered and
-therefore appear to be an immersed real projective plane. The smooth
-deformation between these surfaces was constructed by George
-K. Francis.
-.PP
-The Klein bottle is a non-orientable surface. To make this apparent,
-the two-sided color mode can be used. Alternatively, orientation
-markers (curling arrows) can be drawn as a texture map on the surface
-of the Klein bottle. While walking on the Klein bottle, you will
-notice that the orientation of the curling arrows changes (which it
-must because the Klein bottle is non-orientable). Since all the
-surfaces except the Ida surface have points where the surface normal
-is not well defined for some points, walking is only performed on the
-Ida surface.
-.PP
-As mentioned above, the Roman and Boy surfaces are doubly covered and
-therefore appear to be an immersed real projective plane. Since some
-of the parameter names are based on this interpretation of the
-surface, the geometry of the real projective plane will be briefly
-disussed. The real projective plane is a model for the projective
-geometry in 2d space. One point can be singled out as the origin. A
-line can be singled out as the line at infinity, i.e., a line that
-lies at an infinite distance to the origin. The line at infinity is
-topologically a circle. Points on the line at infinity are also used
-to model directions in projective geometry. Direction and distance
-bands refer to this interpretation of the surface. If direction bands
-are used, the bands extend from the origin of the projective plane in
-different directions to the line at infinity and back to the origin.
-If distance bands are used, the bands lie at constant distances to the
-origin. The same interpretation is used for distance and direction
-colors. Although there is no conceptually equivalent geometric
-interpretation for the two Klein bottle surfaces (the Etruscan Venus
-and Ida surfaces), the smooth deformation between the surfaces results
-in a natural extension of these concepts to the Klein bottle surfaces.
-.PP
-The immersed surfaces can be projected to the screen either
-perspectively or orthographically. When using the walking mode,
-perspective projection to the screen will be used.
-.PP
-There are three display modes for the Klein bottle: mesh (wireframe),
-solid, or transparent. Furthermore, the appearance of the surface can
-be as a solid object or as a set of see-through bands. The bands can
-be distance bands or direction bands, as explained above.
-.PP
-The colors with with the surface is drawn can be set to one-sided,
-two-sided, distance, or direction. In one-sided mode, the surface is
-drawn with the same color on both sides of the underlying triangles.
-In two-sided mode, the surface is drawn with one color on one side of
-the underlying triangles and the complementary color on the other
-side. Since the surface actually only has one side, the color jumps
-from red to green along a line on the surface. This mode enables you
-to see that the surface is non-orientable. In distance mode, the
-surface is displayed with fully saturated colors that depend on the
-distance of the points on the projective plane to the origin, as
-described above. If the surface is displayed as distance bands, each
-band will be displayed with a different color. In direction mode, the
-surface is displayed with fully saturated colors that depend on the
-angle of the points on the projective plane with respect to the origin
-(see above for an explanation). If the surface is displayed as
-direction bands, each band will be displayed with a different color.
-The colors used to color the surface can either be static or can be
-changed dynamically.
-.PP
-The rotation speed for each of the three coordinate axes around which
-the Klein bottle rotates can be chosen.
-.PP
-Furthermore, in the walking mode the walking direction in the 2d base
-square of the surface and the walking speed can be chosen. The
-walking direction is measured as an angle in degrees in the 2d square
-that forms the coordinate system of the surface. A value of 0 or 180
-means that the walk is along a circle at a randomly chosen distance
-from the origin (parallel to a distance band). A value of 90 or 270
-means that the walk is directly along a direction band. Any other
-value results in a curved path along the surface. As noted above,
-walking is performed only on the Ida surface.
-.PP
-By default, the immersion of the Klein bottle smoothly deforms between
-the Etruscan Venus surface, the Roman surface, the Boy surface, and
-the Ida surface. It is possible to choose the speed of the
-deformation. Furthermore, it is possible to switch the deformation
-off. It is also possible to determine the initial deformation of the
-immersion. This is mostly useful if the deformation is switched off,
-in which case it will determine the appearance of the surface. A
-value of 0 corresponds to the Etruscan Venus surface, a value of 1000
-to the Roman surface, a value of 2000 to the Boy surface, and a value
-of 3000 to the Ida surface.
-.PP
-This program is inspired by George K. Francis's book "A Topological
-Picturebook", Springer, 1987, by George K. Francis's paper "The
-Etruscan Venus" in P. Concus, R. Finn, and D. A. Hoffman: "Geometric
-Analysis and Computer Graphics", Springer, 1991, and by a video
-entitled "The Etruscan Venus" by Donna J. Cox, George K. Francis, and
-Raymond L. Idaszak, presented at SIGGRAPH 1989.
-.SH OPTIONS
-.I etruscanvenus
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual
-class, or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the
-animation. Default 10000, or 1/100th second.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.PP
-The following four options are mutually exclusive. They determine how
-the Klein bottle is displayed.
-.TP 8
-.B \-mode random
-Display the Klein bottle in a random display mode (default).
-.TP 8
-.B \-mode wireframe \fP(Shortcut: \fB\-wireframe\fP)
-Display the Klein bottle as a wireframe mesh.
-.TP 8
-.B \-mode surface \fP(Shortcut: \fB\-surface\fP)
-Display the Klein bottle as a solid surface.
-.TP 8
-.B \-mode transparent \fP(Shortcut: \fB\-transparent\fP)
-Display the Klein bottle as a transparent surface.
-.PP
-The following four options are mutually exclusive. They determine the
-appearance of the Klein bottle.
-.TP 8
-.B \-appearance random
-Display the Klein bottle with a random appearance (default).
-.TP 8
-.B \-appearance solid \fP(Shortcut: \fB\-solid\fP)
-Display the Klein bottle as a solid object.
-.TP 8
-.B \-appearance distance-bands \fP(Shortcut: \fB\-distance-bands\fP)
-Display the Klein bottle as see-through bands that lie at increasing
-distances from the origin (see above for an explanation).
-.PP
-.TP 8
-.B \-appearance direction-bands \fP(Shortcut: \fB\-direction-bands\fP)
-Display the Klein bottle as see-through bands that lie at increasing
-angles with respect to the origin (see above for an explanation).
-.PP
-The following five options are mutually exclusive. They determine how
-to color the Klein bottle.
-.TP 8
-.B \-colors random
-Display the Klein bottle with a random color scheme (default).
-.TP 8
-.B \-colors onesided \fP(Shortcut: \fB\-onesided-colors\fP)
-Display the Klein bottle with a single color.
-.TP 8
-.B \-colors twosided \fP(Shortcut: \fB\-twosided-colors\fP)
-Display the Klein bottle with two colors: one color on one "side" and
-the complementary color on the "other side."
-.TP 8
-.B \-colors distance \fP(Shortcut: \fB\-distance-colors\fP)
-Display the Klein bottle with fully saturated colors that depend on
-the distance of the points on the projective plane to the origin (see
-above for an explanation). If the Klein bottle is displayed as
-distance bands, each band will be displayed with a different color.
-.TP 8
-.B \-colors direction \fP(Shortcut: \fB\-direction-colors\fP)
-Display the Klein bottle with fully saturated colors that depend on
-the angle of the points on the projective plane with respect to the
-origin (see above for an explanation). If the Klein bottle is
-displayed as direction bands, each band will be displayed with a
-different color.
-.PP
-The following options determine whether the colors with which the
-Klein bottle are displayed are static or are changing dynamically.
-.TP 8
-.B \-change-colors
-Change the colors with which the Klein bottle is displayed
-dynamically (default).
-.TP 8
-.B \-no-change-colors
-Use static colors to display the Klein bottle.
-.PP
-The following three options are mutually exclusive. They determine
-how to view the Klein bottle.
-.TP 8
-.B \-view-mode random
-View the Klein bottle in a random view mode (default). The walking
-mode will be randomly selected in approximately 10% of the cases.
-.TP 8
-.B \-view-mode turn \fP(Shortcut: \fB\-turn\fP)
-View the Klein bottle while it turns in 3d.
-.TP 8
-.B \-view-mode walk \fP(Shortcut: \fB\-walk\fP)
-View the Klein bottle as if walking on its surface.
-.PP
-The following options determine whether the surface is being deformed.
-.TP 8
-.B \-deform
-Deform the surface smoothly between the Etruscan Venus surface, the
-Roman surface, the Boy surface surface, and the Ida surface (default).
-.TP 8
-.B \-no-deform
-Don't deform the surface.
-.PP
-The following option determines the deformation speed.
-.TP 8
-.B \-deformation-speed \fIfloat\fP
-The deformation speed is measured in percent of some sensible maximum
-speed (default: 10.0).
-.PP
-The following options determine the initial deformation of the
-surface. As described above, this is mostly useful if
-\fB\-no-deform\fP is specified.
-.TP 8
-.B \-initial-deformation \fIfloat\fP
-The initial deformation is specified as a number between 0 and 4000.
-A value of 0 corresponds to the Etruscan Venus surface, a value of
-1000 to the Roman surface, a value of 2000 to the Boy surface, and a
-value of 3000 to the Ida surface. The default value is 0.
-.TP 8
-.B \-etruscan-venus
-This is a shortcut for \fB\-initial-deformation 0\fP.
-.TP 8
-.B \-roman
-This is a shortcut for \fB\-initial-deformation 1000\fP.
-.TP 8
-.B \-boy
-This is a shortcut for \fB\-initial-deformation 2000\fP.
-.TP 8
-.B \-ida
-This is a shortcut for \fB\-initial-deformation 3000\fP.
-.PP
-The following options determine whether orientation marks are shown on
-the Klein bottle.
-.TP 8
-.B \-orientation-marks
-Display orientation marks on the Klein bottle.
-.TP 8
-.B \-no-orientation-marks
-Don't display orientation marks on the Klein bottle (default).
-.PP
-The following three options are mutually exclusive. They determine
-how the Klain bottle is projected from 3d to 2d (i.e., to the screen).
-.TP 8
-.B \-projection random
-Project the Klein bottle from 3d to 2d using a random projection mode
-(default).
-.TP 8
-.B \-projection perspective \fP(Shortcut: \fB\-perspective\fP)
-Project the Klein bottle from 3d to 2d using a perspective projection.
-.TP 8
-.B \-projection orthographic \fP(Shortcut: \fB\-orthographic\fP)
-Project the Klein bottle from 3d to 2d using an orthographic
-projection.
-.PP
-The following three options determine the rotation speed of the Klein
-bottle around the three possible axes. The rotation speed is measured
-in degrees per frame. The speeds should be set to relatively small
-values, e.g., less than 4 in magnitude. In walk mode, all speeds are
-ignored.
-.TP 8
-.B \-speed-x \fIfloat\fP
-Rotation speed around the x axis (default: 1.1).
-.TP 8
-.B \-speed-y \fIfloat\fP
-Rotation speed around the y axis (default: 1.3).
-.TP 8
-.B \-speed-z \fIfloat\fP
-Rotation speed around the z axis (default: 1.5).
-.PP
-The following two options determine the walking speed and direction.
-.TP 8
-.B \-walk-direction \fIfloat\fP
-The walking direction is measured as an angle in degrees in the 2d
-square that forms the coordinate system of the surface of the Klein
-bottle (default: 83.0). A value of 0 or 180 means that the walk is
-along a circle at a randomly chosen distance from the origin (parallel
-to a distance band). A value of 90 or 270 means that the walk is
-directly along a direction band. Any other value results in a curved
-path along the surface. As noted above, walking is performed only on
-the Ida surface.
-.TP 8
-.B \-walk-speed \fIfloat\fP
-The walking speed is measured in percent of some sensible maximum
-speed (default: 20.0).
-.SH INTERACTION
-If you run this program in standalone mode in its turn mode, you can
-rotate the Klein bottle by dragging the mouse while pressing the left
-mouse button. This rotates the Klein bottle in 3d. To examine the
-Klein bottle at your leisure, it is best to set all speeds to 0.
-Otherwise, the Klein bottle will rotate while the left mouse button is
-not pressed. This kind of interaction is not available in the walk
-mode.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2019-2020 by Carsten Steger. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Carsten Steger <carsten@mirsanmir.org>, 05-jan-2020.
diff --git a/hacks/glx/extrusion-helix2.c b/hacks/glx/extrusion-helix2.c
deleted file mode 100644
index 7a7152f..0000000
--- a/hacks/glx/extrusion-helix2.c
+++ /dev/null
@@ -1,47 +0,0 @@
-
-/*
- * helicoid (gernalized torus) demo
- *
- * FUNCTION:
- * This code provides a very simple example of the helicoid primitive.
- * Most of this code is required to set up OpenGL and GLUT, and very
- * very little to set up the helix drawer. Don't blink!
- *
- * =======> MOUSE HOOKED UP TO RADIUS, DELTA-RADIUS < ========
- *
- * HISTORY:
- * Written by Linas Vepstas, March 1995
- */
-
-#include "extrusion.h"
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-void InitStuff_helix2 (void)
-{
-}
-
-/* draw the helix shape */
-void DrawStuff_helix2 (void)
-{
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f (0.6, 0.3, 0.8);
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
-/* glTranslatef (0.0, 0.0, -80.0); */
-/* glRotatef (220.0, 0.0, 1.0, 0.0); */
-/* glRotatef (65.0, 1.0, 0.0, 0.0); */
-
- /* Phew. FINALLY, Draw the helix -- */
- gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
- gleHelicoid (0.01*lastx,
- 6.0, (0.01*lasty - 2.0),
- -3.0, 4.0, 0x0, 0x0, 0.0, 1080.0);
-
- glPopMatrix ();
-
-}
-/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-helix3.c b/hacks/glx/extrusion-helix3.c
deleted file mode 100644
index 7650f46..0000000
--- a/hacks/glx/extrusion-helix3.c
+++ /dev/null
@@ -1,46 +0,0 @@
-
-/*
- * helicoid (gernalized torus) demo
- *
- * FUNCTION:
- * This code provides a very simple example of the helicoid primitive.
- * Most of this code is required to set up OpenGL and GLUT, and very
- * very little to set up the helix drawer. Don't blink!
- *
- * =======> MOUSE HOOKED UP TO SWEEP, HEIGHT < ========
- *
- * HISTORY:
- * Written by Linas Vepstas, March 1995
- */
-
-#include "extrusion.h"
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-void InitStuff_helix3 (void)
-{
-}
-
-/* draw the helix shape */
-void DrawStuff_helix3 (void)
-{
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f (0.8, 0.3, 0.6);
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
-/* glTranslatef (0.0, 0.0, -80.0); */
-/* glRotatef (220.0, 0.0, 1.0, 0.0); */
-/* glRotatef (65.0, 1.0, 0.0, 0.0); */
-
- /* Phew. FINALLY, Draw the helix -- */
- gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
- gleHelicoid (1.0, 6.0, -1.0,
- 0.0, (0.02*lasty-2.0), 0x0, 0x0, 0.0, 6.0*lastx);
-
- glPopMatrix ();
-
-}
-/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-helix4.c b/hacks/glx/extrusion-helix4.c
deleted file mode 100644
index fbf1602..0000000
--- a/hacks/glx/extrusion-helix4.c
+++ /dev/null
@@ -1,63 +0,0 @@
-
-/*
- * helicoid (gernalized torus) demo
- *
- * FUNCTION:
- * This code provides a very simple example of the helicoid primitive.
- * Most of this code is required to set up OpenGL and GLUT, and very
- * very little to set up the helix drawer. Don't blink!
- *
- * =======> MOUSE HOOKED UP TO AFFINE < ========
- *
- * HISTORY:
- * Written by Linas Vepstas, March 1995
- */
-
-#include "extrusion.h"
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-void InitStuff_helix4 (void)
-{
-}
-
-/* draw the helix shape */
-void DrawStuff_helix4 (void)
-{
- double affine[2][3];
- double delta_affine[2][3];
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f (0.7, 0.5, 0.3);
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
-/* glTranslatef (0.0, 0.0, -80.0); */
-/* glRotatef (220.0, 0.0, 1.0, 0.0); */
-/* glRotatef (65.0, 1.0, 0.0, 0.0); */
-
- /* Phew. FINALLY, Draw the helix -- */
- affine [0][0] = 1.0/ (0.01*lastx);
- affine [1][0] = 0.0;
- affine [0][1] = 0.0;
- affine [1][1] = 0.01*lastx;
- affine [0][2] = 0.0;
- affine [1][2] = 0.0;
-
- delta_affine [0][0] = 0.0;
- delta_affine [1][0] = 0.03*lasty;
- delta_affine [0][1] = -0.03*lasty;
- delta_affine [1][1] = 0.0;
- delta_affine [0][2] = 0.0;
- delta_affine [1][2] = 0.0;
-
- gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
- gleHelicoid (1.0, 7.0, -1.0,
- -4.0, 6.0, affine, delta_affine, 0.0, 980.0);
-
- glPopMatrix ();
-
-}
-/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-joinoffset.c b/hacks/glx/extrusion-joinoffset.c
deleted file mode 100644
index 89a60e2..0000000
--- a/hacks/glx/extrusion-joinoffset.c
+++ /dev/null
@@ -1,148 +0,0 @@
-
-/* cylinder drawing demo */
-/* this demo demonstrates the various join styles */
-
-#include "extrusion.h"
-
-/* ------------------------------------------------------- */
-
-/* the arrays in which we will store the polyline */
-#define NPTS 100
-static double points [NPTS][3];
-static float colors [NPTS][3];
-static int idx = 0;
-
-/* some utilities for filling that array */
-#define PSCALE 0.5
-#define PNT(x,y,z) { \
- points[idx][0] = PSCALE * x; \
- points[idx][1] = PSCALE * y; \
- points[idx][2] = PSCALE * z; \
- idx ++; \
-}
-
-#define COL(r,g,b) { \
- colors[idx][0] = r; \
- colors[idx][1] = g; \
- colors[idx][2] = b; \
-}
-
-/* the arrays in which we will store the contour */
-#define NCONTOUR 100
-static double contour_points [NCONTOUR][2];
-static int cidx = 0;
-
-/* some utilities for filling that array */
-#define C_PNT(x,y) { \
- contour_points[cidx][0] = x; \
- contour_points[cidx][1] = y; \
- cidx ++; \
-}
-
-
-/* ------------------------------------------------------- */
-/*
- * Initialize a bent shape with three segments.
- * The data format is a polyline.
- *
- * NOTE that neither the first, nor the last segment are drawn.
- * The first & last segment serve only to determine that angle
- * at which the endcaps are drawn.
- */
-
-void InitStuff_joinoffset (void)
-{
- COL (0.0, 0.0, 0.0);
- PNT (16.0, 0.0, 0.0);
-
- COL (0.2, 0.8, 0.5);
- PNT (0.0, -16.0, 0.0);
-
- COL (0.0, 0.8, 0.3);
- PNT (-16.0, 0.0, 0.0);
-
- COL (0.8, 0.3, 0.0);
- PNT (0.0, 16.0, 0.0);
-
- COL (0.2, 0.3, 0.9);
- PNT (16.0, 0.0, 0.0);
-
- COL (0.2, 0.8, 0.5);
- PNT (0.0, -16.0, 0.0);
-
- COL (0.0, 0.0, 0.0);
- PNT (-16.0, 0.0, 0.0);
-
- C_PNT (-0.8, -0.5);
- C_PNT (-1.8, 0.0);
- C_PNT (-1.2, 0.3);
- C_PNT (-0.7, 0.8);
- C_PNT (-0.2, 1.3);
- C_PNT (0.0, 1.6);
- C_PNT (0.2, 1.3);
- C_PNT (0.7, 0.8);
- C_PNT (1.2, 0.3);
- C_PNT (1.8, 0.0);
- C_PNT (0.8, -0.5);
-
- gleSetJoinStyle (TUBE_JN_ANGLE | TUBE_CONTOUR_CLOSED | TUBE_JN_CAP);
-}
-
-static double up_vector[3] = {1.0, 0.0, 0.0};
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-/* ------------------------------------------------------- */
-/* draw the extrusion */
-
-void DrawStuff_joinoffset (void)
-{
- double moved_contour [NCONTOUR][2];
- int style, save_style;
- int i;
-
- for (i=0; i<cidx; i++) {
- moved_contour[i][0] = contour_points [i][0];
- moved_contour[i][1] = contour_points [i][1] + 0.05 * (lasty-200.0);
- }
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
- glScalef (0.5, 0.5, 0.5);
- glTranslatef (0, 4, 0);
- /* glTranslatef (0.0, 4.0, -80.0); */
- /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
-
- gleExtrusion (cidx, moved_contour, contour_points, up_vector,
- idx, points, colors);
-
- glPopMatrix ();
-
-
- /* draw a seond copy, this time with the raw style, to compare
- * things against */
- glPushMatrix ();
- glScalef (0.5, 0.5, 0.5);
- glTranslatef (0, -4, 0);
- /* glTranslatef (0.0, -4.0, -80.0); */
- /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
-
- save_style = gleGetJoinStyle ();
- style = save_style;
- style &= ~TUBE_JN_MASK;
- style |= TUBE_JN_RAW;
- gleSetJoinStyle (style);
-
- gleExtrusion (cidx, moved_contour, contour_points, up_vector,
- idx, points, colors);
-
- gleSetJoinStyle (save_style);
- glPopMatrix ();
-
-}
-
-/* ------------------ end of file ----------------------------- */
diff --git a/hacks/glx/extrusion-screw.c b/hacks/glx/extrusion-screw.c
deleted file mode 100644
index 6724476..0000000
--- a/hacks/glx/extrusion-screw.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * screw.c
- *
- * FUNCTION:
- * Draws a screw shape.
- *
- * HISTORY:
- * -- created by Linas Vepstas October 1991
- * -- heavily modified to draw more texas shapes, Feb 1993, Linas
- * -- converted to use GLUT -- December 1995, Linas
- *
- */
-
-#include "extrusion.h"
-#include <stdlib.h>
-#include <math.h>
-
-/* =========================================================== */
-
-#define SCALE 1.3
-#define CONTOUR(x,y) { \
- double ax, ay, alen; \
- contour[i][0] = SCALE * (x); \
- contour[i][1] = SCALE * (y); \
- if (i!=0) { \
- ax = contour[i][0] - contour[i-1][0]; \
- ay = contour[i][1] - contour[i-1][1]; \
- alen = 1.0 / sqrt (ax*ax + ay*ay); \
- ax *= alen; ay *= alen; \
- norms [i-1][0] = ay; \
- norms [i-1][1] = -ax; \
- } \
- i++; \
-}
-
-#define NUM_PTS (25)
-
-static double contour [NUM_PTS][2];
-static double norms [NUM_PTS][2];
-
-static void init_contour (void)
-{
- int i;
-
- /* outline of extrusion */
- i=0;
- CONTOUR (1.0, 1.0);
- CONTOUR (1.0, 2.9);
- CONTOUR (0.9, 3.0);
- CONTOUR (-0.9, 3.0);
- CONTOUR (-1.0, 2.9);
-
- CONTOUR (-1.0, 1.0);
- CONTOUR (-2.9, 1.0);
- CONTOUR (-3.0, 0.9);
- CONTOUR (-3.0, -0.9);
- CONTOUR (-2.9, -1.0);
-
- CONTOUR (-1.0, -1.0);
- CONTOUR (-1.0, -2.9);
- CONTOUR (-0.9, -3.0);
- CONTOUR (0.9, -3.0);
- CONTOUR (1.0, -2.9);
-
- CONTOUR (1.0, -1.0);
- CONTOUR (2.9, -1.0);
- CONTOUR (3.0, -0.9);
- CONTOUR (3.0, 0.9);
- CONTOUR (2.9, 1.0);
-
- CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */
-}
-
-/* =========================================================== */
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-void InitStuff_screw (void)
-{
- int style;
-
- /* configure the pipeline */
- style = TUBE_JN_CAP;
- style |= TUBE_CONTOUR_CLOSED;
- style |= TUBE_NORM_FACET;
- style |= TUBE_JN_ANGLE;
- gleSetJoinStyle (style);
-
- init_contour();
-}
-
-/* =========================================================== */
-
-void DrawStuff_screw (void) {
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f (0.5, 0.6, 0.6);
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
- /* glTranslatef (0.0, 0.0, -80.0); */
- /* glRotatef (130.0, 0.0, 1.0, 0.0); */
- /* glRotatef (65.0, 1.0, 0.0, 0.0); */
-
- /* draw the brand and the handle */
- gleScrew (20, contour, norms,
- NULL, -6.0, 9.0, lasty);
-
- glPopMatrix ();
-}
-
-/* ===================== END OF FILE ================== */
diff --git a/hacks/glx/extrusion-taper.c b/hacks/glx/extrusion-taper.c
deleted file mode 100644
index d2d05a1..0000000
--- a/hacks/glx/extrusion-taper.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * taper.c
- *
- * FUNCTION:
- * Draws a tapered screw shape.
- *
- * HISTORY:
- * -- created by Linas Vepstas October 1991
- * -- heavily modified to draw more texas shapes, Feb 1993, Linas
- * -- converted to use GLUT -- December 1995, Linas
- *
- */
-
-#include "extrusion.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-#ifndef NULL
-#define NULL ((void *) 0x0)
-#endif /* NULL */
-
-/* Some <math.h> files do not define M_PI... */
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-/* =========================================================== */
-
-#define SCALE 3.33333
-#define CONTOUR(x,y) { \
- double ax, ay, alen; \
- contour[i][0] = SCALE * (x); \
- contour[i][1] = SCALE * (y); \
- if (i!=0) { \
- ax = contour[i][0] - contour[i-1][0]; \
- ay = contour[i][1] - contour[i-1][1]; \
- alen = 1.0 / sqrt (ax*ax + ay*ay); \
- ax *= alen; ay *= alen; \
- norms [i-1][0] = ay; \
- norms [i-1][1] = -ax; \
- } \
- i++; \
-}
-
-#define NUM_PTS (25)
-
-static double contour [NUM_PTS][2];
-static double norms [NUM_PTS][2];
-
-static void init_contour (void)
-{
- int i;
-
- /* outline of extrusion */
- i=0;
- CONTOUR (1.0, 1.0);
- CONTOUR (1.0, 2.9);
- CONTOUR (0.9, 3.0);
- CONTOUR (-0.9, 3.0);
- CONTOUR (-1.0, 2.9);
-
- CONTOUR (-1.0, 1.0);
- CONTOUR (-2.9, 1.0);
- CONTOUR (-3.0, 0.9);
- CONTOUR (-3.0, -0.9);
- CONTOUR (-2.9, -1.0);
-
- CONTOUR (-1.0, -1.0);
- CONTOUR (-1.0, -2.9);
- CONTOUR (-0.9, -3.0);
- CONTOUR (0.9, -3.0);
- CONTOUR (1.0, -2.9);
-
- CONTOUR (1.0, -1.0);
- CONTOUR (2.9, -1.0);
- CONTOUR (3.0, -0.9);
- CONTOUR (3.0, 0.9);
- CONTOUR (2.9, 1.0);
-
- CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */
-}
-
-/* =========================================================== */
-
-#define PSIZE 40
-static double path[PSIZE][3];
-static double twist[PSIZE];
-static double taper[PSIZE];
-
-static void init_taper (void) {
- int j;
- double z, deltaz;
- double ang, dang;
-
- z = -10.0;
- deltaz = 0.5;
-
- ang = 0.0;
- dang = 20.0;
- for (j=0; j<40; j++) {
- path[j][0] = 0x0;
- path[j][1] = 0x0;
- path[j][2] = z;
-
- twist[j] = ang;
- ang += dang;
-
- taper[j] = 0.1 * sqrt (9.51*9.51 - z*z);
-
- z += deltaz;
- }
-
- taper[0] = taper[1];
- taper[39] = taper[38];
-
-}
-
-/* =========================================================== */
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-void InitStuff_taper (void)
-{
- int style;
-
- /* configure the pipeline */
- style = TUBE_JN_CAP;
- style |= TUBE_CONTOUR_CLOSED;
- style |= TUBE_NORM_FACET;
- style |= TUBE_JN_ANGLE;
- gleSetJoinStyle (style);
-
- init_contour();
- init_taper();
-}
-
-/* =========================================================== */
-
-static void gleTaper (int ncp,
- gleDouble contour[][2],
- gleDouble cont_normal[][2],
- gleDouble up[3],
- int npoints,
- gleDouble point_array[][3],
- float color_array[][3],
- gleDouble taper[],
- gleDouble twist[])
-{
- int j;
- gleAffine *xforms;
- double co, si, angle;
-
- /* malloc the extrusion array and the twist array */
- xforms = (gleAffine *) malloc (npoints * sizeof(gleAffine));
-
- for (j=0; j<npoints; j++) {
- angle = (M_PI/180.0) * twist[j];
- si = sin (angle);
- co = cos (angle);
- xforms[j][0][0] = taper[j] * co;
- xforms[j][0][1] = - taper[j] * si;
- xforms[j][0][2] = 0.0;
- xforms[j][1][0] = taper[j] * si;
- xforms[j][1][1] = taper[j] * co;
- xforms[j][1][2] = 0.0;
- }
-
- gleSuperExtrusion (ncp, /* number of contour points */
- contour, /* 2D contour */
- cont_normal, /* 2D contour normals */
- up, /* up vector for contour */
- npoints, /* numpoints in poly-line */
- point_array, /* polyline */
- color_array, /* color of polyline */
- xforms);
-
- free (xforms);
-}
-
-/* =========================================================== */
-
-void DrawStuff_taper (void) {
- int j;
- double ang, dang;
- double z, deltaz;
- double ponent;
- z=-1.0;
- deltaz = 1.999/38;
- ang = 0.0;
- dang = lasty/40.0;
- ponent = fabs (lastx/540.0);
- for (j=1; j<39; j++) {
- twist[j] = ang;
- ang += dang;
-
- taper[j] = pow ((1.0 - pow (fabs(z), 1.0/ponent)), ponent);
- z += deltaz;
- }
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f (0.5, 0.6, 0.6);
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
- /* glTranslatef (0.0, 0.0, -80.0); */
- /* glRotatef (130.0, 0.0, 1.0, 0.0); */
- /* glRotatef (65.0, 1.0, 0.0, 0.0); */
-
- /* draw the brand and the handle */
- gleTaper (20, contour, norms, NULL, 40, path, NULL, taper, twist);
-
- glPopMatrix ();
-}
-
-/* ===================== END OF FILE ================== */
diff --git a/hacks/glx/extrusion-twistoid.c b/hacks/glx/extrusion-twistoid.c
deleted file mode 100644
index 82034af..0000000
--- a/hacks/glx/extrusion-twistoid.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * twistoid.c
- *
- * FUNCTION:
- * Show extrusion of open contours. Also, show how torsion is applied.
- *
- * HISTORY:
- * -- linas Vepstas October 1991
- * -- heavily modified to draw corrugated surface, Feb 1993, Linas
- * -- modified to demo twistoid March 1993
- * -- port to glut Linas Vepstas March 1995
- */
-
-#include "extrusion.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-/* Some <math.h> files do not define M_PI... */
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-/* controls shape of object */
-extern float lastx;
-extern float lasty;
-
-#define OPENGL_10
-/* =========================================================== */
-
-#define NUM_TOID1_PTS 5
-static double toid1_points[NUM_TOID1_PTS][3];
-static float toid1_colors [NUM_TOID1_PTS][3];
-static double toid1_twists [NUM_TOID1_PTS];
-
-#define TSCALE (6.0)
-
-#define TPTS(x,y) { \
- toid1_points[i][0] = TSCALE * (x); \
- toid1_points[i][1] = TSCALE * (y); \
- toid1_points[i][2] = TSCALE * (0.0); \
- i++; \
-}
-
-#define TCOLS(r,g,b) { \
- toid1_colors[i][0] = (r); \
- toid1_colors[i][1] = (g); \
- toid1_colors[i][2] = (b); \
- i++; \
-}
-
-#define TXZERO() { \
- toid1_twists[i] = 0.0; \
- i++; \
-}
-
-static void init_toid1_line (void)
-{
- int i;
-
- i=0;
- TPTS (-1.1, 0.0);
- TPTS (-1.0, 0.0);
- TPTS (0.0, 0.0);
- TPTS (1.0, 0.0);
- TPTS (1.1, 0.0);
-
- i=0;
- TCOLS (0.8, 0.8, 0.5);
- TCOLS (0.8, 0.4, 0.5);
- TCOLS (0.8, 0.8, 0.3);
- TCOLS (0.4, 0.4, 0.5);
- TCOLS (0.8, 0.8, 0.5);
-
- i=0;
- TXZERO ();
- TXZERO ();
- TXZERO ();
- TXZERO ();
- TXZERO ();
-}
-
-/* =========================================================== */
-
-#define SCALE 0.6
-#define TWIST(x,y) { \
- double ax, ay, alen; \
- twistation[i][0] = SCALE * (x); \
- twistation[i][1] = SCALE * (y); \
- if (i!=0) { \
- ax = twistation[i][0] - twistation[i-1][0]; \
- ay = twistation[i][1] - twistation[i-1][1]; \
- alen = 1.0 / sqrt (ax*ax + ay*ay); \
- ax *= alen; ay *= alen; \
- twist_normal [i-1][0] = - ay; \
- twist_normal [i-1][1] = ax; \
- } \
- i++; \
-}
-
-#define NUM_TWIS_PTS (20)
-
-static double twistation [NUM_TWIS_PTS][2];
-static double twist_normal [NUM_TWIS_PTS][2];
-
-static void init_tripples (void)
-{
- int i;
- double angle;
- double co, si;
-
- /* outline of extrusion */
- i=0;
- /* first, draw a semi-curcular "hump" */
- while (i< 11) {
- angle = M_PI * ((double) i) / 10.0;
- co = cos (angle);
- si = sin (angle);
- TWIST ((-7.0 -3.0*co), 1.8*si);
- }
-
- /* now, a zig-zag corrugation */
- while (1) {
- if (i >= NUM_TWIS_PTS) break;
- TWIST ((-10.0 +(double) i), 0.0);
- if (i >= NUM_TWIS_PTS) break;
- TWIST ((-9.5 +(double) i), 1.0);
- }
-}
-
-
-/* =========================================================== */
-
-#define V3F(x,y,z) { \
- float vvv[3]; \
- vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv); \
-}
-
-#define N3F(x,y,z) { \
- float nnn[3]; \
- nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn); \
-}
-
-/* =========================================================== */
-
-void DrawStuff_twistoid (void) {
- int i;
-
- toid1_twists[2] = (lastx-121.0) / 8.0;
-
- i=3;
-/*
- TPTS (1.0, lasty /400.0);
- TPTS (1.1, 1.1 * lasty / 400.0);
-*/
- TPTS (1.0, -(lasty-121.0) /200.0);
- TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
-
-#ifdef IBM_GL_32
- rotate (230, 'x');
- rotate (230, 'y');
- scale (1.8, 1.8, 1.8);
-
- if (mono_color) {
- RGBcolor (178, 178, 204);
- twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal,
- NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
- } else {
- twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal,
- NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
- }
-#endif
-
-#ifdef OPENGL_10
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glFrontFace(GL_CW); /* jwz */
-
- /* set up some matrices so that the object spins with the mouse */
- glPushMatrix ();
-/* glTranslatef (0.0, 0.0, -80.0); */
-/* glRotated (43.0, 1.0, 0.0, 0.0); */
-/* glRotated (43.0, 0.0, 1.0, 0.0); */
- glScaled (1.8, 1.8, 1.8);
- gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal,
- NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
- glPopMatrix ();
-#endif
-
-}
-
-/* =========================================================== */
-
-void InitStuff_twistoid (void)
-{
- int js;
-
- init_toid1_line ();
- init_tripples ();
-
-#ifdef IBM_GL_32
- js = getjoinstyle ();
- js &= ~TUBE_CONTOUR_CLOSED;
- setjoinstyle (js);
-#endif
-
-#ifdef OPENGL_10
- js = gleGetJoinStyle ();
- js &= ~TUBE_CONTOUR_CLOSED;
- gleSetJoinStyle (js);
-#endif
-
-}
-
-/* ------------------ end of file -------------------- */
diff --git a/hacks/glx/extrusion.c b/hacks/glx/extrusion.c
deleted file mode 100644
index b76edfb..0000000
--- a/hacks/glx/extrusion.c
+++ /dev/null
@@ -1,551 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* extrusion --- extrusion module for xscreensaver */
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
-
- * Revision History:
- * Tue Oct 19 22:24:47 PDT 1999 Initial creation by David Konerding
- * <dek@cgl.ucsf.edu>
- *
- * Notes:
- * This screensaver requires the GLE ("OpenGL Tubing and Extrusion Library")
- * which can be obtained from http://www.linas.org/gle/index.html
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_extrusion 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL /* whole file */
-
-#include "ximage-loader.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include "extrusion.h"
-
-#define checkImageWidth 64
-#define checkImageHeight 64
-
-
-#define WIDTH 640
-#define HEIGHT 480
-
-#define DEF_LIGHT "True"
-#define DEF_TEXTURE "False"
-#define DEF_TEX_QUAL "False"
-#define DEF_MIPMAP "False"
-#define DEF_NAME "RANDOM"
-#define DEF_IMAGE "BUILTIN"
-
-static int do_light;
-static int do_texture;
-static int do_tex_qual;
-static int do_mipmap;
-static char *which_name;
-static char *which_image;
-
-static XrmOptionDescRec opts[] = {
- {"-light", ".extrusion.light", XrmoptionNoArg, "true" },
- {"+light", ".extrusion.light", XrmoptionNoArg, "false" },
- {"-texture", ".extrusion.texture", XrmoptionNoArg, "true" },
- {"+texture", ".extrusion.texture", XrmoptionNoArg, "false" },
- {"-texture", ".extrusion.texture", XrmoptionNoArg, "true" },
- {"+texture_quality", ".extrusion.texture", XrmoptionNoArg, "false" },
- {"-texture_quality", ".extrusion.texture", XrmoptionNoArg, "true" },
- {"+mipmap", ".extrusion.mipmap", XrmoptionNoArg, "false" },
- {"-mipmap", ".extrusion.mipmap", XrmoptionNoArg, "true" },
- {"-name", ".extrusion.name", XrmoptionSepArg, 0 },
- {"-image", ".extrusion.image", XrmoptionSepArg, 0 },
-};
-
-
-static argtype vars[] = {
- {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_tex_qual, "texture_quality", "Texture_Quality", DEF_TEX_QUAL, t_Bool},
- {&do_mipmap, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
- {&which_name, "name", "Name", DEF_NAME, t_String},
- {&which_image, "image", "Image", DEF_IMAGE, t_String},
-};
-
-
-static OptionStruct desc[] =
-{
- {"-name num", "example 'name' to draw (helix2, helix3, helix4, joinoffset, screw, taper, twistoid)"},
- {"-/+ light", "whether to do enable lighting (slower)"},
- {"-/+ texture", "whether to apply a texture (slower)"},
- {"-image <filename>", "texture image to load"},
- {"-/+ texture_quality", "whether to use texture smoothing (slower)"},
- {"-/+ mipmap", "whether to use texture mipmap (slower)"},
-};
-
-ENTRYPOINT ModeSpecOpt extrusion_opts = {countof(opts), opts, countof(vars), vars, desc};
-
-#ifdef USE_MODULES
-ModStruct extrusion_description =
-{"extrusion", "init_extrusion", "draw_extrusion", NULL,
- "draw_extrusion", "init_extrusion", NULL, &extrusion_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "OpenGL extrusion", 0, NULL};
-#endif
-
-
-/* structure for holding the extrusion data */
-typedef struct {
- int screen_width, screen_height;
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- Bool button2_down_p;
- int mouse_start_x, mouse_start_y;
- int mouse_x, mouse_y;
- int mouse_dx, mouse_dy;
- Window window;
- XColor fg, bg;
- int extrusion_number;
-} extrusionstruct;
-
-static extrusionstruct *Extrusion = NULL;
-
-
-
-/* set up a light */
-static const GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
-static const GLfloat lightOneColor[] = {0.99, 0.99, 0.00, 1.0};
-
-static const GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
-static const GLfloat lightTwoColor[] = {0.00, 0.99, 0.99, 1.0};
-
-float rot_x=0, rot_y=0, rot_z=0;
-float lastx=0, lasty=0;
-
-static float max_lastx=400, max_lasty=400;
-static float min_lastx=-400, min_lasty=-400;
-
-struct functions {
- void (*InitStuff)(void);
- void (*DrawStuff)(void);
- char *name;
-};
-
-/* currently joinoffset and twistoid look funny-
- like we're looking at them from the back or something
-*/
-
-static const struct functions funcs_ptr[] = {
- {InitStuff_helix2, DrawStuff_helix2, "helix2"},
- {InitStuff_helix3, DrawStuff_helix3, "helix3"},
- {InitStuff_helix4, DrawStuff_helix4, "helix4"},
- {InitStuff_joinoffset, DrawStuff_joinoffset, "joinoffset"},
- {InitStuff_screw, DrawStuff_screw, "screw"},
- {InitStuff_taper, DrawStuff_taper, "taper"},
- {InitStuff_twistoid, DrawStuff_twistoid, "twistoid"},
-};
-
-static int num_extrusions = countof(funcs_ptr);
-
-
-/* BEGINNING OF FUNCTIONS */
-
-
-static GLubyte *
-Generate_Image(int *width, int *height, int *format)
-{
- GLubyte *result;
- int i, j, c;
- int counter=0;
-
- *width = checkImageWidth;
- *height = checkImageHeight;
- result = (GLubyte *)malloc(4 * (*width) * (*height));
-
- counter = 0;
- for (i = 0; i < checkImageWidth; i++) {
- for (j = 0; j < checkImageHeight; j++) {
- c = (((((i&0x8)==0))^(((j&0x8))==0)))*255;
- result[counter++] = (GLubyte) c;
- result[counter++] = (GLubyte) c;
- result[counter++] = (GLubyte) c;
- result[counter++] = (GLubyte) 255;
- }
- }
-
- *format = GL_RGBA;
- return result;
-}
-
-
-/* Create a texture in OpenGL. First an image is loaded
- and stored in a raster buffer, then it's */
-static void Create_Texture(ModeInfo *mi, const char *filename)
-{
- int height, width;
- GLubyte *image;
- int format;
-
- if ( !strncmp(filename, "BUILTIN", 7))
- {
- BUILTIN:
- image = Generate_Image(&width, &height, &format);
- }
- else
- {
- XImage *ximage = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
- filename);
- if (!ximage)
- goto BUILTIN;
- image = (GLubyte *) ximage->data;
- width = ximage->width;
- height = ximage->height;
- format = GL_RGBA;
- }
-
- /* GL_MODULATE or GL_DECAL depending on what you want */
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- /* perhaps we can edge a bit more speed at the expense of quality */
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
-
- if (do_tex_qual) {
- /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- }
- else {
- /* default is to do it quick and dirty */
- /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- }
-
- /* mipmaps make the image look much nicer */
- if (do_mipmap)
- {
- int status;
- clear_gl_error();
- status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, format,
- GL_UNSIGNED_BYTE, image);
- if (status)
- {
- const char *s = (char *) gluErrorString (status);
- fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
- progname, width, height,
- (s ? s : "(unknown)"));
- exit (1);
- }
- check_gl_error("mipmapping");
- }
- else
- {
- clear_gl_error();
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
- format, GL_UNSIGNED_BYTE, image);
- check_gl_error("texture");
- }
-}
-
-
-static void
-init_rotation (ModeInfo *mi)
-{
- extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
- double spin_speed = 0.5;
- gp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
- 0.2,
- 0.005,
- True);
- gp->trackball = gltrackball_init (True);
-
- lastx = (random() % (int) (max_lastx - min_lastx)) + min_lastx;
- lasty = (random() % (int) (max_lasty - min_lasty)) + min_lasty;
-}
-
-
-/* draw the extrusion once */
-ENTRYPOINT void
-draw_extrusion(ModeInfo * mi)
-{
- extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- static const GLfloat color[4] = {0.6, 0.6, 0.4, 1.0};
- /* static const GLfloat spec[4] = {0.6, 0.6, 0.6, 1.0}; */
- /* static const GLfloat shiny = 40.0; */
-
- double x, y, z;
-
- if (!gp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
-
- glPushMatrix();
-
- gltrackball_rotate (gp->trackball);
-
- get_rotation (gp->rot, &x, &y, &z,
- !(gp->button_down_p || gp->button2_down_p));
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
-
- /* track the mouse only if a button is down. */
- if (gp->button2_down_p)
- {
- gp->mouse_dx += gp->mouse_x - gp->mouse_start_x;
- gp->mouse_dy += gp->mouse_y - gp->mouse_start_y;
- gp->mouse_start_x = gp->mouse_x;
- gp->mouse_start_y = gp->mouse_y;
- }
-
- {
- float scale = (max_lastx - min_lastx);
- get_position (gp->rot, &x, &y, &z,
- !(gp->button_down_p || gp->button2_down_p));
- lastx = x * scale + min_lastx + gp->mouse_dx;
- lasty = y * scale + min_lasty + gp->mouse_dy;
- }
-
- glScalef(0.5, 0.5, 0.5);
-
- /* glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); */
- /* glMateriali (GL_FRONT_AND_BACK, GL_SHININESS, shiny); */
-
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glFrontFace(GL_CCW);
-
- funcs_ptr[gp->extrusion_number].DrawStuff();
-
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glXSwapBuffers(display, window);
-}
-
-
-/* set up lighting conditions */
-static void
-SetupLight(void)
-{
- glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
- glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
- glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
- glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
-
- glEnable (GL_LIGHT0);
- glEnable (GL_LIGHT1);
- glEnable (GL_LIGHTING);
-
- glColorMaterial (GL_FRONT, GL_DIFFUSE);
- glColorMaterial (GL_BACK, GL_DIFFUSE);
- glEnable (GL_COLOR_MATERIAL);
-}
-
-/* Standard reshape function */
-ENTRYPOINT void
-reshape_extrusion (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-/* decide which extrusion example to run */
-static void
-chooseExtrusionExample (ModeInfo *mi)
-{
- extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
- int i;
- /* call the extrusion init routine */
-
- if (!strncmp(which_name, "RANDOM", strlen(which_name))) {
- gp->extrusion_number = random() % num_extrusions;
- }
- else {
- gp->extrusion_number=-1;
- for (i=0; i < num_extrusions; i++) {
- if (!strncmp(which_name, funcs_ptr[i].name, strlen(which_name))) {
- gp->extrusion_number = i;
- }
- }
- }
-
- if (gp->extrusion_number < 0 || gp->extrusion_number >= num_extrusions) {
- fprintf(stderr, "%s: invalid extrusion example number!\n", progname);
- fprintf(stderr, "%s: known extrusions:\n", progname);
- for (i=0; i < num_extrusions; i++)
- fprintf(stderr,"\t%s\n", funcs_ptr[i].name);
- exit(1);
- }
- init_rotation(mi);
- funcs_ptr[gp->extrusion_number].InitStuff();
-}
-
-
-/* main OpenGL initialization routine */
-static void
-initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
-{
- int style;
- int mode;
-
- reshape_extrusion(mi, width, height);
- glViewport( 0, 0, width, height );
-
- glEnable(GL_DEPTH_TEST);
- glDisable (GL_CULL_FACE);
- glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, True);
- glShadeModel(GL_SMOOTH);
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- MI_IS_WIREFRAME(mi) = 0;
-# endif
-
- if (do_light)
- SetupLight();
- if (MI_IS_WIREFRAME(mi)) {
- glPolygonMode(GL_FRONT,GL_LINE);
- glPolygonMode(GL_BACK,GL_LINE);
- }
- if (do_texture) {
- Create_Texture(mi, which_image);
- glEnable(GL_TEXTURE_2D);
-
- /* configure the pipeline */
- style = TUBE_JN_CAP;
- style |= TUBE_CONTOUR_CLOSED;
- style |= TUBE_NORM_FACET;
- style |= TUBE_JN_ANGLE;
- gleSetJoinStyle (style);
-
- if (do_texture) {
- mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_MODEL_FLAT;
- glMatrixMode (GL_TEXTURE); glLoadIdentity ();
- glScalef (0.25, 0.1, 1); glMatrixMode (GL_MODELVIEW);
- gleTextureMode (mode);
- }
- }
-
-}
-
-ENTRYPOINT Bool
-extrusion_handle_event (ModeInfo *mi, XEvent *event)
-{
- extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
-
- if (event->xany.type == ButtonPress &&
- (event->xbutton.button == Button4 ||
- event->xbutton.button == Button5 ||
- event->xbutton.button == Button6 ||
- event->xbutton.button == Button7))
- {
- }
- else if (event->xany.type == ButtonPress && /* rotate with left button */
- !event->xbutton.state) /* if no modifier keys */
- {
- }
- else if (event->xany.type == ButtonPress) /* deform with other buttons */
- { /* or with modifier keys */
- gp->button2_down_p = True;
- }
- else if (event->xany.type == ButtonRelease)
- {
- gp->button_down_p = False;
- gp->button2_down_p = False;
- }
- else if (event->xany.type == MotionNotify)
- {
- if (gp->button2_down_p)
- {
- gp->mouse_x = event->xmotion.x;
- gp->mouse_y = event->xmotion.y;
- }
- }
-
- if (gltrackball_event_handler (event, gp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &gp->button_down_p))
- return True;
-
- return False;
-}
-
-
-/* xextrusion initialization routine */
-ENTRYPOINT void
-init_extrusion (ModeInfo * mi)
-{
- int screen = MI_SCREEN(mi);
- extrusionstruct *gp;
-
- if (MI_IS_WIREFRAME(mi)) do_light = 0;
-
- MI_INIT(mi, Extrusion);
- gp = &Extrusion[screen];
-
- gp->window = MI_WINDOW(mi);
- if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape_extrusion(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- chooseExtrusionExample(mi);
- } else {
- MI_CLEARWINDOW(mi);
- }
-
-}
-
-
-ENTRYPOINT void
-free_extrusion (ModeInfo * mi)
-{
- extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
- if (!gp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
- if (gp->trackball) gltrackball_free (gp->trackball);
- if (gp->rot) free_rotator (gp->rot);
-}
-
-XSCREENSAVER_MODULE ("Extrusion", extrusion)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/extrusion.h b/hacks/glx/extrusion.h
deleted file mode 100644
index 6ad5566..0000000
--- a/hacks/glx/extrusion.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* extrusion --- extrusion module for xscreensaver */
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- */
-
-#ifndef __XSCREENSAVER_EXTRUSION_H__
-#define __XSCREENSAVER_EXTRUSION_H__
-
-#include "xlockmoreI.h"
-
-#ifdef HAVE_COCOA
-# include <GLUT/tube.h> /* gle is included with GLUT on OSX */
-#else /* !HAVE_COCOA */
-# ifdef HAVE_GLE3
-# include <GL/gle.h>
-# else
-# include <GL/tube.h>
-# endif
-#endif /* !HAVE_COCOA */
-
-extern void InitStuff_helix2(void);
-extern void DrawStuff_helix2(void);
-extern void InitStuff_helix3(void);
-extern void DrawStuff_helix3(void);
-extern void InitStuff_helix4(void);
-extern void DrawStuff_helix4(void);
-extern void InitStuff_joinoffset(void);
-extern void DrawStuff_joinoffset(void);
-extern void InitStuff_screw(void);
-extern void DrawStuff_screw(void);
-extern void InitStuff_taper(void);
-extern void DrawStuff_taper(void);
-extern void InitStuff_twistoid(void);
-extern void DrawStuff_twistoid(void);
-
-#endif /* __XSCREENSAVER_EXTRUSION_H__ */
diff --git a/hacks/glx/extrusion.man b/hacks/glx/extrusion.man
deleted file mode 100644
index b4a0b29..0000000
--- a/hacks/glx/extrusion.man
+++ /dev/null
@@ -1,71 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-extrusion \- various rotating extruded shapes.
-.SH SYNOPSIS
-.B extrusion
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-name \fIwhich\fP]
-[\-no-light]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Draws various rotating extruded shapes that twist around, lengthen, and
-turn inside out.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-name \fIwhich\fP
-Which object to draw. Choices are: helix2, helix3, helix4, joinoffset,
-screw, taper, and twistoid.
-.TP 8
-.B \-light | \-no-light
-Whether to light the scene, or use flat coloring.
-.TP 8
-.B \-bitmap \fIfile\fP
-The texture map to use.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Linas Vepstas and David Konerding. Permission
-to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided
-that the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation. No representations are made about the suitability of
-this software for any purpose. It is provided "as is" without express
-or implied warranty.
-.SH AUTHOR
-This screensaver was created by David Konerding from the samples that
-come with the GL Extrusion library by Linas Vepstas.
diff --git a/hacks/glx/flipflop.c b/hacks/glx/flipflop.c
deleted file mode 100644
index dc4f2ff..0000000
--- a/hacks/glx/flipflop.c
+++ /dev/null
@@ -1,875 +0,0 @@
-/* flipflop, Copyright (c) 2003 Kevin Ogden <kogden1@hotmail.com>
- * (c) 2006 Sergio Gutiérrez "Sergut" <sergut@gmail.com>
- * (c) 2008 Andrew Galante <a.drew7@gmail.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- *
- * 2003 Kevin Odgen First version
- * 2006 Sergio Gutiérrez "Sergut" Made several parameters dynamic and selectable
- * from the command line: size of the board,
- * rotation speed and number of free squares; also
- * added the "sticks" mode.
- * 2008 Andrew Galante Added -textured option: textures the board with
- * an image which gets scrambled as the tiles move
- *
- */
-
-#define DEF_MODE "tiles" /* Default mode (options: "tiles", "sticks") */
-#define DEF_SIZEX "9" /* Default width of the board */
-#define DEF_SIZEY "9" /* Default length of the board */
-
-#define DEF_BOARD_SIZE "0" /* "0" means "no value selected by user". It is changed */
-#define DEF_NUMSQUARES "0" /* in function init_flipflop() to its correct value (that */
-#define DEF_FREESQUARES "0" /* is a function of the size of the board and the mode)*/
-
-#define DEF_SPIN "0.1" /* Default angular velocity: PI/10 rads/s */
-
-#define DEF_TEXTURED "False" /* Default: do not grab an image for texturing */
-
-#define DEF_STICK_THICK 54 /* Thickness for the sticks mode (over 100) */
-#define DEF_STICK_RATIO 80 /* Ratio of sticks/total squares (over 100) */
-#define DEF_TILE_THICK 4 /* Thickness for the tiles mode (over 100) */
-#define DEF_TILE_RATIO 95 /* Ratio of tiles/total squares (over 100) */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_flipflop 0
-# include "xlockmore.h"
-
-#else
-# include "xlock.h"
-#endif /* STANDALONE */
-
-#ifdef USE_GL
-
-#include "gltrackball.h"
-
-static XrmOptionDescRec opts[] = {
- {"-sticks", ".mode", XrmoptionNoArg, "sticks"},
- {"-tiles", ".mode", XrmoptionNoArg, "tiles" },
- {"-mode", ".mode", XrmoptionSepArg, 0 },
- {"-size", ".size", XrmoptionSepArg, 0 },
- {"-size-x", ".sizex", XrmoptionSepArg, 0 },
- {"-size-y", ".sizey", XrmoptionSepArg, 0 },
- {"-count", ".numsquares", XrmoptionSepArg, 0 },
- {"-free", ".freesquares", XrmoptionSepArg, 0 },
- {"-spin", ".spin", XrmoptionSepArg, 0 },
- {"-texture", ".textured", XrmoptionNoArg, "True" },
- {"+texture", ".textured", XrmoptionNoArg, "False" },
-};
-
-/* The code had been modifying these. That's not allowed. */
-static int board_x_size_arg, board_y_size_arg, board_avg_size_arg;
-static int numsquares_arg, freesquares_arg;
-static float half_thick_arg;
-static float spin_arg;
-static char* flipflopmode_str_arg="tiles";
-static int textured_arg;
-
-static argtype vars[] = {
- { &flipflopmode_str_arg, "mode", "Mode", DEF_MODE, t_String},
- { &board_avg_size_arg, "size", "Integer", DEF_BOARD_SIZE, t_Int},
- { &board_x_size_arg, "sizex", "Integer", DEF_SIZEX, t_Int},
- { &board_y_size_arg, "sizey", "Integer", DEF_SIZEY, t_Int},
- { &numsquares_arg, "numsquares", "Integer", DEF_NUMSQUARES, t_Int},
- { &freesquares_arg, "freesquares", "Integer", DEF_NUMSQUARES, t_Int},
- { &spin_arg, "spin", "Float", DEF_SPIN, t_Float},
- { &textured_arg, "textured", "Bool", DEF_TEXTURED, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt flipflop_opts =
- {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct flipflop_description =
- {"flipflop", "init_flipflop", "draw_flipflop", NULL,
- "draw_flipflop", "init_flipflop", "free_flipflop", &flipflop_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Flipflop", 0, NULL};
-
-#endif /* USE_MODULES */
-
-typedef struct {
- /* array specifying which squares are where (to avoid collisions) */
- /* -1 means empty otherwise integer represents square index 0 - n-1 */
- /* occupied[x*board_y_size+y] is the tile [x][y] (i.e. that starts at column x and row y)*/
- int *occupied; /* size: size_x * size_y */
- /* an array of xpositions of the squares */
- int *xpos; /* size: numsquares */
- /* array of y positions of the squares */
- int *ypos; /* size: numsquares */
- /* integer representing the direction of movement of a square */
- int *direction; /* 0 not, 1 x+, 2 y+, 3 x-, 4 y-*/ /* size: numsquares */
- /* angle of moving square (during a flip) */
- float *angle; /* size: numsquares */
- /* array of colors for a square (RGB) */
- /* eg. color[ 3*3 + 0 ] is the red component of square 3 */
- /* eg. color[ 4*3 + 1 ] is the green component of square 4 */
- /* eg. color[ 5*3 + 2 ] is the blue component of square 5 */
- /* ^-- n is the number of square */
- float *color; /* size: numsquares * 3 */
- /* array of texcoords for each square */
- /* tex[ n*4 + 0 ] is x texture coordinate of square n's left side */
- /* tex[ n*4 + 1 ] is y texture coordinate of square n's top side */
- /* tex[ n*4 + 2 ] is x texture coordinate of square n's right side */
- /* tex[ n*4 + 3 ] is y texture coordinate of square n's bottom side */
- float *tex; /* size: numsquares * 4 */
-} randsheet;
-
-typedef struct {
- GLXContext *glx_context;
- Window window;
- trackball_state *trackball;
- Bool button_down_p;
-
- int clearbits;
- int board_x_size, board_y_size, board_avg_size;
- int numsquares, freesquares;
- float half_thick;
- float spin;
- const char *flipflopmode_str;
- int textured;
-
- randsheet *sheet;
-
- float theta; /* angle of rotation of the board */
- float flipspeed; /* amount of flip; 1 is a entire flip */
- float reldist; /* relative distace of camera from center */
- float energy; /* likelyhood that a square will attempt to move */
-
- /* texture rectangle */
- float tex_x;
- float tex_y;
- float tex_width;
- float tex_height;
-
- /* id of texture in use */
- GLuint texid;
-
- Bool mipmap;
- Bool got_texture;
-
- GLfloat anisotropic;
-
-} Flipflopcreen;
-
-static Flipflopcreen *qs = NULL;
-
-#include "grab-ximage.h"
-
-static void randsheet_create(ModeInfo *mi, randsheet *rs);
-static void randsheet_initialize(ModeInfo *mi, randsheet *rs);
-static void randsheet_free (randsheet *rs);
-static int randsheet_new_move(ModeInfo *mi, randsheet* rs);
-static void randsheet_move(ModeInfo *mi, randsheet *rs, float rot);
-static int randsheet_draw(ModeInfo *mi, randsheet *rs);
-static void setup_lights(ModeInfo *mi);
-static int drawBoard(ModeInfo *mi, Flipflopcreen *);
-static int display(ModeInfo *mi);
-static int draw_sheet(ModeInfo *mi, float *tex);
-
-
-/* configure lighting */
-static void
-setup_lights(ModeInfo *mi)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
-
- /* GLfloat position0[] = { c->board_avg_size*0.5, c->board_avg_size*0.1, c->board_avg_size*0.5, 1.0 }; */
-
- /* GLfloat position0[] = { -c->board_avg_size*0.5, 0.2*c->board_avg_size, -c->board_avg_size*0.5, 1.0 }; */
- GLfloat position0[4];
- position0[0] = 0;
- position0[1] = c->board_avg_size*0.3;
- position0[2] = 0;
- position0[3] = 1;
-
- if (MI_IS_WIREFRAME(mi)) return;
-
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glEnable(GL_LIGHT0);
-}
-
-static void get_texture(ModeInfo *);
-
-
-ENTRYPOINT Bool
-flipflop_handle_event (ModeInfo *mi, XEvent *event)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, c->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &c->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- if (!c->textured || c->got_texture)
- {
- c->textured = 1;
- c->got_texture = False;
- get_texture (mi);
- return True;
- }
- }
-
- return False;
-}
-
-/* draw board */
-static int
-drawBoard(ModeInfo *mi, Flipflopcreen *c)
-{
- int i;
- for (i=0; i < (c->energy) ; i++) {
- randsheet_new_move(mi, c->sheet);
- }
- randsheet_move(mi, c->sheet, c->flipspeed * M_PI);
- return randsheet_draw(mi, c->sheet);
-}
-
-
-static int
-display(ModeInfo *mi)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- GLfloat amb[] = { 0.8, 0.8, 0.8, 1.0 };
- int polys = 0;
-
-
- glClear(c->clearbits);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.2);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.15/c->board_avg_size);
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.15/c->board_avg_size);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
-
-
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- /** setup perspectif */
- glTranslatef(0.0, 0.0, -c->reldist*c->board_avg_size);
- glRotatef(22.5, 1.0, 0.0, 0.0);
- gltrackball_rotate (c->trackball);
- glRotatef(c->theta*100, 0.0, 1.0, 0.0);
- glTranslatef(-0.5*c->board_x_size, 0.0, -0.5*c->board_y_size); /* Center the board */
-
- /* set texture */
- if(c->textured)
- glBindTexture(GL_TEXTURE_2D, c->texid);
-
- polys = drawBoard(mi, c);
-
- if (!c->button_down_p) {
- c->theta += .01 * c->spin;
- }
-
- return polys;
-}
-
-ENTRYPOINT void
-reshape_flipflop(ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0,y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45, 1/h, 1.0, 300.0);
- glMatrixMode(GL_MODELVIEW);
-}
-
-static void
-image_loaded_cb (const char *filename, XRectangle *geometry,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- Flipflopcreen *c = (Flipflopcreen *)closure;
- int i, j;
- int index = 0;
- randsheet *rs = c->sheet;
-
- c->tex_x = (float)geometry->x / (float)texture_width;
- c->tex_y = (float)geometry->y / (float)texture_height;
- c->tex_width = (float)geometry->width / (float)texture_width;
- c->tex_height = (float)geometry->height / (float)texture_height;
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- (c->mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
-
- if(c->anisotropic >= 1)
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, c->anisotropic);
-
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- for(i = 0; i < c->board_x_size && index < c->numsquares; i++)
- for(j = 0; j < c->board_y_size && index < c->numsquares; j++)
- {
- /* arrange squares to form loaded image */
- rs->tex[ index*4 + 0 ] = c->tex_x + c->tex_width / c->board_x_size * (i + 0);
- rs->tex[ index*4 + 1 ] = c->tex_y + c->tex_height / c->board_y_size * (j + 1);
- rs->tex[ index*4 + 2 ] = c->tex_x + c->tex_width / c->board_x_size * (i + 1);
- rs->tex[ index*4 + 3 ] = c->tex_y + c->tex_height / c->board_y_size * (j + 0);
- rs->color[ index*3 + 0 ] = 1;
- rs->color[ index*3 + 1 ] = 1;
- rs->color[ index*3 + 2 ] = 1;
- index++;
- }
-
- c->got_texture = True;
-}
-
-static void
-get_texture(ModeInfo *modeinfo)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(modeinfo)];
-
- c->got_texture = False;
- c->mipmap = True;
- load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
- *c->glx_context, 0, 0, c->mipmap, c->texid,
- image_loaded_cb, c);
-}
-
-ENTRYPOINT void
-init_flipflop(ModeInfo *mi)
-{
- Flipflopcreen *c;
- MI_INIT(mi, qs);
- c = &qs[MI_SCREEN(mi)];
-
- c->board_x_size = board_x_size_arg;
- c->board_y_size = board_y_size_arg;
- c->board_avg_size = board_avg_size_arg;
- c->numsquares = numsquares_arg;
- c->freesquares = freesquares_arg;
- c->half_thick = half_thick_arg;
- c->spin = spin_arg;
- c->flipflopmode_str = flipflopmode_str_arg;
- c->textured = textured_arg;
-
- if (MI_IS_WIREFRAME(mi)) c->textured = 0;
-
- /* Set all constants to their correct values */
- if (c->board_avg_size != 0) { /* general size specified by user */
- c->board_x_size = c->board_avg_size;
- c->board_y_size = c->board_avg_size;
- } else {
- c->board_avg_size = (c->board_x_size + c->board_y_size) / 2;
- }
- if ((c->numsquares == 0) && (c->freesquares != 0)) {
- c->numsquares = c->board_x_size * c->board_y_size - c->freesquares;
- }
- if (strcmp(c->flipflopmode_str, "tiles")) {
- c->textured = 0; /* textures look dumb in stick mode */
- c->half_thick = 1.0 * DEF_STICK_THICK / 100.0;
- if (c->numsquares == 0) { /* No value defined by user */
- c->numsquares = c->board_x_size * c->board_y_size * DEF_STICK_RATIO / 100;
- }
- } else {
- c->half_thick = 1.0 * DEF_TILE_THICK / 100.0;
- if (c->numsquares == 0) { /* No value defined by user */
- c->numsquares = c->board_x_size * c->board_y_size * DEF_TILE_RATIO/ 100;;
- }
- }
- if (c->board_avg_size < 2) {
- fprintf (stderr,"%s: the board must be at least 2x2.\n", progname);
- exit(1);
- }
- if ((c->board_x_size < 1) || (c->board_y_size < 1) || (c->numsquares < 1)) {
- fprintf (stderr,"%s: the number of elements ('-count') and the dimensions of the board ('-size-x', '-size-y') must be positive integers.\n", progname);
- exit(1);
- }
- if (c->board_x_size * c->board_y_size <= c->numsquares) {
- fprintf (stderr,"%s: the number of elements ('-count') that you specified is too big \n for the dimensions of the board ('-size-x', '-size-y'). Nothing will move.\n", progname);
- }
-
- c->window = MI_WINDOW(mi);
- c->trackball = gltrackball_init (False);
-
- c->flipspeed = 0.03;
- c->reldist = 1;
- c->energy = 40;
-
- if((c->glx_context = init_GL(mi)))
- reshape_flipflop(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- else
- MI_CLEARWINDOW(mi);
-
- /* At this point, all the constants have already been set, */
- /* so we can create the board */
- c->sheet = (randsheet*) malloc(sizeof(randsheet));
- randsheet_create(mi, c->sheet);
-
- c->clearbits = GL_COLOR_BUFFER_BIT;
-
- glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
- glEnable(GL_COLOR_MATERIAL);
- setup_lights(mi);
-
- glEnable(GL_DEPTH_TEST);
- c->clearbits |= GL_DEPTH_BUFFER_BIT;
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- randsheet_initialize(mi, c->sheet);
- if (c->textured){
- /* check for anisotropic filtering */
- if(strstr((char *)glGetString(GL_EXTENSIONS),
- "GL_EXT_texture_filter_anisotropic"))
- glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
- else
- c->anisotropic = 0;
-
- /* allocate a new texture and get it */
- glGenTextures(1, &c->texid);
- get_texture(mi);
- }
-}
-
-ENTRYPOINT void
-draw_flipflop(ModeInfo *mi)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- Window w = MI_WINDOW(mi);
- Display *disp = MI_DISPLAY(mi);
-
- glXMakeCurrent(disp, w, *c->glx_context);
-
- if(!c->textured || c->got_texture)
- mi->polygon_count = display(mi);
- else
- glClear(GL_COLOR_BUFFER_BIT);
-
- if(mi->fps_p){
- do_fps(mi);
- }
-
- glFinish();
- glXSwapBuffers(disp, w);
-
-
-}
-
-ENTRYPOINT void
-free_flipflop(ModeInfo *mi)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- if (!c->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *c->glx_context);
- if(c->trackball) gltrackball_free(c->trackball);
- if (c->sheet) {
- randsheet_free(c->sheet);
- free (c->sheet);
- }
- if (c->texid) glDeleteTextures (1, &c->texid);
-}
-
-/*** ADDED RANDSHEET FUNCTIONS ***/
-
-static int
-draw_sheet(ModeInfo *mi, float *tex)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- int polys = 0;
- int wire = MI_IS_WIREFRAME(mi);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
-
- glNormal3f (0, -1, 0);
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f (c->half_thick, -c->half_thick, c->half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f (1-c->half_thick, -c->half_thick, c->half_thick);
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f (1-c->half_thick, -c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f (c->half_thick, -c->half_thick, 1-c->half_thick);
- polys++;
-
- if (wire) { glEnd(); glBegin (GL_LINE_LOOP); }
-
- /* back */
- glNormal3f (0, 1, 0);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f (c->half_thick, c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f (1-c->half_thick, c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f (1-c->half_thick, c->half_thick, c->half_thick);
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f (c->half_thick, c->half_thick, c->half_thick);
- polys++;
-
- if (wire) { glEnd(); return polys; }
-
- /* 4 edges!!! weee.... */
- glNormal3f (0, 0, -1);
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f (c->half_thick, c->half_thick, c->half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f (1-c->half_thick, c->half_thick, c->half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f (1-c->half_thick, -c->half_thick, c->half_thick);
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f (c->half_thick, -c->half_thick, c->half_thick);
- polys++;
- glNormal3f (0, 0, 1);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f (c->half_thick, c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f (c->half_thick, -c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f (1-c->half_thick, -c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f (1-c->half_thick, c->half_thick, 1-c->half_thick);
- polys++;
- glNormal3f (1, 0, 0);
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f (1-c->half_thick, c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[2], tex[1]);
- glVertex3f (1-c->half_thick, -c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f (1-c->half_thick, -c->half_thick, c->half_thick);
- glTexCoord2f(tex[2], tex[3]);
- glVertex3f (1-c->half_thick, c->half_thick, c->half_thick);
- polys++;
- glNormal3f (-1, 0, 0);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f (c->half_thick, c->half_thick, 1-c->half_thick);
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f (c->half_thick, c->half_thick, c->half_thick);
- glTexCoord2f(tex[0], tex[3]);
- glVertex3f (c->half_thick, -c->half_thick, c->half_thick);
- glTexCoord2f(tex[0], tex[1]);
- glVertex3f (c->half_thick, -c->half_thick, 1-c->half_thick);
- polys++;
- glEnd();
-
- return polys;
-}
-
-/* Reserve memory for the randsheet */
-static void
-randsheet_create(ModeInfo *mi, randsheet *rs)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- rs -> occupied = (int*) malloc(c->board_x_size*c->board_y_size * sizeof(int));
- rs -> xpos = (int*) malloc(c->numsquares * sizeof(int));
- rs -> ypos = (int*) malloc(c->numsquares * sizeof(int));
- rs -> direction = (int*) malloc(c->numsquares * sizeof(int));
- rs -> angle = (float*) malloc(c->numsquares * sizeof(float));
- rs -> color = (float*) malloc(c->numsquares*3 * sizeof(float));
- rs -> tex = (float*) malloc(c->numsquares*4 * sizeof(float));
-}
-
-/* Free reserved memory for the randsheet */
-static void
-randsheet_free (randsheet *rs)
-{
- free(rs->occupied);
- free(rs->xpos);
- free(rs->ypos);
- free(rs->direction);
- free(rs->angle);
- free(rs->color);
- free(rs->tex);
-}
-
-static void
-randsheet_initialize(ModeInfo *mi, randsheet *rs)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- int i, j, index;
- index = 0;
- /* put the moving sheets on the board */
- for (i = 0; i < c->board_x_size; i++)
- {
- for (j = 0; j < c->board_y_size; j++)
- {
- /* initially fill up a corner with the moving squares */
- if (index < c->numsquares)
- {
- rs->occupied[ i * c->board_y_size + j ] = index;
- rs->xpos[ index ] = i;
- rs->ypos[ index ] = j;
- /* have the square colors start out as a pattern */
- rs->color[ index*3 + 0 ] = ((i+j)%3 == 0)||((i+j+1)%3 == 0);
- rs->color[ index*3 + 1 ] = ((i+j+1)%3 == 0);
- rs->color[ index*3 + 2 ] = ((i+j+2)%3 == 0);
- index++;
- }
- /* leave everything else empty*/
- else
- {
- rs->occupied[ i * c->board_y_size + j ] = -1;
- }
- }
- }
- /* initially everything is at rest */
- for (i=0; i<c->numsquares; i++)
- {
- rs->direction[ i ] = 0;
- rs->angle[ i ] = 0;
- }
-}
-
-/* Pick and random square and direction and try to move it. */
-/* May not actually move anything, just attempt a random move. */
-/* Returns true if move was sucessful. */
-/* This could probably be implemented faster in a dequeue */
-/* to avoid trying to move a square which is already moving */
-/* but speed is most likely bottlenecked by rendering anyway... */
-static int
-randsheet_new_move(ModeInfo *mi, randsheet* rs)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- int i, j;
- int num, dir;
- /* pick a random square */
- num = random() % c->numsquares;
- i = rs->xpos[ num ];
- j = rs->ypos[ num ];
- /* pick a random direction */
- dir = (random()% 4) + 1;
-
- if (rs->direction[ num ] == 0)
- {
- switch (dir)
- {
- case 1:
- /* move up in x */
- if ((i + 1) < c->board_x_size)
- {
- if (rs->occupied[ (i + 1) * c->board_y_size + j ] == -1)
- {
- rs->direction[ num ] = dir;
- rs->occupied[ (i + 1) * c->board_y_size + j ] = num;
- rs->occupied[ i * c->board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- case 2:
- /* move up in y */
- if ((j + 1) < c->board_y_size)
- {
- if (rs->occupied[ i * c->board_y_size + (j + 1) ] == -1)
- {
- rs->direction[ num ] = dir;
- rs->occupied[ i * c->board_y_size + (j + 1) ] = num;
- rs->occupied[ i * c->board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- case 3:
- /* move down in x */
- if ((i - 1) >= 0)
- {
- if (rs->occupied[ (i - 1) * c->board_y_size + j ] == -1)
- {
- rs->direction[ num ] = dir;
- rs->occupied[ (i - 1) * c->board_y_size + j ] = num;
- rs->occupied[ i * c->board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- case 4:
- /* move down in y */
- if ((j - 1) >= 0)
- {
- if (rs->occupied[ i * c->board_y_size + (j - 1) ] == -1)
- {
- rs->direction[ num ] = dir;
- rs->occupied[ i * c->board_y_size + (j - 1) ] = num;
- rs->occupied[ i * c->board_y_size + j ] = -1;
- return 1;
- }
- }
- return 0;
- break;
- default:
- break;
- }
- }
- return 0;
-}
-
-/* move a single frame. */
-/* Pass in the angle in rads the square rotates in a frame. */
-static void
-randsheet_move(ModeInfo *mi, randsheet *rs, float rot)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
- int index;
- float tmp;
- for (index = 0 ; index < c->numsquares; index++)
- {
- switch (rs->direction[ index ])
- {
- case 0:
- /* not moving */
- break;
- case 1:
- /* move up in x */
- if (c->textured && rs->angle[ index ] == 0)
- {
- tmp = rs->tex[ index * 4 + 0 ];
- rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
- rs->tex[ index * 4 + 2 ] = tmp;
- }
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if (rs->angle[ index ] >= M_PI)
- {
- rs->xpos[ index ] += 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- }
- break;
- case 2:
- /* move up in y */
- if (c->textured && rs->angle[ index ] == 0)
- {
- tmp = rs->tex[ index * 4 + 1 ];
- rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
- rs->tex[ index * 4 + 3 ] = tmp;
- }
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if (rs->angle[ index ] >= M_PI)
- {
- rs->ypos[ index ] += 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- }
- break;
- case 3:
- /* down in x */
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if (rs->angle[ index ] >= M_PI)
- {
- rs->xpos[ index ] -= 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- if (c->textured)
- {
- tmp = rs->tex[ index * 4 + 0 ];
- rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
- rs->tex[ index * 4 + 2 ] = tmp;
- }
- }
- break;
- case 4:
- /* down in y */
- rs->angle[ index ] += rot;
- /* check to see if we have finished moving */
- if (rs->angle[ index ] >= M_PI)
- {
- rs->ypos[ index ] -= 1;
- rs->direction[ index ] = 0;
- rs->angle[ index ] = 0;
- if (c->textured)
- {
- tmp = rs->tex[ index * 4 + 1 ];
- rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
- rs->tex[ index * 4 + 3 ] = tmp;
- }
- }
- break;
- default:
- break;
- }
- }
-}
-
-
-/* draw all the moving squares */
-static int
-randsheet_draw(ModeInfo *mi, randsheet *rs)
-{
- Flipflopcreen *c = &qs[MI_SCREEN(mi)];
-
- int i, j, polys = 0;
- int index;
-
- /* for all moving squares ... */
- for (index = 0; index < c->numsquares; index++)
- {
- /* set color */
- glColor3f (rs->color[ index*3 + 0 ],
- rs->color[ index*3 + 1 ],
- rs->color[ index*3 + 2 ]);
- /* find x and y position */
- i = rs->xpos[ index ];
- j = rs->ypos[ index ];
- glPushMatrix();
- switch (rs->direction[ index ])
- {
- case 0:
-
- /* not moving */
- /* front */
- glTranslatef (i, 0, j);
- break;
- case 1:
- glTranslatef (i+1, 0, j);
- glRotatef (180 - rs->angle[ index ]*180/M_PI, 0, 0, 1);
-
- break;
- case 2:
- glTranslatef (i, 0, j+1);
- glRotatef (180 - rs->angle[ index ]*180/M_PI, -1, 0, 0);
-
- break;
- case 3:
- glTranslatef (i, 0, j);
- glRotatef (rs->angle[ index ]*180/M_PI, 0, 0, 1);
- break;
- case 4:
- glTranslatef (i, 0, j);
- glRotatef (rs->angle[ index ]*180/M_PI, -1, 0, 0);
- break;
- default:
- break;
- }
- polys += draw_sheet(mi, rs->tex + index*4);
- glPopMatrix();
-
- }
- return polys;
-}
-
-/**** END RANDSHEET_BAK FUNCTIONS ***/
-
-XSCREENSAVER_MODULE ("FlipFlop", flipflop)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/flipflop.man b/hacks/glx/flipflop.man
deleted file mode 100644
index ab84249..0000000
--- a/hacks/glx/flipflop.man
+++ /dev/null
@@ -1,95 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-flipflop \- draws a grid of 3D squares that change positions
-.SH SYNOPSIS
-.B flipflop
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-count \fInumber\fP | \-free \fInumber\fP]
-[\-size \fInumber\fP]
-[\-size-x \fInumber\fP]
-[\-size-y \fInumber\fP]
-[\-spin \fInumber\fP]
-[\-mode sticks | tiles]
-[\-delay \fInumber\fP]
-[\-wireframe]
-[\-fps]
-[\-texture]
-.SH DESCRIPTION
-Flipflop draws a grid of 3D colored tiles that change positions with
-each other.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-Number of tiles on the board. A value of "0" means "default". The
-default number of tiles depends on the size of the board and the mode:
-95% of total tiles for "tiles" mode and 80% of total sticks for
-"sticks" mode (e.g. 76 tiles or 64 sticks for a 9x9 board).
-.TP 8
-.B \-free \fInumber\fP
-Number of tiles missing from the board. See -count.
-.TP 8
-.B \-size \fInumber\fP
-Number of tiles on each side of the board. Takes precedence over
--size-x and -size-y. Default: 9.
-.TP 8
-.B \-size-x \fInumber\fP
-Width (in tiles) of the board. Default: 9.
-.TP 8
-.B \-size-y \fInumber\fP
-Length (in tiles) of the board. Default: 9.
-.TP 8
-.B \-spin \fInumber\fP
-Angular velocity for the rotation of the board.
-.TP 8
-.B \-mode sticks
-Draw hopping sticks instead of flipping tiles.
-.TP 8
-.B \-mode tiles
-Draw flipping tiles. This is the default.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-fps | \-no\-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-wireframe
-Only draw outlines.
-.TP 8
-.B \-texture | \-no\-texture
-Whether to texture the tiles with a screen grab or an image.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Kevin Ogden. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Kevin Ogden <kogden1@hotmail.com>. Some additional code by Sergio
-Gutierrez <sergut@gmail.com>.
diff --git a/hacks/glx/flipscreen3d.c b/hacks/glx/flipscreen3d.c
deleted file mode 100644
index 4de26de..0000000
--- a/hacks/glx/flipscreen3d.c
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * flipscreen3d - takes snapshots of the screen and flips it around
- *
- * version 1.0 - Oct 24, 2001
- *
- * Copyright (C) 2001 Ben Buxton (bb@cactii.net)
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*useSHM: True \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_screenflip 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-# include "gltrackball.h"
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-
-#ifdef USE_GL
-
-/* Should be in <GL/glext.h> */
-# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
-# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
-# endif
-# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
-# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-# endif
-
-#define DEF_ROTATE "True"
-static int rotate;
-
-#define QW 12
-#define QH 12
-
-static XrmOptionDescRec opts[] = {
- {"+rotate", ".screenflip.rotate", XrmoptionNoArg, "false" },
- {"-rotate", ".screenflip.rotate", XrmoptionNoArg, "true" },
-};
-
-
-static argtype vars[] = {
- {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
-};
-
-
-
-ENTRYPOINT ModeSpecOpt screenflip_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-#ifdef USE_MODULES
-ModStruct screenflip_description =
-{"screenflip", "init_screenflip", "draw_screenflip", NULL,
- "draw_screenflip", "init_screenflip", NULL, &screenflip_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Screenflips", 0, NULL};
-
-#endif
-
-
-typedef struct {
- GLXContext *glx_context;
- Window window;
-
- int winw, winh;
- int tw, th; /* texture width, height */
- GLfloat min_tx, min_ty;
- GLfloat max_tx, max_ty;
- GLfloat qx, qy, qw, qh; /* the quad we'll draw */
-
- int regrab;
- int fadetime; /* fade before regrab */
-
- trackball_state *trackball;
- Bool button_down_p;
-
- GLfloat show_colors[4];
- GLfloat stretch_val_x, stretch_val_y;
- GLfloat stretch_val_dx, stretch_val_dy;
-
- GLfloat curx, cury, curz;
-
- GLfloat rx, ry, rz;
- GLfloat rot, drot, odrot, ddrot, orot;
- float theta, rho, dtheta, drho, gamma, dgamma;
-
- GLuint texid;
- Bool mipmap_p;
- Bool waiting_for_image_p;
- Bool first_image_p;
-
- GLfloat anisotropic;
-
-} Screenflip;
-
-static Screenflip *screenflip = NULL;
-
-#include "grab-ximage.h"
-
-static const GLfloat viewer[] = {0.0, 0.0, 15.0};
-
-
-static void getSnapshot (ModeInfo *);
-
-
-ENTRYPOINT Bool
-screenflip_handle_event (ModeInfo *mi, XEvent *event)
-{
- Screenflip *c = &screenflip[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, c->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &c->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- if (!c->waiting_for_image_p)
- {
- getSnapshot (mi);
- return True;
- }
- }
-
- return False;
-}
-
-
-/* draw the texture mapped quad (actually two back to back)*/
-static void showscreen(Screenflip *c, int frozen, int wire)
-{
- GLfloat x, y, w, h;
-
- if (c->fadetime) {
-/* r -= 0.02; g -= 0.02; b -= 0.02; */
- c->show_colors[3] -= 0.02;
- if (c->show_colors[3] < 0) {
- c->regrab = 1;
- c->fadetime = 0;
- }
- } else if (c->show_colors[3] < 0) {
- c->show_colors[0] = c->show_colors[1] =
- c->show_colors[2] = c->show_colors[3] = 1;
- c->stretch_val_x = c->stretch_val_y =
- c->stretch_val_dx = c->stretch_val_dy = 0;
- }
- if (c->stretch_val_dx == 0 && !frozen && !(random() % 25))
- c->stretch_val_dx = (float)(random() % 100) / 5000;
- if (c->stretch_val_dy == 0 && !frozen && !(random() % 25))
- c->stretch_val_dy = (float)(random() % 100) / 5000;
-
- x = c->qx;
- y = c->qy;
- w = c->qx+c->qw;
- h = c->qy-c->qh;
-
- if (!frozen) {
- w *= sin (c->stretch_val_x) + 1;
- x *= sin (c->stretch_val_x) + 1;
- if (!c->button_down_p) {
- if (!c->fadetime) c->stretch_val_x += c->stretch_val_dx;
- if (c->stretch_val_x > 2*M_PI && !(random() % 5))
- c->stretch_val_dx = (float)(random() % 100) / 5000;
- else
- c->stretch_val_x -= 2*M_PI;
- }
-
- if (!c->button_down_p && !c->fadetime) c->stretch_val_y += c->stretch_val_dy;
- h *= sin (c->stretch_val_y) / 2 + 1;
- y *= sin (c->stretch_val_y) / 2 + 1;
- if (!c->button_down_p) {
- if (c->stretch_val_y > 2*M_PI && !(random() % 5))
- c->stretch_val_dy = (float)(random() % 100) / 5000;
- else
- c->stretch_val_y -= 2*M_PI;
- }
- }
-
- glColor4f(c->show_colors[0], c->show_colors[1],
- c->show_colors[2], c->show_colors[3]);
-
- if (!wire)
- {
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDepthMask(GL_FALSE);
- }
-
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
-
- glNormal3f(0, 0, 1);
- glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, 0);
- glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, 0);
- glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, 0);
- glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, 0);
-
- glNormal3f(0, 0, -1);
- glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, -0.05);
- glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, -0.05);
- glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, -0.05);
- glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, -0.05);
- glEnd();
-
-
- glDisable(GL_TEXTURE_2D);
- glDepthMask(GL_TRUE);
-
- glBegin(GL_LINE_LOOP);
- glVertex3f(x, y, 0);
- glVertex3f(x, h, 0);
- glVertex3f(w, h, 0);
- glVertex3f(w, y, 0);
- glEnd();
- glDisable(GL_BLEND);
-
-}
-
-/* This function is responsible for 'zooming back' the square after
- * a new chunk has been grabbed with getSnapshot(), and positioning
- * it suitably on the screen. Once positioned (where we begin to rotate),
- * it just does a glTranslatef() and returns 1
- */
-
-static int inposition(Screenflip *c)
-{
- GLfloat wx;
- GLfloat wy;
- wx = 0 - (c->qw/2);
- wy = (c->qh/2);
-
- if (c->curx == 0) c->curx = c->qx;
- if (c->cury == 0) c->cury = c->qy;
- if (c->regrab) {
- c->curz = 0;
- c->curx = c->qx;
- c->cury = c->qy;
- c->regrab = 0;
- }
- if (c->curz > -10 || c->curx > wx + 0.1 || c->curx < wx - 0.1 ||
- c->cury > wy + 0.1 || c->cury < wy - 0.1) {
- if (c->curz > -10)
- c->curz -= 0.05;
- if (c->curx > wx) {
- c->qx -= 0.02;
- c->curx -= 0.02;
- }
- if (c->curx < wx) {
- c->qx += 0.02;
- c->curx += 0.02;
- }
- if (c->cury > wy) {
- c->qy -= 0.02;
- c->cury -= 0.02;
- }
- if (c->cury < wy) {
- c->qy += 0.02;
- c->cury += 0.02;
- }
- glTranslatef(0, 0, c->curz);
- return 0;
- }
- glTranslatef(0, 0, c->curz);
- return 1;
-
-}
-
-#if 0
-static void drawgrid(void)
-{
- int i;
-
- glColor3f(0, 0.7, 0);
- glBegin(GL_LINES);
- for (i = 0 ; i <= 50; i+=2) {
- glVertex3f( -25, -15, i-70);
- glVertex3f( 25, -15, i-70);
- glVertex3f( i-25, -15, -70);
- glVertex3f( i-25, -15, -20);
- }
- glEnd();
-}
-#endif
-
-
-static void display(Screenflip *c, int wire)
-{
- int frozen;
- GLfloat rot = current_device_rotation();
-
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
- glPushMatrix();
-
-/*
- glRotatef(rot, 0, 0, 1);
- if ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135))
- {
- GLfloat s = c->winw / (GLfloat) c->winh;
- glScalef (s, 1/s, 1);
- }
-*/
-
- if (inposition(c)) {
- frozen = 0;
- glTranslatef(5 * sin(c->theta), 5 * sin(c->rho), 10 * cos(c->gamma) - 10);
-/* randomly change the speed */
- if (!c->button_down_p && !(random() % 300)) {
- if (random() % 2)
- c->drho = 1/60 - (float)(random() % 100)/3000;
- if (random() % 2)
- c->dtheta = 1/60 - (float)(random() % 100)/3000;
- if (random() % 2)
- c->dgamma = 1/60 - (float)(random() % 100)/3000;
- }
- glRotatef(rot, 0, 0, 1);
- gltrackball_rotate (c->trackball);
- glRotatef(-rot, 0, 0, 1);
- if (rotate) glRotatef(c->rot, c->rx, c->ry, c->rz);
-/* update variables with each frame */
- if(!c->button_down_p && !c->fadetime) {
- c->theta += c->dtheta;
- c->rho += c->drho;
- c->gamma += c->dgamma;
- c->rot += c->drot;
- c->drot += c->ddrot;
- }
-/* dont let our rotation speed get too high */
- if (c->drot > 5 && c->ddrot > 0)
- c->ddrot = 0 - (GLfloat)(random() % 100) / 1000;
- else if (c->drot < -5 && c->ddrot < 0)
- c->ddrot = (GLfloat)(random() % 100) / 1000;
- } else { /* reset some paramaters */
- c->ddrot = 0.05 - (GLfloat)(random() % 100) / 1000;
- c->theta = c->rho = c->gamma = 0;
- c->rot = 0;
- frozen = 1;
- }
- if (!c->button_down_p && !c->fadetime && (c->rot >= 360 || c->rot <= -360) && !(random() % 7)) { /* rotate change */
- c->rx = (GLfloat)(random() % 100) / 100;
- c->ry = (GLfloat)(random() % 100) / 100;
- c->rz = (GLfloat)(random() % 100) / 100;
- }
- if (c->odrot * c->drot < 0 && c->tw < c->winw && !(random() % 10)) {
- c->fadetime = 1; /* randomly fade and get new snapshot */
- }
- c->orot = c->rot;
- c->odrot = c->drot;
- if (c->rot > 360 || c->rot < -360) /* dont overflow rotation! */
- c->rot -= c->rot;
- showscreen(c, frozen, wire);
- glPopMatrix();
- glFlush();
-}
-
-ENTRYPOINT void reshape_screenflip(ModeInfo *mi, int width, int height)
-{
- Screenflip *c = &screenflip[MI_SCREEN(mi)];
- glViewport(0,0,(GLint)width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45, 1, 2.0, 85);
- glMatrixMode(GL_MODELVIEW);
- c->winw = width;
- c->winh = height;
-}
-
-static void
-image_loaded_cb (const char *filename, XRectangle *geometry,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- Screenflip *c = (Screenflip *) closure;
-
- c->tw = texture_width;
- c->th = texture_height;
- c->min_tx = (GLfloat) geometry->x / c->tw;
- c->min_ty = (GLfloat) geometry->y / c->th;
- c->max_tx = (GLfloat) (geometry->x + geometry->width) / c->tw;
- c->max_ty = (GLfloat) (geometry->y + geometry->height) / c->th;
-
- c->qx = -QW/2 + ((GLfloat) geometry->x * QW / image_width);
- c->qy = QH/2 - ((GLfloat) geometry->y * QH / image_height);
- c->qw = QW * ((GLfloat) geometry->width / image_width);
- c->qh = QH * ((GLfloat) geometry->height / image_height);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- (c->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
-
- if (c->anisotropic >= 1.0)
- glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
- c->anisotropic);
-
- c->waiting_for_image_p = False;
- c->first_image_p = False;
-}
-
-
-static void getSnapshot (ModeInfo *modeinfo)
-{
- Screenflip *c = &screenflip[MI_SCREEN(modeinfo)];
-
- if (MI_IS_WIREFRAME(modeinfo))
- return;
-
- c->waiting_for_image_p = True;
- c->mipmap_p = True;
- load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
- *c->glx_context, 0, 0, c->mipmap_p, c->texid,
- image_loaded_cb, c);
-}
-
-ENTRYPOINT void init_screenflip(ModeInfo *mi)
-{
- int screen = MI_SCREEN(mi);
- Screenflip *c;
-
- MI_INIT(mi, screenflip);
- c = &screenflip[screen];
- c->window = MI_WINDOW(mi);
-
- c->trackball = gltrackball_init (False);
-
- if ((c->glx_context = init_GL(mi)) != NULL) {
- reshape_screenflip(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
- c->winh = MI_WIN_HEIGHT(mi);
- c->winw = MI_WIN_WIDTH(mi);
- c->qw = QW;
- c->qh = QH;
- c->qx = -6;
- c->qy = 6;
-
- c->rx = c->ry = 1;
- c->odrot = 1;
-
- c->show_colors[0] = c->show_colors[1] =
- c->show_colors[2] = c->show_colors[3] = 1;
-
- if (! MI_IS_WIREFRAME(mi))
- {
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glDisable(GL_LIGHTING);
- }
-
- if (strstr ((char *) glGetString(GL_EXTENSIONS),
- "GL_EXT_texture_filter_anisotropic"))
- glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
- else
- c->anisotropic = 0.0;
-
- glGenTextures(1, &c->texid);
-
- c->first_image_p = True;
- getSnapshot(mi);
-}
-
-ENTRYPOINT void draw_screenflip(ModeInfo *mi)
-{
- Screenflip *c = &screenflip[MI_SCREEN(mi)];
- Window w = MI_WINDOW(mi);
- Display *disp = MI_DISPLAY(mi);
-
- if (!c->glx_context)
- return;
-
- /* Wait for the first image; for subsequent images, load them in the
- background while animating. */
- if (c->waiting_for_image_p && c->first_image_p)
- return;
-
- glXMakeCurrent(disp, w, *c->glx_context);
-
- glBindTexture(GL_TEXTURE_2D, c->texid);
-
- if (c->regrab)
- getSnapshot(mi);
-
- display(c, MI_IS_WIREFRAME(mi));
-
- if(mi->fps_p) do_fps(mi);
- glFinish();
- glXSwapBuffers(disp, w);
-}
-
-
-ENTRYPOINT void free_screenflip(ModeInfo *mi)
-{
- Screenflip *c = &screenflip[MI_SCREEN(mi)];
- if (!c->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *c->glx_context);
- gltrackball_free (c->trackball);
- if (c->texid) glDeleteTextures (1, &c->texid);
-}
-
-XSCREENSAVER_MODULE_2 ("FlipScreen3D", flipscreen3d, screenflip)
-
-#endif
diff --git a/hacks/glx/flipscreen3d.man b/hacks/glx/flipscreen3d.man
deleted file mode 100644
index 3edaf0b..0000000
--- a/hacks/glx/flipscreen3d.man
+++ /dev/null
@@ -1,61 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-flipscreen3d \- rotates an image of the screen through 3 dimensions.
-.SH SYNOPSIS
-.B flipscreen3d
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-no-rotate]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Grabs an image of the desktop, turns it into a GL texture map, and spins it
-around and deforms it in various ways.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-rotate | \-no-rotate
-Whether to rotate.
-.TP 8
-.B \-wireframe
-Just render boxes instead of textures (for debugging).
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Ben Buxton.
diff --git a/hacks/glx/fliptext.c b/hacks/glx/fliptext.c
deleted file mode 100644
index 84f43da..0000000
--- a/hacks/glx/fliptext.c
+++ /dev/null
@@ -1,1003 +0,0 @@
-/*
- * fliptext, Copyright (c) 2005-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEF_FONT "sans-serif bold 72"
-#define DEF_COLOR "#00CCFF"
-
-#define DEFAULTS "*delay: 10000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*usePty: False \n" \
- "*texFontCacheSize: 60 \n" \
- "*font: " DEF_FONT "\n" \
- ".foreground: " DEF_COLOR "\n" \
- "*program: xscreensaver-text --cols 0" /* don't wrap */
-
-# define release_fliptext 0
-# define fliptext_handle_event xlockmore_no_events
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-#include "xlockmore.h"
-#include "texfont.h"
-#include "textclient.h"
-
-#ifdef USE_GL /* whole file */
-
-/* Should be in <GL/glext.h> */
-# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
-# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
-# endif
-# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
-# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-# endif
-
-
-#define DEF_LINES "8"
-#define DEF_FONT_SIZE "20"
-#define DEF_COLUMNS "80"
-#define DEF_ALIGNMENT "random"
-#define DEF_SPEED "1.0"
-#define TAB_WIDTH 8
-
-#define FONT_WEIGHT 14
-#define KEEP_ASPECT
-
-typedef enum { NEW, HESITATE, IN, LINGER, OUT, DEAD } line_state;
-typedef enum { SCROLL_BOTTOM, SCROLL_TOP, SPIN } line_anim_type;
-
-typedef struct { GLfloat x, y, z; } XYZ;
-
-typedef struct {
- char *text;
- GLfloat width, height; /* size */
- XYZ from, to, current; /* start, end, and current position */
- GLfloat fth, tth, cth; /* rotation around Z */
-
- int cluster_size; /* how many lines in this cluster */
- int cluster_pos; /* position of this line in the cluster */
-
- line_state state; /* current motion model */
- int step, steps; /* progress along this path */
- GLfloat color[4];
-
-} line;
-
-
-typedef struct {
- Display *dpy;
- GLXContext *glx_context;
-
- texture_font_data *texfont;
- text_data *tc;
-
- int alignment;
-
- char *buf;
- int buf_size;
- int buf_tail;
-
- int char_width; /* in font units */
- int line_height; /* in font units */
- double font_scale; /* convert font units to display units */
-
- int font_wrap_pixels; /* in font units (for wrapping text) */
-
- int top_margin, bottom_margin;
- int left_margin, right_margin;
-
- int nlines;
- int lines_size;
- line **lines;
-
- line_anim_type anim_type;
- XYZ in, mid, out;
- XYZ rotation;
- GLfloat color[4];
-
-} fliptext_configuration;
-
-
-static fliptext_configuration *scs = NULL;
-
-static int max_lines, min_lines;
-static float font_size;
-static int target_columns;
-static char *alignment_str;
-static int alignment_random_p;
-static GLfloat speed;
-
-static XrmOptionDescRec opts[] = {
- {"-lines", ".lines", XrmoptionSepArg, 0 },
- {"-size", ".fontSize", XrmoptionSepArg, 0 },
- {"-columns", ".columns", XrmoptionSepArg, 0 },
- {"-speed", ".speed", XrmoptionSepArg, 0 },
-/*{"-font", ".font", XrmoptionSepArg, 0 },*/
- {"-alignment", ".alignment", XrmoptionSepArg, 0 },
- {"-left", ".alignment", XrmoptionNoArg, "Left" },
- {"-right", ".alignment", XrmoptionNoArg, "Right" },
- {"-center", ".alignment", XrmoptionNoArg, "Center" },
-};
-
-static argtype vars[] = {
- {&max_lines, "lines", "Integer", DEF_LINES, t_Int},
- {&font_size, "fontSize", "Float", DEF_FONT_SIZE, t_Float},
- {&target_columns, "columns", "Integer", DEF_COLUMNS, t_Int},
- {&alignment_str, "alignment", "Alignment", DEF_ALIGNMENT, t_String},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt fliptext_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-
-/* Tabs are bad, mmmkay? */
-
-static char *
-untabify (const char *string)
-{
- const char *ostring = string;
- char *result = (char *) malloc ((strlen(string) * 8) + 1);
- char *out = result;
- int col = 0;
- while (*string)
- {
- if (*string == '\t')
- {
- do {
- col++;
- *out++ = ' ';
- } while (col % TAB_WIDTH);
- string++;
- }
- else if (*string == '\r' || *string == '\n')
- {
- *out++ = *string++;
- col = 0;
- }
- else if (*string == '\010') /* backspace */
- {
- if (string > ostring)
- out--, string++;
- }
- else
- {
- *out++ = *string++;
- col++;
- }
- }
- *out = 0;
-
- return result;
-}
-
-static void
-strip (char *s, Bool leading, Bool trailing)
-{
- int L = strlen(s);
- if (trailing)
- while (L > 0 && (s[L-1] == ' ' || s[L-1] == '\t'))
- s[L--] = 0;
- if (leading)
- {
- char *s2 = s;
- while (*s2 == ' ' || *s2 == '\t')
- s2++;
- if (s == s2)
- return;
- while (*s2)
- *s++ = *s2++;
- *s = 0;
- }
-}
-
-
-static int
-char_width (fliptext_configuration *sc, char c)
-{
- XCharStruct e;
- char s[2];
- s[0] = c;
- s[1] = 0;
- texture_string_metrics (sc->texfont, s, &e, 0, 0);
- return e.width;
-}
-
-
-/* Returns a single line of text from the output buffer of the subprocess,
- taking into account wrapping, centering, etc. Returns 0 if no complete
- line is currently available.
- */
-static char *
-get_one_line (fliptext_configuration *sc)
-{
- char *result = 0;
- int wrap_pix = sc->font_wrap_pixels;
- int col = 0;
- int col_pix = 0;
- char *s = sc->buf;
- int target = sc->buf_size - sc->buf_tail - 2;
-
- /* Fill as much as we can into sc->buf, but stop at newline.
- */
- while (target > 0)
- {
- int c = textclient_getc (sc->tc);
- if (c <= 0)
- break;
- sc->buf[sc->buf_tail++] = (char) c;
- sc->buf[sc->buf_tail] = 0;
- target--;
- if (c == '\r' || c == '\n')
- break;
- }
-
- while (!result)
- {
- int cw;
-
- if (s >= sc->buf + sc->buf_tail)
- /* Reached end of buffer before end of line. Bail. */
- return 0;
-
- cw = char_width (sc, *s);
-
- if (*s == '\r' || *s == '\n' ||
- col_pix + cw >= wrap_pix)
- {
- int L = s - sc->buf;
-
- if (*s == '\r' || *s == '\n')
- {
- if (*s == '\r' && s[1] == '\n') /* swallow CRLF too */
- *s++ = 0;
-
- *s++ = 0;
- }
- else
- {
- /* We wrapped -- try to back up to the previous word boundary. */
- char *s2 = s;
- int n = 0;
- while (s2 > sc->buf && *s2 != ' ' && *s2 != '\t')
- s2--, n++;
- if (s2 > sc->buf)
- {
- s = s2;
- *s++ = 0;
- L = s - sc->buf;
- }
- }
-
- if (result) abort();
- result = (char *) malloc (L+1);
- memcpy (result, sc->buf, L);
- result[L] = 0;
-
- {
- char *t = result;
- char *ut = untabify (t);
- strip (ut, (sc->alignment == 0), 1); /* if centering, strip
- leading whitespace too */
- result = ut;
- free (t);
- }
-
- if (sc->buf_tail > (s - sc->buf))
- {
- int i = sc->buf_tail - (s - sc->buf);
- memmove (sc->buf, s, i);
- sc->buf_tail = i;
- sc->buf[sc->buf_tail] = 0;
- }
- else
- {
- sc->buf_tail = 0;
- }
-
- sc->buf[sc->buf_tail] = 0;
- s = sc->buf;
- col = 0;
- col_pix = 0;
- }
- else
- {
- col++;
- col_pix += cw;
- if (*s == '\t')
- {
- int tab_pix = TAB_WIDTH * sc->char_width;
- col = TAB_WIDTH * ((col / TAB_WIDTH) + 1);
- col_pix = tab_pix * ((col / tab_pix) + 1);
- }
- s++;
- }
- }
-
- return result;
-}
-
-
-static Bool
-blank_p (const char *s)
-{
- for (; *s; s++)
- if (*s != ' ' && *s != '\t' && *s != '\r' && *s != '\n')
- return False;
- return True;
-}
-
-/* Reads some text from the subprocess, and creates and returns a `line'
- object. Adds that object to the lines list. Returns 0 if no text
- available yet.
-
- If skip_blanks_p, then keep trying for new lines of text until we
- get one that is not empty.
- */
-static line *
-make_line (fliptext_configuration *sc, Bool skip_blanks_p)
-{
- XCharStruct e;
- line *ln;
- char *s;
-
- AGAIN:
- s = get_one_line (sc);
- if (s && skip_blanks_p && blank_p (s))
- {
- free (s);
- goto AGAIN;
- }
-
- if (!s) return 0;
-
- ln = (line *) calloc (1, sizeof(*ln));
- ln->text = s;
- ln->state = NEW;
- texture_string_metrics (sc->texfont, s, &e, 0, 0);
- ln->width = sc->font_scale * e.width;
- ln->height = sc->font_scale * sc->line_height;
-
- memcpy (ln->color, sc->color, sizeof(ln->color));
-
- sc->nlines++;
- if (sc->lines_size <= sc->nlines)
- {
- sc->lines_size = (sc->lines_size * 1.2) + sc->nlines;
- sc->lines = (line **)
- realloc (sc->lines, sc->lines_size * sizeof(*sc->lines));
- if (! sc->lines)
- {
- fprintf (stderr, "%s: out of memory (%d lines)\n",
- progname, sc->lines_size);
- exit (1);
- }
- }
-
- sc->lines[sc->nlines-1] = ln;
- return ln;
-}
-
-
-/* frees the object and removes it from the list.
- */
-static void
-free_line (fliptext_configuration *sc, line *line)
-{
- int i;
- for (i = 0; i < sc->nlines; i++)
- if (sc->lines[i] == line)
- break;
- if (i == sc->nlines) abort();
- for (; i < sc->nlines-1; i++)
- sc->lines[i] = sc->lines[i+1];
- sc->lines[i] = 0;
- sc->nlines--;
-
- free (line->text);
- free (line);
-}
-
-
-static void
-draw_line (ModeInfo *mi, line *line)
-{
- int wire = MI_IS_WIREFRAME(mi);
- fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
-
- if (! line->text || !*line->text ||
- line->state == NEW || line->state == HESITATE || line->state == DEAD)
- return;
-
- glPushMatrix();
- glTranslatef (line->current.x, line->current.y, line->current.z);
-
- glRotatef (line->cth, 0, 1, 0);
-
- if (sc->alignment == 1)
- glTranslatef (-line->width, 0, 0);
- else if (sc->alignment == 0)
- glTranslatef (-line->width/2, 0, 0);
-
- glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
-
- glColor4f (line->color[0], line->color[1], line->color[2], line->color[3]);
-
- if (!wire)
- print_texture_string (sc->texfont, line->text);
- else
- {
- int w, h;
- char *s = line->text;
- char c[2];
- c[1]=0;
- glDisable (GL_TEXTURE_2D);
- glColor3f (0.4, 0.4, 0.4);
- while (*s)
- {
- XCharStruct e;
- *c = *s++;
- texture_string_metrics (sc->texfont, c, &e, 0, 0);
- w = e.width;
- h = e.ascent + e.descent;
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (w, 0, 0);
- glVertex3f (w, h, 0);
- glVertex3f (0, h, 0);
- glEnd();
- glTranslatef (w, 0, 0);
- }
- }
-
-#if 0
- glDisable (GL_TEXTURE_2D);
- glColor3f (0.4, 0.4, 0.4);
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (line->width/sc->font_scale, 0, 0);
- glVertex3f (line->width/sc->font_scale, line->height/sc->font_scale, 0);
- glVertex3f (0, line->height/sc->font_scale, 0);
- glEnd();
- if (!wire) glEnable (GL_TEXTURE_2D);
-#endif
-
- glPopMatrix();
-
- mi->polygon_count += strlen (line->text);
-}
-
-static void
-tick_line (fliptext_configuration *sc, line *line)
-{
- int stagger = 30; /* frames of delay between line spin-outs */
- int slide = 600; /* frames in a slide in/out */
- int linger = 0; /* frames to pause with no motion */
- double i, ii;
-
- if (line->state >= DEAD) abort();
- if (++line->step >= line->steps)
- {
- line->state++;
- line->step = 0;
-
- if (linger == 0 && line->state == LINGER)
- line->state++;
-
- if (sc->anim_type != SPIN)
- stagger *= 2;
-
- switch (line->state)
- {
- case HESITATE: /* entering state HESITATE */
- switch (sc->anim_type)
- {
- case SPIN:
- line->steps = (line->cluster_pos * stagger);
- break;
- case SCROLL_TOP:
- line->steps = stagger * (line->cluster_size - line->cluster_pos);
- break;
- case SCROLL_BOTTOM:
- line->steps = stagger * line->cluster_pos;
- break;
- default:
- abort();
- }
- break;
-
- case IN:
- line->color[3] = 0;
- switch (sc->anim_type)
- {
- case SCROLL_BOTTOM: /* entering state BOTTOM IN */
- line->from = sc->in;
- line->to = sc->mid;
- line->from.y = (sc->bottom_margin -
- (line->height *
- (line->cluster_pos + 1)));
- line->to.y += (line->height *
- ((line->cluster_size/2.0) - line->cluster_pos));
- line->steps = slide;
- break;
-
- case SCROLL_TOP: /* entering state TOP IN */
- line->from = sc->in;
- line->to = sc->mid;
- line->from.y = (sc->top_margin +
- (line->height *
- (line->cluster_size - line->cluster_pos)));
- line->to.y += (line->height *
- ((line->cluster_size/2.0) - line->cluster_pos));
- line->steps = slide;
- break;
-
- case SPIN: /* entering state SPIN IN */
- line->from = sc->in;
- line->to = sc->mid;
- line->to.y += (line->height *
- ((line->cluster_size/2.0) - line->cluster_pos));
- line->from.y += (line->height *
- ((line->cluster_size/2.0) - line->cluster_pos));
-
- line->fth = 270;
- line->tth = 0;
- line->steps = slide;
- break;
-
- default:
- abort();
- }
- break;
-
- case OUT:
- switch (sc->anim_type)
- {
- case SCROLL_BOTTOM: /* entering state BOTTOM OUT */
- line->from = line->to;
- line->to = sc->out;
- line->to.y = (sc->top_margin +
- (line->height *
- (line->cluster_size - line->cluster_pos)));
- line->steps = slide;
- break;
-
- case SCROLL_TOP: /* entering state TOP OUT */
- line->from = line->to;
- line->to = sc->out;
- line->to.y = (sc->bottom_margin -
- (line->height *
- (line->cluster_pos + 1)));
- line->steps = slide;
- break;
-
- case SPIN: /* entering state SPIN OUT */
- line->from = line->to;
- line->to = sc->out;
- line->to.y += (line->height *
- ((line->cluster_size/2.0) - line->cluster_pos));
-
- line->fth = line->tth;
- line->tth = -270;
- line->steps = slide;
- break;
-
- default:
- abort();
- }
- break;
-
- case LINGER:
- line->from = line->to;
- line->steps = linger;
- break;
-
- default:
- break;
- }
-
- line->steps /= speed;
- }
-
- switch (line->state)
- {
- case IN:
- case OUT:
- i = (double) line->step / line->steps;
-
- /* Move along the path exponentially, slow side towards the middle. */
- if (line->state == OUT)
- ii = i * i;
- else
- ii = 1 - ((1-i) * (1-i));
-
- line->current.x = line->from.x + (ii * (line->to.x - line->from.x));
- line->current.y = line->from.y + (ii * (line->to.y - line->from.y));
- line->current.z = line->from.z + (ii * (line->to.z - line->from.z));
- line->cth = line->fth + (ii * (line->tth - line->fth));
-
- if (line->state == OUT) ii = 1-ii;
- line->color[3] = sc->color[3] * ii;
- break;
-
- case HESITATE:
- case LINGER:
- case DEAD:
- break;
- default:
- abort();
- }
-}
-
-
-/* Start a new cluster of lines going.
- Pick their anim type, and in, mid, and out positions.
- */
-static void
-reset_lines (ModeInfo *mi)
-{
- fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
- int i;
- line *prev = 0;
- GLfloat minx, maxx, miny, maxy, minz, maxz, maxw, maxh;
-
- sc->rotation.x = 5 - BELLRAND(10);
- sc->rotation.y = 5 - BELLRAND(10);
- sc->rotation.z = 5 - BELLRAND(10);
-
- switch (random() % 8)
- {
- case 0: sc->anim_type = SCROLL_TOP; break;
- case 1: sc->anim_type = SCROLL_BOTTOM; break;
- default: sc->anim_type = SPIN; break;
- }
-
- minx = sc->left_margin * 0.9;
- maxx = sc->right_margin * 0.9;
-
- miny = sc->bottom_margin * 0.9;
- maxy = sc->top_margin * 0.9;
-
- minz = sc->left_margin * 5;
- maxz = sc->right_margin * 2;
-
- maxw = sc->font_wrap_pixels * sc->font_scale;
- maxh = max_lines * sc->line_height * sc->font_scale;
-
- if (maxw > maxx - minx)
- maxw = maxx - minx;
- if (maxh > maxy - miny)
- maxh = maxy - miny;
-
- if (alignment_random_p)
- sc->alignment = (random() % 3) - 1;
-
- if (sc->alignment == -1) maxx -= maxw;
- else if (sc->alignment == 1) minx += maxw;
- else minx += maxw/2, maxx -= maxw/2;
-
- miny += maxh/2;
- maxy -= maxh/2;
-
- sc->mid.x = minx + frand (maxx - minx);
- if (sc->anim_type == SPIN)
- sc->mid.y = miny + BELLRAND (maxy - miny);
- else
- sc->mid.y = miny + frand (maxy - miny);
-
- sc->in.x = BELLRAND(sc->right_margin * 2) - sc->right_margin;
- sc->out.x = BELLRAND(sc->right_margin * 2) - sc->right_margin;
-
- sc->in.y = miny + frand(maxy - miny);
- sc->out.y = miny + frand(maxy - miny);
-
- sc->in.z = minz + frand(maxz - minz);
- sc->out.z = minz + frand(maxz - minz);
-
- sc->mid.z = 0;
-
- if (sc->anim_type == SPIN && sc->in.z > 0) sc->in.z /= 4;
- if (sc->anim_type == SPIN && sc->out.z > 0) sc->out.z /= 4;
-
- for (i = 0; i < max_lines; i++)
- {
- line *line = make_line (sc, (i == 0));
- if (!line) break; /* no text available */
- if (i >= min_lines &&
- (!line->text || !*line->text)) /* blank after min */
- break;
- }
-
- for (i = 0; i < sc->nlines; i++)
- {
- line *line = sc->lines[i];
- if (!prev)
- {
- line->from.y = sc->bottom_margin;
- line->to.y = 0;
- }
- else
- {
- line->from.y = prev->from.y - prev->height;
- line->to.y = prev->to.y - prev->height;
- }
- line->cluster_pos = i;
- line->cluster_size = sc->nlines;
- prev = line;
- }
-}
-
-
-static void
-parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
-{
- XColor c;
- if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
- {
- fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
- exit (1);
- }
- a[0] = c.red / 65536.0;
- a[1] = c.green / 65536.0;
- a[2] = c.blue / 65536.0;
- a[3] = 1.0;
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_fliptext (ModeInfo *mi, int width, int height)
-{
- fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (60.0, 1/h, 0.01, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 2.6,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-
- sc->right_margin = sc->top_margin / h;
- sc->left_margin = -sc->right_margin;
-}
-
-
-ENTRYPOINT void
-init_fliptext (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- char *s;
-
- fliptext_configuration *sc;
-
- MI_INIT(mi, scs);
-
- sc = &scs[MI_SCREEN(mi)];
- sc->lines = (line **) calloc (max_lines+1, sizeof(*sc->lines));
-
- sc->dpy = MI_DISPLAY(mi);
-
- if ((sc->glx_context = init_GL(mi)) != NULL) {
- reshape_fliptext (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
- }
-
- {
- XCharStruct e;
- int cw, lh, ascent, descent;
- sc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
- check_gl_error ("loading font");
- texture_string_metrics (sc->texfont, "n", &e, &ascent, &descent);
- cw = e.width;
- lh = ascent + descent;
- sc->char_width = cw;
- sc->line_height = lh;
- }
-
- if (!wire)
- {
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
- glEnable (GL_ALPHA_TEST);
- glEnable (GL_TEXTURE_2D);
-
- /* "Anistropic filtering helps for quadrilateral-angled textures.
- A sharper image is accomplished by interpolating and filtering
- multiple samples from one or more mipmaps to better approximate
- very distorted textures. This is the next level of filtering
- after trilinear filtering." */
- if (strstr ((char *) glGetString(GL_EXTENSIONS),
- "GL_EXT_texture_filter_anisotropic"))
- {
- GLfloat anisotropic = 0.0;
- glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropic);
- if (anisotropic >= 1.0)
- glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
- anisotropic);
- }
- }
-
- /* The default font is (by fiat) "18 points".
- Interpret the user's font size request relative to that.
- */
- sc->font_scale = 3 * (font_size / 18.0);
-
- if (target_columns <= 2) target_columns = 2;
-
- /* Figure out what the wrap column should be, in font-coordinate pixels.
- Compute it from the given -columns value, but don't let it be wider
- than the screen.
- */
- {
- GLfloat maxw = 110 * sc->line_height / sc->font_scale; /* magic... */
- sc->font_wrap_pixels = target_columns * sc->char_width;
- if (sc->font_wrap_pixels > maxw ||
- sc->font_wrap_pixels <= 0)
- sc->font_wrap_pixels = maxw;
- }
-
- sc->buf_size = target_columns * max_lines;
- sc->buf = (char *) calloc (1, sc->buf_size);
-
- alignment_random_p = False;
- if (!alignment_str || !*alignment_str ||
- !strcasecmp(alignment_str, "left"))
- sc->alignment = -1;
- else if (!strcasecmp(alignment_str, "center") ||
- !strcasecmp(alignment_str, "middle"))
- sc->alignment = 0;
- else if (!strcasecmp(alignment_str, "right"))
- sc->alignment = 1;
- else if (!strcasecmp(alignment_str, "random"))
- sc->alignment = -1, alignment_random_p = True;
-
- else
- {
- fprintf (stderr,
- "%s: alignment must be left/center/right/random, not \"%s\"\n",
- progname, alignment_str);
- exit (1);
- }
-
- sc->tc = textclient_open (sc->dpy);
-
- if (max_lines < 1) max_lines = 1;
- min_lines = max_lines * 0.66;
- if (min_lines > max_lines - 3) min_lines = max_lines - 4;
- if (min_lines < 1) min_lines = 1;
-
- s = get_string_resource(mi->dpy, "foreground", "Foreground");
- parse_color (mi, "foreground", s, sc->color);
- if (s) free (s);
-
- sc->top_margin = (sc->char_width * 100);
- sc->bottom_margin = -sc->top_margin;
- reshape_fliptext (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); /* compute left/right */
-}
-
-
-ENTRYPOINT void
-draw_fliptext (ModeInfo *mi)
-{
- fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
-/* XtAppContext app = XtDisplayToApplicationContext (sc->dpy);*/
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!sc->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sc->glx_context);
-
-#if 0
- if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
- XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
-#endif
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- mi->polygon_count = 0;
-
- glPushMatrix();
- glRotatef(current_device_rotation(), 0, 0, 1);
- {
- GLfloat s = 3.0 / (sc->top_margin - sc->bottom_margin);
- glScalef(s, s, s);
- }
-
- glRotatef (sc->rotation.x, 1, 0, 0);
- glRotatef (sc->rotation.y, 0, 1, 0);
- glRotatef (sc->rotation.z, 0, 0, 1);
-
-#if 0
- glDisable (GL_TEXTURE_2D);
- glColor3f (1,1,1);
- glBegin (GL_LINE_LOOP);
- glVertex3f (sc->left_margin, sc->top_margin, 0);
- glVertex3f (sc->right_margin, sc->top_margin, 0);
- glVertex3f (sc->right_margin, sc->bottom_margin, 0);
- glVertex3f (sc->left_margin, sc->bottom_margin, 0);
- glEnd();
- glBegin (GL_LINES);
- glVertex3f (sc->in.x, sc->top_margin, sc->in.z);
- glVertex3f (sc->in.x, sc->bottom_margin, sc->in.z);
- glVertex3f (sc->mid.x, sc->top_margin, sc->mid.z);
- glVertex3f (sc->mid.x, sc->bottom_margin, sc->mid.z);
- glVertex3f (sc->out.x, sc->top_margin, sc->out.z);
- glVertex3f (sc->out.x, sc->bottom_margin, sc->out.z);
- glEnd();
- glEnable (GL_TEXTURE_2D);
-#endif
-
- for (i = 0; i < sc->nlines; i++)
- {
- line *line = sc->lines[i];
- draw_line (mi, line);
- tick_line (sc, line);
- }
-
- for (i = sc->nlines-1; i >= 0; i--)
- {
- line *line = sc->lines[i];
- if (line->state == DEAD)
- free_line (sc, line);
- }
-
- if (sc->nlines == 0)
- reset_lines (mi);
-
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-ENTRYPOINT void
-free_fliptext (ModeInfo *mi)
-{
- fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
- int i;
- if (!sc->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sc->glx_context);
- if (sc->tc)
- textclient_close (sc->tc);
- if (sc->texfont) free_texture_font (sc->texfont);
- for (i = 0; i < sc->nlines; i++)
- if (sc->lines[i]) {
- if (sc->lines[i]->text) free (sc->lines[i]->text);
- free (sc->lines[i]);
- }
- if(sc->lines) free(sc->lines);
-}
-
-XSCREENSAVER_MODULE ("FlipText", fliptext)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/fliptext.man b/hacks/glx/fliptext.man
deleted file mode 100644
index d35a8b0..0000000
--- a/hacks/glx/fliptext.man
+++ /dev/null
@@ -1,114 +0,0 @@
-.TH XScreenSaver 1 "20-Mar-2005" "X Version 11"
-.SH NAME
-fliptext \- draws pages of text whose lines transparently flip around
-.SH SYNOPSIS
-.B fliptext
-[\-display \fIhost:display.screen\fP] [\-window] [\-root]
-[\-visual \fIvisual\fP]
-[\-delay \fImicroseconds\fP]
-[\-program \fIcommand\fP]
-[\-size \fIinteger\fP ]
-[\-columns \fIinteger\fP]
-[\-left | \-center | \-right]
-[\-lines \fIinteger\fP]
-[\-speed \fIfloat\fP]
-[\-delay \fIusecs\fP]
-[\-font \fIxlfd\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIfliptext\fP program runs another program to generate a stream of
-text, then animates the lines of that text transparently flipping in
-and out in 3D.
-.SH OPTIONS
-.I fliptext
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-program \fIsh-command\fP
-This program will be run periodically, and its output will be the text
-that is displayed. Default \fIxscreensaver\-text\fP.
-
-You can configure the text printed through the "Advanced" tab of
-.BR xscreensaver\-settings (1),
-or by editing your ~/.xscreensaver file.
-.TP 8
-.B \-size \fIinteger\fP
-How large a font to use, in points. (Well, in some arbitrary unit
-we're calling "points" for the sake of argument.) Default: 20.
-.TP 8
-.B \-columns \fIinteger\fP
-At (approximately) what column to wrap lines. Default 80. Wrapping is
-done by pixels, not characters, and lines will always wrap at the
-edge of the screen regardless.
-.TP 8
-.B \-left | \-center | \-right
-Whether to align the text flush left, centered, or flush right.
-The default is to choose randomly each time a new screen of text
-is displayed.
-.TP 8
-.B \-lines \fIinteger\fP
-How many lines of text should be shown at once. Default 8.
-.TP 8
-.B \-speed \fIratio\fP
-Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
-.TP 8
-.B \-delay \fIusecs\fP
-The delay between frames of the animation; default is 10000 (1/10th second.)
-.TP 8
-.B \-font \fIfont-name\fP
-The name of the font to use. For best effect, this should be a large
-font (at least 36 points.) The bigger the font, the better looking the
-characters will be. Note that the size of this font affects only the
-clarity of the characters, not their size on the screen: for that, use
-the \fI\-size\fP or \fI\-columns\fP options.
-
-Default: -*-utopia-bold-r-normal-*-*-720-*-*-*-*-iso8859-1
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR xscreensaver (1),
-.BR xscreensaver\-text (MANSUFFIX),
-.BR fortune (1),
-.BR phosphor (MANSUFFIX),
-.BR apple2 (MANSUFFIX),
-.BR fontglide (MANSUFFIX),
-.BR ljlatest (MANSUFFIX),
-.BR dadadodo (1),
-.BR webcollage (MANSUFFIX),
-.BR driftnet (1)
-.BR EtherPEG ,
-.BR EtherPeek
-.SH COPYRIGHT
-Copyright \(co 2005 by Jamie Zawinski.
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/flurry-smoke.c b/hacks/glx/flurry-smoke.c
deleted file mode 100644
index 245e9f1..0000000
--- a/hacks/glx/flurry-smoke.c
+++ /dev/null
@@ -1,1441 +0,0 @@
-/*
-
-Copyright (c) 2002, Calum Robinson
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/* Smoke.cpp: implementation of the Smoke class. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "flurry.h"
-
-#define MAXANGLES 16384
-#define NOT_QUITE_DEAD 3
-
-#define intensity 75000.0f;
-
-void InitSmoke(SmokeV *s)
-{
- int i;
- s->nextParticle = 0;
- s->nextSubParticle = 0;
- s->lastParticleTime = 0.25f;
- s->firstTime = 1;
- s->frame = 0;
- for (i=0;i<3;i++) {
- s->old[i] = RandFlt(-100.0, 100.0);
- }
-}
-
-void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
-{
- int i,j,k;
- float sx = flurry->star->position[0];
- float sy = flurry->star->position[1];
- float sz = flurry->star->position[2];
- double frameRate;
- double frameRateModifier;
-
-
- s->frame++;
-
- if(!s->firstTime) {
- /* release 12 puffs every frame */
- if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
- float dx,dy,dz,deltax,deltay,deltaz;
- float f;
- float rsquared;
- float mag;
-
- dx = s->old[0] - sx;
- dy = s->old[1] - sy;
- dz = s->old[2] - sz;
- mag = 5.0f;
- deltax = (dx * mag);
- deltay = (dy * mag);
- deltaz = (dz * mag);
- for(i=0;i<flurry->numStreams;i++) {
- float streamSpeedCoherenceFactor;
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
- s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
- s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
- streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
- dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
- dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
- dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
- rsquared = (dx*dx+dy*dy+dz*dz);
- f = streamSpeed * streamSpeedCoherenceFactor;
-
- mag = f / (float) sqrt(rsquared);
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
- s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
- s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
- s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
- s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
- s->nextSubParticle++;
- if (s->nextSubParticle==4) {
- s->nextParticle++;
- s->nextSubParticle=0;
- }
- if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
- s->nextParticle = 0;
- s->nextSubParticle = 0;
- }
- }
-
- s->lastParticleTime = flurry->fTime;
- }
- } else {
- s->lastParticleTime = flurry->fTime;
- s->firstTime = 0;
- }
-
- for(i=0;i<3;i++) {
- s->old[i] = flurry->star->position[i];
- }
-
- frameRate = ((double) flurry->dframe)/(flurry->fTime);
- frameRateModifier = 42.5f / frameRate;
-
- for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
- for(k=0; k<4; k++) {
- float dx,dy,dz;
- float f;
- float rsquared;
- float mag;
- float deltax;
- float deltay;
- float deltaz;
-
- if (s->p[i].dead.i[k]) {
- continue;
- }
-
- deltax = s->p[i].delta[0].f[k];
- deltay = s->p[i].delta[1].f[k];
- deltaz = s->p[i].delta[2].f[k];
-
- for(j=0;j<flurry->numStreams;j++) {
- dx = s->p[i].position[0].f[k] - flurry->spark[j]->position[0];
- dy = s->p[i].position[1].f[k] - flurry->spark[j]->position[1];
- dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
- rsquared = (dx*dx+dy*dy+dz*dz);
-
- f = (gravity/rsquared) * frameRateModifier;
-
- if ((((i*4)+k) % flurry->numStreams) == j) {
- f *= 1.0f + streamBias;
- }
- mag = f / (float) sqrt(rsquared);
-
- deltax -= (dx * mag);
- deltay -= (dy * mag);
- deltaz -= (dz * mag);
- }
-
- /* slow this particle down by flurry->drag */
- deltax *= flurry->drag;
- deltay *= flurry->drag;
- deltaz *= flurry->drag;
-
- if((deltax*deltax+deltay*deltay+deltaz*deltaz) >= 25000000.0f) {
- s->p[i].dead.i[k] = 1;
- continue;
- }
-
- /* update the position */
- s->p[i].delta[0].f[k] = deltax;
- s->p[i].delta[1].f[k] = deltay;
- s->p[i].delta[2].f[k] = deltaz;
- for(j=0;j<3;j++) {
- s->p[i].oldposition[j].f[k] = s->p[i].position[j].f[k];
- s->p[i].position[j].f[k] += (s->p[i].delta[j].f[k])*flurry->fDeltaTime;
- }
- }
- }
-}
-
-#if 0
-#ifdef __ppc__
-
-void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
-{
- int i,j,k;
- float sx = flurry->star->position[0];
- float sy = flurry->star->position[1];
- float sz = flurry->star->position[2];
- double frameRate;
- double frameRateModifier;
-
-
- s->frame++;
-
- if(!s->firstTime) {
- /* release 12 puffs every frame */
- if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
- float dx,dy,dz,deltax,deltay,deltaz;
- float f;
- float rsquared;
- float mag;
-
- dx = s->old[0] - sx;
- dy = s->old[1] - sy;
- dz = s->old[2] - sz;
- mag = 5.0f;
- deltax = (dx * mag);
- deltay = (dy * mag);
- deltaz = (dz * mag);
- for(i=0;i<flurry->numStreams;i++) {
- float streamSpeedCoherenceFactor;
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
- s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
- s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
- streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
- dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
- dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
- dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
- rsquared = (dx*dx+dy*dy+dz*dz);
- f = streamSpeed * streamSpeedCoherenceFactor;
-
- mag = f / (float) sqrt(rsquared);
- /*
- reciprocal square-root estimate replaced above divide and call to system sqrt()
-
- asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
- mag *= f;
- */
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
- s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
- s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
- s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
- s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
- s->nextSubParticle++;
- if (s->nextSubParticle==4) {
- s->nextParticle++;
- s->nextSubParticle=0;
- }
- if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
- s->nextParticle = 0;
- s->nextSubParticle = 0;
- }
- }
-
- s->lastParticleTime = flurry->fTime;
- }
- } else {
- s->lastParticleTime = flurry->fTime;
- s->firstTime = 0;
- }
-
- for(i=0;i<3;i++) {
- s->old[i] = flurry->star->position[i];
- }
-
- frameRate = ((double) flurry->dframe)/(flurry->fTime);
- frameRateModifier = 42.5f / frameRate;
-
- for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
- for(k=0; k<4; k++) {
- float dx,dy,dz;
- float f;
- float rsquared;
- float mag;
- float deltax;
- float deltay;
- float deltaz;
-
- if (s->p[i].dead.i[k]) {
- continue;
- }
-
- deltax = s->p[i].delta[0].f[k];
- deltay = s->p[i].delta[1].f[k];
- deltaz = s->p[i].delta[2].f[k];
-
- for(j=0;j<flurry->numStreams;j++) {
- dx = s->p[i].position[0].f[k] - flurry->spark[j]->position[0];
- dy = s->p[i].position[1].f[k] - flurry->spark[j]->position[1];
- dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
- rsquared = (dx*dx+dy*dy+dz*dz);
-
- /*
- asm("fres %0, %1" : "=f" (f) : "f" (rsquared));
- f *= gravity*frameRateModifier;
- */
- f = ( gravity * frameRateModifier ) / rsquared;
-
- if((((i*4)+k) % flurry->numStreams) == j) {
- f *= 1.0f + streamBias;
- }
-
- mag = f / (float) sqrt(rsquared);
-
- /* reciprocal square-root estimate replaced above divide and call to system sqrt() */
-
- deltax -= (dx * mag);
- deltay -= (dy * mag);
- deltaz -= (dz * mag);
- }
-
- /* slow this particle down by flurry->drag */
- deltax *= flurry->drag;
- deltay *= flurry->drag;
- deltaz *= flurry->drag;
-
- if((deltax*deltax+deltay*deltay+deltaz*deltaz) >= 25000000.0f) {
- s->p[i].dead.i[k] = 1;
- continue;
- }
-
- /* update the position */
- s->p[i].delta[0].f[k] = deltax;
- s->p[i].delta[1].f[k] = deltay;
- s->p[i].delta[2].f[k] = deltaz;
- for(j=0;j<3;j++) {
- s->p[i].oldposition[j].f[k] = s->p[i].position[j].f[k];
- s->p[i].position[j].f[k] += (s->p[i].delta[j].f[k])*flurry->fDeltaTime;
- }
- }
- }
-}
-
-#endif
-
-#ifdef __VEC__
-
-void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
-{
- unsigned int i,j;
- float sx = flurry->star->position[0];
- float sy = flurry->star->position[1];
- float sz = flurry->star->position[2];
- double frameRate;
- floatToVector frameRateModifier;
- floatToVector gravityV;
- floatToVector dragV;
- floatToVector deltaTimeV;
- const vector float deadConst = (vector float) (25000000.0,25000000.0,25000000.0,25000000.0);
- const vector float zero = (vector float)(0.0, 0.0, 0.0, 0.0);
- const vector float biasConst = (vector float)(streamBias);
-
- gravityV.f[0] = gravity;
- gravityV.v = (vector float) vec_splat((vector unsigned int)gravityV.v, 0);
-
- dragV.f[0] = flurry->drag;
- dragV.v = (vector float) vec_splat((vector unsigned int)dragV.v, 0);
-
- deltaTimeV.f[0] = flurry->fDeltaTime;
- deltaTimeV.v = (vector float) vec_splat((vector unsigned int)deltaTimeV.v, 0);
-
- s->frame++;
-
- if(!s->firstTime) {
- /* release 12 puffs every frame */
- if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
- float dx,dy,dz,deltax,deltay,deltaz;
- float f;
- float rsquared;
- float mag;
-
- dx = s->old[0] - sx;
- dy = s->old[1] - sy;
- dz = s->old[2] - sz;
- mag = 5.0f;
- deltax = (dx * mag);
- deltay = (dy * mag);
- deltaz = (dz * mag);
- for(i=0;i<flurry->numStreams;i++) {
- float streamSpeedCoherenceFactor;
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
- s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
- s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
- streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
- dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
- dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
- dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
- rsquared = (dx*dx+dy*dy+dz*dz);
- f = streamSpeed * streamSpeedCoherenceFactor;
-
- mag = f / (float) sqrt(rsquared);
- /*
- asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
- mag *= f;
- */
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
- s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
- s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
- s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
- s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
- s->nextSubParticle++;
- if (s->nextSubParticle==4) {
- s->nextParticle++;
- s->nextSubParticle=0;
- }
- if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
- s->nextParticle = 0;
- s->nextSubParticle = 0;
- }
- }
-
- s->lastParticleTime = flurry->fTime;
- }
- } else {
- s->lastParticleTime = flurry->fTime;
- s->firstTime = 0;
- }
-
- for(i=0;i<3;i++) {
- s->old[i] = flurry->star->position[i];
- }
-
- frameRate = ((double) flurry->dframe)/(flurry->fTime);
- frameRateModifier.f[0] = 42.5f / frameRate;
- frameRateModifier.v = (vector float) vec_splat((vector unsigned int)frameRateModifier.v, 0);
-
- frameRateModifier.v = vec_madd(frameRateModifier.v, gravityV.v, zero);
-
- for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
- /* floatToVector f; */
- vector float deltax, deltay, deltaz;
- vector float distTemp;
- vector unsigned int deadTemp;
- /* floatToVector infopos0, infopos1, infopos2; */
- intToVector mod;
- vector unsigned int jVec;
-
-
- vec_dst((int *)(&(s->p[i+4])), 0x00020200, 3);
-
- if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
- continue;
- }
-
- deltax = s->p[i].delta[0].v;
- deltay = s->p[i].delta[1].v;
- deltaz = s->p[i].delta[2].v;
-
- mod.i[0] = (i<<2 + 0) % flurry->numStreams;
- if(mod.i[0]+1 == flurry->numStreams) {
- mod.i[1] = 0;
- } else {
- mod.i[1] = mod.i[0]+1;
- }
- if(mod.i[1]+1 == flurry->numStreams) {
- mod.i[2] = 0;
- } else {
- mod.i[2] = mod.i[1]+1;
- }
- if(mod.i[2]+1 == flurry->numStreams) {
- mod.i[3] = 0;
- } else {
- mod.i[3] = mod.i[2]+1;
- }
-
- jVec = vec_xor(jVec, jVec);
-
- vec_dst( &flurry->spark[0]->position[0], 0x16020160, 3 );
- for(j=0; j<flurry->numStreams;j++) {
- vector float ip0, ip1 = (vector float)(0.0), ip2;
- vector float dx, dy, dz;
- vector float rsquared, f;
- vector float one_over_rsquared;
- vector float biasTemp;
- vector float mag;
- vector bool int biasOr;
-
- ip0 = vec_ld(0, flurry->spark[j]->position);
- if(((int)(flurry->spark[j]->position) & 0xF)>=8) {
- ip1 = vec_ld(16, flurry->spark[j]->position);
- }
-
- ip0 = vec_perm(ip0, ip1, vec_lvsl(0, flurry->spark[j]->position));
- ip1 = (vector float) vec_splat((vector unsigned int)ip0, 1);
- ip2 = (vector float) vec_splat((vector unsigned int)ip0, 2);
- ip0 = (vector float) vec_splat((vector unsigned int)ip0, 0);
-
- dx = vec_sub(s->p[i].position[0].v, ip0);
- dy = vec_sub(s->p[i].position[1].v, ip1);
- dz = vec_sub(s->p[i].position[2].v, ip2);
-
- rsquared = vec_madd(dx, dx, zero);
- rsquared = vec_madd(dy, dy, rsquared);
- rsquared = vec_madd(dz, dz, rsquared);
-
- biasOr = vec_cmpeq(jVec, mod.v);
- biasTemp = vec_add(vec_and(biasOr, biasConst), (vector float)(1.0));
-
- f = vec_madd(biasTemp, frameRateModifier.v, zero);
- one_over_rsquared = vec_re(rsquared);
- f = vec_madd(f, one_over_rsquared, zero);
-
- mag = vec_rsqrte(rsquared);
- mag = vec_madd(mag, f, zero);
-
- deltax = vec_nmsub(dx, mag, deltax);
- deltay = vec_nmsub(dy, mag, deltay);
- deltaz = vec_nmsub(dz, mag, deltaz);
-
- jVec = vec_add(jVec, (vector unsigned int)(1));
- }
-
- /* slow this particle down by flurry->drag */
- deltax = vec_madd(deltax, dragV.v, zero);
- deltay = vec_madd(deltay, dragV.v, zero);
- deltaz = vec_madd(deltaz, dragV.v, zero);
-
- distTemp = vec_madd(deltax, deltax, zero);
- distTemp = vec_madd(deltay, deltay, distTemp);
- distTemp = vec_madd(deltaz, deltaz, distTemp);
-
- deadTemp = (vector unsigned int) vec_cmpge(distTemp, deadConst);
- deadTemp = vec_and((vector unsigned int)vec_splat_u32(1), deadTemp);
- s->p[i].dead.v = vec_or(s->p[i].dead.v, deadTemp);
- if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
- continue;
- }
-
- /* update the position */
- s->p[i].delta[0].v = deltax;
- s->p[i].delta[1].v = deltay;
- s->p[i].delta[2].v = deltaz;
- for(j=0;j<3;j++) {
- s->p[i].oldposition[j].v = s->p[i].position[j].v;
- s->p[i].position[j].v = vec_madd(s->p[i].delta[j].v, deltaTimeV.v, s->p[i].position[j].v);
- }
- }
-}
-
-void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s)
-{
- unsigned int i,j;
- float sx = flurry->star->position[0];
- float sy = flurry->star->position[1];
- float sz = flurry->star->position[2];
- double frameRate;
- floatToVector frameRateModifier;
- floatToVector gravityV;
- floatToVector dragV;
- floatToVector deltaTimeV;
- const vector float deadConst = (vector float) (25000000.0,25000000.0,25000000.0,25000000.0);
- const vector float zero = (vector float)(0.0, 0.0, 0.0, 0.0);
- const vector float biasConst = (vector float)(streamBias);
-
- gravityV.f[0] = gravity;
- gravityV.v = (vector float) vec_splat((vector unsigned int)gravityV.v, 0);
-
- dragV.f[0] = flurry->drag;
- dragV.v = (vector float) vec_splat((vector unsigned int)dragV.v, 0);
-
- deltaTimeV.f[0] = flurry->fDeltaTime;
- deltaTimeV.v = (vector float) vec_splat((vector unsigned int)deltaTimeV.v, 0);
-
- s->frame++;
-
- if(!s->firstTime) {
- /* release 12 puffs every frame */
- if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
- float dx,dy,dz,deltax,deltay,deltaz;
- float f;
- float rsquared;
- float mag;
-
- dx = s->old[0] - sx;
- dy = s->old[1] - sy;
- dz = s->old[2] - sz;
- mag = 5.0f;
- deltax = (dx * mag);
- deltay = (dy * mag);
- deltaz = (dz * mag);
- for(i=0;i<flurry->numStreams;i++) {
- float streamSpeedCoherenceFactor;
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
- s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
- s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
- s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
- s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
- streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
- dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
- dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
- dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
- rsquared = (dx*dx+dy*dy+dz*dz);
- f = streamSpeed * streamSpeedCoherenceFactor;
-
- mag = f / (float) sqrt(rsquared);
- /*
- asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
- mag *= f;
- */
-
- s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
- s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
- s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
- s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
- s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
- s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
- s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
- s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
- s->nextSubParticle++;
- if (s->nextSubParticle==4) {
- s->nextParticle++;
- s->nextSubParticle=0;
- }
- if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
- s->nextParticle = 0;
- s->nextSubParticle = 0;
- }
- }
-
- s->lastParticleTime = flurry->fTime;
- }
- } else {
- s->lastParticleTime = flurry->fTime;
- s->firstTime = 0;
- }
-
- for(i=0;i<3;i++) {
- s->old[i] = flurry->star->position[i];
- }
-
- frameRate = ((double) flurry->dframe)/(flurry->fTime);
- frameRateModifier.f[0] = 42.5f / frameRate;
- frameRateModifier.v = (vector float) vec_splat((vector unsigned int)frameRateModifier.v, 0);
-
- frameRateModifier.v = vec_madd(frameRateModifier.v, gravityV.v, zero);
-
- for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
- /* floatToVector f; */
- vector float deltax, deltay, deltaz;
- vector float distTemp;
- vector unsigned int deadTemp;
- /* floatToVector infopos0, infopos1, infopos2; */
- intToVector mod;
- vector unsigned int jVec;
- vector unsigned int intOne = vec_splat_u32(1);
- vector float floatOne = vec_ctf(intOne, 0);
-
-
- vec_dst((int *)(&(s->p[i+4])), 0x00020200, 3);
-
- if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
- continue;
- }
-
- deltax = s->p[i].delta[0].v;
- deltay = s->p[i].delta[1].v;
- deltaz = s->p[i].delta[2].v;
-
- mod.i[0] = (i<<2 + 0) % flurry->numStreams;
- if(mod.i[0]+1 == flurry->numStreams) {
- mod.i[1] = 0;
- } else {
- mod.i[1] = mod.i[0]+1;
- }
- if(mod.i[1]+1 == flurry->numStreams) {
- mod.i[2] = 0;
- } else {
- mod.i[2] = mod.i[1]+1;
- }
- if(mod.i[2]+1 == flurry->numStreams) {
- mod.i[3] = 0;
- } else {
- mod.i[3] = mod.i[2]+1;
- }
-
- jVec = vec_xor(jVec, jVec);
-
- vec_dst( &flurry->spark[0]->position[0], 0x16020160, 3 );
- for(j=0; j + 3 < flurry->numStreams;j+=4)
- {
- vector float dxa, dya, dza;
- vector float dxb, dyb, dzb;
- vector float dxc, dyc, dzc;
- vector float dxd, dyd, dzd;
- vector float ip0a, ip1a;
- vector float ip0b, ip1b;
- vector float ip0c, ip1c;
- vector float ip0d, ip1d;
- vector float rsquaredA;
- vector float rsquaredB;
- vector float rsquaredC;
- vector float rsquaredD;
- vector float fA, fB, fC, fD;
- vector float biasTempA;
- vector float biasTempB;
- vector float biasTempC;
- vector float biasTempD;
- vector float magA;
- vector float magB;
- vector float magC;
- vector float magD;
-
- vector float one_over_rsquaredA;
- vector float one_over_rsquaredB;
- vector float one_over_rsquaredC;
- vector float one_over_rsquaredD;
- vector bool int biasOrA,biasOrB,biasOrC,biasOrD;
-
- /* load vectors */
- ip0a = vec_ld(0, flurry->spark[j]->position);
- ip0b = vec_ld(0, flurry->spark[j+1]->position);
- ip0c = vec_ld(0, flurry->spark[j+2]->position);
- ip0d = vec_ld(0, flurry->spark[j+3]->position);
- ip1a = vec_ld( 12, flurry->spark[j]->position );
- ip1b = vec_ld( 12, flurry->spark[j+1]->position );
- ip1c = vec_ld( 12, flurry->spark[j+2]->position );
- ip1d = vec_ld( 12, flurry->spark[j+3]->position );
-
- /* align them */
- ip0a = vec_perm(ip0a, ip1a, vec_lvsl(0, flurry->spark[j]->position));
- ip0b = vec_perm(ip0b, ip1b, vec_lvsl(0, flurry->spark[j+1]->position));
- ip0c = vec_perm(ip0c, ip1c, vec_lvsl(0, flurry->spark[j+2]->position));
- ip0d = vec_perm(ip0d, ip1d, vec_lvsl(0, flurry->spark[j+3]->position));
-
- dxa = vec_splat( ip0a, 0 );
- dxb = vec_splat( ip0b, 0 );
- dxc = vec_splat( ip0c, 0 );
- dxd = vec_splat( ip0d, 0 );
- dxa = vec_sub( s->p[i].position[0].v, dxa );
- dxb = vec_sub( s->p[i].position[0].v, dxb );
- dxc = vec_sub( s->p[i].position[0].v, dxc );
- dxd = vec_sub( s->p[i].position[0].v, dxd );
-
- dya = vec_splat( ip0a, 1 );
- dyb = vec_splat( ip0b, 1 );
- dyc = vec_splat( ip0c, 1 );
- dyd = vec_splat( ip0d, 1 );
- dya = vec_sub( s->p[i].position[1].v, dya );
- dyb = vec_sub( s->p[i].position[1].v, dyb );
- dyc = vec_sub( s->p[i].position[1].v, dyc );
- dyd = vec_sub( s->p[i].position[1].v, dyd );
-
- dza = vec_splat( ip0a, 2 );
- dzb = vec_splat( ip0b, 2 );
- dzc = vec_splat( ip0c, 2 );
- dzd = vec_splat( ip0d, 2 );
- dza = vec_sub( s->p[i].position[2].v, dza );
- dzb = vec_sub( s->p[i].position[2].v, dzb );
- dzc = vec_sub( s->p[i].position[2].v, dzc );
- dzd = vec_sub( s->p[i].position[2].v, dzd );
-
- rsquaredA = vec_madd( dxa, dxa, zero );
- rsquaredB = vec_madd( dxb, dxb, zero );
- rsquaredC = vec_madd( dxc, dxc, zero );
- rsquaredD = vec_madd( dxd, dxd, zero );
-
- rsquaredA = vec_madd( dya, dya, rsquaredA );
- rsquaredB = vec_madd( dyb, dyb, rsquaredB );
- rsquaredC = vec_madd( dyc, dyc, rsquaredC );
- rsquaredD = vec_madd( dyd, dyd, rsquaredD );
-
- rsquaredA = vec_madd( dza, dza, rsquaredA );
- rsquaredB = vec_madd( dzb, dzb, rsquaredB );
- rsquaredC = vec_madd( dzc, dzc, rsquaredC );
- rsquaredD = vec_madd( dzd, dzd, rsquaredD );
-
- biasOrA = vec_cmpeq( jVec, mod.v );
- jVec = vec_add(jVec, intOne);
- biasOrB = vec_cmpeq( jVec, mod.v );
- jVec = vec_add(jVec, intOne);
- biasOrC = vec_cmpeq( jVec, mod.v );
- jVec = vec_add(jVec, intOne);
- biasOrD = vec_cmpeq( jVec, mod.v );
- jVec = vec_add(jVec, intOne);
-
- biasTempA = vec_add( vec_and( biasOrA, biasConst), floatOne);
- biasTempB = vec_add( vec_and( biasOrB, biasConst), floatOne);
- biasTempC = vec_add( vec_and( biasOrC, biasConst), floatOne);
- biasTempD = vec_add( vec_and( biasOrD, biasConst), floatOne);
-
- fA = vec_madd( biasTempA, frameRateModifier.v, zero);
- fB = vec_madd( biasTempB, frameRateModifier.v, zero);
- fC = vec_madd( biasTempC, frameRateModifier.v, zero);
- fD = vec_madd( biasTempD, frameRateModifier.v, zero);
- one_over_rsquaredA = vec_re( rsquaredA );
- one_over_rsquaredB = vec_re( rsquaredB );
- one_over_rsquaredC = vec_re( rsquaredC );
- one_over_rsquaredD = vec_re( rsquaredD );
- fA = vec_madd( fA, one_over_rsquaredA, zero);
- fB = vec_madd( fB, one_over_rsquaredB, zero);
- fC = vec_madd( fC, one_over_rsquaredC, zero);
- fD = vec_madd( fD, one_over_rsquaredD, zero);
- magA = vec_rsqrte( rsquaredA );
- magB = vec_rsqrte( rsquaredB );
- magC = vec_rsqrte( rsquaredC );
- magD = vec_rsqrte( rsquaredD );
- magA = vec_madd( magA, fA, zero );
- magB = vec_madd( magB, fB, zero );
- magC = vec_madd( magC, fC, zero );
- magD = vec_madd( magD, fD, zero );
- deltax = vec_nmsub( dxa, magA, deltax );
- deltay = vec_nmsub( dya, magA, deltay );
- deltaz = vec_nmsub( dza, magA, deltaz );
-
- deltax = vec_nmsub( dxb, magB, deltax );
- deltay = vec_nmsub( dyb, magB, deltay );
- deltaz = vec_nmsub( dzb, magB, deltaz );
-
- deltax = vec_nmsub( dxc, magC, deltax );
- deltay = vec_nmsub( dyc, magC, deltay );
- deltaz = vec_nmsub( dzc, magC, deltaz );
-
- deltax = vec_nmsub( dxd, magD, deltax );
- deltay = vec_nmsub( dyd, magD, deltay );
- deltaz = vec_nmsub( dzd, magD, deltaz );
- }
-
-
- for(;j<flurry->numStreams;j++) {
- vector float ip0, ip1 = (vector float)(0.0), ip2;
- vector float dx, dy, dz;
- vector float rsquared, f;
- vector float one_over_rsquared;
- vector float biasTemp;
- vector float mag;
- vector bool int biasOr;
-
- ip0 = vec_ld(0, flurry->spark[j]->position);
- if(((int)(flurry->spark[j]->position) & 0xF)>=8) {
- ip1 = vec_ld(16, flurry->spark[j]->position);
- }
-
- ip0 = vec_perm(ip0, ip1, vec_lvsl(0, flurry->spark[j]->position));
- ip1 = (vector float) vec_splat((vector unsigned int)ip0, 1);
- ip2 = (vector float) vec_splat((vector unsigned int)ip0, 2);
- ip0 = (vector float) vec_splat((vector unsigned int)ip0, 0);
-
- dx = vec_sub(s->p[i].position[0].v, ip0);
- dy = vec_sub(s->p[i].position[1].v, ip1);
- dz = vec_sub(s->p[i].position[2].v, ip2);
-
- rsquared = vec_madd(dx, dx, zero);
- rsquared = vec_madd(dy, dy, rsquared);
- rsquared = vec_madd(dz, dz, rsquared);
-
- biasOr = vec_cmpeq(jVec, mod.v);
- biasTemp = vec_add(vec_and(biasOr, biasConst), (vector float)(1.0));
-
- f = vec_madd(biasTemp, frameRateModifier.v, zero);
- one_over_rsquared = vec_re(rsquared);
- f = vec_madd(f, one_over_rsquared, zero);
-
- mag = vec_rsqrte(rsquared);
- mag = vec_madd(mag, f, zero);
-
- deltax = vec_nmsub(dx, mag, deltax);
- deltay = vec_nmsub(dy, mag, deltay);
- deltaz = vec_nmsub(dz, mag, deltaz);
-
- jVec = vec_add(jVec, (vector unsigned int)(1));
- }
-
- /* slow this particle down by flurry->drag */
- deltax = vec_madd(deltax, dragV.v, zero);
- deltay = vec_madd(deltay, dragV.v, zero);
- deltaz = vec_madd(deltaz, dragV.v, zero);
-
- distTemp = vec_madd(deltax, deltax, zero);
- distTemp = vec_madd(deltay, deltay, distTemp);
- distTemp = vec_madd(deltaz, deltaz, distTemp);
-
- deadTemp = (vector unsigned int) vec_cmpge(distTemp, deadConst);
- deadTemp = vec_and((vector unsigned int)vec_splat_u32(1), deadTemp);
- s->p[i].dead.v = vec_or(s->p[i].dead.v, deadTemp);
- if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
- continue;
- }
-
- /* update the position */
- s->p[i].delta[0].v = deltax;
- s->p[i].delta[1].v = deltay;
- s->p[i].delta[2].v = deltaz;
- for(j=0;j<3;j++) {
- s->p[i].oldposition[j].v = s->p[i].position[j].v;
- s->p[i].position[j].v = vec_madd(s->p[i].delta[j].v, deltaTimeV.v, s->p[i].position[j].v);
- }
- }
-}
-
-#endif
-#endif /* 0 */
-
-void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
-{
- int svi = 0;
- int sci = 0;
- int sti = 0;
- int si = 0;
- float width;
- float sx,sy;
- float u0,v0,u1,v1;
- float w,z;
- float screenRatio = global->sys_glWidth / 1024.0f;
- float hslash2 = global->sys_glHeight * 0.5f;
- float wslash2 = global->sys_glWidth * 0.5f;
- int i,k;
-
- width = (streamSize+2.5f*flurry->streamExpansion) * screenRatio;
-
- for (i=0;i<NUMSMOKEPARTICLES/4;i++)
- {
- for (k=0; k<4; k++) {
- float thisWidth;
- float oldz;
-
- if (s->p[i].dead.i[k]) {
- continue;
- }
- thisWidth = (streamSize + (flurry->fTime - s->p[i].time.f[k])*flurry->streamExpansion) * screenRatio;
- if (thisWidth >= width)
- {
- s->p[i].dead.i[k] = 1;
- continue;
- }
- z = s->p[i].position[2].f[k];
- sx = s->p[i].position[0].f[k] * global->sys_glWidth / z + wslash2;
- sy = s->p[i].position[1].f[k] * global->sys_glWidth / z + hslash2;
- oldz = s->p[i].oldposition[2].f[k];
- if (sx > global->sys_glWidth+50.0f || sx < -50.0f || sy > global->sys_glHeight+50.0f || sy < -50.0f || z < 25.0f || oldz < 25.0f)
- {
- continue;
- }
-
- w = MAX_(1.0f,thisWidth/z);
- {
- float oldx = s->p[i].oldposition[0].f[k];
- float oldy = s->p[i].oldposition[1].f[k];
- float oldscreenx = (oldx * global->sys_glWidth / oldz) + wslash2;
- float oldscreeny = (oldy * global->sys_glWidth / oldz) + hslash2;
- float dx = (sx-oldscreenx);
- float dy = (sy-oldscreeny);
-
- float d = FastDistance2D(dx, dy);
-
- float sm, os, ow;
- if (d)
- {
- sm = w/d;
- }
- else
- {
- sm = 0.0f;
- }
- ow = MAX_(1.0f,thisWidth/oldz);
- if (d)
- {
- os = ow/d;
- }
- else
- {
- os = 0.0f;
- }
-
- {
- floatToVector cmv;
- float cm;
- float m = 1.0f + sm;
-
- float dxs = dx*sm;
- float dys = dy*sm;
- float dxos = dx*os;
- float dyos = dy*os;
- float dxm = dx*m;
- float dym = dy*m;
-
- s->p[i].animFrame.i[k]++;
- if (s->p[i].animFrame.i[k] >= 64)
- {
- s->p[i].animFrame.i[k] = 0;
- }
-
- u0 = (s->p[i].animFrame.i[k]& 7) * 0.125f;
- v0 = (s->p[i].animFrame.i[k]>>3) * 0.125f;
- u1 = u0 + 0.125f;
- v1 = v0 + 0.125f;
- cm = (1.375f - thisWidth/width);
- if (s->p[i].dead.i[k] == 3)
- {
- cm *= 0.125f;
- s->p[i].dead.i[k] = 1;
- }
- si++;
- cm *= brightness;
- cmv.f[0] = s->p[i].color[0].f[k]*cm;
- cmv.f[1] = s->p[i].color[1].f[k]*cm;
- cmv.f[2] = s->p[i].color[2].f[k]*cm;
- cmv.f[3] = s->p[i].color[3].f[k]*cm;
-
-#if 0
- /* MDT we can't use vectors in the Scalar routine */
- s->seraphimColors[sci++].v = cmv.v;
- s->seraphimColors[sci++].v = cmv.v;
- s->seraphimColors[sci++].v = cmv.v;
- s->seraphimColors[sci++].v = cmv.v;
-#else
- {
- int ii, jj;
- for (jj = 0; jj < 4; jj++) {
- for (ii = 0; ii < 4; ii++) {
- s->seraphimColors[sci].f[ii] = cmv.f[ii];
- }
- sci += 1;
- }
- }
-#endif
-
- s->seraphimTextures[sti++] = u0;
- s->seraphimTextures[sti++] = v0;
- s->seraphimTextures[sti++] = u0;
- s->seraphimTextures[sti++] = v1;
-
- s->seraphimTextures[sti++] = u1;
- s->seraphimTextures[sti++] = v1;
- s->seraphimTextures[sti++] = u1;
- s->seraphimTextures[sti++] = v0;
-
- s->seraphimVertices[svi].f[0] = sx+dxm-dys;
- s->seraphimVertices[svi].f[1] = sy+dym+dxs;
- s->seraphimVertices[svi].f[2] = sx+dxm+dys;
- s->seraphimVertices[svi].f[3] = sy+dym-dxs;
- svi++;
-
- s->seraphimVertices[svi].f[0] = oldscreenx-dxm+dyos;
- s->seraphimVertices[svi].f[1] = oldscreeny-dym-dxos;
- s->seraphimVertices[svi].f[2] = oldscreenx-dxm-dyos;
- s->seraphimVertices[svi].f[3] = oldscreeny-dym+dxos;
- svi++;
- }
- }
- }
- }
- glColorPointer(4,GL_FLOAT,0,s->seraphimColors);
- glVertexPointer(2,GL_FLOAT,0,s->seraphimVertices);
- glTexCoordPointer(2,GL_FLOAT,0,s->seraphimTextures);
- glDrawArrays(GL_QUADS,0,si*4);
-}
-
-#if 0
-#ifdef __VEC__
-
-void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
-{
- const vector float zero = (vector float)(0.0);
- int svi = 0;
- int sci = 0;
- int sti = 0;
- int si = 0;
- floatToVector width;
- vector float sx,sy;
- floatToVector u0,v0,u1,v1;
- vector float one_over_z;
- vector float w;
- floatToVector z;
- float screenRatio = global->sys_glWidth / 1024.0f;
- float hslash2 = global->sys_glHeight * 0.5f;
- float wslash2 = global->sys_glWidth * 0.5f;
- int i,kk;
- floatToVector briteV, fTimeV, expansionV, screenRatioV, hslash2V, wslash2V, streamSizeV;
- floatToVector glWidthV;
- floatToVector cm;
- vector float cmv[4];
- vector float svec[4], ovec[4];
- vector float oldscreenx, oldscreeny;
- vector float sm;
- vector float frameAnd7;
- vector float frameShift3;
- vector float one_over_width;
- vector float dx, dy;
- vector float os;
- vector unsigned int vSi = vec_splat_u32(0);
- const vector float eighth = (vector float)(0.125);
- float glWidth50 = global->sys_glWidth + 50.0f;
- float glHeight50 = global->sys_glHeight + 50.0f;
- vector float vGLWidth50, vGLHeight50;
- unsigned int blitBool;
-
- vec_dst((int *)(&(s->p[0])), 0x00020200, 2);
-
- {
- vector unsigned char permute1 = vec_lvsl( 0, &glWidth50 );
- vector unsigned char permute2 = vec_lvsl( 0, &glHeight50 );
- permute1 = (vector unsigned char) vec_splat( (vector unsigned int) permute1, 0 );
- permute2 = (vector unsigned char) vec_splat( (vector unsigned int) permute2, 0 );
- vGLWidth50 = vec_lde( 0, &glWidth50 );
- vGLHeight50 = vec_lde( 0, &glHeight50 );
- vGLWidth50 = vec_perm( vGLWidth50, vGLWidth50, permute1 );
- vGLHeight50 = vec_perm( vGLHeight50, vGLHeight50, permute2 );
- }
-
- width.f[0] = (streamSize+2.5f*flurry->streamExpansion) * screenRatio;
- width.v = (vector float) vec_splat((vector unsigned int)width.v, 0);
-
- briteV.f[0] = brightness;
- briteV.v = (vector float) vec_splat((vector unsigned int)briteV.v, 0);
-
- fTimeV.f[0] = (float) flurry->fTime;
- fTimeV.v = (vector float) vec_splat((vector unsigned int)fTimeV.v, 0);
-
- expansionV.f[0] = flurry->streamExpansion;
- expansionV.v = (vector float) vec_splat((vector unsigned int)expansionV.v, 0);
-
- screenRatioV.f[0] = screenRatio;
- screenRatioV.v = (vector float) vec_splat((vector unsigned int)screenRatioV.v, 0);
-
- hslash2V.f[0] = hslash2;
- hslash2V.v = (vector float) vec_splat((vector unsigned int)hslash2V.v, 0);
-
- wslash2V.f[0] = wslash2;
- wslash2V.v = (vector float) vec_splat((vector unsigned int)wslash2V.v, 0);
-
- streamSizeV.f[0] = streamSize;
- streamSizeV.v = (vector float) vec_splat((vector unsigned int)streamSizeV.v, 0);
-
- glWidthV.f[0] = global->sys_glWidth;
- glWidthV.v = (vector float) vec_splat((vector unsigned int)glWidthV.v, 0);
-
- for (i=0;i<NUMSMOKEPARTICLES/4;i++) {
- vector float thisWidth;
- vector float oldz;
- vector float oldx, oldy, one_over_oldz;
- vector float xabs, yabs, mn;
- vector float d;
- vector float one_over_d;
- vector bool int dnz;
- vector float ow;
-
- vec_dst((int *)(&(s->p[i+4])), 0x00020200, 2);
-
- if (vec_all_eq(s->p[i].dead.v, (vector unsigned int)(1))) continue;
-
- blitBool = 0; /* keep track of particles that actually need to be drawn */
-
- thisWidth = vec_sub(fTimeV.v, s->p[i].time.v);
- thisWidth = vec_madd(thisWidth, expansionV.v, streamSizeV.v);
- thisWidth = vec_madd(thisWidth, screenRatioV.v, zero);
-
- z.v = s->p[i].position[2].v;
- one_over_z = vec_re(z.v);
-
- sx = vec_madd(s->p[i].position[0].v, glWidthV.v, zero);
- sx = vec_madd(sx, one_over_z, wslash2V.v);
- sy = vec_madd(s->p[i].position[1].v, glWidthV.v, zero);
- sy = vec_madd(sy, one_over_z, hslash2V.v);
-
- oldz = s->p[i].oldposition[2].v;
-
- w = vec_max((vector float)(1.0), vec_madd(thisWidth, one_over_z, zero));
-
- oldx = s->p[i].oldposition[0].v;
- oldy = s->p[i].oldposition[1].v;
- one_over_oldz = vec_re(oldz);
- oldscreenx = vec_madd(oldx, glWidthV.v, zero);
- oldscreenx = vec_madd(oldscreenx, one_over_oldz, wslash2V.v);
- oldscreeny = vec_madd(oldy, glWidthV.v, zero);
- oldscreeny = vec_madd(oldscreeny, one_over_oldz, hslash2V.v);
- dx = vec_sub(sx,oldscreenx);
- dy = vec_sub(sy,oldscreeny);
-
- xabs = vec_abs(dx);
- yabs = vec_abs(dy);
- mn = vec_min(xabs,yabs);
- d = vec_add(xabs,yabs);
- d = vec_madd(mn, (vector float)(-0.6875), d);
-
- ow = vec_max((vector float)(1.0), vec_madd(thisWidth, one_over_oldz, zero));
- one_over_d = vec_re(d);
- dnz = vec_cmpgt(d, zero);
- sm = vec_madd(w, one_over_d, zero);
- sm = vec_and(sm, dnz);
- os = vec_madd(ow, one_over_d, zero);
- os = vec_and(os, dnz);
-
- {
- intToVector tempMask;
- vector bool int mask = vec_cmpeq( s->p[i].dead.v, vec_splat_u32(1) ); /* -1 where true */
- vector bool int gtMask = vec_cmpge( thisWidth, width.v ); /* -1 where true */
- vector bool int glWidth50Test = vec_cmpgt( sx, (vector float)(vGLWidth50) ); /* -1 where true */
- vector bool int glHeight50Test = vec_cmpgt( sy, (vector float)(vGLHeight50) ); /* -1 where true */
- vector bool int test50x = vec_cmplt( sx, (vector float) (-50.0) );
- vector bool int test50y = vec_cmplt( sy, (vector float) (-50.0) );
- vector bool int testz = vec_cmplt( z.v, (vector float) (25.0) );
- vector bool int testoldz = vec_cmplt( oldz, (vector float) (25.0) );
- mask = vec_or( mask, gtMask );
- s->p[i].dead.v = vec_and( mask, vec_splat_u32( 1 ) );
- mask = vec_or( mask, glWidth50Test );
- mask = vec_or( mask, glHeight50Test );
- mask = vec_or( mask, test50x );
- mask = vec_or( mask, test50y );
- mask = vec_or( mask, testz );
- mask = vec_or( mask, testoldz );
- tempMask.v = (vector unsigned int)mask;
-
- s->p[i].animFrame.v = vec_sub( s->p[i].animFrame.v, vec_nor( mask, mask ) );
- s->p[i].animFrame.v = vec_and( s->p[i].animFrame.v, (vector unsigned int)(63) );
-
- frameAnd7 = vec_ctf(vec_and(s->p[i].animFrame.v, (vector unsigned int)(7)),0);
- u0.v = vec_madd(frameAnd7, eighth, zero);
-
- frameShift3 = vec_ctf(vec_sr(s->p[i].animFrame.v, (vector unsigned int)(3)),0);
- v0.v = vec_madd(frameAnd7, eighth, zero);
-
- u1.v = vec_add(u0.v, eighth);
- v1.v = vec_add(v0.v, eighth);
-
- one_over_width = vec_re(width.v);
- cm.v = vec_sel( vec_nmsub(thisWidth, one_over_width, (vector float)(1.375)), cm.v, mask );
- cm.v = vec_madd(cm.v, briteV.v, zero);
-
- vSi = vec_sub( vSi, vec_nor( mask, mask ) );
- {
- vector unsigned int blitMask = (vector unsigned int) (1, 2, 4, 8);
- vector unsigned int temp = (vector unsigned int)mask;
- temp = vec_andc( blitMask, temp );
- temp = vec_add( temp, vec_sld( temp, temp, 8 ) );
- temp = vec_add( temp, vec_sld( temp, temp, 4 ) );
- vec_ste( temp, 0, &blitBool );
-
- }
-
- {
- vector float temp1, temp2, temp3, temp4;
- vector float result1a, result1b, result2a, result2b, result3a, result3b, result4a, result4b;
-
- temp1 = vec_mergeh( u0.v, u0.v );
- temp2 = vec_mergel( u0.v, u0.v );
- temp3 = vec_mergeh( v0.v, v1.v );
- temp4 = vec_mergel( v0.v, v1.v );
-
- result1a = vec_mergeh( temp1, temp3 );
- result1b = vec_mergel( temp1, temp3 );
- result2a = vec_mergeh( temp2, temp4 );
- result2b = vec_mergel( temp2, temp4 );
-
- temp1 = vec_mergeh( u1.v, u1.v );
- temp2 = vec_mergel( u1.v, u1.v );
- temp3 = vec_mergeh( v1.v, v0.v );
- temp4 = vec_mergel( v1.v, v0.v );
-
- result3a = vec_mergeh( temp1, temp3 );
- result3b = vec_mergel( temp1, temp3 );
- result4a = vec_mergeh( temp2, temp4 );
- result4b = vec_mergel( temp2, temp4 );
-
- if( blitBool & 1 )
- {
- vec_st( result1a, 0, &s->seraphimTextures[sti] );
- vec_st( result3a, 16, &s->seraphimTextures[sti]);
- sti+= 8;
- }
- if( blitBool & 2 )
- {
- vec_st( result1b, 0, &s->seraphimTextures[sti]);
- vec_st( result3b, 16, &s->seraphimTextures[sti]);
- sti+= 8;
- }
- if( blitBool & 4 )
- {
- vec_st( result2a, 0, &s->seraphimTextures[sti]);
- vec_st( result4a, 16, &s->seraphimTextures[sti]);
- sti+= 8;
- }
- if( blitBool & 8 )
- {
- vec_st( result2b, 0, &s->seraphimTextures[sti]);
- vec_st( result4b, 16, &s->seraphimTextures[sti]);
- sti+= 8;
- }
- }
- }
-
- cmv[0] = vec_madd(s->p[i].color[0].v, cm.v, zero);
- cmv[1] = vec_madd(s->p[i].color[1].v, cm.v, zero);
- cmv[2] = vec_madd(s->p[i].color[2].v, cm.v, zero);
- cmv[3] = vec_madd(s->p[i].color[3].v, cm.v, zero);
- {
- vector float vI0, vI1, vI2, vI3;
-
- vI0 = vec_mergeh ( cmv[0], cmv[2] );
- vI1 = vec_mergeh ( cmv[1], cmv[3] );
- vI2 = vec_mergel ( cmv[0], cmv[2] );
- vI3 = vec_mergel ( cmv[1], cmv[3] );
-
- cmv[0] = vec_mergeh ( vI0, vI1 );
- cmv[1] = vec_mergel ( vI0, vI1 );
- cmv[2] = vec_mergeh ( vI2, vI3 );
- cmv[3] = vec_mergel ( vI2, vI3 );
- }
-
- vec_dst( cmv, 0x0D0100D0, 1 );
-
- {
- vector float sxd, syd;
- vector float sxdm, sxdp, sydm, sydp;
- vector float oxd, oyd;
- vector float oxdm, oxdp, oydm, oydp;
- vector float vI0, vI1, vI2, vI3;
- vector float dxs, dys;
- vector float dxos, dyos;
- vector float dxm, dym;
- vector float m;
-
- m = vec_add((vector float)(1.0), sm);
-
- dxs = vec_madd(dx, sm, zero);
- dys = vec_madd(dy, sm, zero);
- dxos = vec_madd(dx, os, zero);
- dyos = vec_madd(dy, os, zero);
- dxm = vec_madd(dx, m, zero);
- dym = vec_madd(dy, m, zero);
-
- sxd = vec_add(sx, dxm);
- sxdm = vec_sub(sxd, dys);
- sxdp = vec_add(sxd, dys);
-
- syd = vec_add(sy, dym);
- sydm = vec_sub(syd, dxs);
- sydp = vec_add(syd, dxs);
-
- oxd = vec_sub(oldscreenx, dxm);
- oxdm = vec_sub(oxd, dyos);
- oxdp = vec_add(oxd, dyos);
-
- oyd = vec_sub(oldscreeny, dym);
- oydm = vec_sub(oyd, dxos);
- oydp = vec_add(oyd, dxos);
-
- vI0 = vec_mergeh ( sxdm, sxdp );
- vI1 = vec_mergeh ( sydp, sydm );
- vI2 = vec_mergel ( sxdm, sxdp );
- vI3 = vec_mergel ( sydp, sydm );
-
- svec[0] = vec_mergeh ( vI0, vI1 );
- svec[1] = vec_mergel ( vI0, vI1 );
- svec[2] = vec_mergeh ( vI2, vI3 );
- svec[3] = vec_mergel ( vI2, vI3 );
-
- vI0 = vec_mergeh ( oxdp, oxdm );
- vI1 = vec_mergeh ( oydm, oydp );
- vI2 = vec_mergel ( oxdp, oxdm );
- vI3 = vec_mergel ( oydm, oydp );
-
- ovec[0] = vec_mergeh ( vI0, vI1 );
- ovec[1] = vec_mergel ( vI0, vI1 );
- ovec[2] = vec_mergeh ( vI2, vI3 );
- ovec[3] = vec_mergel ( vI2, vI3 );
- }
-
- {
- int offset0 = (sci + 0) * sizeof( vector float );
- int offset1 = (sci + 1) * sizeof( vector float );
- int offset2 = (sci + 2) * sizeof( vector float );
- int offset3 = (sci + 3) * sizeof( vector float );
- int offset4 = (svi + 0) * sizeof( vector float );
- int offset5 = (svi + 1) * sizeof( vector float );
- vector float *colors = (vector float *)s->seraphimColors;
- vector float *vertices = (vector float *)s->seraphimVertices;
- for (kk=0; kk<4; kk++) {
- if (blitBool>>kk & 1) {
- vector float vcmv = cmv[kk];
- vector float vsvec = svec[kk];
- vector float vovec = ovec[kk];
-
- vec_st( vcmv, offset0, colors );
- vec_st( vcmv, offset1, colors );
- vec_st( vcmv, offset2, colors );
- vec_st( vcmv, offset3, colors );
- vec_st( vsvec, offset4, vertices );
- vec_st( vovec, offset5, vertices );
- colors += 4;
- vertices += 2;
- sci += 4;
- svi += 2;
- }
- }
- }
- }
- vSi = vec_add( vSi, vec_sld( vSi, vSi, 8 ) );
- vSi = vec_add( vSi, vec_sld( vSi, vSi, 4 ) );
- vec_ste( (vector signed int) vSi, 0, &si );
-
- glColorPointer(4,GL_FLOAT,0,s->seraphimColors);
- glVertexPointer(2,GL_FLOAT,0,s->seraphimVertices);
- glTexCoordPointer(2,GL_FLOAT,0,s->seraphimTextures);
- glDrawArrays(GL_QUADS,0,si*4);
-}
-
-#endif
-#endif /* 0 */
diff --git a/hacks/glx/flurry-spark.c b/hacks/glx/flurry-spark.c
deleted file mode 100644
index 5b58b56..0000000
--- a/hacks/glx/flurry-spark.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
-
-Copyright (c) 2002, Calum Robinson
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/* Spark.cpp: implementation of the Spark class. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "flurry.h"
-
-void InitSpark(Spark *s)
-{
- int i;
- for (i=0;i<3;i++)
- {
- s->position[i] = RandFlt(-100.0, 100.0);
- }
-}
-
-void DrawSpark(global_info_t *global, flurry_info_t *flurry, Spark *s)
-{
- const float black[4] = {0.0f,0.0f,0.0f,1.0f};
- float width,sx,sy;
- float a;
- float c = 0.0625f;
- float screenx;
- float screeny;
- float w,z, scale;
- int k;
- width = 60000.0f * global->sys_glWidth / 1024.0f;
-
- z = s->position[2];
- sx = s->position[0] * global->sys_glWidth / z + global->sys_glWidth * 0.5f;
- sy = s->position[1] * global->sys_glWidth / z + global->sys_glHeight * 0.5f;
- w = width*4.0f / z;
-
- screenx = sx;
- screeny = sy;
-
- glPushMatrix();
- glTranslatef(screenx,screeny,0.0f);
- scale = w/50.0f;
- glScalef(scale,scale,0.0f);
- for (k=0;k<12;k++)
- {
- a = ((float) (random() % 3600)) / 10.0f;
- glRotatef(a,0.0f,0.0f,1.0f);
- glBegin(GL_QUAD_STRIP);
- glColor4fv(black);
- glVertex2f(-3.0f,0.0f);
- a = 2.0f + (float) (random() & 255) * c;
- glVertex2f(-3.0f,a);
- glColor4fv(s->color);
- glVertex2f(0.0f,0.0f);
- glColor4fv(black);
- glVertex2f(0.0f,a);
- glVertex2f(3.0f,0.0f);
- glVertex2f(3.0f,a);
- glEnd();
- }
- glPopMatrix();
-}
-
-#define BIGMYSTERY 1800.0
-#define MAXANGLES 16384
-
-void UpdateSparkColour(global_info_t *global, flurry_info_t *flurry, Spark *s)
-{
- const float rotationsPerSecond = (float) (2.0*PI*fieldSpeed/MAXANGLES);
- double thisPointInRadians;
- double thisAngle = flurry->fTime*rotationsPerSecond;
- float cf;
- float cycleTime = 20.0f;
- float colorRot;
- float redPhaseShift;
- float greenPhaseShift;
- float bluePhaseShift;
- float baseRed;
- float baseGreen;
- float baseBlue;
- float colorTime;
-
- if (flurry->currentColorMode == rainbowColorMode)
- {
- cycleTime = 1.5f;
- }
- else if (flurry->currentColorMode == tiedyeColorMode)
- {
- cycleTime = 4.5f;
- }
- else if (flurry->currentColorMode == cyclicColorMode)
- {
- cycleTime = 20.0f;
- }
- else if (flurry->currentColorMode == slowCyclicColorMode)
- {
- cycleTime = 120.0f;
- }
- colorRot = (float) (2.0*PI/cycleTime);
- redPhaseShift = 0.0f; /* cycleTime * 0.0f / 3.0f */
- greenPhaseShift = cycleTime / 3.0f;
- bluePhaseShift = cycleTime * 2.0f / 3.0f ;
- colorTime = flurry->fTime;
- if (flurry->currentColorMode == whiteColorMode)
- {
- baseRed = 0.1875f;
- baseGreen = 0.1875f;
- baseBlue = 0.1875f;
- }
- else if (flurry->currentColorMode == multiColorMode)
- {
- baseRed = 0.0625f;
- baseGreen = 0.0625f;
- baseBlue = 0.0625f;
- }
- else if (flurry->currentColorMode == darkColorMode)
- {
- baseRed = 0.0f;
- baseGreen = 0.0f;
- baseBlue = 0.0f;
- }
- else
- {
- if (flurry->currentColorMode < slowCyclicColorMode)
- {
- colorTime = (flurry->currentColorMode / 6.0f) * cycleTime;
- }
- else
- {
- colorTime = flurry->fTime + flurry->flurryRandomSeed;
- }
- baseRed = 0.109375f * ((float) cos((colorTime+redPhaseShift)*colorRot)+1.0f);
- baseGreen = 0.109375f * ((float) cos((colorTime+greenPhaseShift)*colorRot)+1.0f);
- baseBlue = 0.109375f * ((float) cos((colorTime+bluePhaseShift)*colorRot)+1.0f);
- }
-
- cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
- cf /= 6.0f;
- cf += 2.0f;
- thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
-
- s->color[0] = baseRed + 0.0625f * (0.5f + (float) cos((15.0 * (thisPointInRadians + 3.0*thisAngle))) + (float) sin((7.0 * (thisPointInRadians + thisAngle))));
- s->color[1] = baseGreen + 0.0625f * (0.5f + (float) sin(((thisPointInRadians) + thisAngle)));
- s->color[2] = baseBlue + 0.0625f * (0.5f + (float) cos((37.0 * (thisPointInRadians + thisAngle))));
-}
-
-void UpdateSpark(global_info_t *global, flurry_info_t *flurry, Spark *s)
-{
- const float rotationsPerSecond = (float) (2.0*PI*fieldSpeed/MAXANGLES);
- double thisPointInRadians;
- double thisAngle = flurry->fTime*rotationsPerSecond;
- float cf;
- int i;
- double tmpX1,tmpY1,tmpZ1;
- double tmpX2,tmpY2,tmpZ2;
- double tmpX3,tmpY3,tmpZ3;
- double tmpX4,tmpY4,tmpZ4;
- double rotation;
- double cr;
- double sr;
- float cycleTime = 20.0f;
- float colorRot;
- float redPhaseShift;
- float greenPhaseShift;
- float bluePhaseShift;
- float baseRed;
- float baseGreen;
- float baseBlue;
- float colorTime;
-
- float old[3];
-
- if (flurry->currentColorMode == rainbowColorMode) {
- cycleTime = 1.5f;
- } else if (flurry->currentColorMode == tiedyeColorMode) {
- cycleTime = 4.5f;
- } else if (flurry->currentColorMode == cyclicColorMode) {
- cycleTime = 20.0f;
- } else if (flurry->currentColorMode == slowCyclicColorMode) {
- cycleTime = 120.0f;
- }
- colorRot = (float) (2.0*PI/cycleTime);
- redPhaseShift = 0.0f; /* cycleTime * 0.0f / 3.0f */
- greenPhaseShift = cycleTime / 3.0f;
- bluePhaseShift = cycleTime * 2.0f / 3.0f ;
- colorTime = flurry->fTime;
- if (flurry->currentColorMode == whiteColorMode) {
- baseRed = 0.1875f;
- baseGreen = 0.1875f;
- baseBlue = 0.1875f;
- } else if (flurry->currentColorMode == multiColorMode) {
- baseRed = 0.0625f;
- baseGreen = 0.0625f;
- baseBlue = 0.0625f;
- } else if (flurry->currentColorMode == darkColorMode) {
- baseRed = 0.0f;
- baseGreen = 0.0f;
- baseBlue = 0.0f;
- } else {
- if(flurry->currentColorMode < slowCyclicColorMode) {
- colorTime = (flurry->currentColorMode / 6.0f) * cycleTime;
- } else {
- colorTime = flurry->fTime + flurry->flurryRandomSeed;
- }
- baseRed = 0.109375f * ((float) cos((colorTime+redPhaseShift)*colorRot)+1.0f);
- baseGreen = 0.109375f * ((float) cos((colorTime+greenPhaseShift)*colorRot)+1.0f);
- baseBlue = 0.109375f * ((float) cos((colorTime+bluePhaseShift)*colorRot)+1.0f);
- }
-
- for (i=0;i<3;i++) {
- old[i] = s->position[i];
- }
-
- cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
- cf /= 6.0f;
- cf += 2.0f;
- thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
-
- s->color[0] = baseRed + 0.0625f * (0.5f + (float) cos((15.0 * (thisPointInRadians + 3.0*thisAngle))) + (float) sin((7.0 * (thisPointInRadians + thisAngle))));
- s->color[1] = baseGreen + 0.0625f * (0.5f + (float) sin(((thisPointInRadians) + thisAngle)));
- s->color[2] = baseBlue + 0.0625f * (0.5f + (float) cos((37.0 * (thisPointInRadians + thisAngle))));
- s->position[0] = fieldRange * cf * (float) cos(11.0 * (thisPointInRadians + (3.0*thisAngle)));
- s->position[1] = fieldRange * cf * (float) sin(12.0 * (thisPointInRadians + (4.0*thisAngle)));
- s->position[2] = fieldRange * (float) cos((23.0 * (thisPointInRadians + (12.0*thisAngle))));
-
- rotation = thisAngle*0.501 + 5.01 * (double) s->mystery / (double) BIGMYSTERY;
- cr = cos(rotation);
- sr = sin(rotation);
- tmpX1 = s->position[0] * cr - s->position[1] * sr;
- tmpY1 = s->position[1] * cr + s->position[0] * sr;
- tmpZ1 = s->position[2];
-
- tmpX2 = tmpX1 * cr - tmpZ1 * sr;
- tmpY2 = tmpY1;
- tmpZ2 = tmpZ1 * cr + tmpX1 * sr;
-
- tmpX3 = tmpX2;
- tmpY3 = tmpY2 * cr - tmpZ2 * sr;
- tmpZ3 = tmpZ2 * cr + tmpY2 * sr + seraphDistance;
-
- rotation = thisAngle*2.501 + 85.01 * (double) s->mystery / (double) BIGMYSTERY;
- cr = cos(rotation);
- sr = sin(rotation);
- tmpX4 = tmpX3 * cr - tmpY3 * sr;
- tmpY4 = tmpY3 * cr + tmpX3 * sr;
- tmpZ4 = tmpZ3;
-
- s->position[0] = (float) tmpX4 + RandBell(5.0f*fieldCoherence);
- s->position[1] = (float) tmpY4 + RandBell(5.0f*fieldCoherence);
- s->position[2] = (float) tmpZ4 + RandBell(5.0f*fieldCoherence);
-
- for (i=0;i<3;i++) {
- s->delta[i] = (s->position[i] - old[i])/flurry->fDeltaTime;
- }
-}
diff --git a/hacks/glx/flurry-star.c b/hacks/glx/flurry-star.c
deleted file mode 100644
index 8d9cc41..0000000
--- a/hacks/glx/flurry-star.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-
-Copyright (c) 2002, Calum Robinson
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/* Star.c: implementation of the Star class. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "flurry.h"
-
-/* Construction/Destruction */
-
-void InitStar(Star *s)
-{
- int i;
- for (i=0;i<3;i++) {
- s->position[i] = RandFlt(-10000.0, 10000.0);
- }
- s->rotSpeed = RandFlt(0.4, 0.9);
- s->mystery = RandFlt(0.0, 10.0);
-}
-
-#define BIGMYSTERY 1800.0
-#define MAXANGLES 16384
-
-void UpdateStar(global_info_t *global, flurry_info_t *flurry, Star *s)
-{
- float rotationsPerSecond = (float) (2.0*PI*12.0/MAXANGLES) * s->rotSpeed /* speed control */;
- double thisPointInRadians;
- double thisAngle = flurry->fTime*rotationsPerSecond;
- float cf;
- double tmpX1,tmpY1,tmpZ1;
- double tmpX2,tmpY2,tmpZ2;
- double tmpX3,tmpY3,tmpZ3;
- double tmpX4,tmpY4,tmpZ4;
- double rotation;
- double cr;
- double sr;
-
- s->ate = 0;
-
- cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
- cf /= 6.0f;
- cf += 0.75f;
- thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
-
- s->position[0] = 250.0f * cf * (float) cos(11.0 * (thisPointInRadians + (3.0*thisAngle)));
- s->position[1] = 250.0f * cf * (float) sin(12.0 * (thisPointInRadians + (4.0*thisAngle)));
- s->position[2] = 250.0f * (float) cos((23.0 * (thisPointInRadians + (12.0*thisAngle))));
-
- rotation = thisAngle*0.501 + 5.01 * (double) s->mystery / (double) BIGMYSTERY;
- cr = cos(rotation);
- sr = sin(rotation);
- tmpX1 = s->position[0] * cr - s->position[1] * sr;
- tmpY1 = s->position[1] * cr + s->position[0] * sr;
- tmpZ1 = s->position[2];
-
- tmpX2 = tmpX1 * cr - tmpZ1 * sr;
- tmpY2 = tmpY1;
- tmpZ2 = tmpZ1 * cr + tmpX1 * sr;
-
- tmpX3 = tmpX2;
- tmpY3 = tmpY2 * cr - tmpZ2 * sr;
- tmpZ3 = tmpZ2 * cr + tmpY2 * sr + seraphDistance;
-
- rotation = thisAngle*2.501 + 85.01 * (double) s->mystery / (double) BIGMYSTERY;
- cr = cos(rotation);
- sr = sin(rotation);
- tmpX4 = tmpX3 * cr - tmpY3 * sr;
- tmpY4 = tmpY3 * cr + tmpX3 * sr;
- tmpZ4 = tmpZ3;
-
- s->position[0] = (float) tmpX4;
- s->position[1] = (float) tmpY4;
- s->position[2] = (float) tmpZ4;
-}
diff --git a/hacks/glx/flurry-texture.c b/hacks/glx/flurry-texture.c
deleted file mode 100644
index f1b7e36..0000000
--- a/hacks/glx/flurry-texture.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
-
-Copyright (c) 2002, Calum Robinson
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/*
- * Texture.c
- * AppleFlurry
- *
- * Created by calumr on Sat Jul 07 2001.
- * Copyright (c) 2001 __CompanyName__. All rights reserved.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "flurry.h"
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-
-#include <stdlib.h>
-#include <math.h>
-
-static GLubyte smallTextureArray[32][32];
-static GLubyte bigTextureArray[256][256][2];
-
-/* simple smoothing routine */
-static void SmoothTexture(void)
-{
- GLubyte filter[32][32];
- int i,j;
- float t;
- for (i=1;i<31;i++)
- {
- for (j=1;j<31;j++)
- {
- t = (float) smallTextureArray[i][j]*4;
- t += (float) smallTextureArray[i-1][j];
- t += (float) smallTextureArray[i+1][j];
- t += (float) smallTextureArray[i][j-1];
- t += (float) smallTextureArray[i][j+1];
- t /= 8.0f;
- filter[i][j] = (GLubyte) t;
- }
- }
- for (i=1;i<31;i++)
- {
- for (j=1;j<31;j++)
- {
- smallTextureArray[i][j] = filter[i][j];
- }
- }
-}
-
-/* add some randomness to texture data */
-static void SpeckleTexture(void)
-{
- int i,j;
- int speck;
- float t;
- for (i=2;i<30;i++)
- {
- for (j=2;j<30;j++)
- {
- speck = 1;
- while (speck <= 32 && random() % 2)
- {
- t = (float) MIN_(255,smallTextureArray[i][j]+speck);
- smallTextureArray[i][j] = (GLubyte) t;
- speck+=speck;
- }
- speck = 1;
- while (speck <= 32 && random() % 2)
- {
- t = (float) MAX_(0,smallTextureArray[i][j]-speck);
- smallTextureArray[i][j] = (GLubyte) t;
- speck+=speck;
- }
- }
- }
-}
-
-static void MakeSmallTexture(void)
-{
- static int firstTime = 1;
- int i,j;
- float r,t;
- if (firstTime)
- {
- firstTime = 0;
- for (i=0;i<32;i++)
- {
- for (j=0;j<32;j++)
- {
- r = (float) sqrt((i-15.5)*(i-15.5)+(j-15.5)*(j-15.5));
- if (r > 15.0f)
- {
- smallTextureArray[i][j] = 0;
- }
- else
- {
- t = 255.0f * (float) cos(r*M_PI/31.0);
- smallTextureArray[i][j] = (GLubyte) t;
- }
- }
- }
- }
- else
- {
- for (i=0;i<32;i++)
- {
- for (j=0;j<32;j++)
- {
- r = (float) sqrt((i-15.5)*(i-15.5)+(j-15.5)*(j-15.5));
- if (r > 15.0f)
- {
- t = 0.0f;
- }
- else
- {
- t = 255.0f * (float) cos(r*M_PI/31.0);
- }
- smallTextureArray[i][j] = (GLubyte) MIN_(255,(t+smallTextureArray[i][j]+smallTextureArray[i][j])/3);
- }
- }
- }
- SpeckleTexture();
- SmoothTexture();
- SmoothTexture();
-}
-
-static void CopySmallTextureToBigTexture(int k, int l)
-{
- int i,j;
- for (i=0;i<32;i++)
- {
- for (j=0;j<32;j++)
- {
- bigTextureArray[i+k][j+l][0] = smallTextureArray[i][j];
- bigTextureArray[i+k][j+l][1] = smallTextureArray[i][j];
- }
- }
-}
-
-static void AverageLastAndFirstTextures(void)
-{
- int i,j;
- int t;
- for (i=0;i<32;i++)
- {
- for (j=0;j<32;j++)
- {
- t = (smallTextureArray[i][j] + bigTextureArray[i][j][0]) / 2;
- smallTextureArray[i][j] = (GLubyte) MIN_(255,t);
- }
- }
-}
-
-GLuint MakeTexture(void)
-{
- GLuint theTexture = 0;
- int i,j;
- for (i=0;i<8;i++)
- {
- for (j=0;j<8;j++)
- {
- if (i==7 && j==7)
- {
- AverageLastAndFirstTextures();
- }
- else
- {
- MakeSmallTexture();
- }
- CopySmallTextureToBigTexture(i*32,j*32);
- }
- }
-
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
-
- glGenTextures(1, &theTexture);
- glBindTexture(GL_TEXTURE_2D, theTexture);
-
- /* Set the tiling mode (this is generally always GL_REPEAT). */
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- /* Set the filtering. */
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
-
- gluBuild2DMipmaps(GL_TEXTURE_2D, 2, 256, 256, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, bigTextureArray);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- return theTexture;
-}
diff --git a/hacks/glx/flurry.c b/hacks/glx/flurry.c
deleted file mode 100644
index a236f52..0000000
--- a/hacks/glx/flurry.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/* -*- Mode: C; tab-width: 4 c-basic-offset: 4 indent-tabs-mode: t -*- */
-/*
- * vim: ts=8 sw=4 noet
- */
-
-/*
-
-Copyright (c) 2002, Calum Robinson
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/* flurry */
-
-#if 0
-static const char sccsid[] = "@(#)flurry.c 4.07 97/11/24 xlockmore";
-#endif
-
-#define DEF_PRESET "random"
-#define DEF_BRIGHTNESS "8"
-
-# define DEFAULTS "*delay: 10000 \n" \
- "*showFPS: False \n"
-
-# define release_flurry 0
-# define flurry_handle_event xlockmore_no_events
-# include "xlockmore.h" /* from the xscreensaver distribution */
-
-#ifdef USE_GL
-
-static char *preset_str;
-
-static XrmOptionDescRec opts[] = {
- { "-preset", ".preset", XrmoptionSepArg, 0 }
-};
-
-static argtype vars[] = {
- {&preset_str, "preset", "Preset", DEF_PRESET, t_String},
-};
-
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-ENTRYPOINT ModeSpecOpt flurry_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct flurry_description = {
- "flurry",
- "init_flurry",
- "draw_flurry",
- NULL,
- "draw_flurry",
- "init_flurry",
- "free_flurry",
- &flurry_opts,
- 1000, 1, 2, 1, 4, 1.0,
- "",
- "Flurry",
- 0,
- NULL
-};
-
-#endif
-
-#include "flurry.h"
-
-global_info_t *flurry_info = NULL;
-
-
-static
-double currentTime(void) {
- struct timeval tv;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&tv, &tzp);
-# else
- gettimeofday(&tv);
-# endif
-
- return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
-}
-
-double TimeInSecondsSinceStart (const global_info_t *global) {
- return currentTime() - global->gTimeCounter;
-}
-
-#if 0
-#ifdef __ppc__
-static int IsAltiVecAvailable(void)
-{
- return 0;
-}
-#endif
-#endif
-
-
-static
-void delete_flurry_info(flurry_info_t *flurry)
-{
- int i;
-
- free(flurry->s);
- free(flurry->star);
- for (i=0;i<MAX_SPARKS;i++)
- {
- free(flurry->spark[i]);
- }
- /* free(flurry); */
-}
-
-static
-flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes colour, float thickness, float speed, double bf)
-{
- int i,k;
- flurry_info_t *flurry = (flurry_info_t *)malloc(sizeof(flurry_info_t));
-
- if (!flurry) return NULL;
-
- flurry->flurryRandomSeed = RandFlt(0.0, 300.0);
-
- flurry->fOldTime = 0;
- flurry->dframe = 0;
- flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
- flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
-
- flurry->numStreams = streams;
- flurry->streamExpansion = thickness;
- flurry->currentColorMode = colour;
- flurry->briteFactor = bf;
-
- flurry->s = malloc(sizeof(SmokeV));
- InitSmoke(flurry->s);
-
- flurry->star = malloc(sizeof(Star));
- InitStar(flurry->star);
- flurry->star->rotSpeed = speed;
-
- for (i = 0;i < MAX_SPARKS; i++)
- {
- flurry->spark[i] = malloc(sizeof(Spark));
- InitSpark(flurry->spark[i]);
- flurry->spark[i]->mystery = 1800 * (i + 1) / 13; /* 100 * (i + 1) / (flurry->numStreams + 1); */
- UpdateSpark(global, flurry, flurry->spark[i]);
- }
-
- for (i=0;i<NUMSMOKEPARTICLES/4;i++) {
- for(k=0;k<4;k++) {
- flurry->s->p[i].dead.i[k] = 1;
- }
- }
-
- flurry->next = NULL;
-
- return flurry;
-}
-
-static
-void GLSetupRC(global_info_t *global)
-{
- /* setup the defaults for OpenGL */
- glDisable(GL_DEPTH_TEST);
- glAlphaFunc(GL_GREATER,0.0f);
- glEnable(GL_ALPHA_TEST);
- glShadeModel(GL_FLAT);
- glDisable(GL_LIGHTING);
- glDisable(GL_CULL_FACE);
- glEnable(GL_BLEND);
-
- glViewport(0,0,(int) global->sys_glWidth,(int) global->sys_glHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0,global->sys_glWidth,0,global->sys_glHeight,-1,1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glClear(GL_COLOR_BUFFER_BIT);
-
- glEnableClientState(GL_COLOR_ARRAY);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-
-#if 0
-#ifdef __ppc__
- global->optMode = OPT_MODE_SCALAR_FRSQRTE;
-
-#ifdef __VEC__
- if (IsAltiVecAvailable()) global->optMode = OPT_MODE_VECTOR_UNROLLED;
-#endif
-
-#else
- global->optMode = OPT_MODE_SCALAR_BASE;
-#endif
-#endif /* 0 */
-}
-
-static
-void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
-{
- int i;
-
- flurry->dframe++;
-
- flurry->fOldTime = flurry->fTime;
- flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
- flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
-
- flurry->drag = (float) pow(0.9965,flurry->fDeltaTime*85.0);
-
- UpdateStar(global, flurry, flurry->star);
-
-#ifdef DRAW_SPARKS
- glShadeModel(GL_SMOOTH);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-#endif
-
- for (i=0;i<flurry->numStreams;i++) {
- flurry->spark[i]->color[0]=1.0;
- flurry->spark[i]->color[1]=1.0;
- flurry->spark[i]->color[2]=1.0;
- flurry->spark[i]->color[2]=1.0;
- UpdateSpark(global, flurry, flurry->spark[i]);
-#ifdef DRAW_SPARKS
- DrawSpark(global, flurry, flurry->spark[i]);
-#endif
- }
-
- switch(global->optMode) {
- case OPT_MODE_SCALAR_BASE:
- UpdateSmoke_ScalarBase(global, flurry, flurry->s);
- break;
-#if 0
-#ifdef __ppc__
- case OPT_MODE_SCALAR_FRSQRTE:
- UpdateSmoke_ScalarFrsqrte(global, flurry, flurry->s);
- break;
-#endif
-#ifdef __VEC__
- case OPT_MODE_VECTOR_SIMPLE:
- UpdateSmoke_VectorBase(global, flurry, flurry->s);
- break;
- case OPT_MODE_VECTOR_UNROLLED:
- UpdateSmoke_VectorUnrolled(global, flurry, flurry->s);
- break;
-#endif
-#endif /* 0 */
-
- default:
- break;
- }
-
- /* glDisable(GL_BLEND); */
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glEnable(GL_TEXTURE_2D);
-
- switch(global->optMode) {
- case OPT_MODE_SCALAR_BASE:
-#if 0
-#ifdef __ppc__
- case OPT_MODE_SCALAR_FRSQRTE:
-#endif
-#endif /* 0 */
- DrawSmoke_Scalar(global, flurry, flurry->s, b);
- break;
-#if 0
-#ifdef __VEC__
- case OPT_MODE_VECTOR_SIMPLE:
- case OPT_MODE_VECTOR_UNROLLED:
- DrawSmoke_Vector(global, flurry, flurry->s, b);
- break;
-#endif
-#endif /* 0 */
- default:
- break;
- }
-
- glDisable(GL_TEXTURE_2D);
-}
-
-static
-void GLResize(global_info_t *global, float w, float h)
-{
- global->sys_glWidth = w;
- global->sys_glHeight = h;
-}
-
-/* new window size or exposure */
-ENTRYPOINT void reshape_flurry(ModeInfo *mi, int width, int height)
-{
- global_info_t *global = flurry_info + MI_SCREEN(mi);
-
- glXMakeCurrent(MI_DISPLAY(mi), global->window, *global->glx_context);
-
- glViewport(0.0, 0.0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0, width, 0, height,-1,1);
- glMatrixMode(GL_MODELVIEW);
- glClear(GL_COLOR_BUFFER_BIT);
- glFlush();
- GLResize(global, (float)width, (float)height);
-}
-
-ENTRYPOINT void
-init_flurry(ModeInfo * mi)
-{
- int screen = MI_SCREEN(mi);
- int i;
- global_info_t *global;
- enum {
- PRESET_INSANE = -1,
- PRESET_WATER = 0,
- PRESET_FIRE,
- PRESET_PSYCHEDELIC,
- PRESET_RGB,
- PRESET_BINARY,
- PRESET_CLASSIC,
- PRESET_MAX
- } preset_num;
-
- MI_INIT (mi, flurry_info);
-
- global = &flurry_info[screen];
-
- global->gTimeCounter = currentTime();
-
- global->window = MI_WINDOW(mi);
-
- global->flurry = NULL;
-
- if (!preset_str || !*preset_str) preset_str = DEF_PRESET;
- if (!strcmp(preset_str, "random")) {
- preset_num = random() % PRESET_MAX;
- } else if (!strcmp(preset_str, "water")) {
- preset_num = PRESET_WATER;
- } else if (!strcmp(preset_str, "fire")) {
- preset_num = PRESET_FIRE;
- } else if (!strcmp(preset_str, "psychedelic")) {
- preset_num = PRESET_PSYCHEDELIC;
- } else if (!strcmp(preset_str, "rgb")) {
- preset_num = PRESET_RGB;
- } else if (!strcmp(preset_str, "binary")) {
- preset_num = PRESET_BINARY;
- } else if (!strcmp(preset_str, "classic")) {
- preset_num = PRESET_CLASSIC;
- } else if (!strcmp(preset_str, "insane")) {
- preset_num = PRESET_INSANE;
- } else {
- fprintf(stderr, "%s: unknown preset %s\n", progname, preset_str);
- exit(1);
- }
-
- switch (preset_num) {
- case PRESET_WATER: {
- for (i = 0; i < 9; i++) {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 1, blueColorMode, 100.0, 2.0, 2.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
- }
- break;
- }
- case PRESET_FIRE: {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 12, slowCyclicColorMode, 10000.0, 0.2, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
- break;
- }
- case PRESET_PSYCHEDELIC: {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 10, rainbowColorMode, 200.0, 2.0, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
- break;
- }
- case PRESET_RGB: {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 3, redColorMode, 100.0, 0.8, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
-
- flurry = new_flurry_info(global, 3, greenColorMode, 100.0, 0.8, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
-
- flurry = new_flurry_info(global, 3, blueColorMode, 100.0, 0.8, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
- break;
- }
- case PRESET_BINARY: {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 16, tiedyeColorMode, 1000.0, 0.5, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
-
- flurry = new_flurry_info(global, 16, tiedyeColorMode, 1000.0, 1.5, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
- break;
- }
- case PRESET_CLASSIC: {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 5, tiedyeColorMode, 10000.0, 1.0, 1.0);
- flurry->next = global->flurry;
- global->flurry = flurry;
- break;
- }
- case PRESET_INSANE: {
- flurry_info_t *flurry;
-
- flurry = new_flurry_info(global, 64, tiedyeColorMode, 1000.0, 0.5, 0.5);
- flurry->next = global->flurry;
- global->flurry = flurry;
-
- break;
- }
- default: {
- fprintf(stderr, "%s: unknown preset %s\n", progname, preset_str);
- exit(1);
- }
- }
-
- if ((global->glx_context = init_GL(mi)) != NULL) {
- reshape_flurry(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- GLSetupRC(global);
- } else {
- MI_CLEARWINDOW(mi);
- }
-
- global->first = 1;
- global->oldFrameTime = -1;
-}
-
-ENTRYPOINT void
-draw_flurry(ModeInfo * mi)
-{
- double newFrameTime;
- double deltaFrameTime = 0;
- double brite;
- GLfloat alpha;
-
- global_info_t *global = flurry_info + MI_SCREEN(mi);
- flurry_info_t *flurry;
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- newFrameTime = currentTime();
- if (global->oldFrameTime == -1) {
- /* special case the first frame -- clear to black */
- alpha = 1.0;
- } else {
- /*
- * this clamps the speed at below 60fps and, here
- * at least, produces a reasonably accurate 50fps.
- * (probably part CPU speed and part scheduler).
- *
- * Flurry is designed to run at this speed; much higher
- * than that and the blending causes the display to
- * saturate, which looks really ugly.
- */
- if (newFrameTime - global->oldFrameTime < 1/60.0) {
- usleep(MAX_(1,(int)(20000 * (newFrameTime - global->oldFrameTime))));
- return;
-
- }
- deltaFrameTime = newFrameTime - global->oldFrameTime;
- alpha = 5.0 * deltaFrameTime;
- }
- global->oldFrameTime = newFrameTime;
-
- if (alpha > 0.2) alpha = 0.2;
-
- if (!global->glx_context)
- return;
-
- if (global->first) {
- global->texid = MakeTexture();
- global->first = 0;
- }
- glDrawBuffer(GL_BACK);
- glXMakeCurrent(display, window, *global->glx_context);
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glColor4f(0.0, 0.0, 0.0, alpha);
- glRectd(0, 0, global->sys_glWidth, global->sys_glHeight);
-
- brite = pow(deltaFrameTime,0.75) * 10;
- for (flurry = global->flurry; flurry; flurry=flurry->next) {
- GLRenderScene(global, flurry, brite * flurry->briteFactor);
- }
-
- if (mi->fps_p) do_fps (mi);
-
- glFinish();
- glXSwapBuffers(display, window);
-}
-
-ENTRYPOINT void
-free_flurry(ModeInfo * mi)
-{
- global_info_t *global = &flurry_info[MI_SCREEN(mi)];
- flurry_info_t *flurry;
-
- if (!global->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), global->window, *global->glx_context);
-
- for (flurry = global->flurry; flurry; flurry=flurry->next)
- delete_flurry_info(flurry);
- if (global->texid) glDeleteTextures (1, &global->texid);
-}
-
-XSCREENSAVER_MODULE ("Flurry", flurry)
-
-#endif
diff --git a/hacks/glx/flurry.h b/hacks/glx/flurry.h
deleted file mode 100644
index dd66a12..0000000
--- a/hacks/glx/flurry.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
-
-Copyright (c) 2002, Calum Robinson
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/* -*- Mode: C; tab-width: 4 c-basic-offset: 4 indent-tabs-mode: t -*- */
-/* flurry */
-#ifndef __GLCODE__
-#define __GLCODE__
-
-#include "xlockmoreI.h"
-#include "yarandom.h"
-#include "rotator.h"
-#include "gltrackball.h"
-
-#include <stdlib.h>
-#include <math.h>
-
-typedef struct _global_info_t global_info_t;
-typedef struct _flurry_info_t flurry_info_t;
-
-#define sqr(X) ((X) * (X))
-#define PI M_PI
-#define DEG2RAD(X) (PI*(X)/180.0)
-#define RAD2DEG(X) ((X)*180.0/PI)
-#define rnd() (frand(1.0))
-
-/* fabs: Absolute function. */
-/* #undef abs */
-/* #define abs(a) ( (a) > 0 ? (a) : -(a) ) */
-
-/* Force sign clamping to (-1;0;1) */
-#define sgn(a) ((a)<0?-1:((a)?1:0))
-
-/* used to compute the min and max of two expresions */
-#define MIN_(a, b) (((a) < (b)) ? (a) : (b))
-#define MAX_(a, b) (((a) > (b)) ? (a) : (b))
-
-typedef union {
- float f[4];
-#if 0
-#if __VEC__
- vector float v;
-#endif
-#endif /* 0 */
-} floatToVector;
-
-typedef union {
- unsigned int i[4];
-#if 0
-#if __VEC__
- vector unsigned int v;
-#endif
-#endif /* 0 */
-} intToVector;
-
-typedef struct SmokeParticleV
-{
- floatToVector color[4];
- floatToVector position[3];
- floatToVector oldposition[3];
- floatToVector delta[3];
- intToVector dead;
- floatToVector time;
- intToVector animFrame;
-} SmokeParticleV;
-
-#define NUMSMOKEPARTICLES 3600
-
-typedef struct SmokeV
-{
- SmokeParticleV p[NUMSMOKEPARTICLES/4];
- int nextParticle;
- int nextSubParticle;
- float lastParticleTime;
- int firstTime;
- long frame;
- float old[3];
- floatToVector seraphimVertices[NUMSMOKEPARTICLES*2+1];
- floatToVector seraphimColors[NUMSMOKEPARTICLES*4+1];
- float seraphimTextures[NUMSMOKEPARTICLES*2*4];
-} SmokeV;
-
-void InitSmoke(SmokeV *s);
-
-void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
-#if 0
-#ifdef __ppc__
-void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
-#endif
-#ifdef __VEC__
-void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
-void UpdateSmoke_VectorUnrolled(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
-#endif
-#endif /* 0 */
-
-void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float);
-void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float);
-
-typedef struct Star
-{
- float position[3];
- float mystery;
- float rotSpeed;
- int ate;
-} Star;
-
-void UpdateStar(global_info_t *global, flurry_info_t *flurry, Star *s);
-void InitStar(Star *s);
-
-typedef struct Spark
-{
- float position[3];
- int mystery;
- float delta[3];
- float color[4];
-} Spark;
-
-void UpdateSparkColour(global_info_t *info, flurry_info_t *flurry, Spark *s);
-void InitSpark(Spark *s);
-void UpdateSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
-void DrawSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
-
-/* #define FastDistance2D(x,y) hypot(x,y) */
-
-/* UInt8 sys_glBPP=32; */
-/* int SSMODE = FALSE; */
-/* int currentVideoMode = 0; */
-/* int cohesiveness = 7; */
-/* int fieldStrength; */
-/* int colorCoherence = 7; */
-/* int fieldIncoherence = 0; */
-/* int ifieldSpeed = 120; */
-
-static inline float FastDistance2D(float x, float y)
-{
- /* this function computes the distance from 0,0 to x,y with ~3.5% error */
- float mn;
- /* first compute the absolute value of x,y */
- x = (x < 0.0f) ? -x : x;
- y = (y < 0.0f) ? -y : y;
-
- /* compute the minimum of x,y */
- mn = x<y?x:y;
-
- /* return the distance */
- return(x+y-(mn*0.5f)-(mn*0.25f)+(mn*0.0625f));
-}
-
-#if 0
-#ifdef __VEC__
-
-static vector float FastDistance2DV(vector float x, vector float y) {
- vector float mn, temp;
-
- x = vec_abs(x);
- y = vec_abs(y);
- mn = vec_min(x,y);
- temp = vec_add(x,y);
- temp = vec_madd(mn, (vector float)(-0.6875), temp);
- return temp;
-}
-
-#endif
-#endif /* 0 */
-
-#define RandFlt(min, max) ((min) + frand((max) - (min)))
-
-#define RandBell(scale) ((scale) * (-(frand(.5) + frand(.5) + frand(.5))))
-
-extern GLuint theTexture;
-
-GLuint MakeTexture(void);
-
-#define OPT_MODE_SCALAR_BASE 0x0
-
-#if 0
-#ifdef __ppc__
-#define OPT_MODE_SCALAR_FRSQRTE 0x1
-#endif
-
-#ifdef __VEC__
-#define OPT_MODE_VECTOR_SIMPLE 0x2
-#define OPT_MODE_VECTOR_UNROLLED 0x3
-#endif
-#endif /* 0 */
-
-typedef enum _ColorModes
-{
- redColorMode = 0,
- magentaColorMode,
- blueColorMode,
- cyanColorMode,
- greenColorMode,
- yellowColorMode,
- slowCyclicColorMode,
- cyclicColorMode,
- tiedyeColorMode,
- rainbowColorMode,
- whiteColorMode,
- multiColorMode,
- darkColorMode
-} ColorModes;
-
-#define gravity 1500000.0f
-
-#define incohesion 0.07f
-#define colorIncoherence 0.15f
-#define streamSpeed 450.0
-#define fieldCoherence 0
-#define fieldSpeed 12.0f
-#define numParticles 250
-#define starSpeed 50
-#define seraphDistance 2000.0f
-#define streamSize 25000.0f
-#define fieldRange 1000.0f
-#define streamBias 7.0f
-
-#define MAX_SPARKS 64
-
-struct _flurry_info_t {
- flurry_info_t *next;
- ColorModes currentColorMode;
- SmokeV *s;
- Star *star;
- Spark *spark[MAX_SPARKS];
- float streamExpansion;
- int numStreams;
- double flurryRandomSeed;
- double fTime;
- double fOldTime;
- double fDeltaTime;
- double briteFactor;
- float drag;
- int dframe;
-};
-
-struct _global_info_t {
- /* system values */
- GLXContext *glx_context;
- Window window;
- int optMode;
-
- float sys_glWidth;
- float sys_glHeight;
-
- double gTimeCounter;
- int first;
- double oldFrameTime;
-
- flurry_info_t *flurry;
- GLuint texid;
-};
-
-#define kNumSpectrumEntries 512
-
-double TimeInSecondsSinceStart(const global_info_t *global);
-
-#endif /* Include/Define */
diff --git a/hacks/glx/flurry.man b/hacks/glx/flurry.man
deleted file mode 100644
index 6d0940f..0000000
--- a/hacks/glx/flurry.man
+++ /dev/null
@@ -1,73 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-flurry \- a colorful particle system
-.SH SYNOPSIS
-.B flurry
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-preset <arg>]
-[\-fps]
-.SH DESCRIPTION
-This is a port of the OSX screensaver flurry.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-preset <arg>
-Select a preset (classic, fire, water, psychedelic, rgb, binary, random, insane)
-
-(Insane will never be selected at random, because it requires lots of CPU/GPU
-power)
-
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH AUTHORS
-OSX screensaver by Calum Robinson <calumr@mac.com>
-
-http://homepage.mac.com/calumr
-
-xscreensaver port by Tobias Sargeant <tobias.sargeant@bigpond.com>
-
-.SH POSTCARDS
-
-If you really like it, send me a postcard (after all, you're getting this for
-free!). Please check this address by downloading the latest version of Flurry
-just before you send me a postcard - I may have moved.
-
-.PD 0
-Calum Robinson
-.P
-133 Sydenham Avenue
-.P
-Belfast
-.P
-Northern Ireland
-.P
-BT4 2DQ
-.PD 0
-
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
diff --git a/hacks/glx/flyingtoasters.c b/hacks/glx/flyingtoasters.c
deleted file mode 100644
index d024ac9..0000000
--- a/hacks/glx/flyingtoasters.c
+++ /dev/null
@@ -1,905 +0,0 @@
-/* flyingtoasters, Copyright (c) 2003-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Draws 3D flying toasters, and toast. Inspired by the ancient
- * Berkeley Systems / After Dark hack, but now updated to the wide
- * wonderful workd of OpenGL and 3D!
- *
- * Code by jwz; object models by Baconmonkey.
- *
- * The original After Dark flying toasters, with the fluffy white wings,
- * were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
- * some time in 1998, having been gobbled up by Sierra Online, who were
- * subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
- * exactly what happened when.)
- *
- * I doubt anyone even cares any more, but if they do, hopefully this homage,
- * with the space-age 3D jet-plane toasters, will be considered different
- * enough that whoever still owns the trademark to the fluffy-winged 2D
- * bitmapped toasters won't get all huffy at us.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-/* #define DEBUG */
-
-# define release_toasters 0
-
-#define DEF_SPEED "1.0"
-#define DEF_NTOASTERS "20"
-#define DEF_NSLICES "25"
-#define DEF_TEXTURE "True"
-#define DEF_FOG "True"
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-#include "xlockmore.h"
-#include "gltrackball.h"
-#include "ximage-loader.h"
-#include <ctype.h>
-
-#define HAVE_TEXTURE
-#ifdef HAVE_TEXTURE
-# include "images/gen/chromesphere_png.h"
-# include "images/gen/toast_png.h"
-#endif /* HAVE_TEXTURE */
-
-
-#ifdef USE_GL /* whole file */
-
-#include "gllist.h"
-
-extern const struct gllist
- *toaster, *toaster_base, *toaster_handle, *toaster_handle2, *toaster_jet,
- *toaster_knob, *toaster_slots, *toaster_wing, *toast, *toast2;
-
-static const struct gllist * const *all_objs[] = {
- &toaster, &toaster_base, &toaster_handle, &toaster_handle2, &toaster_jet,
- &toaster_knob, &toaster_slots, &toaster_wing, &toast, &toast2
-};
-
-#define BASE_TOASTER 0
-#define BASE 1
-#define HANDLE 2
-#define HANDLE_SLOT 3
-#define JET 4
-#define KNOB 5
-#define SLOTS 6
-#define JET_WING 7
-#define TOAST 8
-#define TOAST_BITTEN 9
-
-#define GRID_SIZE 60
-#define GRID_DEPTH 500
-
-
-static const struct { GLfloat x, y; } nice_views[] = {
- { 0, 120 },
- { 0, -120 },
- { 12, 28 }, /* this is a list of viewer rotations that look nice. */
- { 12, -28 }, /* every now and then we switch to a new one. */
- {-10, -28 }, /* (but we only use the first two at start-up.) */
- { 40, -60 },
- {-40, -60 },
- { 40, 60 },
- {-40, 60 },
- { 30, 0 },
- {-30, 0 },
-};
-
-
-typedef struct {
- GLfloat x, y, z;
- GLfloat dx, dy, dz;
- Bool toaster_p;
- int toast_type; /* 0, 1 */
- GLfloat handle_pos; /* 0.0 - 1.0 */
- GLfloat knob_pos; /* degrees */
- int loaded; /* 2 bits */
-} floater;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *user_trackball;
- Bool button_down_p;
-
- int last_view, target_view;
- GLfloat view_x, view_y;
- int view_steps, view_tick;
- Bool auto_tracking_p;
- int track_tick;
-
- GLuint *dlists;
-
-# ifdef HAVE_TEXTURE
- GLuint chrome_texture;
- GLuint toast_texture;
-# endif
-
- int nfloaters;
- floater *floaters;
-
-} toaster_configuration;
-
-static toaster_configuration *bps = NULL;
-
-static GLfloat speed;
-static int ntoasters;
-static int nslices;
-static int do_texture;
-static int do_fog;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-ntoasters", ".ntoasters", XrmoptionSepArg, 0 },
- { "-nslices", ".nslices", XrmoptionSepArg, 0 },
- {"-texture", ".texture", XrmoptionNoArg, "True" },
- {"+texture", ".texture", XrmoptionNoArg, "False" },
- {"-fog", ".fog", XrmoptionNoArg, "True" },
- {"+fog", ".fog", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&ntoasters, "ntoasters", "Count", DEF_NTOASTERS, t_Int},
- {&nslices, "nslices", "Count", DEF_NSLICES, t_Int},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt toasters_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static void
-reset_floater (ModeInfo *mi, floater *f)
-{
-/* toaster_configuration *bp = &bps[MI_SCREEN(mi)]; */
-
- GLfloat n = GRID_SIZE/2.0;
- GLfloat n2 = GRID_DEPTH/2.0;
- GLfloat delta = GRID_SIZE * speed / 200.0;
-
- f->dx = 0;
- f->dy = 0;
- f->dz = delta;
-
- f->dz += BELLRAND(delta) - delta/3;
-
- if (! (random() % 5)) {
- f->dx += (BELLRAND(delta*2) - delta);
- f->dy += (BELLRAND(delta*2) - delta);
- }
-
- if (! (random() % 40)) f->dz *= 10; /* occasional speedy one */
-
- f->x = frand(n) - n/2;
- f->y = frand(n) - n/2;
- f->z = -n2 - frand(delta * 4);
-
- if (f->toaster_p)
- {
- f->loaded = 0;
- f->knob_pos = frand(180) - 90;
- f->handle_pos = ((random() & 1) ? 0.0 : 1.0);
-
- if (f->handle_pos > 0.8 && (! (random() % 5)))
- f->loaded = (random() & 3); /* let's toast! */
- }
- else
- {
- if (! (random() % 10))
- f->toast_type = 1; /* toast_bitten */
- }
-}
-
-
-static void
-tick_floater (ModeInfo *mi, floater *f)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
-
- GLfloat n1 = GRID_DEPTH/2.0;
- GLfloat n2 = GRID_SIZE*4;
-
- if (bp->button_down_p) return;
-
- f->x += f->dx;
- f->y += f->dy;
- f->z += f->dz;
-
- if (! (random() % 50000)) /* sudden gust of gravity */
- f->dy -= 2.8;
-
- if (f->x < -n2 || f->x > n2 ||
- f->y < -n2 || f->y > n2 ||
- f->z > n1)
- reset_floater (mi, f);
-}
-
-
-static void
-auto_track_init (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- bp->last_view = (random() % 2);
- bp->target_view = bp->last_view + 2;
- bp->view_x = nice_views[bp->last_view].x;
- bp->view_y = nice_views[bp->last_view].y;
- bp->view_steps = 100;
- bp->view_tick = 0;
- bp->auto_tracking_p = True;
-}
-
-
-static void
-auto_track (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (bp->button_down_p)
- return;
-
- /* if we're not moving, maybe start moving. Otherwise, do nothing. */
- if (! bp->auto_tracking_p)
- {
- if (++bp->track_tick < 200/speed) return;
- bp->track_tick = 0;
- if (! (random() % 5))
- bp->auto_tracking_p = True;
- else
- return;
- }
-
-
- {
- GLfloat ox = nice_views[bp->last_view].x;
- GLfloat oy = nice_views[bp->last_view].y;
- GLfloat tx = nice_views[bp->target_view].x;
- GLfloat ty = nice_views[bp->target_view].y;
-
- /* move from A to B with sinusoidal deltas, so that it doesn't jerk
- to a stop. */
- GLfloat th = sin ((M_PI / 2) * (double) bp->view_tick / bp->view_steps);
-
- bp->view_x = (ox + ((tx - ox) * th));
- bp->view_y = (oy + ((ty - oy) * th));
- bp->view_tick++;
-
- if (bp->view_tick >= bp->view_steps)
- {
- bp->view_tick = 0;
- bp->view_steps = (350.0 / speed);
- bp->last_view = bp->target_view;
- bp->target_view = (random() % (countof(nice_views) - 2)) + 2;
- bp->auto_tracking_p = False;
- }
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_toasters (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (40.0, 1/h, 1.0, 250);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 2.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-toasters_handle_event (ModeInfo *mi, XEvent *event)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->user_trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-#ifdef HAVE_TEXTURE
-
-static void
-load_textures (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- XImage *xi;
-
- xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- chromesphere_png, sizeof(chromesphere_png));
- clear_gl_error();
-
-#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
- glGenTextures (1, &bp->chrome_texture);
- glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- xi->width, xi->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
- check_gl_error("texture");
- XDestroyImage (xi);
- xi = 0;
-#endif
-
- xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- toast_png, sizeof(toast_png));
-
- glGenTextures (1, &bp->toast_texture);
- glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- xi->width, xi->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
- check_gl_error("texture");
- XDestroyImage (xi);
- xi = 0;
-}
-
-#endif /* HAVE_TEXTURE */
-
-
-
-ENTRYPOINT void
-init_toasters (ModeInfo *mi)
-{
- toaster_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_toasters (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (!wire)
- {
- GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
-/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
-# ifdef HAVE_TEXTURE
- if (!wire && do_texture)
- load_textures (mi);
-# endif
-
- bp->user_trackball = gltrackball_init (False);
- auto_track_init (mi);
-
- bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
- for (i = 0; i < countof(all_objs); i++)
- bp->dlists[i] = glGenLists (1);
-
- for (i = 0; i < countof(all_objs); i++)
- {
- const struct gllist *gll = *all_objs[i];
-
- glNewList (bp->dlists[i], GL_COMPILE);
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
-
- glRotatef (-90, 1, 0, 0);
- glRotatef (180, 0, 0, 1);
- glScalef (6, 6, 6);
-
- glBindTexture (GL_TEXTURE_2D, 0);
- glDisable (GL_TEXTURE_2D);
-
- if (i == BASE_TOASTER)
- {
- GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
- GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
- GLfloat shiny = 20.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
-#ifdef HAVE_TEXTURE
- if (do_texture)
- {
-#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
- glEnable (GL_TEXTURE_2D);
- glEnable (GL_TEXTURE_GEN_S);
- glEnable (GL_TEXTURE_GEN_T);
- glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-#endif
- }
-# endif
- }
- else if (i == TOAST || i == TOAST_BITTEN)
- {
- GLfloat color[4] = {0.80, 0.80, 0.00, 1.0};
- GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0};
- GLfloat shiny = 0.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
-#ifdef HAVE_TEXTURE
- if (do_texture)
- {
- glEnable (GL_TEXTURE_2D);
- glEnable (GL_TEXTURE_GEN_S);
- glEnable (GL_TEXTURE_GEN_T);
- glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- }
-# endif
-
- glMatrixMode(GL_TEXTURE);
- glTranslatef(0.5, 0.5, 0);
- glMatrixMode(GL_MODELVIEW);
- }
- else if (i == SLOTS || i == HANDLE_SLOT)
- {
- GLfloat color[4] = {0.30, 0.30, 0.40, 1.0};
- GLfloat spec[4] = {0.40, 0.40, 0.70, 1.0};
- GLfloat shiny = 128.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else if (i == HANDLE)
- {
- GLfloat color[4] = {0.80, 0.10, 0.10, 1.0};
- GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
- GLfloat shiny = 20.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else if (i == KNOB)
- {
- GLfloat color[4] = {0.80, 0.10, 0.10, 1.0};
- GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0};
- GLfloat shiny = 0.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else if (i == JET || i == JET_WING)
- {
- GLfloat color[4] = {0.70, 0.70, 0.70, 1.0};
- GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
- GLfloat shiny = 20.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else if (i == BASE)
- {
- GLfloat color[4] = {0.50, 0.50, 0.50, 1.0};
- GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
- GLfloat shiny = 20.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
- else
- {
- GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
- GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
- GLfloat shiny = 128.0;
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
- }
-
- renderList (gll, wire);
-
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- glEndList ();
- }
-
- bp->nfloaters = ntoasters + nslices;
- bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
-
- for (i = 0; i < bp->nfloaters; i++)
- {
- floater *f = &bp->floaters[i];
- /* arrange the list so that half the toasters are in front of bread,
- and half are behind. */
- f->toaster_p = ((i < ntoasters / 2) ||
- (i >= (nslices + (ntoasters / 2))));
- reset_floater (mi, f);
-
- /* Position the first generation randomly, but make sure they aren't
- on screen yet (until we rotate the view into position.)
- */
- {
- GLfloat min = -GRID_DEPTH/2;
- GLfloat max = GRID_DEPTH/3.5;
- f->z = frand (max - min) + min;
- }
- }
-}
-
-
-static void
-draw_origin (ModeInfo *mi)
-{
-# ifdef DEBUG
-/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
-
- if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
-
- glPushMatrix();
- glScalef (5, 5, 5);
- glBegin(GL_LINES);
- glVertex3f(-1, 0, 0); glVertex3f(1, 0, 0);
- glVertex3f(0, -1, 0); glVertex3f(0, 1, 0);
- glVertex3f(0, 0, -1); glVertex3f(0, 0, 1);
- glEnd();
- glPopMatrix();
-
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
-# endif /* DEBUG */
-}
-
-
-static void
-draw_grid (ModeInfo *mi)
-{
-# ifdef DEBUG
-/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
-
- if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
- glPushMatrix();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glBegin(GL_LINES);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( 0, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( 0, -GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glPopMatrix();
-
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
-# endif /* DEBUG */
-}
-
-
-static void
-draw_floater (ModeInfo *mi, floater *f)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat n;
-
- glFrontFace(GL_CCW);
-
- glPushMatrix();
- glTranslatef (f->x, f->y, f->z);
- if (f->toaster_p)
- {
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
-
- glCallList (bp->dlists[BASE_TOASTER]);
- mi->polygon_count += (*all_objs[BASE_TOASTER])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(0, 1.01, 0);
- n = 0.91; glScalef(n,n,n);
- glCallList (bp->dlists[SLOTS]);
- mi->polygon_count += (*all_objs[SLOTS])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
- glTranslatef(0, -0.4, -2.38);
- n = 0.33; glScalef(n,n,n);
- glCallList (bp->dlists[HANDLE_SLOT]);
- mi->polygon_count += (*all_objs[HANDLE_SLOT])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(0, -1.1, 3);
- n = 0.3; glScalef (n,n,n);
- glTranslatef(0, f->handle_pos * 4.8, 0);
- glCallList (bp->dlists[HANDLE]);
- mi->polygon_count += (*all_objs[HANDLE])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
- glTranslatef(0, -1.1, -3); /* where the handle is */
- glTranslatef (1, -0.4, 0); /* down and to the left */
- n = 0.08; glScalef (n,n,n);
- glRotatef (f->knob_pos, 0, 0, 1);
- glCallList (bp->dlists[KNOB]);
- mi->polygon_count += (*all_objs[KNOB])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glRotatef (180, 0, 1, 0);
- glTranslatef (0, -2.3, 0);
- glCallList (bp->dlists[BASE]);
- mi->polygon_count += (*all_objs[BASE])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(-4.8, 0, 0);
- glCallList (bp->dlists[JET_WING]);
- mi->polygon_count += (*all_objs[JET_WING])->points / 3;
- glScalef (0.5, 0.5, 0.5);
- glTranslatef (-2, -1, 0);
- glCallList (bp->dlists[JET]);
- mi->polygon_count += (*all_objs[JET])->points / 3;
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(4.8, 0, 0);
- glScalef(-1, 1, 1);
- glFrontFace(GL_CW);
- glCallList (bp->dlists[JET_WING]);
- mi->polygon_count += (*all_objs[JET_WING])->points / 3;
- glScalef (0.5, 0.5, 0.5);
- glTranslatef (-2, -1, 0);
- glCallList (bp->dlists[JET]);
- mi->polygon_count += (*all_objs[JET])->points / 3;
- glFrontFace(GL_CCW);
- glPopMatrix();
-
- if (f->loaded)
- {
- glPushMatrix();
- glTranslatef(0, 1.01, 0);
- n = 0.91; glScalef(n,n,n);
- glRotatef (90, 0, 0, 1);
- glRotatef (90, 0, 1, 0);
- glTranslatef(0, 0, -0.95);
- glTranslatef(0, 0.72, 0);
- if (f->loaded & 1)
- {
- glCallList (bp->dlists[TOAST]);
- mi->polygon_count += (*all_objs[TOAST])->points / 3;
- }
- glTranslatef(0, -1.46, 0);
- if (f->loaded & 2)
- {
- glCallList (bp->dlists[TOAST]);
- mi->polygon_count += (*all_objs[TOAST])->points / 3;
- }
- glPopMatrix();
- }
- }
- else
- {
- glScalef (0.7, 0.7, 0.7);
- if (f->toast_type == 0)
- {
- glCallList (bp->dlists[TOAST]);
- mi->polygon_count += (*all_objs[TOAST])->points / 3;
- }
- else
- {
- glCallList (bp->dlists[TOAST_BITTEN]);
- mi->polygon_count += (*all_objs[TOAST_BITTEN])->points / 3;
- }
- }
-
- glPopMatrix();
-}
-
-
-
-ENTRYPOINT void
-draw_toasters (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
- glRotatef(current_device_rotation(), 0, 0, 1);
- glRotatef(bp->view_x, 1, 0, 0);
- glRotatef(bp->view_y, 0, 1, 0);
-
- /* Rotate the scene around a point that's a little deeper in. */
- glTranslatef (0, 0, -50);
- gltrackball_rotate (bp->user_trackball);
- glTranslatef (0, 0, 50);
-
-#if 0
- {
- floater F;
- F.toaster_p = 0;
- F.toast_type = 1;
- F.handle_pos = 0;
- F.knob_pos = -90;
- F.loaded = 3;
- F.x = F.y = F.z = 0;
- F.dx = F.dy = F.dz = 0;
-
- glScalef(2,2,2);
- if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
- glBegin(GL_LINES);
- glVertex3f(-10, 0, 0); glVertex3f(10, 0, 0);
- glVertex3f(0, -10, 0); glVertex3f(0, 10, 0);
- glVertex3f(0, 0, -10); glVertex3f(0, 0, 10);
- glEnd();
- if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
- if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
-
- draw_floater (mi, &F);
- glPopMatrix ();
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
- return;
- }
-#endif
-
- glScalef (0.5, 0.5, 0.5);
- draw_origin (mi);
- glTranslatef (0, 0, -GRID_DEPTH/2.5);
- draw_grid (mi);
-
- if (do_fog && !MI_IS_WIREFRAME(mi))
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
- glFogi (GL_FOG_MODE, GL_EXP2);
- glFogfv (GL_FOG_COLOR, fog_color);
- glFogf (GL_FOG_DENSITY, 0.0085);
- glEnable (GL_FOG);
- }
-
- mi->polygon_count = 0;
- for (i = 0; i < bp->nfloaters; i++)
- {
- floater *f = &bp->floaters[i];
- draw_floater (mi, f);
- tick_floater (mi, f);
- }
- auto_track (mi);
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_toasters (ModeInfo *mi)
-{
- toaster_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
-
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (bp->floaters) free (bp->floaters);
- if (bp->user_trackball) gltrackball_free (bp->user_trackball);
- for (i = 0; i < countof(all_objs); i++)
- if (glIsList(bp->dlists[i])) glDeleteLists(bp->dlists[i], 1);
- if (bp->dlists) free (bp->dlists);
- if (bp->toast_texture) glDeleteTextures (1, &bp->toast_texture);
-# ifndef HAVE_JWZGLES
- if (bp->chrome_texture) glDeleteTextures (1, &bp->chrome_texture);
-# endif
-}
-
-XSCREENSAVER_MODULE_2 ("FlyingToasters", flyingtoasters, toasters)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/flyingtoasters.man b/hacks/glx/flyingtoasters.man
deleted file mode 100644
index caef5fb..0000000
--- a/hacks/glx/flyingtoasters.man
+++ /dev/null
@@ -1,90 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-flyingtoasters \- 3d space-age jet-powered flying toasters (and toast)
-.SH SYNOPSIS
-.B flyingtoasters
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-ntoasters \fInumber\fP]
-[\-nslices \fInumber\fP]
-[\-no-texture]
-[\-no-fog]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Draws a squadron of shiny 3D space-age jet-powered flying toasters, and
-associated toast, flying across your screen.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-speed \fInumber\fP
-How fast the toasters fly. Larger for faster. Default: 1.0.
-.TP 8
-.B \-ntoasters \fInumber\fP
-How many toasters to draw. Default 20.
-.TP 8
-.B \-nslices \fInumber\fP
-How many slices of toast to draw. Default 25.
-.TP 8
-.B \-no-texture
-Turn off texture mapping (for slow machines.)
-.TP 8
-.B \-no-fog
-Turn off fog (do not fade out distant toasters.)
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR After Dark
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
-modify, distribute, and sell this software and its documentation for
-any purpose is hereby granted without fee, provided that the above
-copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the suitability of this software for
-any purpose. It is provided "as is" without express or implied
-warranty.
-
-The original After Dark flying toasters, with the fluffy white wings,
-were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
-some time in 1998, having been gobbled up by Sierra Online, who were
-subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
-exactly what happened when.)
-
-I doubt anyone even cares any more, but if they do, hopefully this
-homage, with the space-age 3D jet-plane toasters, will be considered
-different enough that whoever still owns the trademark to the
-fluffy-winged 2D bitmapped toasters won't get all huffy at us.
-.SH AUTHOR
-Code by Jamie Zawinski. Object models by Baconmonkey.
diff --git a/hacks/glx/fps-gl.c b/hacks/glx/fps-gl.c
deleted file mode 100644
index 20aca19..0000000
--- a/hacks/glx/fps-gl.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* fps, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
- * Draw a frames-per-second display (Xlib and OpenGL).
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "xlockmoreI.h"
-#include "fpsI.h"
-#include "texfont.h"
-
-/* These are in xlock-gl.c */
-extern void clear_gl_error (void);
-extern void check_gl_error (const char *type);
-
-typedef struct {
- texture_font_data *texfont;
- int line_height;
- Bool top_p;
-} gl_fps_data;
-
-
-static void
-xlockmore_gl_fps_init (fps_state *st)
-{
- gl_fps_data *data = (gl_fps_data *) calloc (1, sizeof(*data));
- int ascent, descent;
- data->top_p = get_boolean_resource (st->dpy, "fpsTop", "FPSTop");
- data->texfont = load_texture_font (st->dpy, "fpsFont");
- texture_string_metrics (data->texfont, "M", 0, &ascent, &descent);
- data->line_height = ascent + descent;
- st->gl_fps_data = data;
-}
-
-
-/* Callback in xscreensaver_function_table, via xlockmore.c.
- */
-void
-xlockmore_gl_compute_fps (Display *dpy, Window w, fps_state *fpst,
- void *closure)
-{
- ModeInfo *mi = (ModeInfo *) closure;
- if (! mi->fpst)
- {
- mi->fpst = fpst;
- xlockmore_gl_fps_init (fpst);
- }
-
- fps_compute (fpst, mi->polygon_count, mi->recursion_depth);
-}
-
-
-/* Called directly from GL programs (as `do_fps') before swapping buffers.
- */
-void
-xlockmore_gl_draw_fps (ModeInfo *mi)
-{
- fps_state *st = mi->fpst;
- if (st) /* might be too early */
- {
- gl_fps_data *data = (gl_fps_data *) st->gl_fps_data;
- XWindowAttributes xgwa;
- int lines = 1;
- const char *s;
-
- XGetWindowAttributes (st->dpy, st->window, &xgwa);
- for (s = st->string; *s; s++)
- if (*s == '\n') lines++;
-
- glColor3f (1, 1, 1);
- print_texture_label (st->dpy, data->texfont,
- xgwa.width, xgwa.height,
- (data->top_p ? 1 : 2),
- st->string);
- }
-}
-
-void
-xlockmore_gl_free_fps (fps_state *st)
-{
- gl_fps_data *data = (gl_fps_data *) st->gl_fps_data;
- if (data)
- {
- if (data->texfont) free_texture_font (data->texfont);
- free (data);
- st->gl_fps_data = 0;
- }
- fps_free (st);
-}
diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c
deleted file mode 100644
index c8b2081..0000000
--- a/hacks/glx/gears.c
+++ /dev/null
@@ -1,952 +0,0 @@
-/* gears, Copyright (c) 2007-2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Originally written by Brian Paul in 1996 or earlier;
- * rewritten by jwz in Nov 2007.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 0 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_gears 0
-
-#include "xlockmore.h"
-#include "involute.h"
-#include "normals.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- Bool planetary_p;
-
- int ngears;
- gear **gears;
-
- GLuint armature_dlist;
- int armature_polygons;
-
- struct { GLfloat x1, y1, x2, y2; } bbox;
-
-} gears_configuration;
-
-static gears_configuration *bps = NULL;
-
-static Bool do_spin;
-static GLfloat speed;
-static Bool do_wander;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_gears (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-free_gear (gear *g)
-{
- if (g->dlist)
- glDeleteLists (g->dlist, 1);
- free (g);
-}
-
-
-/* Create and return a new gear sized for placement next to or on top of
- the given parent gear (if any.) Returns 0 if out of memory.
- [Mostly lifted from pinion.c]
- */
-static gear *
-new_gear (ModeInfo *mi, gear *parent)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
- gear *g = (gear *) calloc (1, sizeof (*g));
- static unsigned long id = 0; /* only used in debugging output */
-
- if (!g) return 0;
- g->id = ++id;
-
- /* Pick the size of the teeth.
- */
- if (parent) /* adjascent gears need matching teeth */
- {
- g->tooth_w = parent->tooth_w;
- g->tooth_h = parent->tooth_h;
- g->tooth_slope = -parent->tooth_slope;
- }
- else /* gears that begin trains get any size they want */
- {
- g->tooth_w = 0.007 * (1.0 + BELLRAND(4.0));
- g->tooth_h = 0.005 * (1.0 + BELLRAND(8.0));
-/*
- g->tooth_slope = ((random() % 8)
- ? 0
- : 0.5 + BELLRAND(1));
- */
- }
-
- /* Pick the number of teeth, and thus, the radius.
- */
- {
- double c;
-
- if (!parent || bp->ngears > 4)
- g->nteeth = 5 + BELLRAND (20);
- else
- g->nteeth = parent->nteeth * (0.5 + BELLRAND(2));
-
- c = g->nteeth * g->tooth_w * 2; /* circumference = teeth + gaps */
- g->r = c / (M_PI * 2); /* c = 2 pi r */
- }
-
- g->thickness = g->tooth_w + frand (g->r);
- g->thickness2 = g->thickness * 0.7;
- g->thickness3 = g->thickness;
-
- /* Colorize
- */
- g->color[0] = 0.5 + frand(0.5);
- g->color[1] = 0.5 + frand(0.5);
- g->color[2] = 0.5 + frand(0.5);
- g->color[3] = 1.0;
-
- g->color2[0] = g->color[0] * 0.85;
- g->color2[1] = g->color[1] * 0.85;
- g->color2[2] = g->color[2] * 0.85;
- g->color2[3] = g->color[3];
-
-
- /* Decide on shape of gear interior:
- - just a ring with teeth;
- - that, plus a thinner in-set "plate" in the middle;
- - that, plus a thin raised "lip" on the inner plate;
- - or, a wide lip (really, a thicker third inner plate.)
- */
- if ((random() % 10) == 0)
- {
- /* inner_r can go all the way in; there's no inset disc. */
- g->inner_r = (g->r * 0.1) + frand((g->r - g->tooth_h/2) * 0.8);
- g->inner_r2 = 0;
- g->inner_r3 = 0;
- }
- else
- {
- /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
- g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
- g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
- g->inner_r3 = 0;
-
- if (g->inner_r2 > (g->r * 0.2))
- {
- int nn = (random() % 10);
- if (nn <= 2)
- g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
- else if (nn <= 7 && g->inner_r2 >= 0.1)
- g->inner_r3 = g->inner_r2 - 0.01;
- }
- }
-
- /* If we have three discs, sometimes make the middle disc be spokes.
- */
- if (g->inner_r3 && ((random() % 5) == 0))
- {
- g->spokes = 2 + BELLRAND (5);
- g->spoke_thickness = 1 + frand(7.0);
- if (g->spokes == 2 && g->spoke_thickness < 2)
- g->spoke_thickness += 1;
- }
-
- /* Sometimes add little nubbly bits, if there is room.
- */
- if (g->nteeth > 5)
- {
- double size = 0;
- involute_biggest_ring (g, 0, &size, 0);
- if (size > g->r * 0.2 && (random() % 5) == 0)
- {
- g->nubs = 1 + (random() % 16);
- if (g->nubs > 8) g->nubs = 1;
- }
- }
-
- if (g->inner_r3 > g->inner_r2) abort();
- if (g->inner_r2 > g->inner_r) abort();
- if (g->inner_r > g->r) abort();
-
- /* Decide how complex the polygon model should be.
- */
- {
- double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
- if (pix <= 2.5) g->size = INVOLUTE_SMALL;
- else if (pix <= 3.5) g->size = INVOLUTE_MEDIUM;
- else if (pix <= 25) g->size = INVOLUTE_LARGE;
- else g->size = INVOLUTE_HUGE;
- }
-
- g->base_p = !parent;
-
- return g;
-}
-
-
-/* Given a newly-created gear, place it next to its parent in the scene,
- with its teeth meshed and the proper velocity. Returns False if it
- didn't work. (Call this a bunch of times until either it works, or
- you decide it's probably not going to.)
- [Mostly lifted from pinion.c]
- */
-static Bool
-place_gear (ModeInfo *mi, gear *g, gear *parent)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
-
- /* Compute this gear's velocity.
- */
- if (! parent)
- {
- g->ratio = 0.8 + BELLRAND(0.4); /* 0.8-1.2 = 8-12rpm @ 60fps */
- g->th = 1; /* not 0 */
- }
- else
- {
- /* Gearing ratio is the ratio of the number of teeth to previous gear
- (which is also the ratio of the circumferences.)
- */
- g->ratio = (double) parent->nteeth / (double) g->nteeth;
-
- /* Set our initial rotation to match that of the previous gear,
- multiplied by the gearing ratio. (This is finessed later,
- once we know the exact position of the gear relative to its
- parent.)
- */
- g->th = -(parent->th * g->ratio);
-
- if (g->nteeth & 1) /* rotate 1/2 tooth-size if odd number of teeth */
- {
- double off = (180.0 / g->nteeth);
- if (g->th > 0)
- g->th += off;
- else
- g->th -= off;
- }
-
- /* ratios are cumulative for all gears in the train. */
- g->ratio *= parent->ratio;
- }
-
-
- if (parent) /* Place the gear next to the parent. */
- {
- double r_off = parent->r + g->r;
- int angle;
-
- angle = (random() % 360) - 180; /* -180 to +180 degrees */
-
- g->x = parent->x + (cos ((double) angle * (M_PI / 180)) * r_off);
- g->y = parent->y + (sin ((double) angle * (M_PI / 180)) * r_off);
- g->z = parent->z;
-
- /* avoid accidentally changing sign of "th" in the math below. */
- g->th += (g->th > 0 ? 360 : -360);
-
- /* Adjust the rotation of the gear so that its teeth line up with its
- parent, based on the position of the gear and the current rotation
- of the parent.
- */
- {
- double p_c = 2 * M_PI * parent->r; /* circumference of parent */
- double g_c = 2 * M_PI * g->r; /* circumference of g */
-
- double p_t = p_c * (angle/360.0); /* distance travelled along
- circumference of parent when
- moving "angle" degrees along
- parent. */
- double g_rat = p_t / g_c; /* if travelling that distance
- along circumference of g,
- ratio of g's circumference
- travelled. */
- double g_th = 360.0 * g_rat; /* that ratio in degrees */
-
- g->th += angle + g_th;
- }
- }
-
- /* If the position we picked for this gear causes it to overlap
- with any earlier gear in the train, give up.
- */
- {
- int i;
-
- for (i = bp->ngears-1; i >= 0; i--)
- {
- gear *og = bp->gears[i];
-
- if (og == g) continue;
- if (og == parent) continue;
- if (g->z != og->z) continue; /* Ignore unless on same layer */
-
- /* Collision detection without sqrt:
- d = sqrt(a^2 + b^2) d^2 = a^2 + b^2
- d < r1 + r2 d^2 < (r1 + r2)^2
- */
- if (((g->x - og->x) * (g->x - og->x) +
- (g->y - og->y) * (g->y - og->y)) <
- ((g->r + g->tooth_h + og->r + og->tooth_h) *
- (g->r + g->tooth_h + og->r + og->tooth_h)))
- return False;
- }
- }
-
- return True;
-}
-
-
-/* Make a new gear, place it next to its parent in the scene,
- with its teeth meshed and the proper velocity. Returns the gear;
- or 0 if it didn't work. (Call this a bunch of times until either
- it works, or you decide it's probably not going to.)
- [Mostly lifted from pinion.c]
- */
-static gear *
-place_new_gear (ModeInfo *mi, gear *parent)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
- int loop_count = 0;
- gear *g = 0;
-
- while (1)
- {
- loop_count++;
- if (loop_count >= 100)
- {
- if (g)
- free_gear (g);
- g = 0;
- break;
- }
-
- g = new_gear (mi, parent);
- if (!g) return 0; /* out of memory? */
-
- if (place_gear (mi, g, parent))
- break;
- }
-
- if (! g) return 0;
-
- /* We got a gear, and it is properly positioned.
- Insert it in the scene.
- */
- bp->gears[bp->ngears++] = g;
- return g;
-}
-
-
-static int
-arm (GLfloat length,
- GLfloat width1, GLfloat height1,
- GLfloat width2, GLfloat height2,
- Bool wire)
-{
- int polys = 0;
- glShadeModel(GL_FLAT);
-
-#if 0 /* don't need these - they're embedded in other objects */
- /* draw end 1 */
- glFrontFace(GL_CW);
- glNormal3f(-1, 0, 0);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f(-length/2, -width1/2, -height1/2);
- glVertex3f(-length/2, width1/2, -height1/2);
- glVertex3f(-length/2, width1/2, height1/2);
- glVertex3f(-length/2, -width1/2, height1/2);
- polys++;
- glEnd();
-
- /* draw end 2 */
- glFrontFace(GL_CCW);
- glNormal3f(1, 0, 0);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f(length/2, -width2/2, -height2/2);
- glVertex3f(length/2, width2/2, -height2/2);
- glVertex3f(length/2, width2/2, height2/2);
- glVertex3f(length/2, -width2/2, height2/2);
- polys++;
- glEnd();
-#endif
-
- /* draw top */
- glFrontFace(GL_CCW);
- glNormal3f(0, 0, -1);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f(-length/2, -width1/2, -height1/2);
- glVertex3f(-length/2, width1/2, -height1/2);
- glVertex3f( length/2, width2/2, -height2/2);
- glVertex3f( length/2, -width2/2, -height2/2);
- polys++;
- glEnd();
-
- /* draw bottom */
- glFrontFace(GL_CW);
- glNormal3f(0, 0, 1);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f(-length/2, -width1/2, height1/2);
- glVertex3f(-length/2, width1/2, height1/2);
- glVertex3f( length/2, width2/2, height2/2);
- glVertex3f( length/2, -width2/2, height2/2);
- polys++;
- glEnd();
-
- /* draw left */
- glFrontFace(GL_CW);
- glNormal3f(0, -1, 0);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f(-length/2, -width1/2, -height1/2);
- glVertex3f(-length/2, -width1/2, height1/2);
- glVertex3f( length/2, -width2/2, height2/2);
- glVertex3f( length/2, -width2/2, -height2/2);
- polys++;
- glEnd();
-
- /* draw right */
- glFrontFace(GL_CCW);
- glNormal3f(0, 1, 0);
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f(-length/2, width1/2, -height1/2);
- glVertex3f(-length/2, width1/2, height1/2);
- glVertex3f( length/2, width2/2, height2/2);
- glVertex3f( length/2, width2/2, -height2/2);
- polys++;
- glEnd();
-
- glFrontFace(GL_CCW);
-
- return polys;
-}
-
-
-static int
-ctube (GLfloat diameter, GLfloat width, Bool wire)
-{
- tube (0, 0, width/2,
- 0, 0, -width/2,
- diameter, 0,
- 32, True, True, wire);
- return 0; /* #### */
-}
-
-static void
-armature (ModeInfo *mi)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
-
- static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat shiny = 128.0;
- GLfloat color[4];
-
- color[0] = 0.5 + frand(0.5);
- color[1] = 0.5 + frand(0.5);
- color[2] = 0.5 + frand(0.5);
- color[3] = 1.0;
-
- bp->armature_polygons = 0;
-
- bp->armature_dlist = glGenLists (1);
- if (! bp->armature_dlist)
- {
- check_gl_error ("glGenLists");
- abort();
- }
-
- glNewList (bp->armature_dlist, GL_COMPILE);
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
- glMateriali (GL_FRONT, GL_SHININESS, shiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
- glColor3f (color[0], color[1], color[2]);
-
- glPushMatrix();
-
- {
- GLfloat s = bp->gears[0]->r * 2.7;
- s = s/5.6;
- glScalef (s, s, s);
- }
-
- glTranslatef (0, 0, 1.4 + bp->gears[0]->thickness);
- glRotatef (30, 0, 0, 1);
-
- bp->armature_polygons += ctube (0.5, 10, wire); /* center axle */
-
- glPushMatrix();
- glTranslatef(0.0, 4.2, -1);
- bp->armature_polygons += ctube (0.5, 3, wire); /* axle 1 */
- glTranslatef(0, 0, 1.8);
- bp->armature_polygons += ctube (0.7, 0.7, wire);
- glPopMatrix();
-
- glPushMatrix();
- glRotatef(120, 0.0, 0.0, 1.0);
- glTranslatef(0.0, 4.2, -1);
- bp->armature_polygons += ctube (0.5, 3, wire); /* axle 2 */
- glTranslatef(0, 0, 1.8);
- bp->armature_polygons += ctube (0.7, 0.7, wire);
- glPopMatrix();
-
- glPushMatrix();
- glRotatef(240, 0.0, 0.0, 1.0);
- glTranslatef(0.0, 4.2, -1);
- bp->armature_polygons += ctube (0.5, 3, wire); /* axle 3 */
- glTranslatef(0, 0, 1.8);
- bp->armature_polygons += ctube (0.7, 0.7, wire);
- glPopMatrix();
-
- glTranslatef(0, 0, 1.5); /* center disk */
- bp->armature_polygons += ctube (1.5, 2, wire);
-
- glPushMatrix();
- glRotatef(270, 0, 0, 1);
- glRotatef(-10, 0, 1, 0);
- glTranslatef(-2.2, 0, 0);
- bp->armature_polygons += arm (4.0, 1.0, 0.5,
- 2.0, 1.0, wire); /* arm 1 */
- glPopMatrix();
-
- glPushMatrix();
- glRotatef(30, 0, 0, 1);
- glRotatef(-10, 0, 1, 0);
- glTranslatef(-2.2, 0, 0);
- bp->armature_polygons += arm (4.0, 1.0, 0.5,
- 2.0, 1.0, wire); /* arm 2 */
- glPopMatrix();
-
- glPushMatrix();
- glRotatef(150, 0, 0, 1);
- glRotatef(-10, 0, 1, 0);
- glTranslatef(-2.2, 0, 0);
- bp->armature_polygons += arm (4.0, 1.0, 0.5,
- 2.0, 1.0, wire); /* arm 3 */
- glPopMatrix();
-
- glPopMatrix();
-
- glEndList ();
-}
-
-
-static void
-planetary_gears (ModeInfo *mi)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
- gear *g0, *g1, *g2, *g3, *g4;
- GLfloat distance = 2.02;
-
- bp->planetary_p = True;
-
- g0 = new_gear (mi, 0);
- g1 = new_gear (mi, 0);
- g2 = new_gear (mi, 0);
- g3 = new_gear (mi, 0);
- g4 = new_gear (mi, 0);
-
- if (! place_gear (mi, g0, 0)) abort();
- if (! place_gear (mi, g1, 0)) abort();
- if (! place_gear (mi, g2, 0)) abort();
- if (! place_gear (mi, g3, 0)) abort();
- if (! place_gear (mi, g4, 0)) abort();
-
- g0->nteeth = 12 + (3 * (random() % 10)); /* must be multiple of 3 */
- g0->tooth_w = g0->r / g0->nteeth;
- g0->tooth_h = g0->tooth_w * 2.8;
-
-# define COPY(F) g4->F = g3->F = g2->F = g1->F = g0->F
- COPY(r);
- COPY(th);
- COPY(nteeth);
- COPY(tooth_w);
- COPY(tooth_h);
- COPY(tooth_slope);
- COPY(inner_r);
- COPY(inner_r2);
- COPY(inner_r3);
- COPY(thickness);
- COPY(thickness2);
- COPY(thickness3);
- COPY(ratio);
- COPY(size);
-# undef COPY
-
- g1->x = cos (M_PI * 2 / 3) * g1->r * distance;
- g1->y = sin (M_PI * 2 / 3) * g1->r * distance;
-
- g2->x = cos (M_PI * 4 / 3) * g2->r * distance;
- g2->y = sin (M_PI * 4 / 3) * g2->r * distance;
-
- g3->x = cos (M_PI * 6 / 3) * g3->r * distance;
- g3->y = sin (M_PI * 6 / 3) * g3->r * distance;
-
- g4->x = 0;
- g4->y = 0;
- g4->th = -g3->th;
-
- /* rotate central gear 1/2 tooth-size if odd number of teeth */
- if (g4->nteeth & 1)
- g4->th -= (180.0 / g4->nteeth);
-
- g0->inverted_p = True;
- g0->x = 0;
- g0->y = 0;
- g0->nteeth = g1->nteeth * 3;
- g0->r = g1->r * 3.05;
- g0->inner_r = g0->r * 0.8;
- g0->inner_r2 = 0;
- g0->inner_r3 = 0;
- g0->th = g1->th + (180 / g0->nteeth);
- g0->ratio = g1->ratio / 3;
-
- g0->tooth_slope = 0;
- g0->nubs = 3;
- g0->spokes = 0;
- g0->size = INVOLUTE_LARGE;
-
- bp->gears = (gear **) calloc (6, sizeof(*bp->gears));
- bp->ngears = 0;
-
- bp->gears[bp->ngears++] = g1;
- bp->gears[bp->ngears++] = g2;
- bp->gears[bp->ngears++] = g3;
- bp->gears[bp->ngears++] = g4;
- bp->gears[bp->ngears++] = g0;
-}
-
-
-
-
-ENTRYPOINT void
-init_gears (ModeInfo *mi)
-{
- gears_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- int i;
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_gears (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- if (! bp->rot)
- {
- double spin_speed = 0.5;
- double wander_speed = 0.01;
- double spin_accel = 0.25;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True
- );
- bp->trackball = gltrackball_init (True);
- }
-
- if (bp->gears)
- {
- for (i = 0; i < bp->ngears; i++)
- free_gear (bp->gears[i]);
- free (bp->gears);
- bp->gears = 0;
- bp->ngears = 0;
- }
-
- if (!(random() % 8))
- {
- planetary_gears (mi);
- }
- else
- {
- gear *g = 0;
- int total_gears = MI_COUNT (mi);
-
- bp->planetary_p = False;
-
- if (total_gears <= 0)
- total_gears = 3 + fabs (BELLRAND (8) - 4); /* 3 - 7, mostly 3. */
- bp->gears = (gear **) calloc (total_gears+2, sizeof(*bp->gears));
- bp->ngears = 0;
-
- for (i = 0; i < total_gears; i++)
- g = place_new_gear (mi, g);
- }
-
-
- /* Center gears in scene. */
- {
- GLfloat minx=99999, miny=99999, maxx=-99999, maxy=-99999;
- int i;
- for (i = 0; i < bp->ngears; i++)
- {
- gear *g = bp->gears[i];
- if (g->x - g->r < minx) minx = g->x - g->r;
- if (g->x + g->r > maxx) maxx = g->x + g->r;
- if (g->y - g->r < miny) miny = g->y - g->r;
- if (g->y + g->r > maxy) maxy = g->y + g->r;
- }
- bp->bbox.x1 = minx;
- bp->bbox.y1 = miny;
- bp->bbox.x2 = maxx;
- bp->bbox.y2 = maxy;
- }
-
- /* Now render each gear into its display list.
- */
- for (i = 0; i < bp->ngears; i++)
- {
- gear *g = bp->gears[i];
- g->dlist = glGenLists (1);
- if (! g->dlist)
- {
- check_gl_error ("glGenLists");
- abort();
- }
-
- glNewList (g->dlist, GL_COMPILE);
- g->polygons += draw_involute_gear (g, wire);
- glEndList ();
- }
- if (bp->planetary_p)
- armature (mi);
-}
-
-
-ENTRYPOINT void
-draw_gears (ModeInfo *mi)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef ((x - 0.5) * 4,
- (y - 0.5) * 4,
- (z - 0.5) * 7);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
-
- /* add a little rotation for -no-spin mode */
- x -= 0.14;
- y -= 0.06;
-
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- /* Center the scene's bounding box in the window,
- and scale it to fit.
- */
- {
- GLfloat w = bp->bbox.x2 - bp->bbox.x1;
- GLfloat h = bp->bbox.y2 - bp->bbox.y1;
- GLfloat s = 10.0 / (w > h ? w : h);
- glScalef (s, s, s);
- glTranslatef (-(bp->bbox.x1 + w/2),
- -(bp->bbox.y1 + h/2),
- 0);
- }
-
- mi->polygon_count = 0;
-
- for (i = 0; i < bp->ngears; i++)
- {
- gear *g = bp->gears[i];
-
- glPushMatrix();
-
- glTranslatef (g->x, g->y, g->z);
- glRotatef (g->th, 0, 0, 1);
-
- glCallList (g->dlist);
- mi->polygon_count += g->polygons;
-
- glPopMatrix ();
- }
-
- if (bp->planetary_p)
- {
- glCallList (bp->armature_dlist);
- mi->polygon_count += bp->armature_polygons;
- }
-
- glPopMatrix ();
-
- /* spin gears */
- if (!bp->button_down_p)
- for (i = 0; i < bp->ngears; i++)
- {
- gear *g = bp->gears[i];
- double off = g->ratio * 5 * speed;
- if (g->th > 0)
- g->th += off;
- else
- g->th -= off;
- }
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-ENTRYPOINT Bool
-gears_handle_event (ModeInfo *mi, XEvent *event)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- init_gears (mi);
- return True;
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-free_gears (ModeInfo *mi)
-{
- gears_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->trackball) gltrackball_free (bp->trackball);
- for (i = 0; i < bp->ngears; i++)
- if (bp->gears[i])
- free_gear (bp->gears[i]);
- if (glIsList(bp->armature_dlist))
- glDeleteLists (bp->armature_dlist, 1);
-
-}
-
-XSCREENSAVER_MODULE ("Gears", gears)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/gears.man b/hacks/glx/gears.man
deleted file mode 100644
index 5be1368..0000000
--- a/hacks/glx/gears.man
+++ /dev/null
@@ -1,79 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-gears \- draw interlocking gears, for xscreensaver.
-.SH SYNOPSIS
-.B gears
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-speed \fIfloat\fP]
-[\-no\-spin]
-[\-no\-wander]
-[-count \fIinteger\fP]
-[-wireframe]
-[-fps]
-.SH DESCRIPTION
-This draws a set of rotating gears.
-.SH OPTIONS
-.I gears
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-The delay between frames of the animation, in microseconds.
-Default: 30000 (0.03 seconds.)
-.TP 8
-.B \-speed \fIfloat\fP
-Larger numbers mean run faster. Default: 1.0.
-.TP 8
-.B \-no\-spin
-Don't rotate the object.
-.TP 8
-.B \-no\-wander
-Don't wander the object around the screen.
-.TP 8
-.B \-count \fIinteger\fP
-How many gears to draw. Default: 0 for random.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
-
-An earlier version of this program by Brian Paul was written in 1997;
-this version was rewritten from scratch by jwz in 2007.
diff --git a/hacks/glx/geodesic.c b/hacks/glx/geodesic.c
deleted file mode 100644
index edf81c9..0000000
--- a/hacks/glx/geodesic.c
+++ /dev/null
@@ -1,824 +0,0 @@
-/* geodesic, Copyright (c) 2013-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 4 \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_geodesic 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "normals.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#include "gllist.h"
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_MODE "mesh"
-
-typedef struct { double a, o; } LL; /* latitude + longitude */
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- int ncolors;
- XColor *colors;
- int ccolor, ccolor2;
- GLfloat color1[4], color2[4];
-
- GLfloat depth;
- GLfloat delta;
-
- GLfloat thickness;
- GLfloat thickdelta;
-
- GLfloat morph_ratio;
-
- Bool random_p;
- enum { WIRE, MESH, SOLID, STELLATED, STELLATED2 } mode;
-
-} geodesic_configuration;
-
-static geodesic_configuration *bps = NULL;
-
-static Bool do_spin;
-static GLfloat speed;
-static Bool do_wander;
-static char *mode_str;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-wireframe", ".mode", XrmoptionNoArg, "wire" },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&mode_str, "mode", "Mode", DEF_MODE, t_String},
-};
-
-ENTRYPOINT ModeSpecOpt geodesic_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Renders a triangle specified by 3 cartesian endpoints.
- */
-static void
-triangle0 (ModeInfo *mi, XYZ p1, XYZ p2, XYZ p3)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat r = bp->thickness;
-
- if (bp->mode == SOLID || bp->mode == STELLATED || bp->mode == STELLATED2)
- r = 1;
-
- if (r <= 0.001) r = 0.001;
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color1);
-
- if (wire) r = 1;
-
- if (r <= 0)
- ;
- else if (r >= 1) /* solid triangular face */
- {
- glFrontFace (GL_CCW);
- glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
- do_normal (p1.x, p1.y, p1.z,
- p2.x, p2.y, p2.z,
- p3.x, p3.y, p3.z);
- glVertex3f (p1.x, p1.y, p1.z);
- glVertex3f (p2.x, p2.y, p2.z);
- glVertex3f (p3.x, p3.y, p3.z);
- glEnd();
- mi->polygon_count++;
- }
- else /* mesh: triangular face with a triangular hole */
- {
- XYZ p1b, p2b, p3b, c;
- GLfloat d = 0.98;
-
- c.x = (p1.x + p2.x + p3.x) / 3;
- c.y = (p1.y + p2.y + p3.y) / 3;
- c.z = (p1.z + p2.z + p3.z) / 3;
-
- p1b.x = p1.x + (r * (c.x - p1.x));
- p1b.y = p1.y + (r * (c.y - p1.y));
- p1b.z = p1.z + (r * (c.z - p1.z));
-
- p2b.x = p2.x + (r * (c.x - p2.x));
- p2b.y = p2.y + (r * (c.y - p2.y));
- p2b.z = p2.z + (r * (c.z - p2.z));
-
- p3b.x = p3.x + (r * (c.x - p3.x));
- p3b.y = p3.y + (r * (c.y - p3.y));
- p3b.z = p3.z + (r * (c.z - p3.z));
-
- /* Outside faces */
-
- do_normal (p1.x, p1.y, p1.z,
- p2.x, p2.y, p2.z,
- p3.x, p3.y, p3.z);
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (p1.x, p1.y, p1.z);
- glVertex3f (p1b.x, p1b.y, p1b.z);
- glVertex3f (p3b.x, p3b.y, p3b.z);
- glVertex3f (p3.x, p3.y, p3.z);
- mi->polygon_count++;
-
- glVertex3f (p1.x, p1.y, p1.z);
- glVertex3f (p2.x, p2.y, p2.z);
- glVertex3f (p2b.x, p2b.y, p2b.z);
- glVertex3f (p1b.x, p1b.y, p1b.z);
- mi->polygon_count++;
-
- glVertex3f (p2.x, p2.y, p2.z);
- glVertex3f (p3.x, p3.y, p3.z);
- glVertex3f (p3b.x, p3b.y, p3b.z);
- glVertex3f (p2b.x, p2b.y, p2b.z);
- mi->polygon_count++;
- glEnd();
-
- /* Inside faces */
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color2);
-
- do_normal (p3.x, p3.y, p3.z,
- p3b.x, p3b.y, p3b.z,
- p1b.x, p1b.y, p1b.z);
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glVertex3f (d * p3.x, d * p3.y, d * p3.z);
- glVertex3f (d * p3b.x, d * p3b.y, d * p3b.z);
- glVertex3f (d * p1b.x, d * p1b.y, d * p1b.z);
- glVertex3f (d * p1.x, d * p1.y, d * p1.z);
- mi->polygon_count++;
-
- glVertex3f (d * p1b.x, d * p1b.y, d * p1b.z);
- glVertex3f (d * p2b.x, d * p2b.y, d * p2b.z);
- glVertex3f (d * p2.x, d * p2.y, d * p2.z);
- glVertex3f (d * p1.x, d * p1.y, d * p1.z);
- mi->polygon_count++;
-
- glVertex3f (d * p2b.x, d * p2b.y, d * p2b.z);
- glVertex3f (d * p3b.x, d * p3b.y, d * p3b.z);
- glVertex3f (d * p3.x, d * p3.y, d * p3.z);
- glVertex3f (d * p2.x, d * p2.y, d * p2.z);
- mi->polygon_count++;
- glEnd();
-
-
- /* Connecting edges */
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color1);
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
-
- do_normal (p1b.x, p1b.y, p1b.z,
- p2b.x, p2b.y, p2b.z,
- p2b.x * d, p2b.y * d, p2b.z * d);
- glVertex3f (p1b.x, p1b.y, p1b.z);
- glVertex3f (p2b.x, p2b.y, p2b.z);
- glVertex3f (p2b.x * d, p2b.y * d, p2b.z * d);
- glVertex3f (p1b.x * d, p1b.y * d, p1b.z * d);
- mi->polygon_count++;
-
- do_normal (p2b.x, p2b.y, p2b.z,
- p3b.x, p3b.y, p3b.z,
- p3b.x * d, p3b.y * d, p3b.z * d);
- glVertex3f (p2b.x, p2b.y, p2b.z);
- glVertex3f (p3b.x, p3b.y, p3b.z);
- glVertex3f (p3b.x * d, p3b.y * d, p3b.z * d);
- glVertex3f (p2b.x * d, p2b.y * d, p2b.z * d);
- mi->polygon_count++;
-
- do_normal (p3b.x, p3b.y, p3b.z,
- p1b.x, p1b.y, p1b.z,
- p1b.x * d, p1b.y * d, p1b.z * d);
- glVertex3f (p3b.x, p3b.y, p3b.z);
- glVertex3f (p1b.x, p1b.y, p1b.z);
- glVertex3f (p1b.x * d, p1b.y * d, p1b.z * d);
- glVertex3f (p3b.x * d, p3b.y * d, p3b.z * d);
- mi->polygon_count++;
- glEnd();
- }
-}
-
-
-/* Renders a triangle specified by 3 polar endpoints.
- */
-static void
-triangle1 (ModeInfo *mi, LL v1, LL v2, LL v3)
-{
- XYZ p1, p2, p3;
-
- p1.x = cos (v1.a) * cos (v1.o);
- p1.y = cos (v1.a) * sin (v1.o);
- p1.z = sin (v1.a);
-
- p2.x = cos (v2.a) * cos (v2.o);
- p2.y = cos (v2.a) * sin (v2.o);
- p2.z = sin (v2.a);
-
- p3.x = cos (v3.a) * cos (v3.o);
- p3.y = cos (v3.a) * sin (v3.o);
- p3.z = sin (v3.a);
-
- triangle0 (mi, p1, p2, p3);
-}
-
-
-/* Computes the midpoint of a line between two polar coords.
- */
-static void
-midpoint2 (LL v1, LL v2, LL *vm_ret,
- XYZ *p1_ret, XYZ *p2_ret, XYZ *pm_ret)
-{
- XYZ p1, p2, pm;
- LL vm;
- GLfloat hyp;
-
- p1.x = cos (v1.a) * cos (v1.o);
- p1.y = cos (v1.a) * sin (v1.o);
- p1.z = sin (v1.a);
-
- p2.x = cos (v2.a) * cos (v2.o);
- p2.y = cos (v2.a) * sin (v2.o);
- p2.z = sin (v2.a);
-
- pm.x = (p1.x + p2.x) / 2;
- pm.y = (p1.y + p2.y) / 2;
- pm.z = (p1.z + p2.z) / 2;
-
- vm.o = atan2 (pm.y, pm.x);
- hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
- vm.a = atan2 (pm.z, hyp);
-
- *p1_ret = p1;
- *p2_ret = p2;
- *pm_ret = pm;
- *vm_ret = vm;
-}
-
-
-/* Computes the midpoint of a triangle specified in polar coords.
- */
-static void
-midpoint3 (LL v1, LL v2, LL v3, LL *vm_ret,
- XYZ *p1_ret, XYZ *p2_ret, XYZ *p3_ret, XYZ *pm_ret)
-{
- XYZ p1, p2, p3, pm;
- LL vm;
- GLfloat hyp;
-
- p1.x = cos (v1.a) * cos (v1.o);
- p1.y = cos (v1.a) * sin (v1.o);
- p1.z = sin (v1.a);
-
- p2.x = cos (v2.a) * cos (v2.o);
- p2.y = cos (v2.a) * sin (v2.o);
- p2.z = sin (v2.a);
-
- p3.x = cos (v3.a) * cos (v3.o);
- p3.y = cos (v3.a) * sin (v3.o);
- p3.z = sin (v3.a);
-
- pm.x = (p1.x + p2.x + p3.x) / 3;
- pm.y = (p1.y + p2.y + p3.y) / 3;
- pm.z = (p1.z + p2.z + p3.z) / 3;
-
- vm.o = atan2 (pm.y, pm.x);
- hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
- vm.a = atan2 (pm.z, hyp);
-
- *p1_ret = p1;
- *p2_ret = p2;
- *p3_ret = p3;
- *pm_ret = pm;
- *vm_ret = vm;
-}
-
-
-/* Renders a triangular geodesic facet to the given depth.
- */
-static void
-triangle (ModeInfo *mi, LL v1, LL v2, LL v3, int depth)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (depth <= 0)
- triangle1 (mi, v1, v2, v3);
- else
- {
- LL v12, v23, v13;
- XYZ p1, p2, p3, p12, p23, p13;
- GLfloat r = bp->morph_ratio;
-
- midpoint2 (v1, v2, &v12, &p1, &p2, &p12);
- midpoint2 (v2, v3, &v23, &p2, &p3, &p23);
- midpoint2 (v1, v3, &v13, &p1, &p3, &p13);
- depth--;
-
- if (depth == 0 &&
- r != 0 &&
- (bp->mode == STELLATED || bp->mode == STELLATED2))
- { /* morph between flat and stellated faces */
- XYZ pc, pc2;
- LL vc;
- midpoint3 (v1, v2, v3, &vc, &p1, &p2, &p3, &pc);
-
- pc2.x = cos (vc.a) * cos (vc.o);
- pc2.y = cos (vc.a) * sin (vc.o);
- pc2.z = sin (vc.a);
-
- pc.x = pc.x + r * (pc2.x - pc.x);
- pc.y = pc.y + r * (pc2.y - pc.y);
- pc.z = pc.z + r * (pc2.z - pc.z);
-
- triangle0 (mi, p1, p2, pc);
- triangle0 (mi, p2, p3, pc);
- triangle0 (mi, p3, p1, pc);
- }
- else if (depth == 0 && r < 1)
- { /* morph between flat and sphere-oid faces */
- XYZ p12b, p23b, p13b;
-
- p12b.x = cos (v12.a) * cos (v12.o);
- p12b.y = cos (v12.a) * sin (v12.o);
- p12b.z = sin (v12.a);
-
- p23b.x = cos (v23.a) * cos (v23.o);
- p23b.y = cos (v23.a) * sin (v23.o);
- p23b.z = sin (v23.a);
-
- p13b.x = cos (v13.a) * cos (v13.o);
- p13b.y = cos (v13.a) * sin (v13.o);
- p13b.z = sin (v13.a);
-
- p12.x = p12.x + r * (p12b.x - p12.x);
- p12.y = p12.y + r * (p12b.y - p12.y);
- p12.z = p12.z + r * (p12b.z - p12.z);
-
- p23.x = p23.x + r * (p23b.x - p23.x);
- p23.y = p23.y + r * (p23b.y - p23.y);
- p23.z = p23.z + r * (p23b.z - p23.z);
-
- p13.x = p13.x + r * (p13b.x - p13.x);
- p13.y = p13.y + r * (p13b.y - p13.y);
- p13.z = p13.z + r * (p13b.z - p13.z);
-
- triangle0 (mi, p1, p12, p13);
- triangle0 (mi, p12, p2, p23);
- triangle0 (mi, p13, p23, p3);
- triangle0 (mi, p12, p23, p13);
- }
- else
- {
- triangle (mi, v1, v12, v13, depth);
- triangle (mi, v12, v2, v23, depth);
- triangle (mi, v13, v23, v3, depth);
- triangle (mi, v12, v23, v13, depth);
- }
- }
-}
-
-
-/* Renders a geodesic sphere to the given depth (frequency).
- */
-static void
-make_geodesic (ModeInfo *mi, int depth)
-{
- GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
- GLfloat s = M_PI / 5; /* lon division: 72 deg */
- int i;
-
- for (i = 0; i < 10; i++)
- {
- GLfloat th1 = s * i;
- GLfloat th2 = s * (i+1);
- GLfloat th3 = s * (i+2);
- LL v1, v2, v3, vc;
- v1.a = th0; v1.o = th1;
- v2.a = th0; v2.o = th3;
- v3.a = -th0; v3.o = th2;
- vc.a = M_PI/2; vc.o = th2;
-
- if (i & 1) /* north */
- {
- triangle (mi, v1, v2, vc, depth);
- triangle (mi, v2, v1, v3, depth);
- }
- else /* south */
- {
- v1.a = -v1.a;
- v2.a = -v2.a;
- v3.a = -v3.a;
- vc.a = -vc.a;
- triangle (mi, v2, v1, vc, depth);
- triangle (mi, v1, v2, v3, depth);
- }
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_geodesic (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-
-ENTRYPOINT void
-init_geodesic (ModeInfo *mi)
-{
- geodesic_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- /* This comes first because it sets wire. */
- if (!mode_str || !*mode_str)
- mode_str = DEF_MODE;
- if (!strcasecmp(mode_str, "random")) {
- bp->random_p = 1;
- bp->mode = MESH + (random() % (STELLATED2 - MESH + 1));
- } else if (!strcasecmp(mode_str, "mesh")) {
- bp->mode = MESH;
- } else if (!strcasecmp(mode_str, "solid")) {
- bp->mode = SOLID;
- } else if (!strcasecmp(mode_str, "stellated")) {
- bp->mode = STELLATED;
- } else if (!strcasecmp(mode_str, "stellated2")) {
- bp->mode = STELLATED2;
- } else if (!strcasecmp(mode_str, "wire")) {
- bp->mode = WIRE;
- MI_IS_WIREFRAME(mi) = wire = 1;
- } else {
- fprintf (stderr, "%s: unknown mode: %s\n", progname, mode_str);
- exit (1);
- }
-
-
- {
- static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat shiny = 128.0;
-
- static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
- glMateriali (GL_FRONT, GL_SHININESS, shiny);
-
- glLineWidth (3);
- }
-
- if (! wire)
- {
- glEnable (GL_DEPTH_TEST);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- /* Actually this looks pretty good in -wire with lighting! */
- glEnable (GL_LIGHTING);
- glEnable (GL_LIGHT0);
-
- if (! bp->rot)
- {
- double spin_speed = 0.25 * speed;
- double wander_speed = 0.01 * speed;
- double spin_accel = 0.2;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- bp->trackball = gltrackball_init (True);
- }
-
- if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1;
-
- bp->ncolors = 1024;
- if (! bp->colors)
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
- bp->ccolor = 0;
- bp->depth = 1; /* start 1 up from the icosahedron */
- bp->delta = 0.003;
-
-#if 0
- bp->thickness = 1;
- bp->thickdelta = 0.0007;
-#else
- bp->thickness = 0.1;
- bp->thickdelta = 0;
-#endif
-}
-
-
-ENTRYPOINT Bool
-geodesic_handle_event (ModeInfo *mi, XEvent *event)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- mode_str = "random";
- init_geodesic (mi);
- return True;
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-draw_geodesic (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (! wire)
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 15);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- bp->color1[0] = bp->colors[bp->ccolor].red / 65536.0;
- bp->color1[1] = bp->colors[bp->ccolor].green / 65536.0;
- bp->color1[2] = bp->colors[bp->ccolor].blue / 65536.0;
- bp->color1[3] = 1;
-
- bp->color2[0] = bp->colors[bp->ccolor2].red / 65536.0;
- bp->color2[1] = bp->colors[bp->ccolor2].green / 65536.0;
- bp->color2[2] = bp->colors[bp->ccolor2].blue / 65536.0;
- bp->color2[3] = 1;
-
- bp->ccolor = (bp->ccolor + 1) % bp->ncolors;
- bp->ccolor2 = (bp->ccolor + bp->ncolors / 2) % bp->ncolors;
-
- mi->polygon_count = 0;
-
- glScalef (10, 10, 10);
-
- {
- GLfloat r = bp->depth - floor(bp->depth);
- GLfloat alpha, morph1, morph2;
- int d1, d2;
-
- /* Two ranges: first for fading in the new segments.
- Second for morphing the segments into position.
- */
- GLfloat range = 0.15;
- GLfloat min1 = (0.5 - range) / 2;
- GLfloat max1 = 0.5 - min1;
- GLfloat min2 = 0.5 + min1;
- GLfloat max2 = 0.5 + max1;
-
- if (r < min1) /* old alone */
- {
- d1 = d2 = floor (bp->depth);
- morph1 = morph2 = 1;
- alpha = 1;
- }
- else if (r < max1 && /* fade to new flat */
- (bp->mode == MESH ||
- bp->mode == STELLATED ||
- bp->mode == STELLATED2))
- {
- d1 = floor (bp->depth);
- d2 = ceil (bp->depth);
- morph1 = 1;
- morph2 = 0;
- alpha = (r - min1) / (max1 - min1);
-
- if (bp->mode == STELLATED || bp->mode == STELLATED2)
- {
- morph1 = 1 - alpha; /* de-stellate while fading out */
- morph1 = 2 * (morph1 - 0.5); /* do it faster */
- if (morph1 < 0) morph1 = 0;
- }
- }
- else if (r < min2) /* new flat */
- {
- d1 = d2 = ceil (bp->depth);
- morph1 = morph2 = 0;
- alpha = 1;
- }
- else if (r < max2) /* morph */
- {
- d1 = d2 = ceil (bp->depth);
- morph1 = morph2 = (r - min2) / (max2 - min2);
- alpha = 1;
- }
- else /* new alone */
- {
- d1 = d2 = ceil (bp->depth);
- morph1 = morph2 = 1;
- alpha = 1;
- }
-
- mi->recursion_depth = d2 + r;
-
- if (bp->mode == STELLATED2)
- {
- morph1 = -morph1;
- morph2 = -morph2;
- }
-
- if (d1 != d2)
- {
- if (alpha > 0.5) /* always draw the more transparent one first */
- {
- int s1; GLfloat s2;
- s1 = d1; d1 = d2; d2 = s1;
- s2 = morph1; morph1 = morph2; morph2 = s2;
- alpha = 1 - alpha;
- }
- bp->color1[3] = 1 - alpha;
- bp->color2[3] = 1 - alpha;
-
- if (! wire)
- glDisable (GL_POLYGON_OFFSET_FILL);
-
- bp->morph_ratio = morph1;
- make_geodesic (mi, d1);
-
- /* Make the less-transparent object take precedence */
- if (!wire)
- {
- glEnable (GL_POLYGON_OFFSET_FILL);
- glPolygonOffset (1.0, 1.0);
- }
- }
-
- bp->color1[3] = alpha;
- bp->color2[3] = alpha;
-
- bp->morph_ratio = morph2;
- make_geodesic (mi, d2);
- }
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-
-
- if (! bp->button_down_p)
- {
- bp->depth += speed * bp->delta;
- bp->thickness += speed * bp->thickdelta;
-
- if (bp->depth > MI_COUNT(mi)-1)
- {
- bp->depth = MI_COUNT(mi)-1;
- bp->delta = -fabs (bp->delta);
- }
- else if (bp->depth < 0)
- {
- bp->depth = 0;
- bp->delta = fabs (bp->delta);
-
- /* Randomize the mode again when we hit the bottom state.
- #### I wish this did a fade instead of a jump-cut.
- */
- if (bp->random_p)
- bp->mode = MESH + (random() % (STELLATED2 - MESH + 1));
- }
-
- if (bp->thickness > 1)
- {
- bp->thickness = 1;
- bp->thickdelta = -fabs (bp->thickdelta);
- }
- else if (bp->thickness < 0)
- {
- bp->thickness = 0;
- bp->thickdelta = fabs (bp->thickdelta);
- }
- }
-}
-
-
-ENTRYPOINT void
-free_geodesic (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->colors) free (bp->colors);
-}
-
-XSCREENSAVER_MODULE ("Geodesic", geodesic)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/geodesic.man b/hacks/glx/geodesic.man
deleted file mode 100644
index a9f5f70..0000000
--- a/hacks/glx/geodesic.man
+++ /dev/null
@@ -1,79 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-geodesic \- animates a mesh geodesic sphere.
-.SH SYNOPSIS
-.B geodesic
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-mode \fImode\fP]
-[\-no-wander]
-[\-no-spin]
-[\-fps]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-count \fInumber\fP]
-.SH DESCRIPTION
-Animates a mesh geodesic sphere of increasing and decreasing complexity. A
-geodesic sphere is an icosohedron whose equilateral faces are sub-divided
-into non-equilateral triangles to more closely approximate a sphere.
-
-The animation shows the equilateral triangles subdivided into four
-coplanar equilateral triangles; and then inflated outward, causing the
-sub-triangles to no longer be equilateral, but to more closely
-approximate the surface of a sphere.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mode mesh | solid | stellated | stellated2 | wire
-Face/edge display style. Default mesh.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the object should spin.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-count \fInumber\fP
-Depth (frequency) of the geodesic sphere. Default: 4.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2013 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/geodesicgears.c b/hacks/glx/geodesicgears.c
deleted file mode 100644
index 146b835..0000000
--- a/hacks/glx/geodesicgears.c
+++ /dev/null
@@ -1,1801 +0,0 @@
-/* geodesicgears, Copyright (c) 2014-2015 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Inspired by http://bugman123.com/Gears/
- * and by http://kennethsnelson.net/PortraitOfAnAtom.pdf
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 4 \n" \
- "*wireframe: False \n" \
- "*showFPS: False \n" \
- "*texFontCacheSize: 100 \n" \
- "*suppressRotationAnimation: True\n" \
- "*font: sans-serif 16\n" \
-
-# define release_geodesic 0
-
-#include "xlockmore.h"
-#include "involute.h"
-#include "colors.h"
-#include "normals.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-#include "texfont.h"
-
-
-#ifdef USE_GL /* whole file */
-
-#include "gllist.h"
-
-#define DEF_SPIN "True"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_LABELS "False"
-#define DEF_NUMBERS "False"
-#define DEF_TIMEOUT "20"
-
-typedef struct { double a, o; } LL; /* latitude + longitude */
-
-/* 10:6 is a mismesh. */
-
-static const struct {
- enum { PRISM, OCTO, DECA, G14, G18, G32, G92, G182 } type;
- const GLfloat args[5];
-} gear_templates[] = {
- { PRISM },
- { OCTO },
- { DECA },
- { G14 },
- { G18 },
- { G32, { 15, 6, 0.4535 }}, /* teeth1, teeth2, radius1 */
- { G32, { 15, 12, 0.3560 }},
- { G32, { 20, 6, 0.4850 }},
- { G32, { 20, 12, 0.3995 }}, /* double of 10:6 */
- { G32, { 20, 18, 0.3375 }},
- { G32, { 25, 6, 0.5065 }},
- { G32, { 25, 12, 0.4300 }},
- { G32, { 25, 18, 0.3725 }},
- { G32, { 25, 24, 0.3270 }},
- { G32, { 30, 12, 0.4535 }}, /* double of 15:6 */
- { G32, { 30, 18, 0.3995 }},
- { G32, { 30, 24, 0.3560 }}, /* double of 15:12 */
- { G32, { 30, 30, 0.3205 }},
- { G32, { 35, 12, 0.4710 }},
- { G32, { 35, 18, 0.4208 }},
- { G32, { 35, 24, 0.3800 }},
- { G32, { 35, 30, 0.3450 }},
- { G32, { 35, 36, 0.3160 }},
- { G32, { 40, 12, 0.4850 }}, /* double of 20:6 */
- { G32, { 40, 24, 0.3995 }}, /* double of 10:6, 20:12 */
-/*{ G32, { 40, 36, 0.3375 }},*/ /* double of 20:18 */
- { G32, { 50, 12, 0.5065 }}, /* double of 25:6 */
- { G32, { 50, 24, 0.4300 }}, /* double of 25:12 */
-
- /* These all have phase errors and don't always mesh properly.
- Maybe we should just omit them? */
-
- { G92, { 35, 36, 16, 0.2660, 0.366 }}, /* teeth1, 2, 3, r1, pitch3 */
- { G92, { 25, 36, 11, 0.2270, 0.315 }},
-/*{ G92, { 15, 15, 8, 0.2650, 0.356 }},*/
-/*{ G92, { 20, 21, 8, 0.2760, 0.355 }},*/
- { G92, { 25, 27, 16, 0.2320, 0.359 }},
- { G92, { 20, 36, 11, 0.1875, 0.283 }},
- { G92, { 30, 30, 16, 0.2585, 0.374 }}, /* double of 15:15:8 */
- { G92, { 20, 33, 11, 0.1970, 0.293 }},
-/*{ G92, { 10, 12, 8, 0.2030, 0.345 }},*/
- { G92, { 30, 33, 16, 0.2455, 0.354 }},
-/*{ G92, { 25, 24, 8, 0.3050, 0.375 }},*/
- { G92, { 20, 24, 16, 0.2030, 0.346 }},
-};
-
-
-typedef struct sphere_gear sphere_gear;
-struct sphere_gear {
- int id; /* name, for debugging */
- XYZ axis; /* the vector on which this gear's axis lies */
- int direction; /* rotation, +1 or -1 */
- GLfloat offset; /* rotational degrees from parent gear */
- sphere_gear *parent; /* gear driving this one, or 0 for root */
- sphere_gear **children; /* gears driven by this one (no loops) */
- sphere_gear **neighbors; /* gears touching this one (circular!) */
- int nchildren, children_size;
- int nneighbors, neighbors_size;
- const gear *g; /* shape of this gear (shared) */
-};
-
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- int ncolors;
- XColor *colors;
- GLfloat color1[4], color2[4];
- texture_font_data *font;
-
- int nshapes, shapes_size; /* how many 'gear' objects there are */
- int ngears, gears_size; /* how many 'sphere_gear' objects there are */
- gear *shapes;
- sphere_gear *gears;
-
- int which;
- int mode; /* 0 = normal, 1 = out, 2 = in */
- int mode_tick;
- int next; /* 0 = random, -1 = back, 1 = forward */
- time_t draw_time;
- int draw_tick;
- char *desc;
-
- GLfloat th; /* rotation of the root sphere_gear in degrees. */
-
-} geodesic_configuration;
-
-static geodesic_configuration *bps = NULL;
-
-static int timeout;
-static Bool do_spin;
-static GLfloat speed;
-static Bool do_wander;
-static Bool do_labels;
-static Bool do_numbers;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionNoArg, "True" },
- { "+spin", ".spin", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-labels", ".labels", XrmoptionNoArg, "True" },
- { "+labels", ".labels", XrmoptionNoArg, "False" },
- { "-numbers", ".numbers",XrmoptionNoArg, "True" },
- { "+numbers", ".numbers",XrmoptionNoArg, "False" },
- { "-timeout", ".timeout",XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
- {&do_numbers,"numbers","Numbers",DEF_NUMBERS,t_Bool},
- {&timeout, "timeout","Seconds",DEF_TIMEOUT,t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt geodesic_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-
-
-static XYZ
-cross_product (XYZ a, XYZ b)
-{
- XYZ c;
- c.x = (a.y * b.z) - (a.z * b.y);
- c.y = (a.z * b.x) - (a.x * b.z);
- c.z = (a.x * b.y) - (a.y * b.x);
- return c;
-}
-
-
-static GLfloat
-dot_product (XYZ a, XYZ b)
-{
- return (a.x * b.x) + (a.y * b.y) + (a.z * b.z);
-}
-
-
-static XYZ
-normalize (XYZ v)
-{
- GLfloat d = sqrt ((v.x * v.x) + (v.y * v.y) + (v.z * v.z));
- if (d == 0)
- v.x = v.y = v.z = 0;
- else
- {
- v.x /= d;
- v.y /= d;
- v.z /= d;
- }
- return v;
-}
-
-
-static XYZ
-polar_to_cartesian (LL v)
-{
- XYZ p;
- p.x = cos (v.a) * cos (v.o);
- p.y = cos (v.a) * sin (v.o);
- p.z = sin (v.a);
- return p;
-}
-
-
-
-
-static gear *
-add_gear_shape (ModeInfo *mi, GLfloat radius, int teeth)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- gear *g;
- int i;
-
- if (bp->nshapes >= bp->shapes_size - 1)
- {
- bp->shapes_size = bp->shapes_size * 1.2 + 4;
- bp->shapes = (gear *)
- realloc (bp->shapes, bp->shapes_size * sizeof(*bp->shapes));
- }
- g = &bp->shapes[bp->nshapes++];
-
- memset (g, 0, sizeof(*g));
-
- g->r = radius;
- g->nteeth = teeth;
- g->ratio = 1;
-
- g->tooth_h = g->r / (teeth * 0.4);
-
- if (g->tooth_h > 0.06) /* stubbier teeth when small tooth count. */
- g->tooth_h *= 0.6;
-
- g->thickness = 0.05 + BELLRAND(0.15);
- g->thickness2 = g->thickness / 4;
- g->thickness3 = g->thickness;
- g->size = wire ? INVOLUTE_SMALL : INVOLUTE_LARGE;
-
- /* Move the disc's origin inward to make the edge of the disc be tangent
- to the unit sphere. */
- g->z = 1 - sqrt (1 - (g->r * g->r));
-
- /* #### This isn't quite right */
- g->tooth_slope = 1 + ((g->z * 2) / g->r);
-
-
- /* Decide on shape of gear interior:
- - just a ring with teeth;
- - that, plus a thinner in-set "plate" in the middle;
- - that, plus a thin raised "lip" on the inner plate;
- - or, a wide lip (really, a thicker third inner plate.)
- */
- if (wire)
- ;
- else if ((random() % 10) == 0)
- {
- /* inner_r can go all the way in; there's no inset disc. */
- g->inner_r = (g->r * 0.3) + frand((g->r - g->tooth_h/2) * 0.6);
- g->inner_r2 = 0;
- g->inner_r3 = 0;
- }
- else
- {
- /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
- g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
- g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
- g->inner_r3 = 0;
-
- if (g->inner_r2 > (g->r * 0.2))
- {
- int nn = (random() % 10);
- if (nn <= 2)
- g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
- else if (nn <= 7 && g->inner_r2 >= 0.1)
- g->inner_r3 = g->inner_r2 - 0.01;
- }
- }
-
- /* If we have three discs, sometimes make the middle disc be spokes.
- */
- if (g->inner_r3 && ((random() % 5) == 0))
- {
- g->spokes = 2 + BELLRAND (5);
- g->spoke_thickness = 1 + frand(7.0);
- if (g->spokes == 2 && g->spoke_thickness < 2)
- g->spoke_thickness += 1;
- }
-
- /* Sometimes add little nubbly bits, if there is room.
- */
- if (!wire && g->nteeth > 5)
- {
- double size = 0;
- involute_biggest_ring (g, 0, &size, 0);
- if (size > g->r * 0.2 && (random() % 5) == 0)
- {
- g->nubs = 1 + (random() % 16);
- if (g->nubs > 8) g->nubs = 1;
- }
- }
-
- /* Decide how complex the polygon model should be.
- */
- {
- double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
- if (pix <= 4) g->size = INVOLUTE_SMALL;
- else if (pix <= 8) g->size = INVOLUTE_MEDIUM;
- else if (pix <= 30) g->size = INVOLUTE_LARGE;
- else g->size = INVOLUTE_HUGE;
- }
-
- if (g->inner_r3 > g->inner_r2) abort();
- if (g->inner_r2 > g->inner_r) abort();
- if (g->inner_r > g->r) abort();
-
- i = random() % bp->ncolors;
- g->color[0] = bp->colors[i].red / 65536.0;
- g->color[1] = bp->colors[i].green / 65536.0;
- g->color[2] = bp->colors[i].blue / 65536.0;
- g->color[3] = 1;
-
- i = (i + bp->ncolors / 2) % bp->ncolors;
- g->color2[0] = bp->colors[i].red / 65536.0;
- g->color2[1] = bp->colors[i].green / 65536.0;
- g->color2[2] = bp->colors[i].blue / 65536.0;
- g->color2[3] = 1;
-
- g->dlist = glGenLists (1);
- glNewList (g->dlist, GL_COMPILE);
-
-#if 1
- {
- gear G, *g2 = &G;
- *g2 = *g;
-
- /* Move the gear inward so that its outer edge is on the disc, instead
- of its midpoint. */
- g2->z += g2->thickness/2;
-
- /* 'radius' is at the surface but 'g->r' is at the center, so we need
- to reverse the slope computation that involute.c does. */
- g2->r /= (1 + (g2->thickness * g2->tooth_slope / 2));
-
- glPushMatrix();
- glTranslatef(g2->x, g2->y, -g2->z);
-
- /* Line up the center of the point of tooth 0 with "up". */
- glRotatef (90, 0, 0, 1);
- glRotatef (180, 0, 1, 0);
- glRotatef (-360.0 / g2->nteeth / 4, 0, 0, 1);
-
- g->polygons = draw_involute_gear (g2, wire);
- glPopMatrix();
- }
-# else /* draw discs */
- {
- glPushMatrix();
- glTranslatef(g->x, g->y, -g->z);
- glLineWidth (2);
- glFrontFace (GL_CCW);
- glNormal3f(0, 0, 1);
- glColor3f(0, 0, 0);
- glDisable (GL_LIGHTING);
-
- glBegin(GL_LINES);
- glVertex3f (0, 0, 0);
- glVertex3f (0, radius, 0);
- glEnd();
-
- glColor3f(0.5, 0.5, 0.5);
- glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
- {
- GLfloat th;
- GLfloat step = M_PI * 2 / 128;
- /* radius *= 1.005; */
- glVertex3f (0, 0, 0);
- for (th = 0; th < M_PI * 2 + step; th += step)
- {
- GLfloat x = cos(th) * radius;
- GLfloat y = sin(th) * radius;
- glVertex3f (x, y, 0);
- }
- }
- glEnd();
- if (!wire) glEnable(GL_LIGHTING);
- glPopMatrix();
- }
-# endif /* 0 */
-
- glEndList ();
-
- return g;
-}
-
-
-static void
-add_sphere_gear (ModeInfo *mi, gear *g, XYZ axis)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- sphere_gear *gg;
- int i;
-
- axis = normalize (axis);
-
- /* If there's already a gear on this axis, don't duplicate it. */
- for (i = 0; i < bp->ngears; i++)
- {
- XYZ o = bp->gears[i].axis;
- if (o.x == axis.x && o.y == axis.y && o.z == axis.z)
- return;
- }
-
- if (bp->ngears >= bp->gears_size - 1)
- {
- bp->gears_size = bp->gears_size * 1.2 + 10;
- bp->gears = (sphere_gear *)
- realloc (bp->gears, bp->gears_size * sizeof(*bp->gears));
- }
-
- gg = &bp->gears[bp->ngears];
- memset (gg, 0, sizeof(*gg));
- gg->id = bp->ngears;
- gg->axis = axis;
- gg->direction = 0;
- gg->g = g;
- bp->ngears++;
-}
-
-
-static void
-free_sphere_gears (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < bp->nshapes; i++)
- {
- if (bp->shapes[i].dlist)
- glDeleteLists (bp->shapes[i].dlist, 1);
- }
- free (bp->shapes);
- bp->nshapes = 0;
- bp->shapes_size = 0;
- bp->shapes = 0;
-
- for (i = 0; i < bp->ngears; i++)
- {
- sphere_gear *g = &bp->gears[i];
- if (g->children)
- free (g->children);
- if (g->neighbors)
- free (g->neighbors);
- }
- free (bp->gears);
- bp->ngears = 0;
- bp->gears_size = 0;
- bp->gears = 0;
-}
-
-
-
-/* Is the gear a member of the list?
- */
-static Bool
-gear_list_member (sphere_gear *g, sphere_gear **list, int count)
-{
- int i;
- for (i = 0; i < count; i++)
- if (list[i] == g) return True;
- return False;
-}
-
-
-/* Add the gear to the list, resizing it as needed.
- */
-static void
-gear_list_push (sphere_gear *g,
- sphere_gear ***listP,
- int *countP, int *sizeP)
-{
- if (*countP >= (*sizeP) - 1)
- {
- *sizeP = (*sizeP) * 1.2 + 4;
- *listP = (sphere_gear **) realloc (*listP, (*sizeP) * sizeof(**listP));
- }
- (*listP)[*countP] = g;
- (*countP)++;
-}
-
-
-/* Mark child and parent as being mutual neighbors.
- */
-static void
-link_neighbors (sphere_gear *parent, sphere_gear *child)
-{
- if (child == parent) abort();
-
- /* Add child to parent's list of neighbors */
- if (! gear_list_member (child, parent->neighbors, parent->nneighbors))
- {
- gear_list_push (child,
- &parent->neighbors,
- &parent->nneighbors,
- &parent->neighbors_size);
- /* fprintf(stderr, "neighbor %2d -> %2d (%d)\n", parent->id, child->id,
- parent->nneighbors); */
- }
-
- /* Add parent to child's list of neighbors */
- if (! gear_list_member (parent, child->neighbors, child->nneighbors))
- {
- gear_list_push (parent,
- &child->neighbors,
- &child->nneighbors,
- &child->neighbors_size);
- /* fprintf(stderr, "neighbor %2d <- %2d\n", parent->id, child->id); */
- }
-}
-
-/* Mark child as having parent, and vice versa.
- */
-static void
-link_child (sphere_gear *parent, sphere_gear *child)
-{
- if (child == parent) abort();
- if (child->parent) return;
-
- gear_list_push (child,
- &parent->children,
- &parent->nchildren,
- &parent->children_size);
- child->parent = parent;
- /* fprintf(stderr, "child %2d -> %2d (%d)\n", parent->id, child->id,
- parent->nchildren); */
-}
-
-
-
-static void link_children (sphere_gear *);
-
-static void
-link_children (sphere_gear *parent)
-{
- int i;
-# if 1 /* depth first */
- for (i = 0; i < parent->nneighbors; i++)
- {
- sphere_gear *child = parent->neighbors[i];
- if (! child->parent)
- {
- link_child (parent, child);
- link_children (child);
- }
- }
-# else /* breadth first */
- for (i = 0; i < parent->nneighbors; i++)
- {
- sphere_gear *child = parent->neighbors[i];
- if (! child->parent)
- link_child (parent, child);
- }
- for (i = 0; i < parent->nchildren; i++)
- {
- sphere_gear *child = parent->children[i];
- link_children (child);
- }
-# endif
-}
-
-
-
-/* Whether the two gears touch.
- */
-static Bool
-gears_touch_p (ModeInfo *mi, sphere_gear *a, sphere_gear *b)
-{
- /* We need to know if the two discs on the surface overlap.
-
- Find the angle between the axis of each disc, and a point on its edge:
- the axis between the hypotenuse and adjacent of a right triangle between
- the disc's radius and the origin.
-
- R
- _____
- |_| /
- | /
- 1 | /
- |t/ t = asin(R)
- |/
-
- Find the angle between the axes of the two discs.
-
- |
- | / angle = acos (v1 dot v2)
- 1 | / axis = v1 cross v2
- | / 1
- | /
- |/
-
- If the sum of the first two angles is less than the third angle,
- they touch.
- */
- XYZ p1 = a->axis;
- XYZ p2 = b->axis;
- double t1 = asin (a->g->r);
- double t2 = asin (b->g->r);
- double th = acos (dot_product (p1, p2));
-
- return (t1 + t2 >= th);
-}
-
-
-/* Set the rotation direction for the gear and its kids.
- */
-static void
-orient_gears (ModeInfo *mi, sphere_gear *g)
-{
- int i;
- if (g->parent)
- g->direction = -g->parent->direction;
- for (i = 0; i < g->nchildren; i++)
- orient_gears (mi, g->children[i]);
-}
-
-
-/* Returns the global model coordinates of the given tooth of a gear.
- */
-static XYZ
-tooth_coords (const sphere_gear *s, int tooth)
-{
- const gear *g = s->g;
- GLfloat off = s->offset * (M_PI / 180) * g->ratio * s->direction;
- GLfloat th = (tooth * M_PI * 2 / g->nteeth) - off;
- XYZ axis;
- GLfloat angle;
- XYZ from = { 0, 1, 0 };
- XYZ to = s->axis;
- XYZ p0, p1, p2;
- GLfloat x, y, z, C, S, m[4][4];
-
- axis = cross_product (from, to);
- angle = acos (dot_product (from, to));
-
- p0 = normalize (axis);
- x = p0.x;
- y = p0.y;
- z = p0.z;
- C = cos(angle);
- S = sin(angle);
-
- /* this is what glRotatef does */
- m[0][0] = x*x * (1 - C) + C;
- m[1][0] = x*y * (1 - C) - z*S;
- m[2][0] = x*z * (1 - C) + y*S;
- m[3][0] = 0;
-
- m[0][1] = y*x * (1 - C) + z*S;
- m[1][1] = y*y * (1 - C) + C;
- m[2][1] = y*z * (1 - C) - x*S;
- m[3][1] = 0;
-
- m[0][2] = x*z * (1 - C) - y*S;
- m[1][2] = y*z * (1 - C) + x*S;
- m[2][2] = z*z * (1 - C) + C;
- m[3][2] = 0;
-
- m[0][3] = 0;
- m[1][3] = 0;
- m[2][3] = 0;
- m[3][3] = 1;
-
- /* The point to transform */
- p1.x = g->r * sin (th);
- p1.z = g->r * cos (th);
- p1.y = 1 - g->z;
- p1 = normalize (p1);
-
- /* transformation result */
- p2.x = p1.x * m[0][0] + p1.y * m[1][0] + p1.z * m[2][0] + m[3][0];
- p2.y = p1.x * m[0][1] + p1.y * m[1][1] + p1.z * m[2][1] + m[3][1];
- p2.z = p1.x * m[0][2] + p1.y * m[1][2] + p1.z * m[2][2] + m[3][2];
-
- return p2;
-}
-
-
-/* Returns the number of the tooth of the first gear that is closest
- to any tooth of its parent. Also the position of the parent tooth.
- */
-static int
-parent_tooth (const sphere_gear *s, XYZ *parent)
-{
- const sphere_gear *s2 = s->parent;
- int i, j;
- GLfloat min_dist = 99999;
- int min_tooth = 0;
- XYZ min_parent = { 0, 0, 0 };
-
- if (s2)
- for (i = 0; i < s->g->nteeth; i++)
- {
- XYZ p1 = tooth_coords (s, i);
- for (j = 0; j < s2->g->nteeth; j++)
- {
- XYZ p2 = tooth_coords (s2, j);
- XYZ d;
- GLfloat dist;
- d.x = p1.x - p2.x;
- d.y = p1.y - p2.y;
- d.z = p1.z - p2.z;
-
- dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
- if (dist < min_dist)
- {
- min_dist = dist;
- min_parent = p2;
- min_tooth = i;
- }
- }
- }
- *parent = min_parent;
- return min_tooth;
-}
-
-
-/* Make all of the gear's children's teeth mesh properly.
- */
-static void align_gear_teeth (sphere_gear *s);
-static void
-align_gear_teeth (sphere_gear *s)
-{
- int i;
- XYZ pc;
-
- if (s->parent)
- {
- /* Iterate this gear's offset until we find a value for it that
- minimizes the distance between this gear's parent-pointing
- tooth, and the corresponding tooth on the parent.
- */
- int pt = parent_tooth (s, &pc);
- GLfloat range = 360 / s->g->nteeth;
- GLfloat steps = 64;
- GLfloat min_dist = 999999;
- GLfloat min_off = 0;
- GLfloat off;
-
- for (off = -range/2; off < range/2; off += range/steps)
- {
- XYZ tc, d;
- GLfloat dist;
- s->offset = off;
- tc = tooth_coords (s, pt);
- d.x = pc.x - tc.x;
- d.y = pc.y - tc.y;
- d.z = pc.z - tc.z;
- dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
- if (dist < min_dist)
- {
- min_dist = dist;
- min_off = off;
- }
- }
-
- s->offset = min_off;
- }
-
- /* Now do the children. We have to do it in parent/child order because
- the offset we just computed for the parent affects everyone downstream.
- */
- for (i = 0; i < s->nchildren; i++)
- align_gear_teeth (s->children[i]);
-}
-
-
-
-static void
-describe_gears (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- int gears_per_teeth[1000];
- int i;
- int lines = 0;
- memset (gears_per_teeth, 0, sizeof(gears_per_teeth));
- for (i = 0; i < bp->ngears; i++)
- gears_per_teeth[bp->gears[i].g->nteeth]++;
- if (bp->desc) free (bp->desc);
- bp->desc = (char *) malloc (80 * bp->ngears);
- *bp->desc = 0;
- for (i = 0; i < countof(gears_per_teeth); i++)
- if (gears_per_teeth[i])
- {
- sprintf (bp->desc + strlen(bp->desc),
- "%s%d gears with %d teeth",
- (lines > 0 ? ",\n" : ""),
- gears_per_teeth[i], i);
- lines++;
- }
- if (lines > 1)
- sprintf (bp->desc + strlen(bp->desc), ",\n%d gears total", bp->ngears);
- strcat (bp->desc, ".");
-}
-
-
-/* Takes the gears and makes an arbitrary DAG of them in order to compute
- direction and gear ratios.
- */
-static void
-sort_gears (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- sphere_gear *root = 0;
- int i, j;
-
- /* For each gear, compare it against every other gear.
- If they touch, mark them as being each others' neighbors.
- */
- for (i = 0; i < bp->ngears; i++)
- {
- sphere_gear *a = &bp->gears[i];
- for (j = 0; j < bp->ngears; j++)
- {
- sphere_gear *b = &bp->gears[j];
- if (a == b) continue;
- if (gears_touch_p (mi, a, b))
- link_neighbors (a, b);
- }
- }
-
- bp->gears[0].parent = &bp->gears[0]; /* don't give this one a parent */
- link_children (&bp->gears[0]);
- bp->gears[0].parent = 0;
-
-
-# if 0
- for (i = 0; i < bp->ngears; i++)
- {
- fprintf (stderr, "%2d: p = %2d; k(%d, %d) = ",
- i,
- bp->gears[i].parent ? bp->gears[i].parent->id : -1,
- bp->gears[i].nneighbors,
- bp->gears[i].nchildren);
- for (j = 0; j < bp->gears[i].nneighbors; j++)
- fprintf (stderr, "%2d ", (int) bp->gears[i].neighbors[j]->id);
- fprintf (stderr, "\t\t");
- if (j < 5) fprintf (stderr, "\t");
- for (j = 0; j < bp->gears[i].nchildren; j++)
- fprintf (stderr, "%2d ", (int) bp->gears[i].children[j]->id);
- fprintf (stderr,"\n");
- }
- fprintf (stderr,"\n");
-# endif /* 0 */
-
-
- /* If there is more than one gear with no parent, we fucked up. */
-
- root = 0;
- for (i = 0; i < bp->ngears; i++)
- {
- sphere_gear *g = &bp->gears[i];
- if (!g->parent)
- root = g;
- }
-
- if (! root) abort();
-
- root->direction = 1;
- orient_gears (mi, root);
-
- /* If there are any gears with no direction, they aren't reachable. */
- for (i = 0; i < bp->ngears; i++)
- {
- sphere_gear *g = &bp->gears[i];
- if (g->direction == 0)
- fprintf(stderr,"INTERNAL ERROR: unreachable: %d\n", g->id);
- }
-
- align_gear_teeth (root);
- describe_gears (mi);
-}
-
-
-/* Create 5 identical gears arranged on the faces of a uniform
- triangular prism.
- */
-static void
-make_prism (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- gear *g;
- XYZ a;
- int i;
- int teeth = 4 * (4 + (int) (BELLRAND(20)));
- if (teeth % 4) abort(); /* must be a multiple of 4 */
-
- g = add_gear_shape (mi, 0.7075, teeth);
-
- a.x = 0; a.y = 0; a.z = 1;
- add_sphere_gear (mi, g, a);
- a.z = -1;
- add_sphere_gear (mi, g, a);
-
- a.z = 0;
- for (i = 0; i < 3; i++)
- {
- GLfloat th = i * M_PI * 2 / 3;
- a.x = cos (th);
- a.y = sin (th);
- add_sphere_gear (mi, g, a);
- }
-
- if (bp->ngears != 5) abort();
-}
-
-
-/* Create 8 identical gears arranged on the faces of an octohedron
- (or alternately, arranged on the diagonals of a cube.)
- */
-static void
-make_octo (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- static const XYZ verts[] = {{ -1, -1, -1 },
- { -1, -1, 1 },
- { -1, 1, 1 },
- { -1, 1, -1 },
- { 1, -1, 1 },
- { 1, -1, -1 },
- { 1, 1, -1 },
- { 1, 1, 1 }};
- gear *g;
- int i;
- int teeth = 4 * (4 + (int) (BELLRAND(20)));
- if (teeth % 4) abort(); /* must be a multiple of 4 */
-
- g = add_gear_shape (mi, 0.578, teeth);
- for (i = 0; i < countof(verts); i++)
- add_sphere_gear (mi, g, verts[i]);
-
- if (bp->ngears != 8) abort();
-}
-
-
-/* Create 10 identical gears arranged on the faces of ... something.
- I'm not sure what polyhedron is the basis of this.
- */
-static void
-make_deca (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- gear *g;
- XYZ a;
- int i, j;
- int teeth = 4 * (4 + (int) (BELLRAND(15)));
- if (teeth % 4) abort(); /* must be a multiple of 4 */
-
- g = add_gear_shape (mi, 0.5415, teeth);
-
- a.x = 0; a.y = 0; a.z = 1;
- add_sphere_gear (mi, g, a);
- a.z = -1;
- add_sphere_gear (mi, g, a);
-
- for (j = -1; j <= 1; j += 2)
- {
- GLfloat off = (j < 0 ? 0 : M_PI / 4);
- LL v;
- v.a = j * M_PI * 0.136; /* #### Empirical. What is this? */
- for (i = 0; i < 4; i++)
- {
- v.o = i * M_PI / 2 + off;
- a = polar_to_cartesian (v);
- add_sphere_gear (mi, g, a);
- }
- }
- if (bp->ngears != 10) abort();
-}
-
-
-/* Create 14 identical gears arranged on the faces of ... something.
- I'm not sure what polyhedron is the basis of this.
- */
-static void
-make_14 (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- gear *g;
- XYZ a;
- int i;
- GLfloat r = 0.4610;
- int teeth = 6 * (2 + (int) (BELLRAND(4)));
- if (teeth % 6) abort(); /* must be a multiple of 6. I think? */
- /* mismeshes: 24 30 34 36 42 48 54 60 */
-
- /* North, south */
- g = add_gear_shape (mi, r, teeth);
- a.x = 0; a.y = 0; a.z = 1;
- add_sphere_gear (mi, g, a);
- a.z = -1;
- add_sphere_gear (mi, g, a);
-
- /* Equator */
- a.z = 0;
- for (i = 0; i < 4; i++)
- {
- GLfloat th = i * M_PI * 2 / 4 + (M_PI / 4);
- a.x = cos(th);
- a.y = sin(th);
- add_sphere_gear (mi, g, a);
- }
-
- /* The other 8 */
- g = add_gear_shape (mi, r, teeth);
-
- for (i = 0; i < 4; i++)
- {
- LL v;
- v.a = M_PI * 0.197; /* #### Empirical. Also, wrong. What is this? */
- v.o = i * M_PI * 2 / 4;
- a = polar_to_cartesian (v);
- add_sphere_gear (mi, g, a);
- v.a = -v.a;
- a = polar_to_cartesian (v);
- add_sphere_gear (mi, g, a);
- }
-
- if (bp->ngears != 14) abort();
-}
-
-
-/* Create 18 identical gears arranged on the faces of ... something.
- I'm not sure what polyhedron is the basis of this.
- */
-static void
-make_18 (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- gear *g, *g2;
- XYZ a;
- int i;
- GLfloat r = 0.3830;
- int sizes[] = { 8, 12, 16, 20 }; /* 10, 14, 18, 26 and 34 don't work */
- int teeth = sizes[random() % countof(sizes)] * (1 + (random() % 4));
-
- /* North, south */
- g = add_gear_shape (mi, r, teeth);
- a.x = 0; a.y = 0; a.z = 1;
- add_sphere_gear (mi, g, a);
- a.z = -1;
- add_sphere_gear (mi, g, a);
-
- /* Equator */
- g2 = add_gear_shape (mi, r, teeth);
- a.z = 0;
- for (i = 0; i < 8; i++)
- {
- GLfloat th = i * M_PI * 2 / 8 + (M_PI / 4);
- a.x = cos(th);
- a.y = sin(th);
- add_sphere_gear (mi, (i & 1 ? g : g2), a);
- }
-
- /* The other 16 */
- g = add_gear_shape (mi, r, teeth);
-
- for (i = 0; i < 4; i++)
- {
- LL v;
- v.a = M_PI * 0.25;
- v.o = i * M_PI * 2 / 4;
- a = polar_to_cartesian (v);
- add_sphere_gear (mi, g, a);
- v.a = -v.a;
- a = polar_to_cartesian (v);
- add_sphere_gear (mi, g, a);
- }
-
- if (bp->ngears != 18) abort();
-}
-
-
-/* Create 32 gears arranged along a truncated icosahedron:
- One gear on each of the 20 faces, and one on each of the 12 vertices.
- */
-static void
-make_32 (ModeInfo *mi, const GLfloat *args)
-{
- /* http://bugman123.com/Gears/32GearSpheres/ */
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
- GLfloat s = M_PI / 5; /* lon division: 72 deg */
- int i;
-
- int teeth1 = args[0];
- int teeth2 = args[1];
- GLfloat r1 = args[2];
- GLfloat ratio = teeth2 / (GLfloat) teeth1;
- GLfloat r2 = r1 * ratio;
-
- gear *gear1, *gear2;
-
- if (teeth1 % 5) abort();
- if (teeth2 % 6) abort();
-
- gear1 = add_gear_shape (mi, r1, teeth1);
- gear2 = add_gear_shape (mi, r2, teeth2);
- gear2->ratio = 1 / ratio;
-
- {
- XYZ a = { 0, 0, 1 };
- XYZ b = { 0, 0, -1 };
- add_sphere_gear (mi, gear1, a);
- add_sphere_gear (mi, gear1, b);
- }
-
- for (i = 0; i < 10; i++)
- {
- GLfloat th1 = s * i;
- GLfloat th2 = s * (i+1);
- GLfloat th3 = s * (i+2);
- LL v1, v2, v3, vc;
- XYZ p1, p2, p3, pc, pc2;
- v1.a = th0; v1.o = th1;
- v2.a = th0; v2.o = th3;
- v3.a = -th0; v3.o = th2;
- vc.a = M_PI/2; vc.o = th2;
-
- if (! (i & 1)) /* southern hemisphere */
- {
- v1.a = -v1.a;
- v2.a = -v2.a;
- v3.a = -v3.a;
- vc.a = -vc.a;
- }
-
- p1 = polar_to_cartesian (v1);
- p2 = polar_to_cartesian (v2);
- p3 = polar_to_cartesian (v3);
- pc = polar_to_cartesian (vc);
-
- /* Two faces: 123 and 12c. */
-
- add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
-
- pc2.x = (p1.x + p2.x + p3.x) / 3; /* center of bottom triangle */
- pc2.y = (p1.y + p2.y + p3.y) / 3;
- pc2.z = (p1.z + p2.z + p3.z) / 3;
- add_sphere_gear (mi, gear2, pc2);
-
- pc2.x = (p1.x + p2.x + pc.x) / 3; /* center of top triangle */
- pc2.y = (p1.y + p2.y + pc.y) / 3;
- pc2.z = (p1.z + p2.z + pc.z) / 3;
- add_sphere_gear (mi, gear2, pc2);
- }
-
- if (bp->ngears != 32) abort();
-}
-
-
-/* Create 92 gears arranged along a geodesic sphere: 20 + 12 + 60.
- (frequency 3v, class-I geodesic tessellation of an icosahedron)
- */
-static void
-make_92 (ModeInfo *mi, const GLfloat *args)
-{
- /* http://bugman123.com/Gears/92GearSpheres/ */
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
- GLfloat s = M_PI / 5; /* lon division: 72 deg */
- int i;
-
- int tscale = 2; /* These don't mesh properly, so let's increase the
- number of teeth so that it's not so obvious. */
-
- int teeth1 = args[0] * tscale;
- int teeth2 = args[1] * tscale;
- int teeth3 = args[2] * tscale;
- GLfloat r1 = args[3];
- GLfloat ratio2 = teeth2 / (GLfloat) teeth1;
- GLfloat ratio3 = teeth3 / (GLfloat) teeth2;
- GLfloat r2 = r1 * ratio2;
- GLfloat r3 = r2 * ratio3;
-
- GLfloat r4 = args[4]; /* #### Empirical. Not sure what its basis is. */
- GLfloat r5 = 1 - r4;
-
- gear *gear1, *gear2, *gear3;
-
- gear1 = add_gear_shape (mi, r1, teeth1);
- gear2 = add_gear_shape (mi, r2, teeth2);
- gear3 = add_gear_shape (mi, r3, teeth3);
- gear2->ratio = 1 / ratio2;
- gear3->ratio = 1 / ratio3;
-
- {
- XYZ a = { 0, 0, 1 };
- XYZ b = { 0, 0, -1 };
- add_sphere_gear (mi, gear1, a);
- add_sphere_gear (mi, gear1, b);
- }
-
- for (i = 0; i < 10; i++)
- {
- GLfloat th1 = s * i;
- GLfloat th2 = s * (i+1);
- GLfloat th3 = s * (i+2);
- LL v1, v2, v3, vc;
- XYZ p1, p2, p3, pc, pc2;
- v1.a = th0; v1.o = th1;
- v2.a = th0; v2.o = th3;
- v3.a = -th0; v3.o = th2;
- vc.a = M_PI/2; vc.o = th2;
-
- if (! (i & 1)) /* southern hemisphere */
- {
- v1.a = -v1.a;
- v2.a = -v2.a;
- v3.a = -v3.a;
- vc.a = -vc.a;
- }
-
- p1 = polar_to_cartesian (v1);
- p2 = polar_to_cartesian (v2);
- p3 = polar_to_cartesian (v3);
- pc = polar_to_cartesian (vc);
-
- /* Two faces: 123 and 12c. */
-
- add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
-
- pc2.x = (p1.x + p2.x + p3.x) / 3; /* center of bottom triangle */
- pc2.y = (p1.y + p2.y + p3.y) / 3;
- pc2.z = (p1.z + p2.z + p3.z) / 3;
- add_sphere_gear (mi, gear2, pc2);
-
- pc2.x = (p1.x + p2.x + pc.x) / 3; /* center of top triangle */
- pc2.y = (p1.y + p2.y + pc.y) / 3;
- pc2.z = (p1.z + p2.z + pc.z) / 3;
- add_sphere_gear (mi, gear2, pc2);
-
- /* left edge of bottom triangle, 1/3 in */
- pc2.x = p1.x + (p3.x - p1.x) * r4;
- pc2.y = p1.y + (p3.y - p1.y) * r4;
- pc2.z = p1.z + (p3.z - p1.z) * r4;
- add_sphere_gear (mi, gear3, pc2);
-
- /* left edge of bottom triangle, 2/3 in */
- pc2.x = p1.x + (p3.x - p1.x) * r5;
- pc2.y = p1.y + (p3.y - p1.y) * r5;
- pc2.z = p1.z + (p3.z - p1.z) * r5;
- add_sphere_gear (mi, gear3, pc2);
-
- /* left edge of top triangle, 1/3 in */
- pc2.x = p1.x + (pc.x - p1.x) * r4;
- pc2.y = p1.y + (pc.y - p1.y) * r4;
- pc2.z = p1.z + (pc.z - p1.z) * r4;
- add_sphere_gear (mi, gear3, pc2);
-
- /* left edge of top triangle, 2/3 in */
- pc2.x = p1.x + (pc.x - p1.x) * r5;
- pc2.y = p1.y + (pc.y - p1.y) * r5;
- pc2.z = p1.z + (pc.z - p1.z) * r5;
- add_sphere_gear (mi, gear3, pc2);
-
- /* center of shared edge, 1/3 in */
- pc2.x = p1.x + (p2.x - p1.x) * r4;
- pc2.y = p1.y + (p2.y - p1.y) * r4;
- pc2.z = p1.z + (p2.z - p1.z) * r4;
- add_sphere_gear (mi, gear3, pc2);
-
- /* center of shared edge, 2/3 in */
- pc2.x = p1.x + (p2.x - p1.x) * r5;
- pc2.y = p1.y + (p2.y - p1.y) * r5;
- pc2.z = p1.z + (p2.z - p1.z) * r5;
- add_sphere_gear (mi, gear3, pc2);
- }
-
- if (bp->ngears != 92) abort();
-}
-
-static void
-make_182 (ModeInfo *mi, const GLfloat *args)
-{
- /* #### TODO: http://bugman123.com/Gears/182GearSpheres/ */
- abort();
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_geodesic (ModeInfo *mi, int width, int height)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-pick_shape (ModeInfo *mi, time_t last)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- int count = countof (gear_templates);
-
- if (bp->colors)
- free (bp->colors);
-
- bp->ncolors = 1024;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
-
- free_sphere_gears (mi);
-
- if (last == 0)
- {
- bp->which = random() % count;
- }
- else if (bp->next < 0)
- {
- bp->which--;
- if (bp->which < 0) bp->which = count-1;
- bp->next = 0;
- }
- else if (bp->next > 0)
- {
- bp->which++;
- if (bp->which >= count) bp->which = 0;
- bp->next = 0;
- }
- else
- {
- int n = bp->which;
- while (n == bp->which)
- n = random() % count;
- bp->which = n;
- }
-
- switch (gear_templates[bp->which].type) {
- case PRISM: make_prism (mi); break;
- case OCTO: make_octo (mi); break;
- case DECA: make_deca (mi); break;
- case G14: make_14 (mi); break;
- case G18: make_18 (mi); break;
- case G32: make_32 (mi, gear_templates[bp->which].args); break;
- case G92: make_92 (mi, gear_templates[bp->which].args); break;
- case G182: make_182(mi, gear_templates[bp->which].args); break;
- default: abort(); break;
- }
-
- sort_gears (mi);
-}
-
-
-
-ENTRYPOINT void
-init_geodesic (ModeInfo *mi)
-{
- geodesic_configuration *bp;
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- {
- static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat shiny = 128.0;
-
- static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
- glMateriali (GL_FRONT, GL_SHININESS, shiny);
- }
-
- if (! bp->rot)
- {
- double spin_speed = 0.25 * speed;
- double wander_speed = 0.01 * speed;
- double spin_accel = 0.2;
-
- bp->rot = make_rotator (do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- do_spin ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- True);
- bp->trackball = gltrackball_init (True);
- }
-
- bp->font = load_texture_font (MI_DISPLAY(mi), "font");
-
- pick_shape (mi, 0);
-}
-
-
-ENTRYPOINT Bool
-geodesic_handle_event (ModeInfo *mi, XEvent *event)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else
- {
- if (event->xany.type == KeyPress)
- {
- KeySym keysym;
- char c = 0;
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
- if (c == '<' || c == ',' || c == '-' || c == '_' ||
- keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
- {
- bp->next = -1;
- goto SWITCH;
- }
- else if (c == '>' || c == '.' || c == '=' || c == '+' ||
- keysym == XK_Right || keysym == XK_Down ||
- keysym == XK_Next)
- {
- bp->next = 1;
- goto SWITCH;
- }
- }
-
- if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- SWITCH:
- bp->mode = 1;
- bp->mode_tick = 4;
- return True;
- }
- }
-
- return False;
-}
-
-
-ENTRYPOINT void
-draw_geodesic (ModeInfo *mi)
-{
- time_t now = time ((time_t *) 0);
- int wire = MI_IS_WIREFRAME(mi);
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (! wire)
- {
- glEnable (GL_DEPTH_TEST);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_LIGHTING);
- glEnable (GL_LIGHT0);
- }
-
-
- if (bp->draw_time == 0)
- {
- pick_shape (mi, bp->draw_time);
- bp->draw_time = now;
- }
- else if (bp->mode == 0)
- {
- if (bp->draw_tick++ > 10)
- {
- if (bp->draw_time == 0) bp->draw_time = now;
- bp->draw_tick = 0;
-
- if (!bp->button_down_p &&
- bp->draw_time + timeout <= now)
- {
- /* randomize every -timeout seconds */
- bp->mode = 1; /* go out */
- bp->mode_tick = 10 / speed;
- bp->draw_time = now;
- }
- }
- }
- else if (bp->mode == 1) /* out */
- {
- if (--bp->mode_tick <= 0)
- {
- bp->mode_tick = 10 / speed;
- bp->mode = 2; /* go in */
- pick_shape (mi, bp->draw_time);
- bp->draw_time = now;
- }
- }
- else if (bp->mode == 2) /* in */
- {
- if (--bp->mode_tick <= 0)
- bp->mode = 0; /* normal */
- }
- else
- abort();
-
-
- if (! wire)
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 17);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- mi->polygon_count = 0;
-
- glScalef (6, 6, 6);
-
- if (bp->ngears < 14)
- glScalef (0.8, 0.8, 0.8); /* make these a little easier to see */
-
- if (bp->mode != 0)
- {
- GLfloat s = (bp->mode == 1
- ? bp->mode_tick / (10 / speed)
- : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
- glScalef (s, s, s);
- }
-
-
- {
- int i;
- for (i = 0; i < bp->ngears; i++)
- {
- const sphere_gear *s = &bp->gears[i];
- const gear *g = s->g;
-
- XYZ axis;
- XYZ from = { 0, 1, 0 };
- XYZ to = s->axis;
- GLfloat angle;
- GLfloat off = s->offset;
-
- /* If an even number of teeth, offset by 1/2 tooth width. */
- if (s->direction > 0 && !(g->nteeth & 1))
- off += 360 / g->nteeth / 2;
-
- axis = cross_product (from, to);
- angle = acos (dot_product (from, to));
-
- glPushMatrix();
- glTranslatef (to.x, to.y, to.z);
- glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
- glRotatef (-90, 1, 0, 0);
- glRotatef(180, 0, 0, 1);
- glRotatef ((bp->th - off) * g->ratio * s->direction,
- 0, 0, 1);
-
- glCallList (g->dlist);
- mi->polygon_count += g->polygons;
- glPopMatrix();
-
-#if 0
- { /* Draw tooth vectors */
- GLfloat r = 1 - g->z;
- XYZ pc;
- int pt = parent_tooth (s, &pc);
- int t;
- glDisable(GL_LIGHTING);
- glLineWidth (8);
- for (t = 0; t < g->nteeth; t++)
- {
- XYZ p = tooth_coords (s, t);
- XYZ p2;
- p2.x = (r * s->axis.x + p.x) / 2;
- p2.y = (r * s->axis.y + p.y) / 2;
- p2.z = (r * s->axis.z + p.z) / 2;
-
- if (t == pt)
- glColor3f(1,0,1);
- else
- glColor3f(0,1,1);
- glBegin(GL_LINES);
- glVertex3f (p.x, p.y, p.z);
- glVertex3f (p2.x, p2.y, p2.z);
- glEnd();
- }
- if (!wire) glEnable(GL_LIGHTING);
- glLineWidth (1);
- }
-#endif
-
-#if 0
- { /* Draw the parent/child DAG */
- GLfloat s1 = 1.1;
- GLfloat s2 = s->parent ? s1 : 1.5;
- GLfloat s3 = 1.0;
- XYZ p1 = s->axis;
- XYZ p2 = s->parent ? s->parent->axis : p1;
- glDisable(GL_LIGHTING);
- glColor3f(0,0,1);
- glBegin(GL_LINES);
- glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
- glVertex3f (s2 * p2.x, s2 * p2.y, s2 * p2.z);
- glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
- glVertex3f (s3 * p1.x, s3 * p1.y, s3 * p1.z);
- glEnd();
- if (!wire) glEnable(GL_LIGHTING);
- }
-#endif
- }
-
- /* We need to draw the fonts in a second pass in order to make
- transparency (as a result of anti-aliasing) work properly.
- */
- if (do_numbers && bp->mode == 0)
- for (i = 0; i < bp->ngears; i++)
- {
- const sphere_gear *s = &bp->gears[i];
- const gear *g = s->g;
-
- XYZ axis;
- XYZ from = { 0, 1, 0 };
- XYZ to = s->axis;
- GLfloat angle;
- GLfloat off = s->offset;
-
- int w, h, j;
- char buf[100];
- XCharStruct e;
-
- /* If an even number of teeth, offset by 1/2 tooth width. */
- if (s->direction > 0 /* && !(g->nteeth & 1) */)
- off += 360 / g->nteeth / 2;
-
- axis = cross_product (from, to);
- angle = acos (dot_product (from, to));
-
- glPushMatrix();
- glTranslatef(to.x, to.y, to.z);
- glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
- glRotatef (-90, 1, 0, 0);
- glRotatef(180, 0, 0, 1);
- glRotatef ((bp->th - off) * g->ratio * s->direction,
- 0, 0, 1);
-
- glDisable (GL_LIGHTING);
- glColor3f(1, 1, 0);
- glPushMatrix();
- glScalef(0.005, 0.005, 0.005);
- sprintf (buf, "%d", i);
- texture_string_metrics (bp->font, buf, &e, 0, 0);
- w = e.width;
- h = e.ascent + e.descent;
- glTranslatef (-w/2, -h/2, 0);
- print_texture_string (bp->font, buf);
- glPopMatrix();
-
-# if 1
- for (j = 0; j < g->nteeth; j++) /* Number the teeth */
- {
- GLfloat ss = 0.08 * g->r / g->nteeth;
- GLfloat r = g->r * 0.88;
- GLfloat th = M_PI - (j * M_PI * 2 / g->nteeth + M_PI/2);
-
-
- glPushMatrix();
- glTranslatef (r * cos(th), r * sin(th), -g->z + 0.01);
- glScalef(ss, ss, ss);
- sprintf (buf, "%d", j + 1);
- texture_string_metrics (bp->font, buf, &e, 0, 0);
- w = e.width;
- h = e.ascent + e.descent;
- glTranslatef (-w/2, -h/2, 0);
- print_texture_string (bp->font, buf);
- glPopMatrix();
- }
-# endif
- glPopMatrix();
- if (!wire) glEnable(GL_LIGHTING);
- }
-
- bp->th += 0.7 * speed; /* Don't mod this to 360 - causes glitches. */
- }
-
- if (do_labels && bp->mode == 0)
- {
- glColor3f (1, 1, 0);
- print_texture_label (mi->dpy, bp->font,
- mi->xgwa.width, mi->xgwa.height,
- 1, bp->desc);
- }
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-ENTRYPOINT void
-free_geodesic (ModeInfo *mi)
-{
- geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context)
- return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->font) free_texture_font (bp->font);
- if (bp->colors) free (bp->colors);
- if (mi) free_sphere_gears (mi);
- if (bp->desc) free (bp->desc);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
-}
-
-
-XSCREENSAVER_MODULE_2 ("GeodesicGears", geodesicgears, geodesic)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/geodesicgears.man b/hacks/glx/geodesicgears.man
deleted file mode 100644
index f6ca5e0..0000000
--- a/hacks/glx/geodesicgears.man
+++ /dev/null
@@ -1,78 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-geodesicgears \- gears on the surface of a sphere.
-.SH SYNOPSIS
-.B geodesicgears
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-timeout \fInumber\fP]
-[\-labels]
-[\-numbers]
-[\-wireframe]
-[\-wander]
-[\-no-spin]
-[\-fps]
-.SH DESCRIPTION
-A set of meshed gears arranged on the surface of a sphere.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-timeout \fInumber\fP
-Duration before switching to a new model. 5 - 120 seconds. Default: 20.
-.TP 8
-.B \-labels | \-no-labels
-Whether to show the number of gears and teeth. Default: no.
-.TP 8
-.B \-numbers | \-no-numbers
-Whether to label the gears with ID numbers. Default: no.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin | \-no-spin
-Whether the object should spin.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR geodesic (MANSUFFIX),
-.BR pinion (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2014 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/gflux.c b/hacks/glx/gflux.c
deleted file mode 100644
index 0488d9f..0000000
--- a/hacks/glx/gflux.c
+++ /dev/null
@@ -1,798 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- emacs friendly */
-/* gflux - creates a fluctuating 3D grid
- * requires OpenGL or MesaGL
- *
- * Copyright (c) Josiah Pease, 2000, 2003
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Thanks go to all those who worked on...
- * MesaGL, OpenGL, UtahGLX, XFree86, gcc, vim, rxvt, the PNM (anymap) format
- * xscreensaver and the thousands of other tools, apps and daemons that make
- * linux usable
- * Personal thanks to Kevin Moss, Paul Sheahee and Jamie Zawinski
- *
- * some xscreensaver code lifted from superquadrics. Most other glx hacks
- * used as reference at some time.
- *
- * This hack and others can cause UtahGLX to crash my X server
- * wireframe looks good with software only rendering anyway
- * If anyone can work out why and supply a fix I'd love to hear from them
- *
- * Josiah Pease <gfluxcode@jpease.force9.co.uk> 21 July 2000
- *
- * History
- * 10 June 2000 : wireframe rippling grid standalone written
- * 18 June 2000 : xscreensaver code added
- * 25 June 2000 : solid and light added
- * 04 July 2000 : majour bug hunt, xscreensaver code rewritten
- * 08 July 2000 : texture mapping, rotation and zoom added
- * 21 July 2000 : cleaned up code from bug hunts, manpage written
- * 24 November 2000 : fixed x co-ord calculation in solid - textured
- * 05 March 2001 : put back non pnmlib code with #ifdefs
- * 11 May 2002 : fixed image problems with large images
- */
-
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000\n" \
- "*showFPS: False\n" \
- "*mode: grab\n" \
- "*useSHM: True \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_gflux 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL /* whole file */
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <math.h>
-
-#include "grab-ximage.h"
-#include "gltrackball.h"
-
-
-static enum {wire=0,solid,light,checker,grab} _draw;
-
-# define DEF_SQUARES "19"
-# define DEF_RESOLUTION "4"
-# define DEF_DRAW "2"
-# define DEF_FLAT "0"
-# define DEF_SPEED "0.05"
-# define DEF_ROTATIONX "0.01"
-# define DEF_ROTATIONY "0.0"
-# define DEF_ROTATIONZ "0.1"
-# define DEF_WAVES "3"
-# define DEF_WAVE_CHANGE "50"
-# define DEF_WAVE_HEIGHT "1.0"
-# define DEF_WAVE_FREQ "3.0"
-# define DEF_ZOOM "1.0"
-
-
-
-static int _squares; /* grid size */
-static int _resolution; /* wireframe resolution */
-static int _flat;
-
-static float _speed;
-static float _rotationx;
-static float _rotationy;
-static float _rotationz;
-static float _zoom;
-
-static int _waves;
-static int _waveChange;
-static float _waveHeight;
-static float _waveFreq;
-
-
-#define WIDTH 320
-#define HEIGHT 240
-
-static XrmOptionDescRec opts[] = {
- {"-squares", ".gflux.squares", XrmoptionSepArg, 0},
- {"-resolution", ".gflux.resolution", XrmoptionSepArg, 0},
-/* {"-draw", ".gflux.draw", XrmoptionSepArg, 0},*/
- {"-mode", ".gflux.mode", XrmoptionSepArg, 0},
- {"-wireframe", ".gflux.mode", XrmoptionNoArg, "wire"},
- {"-flat", ".gflux.flat", XrmoptionSepArg, 0},
- {"-speed", ".gflux.speed", XrmoptionSepArg, 0},
- {"-rotationx", ".gflux.rotationx", XrmoptionSepArg, 0},
- {"-rotationy", ".gflux.rotationy", XrmoptionSepArg, 0},
- {"-rotationz", ".gflux.rotationz", XrmoptionSepArg, 0},
- {"-waves", ".gflux.waves", XrmoptionSepArg, 0},
- {"-waveChange", ".gflux.waveChange", XrmoptionSepArg, 0},
- {"-waveHeight", ".gflux.waveHeight", XrmoptionSepArg, 0},
- {"-waveFreq", ".gflux.waveFreq", XrmoptionSepArg, 0},
- {"-zoom", ".gflux.zoom", XrmoptionSepArg, 0},
-};
-
-
-static argtype vars[] = {
- {&_squares, "squares", "Squares", DEF_SQUARES, t_Int},
- {&_resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
-/* {&_draw, "draw", "Draw", DEF_DRAW, t_Int},*/
- {&_flat, "flat", "Flat", DEF_FLAT, t_Int},
- {&_speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&_rotationx, "rotationx", "Rotationx", DEF_ROTATIONX, t_Float},
- {&_rotationy, "rotationy", "Rotationy", DEF_ROTATIONY, t_Float},
- {&_rotationz, "rotationz", "Rotationz", DEF_ROTATIONZ, t_Float},
- {&_waves, "waves", "Waves", DEF_WAVES, t_Int},
- {&_waveChange, "waveChange", "WaveChange", DEF_WAVE_CHANGE, t_Int},
- {&_waveHeight, "waveHeight", "WaveHeight", DEF_WAVE_HEIGHT, t_Float},
- {&_waveFreq, "waveFreq", "WaveFreq", DEF_WAVE_FREQ, t_Float},
- {&_zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
-};
-
-
-static OptionStruct desc[] =
-{
- {"-squares num", "size of grid in squares (19)"},
- {"-resolution num", "detail of lines making grid, wireframe only (4)"},
-/* {"-draw num", "draw method to use: 0=wireframe 1=solid 2=lit (0)"},*/
- {"-flat num", "shading method, not wireframe: 0=smooth 1=flat (0)"},
- {"-speed num", "speed of waves (0.05)"},
- {"-rotationx num", "speed of xrotation (0.01)"},
- {"-rotationy num", "speed of yrotation (0.00)"},
- {"-rotationz num", "speed of zrotation (0.10)"},
- {"-waves num", "number of simultanious waves (3)"},
- {"-waveChange num", "number of cyles for a wave to change (50)"},
- {"-waveHeight num", "height of waves (1.0)"},
- {"-waveFreq num", "max frequency of a wave (3.0)"},
- {"-zoom num", "camera control (1.0)"},
-};
-
-ENTRYPOINT ModeSpecOpt gflux_opts = {countof(opts), opts, countof(vars), vars, desc};
-
-#ifdef USE_MODULES
-ModStruct gflux_description =
-{"gflux", "init_gflux", "draw_gflux", NULL,
- "draw_gflux", "init_gflux", NULL, &gflux_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "GFlux: an OpenGL gflux", 0, NULL};
-#endif
-
-/* structure for holding the gflux data */
-typedef struct gfluxstruct {
- ModeInfo *modeinfo;
- int screen_width, screen_height;
- GLXContext *glx_context;
- Window window;
- XColor fg, bg;
-#define MAXWAVES 10 /* should be dynamic */
- double wa[MAXWAVES];
- double freq[MAXWAVES];
- double dispy[MAXWAVES];
- double dispx[MAXWAVES];
- GLfloat colour[3];
- GLuint texName;
- GLfloat tex_xscale;
- GLfloat tex_yscale;
- XRectangle img_geom;
- int img_width, img_height;
- int (*drawFunc)(struct gfluxstruct *);
-
- trackball_state *trackball;
- Bool button_down_p;
-
- double time;
- double anglex;
- double angley;
- double anglez;
-
- int counter;
- int newWave;
-
- Bool mipmap_p;
- Bool waiting_for_image_p;
-
-} gfluxstruct;
-static gfluxstruct *gfluxes = NULL;
-
-/* prototypes */
-static void initLighting(void);
-static void grabTexture(gfluxstruct *);
-static void createTexture(gfluxstruct *);
-static int displaySolid(gfluxstruct *); /* drawFunc implementations */
-static int displayLight(gfluxstruct *);
-static int displayTexture(gfluxstruct *);
-static int displayWire(gfluxstruct *);
-static void calcGrid(gfluxstruct *);
-static double getGrid(gfluxstruct *,double,double,double);
-
-/* as macro for speed */
-/* could do with colour cycling here */
-/* void genColour(double);*/
-#define genColour(X) \
-{\
- gp->colour[0] = 0.0;\
- gp->colour[1] = 0.5+0.5*(X);\
- gp->colour[2] = 0.5-0.5*(X);\
-}
-
-/* BEGINNING OF FUNCTIONS */
-
-
-ENTRYPOINT Bool
-gflux_handle_event (ModeInfo *mi, XEvent *event)
-{
- gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, gp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &gp->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- if (_draw == grab) {
- grabTexture(gp);
- return True;
- }
- }
-
- return False;
-}
-
-
-static void
-userRot(gfluxstruct *gp)
-{
- gltrackball_rotate (gp->trackball);
-}
-
-/* draw the gflux once */
-ENTRYPOINT void draw_gflux(ModeInfo * mi)
-{
- gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!gp->glx_context) return;
-
- /* Just keep running before the texture has come in. */
- /* if (gp->waiting_for_image_p) return; */
-
- glXMakeCurrent(display, window, *gp->glx_context);
-
- calcGrid(gp);
- mi->polygon_count = gp->drawFunc(gp);
- if (mi->fps_p) do_fps (mi);
- glXSwapBuffers(display, window);
-}
-
-
-/* Standard reshape function */
-ENTRYPOINT void
-reshape_gflux(ModeInfo *mi, int width, int height)
-{
- glViewport( 0, 0, width, height );
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-_zoom,_zoom,-0.8*_zoom,0.8*_zoom,2,6);
- glTranslatef(0.0,0.0,-4.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-}
-
-
-/* main OpenGL initialization routine */
-static void initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
-{
- gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
-
- reshape_gflux(mi, width, height);
- glViewport( 0, 0, width, height );
-
- gp->tex_xscale = 1.0; /* maybe changed later */
- gp->tex_yscale = 1.0;
-
- switch(_draw) {
- case solid :
- gp->drawFunc = (displaySolid);
- glEnable(GL_DEPTH_TEST);
- break;
- case light :
- gp->drawFunc = (displayLight);
- glEnable(GL_DEPTH_TEST);
- initLighting();
- break;
- case checker :
- gp->drawFunc = (displayTexture);
- glEnable(GL_DEPTH_TEST);
- createTexture(gp);
- initLighting();
- break;
- case grab :
- gp->drawFunc = (displayTexture);
- glEnable(GL_DEPTH_TEST);
- grabTexture(gp);
- initLighting();
- break;
- case wire :
- default :
- gp->drawFunc = (displayWire);
- glDisable(GL_DEPTH_TEST);
- break;
- }
-
- if(_flat) glShadeModel(GL_FLAT);
- else glShadeModel(GL_SMOOTH);
-
-}
-
-
-/* xgflux initialization routine */
-ENTRYPOINT void init_gflux(ModeInfo * mi)
-{
- int screen = MI_SCREEN(mi);
- gfluxstruct *gp;
-
- MI_INIT(mi, gfluxes);
- gp = &gfluxes[screen];
-
- gp->trackball = gltrackball_init (True);
-
- gp->time = frand(1000.0); /* don't run two screens in lockstep */
-
- {
- char *s = get_string_resource (mi->dpy, "mode", "Mode");
- if (!s || !*s) _draw = grab;
- else if (!strcasecmp (s, "wire")) _draw = wire;
- else if (!strcasecmp (s, "solid")) _draw = solid;
- else if (!strcasecmp (s, "light")) _draw = light;
- else if (!strcasecmp (s, "checker")) _draw = checker;
- else if (!strcasecmp (s, "grab")) _draw = grab;
- else
- {
- fprintf (stderr,
- "%s: mode must be one of: wire, solid, "
- "light, checker, or grab; not \"%s\"\n",
- progname, s);
- exit (1);
- }
- if (s) free (s);
- }
-
- gp->modeinfo = mi;
- gp->window = MI_WINDOW(mi);
- if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape_gflux(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-ENTRYPOINT void free_gflux(ModeInfo * mi)
-{
- gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
- if (!gp->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
- gltrackball_free (gp->trackball);
- if (gp->texName) glDeleteTextures (1, &gp->texName);
-}
-
-static void createTexture(gfluxstruct *gp)
-{
- int size = 4;
- unsigned int data[] = { 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
- 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
- 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF };
-
- gp->tex_xscale = size;
- gp->tex_yscale = size;
-
- glGenTextures (1, &gp->texName);
- glBindTexture (GL_TEXTURE_2D, gp->texName);
-
- glTexImage2D (GL_TEXTURE_2D, 0, 3, size, size, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-}
-
-
-static void
-image_loaded_cb (const char *filename, XRectangle *geometry,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- gfluxstruct *gp = (gfluxstruct *) closure;
- gp->img_geom = *geometry;
-
- gp->tex_xscale = (GLfloat) image_width / texture_width;
- gp->tex_yscale = -(GLfloat) image_height / texture_height;
- gp->img_width = image_width;
- gp->img_height = image_height;
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- (gp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
-
- gp->waiting_for_image_p = False;
-}
-
-static void
-grabTexture(gfluxstruct *gp)
-{
- if (MI_IS_WIREFRAME(gp->modeinfo))
- return;
-
- gp->waiting_for_image_p = True;
- gp->mipmap_p = True;
- load_texture_async (gp->modeinfo->xgwa.screen, gp->modeinfo->window,
- *gp->glx_context, 0, 0, gp->mipmap_p, gp->texName,
- image_loaded_cb, gp);
-}
-
-
-static void initLighting(void)
-{
- static const float ambientA[] = {0.0, 0.0, 0.0, 1.0};
- static const float diffuseA[] = {1.0, 1.0, 1.0, 1.0};
- static const float positionA[] = {5.0, 5.0, 15.0, 1.0};
-
- static const float front_mat_shininess[] = {30.0};
- static const float front_mat_specular[] = {0.5, 0.5, 0.5, 1.0};
-
- static const float mat_diffuse[] = {0.5, 0.5, 0.5, 1.0};
-
- glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
- glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
-
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambientA);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseA);
- glLightfv(GL_LIGHT0, GL_POSITION, positionA);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1);
-
- glEnable(GL_NORMALIZE); /* would it be faster ... */
- glEnable(GL_COLOR_MATERIAL);
- glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
-}
-
-/************************************/
-/* draw implementations */
-/* somewhat inefficient since they */
-/* all calculate previously */
-/* calculated values again */
-/* storing the values in an array */
-/* is a posibility */
-/************************************/
-static int displayTexture(gfluxstruct *gp)
-{
- int polys = 0;
- double x,y,u,v;
- double z;
- double dx = 2.0/((double)_squares);
- double dy = 2.0/((double)_squares);
-
- double du = 2.0/((double)_squares);
- double dv = 2.0/((double)_squares);
-
- double xs = gp->tex_xscale;
- double ys = gp->tex_yscale;
-
- double minx, miny, maxx, maxy;
- double minu, minv;
-
-#if 0
- minx = (GLfloat) gp->img_geom.x / gp->img_width;
- miny = (GLfloat) gp->img_geom.y / gp->img_height;
- maxx = ((GLfloat) (gp->img_geom.x + gp->img_geom.width) /
- gp->img_width);
- maxy = ((GLfloat) (gp->img_geom.y + gp->img_geom.height) /
- gp->img_height);
- minu = minx;
- minv = miny;
- minx = (minx * 2) - 1;
- miny = (miny * 2) - 1;
- maxx = (maxx * 2) - 1;
- maxy = (maxy * 2) - 1;
-#else
- minx = -1;
- miny = -1;
- maxx = 1;
- maxy = 1;
- minv = 0;
- minu = 0;
-#endif
-
- glMatrixMode (GL_TEXTURE);
- glLoadIdentity ();
- glTranslatef(-1,-1,0);
- glScalef(0.5,0.5,1);
- glMatrixMode (GL_MODELVIEW);
-
- glLoadIdentity();
- userRot(gp);
- glRotatef(gp->anglex,1,0,0);
- glRotatef(gp->angley,0,1,0);
- glRotatef(gp->anglez,0,0,1);
- glScalef(1,1,(GLfloat)_waveHeight);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glEnable(GL_TEXTURE_2D);
-
- clear_gl_error();
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glBindTexture(GL_TEXTURE_2D, gp->texName);
- check_gl_error("texture binding");
-
- glColor3f(0.5,0.5,0.5);
-
- for(x = minx, u = minu; x < maxx - 0.01; x += dx, u += du) {
- glBegin(GL_QUAD_STRIP);
- for (y = miny, v = minv; y <= maxy + 0.01; y += dy, v += dv) {
- z = getGrid(gp,x,y,gp->time);
- glTexCoord2f(u*xs,v*ys);
- glNormal3f(
- getGrid(gp,x+dx,y,gp->time)-getGrid(gp, x-dx,y,gp->time),
- getGrid(gp,x,y+dy,gp->time)-getGrid(gp, x,y-dy,gp->time),
- 1
- );
- glVertex3f(x,y,z);
-
- z = getGrid(gp,x+dx,y,gp->time);
- glTexCoord2f((u+du)*xs,v*ys);
- glNormal3f(
- getGrid(gp,x+dx+dx,y,gp->time)-getGrid(gp, x,y,gp->time),
- getGrid(gp,x+dx,y+dy,gp->time)-getGrid(gp, x+dx,y-dy,gp->time),
- 1
- );
- glVertex3f(x+dx,y,z);
- polys++;
- }
- glEnd();
- }
-
- /* Draw a border around the grid.
- */
- glColor3f(0.4, 0.4, 0.4);
- glDisable(GL_TEXTURE_2D);
- glEnable (GL_LINE_SMOOTH);
-
- glBegin(GL_LINE_LOOP);
- y = miny;
- for (x = minx; x <= maxx; x += dx) {
- glVertex3f (x, y, getGrid (gp, x, y, gp->time));
- polys++;
- }
- x = maxx;
- for (y = miny; y <= maxy; y += dy) {
- glVertex3f (x, y, getGrid (gp, x, y, gp->time));
- polys++;
- }
- y = maxy;
- for (x = maxx; x >= minx; x -= dx) {
- glVertex3f (x, y, getGrid (gp, x, y, gp->time));
- polys++;
- }
- x = minx;
- for (y = maxy; y >= miny; y -= dy) {
- glVertex3f (x, y, getGrid (gp, x, y, gp->time));
- polys++;
- }
- glEnd();
- glEnable(GL_TEXTURE_2D);
-
- if (! gp->button_down_p) {
- gp->time -= _speed;
- gp->anglex -= _rotationx;
- gp->angley -= _rotationy;
- gp->anglez -= _rotationz;
- }
- return polys;
-}
-
-static int displaySolid(gfluxstruct *gp)
-{
- int polys = 0;
- double x,y;
- double z;
- double dx = 2.0/((double)_squares);
- double dy = 2.0/((double)_squares);
-
- glLoadIdentity();
- glRotatef(gp->anglex,1,0,0);
- glRotatef(gp->angley,0,1,0);
- glRotatef(gp->anglez,0,0,1);
- userRot(gp);
- glScalef(1,1,(GLfloat)_waveHeight);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-
- for(x=-1;x<0.9999;x+=dx) {
- glBegin(GL_QUAD_STRIP);
- for(y=-1;y<=1;y+=dy) {
- z = getGrid(gp, x,y,gp->time);
- genColour(z);
- glColor3fv(gp->colour);
- glVertex3f(x,y,z);
-
- z = getGrid(gp, x+dx,y,gp->time);
- genColour(z);
- glColor3fv(gp->colour);
- glVertex3f(x+dx,y,z);
- polys++;
- }
- glEnd();
- }
-
- if (! gp->button_down_p) {
- gp->time -= _speed;
- gp->anglex -= _rotationx;
- gp->angley -= _rotationy;
- gp->anglez -= _rotationz;
- }
-
- return polys;
-}
-
-static int displayLight(gfluxstruct *gp)
-{
- int polys = 0;
- double x,y;
- double z;
- double dx = 2.0/((double)_squares);
- double dy = 2.0/((double)_squares);
-
- glLoadIdentity();
- glRotatef(gp->anglex,1,0,0);
- glRotatef(gp->angley,0,1,0);
- glRotatef(gp->anglez,0,0,1);
- userRot(gp);
- glScalef(1,1,(GLfloat)_waveHeight);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-
- for(x=-1;x<0.9999;x+=dx) {
- glBegin(GL_QUAD_STRIP);
- for(y=-1;y<=1;y+=dy) {
- z = getGrid(gp, x,y,gp->time);
- genColour(z);
- glColor3fv(gp->colour);
- glNormal3f(
- getGrid(gp, x+dx,y,gp->time)-getGrid(gp, x-dx,y,gp->time),
- getGrid(gp, x,y+dy,gp->time)-getGrid(gp, x,y-dy,gp->time),
- 1
- );
- glVertex3f(x,y,z);
-
- z = getGrid(gp, x+dx,y,gp->time);
- genColour(z);
- glColor3fv(gp->colour);
- glNormal3f(
- getGrid(gp, x+dx+dx,y,gp->time)-getGrid(gp, x,y,gp->time),
- getGrid(gp, x+dx,y+dy,gp->time)-getGrid(gp, x+dx,y-dy,gp->time),
- 1
- );
- glVertex3f(x+dx,y,z);
- polys++;
- }
- glEnd();
- }
-
- if (! gp->button_down_p) {
- gp->time -= _speed;
- gp->anglex -= _rotationx;
- gp->angley -= _rotationy;
- gp->anglez -= _rotationz;
- }
- return polys;
-}
-
-static int displayWire(gfluxstruct *gp)
-{
- int polys = 0;
- double x,y;
- double z;
- double dx1 = 2.0/((double)(_squares*_resolution)) - 0.00001;
- double dy1 = 2.0/((double)(_squares*_resolution)) - 0.00001;
- double dx2 = 2.0/((double)_squares) - 0.00001;
- double dy2 = 2.0/((double)_squares) - 0.00001;
-
- glLoadIdentity();
- glRotatef(gp->anglex,1,0,0);
- glRotatef(gp->angley,0,1,0);
- glRotatef(gp->anglez,0,0,1);
- userRot(gp);
- glScalef(1,1,(GLfloat)_waveHeight);
- glClear(GL_COLOR_BUFFER_BIT);
-
- for(x=-1;x<=1;x+=dx2) {
- glBegin(GL_LINE_STRIP);
- for(y=-1;y<=1;y+=dy1) {
- z = getGrid(gp, x,y,gp->time);
- genColour(z);
- glColor3fv(gp->colour);
- glVertex3f(x,y,z);
- polys++;
- }
- glEnd();
- }
- for(y=-1;y<=1;y+=dy2) {
- glBegin(GL_LINE_STRIP);
- for(x=-1;x<=1;x+=dx1) {
- z = getGrid(gp, x,y,gp->time);
- genColour(z);
- glColor3fv(gp->colour);
- glVertex3f(x,y,z);
- polys++;
- }
- glEnd();
- }
-
- if (! gp->button_down_p) {
- gp->time -= _speed;
- gp->anglex -= _rotationx;
- gp->angley -= _rotationy;
- gp->anglez -= _rotationz;
- }
- return polys;
-}
-
-/* generates new ripples */
-static void calcGrid(gfluxstruct *gp)
-{
- double tmp;
-
- if (gp->button_down_p) return;
-
- tmp = 1.0/((double)_waveChange);
- if(!(gp->counter%_waveChange)) {
- gp->newWave = ((int)(gp->counter*tmp))%_waves;
- gp->dispx[gp->newWave] = -frand(1.0);
- gp->dispy[gp->newWave] = -frand(1.0);
- gp->freq[gp->newWave] = _waveFreq * frand(1.0);
- gp->wa[gp->newWave] = 0.0;
- }
- gp->counter++;
- gp->wa[gp->newWave] += tmp;
- gp->wa[(gp->newWave+1)%_waves] -= tmp;
-}
-
-/* returns a height for the grid given time and x,y space co-ords */
-static double getGrid(gfluxstruct *gp, double x, double y, double a)
-{
- register int i;
- double retval=0.0;
- double tmp;
-
- tmp = 1.0/((float)_waves);
- for(i=0;i<_waves;i++) {
- retval += gp->wa[i] * tmp * sin( gp->freq[i]
- * ( (x+gp->dispx[i]) * (x+gp->dispx[i])
- + (y+gp->dispy[i]) * (y+gp->dispy[i]) +a ) );
- }
- return(retval);
-}
-
-
-XSCREENSAVER_MODULE ("GFlux", gflux)
-
-#endif
diff --git a/hacks/glx/gflux.man b/hacks/glx/gflux.man
deleted file mode 100644
index da6e4d6..0000000
--- a/hacks/glx/gflux.man
+++ /dev/null
@@ -1,111 +0,0 @@
-.TH XScreenSaver 1 "May 2004"
-.SH NAME
-gflux \- rippling surface graphics hack
-.SH SYNOPSIS
-.B gflux
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
-[\-squares \fInum\fP] [\-resolution \fInum\fP] [\-mode \fImode\fP]
-[\-flat \fInum\fP] [\-speed \fInum\fP]
-[\-rotationx \fInum\fP] [\-rotationy \fInum\fP] [\-rotationz \fInum\fP]
-[\-waves \fInum\fP] [\-waveChange \fInum\fP] [\-waveHeight \fInum\fP]
-[\-waveFreq \fInum\fP] [\-zoom \fInum\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIgflux\fP program draws a colourfull animated rippling square rotating in 3D space.
-.SH OPTIONS
-.I gflux
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-squares \fInum\fP\fP
-Specifies the size of the grid in squares. default 19
-.TP 8
-.B \-resolution \fInum\fP\fP
-Specifies the wireframe detail of the squares. default 4
-.TP 8
-.B \-mode \fImode\fP\fP
-Specifies the draw method: wireframe; solid (meaning a solid colored
-surface); light (same as solid, but with lighting effects);
-checker (a texture-mapped checkerboard pattern); or grab (meaning
-grab an image to manipulate.)
-
-When grabbing images, the image will be grabbed from the portion of
-the screen underlying the window, or from the system's video input,
-or from a random file on disk, as indicated by
-the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
-and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
-file; see
-.BR xscreensaver\-settings (1)
-for more details.
-.TP 8
-.B \-wireframe
-Same as "-mode wire".
-.TP 8
-.B \-flat \fInum\fP\fP
-0 for smooth shading 1 for flat. default 0
-.TP 8
-.B \-speed \fInum\fP\fP
-Specifies speed of ripples flowing over the surface. default 0.05
-.TP 8
-.B \-rotationx \fInum\fP \-rotationy \fInum\fP \-rotationz \fInum\fP\fP
-Specifies the speed of rotation of the surface in these axis
-.TP 8
-.B \-waves \fInum\fP\fP
-Specifies the number of ripple centres at any one time. Values should be greater than 1. default 3
-.TP 8
-.B \-waveChange \fInum\fP\fP
-Specifies the duration of a ripple centre. after this they fade away to be reborn elsewhere with a different frequency. default 50
-.TP 8
-.B \-waveHeight \fInum\fP\fP
-Specifies the height of ripples on the surface. default 1.0
-.TP 8
-.B \-waveFreq \fInum\fP\fP
-Specifies the maximum frequency of ripples. default 3.0
-.TP 8
-.B \-zoom \fInum\fP\fP
-Specifies the size of the viewport. Smaller values fill the screen with rippling surface. default 1.0
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long to pause between frames. Default is 20000, or 0.02 second.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2000 by Josiah Pease. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Josiah Pease <gflux@jpease.force9.co.uk>, 10-Jun-2000.
-
diff --git a/hacks/glx/gibson.c b/hacks/glx/gibson.c
deleted file mode 100644
index e90d8d2..0000000
--- a/hacks/glx/gibson.c
+++ /dev/null
@@ -1,1333 +0,0 @@
-/* gibson, Copyright (c) 2020-2021 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Hacking the Gibson, as per the 1995 classic film, HACKERS.
- *
- * In the movie, this was primarily a practical effect: the towers were
- * edge-lit etched perspex, each about four feet tall.
- */
-
-#define TOWER_FONT "sans-serif bold 48"
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*groundColor: #8A2BE2" "\n" \
- "*towerColor: #4444FF" "\n" \
- "*towerText: #DDDDFF" "\n" \
- "*towerText2: #FF0000" "\n" \
- "*towerFont: " TOWER_FONT "\n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_gibson 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "rotator.h"
-#include "texfont.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPEED "1.0"
-#define DEF_TEXTURE "True"
-#define DEF_GRID_WIDTH "6"
-#define DEF_GRID_HEIGHT "7"
-#define DEF_GRID_DEPTH "6"
-#define DEF_GRID_SPACING "2.0"
-#define DEF_COLUMNS "5"
-
-#define GROUND_QUAD_SIZE 30
-
-typedef struct {
- GLfloat x, y, h;
- GLuint fg_dlists[5], bg_dlists[5];
- int fg_polys, bg_polys;
- unsigned int face_mode; /* 5 bit field */
-} tower;
-
-typedef struct {
- GLXContext *glx_context;
- Bool button_down_p;
- rotator *rot, *rot2;
- GLfloat xscroll, yscroll;
- GLfloat oxscroll, oyscroll;
-
- GLuint ground_dlist;
- GLuint tower_dlist;
- int ground_polys, tower_polys;
- GLfloat ground_y;
- GLfloat billboard_y;
- const char *billboard_text;
-
- int ntowers;
- tower *towers;
- GLfloat tower_color[4];
- GLfloat tower_color2[4];
- GLfloat edge_color[4];
- GLfloat bg_color[4];
- Bool startup_p;
-
- struct {
- GLuint texid;
- XCharStruct metrics;
- int width, height;
- texture_font_data *font_data;
- int ascent, descent, em_width;
- char *text;
- } text[2];
-
-} gibson_configuration;
-
-static gibson_configuration *ccs = NULL;
-
-static GLfloat speed;
-static Bool do_tex;
-static int grid_width;
-static int grid_height;
-static int grid_depth;
-static GLfloat grid_spacing;
-static int columns;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-texture", ".texture", XrmoptionNoArg, "True" },
- { "+texture", ".texture", XrmoptionNoArg, "False" },
- { "-grid-width", ".gridWidth", XrmoptionSepArg, 0 },
- { "-grid-height", ".gridHeight", XrmoptionSepArg, 0 },
- { "-grid-depth", ".gridDepth", XrmoptionSepArg, 0 },
- { "-spacing", ".gridSpacing", XrmoptionSepArg, 0 },
- { "-columns", ".columns", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&do_tex, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&grid_width, "gridWidth", "GridWidth", DEF_GRID_WIDTH, t_Int},
- {&grid_height, "gridHeight", "GridHeight", DEF_GRID_HEIGHT, t_Int},
- {&grid_depth, "gridDepth", "GridDepth", DEF_GRID_DEPTH, t_Int},
- {&grid_spacing, "gridSpacing", "GridSpacing", DEF_GRID_SPACING, t_Float},
- {&columns, "columns", "Columns", DEF_COLUMNS, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt gibson_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-ENTRYPOINT void
-reshape_gibson (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-# ifdef DEBUG
- gluPerspective (30, 1/h, 1, 100);
-# else
- gluPerspective (100, 1/h/4,
- 1.0,
- 20 * grid_depth * 1.5 * (1 + grid_spacing));
-# endif
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0, 0, 1,
- 0, 0, 0,
- 0, 1, 0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-/* Copied from gltrackball.c */
-static void
-adjust_for_device_rotation (double *x, double *y, double *w, double *h)
-{
- int rot = (int) current_device_rotation();
- int swap;
-
- while (rot <= -180) rot += 360;
- while (rot > 180) rot -= 360;
-
- if (rot > 135 || rot < -135) /* 180 */
- {
- *x = *w - *x;
- *y = *h - *y;
- }
- else if (rot > 45) /* 90 */
- {
- swap = *x; *x = *y; *y = swap;
- swap = *w; *w = *h; *h = swap;
- *x = *w - *x;
- }
- else if (rot < -45) /* 270 */
- {
- swap = *x; *x = *y; *y = swap;
- swap = *w; *w = *h; *h = swap;
- *y = *h - *y;
- }
-}
-
-
-ENTRYPOINT Bool
-gibson_handle_event (ModeInfo *mi, XEvent *event)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- double w = MI_WIDTH(mi);
- double h = MI_HEIGHT(mi);
- double xoff = 0, yoff = 0;
-
- if (event->xany.type == ButtonPress ||
- event->xany.type == ButtonRelease)
- {
- double x = event->xbutton.x;
- double y = event->xbutton.y;
- adjust_for_device_rotation (&x, &y, &w, &h);
- xoff = (x / w) - 0.5;
- yoff = (event->xbutton.y / h) - 0.5;
- bp->button_down_p = (event->xany.type == ButtonPress);
- bp->oxscroll = xoff;
- bp->oyscroll = yoff;
-
- return True;
- }
- else if (event->xany.type == MotionNotify)
- {
- double x = event->xmotion.x;
- double y = event->xmotion.y;
- adjust_for_device_rotation (&x, &y, &w, &h);
- xoff = (x / w) - 0.5;
- yoff = (y / h) - 0.5;
- if (bp->button_down_p)
- {
- bp->xscroll += xoff - bp->oxscroll;
- bp->yscroll += yoff - bp->oyscroll;
- bp->oxscroll = xoff;
- bp->oyscroll = yoff;
- }
- return True;
- }
-
- return False;
-}
-
-
-static void
-parse_color (ModeInfo *mi, char *key, GLfloat color[4])
-{
- XColor xcolor;
- char *string = get_string_resource (mi->dpy, key, "Color");
- if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
- {
- fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
- key, string);
- exit (1);
- }
- free (string);
-
- color[0] = xcolor.red / 65536.0;
- color[1] = xcolor.green / 65536.0;
- color[2] = xcolor.blue / 65536.0;
- color[3] = 1;
-}
-
-
-static int
-draw_ground (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- int x, y;
- int cells = 20;
- GLfloat color[4];
- GLfloat color0[4];
- GLfloat cell_size = 1.0;
- GLfloat z = -0.005;
-
- parse_color (mi, "groundColor", color);
- parse_color (mi, "towerColor", color0);
- color0[0] *= 0.05;
- color0[1] *= 0.05;
- color0[2] *= 0.3;
- color0[3] = 1;
-
- if (!wire)
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
-
- glFogi (GL_FOG_MODE, GL_EXP2);
- glFogfv (GL_FOG_COLOR, fog_color);
- glFogf (GL_FOG_DENSITY, 0.015);
- glFogf (GL_FOG_START, -cells/2 * cell_size);
- glEnable (GL_FOG);
- }
-
- glPushMatrix();
- glScalef (1.0/cells, 1.0/cells, 1);
- glTranslatef (-cells/2.0, -cells/2.0, 0);
- glTranslatef (0.5, 0, 0);
-
- glBegin (GL_QUADS); /* clipping quad */
- glColor4fv (color0);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color0);
-
- glVertex3f (0, 0, z);
- glVertex3f (cells * cell_size, 0, z);
- glVertex3f (cells * cell_size, cells * cell_size, z);
- glVertex3f (0, cells * cell_size, z);
- glEnd();
- polys++;
-
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
-
- for (y = 0; y < cells; y++)
- for (x = 0; x < cells; x++)
- {
- GLfloat a = 0;
- GLfloat b = 1.0/3;
- GLfloat c = 2.0/3;
- GLfloat d = 1.0;
- GLfloat w = 0.02;
-
- glPushMatrix();
- glTranslatef (x, y, 0);
-
- glNormal3f (0, 0, 1);
-
- switch (random() % 4) {
- case 0:
- glRotatef (90, 0, 0, 1);
- glTranslatef (0, -1, 0);
- break;
- case 1:
- glRotatef (-90, 0, 0, 1);
- glTranslatef (-1, 0, 0);
- break;
- case 2:
- glRotatef (180, 0, 0, 1);
- glTranslatef (-1, -1, 0);
- break;
- default: break;
- }
-
- switch (random() % 2) {
- case 0:
- glScalef (-1, -1, 1);
- glTranslatef (-1, -1, 0);
- break;
- default: break;
- }
-
- switch (random() % 2) {
- case 0:
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUAD_STRIP);
- glVertex3f (a, b+w, 0);
- glVertex3f (a, b-w, 0); polys++;
- glVertex3f (b+w, a, 0); polys++;
- glVertex3f (b-w, a, 0); polys++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUAD_STRIP);
- glVertex3f (a, c+w, 0);
- glVertex3f (a, c-w, 0); polys++;
- glVertex3f (b+w, c+w, 0); polys++;
- glVertex3f (b, c-w, 0); polys++;
- glVertex3f (c+w, b+w, 0); polys++;
- glVertex3f (c-w, b, 0); polys++;
- glVertex3f (c+w, a, 0); polys++;
- glVertex3f (c-w, a, 0); polys++;
- glEnd();
-
-/*
- glBegin (wire ? GL_LINE_LOOP : GL_QUAD_STRIP);
- glVertex3f (c+w, d, 0);
- glVertex3f (c-w, d, 0); polys++;
- glVertex3f (d, c+w, 0); polys++;
- glVertex3f (d, c-w, 0); polys++;
- glEnd();
-*/
- break;
-
- default:
- glBegin (wire ? GL_LINE_LOOP : GL_QUAD_STRIP);
- glVertex3f (a+w, d, 0);
- glVertex3f (a, d, 0); polys++;
- glVertex3f (a+w, d, 0);
- glVertex3f (a, d-w, 0); polys++;
- glVertex3f (b+w, c-w, 0); polys++;
- glVertex3f (b-w, c-w, 0); polys++;
- glVertex3f (b+w, a, 0); polys++;
- glVertex3f (b-w, a, 0); polys++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUAD_STRIP);
- glVertex3f (b+w, d, 0);
- glVertex3f (b-w, d, 0); polys++;
- glVertex3f (c+w, c-w, 0); polys++;
- glVertex3f (c-w, c-w, 0); polys++;
- glVertex3f (c+w, a, 0); polys++;
- glVertex3f (c-w, a, 0); polys++;
- glEnd();
- break;
- }
-
- glPopMatrix();
- }
- glPopMatrix();
-
- if (!wire)
- {
- glDisable (GL_BLEND);
- glDisable (GL_FOG);
- }
-
- return polys;
-}
-
-
-/* qsort comparator for sorting towers by y position */
-static int
-cmp_towers (const void *aa, const void *bb)
-{
- const tower *a = (tower *) aa;
- const tower *b = (tower *) bb;
- return ((int) (b->y * 10000) -
- (int) (a->y * 10000));
-}
-
-
-static GLfloat
-ease_fn (GLfloat r)
-{
- return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
-}
-
-
-static GLfloat
-ease_ratio (GLfloat r)
-{
- GLfloat ease = 0.5;
- if (r <= 0) return 0;
- else if (r >= 1) return 1;
- else if (r <= ease) return ease * ease_fn (r / ease);
- else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
- else return r;
-}
-
-
-/* Draws the text quads on the face.
- First pass is for the small background text, second is for the big block.
- */
-static int
-draw_tower_face_text (ModeInfo *mi, GLfloat height, Bool which)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
- Bool wire2 = False; /* Debugging quads */
- Bool bg_p = (which == 1 && do_tex && !wire);
-
- /* The texture is a tex_width x tex_height rectangle, of which we
- only use the rbearing+lbearing x ascent+descent sub-rectangle.
- Texture coordinates reference the tex_width x tex_height rectangle
- as a 0.0 - 1.0 coordinate.
- */
- int n = which ? 1 : 0;
- GLfloat twratio = ((bp->text[n].metrics.rbearing +
- bp->text[n].metrics.lbearing) /
- (GLfloat) bp->text[n].width);
- GLfloat thratio = ((bp->text[n].metrics.ascent +
- bp->text[n].metrics.descent) /
- (GLfloat) bp->text[n].height);
- GLfloat aspect = ((bp->text[n].ascent + bp->text[n].descent) /
- (GLfloat) bp->text[n].em_width);
-
- GLfloat sx = 1.0 / (which ? 1 : columns);
- GLfloat sy = (which
- ? height * 0.8
- : sx * 4); /* Tweaked to match gluPerspective */
-
- GLfloat lines_in_tex = ((bp->text[n].metrics.ascent +
- bp->text[n].metrics.descent) /
- (GLfloat)
- (bp->text[n].ascent + bp->text[n].descent));
- GLfloat tex_lines = (which ? 3 : 8); /* Put this many lines in each quad */
-
- GLfloat tsx = sx * twratio;
- GLfloat tsy = sy * thratio * tex_lines / lines_in_tex * aspect;
- GLfloat x1, tx1;
- GLfloat margin = 0.2;
- GLfloat m2 = margin/2 / (which ? 1 : columns);
- GLfloat m3 = m2 / (which ? 1 : height);
- GLfloat h2 = height * (which ? 1-margin : 1);
-
- glColor4fv (which ? bp->tower_color2 : bp->tower_color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
- which ? bp->tower_color2 : bp->tower_color);
-
- glBindTexture (GL_TEXTURE_2D, bp->text[n].texid);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- if (!wire && !wire2 && !bg_p) glBegin (GL_QUADS);
- for (x1 = 0, tx1 = 0; x1 < 1.0; x1 += sx, tx1 += tsx)
- {
- GLfloat x2 = x1 + sx;
- GLfloat tx2 = tx1 + tsx;
- GLfloat y2, ty2;
- GLfloat z = (which ? 0.05 : 0);
-
- tx1 = 0;
- tx2 = twratio;
-
- for (y2 = h2, ty2 = thratio;
- y2 > 0;
- y2 -= sy, ty2 -= tsy)
- {
- GLfloat y1 = y2 - sy * (1-margin);
- GLfloat ty1 = ty2 - tsy;
- GLfloat toff = frand ((bp->text[n].metrics.ascent +
- bp->text[n].metrics.descent)
- * 0.8);
-
- if (y1 < 0) /* Clip the panel to the bottom of the tower face */
- {
- tsy = y2 / (y2 - y1);
- y1 = 0;
- }
-
- ty1 = toff;
- ty2 = ty1 + tsy;
-
- if (wire2 && which) glColor3f (1,0,0);
- if (wire || wire2 || bg_p)
- glBegin (!wire && (wire2 || bg_p) ? GL_QUADS : GL_LINE_LOOP);
- glTexCoord2f(tx1, ty2); glVertex3f (x1+m2, y1+m3, z);
- glTexCoord2f(tx2, ty2); glVertex3f (x2-m2, y1+m3, z);
- glTexCoord2f(tx2, ty1); glVertex3f (x2-m2, y2-m3, z);
- glTexCoord2f(tx1, ty1); glVertex3f (x1+m2, y2-m3, z);
- if (wire || wire2 || bg_p)
- glEnd();
- polys++;
-
- if (bg_p)
- {
- GLfloat bg[4] = { 1, 1, 1, 0.2 };
- z -= 0.1;
- m2 -= 0.03;
- m3 -= 0.03;
- glColor4fv (bg);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, bg);
- }
-
- if ((wire2 || bg_p) && !wire)
- {
- if (do_tex) glDisable(GL_TEXTURE_2D);
- glBegin (bg_p ? GL_QUADS : GL_LINE_LOOP);
- glVertex3f (x1+m2, y1+m3, z);
- glVertex3f (x2-m2, y1+m3, z);
- glVertex3f (x2-m2, y2-m3, z);
- glVertex3f (x1+m2, y2-m3, z);
- glEnd();
- polys++;
- if (do_tex) glEnable(GL_TEXTURE_2D);
- }
-
- if (which) break;
- }
- }
- if (!wire && !wire2 && !bg_p) glEnd();
-
- return polys;
-}
-
-
-/* Draws the wall of the face, and the edges, then the text quads on it.
- */
-static int
-draw_tower_face (ModeInfo *mi, GLfloat height, int mode)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int polys = 0;
-
- switch (mode) {
- case 0:
- if (! wire)
- {
- GLfloat m = 0.015;
- GLfloat z = -0.0005;
- if (do_tex) glDisable (GL_TEXTURE_2D);
-
- glNormal3f (0, 0, 1);
-
- glColor4fv (bp->bg_color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
- bp->bg_color);
-
- glBegin (GL_QUADS);
- glVertex3f (0, 0, z*2); /* background */
- glVertex3f (1, 0, z*2);
- glVertex3f (1, height, z*2);
- glVertex3f (0, height, z*2);
- polys++;
- glEnd();
-
- glColor4fv (bp->edge_color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
- bp->edge_color);
-
- glBegin (GL_QUADS);
- glVertex3f (0, 0, z); /* left */
- glVertex3f (m, 0, z);
- glVertex3f (m, height, z);
- glVertex3f (0, height, z);
- polys++;
-
- glVertex3f (1-m, 0, 0); /* right */
- glVertex3f (1, 0, 0);
- glVertex3f (1, height, z);
- glVertex3f (1-m, height, z);
- polys++;
-
- glVertex3f (m, 0, 0); /* bottom */
- glVertex3f (1-m, 0, 0);
- glVertex3f (1-m, m, 0);
- glVertex3f (m, m, 0);
- polys++;
-
- glVertex3f (m, height-m, z); /* top */
- glVertex3f (1-m, height-m, z);
- glVertex3f (1-m, height, z);
- glVertex3f (m, height, z);
- polys++;
- glEnd();
-
- if (do_tex) glEnable (GL_TEXTURE_2D);
- }
- break;
- case 1:
- polys += draw_tower_face_text (mi, height, 0);
- break;
- case 2:
- polys += draw_tower_face_text (mi, height * 0.7, 1);
- break;
- default:
- abort();
- break;
- }
-
- return polys;
-}
-
-
-/* Mode 0: draws 5 sides of the box
- Mode 1: just background text
- Mode 2: just foreground text
- */
-static int
-draw_tower (ModeInfo *mi, tower *t, int mode, int face)
-{
- GLfloat height = grid_height;
-
- int polys = 0;
-
- glPushMatrix();
- glTranslatef (-0.5, 0.5, 0);
-
- if (face == 0 || face == -1)
- {
- glPushMatrix(); /* top */
- glTranslatef (0, 0, height);
- polys += draw_tower_face (mi, 1.0, mode);
- glPopMatrix();
- }
-
- if (face == 1 || face == -1)
- {
- glPushMatrix(); /* left */
- glRotatef ( 90, 1, 0, 0);
- glRotatef (-90, 0, 1, 0);
- glTranslatef (-1, 0, 0);
- polys += draw_tower_face (mi, height, mode);
- glPopMatrix();
- }
-
- if (face == 2 || face == -1)
- {
- glPushMatrix(); /* back */
- glRotatef ( 90, 1, 0, 0);
- glRotatef (180, 0, 1, 0);
- glTranslatef (-1, 0, 1);
- polys += draw_tower_face (mi, height, mode);
- glPopMatrix();
- }
-
- if (face == 3 || face == -1)
- {
- glPushMatrix(); /* right */
- glRotatef ( 90, 1, 0, 0);
- glRotatef ( 90, 0, 1, 0);
- glTranslatef (0, 0, 1);
- polys += draw_tower_face (mi, height, mode);
- glPopMatrix();
- }
-
- if (face == 4 || face == -1)
- {
- glPushMatrix(); /* front */
- glRotatef ( 90, 1, 0, 0);
- polys += draw_tower_face (mi, height, mode);
- glPopMatrix();
- }
-
- if (face < -1 || face > 4) abort();
-
- glPopMatrix();
- return polys;
-}
-
-
-static void
-animate_towers (ModeInfo *mi)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- int ii;
- GLfloat min = -3;
- GLfloat max = grid_depth * (1 + grid_spacing) - grid_spacing - 1;
- GLfloat yspeed = speed * 0.05;
-
- for (ii = 0; ii < 20; ii++)
- {
- int jj, kk;
-
- /* randomly trade two towers' fg dlists */
- if (0 == (random() % 20))
- {
- int i = random() % bp->ntowers;
- int j = random() % bp->ntowers;
- int k = random() % countof(bp->towers[i].fg_dlists);
- GLuint d1 = bp->towers[i].bg_dlists[k];
- GLuint d2 = bp->towers[j].bg_dlists[k];
- bp->towers[i].bg_dlists[k] = d2;
- bp->towers[j].bg_dlists[k] = d1;
- }
-
- /* randomly trade two towers' bg dlists */
- if (1) /* (0 == (random() % 3)) */
- {
- int i = random() % bp->ntowers;
- int j = random() % bp->ntowers;
- int k = random() % countof(bp->towers[i].fg_dlists);
- GLuint d1 = bp->towers[i].fg_dlists[k];
- GLuint d2 = bp->towers[j].fg_dlists[k];
- bp->towers[i].fg_dlists[k] = d2;
- bp->towers[j].fg_dlists[k] = d1;
- }
-
- /* Randomize whether it's displaying fg text or bg text */
- for (jj = 0; jj < bp->ntowers; jj++)
- for (kk = 0; kk < countof(bp->towers[jj].fg_dlists); kk++)
- {
- /* Re-choose every N frames. Display fg 1 in M. */
- int frames = 500;
- int fg_chance = (kk == 0 ? 100000 : 10);
- unsigned int o = !!(bp->towers[jj].face_mode & (1 << kk));
- unsigned int n = !!((random() % frames) ? o :
- (0 == (random() % fg_chance)));
- bp->towers[jj].face_mode =
- ((bp->towers[jj].face_mode & ~(1 << kk)) | (n << kk));
- }
- }
-
- for (ii = 0; ii < bp->ntowers; ii++)
- {
- tower *t = &bp->towers[ii];
- t->h += speed * 0.01;
- if (t->h > 1) t->h = 1;
-
- t->y -= yspeed;
-
- if (t->y < min)
- {
- t->h = 0;
- t->y = max;
- }
- }
-
- /* Sorting by depth improves frame rate slightly. */
- qsort (bp->towers, bp->ntowers, sizeof(*bp->towers), cmp_towers);
-
- bp->ground_y -= yspeed / GROUND_QUAD_SIZE;
- if (bp->ground_y < 1)
- bp->ground_y += 1;
-
- bp->billboard_y -= yspeed;
- if (bp->billboard_y < min || !bp->billboard_text)
- {
- const char *const ss[] = {
- "ACCESS GRANTED",
- "ACCESS GRANTED",
- "ACCESS DENIED",
- "ACCESS DENIED",
- "ACCESS DENIED",
- "ACCESS DENIED",
- "ACCESS DENIED",
- "PASSWORD ACCEPTED",
- " GIVE ME\nA COOKIE",
- "MESS WITH THE BEST\n DIE LIKE THE REST",
- };
-
- bp->billboard_y = max * (1 + frand(8));
- bp->billboard_text = ss[random() % countof(ss)];
- }
-}
-
-
-static int
-draw_billboard (ModeInfo *mi)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- int polys = 0;
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat w, h, s, margin, margin2;
- XCharStruct metrics;
- int ascent, descent;
- texture_font_data *font = bp->text[1].font_data;
- GLfloat color[4];
- GLfloat y = grid_height * 0.3;
-
- texture_string_metrics (font, bp->billboard_text,
- &metrics, &ascent, &descent);
- w = metrics.lbearing + metrics.rbearing;
- h = metrics.ascent + metrics.descent;
- s = 1.0 / w;
- s *= 0.95;
-
- margin = w * 0.1;
- margin2 = margin * 1.7;
-
- glPushMatrix();
-
- glTranslatef (-0.5, bp->billboard_y, y);
- glRotatef (90, 1, 0, 0);
- glScalef (s, s * 1.5, s);
-
- memcpy (color, bp->tower_color2, sizeof(color));
- color[3] = 0.6;
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
-
- if (do_tex && !wire)
- glDisable (GL_TEXTURE_2D);
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glNormal3f (0, 0, 1);
- glVertex3f (-margin, -margin2, 0);
- glVertex3f (-margin, h+margin2, 0);
- glVertex3f (w+margin, h+margin2, 0);
- glVertex3f (w+margin, -margin2, 0);
- glEnd();
- polys++;
-
- if (do_tex && !wire)
- {
- color[3] = 1;
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glEnable (GL_TEXTURE_2D);
- glTranslatef (-metrics.lbearing, metrics.descent, 0);
- print_texture_string (font, bp->billboard_text);
- polys++;
- }
-
- glPopMatrix();
- return polys;
-}
-
-
-static void
-init_text (ModeInfo *mi)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- int lines = 20;
- int i;
- char *s;
-
- const char *const ss[] = {
- "\n"
- "ACCESS TO THIS COMPUTER AND\n"
- "ITS DATA IS RESTRICTED TO\n"
- "AUTHORIZED PERSONNEL ONLY\n"
- "\n",
- "\n"
- " PASSWORD ACCEPTED\n"
- " GOD\n"
- "\n",
- "PERSONNEL >>>\n",
- "SEA ROUTINGS >>>\n",
- "GARBAGE >>>\n",
- "COMP. SERVICING >>>\n",
- "COMPANY BUDGETS >>>\n",
- "SCIENTIFIC BUDGETS >>>\n",
- "COMPANY POLICIES >>>\n",
- "ANNUAL RETURNS >>>\n",
- "MINE RESEARCH >>>\n",
- "CENTRAL LIBRARY >>>\n",
- "QUANTATIVE SPEC. >>>\n",
- "PAYMENT LEVELS >>>\n",
- "CENTRAL SERVER >>>\n",
- "GARBAGE >>>\n",
- "KNMTS. DVPNT. >>>\n",
- "LICENSING >>>\n",
- "RELATIONS >>>\n",
- "TIME SHEET RECS. >>>\n",
- "RD. PRT. ROUTINGS >>>\n",
- "RECRUITMENT >>>\n",
- "TNKR. EXPENDITURE >>>\n",
- "MINE DEVELOPMENT >>>\n",
- "GARBAGE >>>\n",
- "ANNUAL BUDGETS >>>\n",
- "OIL LOCATIONS >>>\n",
- "TIME SHEET RECS. >>>\n",
- "RD. PRT. ROUTINGS >>>\n",
- "KINEMATICS >>>\n",
- "TPS. REPORTS >>>\n",
- "BLAST FRNC. STATUS >>>\n",
- "ACCOUNTANTS >>>\n",
- "SHIPPING FORCASTS >>>\n",
- "INDST. REPORTS >>>\n",
- "EXPLOR. DVLT. >>>\n",
- "WRHSE. EXPEND. >>>\n",
- "GARBAGE >>>\n",
- "RELOCATIONS >>>\n",
- "AIRFREIGHT STATUS >>>\n",
- "TPGC. EXPEND. >>>\n",
- "SEA-BOARD LAWS >>>\n",
- "COMPOSITE PLANTS >>>\n",
- "NUCLEAR RESEARCH >>>\n",
- "BALLAST REPORTS >>>\n",
- "\n"
- "CONFIDENTAL\n"
- "FILES\n"
- "DO NOT DELETE\n"
- "BEFORE FINAL\n"
- "BACKUP IS COMPLETED\n"
- "\n",
- "\n"
- "FILE 1\n"
- "WAITING FOR BACK-UP\n"
- "\n"
- "FILE 2\n"
- "WAITING FOR BACK-UP\n"
- "\n"
- "FILE 3\n"
- "WAITING FOR BACK-UP\n"
- "\n"
- "FILE 4\n"
- "WAITING FOR BACK-UP\n"
- "\n"
- };
-
-
- bp->text[1].text = s = calloc (countof(ss) * 2 * 40, 1);
- for (i = 0; i < countof(ss); i++)
- {
- int n = random() % countof(ss);
- strcat (s, ss[n]);
- s += strlen(s);
- }
-
- bp->text[0].text = s = calloc (lines * 40, 1);
- for (i = 0; i < lines; i++)
- {
- switch (random() % 11) {
- case 0: sprintf (s, "%X\n", random() % 0xFFFFFFFF); break;
- case 1: sprintf (s, "%X\n", random() % 0xFFFFFF); break;
- case 2: sprintf (s, "%X\n", random() % 0xFFFF); break;
- case 3: sprintf (s, "%d\n", random() % 0xFFFFFF); break;
- case 4: sprintf (s, "%d\n", random() % 0xFFFF); break;
- case 5: sprintf (s, "%d\n", random() % 0xFFF); break;
- case 6: strcat (s, "00000000\n"); break;
- case 7: sprintf (s, "{{{{{{{{\n"); break;
- case 8: sprintf (s, "[][][][][][]\n"); break;
- case 9: sprintf (s, "DEFAULT\n"); break;
- case 10: sprintf (s, "\n"); break;
- }
- s += strlen(s);
- }
-}
-
-
-static void
-init_textures (ModeInfo *mi)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < countof(bp->text); i++)
- {
- glGenTextures (1, &bp->text[i].texid);
- glBindTexture (GL_TEXTURE_2D, bp->text[i].texid);
- texture_string_metrics (bp->text[i].font_data, " ",
- &bp->text[i].metrics,
- &bp->text[i].ascent,
- &bp->text[i].descent);
- bp->text[i].em_width = bp->text[i].metrics.width;
- string_to_texture (bp->text[i].font_data, bp->text[i].text,
- &bp->text[i].metrics,
- &bp->text[i].width,
- &bp->text[i].height);
- }
- glBindTexture (GL_TEXTURE_2D, 0);
-}
-
-
-ENTRYPOINT void
-init_gibson (ModeInfo *mi)
-{
- gibson_configuration *bp;
-
- MI_INIT (mi, ccs);
-
- bp = &ccs[MI_SCREEN(mi)];
-
- if ((bp->glx_context = init_GL(mi)) != NULL) {
- reshape_gibson (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- parse_color (mi, "towerText", bp->tower_color);
- parse_color (mi, "towerText2", bp->tower_color2);
- parse_color (mi, "towerColor", bp->bg_color);
- memcpy (bp->edge_color, bp->bg_color, sizeof(bp->tower_color));
- bp->edge_color [3] = 0.7;
- bp->bg_color [3] = 1.0;
- bp->tower_color [3] = 1.0;
- bp->tower_color2[3] = 1.0;
-
- if (grid_spacing < 1) grid_spacing = 1;
- if (grid_width < 1) grid_width = 1;
- if (grid_height < 1) grid_height = 1;
- if (grid_depth < 1) grid_depth = 1;
- if (columns < 1) columns = 1;
- bp->ntowers = grid_width * grid_depth;
- bp->towers = (tower *) calloc (sizeof(tower), bp->ntowers);
- bp->startup_p = True;
-
- {
- double wander_speed = 0.007 * speed;
- double tilt_speed = 0.01 * speed;
- bp->rot = make_rotator (0, 0, 0, 0, wander_speed, True);
- bp->rot2 = make_rotator (0, 0, 0, 0, tilt_speed, True);
- }
-
- bp->text[0].font_data = load_texture_font (mi->dpy, "towerFont");
- bp->text[1].font_data = load_texture_font (mi->dpy, "towerFont");
- init_text (mi);
- init_textures (mi);
-
- bp->ground_dlist = glGenLists (1);
- glNewList (bp->ground_dlist, GL_COMPILE);
- bp->ground_polys = draw_ground (mi);
- glEndList ();
-
- bp->tower_dlist = glGenLists (1);
- glNewList (bp->tower_dlist, GL_COMPILE);
- bp->tower_polys = draw_tower (mi, &bp->towers[0], 0, -1);
- glEndList ();
-
- {
- int x, y;
- GLfloat ww = grid_width * (1 + grid_spacing) - grid_spacing;
- GLfloat hh = grid_depth * (1 + grid_spacing) - grid_spacing;
- for (y = 0; y < grid_depth; y++)
- for (x = 0; x < grid_width; x++)
- {
- int i;
- tower *t = &bp->towers[y * grid_width + x];
- t->x = (x * ww / (grid_width - 1)) - ww/2;
- t->y = (y * hh / grid_depth) + 6;
- t->h = 0 - y / (GLfloat) grid_depth / 2;
-
- for (i = 0; i < countof(t->fg_dlists); i++)
- {
- t->bg_dlists[i] = glGenLists (1);
- glNewList (t->bg_dlists[i], GL_COMPILE);
- t->bg_polys = draw_tower (mi, t, 1, i);
- glEndList ();
-
- t->fg_dlists[i] = glGenLists (1);
- glNewList (t->fg_dlists[i], GL_COMPILE);
- t->fg_polys += draw_tower (mi, t, 2, i);
- glEndList ();
- }
- }
- }
-
- animate_towers (mi);
-}
-
-
-ENTRYPOINT void
-draw_gibson (ModeInfo *mi)
-{
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat s;
- int i;
-
- static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat bshiny = 128.0;
- GLfloat bcolor[4] = { 0.7, 0.7, 1.0, 1.0 };
-
- if (!bp->glx_context)
- return;
-
- mi->polygon_count = 0;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel (GL_SMOOTH);
- glEnable (GL_NORMALIZE);
- glEnable (GL_CULL_FACE);
- glDisable (GL_TEXTURE_2D);
- glEnable (GL_DEPTH_TEST);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (!wire)
- {
- GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- glPushMatrix ();
-
- glRotatef(current_device_rotation(), 0, 0, 1);
-
-# ifdef DEBUG
- s = 0.02;
-# else
- s = 10;
-# endif
-
- glScalef (s, s, s);
-
- glTranslatef (0, -1, 0);
-
-# ifndef DEBUG
- glRotatef (-82, 1, 0, 0);
-
- {
- double maxx = 40; /* up/down */
- double maxy = 1.5; /* tilt */
- double maxz = 100; /* left/right */
-
- double x, y, z;
- double minh = -(grid_height / 2.0);
- double maxh = -(grid_height / 20.0);
-
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- x -= 0.5;
- z = minh + (z * (maxh - minh));
- glTranslatef(x * grid_spacing * 0.005, 0, z);
-
- get_position (bp->rot2, &x, &y, &z, !bp->button_down_p);
-
- z += (bp->xscroll / 2.0);
- x += (bp->yscroll / 2.0);
-
- glRotatef (maxx/2 - x*maxx, 1, 0, 0);
- glRotatef (maxy/2 - y*maxy, 0, 1, 0);
- glRotatef (maxz/2 - z*maxz, 0, 0, 1);
- }
-# endif /* DEBUG */
-
- glPushMatrix();
- glScalef (GROUND_QUAD_SIZE, GROUND_QUAD_SIZE, 1);
-
- glTranslatef (0, bp->ground_y - 1.5, 0);
- glCallList (bp->ground_dlist);
- mi->polygon_count += bp->ground_polys;
-
- glTranslatef (0, 1, 0);
- glCallList (bp->ground_dlist);
- mi->polygon_count += bp->ground_polys;
- glPopMatrix();
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
-
- glPushMatrix();
-
- if (grid_width & 1) /* Stay between towers */
- glTranslatef ((grid_spacing + 1) / 2.0, 0, 0);
-
-
- if (!wire)
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
- glFogfv (GL_FOG_COLOR, fog_color);
- /* I so don't understand how to choose the fog parameters. */
- glFogi (GL_FOG_MODE, GL_LINEAR);
- glFogf (GL_FOG_START, 0);
- glFogf (GL_FOG_END, 100);
- glEnable (GL_FOG);
- }
-
- /* Clear the floor under the tower bases */
-
- {
- GLfloat color0[4] = { 0, 0, 0, 1 };
- GLfloat z = 0.01;
-
- if (do_tex && !wire) glDisable (GL_TEXTURE_2D);
- glColor4fv (color0);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color0);
- glDisable (GL_BLEND);
- glDisable (GL_DEPTH_TEST);
-
- for (i = 0; i < bp->ntowers; i++)
- {
- tower *t = &bp->towers[i];
- glPushMatrix();
- glTranslatef (t->x, t->y, 0);
-
- glNormal3f (0, 0, 1);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* clipping quad */
- glVertex3f (-0.5, -0.5, z);
- glVertex3f ( 0.5, -0.5, z);
- glVertex3f ( 0.5, 0.5, z);
- glVertex3f (-0.5, 0.5, z);
- glEnd();
- mi->polygon_count++;
- glPopMatrix();
- }
- }
-
- glEnable (GL_DEPTH_TEST);
-
- if (!wire)
- {
- if (do_tex)
- {
- glEnable (GL_TEXTURE_2D);
- enable_texture_string_parameters (bp->text[0].font_data);
- }
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE);
- glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
- glDisable (GL_CULL_FACE);
- if (bp->startup_p)
- glEnable (GL_DEPTH_TEST);
- else
- glDisable (GL_DEPTH_TEST);
- }
-
- /* Draw the towers */
-
- for (i = 0; i < bp->ntowers; i++)
- {
- tower *t = &bp->towers[i];
- glPushMatrix();
- glTranslatef (t->x, t->y-1, -grid_height * ease_ratio (1 - t->h));
-
- glCallList (bp->tower_dlist);
- mi->polygon_count += bp->tower_polys;
-
- if (wire || do_tex)
- {
- int j;
- for (j = 0; j < countof(t->fg_dlists); j++)
- {
- if (! (t->face_mode & (1 << j)))
- {
- glCallList (t->bg_dlists[j]);
- mi->polygon_count += t->bg_polys;
- }
- else
- {
- glCallList (t->fg_dlists[j]);
- mi->polygon_count += t->fg_polys;
- }
- }
- }
- glPopMatrix();
- }
-
- glPopMatrix();
-
- mi->polygon_count += draw_billboard (mi);
- glPopMatrix();
-
- if (!bp->button_down_p)
- animate_towers (mi);
-
- if (bp->startup_p && bp->towers[bp->ntowers-1].h >= 1)
- bp->startup_p = False;
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_gibson (ModeInfo *mi)
-{
- int i, j;
- gibson_configuration *bp = &ccs[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (bp->rot) free_rotator (bp->rot);
- if (bp->rot2) free_rotator (bp->rot2);
- if (glIsList(bp->ground_dlist)) glDeleteLists(bp->ground_dlist, 1);
- if (glIsList(bp->tower_dlist)) glDeleteLists(bp->tower_dlist, 1);
- for (i = 0; i < countof(bp->text); i++)
- {
- if (bp->text[i].font_data) free_texture_font (bp->text[i].font_data);
- if (bp->text[i].text) free (bp->text[i].text);
- }
- if (bp->towers)
- for (i = 0; i < bp->ntowers; i++)
- {
- for (j = 0; j < countof(bp->towers[i].fg_dlists); j++)
- {
- if (glIsList(bp->towers[i].fg_dlists[j]))
- glDeleteLists(bp->towers[i].fg_dlists[j], 1);
- if (glIsList(bp->towers[i].bg_dlists[j]))
- glDeleteLists(bp->towers[i].bg_dlists[j], 1);
- }
- }
-}
-
-
-XSCREENSAVER_MODULE ("Gibson", gibson)
-/* Greets to Crash Override, The Phantom Freak, and also Joey */
-
-#endif /* USE_GL */
diff --git a/hacks/glx/gibson.man b/hacks/glx/gibson.man
deleted file mode 100644
index 56aae6d..0000000
--- a/hacks/glx/gibson.man
+++ /dev/null
@@ -1,88 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-gibson \- Hacking the Gibson screen saver.
-.SH SYNOPSIS
-.B gibson
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-grid-width \fInumber\fP]
-[\-grid-depth \fInumber\fP]
-[\-grid-height \fInumber\fP]
-[\-grid-spacing \fInumber\fP]
-[\-columns \fInumber\fP]
-[\-no-texture]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Hacking the Gibson, as per the 1995 classic film, \fIHACKERS\fP.
-
-"Hackers penetrate and ravage delicate public and privately owned
-computer systems, infecting them with viruses, and stealing materials
-for their own ends. These people, they are terrorists."
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-grid-width \fInumber\fP
-Number of towers across. 1 - 20. Default: 10.
-.TP 8
-.B \-grid-depth \fInumber\fP
-Number of towers deep. 1 - 20. Default: 10.
-.TP 8
-.B \-grid-height \fInumber\fP
-Height of the towers. 1 - 20. Default: 7.
-.TP 8
-.B \-grid-spacing \fInumber\fP
-Space between towers. 1 - 5. Default: 2.0.
-.TP 8
-.B \-columns \fInumber\fP
-Columns of text on the towers. 1 - 20. Default: 6.
-.TP 8
-.B \-texture | \-no-texture
-Whether to draw text. Default true.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps | \-no-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2020 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/glblur.c b/hacks/glx/glblur.c
deleted file mode 100644
index 02bc447..0000000
--- a/hacks/glx/glblur.c
+++ /dev/null
@@ -1,629 +0,0 @@
-/* glblur --- radial blur using GL textures
- * Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * This program draws a box and a few line segments, and generates a flowing
- * radial blur outward from it -- this causes flowing field effects.
- * It does this by rendering the scene into a small texture, then repeatedly
- * rendering increasingly-enlarged and increasingly-transparent versions of
- * that texture onto the frame buffer.
- *
- * As such, it's quite graphics intensive -- don't bother trying to run this
- * if you don't have hardware-accelerated texture support.
- *
- * Inspired by Dario Corno's Radial Blur tutorial:
- * http://nehe.gamedev.net/tutorials/lesson.asp?l=36
- */
-
-#define DEFAULTS "*delay: 10000 \n" \
- "*showFPS: False \n" \
- "*fpsSolid: True \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_glblur 0
-
-#undef ABS
-#define ABS(n) ((n)<0?-(n):(n))
-#undef SIGNOF
-#define SIGNOF(n) ((n)<0?-1:1)
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_SPIN "XYZ"
-#define DEF_WANDER "True"
-#define DEF_BLUR_SIZE "15"
-
-typedef struct metaball metaball;
-
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLuint obj_dlist0; /* east-west cube faces */
- GLuint obj_dlist1; /* north-south cube faces */
- GLuint obj_dlist2; /* up-down cube faces */
- GLuint obj_dlist3; /* spikes coming out of the cube's corners */
- GLuint scene_dlist1; /* the cube, rotated and translated */
- GLuint scene_dlist2; /* the spikes, rotated and translated */
- int scene_polys1; /* polygons in scene, not counting texture overlay */
- int scene_polys2; /* polygons in scene, not counting texture overlay */
-
- GLuint texture;
- unsigned int *tex_data;
- int tex_w, tex_h;
-
- int ncolors;
- XColor *colors0;
- XColor *colors1;
- XColor *colors2;
- XColor *colors3;
- int ccolor;
-
- Bool show_cube_p;
- Bool show_spikes_p;
-
-} glblur_configuration;
-
-static glblur_configuration *bps = NULL;
-
-static char *do_spin;
-static Bool do_wander;
-static int blursize;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionSepArg, 0 },
- { "+spin", ".spin", XrmoptionNoArg, "" },
- { "-blursize", ".blurSize", XrmoptionSepArg, 0 },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&blursize, "blurSize","BlurSize", DEF_BLUR_SIZE, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt glblur_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_glblur (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- glViewport (0, 0, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 8.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-
-/* Objects in the scene
- */
-
-static void
-generate_object (ModeInfo *mi)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
- Bool wire = MI_IS_WIREFRAME (mi);
- int s = 10;
-
- bp->scene_polys1 = 0;
- bp->scene_polys2 = 0;
-
- glNewList (bp->obj_dlist0, GL_COMPILE);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* front */
- glNormal3f (0, 0, 1);
- glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, 0.5);
- glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
- glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, 0.5);
- glTexCoord2f(1, 1); glVertex3f (-0.5, -0.5, 0.5);
- bp->scene_polys1++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* back */
- glNormal3f (0, 0, -1);
- glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
- glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, -0.5);
- glTexCoord2f(1, 1); glVertex3f ( 0.5, 0.5, -0.5);
- glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, -0.5);
- bp->scene_polys1++;
- glEnd();
- glEndList();
-
- glNewList (bp->obj_dlist1, GL_COMPILE);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* left */
- glNormal3f (-1, 0, 0);
- glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, 0.5);
- glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, -0.5);
- glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
- glTexCoord2f(0, 1); glVertex3f (-0.5, -0.5, 0.5);
- bp->scene_polys1++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* right */
- glNormal3f (1, 0, 0);
- glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, -0.5);
- glTexCoord2f(1, 0); glVertex3f ( 0.5, 0.5, -0.5);
- glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
- glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, 0.5);
- bp->scene_polys1++;
- glEnd();
- glEndList();
-
- glNewList (bp->obj_dlist2, GL_COMPILE);
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* top */
- glNormal3f (0, 1, 0);
- glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
- glTexCoord2f(0, 1); glVertex3f ( 0.5, 0.5, -0.5);
- glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, -0.5);
- glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, 0.5);
- bp->scene_polys1++;
- glEnd();
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* bottom */
- glNormal3f (0, -1, 0);
- glTexCoord2f(1, 0); glVertex3f (-0.5, -0.5, 0.5);
- glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
- glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, -0.5);
- glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, 0.5);
- bp->scene_polys1++;
- glEnd();
- glEndList();
-
- glNewList (bp->obj_dlist3, GL_COMPILE);
- glLineWidth (1);
- glBegin(GL_LINES);
- glVertex3f(-s, 0, 0); glVertex3f(s, 0, 0); /* face spikes */
- glVertex3f(0, -s, 0); glVertex3f(0, s, 0);
- glVertex3f(0, 0, -s); glVertex3f(0, 0, s);
- bp->scene_polys2 += 3;
- glEnd();
-
- glLineWidth (8);
- glBegin(GL_LINES);
- glVertex3f(-s, -s, -s); glVertex3f( s, s, s); /* corner spikes */
- glVertex3f(-s, -s, s); glVertex3f( s, s, -s);
- glVertex3f(-s, s, -s); glVertex3f( s, -s, s);
- glVertex3f( s, -s, -s); glVertex3f(-s, s, s);
- bp->scene_polys2 += 4;
- glEnd();
- glEndList ();
-
- check_gl_error ("object generation");
-}
-
-
-static void
-init_texture (ModeInfo *mi)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (bp->tex_data) free (bp->tex_data);
-
- bp->tex_w = 128;
- bp->tex_h = 128;
- bp->tex_data = (unsigned int *)
- malloc (bp->tex_w * bp->tex_h * 4 * sizeof (unsigned int));
-
- glGenTextures (1, &bp->texture);
- glBindTexture (GL_TEXTURE_2D, bp->texture);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
- bp->tex_w, bp->tex_h, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, bp->tex_data);
- check_gl_error ("texture generation");
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-}
-
-
-static void
-render_scene_to_texture (ModeInfo *mi)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
-
- glViewport (0, 0, bp->tex_w, bp->tex_h);
-
- glCallList (bp->scene_dlist1);
- glCallList (bp->scene_dlist2);
-
- glBindTexture (GL_TEXTURE_2D, bp->texture);
- glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0,
- bp->tex_w, bp->tex_h, 0);
- check_gl_error ("texture2D");
-
- glViewport (0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
-}
-
-static void
-overlay_blur_texture (ModeInfo *mi)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
- int w = MI_WIDTH (mi);
- int h = MI_HEIGHT (mi);
- int times = blursize;
- int i;
- GLfloat inc = 0.02 * (25.0 / times);
-
- GLfloat spost = 0; /* starting texture coordinate offset */
- GLfloat alpha_inc; /* transparency fade factor */
- GLfloat alpha = 0.2; /* initial transparency */
-
- glEnable (GL_TEXTURE_2D);
- glDisable (GL_DEPTH_TEST);
- glBlendFunc (GL_SRC_ALPHA,GL_ONE);
- glEnable (GL_BLEND);
- glBindTexture (GL_TEXTURE_2D, bp->texture);
-
-
- /* switch to orthographic projection, saving both previous matrixes
- on their respective stacks.
- */
- glMatrixMode (GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho (0, w, h, 0, -1, 1);
- glMatrixMode (GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
-
-
- alpha_inc = alpha / times;
-
- mi->polygon_count = bp->scene_polys1 + bp->scene_polys2;
-
- glBegin (GL_QUADS);
- for (i = 0; i < times; i++)
- {
- glColor4f (1, 1, 1, alpha);
- glTexCoord2f (0+spost, 1-spost); glVertex2f (0, 0);
- glTexCoord2f (0+spost, 0+spost); glVertex2f (0, h);
- glTexCoord2f (1-spost, 0+spost); glVertex2f (w, h);
- glTexCoord2f (1-spost, 1-spost); glVertex2f (w, 0);
- spost += inc;
- alpha -= alpha_inc;
- mi->polygon_count++;
- }
- glEnd();
-
- /* Switch back to perspective projection, restoring the saved matrixes
- */
- glMatrixMode (GL_PROJECTION);
- glPopMatrix();
- glMatrixMode (GL_MODELVIEW);
- glPopMatrix();
-
- glEnable (GL_DEPTH_TEST);
- glDisable (GL_BLEND);
- glDisable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, 0);
-}
-
-
-
-/* Startup initialization
- */
-
-ENTRYPOINT Bool
-glblur_handle_event (ModeInfo *mi, XEvent *event)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_glblur (ModeInfo *mi)
-{
- glblur_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_glblur (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
-
- if (!wire)
- {
- GLfloat gamb[4]= {0.2, 0.2, 0.2, 1.0};
- GLfloat pos[4] = {0.0, 5.0, 10.0, 1.0};
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {0.3, 0.3, 0.3, 1.0};
- GLfloat spc[4] = {0.8, 0.8, 0.8, 1.0};
- GLfloat shiny = 128;
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glEnable(GL_NORMALIZE);
- glShadeModel(GL_SMOOTH);
-
- glLightModelfv (GL_LIGHT_MODEL_AMBIENT, gamb);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
-
- glMaterialf(GL_FRONT, GL_SHININESS, shiny);
- }
-
- {
- Bool spinx=False, spiny=False, spinz=False;
- double spin_speed = 0.9;
- double wander_speed = 0.06;
-
- char *s = do_spin;
- while (*s)
- {
- if (*s == 'x' || *s == 'X') spinx = True;
- else if (*s == 'y' || *s == 'Y') spiny = True;
- else if (*s == 'z' || *s == 'Z') spinz = True;
- else if (*s == '0') ;
- else
- {
- fprintf (stderr,
- "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
- progname, do_spin);
- exit (1);
- }
- s++;
- }
-
- bp->rot = make_rotator (spinx ? spin_speed : 0,
- spiny ? spin_speed : 0,
- spinz ? spin_speed : 0,
- 1.0,
- do_wander ? wander_speed : 0,
- False);
- bp->trackball = gltrackball_init (True);
- }
-
- if (blursize < 0) blursize = 0;
- if (blursize > 200) blursize = 200;
-
- bp->ncolors = 128;
- bp->colors0 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- bp->colors1 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- bp->colors2 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- bp->colors3 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0, bp->colors0, &bp->ncolors, False, 0, False);
- make_smooth_colormap (0, 0, 0, bp->colors1, &bp->ncolors, False, 0, False);
- make_smooth_colormap (0, 0, 0, bp->colors2, &bp->ncolors, False, 0, False);
- make_smooth_colormap (0, 0, 0, bp->colors3, &bp->ncolors, False, 0, False);
- bp->ccolor = 0;
-
- bp->obj_dlist0 = glGenLists (1);
- bp->obj_dlist1 = glGenLists (1);
- bp->obj_dlist2 = glGenLists (1);
- bp->obj_dlist3 = glGenLists (1);
- bp->scene_dlist1 = glGenLists (1);
- bp->scene_dlist2 = glGenLists (1);
-
- init_texture (mi);
-
- generate_object (mi);
-}
-
-
-/* Render one frame
- */
-ENTRYPOINT void
-draw_glblur (ModeInfo *mi)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- GLfloat color0[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat color1[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat color2[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat color3[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
-
- double rx, ry, rz;
- double px, py, pz;
- int extra_polys = 0;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- /* Decide what we're drawing
- */
- if (0 == (random() % 30))
- {
- bp->show_cube_p = (0 == (random() % 10));
- bp->show_spikes_p = (0 == (random() % 20));
- }
-
- /* Select new colors for the various objects
- */
- color0[0] = bp->colors0[bp->ccolor].red / 65536.0;
- color0[1] = bp->colors0[bp->ccolor].green / 65536.0;
- color0[2] = bp->colors0[bp->ccolor].blue / 65536.0;
-
- color1[0] = bp->colors1[bp->ccolor].red / 65536.0;
- color1[1] = bp->colors1[bp->ccolor].green / 65536.0;
- color1[2] = bp->colors1[bp->ccolor].blue / 65536.0;
-
- color2[0] = bp->colors2[bp->ccolor].red / 65536.0;
- color2[1] = bp->colors2[bp->ccolor].green / 65536.0;
- color2[2] = bp->colors2[bp->ccolor].blue / 65536.0;
-
- color3[0] = bp->colors3[bp->ccolor].red / 65536.0;
- color3[1] = bp->colors3[bp->ccolor].green / 65536.0;
- color3[2] = bp->colors3[bp->ccolor].blue / 65536.0;
-
- bp->ccolor++;
- if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
-
-
- get_position (bp->rot, &px, &py, &pz, !bp->button_down_p);
- get_rotation (bp->rot, &rx, &ry, &rz, !bp->button_down_p);
-
- px = (px - 0.5) * 2;
- py = (py - 0.5) * 2;
- pz = (pz - 0.5) * 8;
- rx *= 360;
- ry *= 360;
- rz *= 360;
-
- /* Generate scene_dlist1, which contains the box (not spikes),
- rotated into position.
- */
- glNewList (bp->scene_dlist1, GL_COMPILE);
- {
- glMatrixMode (GL_MODELVIEW);
- glPushMatrix ();
- glTranslatef (px, py, pz);
- gltrackball_rotate (bp->trackball);
- glRotatef (rx, 1.0, 0.0, 0.0);
- glRotatef (ry, 0.0, 1.0, 0.0);
- glRotatef (rz, 0.0, 0.0, 1.0);
-
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0);
- glCallList (bp->obj_dlist0);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1);
- glCallList (bp->obj_dlist1);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2);
- glCallList (bp->obj_dlist2);
-
- glMatrixMode (GL_MODELVIEW);
- glPopMatrix ();
- }
- glEndList ();
-
-
- /* Generate scene_dlist2, which contains the spikes (not box),
- rotated into position.
- */
- glNewList (bp->scene_dlist2, GL_COMPILE);
- {
- glMatrixMode (GL_MODELVIEW);
- glPushMatrix ();
- glTranslatef (px, py, pz);
- gltrackball_rotate (bp->trackball);
- glRotatef (rx, 1.0, 0.0, 0.0);
- glRotatef (ry, 0.0, 1.0, 0.0);
- glRotatef (rz, 0.0, 0.0, 1.0);
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color3);
- glCallList (bp->obj_dlist3);
-
- glMatrixMode (GL_MODELVIEW);
- glPopMatrix ();
- }
- glEndList ();
-
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- render_scene_to_texture (mi);
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (bp->show_cube_p || bp->button_down_p)
- {
- glCallList (bp->scene_dlist1);
- extra_polys += bp->scene_polys1;
- }
- if (bp->show_spikes_p || bp->button_down_p)
- {
- glCallList (bp->scene_dlist2);
- extra_polys += bp->scene_polys2;
- }
-
- overlay_blur_texture (mi);
- mi->polygon_count += extra_polys;
-
- glFlush ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_glblur (ModeInfo *mi)
-{
- glblur_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->tex_data) free (bp->tex_data);
- if (bp->colors0) free (bp->colors0);
- if (bp->colors1) free (bp->colors1);
- if (bp->colors2) free (bp->colors2);
- if (bp->colors3) free (bp->colors3);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (glIsList(bp->obj_dlist0)) glDeleteLists(bp->obj_dlist0, 1);
- if (glIsList(bp->obj_dlist1)) glDeleteLists(bp->obj_dlist1, 1);
- if (glIsList(bp->obj_dlist2)) glDeleteLists(bp->obj_dlist2, 1);
- if (glIsList(bp->obj_dlist3)) glDeleteLists(bp->obj_dlist3, 1);
- if (glIsList(bp->scene_dlist1)) glDeleteLists(bp->scene_dlist1, 1);
- if (glIsList(bp->scene_dlist2)) glDeleteLists(bp->scene_dlist2, 1);
- if (bp->texture) glDeleteTextures (1, &bp->texture);
-}
-
-XSCREENSAVER_MODULE ("GLBlur", glblur)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/glblur.man b/hacks/glx/glblur.man
deleted file mode 100644
index 96db6ed..0000000
--- a/hacks/glx/glblur.man
+++ /dev/null
@@ -1,76 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glblur \- 3D radial blur texture fields
-.SH SYNOPSIS
-.B glblur
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-blursize \fInumber\fP]
-[\-no-wander]
-[\-no-spin]
-[\-spin \fI[XYZ]\fP]
-[\-fps]
-.SH DESCRIPTION
-This program draws a box and a few line segments, and generates a
-radial blur outward from it. This creates flowing field effects.
-
-This is done by rendering the scene into a small texture, then
-repeatedly rendering increasingly-enlarged and increasingly-transparent
-versions of that texture onto the frame buffer. As such, it's quite
-graphics intensive: don't bother trying to run this if you don't have
-hardware-accelerated texture support. It will hurt your machine bad.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
-.TP 8
-.B \-blursize \fInumber\fP
-How many copies of the scene should be laid down to make the vapor trail.
-Default: 15. Larger numbers create smoother fields, but are slower.
-.TP 8
-.B \-wander | \-no-wander
-Whether the object should wander around the screen.
-.TP 8
-.B \-spin [XYZ]
-Around which axes should the object spin?
-.TP 8
-.B \-no-spin
-None.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski, with inspiration from a tutorial by Dario Corno.
diff --git a/hacks/glx/glcells.c b/hacks/glx/glcells.c
deleted file mode 100644
index e46aeed..0000000
--- a/hacks/glx/glcells.c
+++ /dev/null
@@ -1,1381 +0,0 @@
-/* -*- Mode: C; tab-width: 2 -*- */
-/* glcells --- Cells growing on your screen */
-
-/*-
- * Cells growing on your screen
- *
- * Copyright (c) 2007 by Matthias Toussaint
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * 2007: Written by Matthias Toussaint
- * 0.1 Initial version
- * 0.2 Bugfixes (threading) and code cleanup by Jamie Zawinski
- * Window scaling bug + performance bug in tick()
- */
-
-#include <sys/time.h> /* gettimeofday */
-
-#include "xlockmore.h"
-#include <math.h>
-
-/**********************************
- DEFINES
- **********************************/
-
-#define INDEX_OFFSET 100000
-#define NUM_CELL_SHAPES 10
-
-#define release_glcells 0
-#define glcells_handle_event xlockmore_no_events
-
-#define DEF_DELAY "20000"
-#define DEF_MAXCELLS "800"
-#define DEF_RADIUS "40"
-#define DEF_SEEDS "1"
-#define DEF_QUALITY "3"
-#define DEF_KEEPOLD "False"
-#define DEF_MINFOOD "5"
-#define DEF_MAXFOOD "20"
-#define DEF_DIVIDEAGE "20"
-#define DEF_MINDIST "1.4"
-#define DEF_PAUSE "50"
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-#ifndef HAVE_JWZGLES /* glDrawElements unimplemented... */
-# define USE_VERTEX_ARRAY
-#endif
-
-#define TEX_SIZE 64
-
-/**********************************
- TYPEDEFS
- **********************************/
-
-typedef struct /* a 3-D vector */
-{
- double x, y, z; /* 3-D coordinates (we don't need w here) */
-} Vector;
-
-typedef struct /* a triangle (indexes of vertexes in some list) */
-{
- int i[3]; /* the three indexes for the triangle corners */
-} Triangle;
-
-typedef struct
-{
- float *vertex;
- float *normal;
- unsigned *index;
- int num_index;
-} VertexArray;
-
-typedef struct /* an 3-D object without normal vectors */
-{
- Vector *vertex; /* the vertexes */
- Triangle *triangle; /* triangle list */
- int num_vertex; /* number of vertexes */
- int num_triangle; /* number of triangles */
-} Object;
-
-typedef struct /* an 3-D object with smooth normal vectors */
-{
- Vector *vertex; /* the vertexes */
- Vector *normal; /* the vertex normal vectors */
- Triangle *triangle; /* triangle list */
- int num_vertex; /* number of vertexes */
- int num_triangle; /* number of triangles */
-} ObjectSmooth;
-
-typedef struct /* Cell */
-{
- double x, y; /* position */
- double vx, vy; /* movement vector */
- int age; /* cells age */
- double min_dist; /* minimum distance to other cells */
- int energy; /* health */
- double rotation; /* random rot, so they don't look all the same */
- double radius; /* current size of cell */
- double growth; /* current growth rate. might be <1.0 while dividing,
- >1.0 when finished dividing and food is available
- and 1.0 when grown up */
-} Cell;
-
-typedef struct /* hacks state */
-{
- GLXContext *glx_context;
- int width, height; /* current size of viewport */
- double screen_scale; /* we scale content with window size */
- int num_cells; /* current number of cell in list */
- Cell *cell; /* array of cells */
- int cell_polys;
- GLfloat color[4]; /* current cell color */
- double radius; /* cell radius */
- int move_dist; /* min distance from neighbours for forking */
- int max_cells; /* maximum number of cells */
- int num_seeds; /* number of initial seeds */
- int keep_old_cells; /* draw dead cells? */
- int divide_age; /* min age for division */
- /* display lists for the cell stages */
- int cell_list[NUM_CELL_SHAPES];
- int nucleus_list;
- int minfood; /* minimum amount of food per area unit */
- int maxfood; /* maximum amount of food per area unit */
- int pause; /* pause at end (all cells dead) */
- int pause_counter;
- int wire; /* draw wireframe? */
- Object *sphere; /* the raw undisturbed sphere */
- double *disturbance; /* disturbance values for the vertexes */
- int *food; /* our petri dish (e.g. screen) */
- GLubyte *texture; /* texture data for nucleus */
- GLuint texture_name; /* texture name for binding */
-} State;
-
-/**********************************
- STATIC STUFF
- **********************************/
-
-static State *sstate = NULL;
-
-static XrmOptionDescRec opts[] = {
- { "-maxcells", ".maxcells", XrmoptionSepArg, 0 },
- { "-radius", ".radius", XrmoptionSepArg, 0 },
- { "-seeds", ".seeds", XrmoptionSepArg, 0 },
- { "-quality", ".quality", XrmoptionSepArg, 0 },
- { "-minfood", ".minfood", XrmoptionSepArg, 0 },
- { "-maxfood", ".maxfood", XrmoptionSepArg, 0 },
- { "-divideage", ".divideage", XrmoptionSepArg, 0 },
- { "-mindist", ".mindist", XrmoptionSepArg, 0 },
- { "-pause", ".pause", XrmoptionSepArg, 0 },
- { "-keepold", ".keepold", XrmoptionNoArg, "True" }
-};
-
-static int s_maxcells;
-static int s_radius;
-static int s_seeds;
-static int s_quality;
-static int s_minfood;
-static int s_maxfood;
-static int s_divideage;
-static int s_pause;
-static float s_min_dist;
-static Bool s_keepold;
-
-static argtype vars[] = {
- {&s_maxcells, "maxcells", "Max Cells", DEF_MAXCELLS, t_Int},
- {&s_radius, "radius", "Radius", DEF_RADIUS, t_Int},
- {&s_seeds, "seeds", "Seeds", DEF_SEEDS, t_Int},
- {&s_quality, "quality", "Quality", DEF_QUALITY, t_Int},
- {&s_minfood, "minfood", "Min Food", DEF_MINFOOD, t_Int},
- {&s_maxfood, "maxfood", "Max Food", DEF_MAXFOOD, t_Int},
- {&s_pause, "pause", "Pause at end", DEF_PAUSE, t_Int},
- {&s_divideage, "divideage", "Age for duplication (Ticks)", DEF_DIVIDEAGE, t_Int},
- {&s_min_dist, "mindist", "Minimum preferred distance to other cells", DEF_MINDIST, t_Float},
- {&s_keepold, "keepold", "Keep old cells", DEF_KEEPOLD, t_Bool}
-};
-
-/**********************************
- PROTOTYPES
- **********************************/
-
-/* render scene */
-static int render( State *st );
-/* create initial cells and fill petri dish with food */
-static void create_cells( State * );
-/* do one animation step */
-static void tick( State *st );
-/* draw a single cell */
-static void draw_cell( State *st, int shape );
-/* draw cells nucleus */
-static void draw_nucleus( State *st );
-/* return randum number in the interval min-max */
-static int random_interval( int min, int max );
-/* retunr random number in the interval 0-max */
-static int random_max( int max );
-/* create display list for given disturbance weighting factor */
-static int create_list( State *st, double fac );
-/* return length of vector */
-static double vector_length( Vector * );
-/* normalize vector */
-static void vector_normalize( Vector * );
-/* a += b */
-static void vector_add( Vector *a, Vector *b );
-/* a -= b */
-static void vector_sub( Vector *a, Vector *b );
-/* a *= fac */
-static void vector_mul( Vector *a, double fac );
-/* a.x = a.y = a.z = 0 */
-static void vector_clear( Vector *a );
-/* return crossproduct a*b in out */
-static void vector_crossprod( Vector *a, Vector *b, Vector *out );
-/* return 1 if vectors are equal (epsilon compare) otherwise 0 */
-static int vector_compare( Vector *a, Vector *b );
-/* compute normal vector of given triangle and return in out */
-static void triangle_normal( Vector *a, Vector *b, Vector *c, Vector *out );
-/* take an Object and create an ObjectSmooth out of it */
-static ObjectSmooth *create_ObjectSmooth( Object * );
-/* Subdivide the Object once (assuming it's supposed to be a shpere */
-static Object *subdivide( Object *obj );
-/* free an Object */
-static void free_Object( Object * );
-/* free an ObjectSmooth */
-static void free_ObjectSmooth( ObjectSmooth * );
-/* scale an Object. return pointer to the object */
-/*static Object *scale_Object( Object *obj, double scale );*/
-/* create a perfect sphere refining with divisions */
-static Object *create_sphere( State *st, int divisions );
-/* make a copy of the given Object */
-static Object *clone_Object( Object * );
-/* return 1 if cell is capable to divide */
-static int can_divide( State *st, Cell *cell );
-#ifdef USE_VERTEX_ARRAY
-static VertexArray *array_from_ObjectSmooth( ObjectSmooth * );
-#endif
-static void create_nucleus_texture( State *st );
-
-ENTRYPOINT ModeSpecOpt glcells_opts = { countof(opts), opts, countof(vars), vars,
- NULL };
-
-
-/**********************************
- INLINE FUNCTIONS
- **********************************/
-/* create random numbers
-*/
-static inline int random_interval( int min, int max )
-{
- int n = max - min;
- if (n == 0) n = 1;
- return min+(random()%n);
-}
-
-static inline int random_max( int max )
-{
- return random()%max;
-}
-
-/* Vector stuff
-*/
-
-/* a += b */
-static inline void vector_add( Vector *a, Vector *b )
-{
- a->x += b->x;
- a->y += b->y;
- a->z += b->z;
-}
-
-/* a -= b */
-static inline void vector_sub( Vector *a, Vector *b )
-{
- a->x -= b->x;
- a->y -= b->y;
- a->z -= b->z;
-}
-
-/* a *= v */
-static inline void vector_mul( Vector *a, double v )
-{
- a->x *= v;
- a->y *= v;
- a->z *= v;
-}
-
-/* set to 0 */
-static inline void vector_clear( Vector *vec )
-{
- vec->x = vec->y = vec->z = 0;
-}
-
-/* return vector length */
-static inline double vector_length( Vector *vec )
-{
- return sqrt( vec->x*vec->x + vec->y*vec->y + vec->z*vec->z );
-}
-
-/* normalize vector */
-static inline void vector_normalize( Vector *vec )
-{
- double len = vector_length( vec );
-
- if (len != 0.0) {
- vector_mul( vec, 1.0 / len );
- }
-}
-
-/* crossproduct */
-static inline void vector_crossprod( Vector *a, Vector *b, Vector *out )
-{
- out->x = a->y*b->z - a->z*b->y;
- out->y = a->z*b->x - a->x*b->z;
- out->z = a->x*b->y - a->y*b->x;
-}
-
-/* epsilon compare of two vectors */
-static inline int vector_compare( Vector *a, Vector *b )
-{
- const double epsilon = 0.0000001;
- Vector delta = *a;
-
- vector_sub( &delta, b );
- if (fabs(delta.x) < epsilon &&
- fabs(delta.y) < epsilon &&
- fabs(delta.z) < epsilon) {
- return 1;
- }
-
- return 0;
-}
-
-/* check if given cell is capable of dividing
- needs space, must be old enough, grown up and healthy
-*/
-static inline int can_divide( State *st, Cell *cell )
-{
- if (cell->min_dist > st->move_dist &&
- cell->age >= st->divide_age &&
- cell->radius > 0.99 * st->radius &&
- cell->energy > 0) {
- return 1;
- }
-
- return 0;
-}
-
-/**********************************
- FUNCTIONS
- **********************************/
-
-/* compute normal vector of given
- triangle spanned by the points a, b, c
-*/
-static void triangle_normal( Vector *a, Vector *b, Vector *c, Vector *out )
-{
- Vector v1 = *a;
- Vector v2 = *a;
-
- vector_sub( &v1, b );
- vector_sub( &v2, c );
- vector_crossprod( &v1, &v2, out );
-}
-
-/* free */
-static void free_Object( Object *obj )
-{
- free( obj->vertex );
- free( obj->triangle );
- free( obj );
-}
-
-static void free_ObjectSmooth( ObjectSmooth *obj )
-{
- free( obj->vertex );
- free( obj->triangle );
- free( obj->normal );
- free( obj );
-}
-
-/* scale the given Object */
-#if 0
-static Object *scale_Object( Object *obj, double scale )
-{
- int v;
-
- for (v=0; v<obj->num_vertex; ++v) {
- vector_mul( &obj->vertex[v], scale );
- }
-
- return obj;
-}
-#endif
-
-/* create a copy of the given Object */
-static Object *clone_Object( Object *obj )
-{
- /* alloc */
- Object *ret = (Object *) malloc( sizeof( Object ) );
-
- ret->vertex =
- (Vector *) malloc( obj->num_vertex*sizeof(Vector) );
- ret->triangle =
- (Triangle *) malloc( obj->num_triangle*sizeof(Triangle) );
- ret->num_vertex = obj->num_vertex;
- ret->num_triangle = obj->num_triangle;
- /* copy */
- memcpy( ret->vertex, obj->vertex,
- obj->num_vertex*sizeof(Vector) );
- memcpy( ret->triangle, obj->triangle,
- obj->num_triangle*sizeof(Triangle) );
-
- return ret;
-}
-
-#ifdef USE_VERTEX_ARRAY
-static VertexArray *array_from_ObjectSmooth( ObjectSmooth *obj )
-{
- int i, j;
- VertexArray *array = (VertexArray *) malloc( sizeof( VertexArray ) );
-
- array->vertex = (float *) malloc( 3*sizeof(float)*obj->num_vertex );
- array->normal = (float *) malloc( 3*sizeof(float)*obj->num_vertex );
- array->index = (unsigned *) malloc( 3*sizeof(unsigned)*obj->num_triangle );
- array->num_index = obj->num_triangle*3;
-
- for (i=0, j=0; i<obj->num_vertex; ++i) {
- array->vertex[j] = obj->vertex[i].x;
- array->normal[j++] = obj->normal[i].x;
- array->vertex[j] = obj->vertex[i].y;
- array->normal[j++] = obj->normal[i].y;
- array->vertex[j] = obj->vertex[i].z;
- array->normal[j++] = obj->normal[i].z;
- }
-
- for (i=0, j=0; i<obj->num_triangle; ++i) {
- array->index[j++] = obj->triangle[i].i[0];
- array->index[j++] = obj->triangle[i].i[1];
- array->index[j++] = obj->triangle[i].i[2];
- }
-
- return array;
-}
-#endif /* USE_VERTEX_ARRAY */
-
-
-/* create a smoothed version of the given Object
- by computing average normal vectors for the vertexes
-*/
-static ObjectSmooth *create_ObjectSmooth( Object *obj )
-{
- int t, v, i;
- Vector *t_normal =
- (Vector *) malloc( obj->num_triangle*sizeof(Vector) );
- ObjectSmooth *ret =
- (ObjectSmooth *) malloc( sizeof( ObjectSmooth ) );
-
- /* fill in vertexes and triangles */
- ret->num_vertex = obj->num_vertex;
- ret->num_triangle = obj->num_triangle;
- ret->vertex =
- (Vector *) malloc( obj->num_vertex * sizeof( Vector ) );
- ret->normal =
- (Vector *) malloc( obj->num_vertex * sizeof( Vector ) );
- ret->triangle =
- (Triangle *) malloc( obj->num_triangle * sizeof( Triangle ) );
-
- for (v=0; v<obj->num_vertex; ++v) {
- ret->vertex[v] = obj->vertex[v];
- }
-
- for (t=0; t<obj->num_triangle; ++t) {
- ret->triangle[t] = obj->triangle[t];
- }
-
- /* create normals (triangles) */
- for (t=0; t<ret->num_triangle; ++t) {
- triangle_normal( &ret->vertex[ret->triangle[t].i[0]],
- &ret->vertex[ret->triangle[t].i[1]],
- &ret->vertex[ret->triangle[t].i[2]],
- &t_normal[t] );
- }
-
- /* create normals (vertex) by averaging triangle
- normals at vertex
- */
- for (v=0; v<ret->num_vertex; ++v) {
- vector_clear( &ret->normal[v] );
- for (t=0; t<ret->num_triangle; ++t) {
- for (i=0; i<3; ++i) {
- if (ret->triangle[t].i[i] == v) {
- vector_add( &ret->normal[v], &t_normal[t] );
- }
- }
- }
- /* as we have only a half sphere we force the
- normals at the bortder to be perpendicular to z.
- the simple algorithm above makes an error here.
- */
- if (fabs(ret->vertex[v].z) < 0.0001) {
- ret->normal[v].z = 0.0;
- }
-
- vector_normalize( &ret->normal[v] );
- }
-
- free( t_normal );
-
- return ret;
-}
-
-/* subdivide the triangles of the object once
- The order of this algorithm is probably something like O(n^42) :)
- but I can't think of something smarter at the moment
-*/
-static Object *subdivide( Object *obj )
-{
- /* create for worst case (which I dont't know) */
- int start, t, i, v;
- int index_list[1000];
- int index_cnt, index_found;
- Object *tmp = (Object *)malloc( sizeof(Object) );
- Object *ret = (Object *)malloc( sizeof(Object) );
- Object *c_ret;
-
- tmp->vertex =
- (Vector *)malloc( 100*obj->num_vertex*sizeof( Vector ) );
- tmp->triangle =
- (Triangle *)malloc( 4*obj->num_triangle*sizeof( Triangle ) );
- tmp->num_vertex = 0;
- tmp->num_triangle = 0;
- ret->vertex =
- (Vector *)malloc( 100*obj->num_vertex*sizeof( Vector ) );
- ret->triangle =
- (Triangle *)malloc( 4*obj->num_triangle*sizeof( Triangle ) );
- ret->num_vertex = 0;
- ret->num_triangle = 0;
-#ifdef PRINT_STAT
- fprintf( stderr, "in v=%d t=%d\n",
- obj->num_vertex, obj->num_triangle );
-#endif
- /* for each triangle create 3 new vertexes and the 4
- corresponding triangles
- */
- for (t=0; t<obj->num_triangle; ++t) {
- /* copy the three original vertexes */
- for (i=0; i<3; ++i) {
- tmp->vertex[tmp->num_vertex++] =
- obj->vertex[obj->triangle[t].i[i]];
- }
-
- /* create 3 new */
- tmp->vertex[tmp->num_vertex] =
- obj->vertex[obj->triangle[t].i[0]];
- vector_add( &tmp->vertex[tmp->num_vertex],
- &obj->vertex[obj->triangle[t].i[1]] );
- vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
-
- tmp->vertex[tmp->num_vertex] =
- obj->vertex[obj->triangle[t].i[1]];
- vector_add( &tmp->vertex[tmp->num_vertex],
- &obj->vertex[obj->triangle[t].i[2]] );
- vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
-
- tmp->vertex[tmp->num_vertex] =
- obj->vertex[obj->triangle[t].i[2]];
- vector_add( &tmp->vertex[tmp->num_vertex],
- &obj->vertex[obj->triangle[t].i[0]] );
- vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
-
- /* create triangles */
- start = tmp->num_vertex-6;
-
- tmp->triangle[tmp->num_triangle].i[0] = start;
- tmp->triangle[tmp->num_triangle].i[1] = start+3;
- tmp->triangle[tmp->num_triangle++].i[2] = start+5;
-
- tmp->triangle[tmp->num_triangle].i[0] = start+3;
- tmp->triangle[tmp->num_triangle].i[1] = start+1;
- tmp->triangle[tmp->num_triangle++].i[2] = start+4;
-
- tmp->triangle[tmp->num_triangle].i[0] = start+5;
- tmp->triangle[tmp->num_triangle].i[1] = start+4;
- tmp->triangle[tmp->num_triangle++].i[2] = start+2;
-
- tmp->triangle[tmp->num_triangle].i[0] = start+3;
- tmp->triangle[tmp->num_triangle].i[1] = start+4;
- tmp->triangle[tmp->num_triangle++].i[2] = start+5;
- }
-
- /* compress object eliminating double vertexes
- (welcome to the not so smart section)
- */
- /* copy original triangle list */
- for (t=0; t<tmp->num_triangle; ++t) {
- ret->triangle[t] = tmp->triangle[t];
- }
- ret->num_triangle = tmp->num_triangle;
-
- /* copy unique vertexes and correct triangle list */
- for (v=0; v<tmp->num_vertex; ++v) {
- /* create list of vertexes that are the same */
- index_cnt = 0;
- for (i=0; i<tmp->num_vertex; ++i) {
- /* check if i and v are the same
- first in the list is the smallest index
- */
- if (vector_compare( &tmp->vertex[v], &tmp->vertex[i] )) {
- index_list[index_cnt++] = i;
- }
- }
-
- /* check if vertex unknown so far */
- index_found = 0;
- for (i=0; i<ret->num_vertex; ++i) {
- if (vector_compare( &ret->vertex[i],
- &tmp->vertex[index_list[0]] )) {
- index_found = 1;
- break;
- }
- }
-
- if (!index_found) {
- ret->vertex[ret->num_vertex] = tmp->vertex[index_list[0]];
-
- /* correct triangles
- (we add an offset to the index, so we can tell them apart)
- */
- for (t=0; t<ret->num_triangle; ++t) {
- for (i=0; i<index_cnt; ++i) {
- if (ret->triangle[t].i[0] == index_list[i]) {
- ret->triangle[t].i[0] = ret->num_vertex+INDEX_OFFSET;
- }
- if (ret->triangle[t].i[1] == index_list[i]) {
- ret->triangle[t].i[1] = ret->num_vertex+INDEX_OFFSET;
- }
- if (ret->triangle[t].i[2] == index_list[i]) {
- ret->triangle[t].i[2] = ret->num_vertex+INDEX_OFFSET;
- }
- }
- }
- ret->num_vertex++;
- }
- }
-
- free_Object( tmp );
-
- /* correct index offset */
- for (t=0; t<ret->num_triangle; ++t) {
- ret->triangle[t].i[0] -= INDEX_OFFSET;
- ret->triangle[t].i[1] -= INDEX_OFFSET;
- ret->triangle[t].i[2] -= INDEX_OFFSET;
- }
-
- /* normalize vertexes */
- for (v=0; v<ret->num_vertex; ++v) {
- vector_normalize( &ret->vertex[v] );
- }
-#ifdef PRINT_STAT
- fprintf( stderr, "out v=%d t=%d\n",
- ret->num_vertex, ret->num_triangle );
-#endif
- /* shrink the arrays by cloning */
- c_ret = clone_Object( ret );
- free_Object( ret );
-
- return c_ret;
-}
-
-static int render( State *st )
-{
-#ifdef PRINT_STAT
- struct timeval tv1, tv2;
- int usec;
-#endif
- GLfloat LightAmbient[]= { 0.1f, 0.1f, 0.1f, 1.0f };
- GLfloat LightPosition[]= { -20.0f, -10.0f, -100.0f, 0.0f };
- int b;
- int num_paint = 0;
-
- if (0 == st->food) return 0;
-#ifdef PRINT_STAT
- gettimeofday( &tv1, NULL );
-#endif
- /* life goes on... */
- tick( st );
-#ifdef PRINT_STAT
- gettimeofday( &tv2, NULL );
- usec = (tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec);
- fprintf( stderr, "tick %d\n", usec );
- gettimeofday( &tv1, NULL );
-#endif
-
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- glDepthFunc(GL_LESS);
- glEnable(GL_DEPTH_TEST);
- glLightfv( GL_LIGHT0, GL_AMBIENT, LightAmbient );
- glLightfv( GL_LIGHT0, GL_DIFFUSE, st->color );
- glLightfv( GL_LIGHT0, GL_POSITION, LightPosition );
-
- /* prepare lighting vs. wireframe */
- if (!st->wire) {
- glEnable( GL_LIGHT0 );
- glEnable( GL_LIGHTING );
- glEnable( GL_NORMALIZE );
- glPolygonMode( GL_FRONT, GL_FILL );
- } else {
-# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- glPolygonMode( GL_FRONT, GL_LINE );
-# endif
- }
-
-# if 0
- if (st->wire) {
- glDisable(GL_DEPTH_TEST);
- glColor3f (1, 1, 1);
- glBegin(GL_LINE_LOOP);
- glVertex3f(0, 0, 0); glVertex3f(st->width, 0, 0);
- glVertex3f(st->width, st->height, 0); glVertex3f(0, st->height, 0);
- glVertex3f(0, 0, 0); glVertex3f(st->width/4, 0, 0);
- glVertex3f(st->width/4, st->height/4, 0); glVertex3f(0, st->height/4, 0);
- glEnd();
- }
-# endif
-
- /* draw the dead cells if choosen */
- if (st->keep_old_cells) {
- for (b=0; b<st->num_cells; ++b) {
- if (st->cell[b].energy <= 0) {
- num_paint++;
- glPushMatrix();
- glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
- glRotatef( st->cell[b].rotation, 0.0, 0.0, 1.0 );
- glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
- draw_cell( st, 9 );
- glPopMatrix();
- }
- }
- }
-
- /* draw the living cells */
- for (b=0; b<st->num_cells; ++b) {
- if (st->cell[b].energy >0) {
- double fac = (double)st->cell[b].energy / 50.0;
- int shape;
- if (fac < 0.0) fac = 0.0;
- if (fac > 1.0) fac = 1.0;
-
- shape = (int)(9.0*fac);
- num_paint++;
- /*glColor3f( fac, fac, fac );*/
-
-# if 0
- if (st->wire) {
- glBegin(GL_LINES);
- glVertex3f(0, 0, 0);
- glVertex3f(st->cell[b].x, st->cell[b].y, 0);
- glEnd();
- }
-# endif
-
- glPushMatrix();
- glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
- glRotatef( st->cell[b].rotation, 0.0, 0.0, 1.0 );
- glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
- draw_cell( st, 9-shape );
- glPopMatrix();
- }
- }
-
- /* draw cell nuclei */
- if (!st->wire)
- {
- glDisable( GL_LIGHT0 );
- glDisable( GL_LIGHTING );
-
- glEnable( GL_BLEND );
- glDisable( GL_DEPTH_TEST );
- glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
- glEnable( GL_TEXTURE_2D );
- glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
- glBindTexture( GL_TEXTURE_2D, st->texture_name );
-
- for (b=0; b<st->num_cells; ++b) {
- if (st->cell[b].energy>0 || st->keep_old_cells) {
- glPushMatrix();
- glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
- glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
- draw_nucleus( st );
- glPopMatrix();
- }
- }
-
- glDisable( GL_TEXTURE_2D );
- glDisable( GL_BLEND );
- }
-
-#ifdef PRINT_STAT
- gettimeofday( &tv2, NULL );
- usec = (tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec);
- fprintf( stderr, "OpenGL %d\n", usec );
-#endif
- return num_paint * st->cell_polys;
-}
-
-/* this creates the initial subdivided half-dodecaedron */
-static Object *create_sphere( State *st, int divisions )
-{
- int num_vertex = 9;
- int num_triangle = 10;
- int i, v, t;
- double a, aStep = (double)M_PI / 3.0;
- double e;
- int vi[30] = { 0, 7, 1, 1, 7, 2, 2, 8, 3, 3, 8, 4, 4, 6, 5,
- 5, 6, 0, 0, 6, 7, 2, 7, 8, 4, 8, 6, 6, 8, 7 };
- Object *obj = (Object *)malloc( sizeof( Object ) );
-
- obj->vertex = (Vector *)malloc( num_vertex*sizeof( Vector ) );
- obj->triangle =
- (Triangle *)malloc( num_triangle*sizeof( Triangle ) );
- obj->num_vertex = num_vertex;
- obj->num_triangle = num_triangle;
-
- /* create vertexes for dodecaedron */
- a = 0.0;
- for (v=0; v<6; ++v) {
- obj->vertex[v].x = sin( a );
- obj->vertex[v].y = -cos( a );
- obj->vertex[v].z = 0.0;
-
- a += aStep;
- }
-
- a = -60.0/180.0*(double)M_PI;
- e = 58.2825/180.0 * (double)M_PI;
- for (;v<9; ++v) {
- obj->vertex[v].x = sin( a )*cos( e );
- obj->vertex[v].y = -cos( a )*cos( e );
- obj->vertex[v].z = -sin( e );
-
- a += 2.0*aStep;
- }
-
- /* create triangles */
- for (t=0; t<obj->num_triangle; ++t) {
- obj->triangle[t].i[0] = vi[3*t];
- obj->triangle[t].i[1] = vi[3*t+1];
- obj->triangle[t].i[2] = vi[3*t+2];
- }
-
- /* subdivide as specified */
- for (i=0; i<divisions; ++i) {
- Object *newObj = subdivide( obj );
- free_Object( obj );
- obj = newObj;
- }
-
- st->cell_polys = obj->num_triangle;
-
- return obj;
-}
-
-static int create_list( State *st, double fac )
-{
- int v;
- Object *obj = clone_Object( st->sphere );
- ObjectSmooth *smooth;
-#ifdef USE_VERTEX_ARRAY
- VertexArray *vertex_array;
-#else
- int t, i;
-#endif
- int list = glGenLists(1);
-
- /* apply wrinckle factor */
- for (v=0; v<obj->num_vertex; ++v) {
- vector_mul( &obj->vertex[v], 1.0+fac*st->disturbance[v] );
- }
-
- /* compute normals */
- smooth = create_ObjectSmooth( obj );
- free_Object( obj );
-
- /* Create display list */
- glNewList( list, GL_COMPILE );
-#ifdef USE_VERTEX_ARRAY
- vertex_array = array_from_ObjectSmooth( smooth );
- glEnableClientState( GL_VERTEX_ARRAY );
- glEnableClientState( GL_NORMAL_ARRAY );
- glVertexPointer( 3, GL_FLOAT, 0, vertex_array->vertex );
- glNormalPointer( GL_FLOAT, 0, vertex_array->normal );
- glDrawElements( GL_TRIANGLES, vertex_array->num_index,
- GL_UNSIGNED_INT, vertex_array->index );
- free (vertex_array->vertex);
- free (vertex_array->normal);
- free (vertex_array->index);
- free( vertex_array );
-#else
- glBegin( GL_TRIANGLES );
-
- for (t=0; t<smooth->num_triangle; ++t) {
- for (i=0; i<3; ++i) {
- glNormal3f( smooth->normal[smooth->triangle[t].i[i]].x,
- smooth->normal[smooth->triangle[t].i[i]].y,
- smooth->normal[smooth->triangle[t].i[i]].z );
- glVertex3f( smooth->vertex[smooth->triangle[t].i[i]].x,
- smooth->vertex[smooth->triangle[t].i[i]].y,
- smooth->vertex[smooth->triangle[t].i[i]].z );
- }
- }
-
- glEnd();
-#endif
- glEndList();
-
- free_ObjectSmooth( smooth );
-
- return list;
-}
-
-static void draw_cell( State *st, int shape )
-{
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- if (st->wire) {
- glDisable(GL_DEPTH_TEST);
- glColor3f (1, 1, 1);
- glPushMatrix();
- glScalef (0.33, 0.33, 1);
- glBegin (GL_LINE_LOOP);
- glVertex3f (-1, -1, 0); glVertex3f (-1, 1, 0);
- glVertex3f ( 1, 1, 0); glVertex3f ( 1, -1, 0);
- glEnd();
- if (shape == 9) {
- glBegin (GL_LINES);
- glVertex3f (-1, -1, 0); glVertex3f (1, 1, 0);
- glVertex3f (-1, 1, 0); glVertex3f (1, -1, 0);
- glEnd();
- }
- glPopMatrix();
- return;
- }
-# endif
-
- if (-1 == st->cell_list[shape]) {
- st->cell_list[shape] = create_list( st, (double)shape/10.0 );
- }
-
- glCallList( st->cell_list[shape] );
-}
-
-static void create_nucleus_texture( State *st )
-{
- int x, y;
- int w2 = TEX_SIZE/2;
- float s = w2*w2/4.0;
-
- st->texture = (GLubyte *) malloc( 4*TEX_SIZE*TEX_SIZE );
-
- for (y=0; y<TEX_SIZE; ++y) {
- for (x=0; x<TEX_SIZE; ++x) {
- float r2 = ((x-w2)*(x-w2)+(y-w2)*(y-w2));
- float v = 120.0 * expf( -(r2) / s );
- st->texture[4*(x+y*TEX_SIZE)] = (GLubyte)0;
- st->texture[4*(x+y*TEX_SIZE)+1] = (GLubyte)0;
- st->texture[4*(x+y*TEX_SIZE)+2] = (GLubyte)0;
- st->texture[4*(x+y*TEX_SIZE)+3] = (GLubyte)v;
- }
- }
-
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
- glGenTextures( 1, &st->texture_name );
- glBindTexture( GL_TEXTURE_2D, st->texture_name );
-
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, st->texture );
-}
-
-static void draw_nucleus( State *st )
-{
- if (-1 == st->nucleus_list) {
- float z = -1.2f;
- float r=1.0/2.0f;
- st->nucleus_list = glGenLists( 1 );
- glNewList( st->nucleus_list, GL_COMPILE );
- glBegin( GL_QUADS );
- glTexCoord2f( 0.0f, 0.0f ); glVertex3f( -r, -r, z );
- glTexCoord2f( 0.0f, 1.0f ); glVertex3f( -r, r, z );
- glTexCoord2f( 1.0f, 1.0f ); glVertex3f( r, r, z );
- glTexCoord2f( 1.0f, 0.0f ); glVertex3f( r, -r, z );
- glEnd();
- glEndList();
- }
-
- glCallList( st->nucleus_list );
-}
-
-static void create_cells( State *st )
-{
- int border = (int)(200.0 * st->screen_scale);
- int i, foodcnt;
- int w = st->width-2*border;
- int h = st->height-2*border;
-
- st->color[0] = 0.5 + random_max( 1000 ) * 0.0005;
- st->color[1] = 0.5 + random_max( 1000 ) * 0.0005;
- st->color[2] = 0.5 + random_max( 1000 ) * 0.0005;
- st->color[3] = 1.0f;
-
- /* allocate if startup */
- if (!st->cell) {
- st->cell = (Cell *) malloc( st->max_cells * sizeof(Cell));
- }
-
- /* fill the screen with random food for our little critters */
- foodcnt = (st->width*st->height)/16;
- for (i=0; i<foodcnt; ++i) {
- st->food[i] = random_interval( st->minfood, st->maxfood );
- }
-
- /* create the requested seed-cells */
- st->num_cells = st->num_seeds;
-
- for (i=0; i<st->num_cells; ++i) {
- st->cell[i].x = border + random_max( w );
- st->cell[i].y = border + random_max( h );
- st->cell[i].vx = 0.0;
- st->cell[i].vy = 0.0;
- st->cell[i].age = random_max( 0x0f );
- st->cell[i].min_dist = 500.0;
- st->cell[i].energy = random_interval( 5, 5+0x3f );
- st->cell[i].rotation = ((double)random()/(double)RAND_MAX)*360.0;
- st->cell[i].radius = st->radius;
- st->cell[i].growth = 1.0;
- }
-}
-
-/* all this is rather expensive :( */
-static void tick( State *st )
-{
- int new_num_cells, num_cells=0;
- int b, j;
- int x, y, w4=st->width/4, h4=st->height/4, offset;
- double min_dist;
- int min_index;
- int num_living = 0;
- const double check_dist = 0.75*st->move_dist;
- const double grow_dist = 0.75*st->radius;
- const double adult_radius = st->radius;
-
- /* find number of cells capable of division
- and count living cells
- */
- for (b=0; b<st->num_cells; ++b) {
- if (st->cell[b].energy > 0) num_living++;
- if (can_divide( st, &st->cell[b] )) num_cells++;
- }
- new_num_cells = st->num_cells + num_cells;
-
- /* end of simulation ? */
- if (0 == num_living || new_num_cells >= st->max_cells) {
- if (st->pause_counter > 0) st->pause_counter--;
- if (st->pause_counter > 0) return;
- create_cells( st );
- st->pause_counter = st->pause;
- } else if (num_cells) { /* any fertile candidates ? */
- for (b=0, j=st->num_cells; b<st->num_cells; ++b) {
- if (can_divide( st, &st->cell[b] )) {
- st->cell[b].vx = random_interval( -50, 50 ) * 0.01;
- st->cell[b].vy = random_interval( -50, 50 ) * 0.01;
- st->cell[b].age = random_max( 0x0f );
- /* half energy for both plus some bonus for forking */
- st->cell[b].energy =
- st->cell[b].energy/2 + random_max( 0x0f );
- /* forking makes me shrink */
- st->cell[b].growth = 0.995;
-
- /* this one initially goes into the oposite direction */
- st->cell[j].vx = -st->cell[b].vx;
- st->cell[j].vy = -st->cell[b].vy;
- /* same center */
- st->cell[j].x = st->cell[b].x;
- st->cell[j].y = st->cell[b].y;
- st->cell[j].age = random_max( 0x0f );
- st->cell[j].energy = (st->cell[b].energy);
- st->cell[j].rotation =
- ((double)random()/(double)RAND_MAX)*360.0;
- st->cell[j].growth = st->cell[b].growth;
- st->cell[j].radius = st->cell[b].radius;
- ++j;
- } else {
- st->cell[b].vx = 0.0;
- st->cell[b].vy = 0.0;
- }
- }
-
- st->num_cells = new_num_cells;
- }
-
- /* for each find a direction to escape */
- if (st->num_cells > 1) {
- for (b=0; b<st->num_cells; ++b) {
- if (st->cell[b].energy > 0) {
- double vx;
- double vy;
- double len;
-
- /* grow or shrink */
- st->cell[b].radius *= st->cell[b].growth;
- /* find closest neighbour */
- min_dist = 100000.0;
- min_index = 0;
- for (j=0; j<st->num_cells; ++j) {
- if (j!=b) {
- const double dx = st->cell[b].x - st->cell[j].x;
- const double dy = st->cell[b].y - st->cell[j].y;
-
- if (fabs(dx) < check_dist || fabs(dy) < check_dist) {
- const double dist = dx*dx+dy*dy;
- /*const double dist = sqrt( dx*dx+dy*dy );*/
- if (dist<min_dist) {
- min_dist = dist;
- min_index = j;
- }
- }
- }
- }
- /* escape step is away from closest normalized with distance */
- vx = st->cell[b].x - st->cell[min_index].x;
- vy = st->cell[b].y - st->cell[min_index].y;
- len = sqrt( vx*vx + vy*vy );
- if (len > 0.0001) {
- st->cell[b].vx = vx/len;
- st->cell[b].vy = vy/len;
- }
- st->cell[b].min_dist = len;
- /* if not adult (radius too small) */
- if (st->cell[b].radius < adult_radius) {
- /* if too small 60% stop shrinking */
- if (st->cell[b].radius < adult_radius * 0.6) {
- st->cell[b].growth = 1.0;
- }
- /* at safe distance we start growing again */
- if (len > grow_dist) {
- if (st->cell[b].energy > 30) {
- st->cell[b].growth = 1.005;
- }
- }
- } else { /* else keep size */
- st->cell[b].growth = 1.0;
- }
- }
- }
- } else {
- st->cell[0].min_dist = 2*st->move_dist;
- }
-
- /* now move em, snack and burn energy */
- for (b=0; b<st->num_cells; ++b) {
- /* if still alive */
- if (st->cell[b].energy > 0) {
- /* agility depends on amount of energy */
- double fac = (double)st->cell[b].energy / 50.0;
- if (fac < 0.0) fac = 0.0;
- if (fac > 1.0) fac = 1.0;
-
- st->cell[b].x += fac*(2.0 -
- (4.0*(double)random() / (double)RAND_MAX) +
- st->cell[b].vx);
- st->cell[b].y += fac*(2.0 -
- (4.0*(double)random() / (double)RAND_MAX) +
- st->cell[b].vy);
-
- /* get older and burn energy */
- if (st->cell[b].energy > 0) {
- st->cell[b].age++;
- st->cell[b].energy--;
- }
-
- /* have a snack */
- x = ((int)st->cell[b].x)/4;
- if (x<0) x=0;
- if (x>=w4) x = w4-1;
- y = ((int)st->cell[b].y)/4;
- if (y<0) y=0;
- if (y>=h4) y = h4-1;
-
- offset = x+y*w4;
-
- /* don't eat if already satisfied */
- if (st->cell[b].energy < 100 &&
- st->food[offset] > 0) {
- st->food[offset]--;
- st->cell[b].energy++;
- /* if you are hungry, eat more */
- if (st->cell[b].energy < 50 &&
- st->food[offset] > 0) {
- st->food[offset]--;
- st->cell[b].energy++;
- }
- }
- }
- }
-}
-
-ENTRYPOINT void
-reshape_glcells( ModeInfo *mi, int width, int height )
-{
- State *st = &sstate[MI_SCREEN(mi)];
- int rot = current_device_rotation();
- st->height = height;
- st->width = width;
-# ifdef HAVE_MOBILE
- st->screen_scale = (double)(width < height ? width : height) / 1600.0;
-# else
- st->screen_scale = (double)width / 1600.0;
-# endif
-
- st->radius = s_radius;
- if (st->radius < 5) st->radius = 5;
- if (st->radius > 200) st->radius = 200;
- st->radius *= st->screen_scale;
-
- st->move_dist = s_min_dist;
- if (st->move_dist < 1.0) st->move_dist = 1.0;
- if (st->move_dist > 3.0) st->move_dist = 3.0;
- st->move_dist *= st->radius;
-
- glViewport (0, 0, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho( 0, width, height, 0, 200, 0 );
- glRotatef (rot, 0, 0, 1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- if (st->food) free( st->food );
- st->food = (int *)malloc( ((width*height)/16)*sizeof(int) );
- /* create_cells( st );*/
-
-# ifdef HAVE_MOBILE
- glTranslatef (st->width/2, st->height/2, 0);
- if (rot == 90 || rot == -90 || rot == 270 || rot == -270)
- st->width = height, st->height = width;
- glRotatef (rot, 0, 0, 1);
- if (st->wire) glScalef(0.8, 0.8, 1);
- glTranslatef (-st->width/2, -st->height/2, 0);
-# endif
-}
-
-ENTRYPOINT void
-init_glcells( ModeInfo *mi )
-{
- int i, divisions;
- State *st=0;
-
- MI_INIT(mi, sstate);
- st = &sstate[MI_SCREEN(mi)];
-
- st->glx_context = init_GL(mi);
- st->cell = 0;
- st->num_cells = 0;
- st->wire = MI_IS_WIREFRAME(mi);
-
- /* get settings */
- st->max_cells = s_maxcells;;
- if (st->max_cells < 50) st->max_cells = 50;
- if (st->max_cells > 10000) st->max_cells = 10000;
-
- st->pause = s_pause;
- if (st->pause < 0) st->pause = 0;
- if (st->pause > 400) st->pause = 400;
- st->pause_counter = st->pause;
-
- st->radius = s_radius;
- if (st->radius < 5) st->radius = 5;
- if (st->radius > 200) st->radius = 200;
-
- divisions = s_quality;
- if (divisions < 0) divisions = 0;
- if (divisions > 5) divisions = 5;
-
- st->num_seeds = s_seeds;
- if (st->num_seeds < 1) st->num_seeds = 1;
- if (st->num_seeds > 16) st->num_seeds = 16;
-
- st->minfood = s_minfood;
- if (st->minfood < 0) st->minfood = 0;
- if (st->minfood > 1000) st->minfood = 1000;
-
- st->maxfood = s_maxfood;
- if (st->maxfood < 0) st->maxfood = 0;
- if (st->maxfood > 1000) st->maxfood = 1000;
-
- if (st->maxfood < st->minfood) st->maxfood = st->minfood+1;
-
- st->keep_old_cells = s_keepold;
-
- st->divide_age = s_divideage;
- if (st->divide_age < 1) st->divide_age = 1;
- if (st->divide_age > 1000) st->divide_age = 1000;
-
- st->move_dist = s_min_dist;
- if (st->move_dist < 1.0) st->move_dist = 1.0;
- if (st->move_dist > 3.0) st->move_dist = 3.0;
- st->move_dist *= st->radius;
-
- for (i=0; i<NUM_CELL_SHAPES; ++i) st->cell_list[i] = -1;
- st->nucleus_list = -1;
- st->food = 0;
-
- st->sphere = create_sphere( st, divisions );
- st->disturbance =
- (double *) malloc( st->sphere->num_vertex*sizeof(double) );
- for (i=0; i<st->sphere->num_vertex; ++i) {
- st->disturbance[i] =
- 0.05-((double)random()/(double)RAND_MAX*0.1);
- }
-
- create_nucleus_texture( st );
-
- reshape_glcells (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-}
-
-ENTRYPOINT void
-draw_glcells( ModeInfo *mi )
-{
- State *st = &sstate[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if (!st->glx_context) return;
-
- glXMakeCurrent( MI_DISPLAY(mi), MI_WINDOW(mi), *st->glx_context);
-
- mi->polygon_count = render( st );
-
- if (mi->fps_p) do_fps (mi);
-
- glFinish();
- glXSwapBuffers( dpy, window );
-}
-
-ENTRYPOINT void
-free_glcells( ModeInfo *mi )
-{
- int i;
- State *st = &sstate[MI_SCREEN(mi)];
-
- if (!st->glx_context) return;
- glXMakeCurrent( MI_DISPLAY(mi), MI_WINDOW(mi), *st->glx_context);
-
- if (st->sphere) free_Object( st->sphere );
- if (st->food) free( st->food );
- for (i=0; i<NUM_CELL_SHAPES; ++i) {
- if (st->cell_list[i] != -1) {
- glDeleteLists( st->cell_list[i], 1 );
- }
- }
- if (st->cell) free( st->cell );
- free( st->disturbance );
- glDeleteTextures( 1, &st->texture_name );
- free( st->texture );
- if (glIsList(st->nucleus_list)) glDeleteLists(st->nucleus_list, 1);
-}
-
-XSCREENSAVER_MODULE( "GLCells", glcells )
diff --git a/hacks/glx/glcells.man b/hacks/glx/glcells.man
deleted file mode 100644
index 56f5d07..0000000
--- a/hacks/glx/glcells.man
+++ /dev/null
@@ -1,97 +0,0 @@
-.TH XScreenSaver 1 "June 2007"
-.SH NAME
-glcells \- growing cells graphics hack
-.SH SYNOPSIS
-.B glcells
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fInum\fP] [\-pause \fInum\fP] [\-maxcells \fInum\fP]
-[\-radius \fInum\fP] [\-seeds \fInum\fP] [\-quality \fInum\fP]
-[\-minfood \fInum\fP] [\-maxfood \fInum\fP] [\-divideage \fInum\fP]
-[\-mindist \fInum\fP]
-[\-keepold]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIglcells\fP program draws cells that divide exponentially, eat and eventually die.
-.SH OPTIONS
-.I glcells
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-pause \fInum\fP\fP
-Specifies the pause at the end of the animation (all cells dead or maximum amount of cells reached). Unit is in frames, default 20.
-.TP 8
-.B \-maxcells \fInum\fP\fP
-Specifies the maximum number of cells on screen (dead cells also count, even if invisible). Default is 800.
-.TP 8
-.B \-radius \fInum\fP\fP
-Specifies the radius of the cells. Default is 40.
-.TP 8
-.B \-seeds \fInum\fP\fP
-Specifies the number of cells when animation starts. Default is 1.
-.TP 8
-.B \-quality \fInum\fP\fP
-Specifies subdivision quality of the spheres used to draw the cells [0...5]. Default is 3.
-.TP 8
-.B \-minfood \fInum\fP\fP
-Food is ditributed randomly on the screen (Yes, the cells need to eat). This parameter specifies the
-minimum amount of food per pixel. Default is 5.
-.TP 8
-.B \-maxfood \fInum\fP\fP
-Food is ditributed randomly on the screen (Yes, the cells need to eat). This parameter specifies the
-maximum amount of food per pixel. Default is 20.
-.TP 8
-.B \-divideage \fInum\fP\fP
-Specifies the minimum age in frames a cell needs to have before being able to divide. Default is 20
-.TP 8
-.B \-mindist \fInum\fP\fP
-Specifies the minimum distance between cells. Default 1.4
-.TP 8
-.B \-delay \fInum\fP
-How long to pause between frames. Default is 20000, or 0.02 second.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-wireframe
-Draw wireframe only.
-.TP 8
-.B \-keepold
-Dead cells stay on screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-settings (1),
-.SH COPYRIGHT
-Copyright \(co 2007 by Matthias Toussaint. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Matthias Toussaint <glcells@mtoussaint.de>, 17-Jun-2007, http://www.mtoussaint.de/bits.html.
-
diff --git a/hacks/glx/gleidescope.c b/hacks/glx/gleidescope.c
deleted file mode 100644
index b33770a..0000000
--- a/hacks/glx/gleidescope.c
+++ /dev/null
@@ -1,1619 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* vim: set ai ts=4 sw=4: */
-
-#if 0
-/*static const char sccsid[] = "@(#)gleidescope.c 1.0 03/06/27 xlockmore";*/
-#endif
-
-/* enable -grab switch for animations */
-#undef GRAB
-
-#undef DISPLAY_TEXTURE
-
-/*-
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- *
- * 20030627 1.0 acd First Release.
- * Texture loading code from 'glplanet'
- * by Jamie Zawinski <jwz@jwz.org>
- * 20030810 1.1 acd Added size flag.
- * Now grabs screen / video / picture
- * (uses code from 'glslideshow' by
- * Mike Oliphant, Ben Buxton, Jamie Zawinski).
- * Added -duration.
- * Added mouse code.
- * Added fade code (also from glslideshow).
- * 20031013 1.2 acd Migrated to compile without warnings under
- * xscreensaver 4.13.
- * 20031023 1.3 acd Better code to limit twisting speeds.
- * Tweaked initial rotation values.
- * Move, Rotate, Zoom now chosen at random if
- * no preference is given.
- * Made grid slightly bigger so you can't see
- * the edge when zooming and moving.
- * 20061226 1.4 acd Now uses GL Display Lists.
- * 20070318 1.5 acd Generates textures.
- * Fixed texture size problem (and introduced another).
- * 20070412 1.6 acd Textures now have independant sizes.
- * 20070413 1.7 acd Added Lissajous movement pattern.
- * 20070414 1.8 acd Added corners movement pattern.
- * 20080319 1.9 acd Changes to arguments for saner gleidescope.xml.
- *
- * TODO
- * generate textures myself - render random shapes to 256x256 texture. (done)
- * lower res for checks and random - use 256 and 4x4 or 8x8 pixels. (disabled for now)
- * gnome-saver doesn't let you specify source directory so add that to this.
- * image loading routine is too slow - rotation grinds to a halt - stop using it. (better in version 5)
- * image loading also looks bad for non-square images - edges are black. (fixed)
- * possible to see edge of the world on widescreen terminals - use larger grid and hidden hex removal?
- * fading textures may have different max_tx - use two sets. (done)
- * choice of movement patterns. (3 implemented, chooseable at compile time)
- * look into rangle and tangle.
- */
-
-/*
-**----------------------------------------------------------------------------
-** Defines
-**----------------------------------------------------------------------------
-*/
-
-#ifdef STANDALONE
-# define DEFAULTS \
- "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*size: 0 \n" \
- "*useSHM: True \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_gleidescope 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL
-
-#include "colors.h"
-#include "ximage-loader.h"
-#include "grab-ximage.h"
-
-#ifdef GRAB
-void grab_frame(Display *display, Window window);
-#endif
-
-/* acd TODO should all these be in gleidestruct? */
-/* they can't be, because of the idiotic way the xlockmore "argtype vars"
- interface works. -jwz */
-#ifdef GRAB
-static Bool grab; /* grab images */
-#endif
-static Bool move; /* moving camera */
-static Bool nomove; /* no moving camera */
-static Bool rotate; /* rotate in place */
-static Bool norotate; /* no rotate in place */
-static Bool zoom; /* zooming camera */
-static Bool nozoom; /* no zooming camera */
-static char *image_str; /* name of texture to load */
-static int duration; /* length of time to display grabbed image */
-
-#define MAX_CAM_SPEED 1.0
-#define MAX_ANGLE_VEL 1.0
-#define INITIAL_ANGLE_VEL 0.2
-#define INITIAL_ANGLE_ACC 0.001
-#define TWISTING_PROBABILITY 1000 /* 1 in ... of change of acceleration */
-
-#define RADIANS (M_PI / 180)
-#define ANGLE_120 (M_PI * 2 / 3)
-#define ANGLE_240 (M_PI * 4 / 3)
-
-#define DEF_GRAB "False"
-#define DEF_MOVE "False"
-#define DEF_NOMOVE "False"
-#define DEF_ROTATE "False"
-#define DEF_NOROTATE "False"
-#define DEF_ZOOM "False"
-#define DEF_NOZOOM "False"
-#define DEF_IMAGE "DEFAULT"
-#define DEF_DURATION "30"
-
-
-static XrmOptionDescRec opts[] =
-{
-#ifdef GRAB
- {"-grab", ".gleidescope.grab", XrmoptionNoArg, "true"},
-#endif
- {"-move", ".gleidescope.move", XrmoptionNoArg, "true"},
- {"-no-move", ".gleidescope.nomove", XrmoptionNoArg, "true"},
- {"-rotate", ".gleidescope.rotate", XrmoptionNoArg, "true"},
- {"-no-rotate", ".gleidescope.norotate", XrmoptionNoArg, "true"},
- {"-zoom", ".gleidescope.zoom", XrmoptionNoArg, "true"},
- {"-no-zoom", ".gleidescope.nozoom", XrmoptionNoArg, "true"},
- {"-image", ".gleidescope.image", XrmoptionSepArg, "DEFAULT"},
- {"-duration", ".gleidescope.duration", XrmoptionSepArg, "30"},
-};
-
-
-static argtype vars[] = {
-#ifdef GRAB
- {&grab, "grab", "Grab", DEF_GRAB, t_Bool},
-#endif
- {&move, "move", "Move", DEF_MOVE, t_Bool},
- {&nomove, "nomove", "noMove", DEF_NOMOVE, t_Bool},
- {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
- {&norotate, "norotate", "noRotate", DEF_NOROTATE, t_Bool},
- {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Bool},
- {&nozoom, "nozoom", "noZoom", DEF_NOZOOM, t_Bool},
- {&image_str, "image", "Image", DEF_IMAGE, t_String},
- {&duration, "duration", "Duration", DEF_DURATION, t_Int},
-};
-
-static OptionStruct desc[] = {
-#ifdef GRAB
- {"-grab", "grab images to create animation"},
-#endif
- {"-move", "camera will move"},
- {"-no-move", "camera won't move"},
- {"-rotate", "camera will rotate"},
- {"-no-rotate", "camera won't rotate"},
- {"-zoom", "camera will zoom"},
- {"-no-zoom", "camera won't zoom"},
- {"-image", "xpm / xbm image file to use for texture"},
- {"-duration", "length of time texture will be used"},
-};
-
-ENTRYPOINT ModeSpecOpt gleidescope_opts = {
- sizeof opts / sizeof opts[0], opts,
- sizeof vars / sizeof vars[0], vars,
- desc
-};
-
-#ifdef USE_MODULES
-ModStruct gleidescope_description = {
- "gleidescope", "init_gleidescope", "draw_gleidescope", NULL,
- "draw_gleidescope", "init_gleidescope", "free_gleidescope",
- &gleidescope_opts, 1000, 1, 2, 1, 4, 1.0, "",
- "GL Kaleidescope", 0, NULL};
-#endif
-
-/*
-**-----------------------------------------------------------------------------
-** Typedefs
-**-----------------------------------------------------------------------------
-*/
-
-typedef struct hex_s {
- GLfloat x, y, z; /* position */
-} hex_t;
-
-typedef struct {
- GLfloat x;
- GLfloat y;
- GLfloat z;
-} vectorf;
-
-typedef struct {
- GLfloat x;
- GLfloat y;
-} vector2f;
-
-typedef struct {
- GLuint id; /* opengl texture id */
- GLfloat width, height; /* texture width and height */
- GLfloat min_tx, min_ty; /* minimum texture sizes */
- GLfloat max_tx, max_ty; /* maximum texture sizes */
- time_t start_time;
- Bool button_down_p;
- Bool mipmap_p;
- Bool waiting_for_image_p;
- /* r_phase is for triangle rotation speed */
- GLfloat x_period, y_period, r_period;
- GLfloat x_phase, y_phase, r_phase;
-} texture;
-
-#define MAX_FADE 500 /* number of fade cycles */
-
-typedef struct {
- float cam_x_speed, cam_z_speed, cam_y_speed;
- int cam_x_phase, cam_z_phase, cam_y_phase;
- float tic;
- GLXContext *glx_context;
- Window window;
- texture textures[2]; /* texture handles */
- GLuint visible; /* index for current texture */
- GLint fade;
- time_t start_time;
- Bool button_down_p;
-
- int size;
- int list;
-
- float tangle; /* texture angle (degrees) */
- float tangle_vel; /* texture velocity */
- float tangle_acc; /* texture acceleration */
-
- float rangle; /* rotate angle */
- float rangle_vel; /* rotate velocity */
- float rangle_acc; /* rotate acceleration */
-
- /* mouse */
- int xstart;
- int ystart;
- double xmouse;
- double ymouse;
-
- Bool mipmap_p;
- Bool waiting_for_image_p;
-
-} gleidestruct;
-
-#define frandrange(x, y) (x + frand(y - x))
-
-#define XOFFSET (0.8660254f) /* sin 60' */
-#define YOFFSET (1.5000000f) /* cos 60' + 1 */
-
-#if 0
-
-#define SIZE 3
-
-/* generates a grid with edges of given size */
-/* acd TODO - replace hex[] with this and allow size and distance as parameters */
-
-int
-generate_grid(int size)
-
- int i, x, y;
-
- gp->size--;
-
- i = gp->size;
- for (y = -size ; y <= size ; y++) {
- for (x = -i ; x <= i ; x += 2) {
- printf("{XOFFSET * %d, YOFFSET * %d, 0},\n", x, y);
- }
- printf("\n");
- if (y < 0) {
- i++;
- } else {
- i--;
- }
- }
- return 0;
-}
-#endif
-
-/* acd - this is terrible - 120+ hexes */
-static const hex_t hex[] = {
- /* edges of size 7 */
- /* number of hexagons required to cover screen depends on camera distance */
- /* at a distance of 10 this is just about enough. */
- {XOFFSET * -6, YOFFSET * -6, 0},
- {XOFFSET * -4, YOFFSET * -6, 0},
- {XOFFSET * -2, YOFFSET * -6, 0},
- {XOFFSET * 0, YOFFSET * -6, 0},
- {XOFFSET * 2, YOFFSET * -6, 0},
- {XOFFSET * 4, YOFFSET * -6, 0},
- {XOFFSET * 6, YOFFSET * -6, 0},
-
- {XOFFSET * -7, YOFFSET * -5, 0},
- {XOFFSET * -5, YOFFSET * -5, 0},
- {XOFFSET * -3, YOFFSET * -5, 0},
- {XOFFSET * -1, YOFFSET * -5, 0},
- {XOFFSET * 1, YOFFSET * -5, 0},
- {XOFFSET * 3, YOFFSET * -5, 0},
- {XOFFSET * 5, YOFFSET * -5, 0},
- {XOFFSET * 7, YOFFSET * -5, 0},
-
- {XOFFSET * -8, YOFFSET * -4, 0},
- {XOFFSET * -6, YOFFSET * -4, 0},
- {XOFFSET * -4, YOFFSET * -4, 0},
- {XOFFSET * -2, YOFFSET * -4, 0},
- {XOFFSET * 0, YOFFSET * -4, 0},
- {XOFFSET * 2, YOFFSET * -4, 0},
- {XOFFSET * 4, YOFFSET * -4, 0},
- {XOFFSET * 6, YOFFSET * -4, 0},
- {XOFFSET * 8, YOFFSET * -4, 0},
-
- {XOFFSET * -9, YOFFSET * -3, 0},
- {XOFFSET * -7, YOFFSET * -3, 0},
- {XOFFSET * -5, YOFFSET * -3, 0},
- {XOFFSET * -3, YOFFSET * -3, 0},
- {XOFFSET * -1, YOFFSET * -3, 0},
- {XOFFSET * 1, YOFFSET * -3, 0},
- {XOFFSET * 3, YOFFSET * -3, 0},
- {XOFFSET * 5, YOFFSET * -3, 0},
- {XOFFSET * 7, YOFFSET * -3, 0},
- {XOFFSET * 9, YOFFSET * -3, 0},
-
- {XOFFSET * -10, YOFFSET * -2, 0},
- {XOFFSET * -8, YOFFSET * -2, 0},
- {XOFFSET * -6, YOFFSET * -2, 0},
- {XOFFSET * -4, YOFFSET * -2, 0},
- {XOFFSET * -2, YOFFSET * -2, 0},
- {XOFFSET * 0, YOFFSET * -2, 0},
- {XOFFSET * 2, YOFFSET * -2, 0},
- {XOFFSET * 4, YOFFSET * -2, 0},
- {XOFFSET * 6, YOFFSET * -2, 0},
- {XOFFSET * 8, YOFFSET * -2, 0},
- {XOFFSET * 10, YOFFSET * -2, 0},
-
- {XOFFSET * -11, YOFFSET * -1, 0},
- {XOFFSET * -9, YOFFSET * -1, 0},
- {XOFFSET * -7, YOFFSET * -1, 0},
- {XOFFSET * -5, YOFFSET * -1, 0},
- {XOFFSET * -3, YOFFSET * -1, 0},
- {XOFFSET * -1, YOFFSET * -1, 0},
- {XOFFSET * 1, YOFFSET * -1, 0},
- {XOFFSET * 3, YOFFSET * -1, 0},
- {XOFFSET * 5, YOFFSET * -1, 0},
- {XOFFSET * 7, YOFFSET * -1, 0},
- {XOFFSET * 9, YOFFSET * -1, 0},
- {XOFFSET * 11, YOFFSET * -1, 0},
-
- {XOFFSET * -12, YOFFSET * 0, 0},
- {XOFFSET * -10, YOFFSET * 0, 0},
- {XOFFSET * -8, YOFFSET * 0, 0},
- {XOFFSET * -6, YOFFSET * 0, 0},
- {XOFFSET * -4, YOFFSET * 0, 0},
- {XOFFSET * -2, YOFFSET * 0, 0},
- {XOFFSET * 0, YOFFSET * 0, 0},
- {XOFFSET * 2, YOFFSET * 0, 0},
- {XOFFSET * 4, YOFFSET * 0, 0},
- {XOFFSET * 6, YOFFSET * 0, 0},
- {XOFFSET * 8, YOFFSET * 0, 0},
- {XOFFSET * 10, YOFFSET * 0, 0},
- {XOFFSET * 12, YOFFSET * 0, 0},
-
- {XOFFSET * -11, YOFFSET * 1, 0},
- {XOFFSET * -9, YOFFSET * 1, 0},
- {XOFFSET * -7, YOFFSET * 1, 0},
- {XOFFSET * -5, YOFFSET * 1, 0},
- {XOFFSET * -3, YOFFSET * 1, 0},
- {XOFFSET * -1, YOFFSET * 1, 0},
- {XOFFSET * 1, YOFFSET * 1, 0},
- {XOFFSET * 3, YOFFSET * 1, 0},
- {XOFFSET * 5, YOFFSET * 1, 0},
- {XOFFSET * 7, YOFFSET * 1, 0},
- {XOFFSET * 9, YOFFSET * 1, 0},
- {XOFFSET * 11, YOFFSET * 1, 0},
-
- {XOFFSET * -10, YOFFSET * 2, 0},
- {XOFFSET * -8, YOFFSET * 2, 0},
- {XOFFSET * -6, YOFFSET * 2, 0},
- {XOFFSET * -4, YOFFSET * 2, 0},
- {XOFFSET * -2, YOFFSET * 2, 0},
- {XOFFSET * 0, YOFFSET * 2, 0},
- {XOFFSET * 2, YOFFSET * 2, 0},
- {XOFFSET * 4, YOFFSET * 2, 0},
- {XOFFSET * 6, YOFFSET * 2, 0},
- {XOFFSET * 8, YOFFSET * 2, 0},
- {XOFFSET * 10, YOFFSET * 2, 0},
-
- {XOFFSET * -9, YOFFSET * 3, 0},
- {XOFFSET * -7, YOFFSET * 3, 0},
- {XOFFSET * -5, YOFFSET * 3, 0},
- {XOFFSET * -3, YOFFSET * 3, 0},
- {XOFFSET * -1, YOFFSET * 3, 0},
- {XOFFSET * 1, YOFFSET * 3, 0},
- {XOFFSET * 3, YOFFSET * 3, 0},
- {XOFFSET * 5, YOFFSET * 3, 0},
- {XOFFSET * 7, YOFFSET * 3, 0},
- {XOFFSET * 9, YOFFSET * 3, 0},
-
- {XOFFSET * -8, YOFFSET * 4, 0},
- {XOFFSET * -6, YOFFSET * 4, 0},
- {XOFFSET * -4, YOFFSET * 4, 0},
- {XOFFSET * -2, YOFFSET * 4, 0},
- {XOFFSET * 0, YOFFSET * 4, 0},
- {XOFFSET * 2, YOFFSET * 4, 0},
- {XOFFSET * 4, YOFFSET * 4, 0},
- {XOFFSET * 6, YOFFSET * 4, 0},
- {XOFFSET * 8, YOFFSET * 4, 0},
-
- {XOFFSET * -7, YOFFSET * 5, 0},
- {XOFFSET * -5, YOFFSET * 5, 0},
- {XOFFSET * -3, YOFFSET * 5, 0},
- {XOFFSET * -1, YOFFSET * 5, 0},
- {XOFFSET * 1, YOFFSET * 5, 0},
- {XOFFSET * 3, YOFFSET * 5, 0},
- {XOFFSET * 5, YOFFSET * 5, 0},
- {XOFFSET * 7, YOFFSET * 5, 0},
-
- {XOFFSET * -6, YOFFSET * 6, 0},
- {XOFFSET * -4, YOFFSET * 6, 0},
- {XOFFSET * -2, YOFFSET * 6, 0},
- {XOFFSET * 0, YOFFSET * 6, 0},
- {XOFFSET * 2, YOFFSET * 6, 0},
- {XOFFSET * 4, YOFFSET * 6, 0},
- {XOFFSET * 6, YOFFSET * 6, 0},
-};
-
-/*
-**----------------------------------------------------------------------------
-** Local Variables
-**----------------------------------------------------------------------------
-*/
-
-static gleidestruct *gleidescope = NULL;
-
-#if 0
-/*
- *load defaults in config structure
- */
-static void setdefaultconfig(void)
-{
-#ifdef GRAB
- grab = False;
-#endif
- move = False;
- rotate = False;
- zoom = False;
- image = NULL;
-}
-#endif
-
-ENTRYPOINT Bool
-gleidescope_handle_event(ModeInfo *mi, XEvent *event)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
-
- /*
- printf("event:%d\n", event->xany.type);
- printf("button:%d\n", event->xbutton.button);
- */
- if (event->xany.type == ButtonPress)
- {
- if (event->xbutton.button == Button1 ||
- event->xbutton.button == Button3)
- {
- /* store initial values of mouse */
- gp->xstart = event->xbutton.x;
- gp->ystart = event->xbutton.y;
-
- /* button is down */
- gp->button_down_p = True;
- return True;
- }
-#if 0 /* TODO */
- else if (event->xbutton.button == Button4)
- {
- /* zoom in */
- return True;
- }
- else if (event->xbutton.button == Button5)
- {
- /* zoom out */
- return True;
- }
-#endif
- } else if (event->xany.type == ButtonRelease)
- {
- if (event->xbutton.button == Button1 ||
- event->xbutton.button == Button3)
- {
- /* button is up */
- gp->button_down_p = False;
- return True;
- }
- } else if (event->xany.type == MotionNotify)
- {
- if (gp->button_down_p)
- {
- /* update mouse position */
- gp->xmouse += (double)(event->xmotion.x - gp->xstart) / MI_WIDTH(mi);
- gp->ymouse += (double)(event->xmotion.y - gp->ystart) / MI_HEIGHT(mi);
- gp->xstart = event->xmotion.x;
- gp->ystart = event->xmotion.y;
-
- return True;
- }
- }
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- gp->start_time = -1;
- gp->fade = 0;
- return True;
- }
-
- return False;
-}
-
-
-static void
-image_loaded_cb (const char *filename, XRectangle *geometry,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- texture *tp = (texture *) closure;
-
-#if 0
- gp->max_tx = (GLfloat) image_width / texture_width;
- gp->max_ty = (GLfloat) image_height / texture_height;
-#endif
-
- /* new - taken from flipscreen */
- tp->width = texture_width;
- tp->height = texture_height;
- tp->min_tx = (GLfloat) geometry->x / tp->width;
- tp->min_ty = (GLfloat) geometry->y / tp->height;
- tp->max_tx = (GLfloat) (geometry->x + geometry->width) / tp->width;
- tp->max_ty = (GLfloat) (geometry->y + geometry->height) / tp->height;
-
-#ifdef DEBUG
- printf("Image w,h: (%d, %d)\n", image_width, image_height);
- printf("Texture w,h: (%d, %d)\n", texture_width, texture_height);
- printf("Geom x,y: (%d, %d)\n", geometry->x, geometry->y);
- printf("Geom w,h: (%d, %d)\n", geometry->width, geometry->height);
- printf("Max Tx,Ty: (%f, %f)\n", tp->max_tx, tp->max_ty);
-#endif
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- (tp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
-
- tp->waiting_for_image_p = False;
- tp->start_time = time ((time_t *) 0);
-}
-
-static void
-getSnapshot(ModeInfo *mi, texture *texture)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
-
-#ifdef DEBUG
- printf("getSnapshot");
-#endif
-
- if (MI_IS_WIREFRAME(mi))
- return;
-
- gp->mipmap_p = True;
- load_texture_async (mi->xgwa.screen, mi->window,
- *gp->glx_context, 0, 0, gp->mipmap_p,
- texture->id, image_loaded_cb, texture);
- texture->start_time = time((time_t *)0);
-}
-
-#define TEXTURE_SIZE 256
-
-static void
-plot(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
- int c;
- if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
- return;
- }
- c = ((x * TEXTURE_SIZE) + y) * 4;
- /*printf("(%d,%d)[%d]\n", x, y, c);*/
- buffer[c + 0] = r;
- buffer[c + 1] = g;
- buffer[c + 2] = b;
- buffer[c + 3] = a;
-}
-
-#if 0
-static void
-plot2(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
- int c;
- if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
- return;
- }
- c = ((x * TEXTURE_SIZE) + y) * 4;
- /*printf("(%d,%d)[%d]\n", x, y, c);*/
- buffer[c + 0] = r;
- buffer[c + 1] = g;
- buffer[c + 2] = b;
- buffer[c + 3] = a;
-
- if (y + 1 < TEXTURE_SIZE) {
- buffer[c + 4] = r;
- buffer[c + 5] = g;
- buffer[c + 6] = b;
- buffer[c + 7] = a;
- }
-
- if (x + 1 < TEXTURE_SIZE) {
- c += (TEXTURE_SIZE * 4);
- buffer[c + 0] = r;
- buffer[c + 1] = g;
- buffer[c + 2] = b;
- buffer[c + 3] = a;
- if (y + 1 < TEXTURE_SIZE) {
- buffer[c + 4] = r;
- buffer[c + 5] = g;
- buffer[c + 6] = b;
- buffer[c + 7] = a;
- }
- }
-}
-#endif
-
-/* draw geometric shapes to texture */
-/* modifies passed in buffer */
-static void
-draw_shapes (unsigned char *buffer) {
- int a = 0xff;
- int x, y, w, h;
- int i, j;
- int s;
- float left, right;
-
- for (i = 0 ; i < TEXTURE_SIZE * TEXTURE_SIZE * 4 ; i += 4) {
- buffer[i + 0] = 0x00;
- buffer[i + 1] = 0x00;
- buffer[i + 2] = 0x00;
- buffer[i + 3] = 0xff;
- }
-
- for (s = 0 ; s < 25 ; s++) {
- int shape = random() % 3;
-
- /* 8 bits */
- int r = (random() & 0xff);
- int g = (random() & 0xff);
- int b = (random() & 0xff);
-
- switch (shape) {
- case 0:
- /* rectangle */
- x = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4); /* top left */
- y = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4);
- w = 10 + random() % (TEXTURE_SIZE / 4); /* size */
- h = 10 + random() % (TEXTURE_SIZE / 4);
-#ifdef DEBUG
- printf("Rectangle: (%d, %d)(%d, %d)\n", x, y, w, h);
-#endif
- if (x < 0) {
- x = 0;
- }
- if (y < 0) {
- y = 0;
- }
- for (i = x ; i < x + w && i < TEXTURE_SIZE; i++) {
- for (j = y ; j < y + h && j < TEXTURE_SIZE; j++) {
- plot(buffer, i, j, r, g, b, a);
- }
- }
- break;
-
- case 1:
- /* circle */
- x = random() % TEXTURE_SIZE; /* centre */
- y = random() % TEXTURE_SIZE;
- h = 10 + random() % (TEXTURE_SIZE / 8); /* radius */
-#ifdef DEBUG
- printf("Circle: %d, %d, %d\n", x, y, h);
-#endif
- for (i = 0 ; i < h ; i++) {
- int xdist = i * i;
- for (j = 0 ; j < h ; j++) {
- int ydist = j * j;
- /*
- printf("xdist: %d\n", xdist);
- printf("ydist: %d\n", ydist);
- printf("radius: %d\n", h * h);
- */
- if ((xdist + ydist) < (h * h)) {
- plot(buffer, x + i, y + j, r, b, g, a);
- /* check we haven't already done these */
- if (j != 0) {
- plot(buffer, x + i, y - j, r, b, g, a);
- }
- if (i != 0) {
- plot(buffer, x - i, y + j, r, b, g, a);
- if (j != 0) {
- plot(buffer, x - i, y - j, r, b, g, a);
- }
- }
- }
- }
- }
- break;
-
- case 2:
- /* triangle */
- x = random() % TEXTURE_SIZE; /* top */
- y = random() % TEXTURE_SIZE;
- h = 10 + random() % (TEXTURE_SIZE / 4); /* height */
-#ifdef DEBUG
- printf("Triangle: %d, %d, %d\n", x, y, h);
-#endif
- left = x;
- right = x;
- for (i = 0 ; i < h ; i++) {
- for (j = left ; j < right ; j++) {
- plot(buffer, j, y + i, r, g, b, a);
- }
- left -= .5;
- right += .5;
- }
- break;
- }
- }
-}
-
-static void
-setup_random_texture (ModeInfo *mi, texture *texture)
-{
- int width = 0, height = 0;
- char buf[1024];
- unsigned char *my_data = NULL;
-#if 0
- int i, j, c;
- int style;
- int r0, g0, b0, a0, r1, g1, b1, a1;
-#endif
-
-#ifdef DEBUG
- printf("RandomTexture\n");
-#endif
-
- /* use this texture */
- glBindTexture(GL_TEXTURE_2D, texture->id);
-
- clear_gl_error();
-
- /*
- * code for various generated patterns - noise, stripes, checks etc.
- * random geometric shapes looked the best.
- */
-
-#if 0
- style = random() & 0x3;
- r0 = random() & 0xff;
- g0 = random() & 0xff;
- b0 = random() & 0xff;
- a0 = 0xff;
- r1 = random() & 0xff;
- g1 = random() & 0xff;
- b1 = random() & 0xff;
- a1 = 0xff;
-
- switch (style) {
- case 0: /* random */
- printf("Random0\n");
- height = width = TEXTURE_SIZE;
- my_data = (void *)malloc(width * height * 4);
- for (i = 0 ; i < width ; i += 2) {
- for (j = 0 ; j < height ; j += 2) {
- r0 = random() & 0xff;
- g0 = random() & 0xff;
- b0 = random() & 0xff;
- a0 = 0xff;
- plot2(my_data, i, j, r0, g0, b0, a0);
- }
- }
- break;
-
- case 1: /* shapes */
-#endif
-#ifdef DEBUG
- printf("Shapes\n");
-#endif
- height = width = TEXTURE_SIZE;
- my_data = (void *)malloc(width * height * 4);
- draw_shapes(my_data);
-#if 0
- break;
-
- case 2: /* check */
- printf("Check\n");
- height = width = TEXTURE_SIZE;
- my_data = (void *)malloc(width * height * 4);
- for (i = 0 ; i < height ; i += 2) {
- for (j = 0 ; j < width ; j += 2) {
- if (((i + j) & 0x3) == 0) {
- plot2(my_data, i, j, r0, g0, b0, a0);
- } else {
- plot2(my_data, i, j, r1, g1, b1, a1);
- }
- }
- }
- break;
-
- case 3: /* random stripes */
- printf("Stripes 2\n");
- height = width = TEXTURE_SIZE;
- my_data = (void *)malloc(width * height * 4);
- for (i = 0 ; i < height ; i += 2) {
- r0 = random() & 0xff;
- g0 = random() & 0xff;
- b0 = random() & 0xff;
- a0 = 0xff;
- for (j = 0 ; j < width ; j += 2) {
- plot2(my_data, i, j, r0, g0, b0, a0);
- }
- }
- break;
- }
-#endif
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- width, height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, my_data);
- sprintf (buf, "random texture: (%dx%d)",
- width, height);
- check_gl_error(buf);
-
- /* setup parameters for texturing */
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- if (random() & 0x1) {
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- } else {
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- }
-
- if (my_data != NULL) {
- free(my_data);
- my_data = NULL;
- }
-
- /* use full texture */
- /* acd - was 1.0 */
- texture->min_tx = 0.0;
- texture->max_tx = 2.0;
- texture->min_ty = 0.0;
- texture->max_ty = 2.0;
- texture->start_time = time((time_t *)0);
-}
-
-static Bool
-setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
-{
- Display *dpy = mi->dpy;
- Visual *visual = mi->xgwa.visual;
- char buf[1024];
-
- XImage *image = file_to_ximage (dpy, visual, filename);
- if (!image) return False;
-
-#ifdef DEBUG
- printf("FileTexture\n");
-#endif
-
- /* use this texture */
- glBindTexture(GL_TEXTURE_2D, texture->id);
-
- clear_gl_error();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- image->width, image->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, image->data);
- sprintf (buf, "texture: %.100s (%dx%d)",
- filename, image->width, image->height);
- check_gl_error(buf);
-
- /* setup parameters for texturing */
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- /* use full texture */
- texture->min_tx = 0.0;
- texture->max_tx = 1.0;
- texture->min_ty = 0.0;
- texture->max_ty = 1.0;
- texture->start_time = time((time_t *)0);
- return True;
-}
-
-static void
-setup_texture(ModeInfo * mi, texture *texture)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
-
- if (!image_str || !*image_str || !strcmp(image_str, "DEFAULT")) {
- BUILTIN:
- /* no image specified - use system settings */
-#ifdef DEBUG
- printf("SetupTexture: get_snapshot\n");
-#endif
- getSnapshot(mi, texture);
- } else {
- if (strcmp(image_str, "GENERATE") == 0) {
-#ifdef DEBUG
- printf("SetupTexture: random_texture\n");
-#endif
- setup_random_texture(mi, texture);
- } else {
- /* use supplied image file */
-#ifdef DEBUG
- printf("SetupTexture: file_texture\n");
-#endif
- if (! setup_file_texture(mi, image_str, texture))
- goto BUILTIN;
- }
- }
- /* copy start time from texture */
- gp->start_time = texture->start_time;
-
- check_gl_error("texture initialization");
-
- /* acd
- * resultant loaded image is upside down BUT
- * it's a kaledescope and half of the hexagon is backwards anyway...
- */
-
- /* TODO: values for lissajous movement */
- texture->x_period = frandrange(-2.0, 2.0);
- texture->y_period = frandrange(-2.0, 2.0);
- texture->r_period = frandrange(-2.0, 2.0);
- texture->x_phase = frand(M_PI * 2);
- texture->y_phase = frand(M_PI * 2);
- texture->r_phase = frand(M_PI * 2);
-#ifdef DEBUG
- printf("XPeriod %f XPhase %f\n", texture->x_period, texture->x_phase);
- printf("YPeriod %f YPhase %f\n", texture->y_period, texture->y_phase);
- printf("RPeriod %f RPhase %f\n", texture->r_period, texture->r_phase);
-#endif
-}
-
-#define VERTEX0 glVertex3f( 0.0000f, 0.000f, 0.0f);
-#define VERTEX1 glVertex3f( 0.0000f, 1.000f, 0.0f);
-#define VERTEX2 glVertex3f( XOFFSET, 0.500f, 0.0f);
-#define VERTEX3 glVertex3f( XOFFSET, -0.500f, 0.0f);
-#define VERTEX4 glVertex3f( 0.0000f, -1.000f, 0.0f);
-#define VERTEX5 glVertex3f(-XOFFSET, -0.500f, 0.0f);
-#define VERTEX6 glVertex3f(-XOFFSET, 0.500f, 0.0f);
-
-/*
-** Three different functions for calculating texture coordinates
-** which modify how the texture triangle moves over the source image.
-** Choose one.
-*/
-
-#if 0
-/* the classic equilateral triangle rotating around centre */
-static void
-calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
-
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- GLfloat centre_x = 0.5;
- GLfloat centre_y = 0.5;
- GLfloat radius_x = (texture->max_tx - texture->min_tx) / 2;
- GLfloat radius_y = (texture->max_ty - texture->min_ty) / 2;
- GLfloat tangle2;
- t[0].x = centre_x;
- t[0].y = centre_y;
-
- /* t[1] */
- t[1].x = centre_x + .95 * radius_x * cos((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
- t[1].y = centre_y + .95 * radius_y * sin((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
-
- /* t[2] is always 60' further around than t2 */
- tangle2 = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS) + (M_PI * 2 / 6);
- t[2].x = centre_x + .95 * radius_x * cos(tangle2);
- t[2].y = centre_y + .95 * radius_y * sin(tangle2);
-#if 0
- printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
-#endif
-}
-#endif
-
-#if 1
-/* new lissajous movement pattern */
-static void
-calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
-
- /* equilateral triangle rotating around centre */
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- GLfloat width = texture->max_tx - texture->min_tx;
- GLfloat height = texture->max_ty - texture->min_ty;
- /* centre */
- GLfloat centre_x = texture->min_tx + (width * .5);
- GLfloat centre_y = texture->min_ty + (height * .5);
- /* m radius and t radius should be = .5 */
- /* triangle radius is 30% available space */
- GLfloat t_radius_x = width * .3;
- GLfloat t_radius_y = height * .3;
- /* movement radius is 30% available space */
- GLfloat m_radius_x = width * .2;
- GLfloat m_radius_y = height * .2;
- GLfloat angle2;
-
- /* centre of triangle */
- GLfloat angle = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS); /* to radians */
- GLfloat t_centre_x = centre_x + m_radius_x * cos(texture->x_period * angle + texture->x_phase);
- GLfloat t_centre_y = centre_y + m_radius_y * sin(texture->y_period * angle + texture->y_phase);
-
-#if 0
- printf("WH: %f, %f - tWH: %f, %f\n", width, height, texture->width, texture->height);
- printf("size: (%f, %f)\n", width, height);
- printf("centre: (%f, %f)\n", centre_x, centre_y);
-#endif
-
- angle2 = texture->r_period * angle + texture->r_phase;
- t[0].x = t_centre_x + t_radius_x * cos(angle2);
- t[0].y = t_centre_y + t_radius_y * sin(angle2);
- t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
- t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
- t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
- t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
-
-#if 0
- printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
-#endif
-}
-#endif
-
-#if 0
-/* corners into corners - meant to maximise coverage */
-static void
-calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
-
- /* equilateral triangle rotating around centre */
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- GLfloat width = texture->max_tx - texture->min_tx;
- GLfloat height = texture->max_ty - texture->min_ty;
- /* centre */
- GLfloat centre_x = texture->min_tx + (width * .5);
- GLfloat centre_y = texture->min_ty + (height * .5);
- /* m radius and t radius should be = .5 */
- /* triangle radius calculated using maths 8) */
-#define TRADIUS (M_SQRT2 - 1.0)
-#define MRADIUS (1.0 - (M_SQRT2 / 2.0))
- GLfloat t_radius_x = width * TRADIUS * .95;
- GLfloat t_radius_y = height * TRADIUS * .95;
- /* movement radius also calculated using maths */
- GLfloat m_radius_x = width * MRADIUS * .95;
- GLfloat m_radius_y = height * MRADIUS * .95;
- GLfloat angle, angle2;
- GLfloat t_centre_x, t_centre_y;
-
- /* centre of triangle */
- angle = gp->tangle * RADIANS; /* to radians */
- t_centre_x = centre_x + m_radius_x * cos(angle);
- t_centre_y = centre_y + m_radius_y * sin(angle);
-#if 0
- printf("angle: %f, %f\n", angle, gp->tangle);
- printf("tcentre: %f,%f\n", t_centre_x, t_centre_y);
- printf("tradius: %f,%f\n", t_radius_x, t_radius_y);
-
- printf("size: (%f, %f)\n", width, height);
- printf("centre: (%f, %f)\n", centre_x, centre_y);
- printf("centre: (%f, %f)\n", centre_x, centre_y);
- printf("TRADIUS: %f\n", TRADIUS);
- printf("MRADIUS: %f\n", MRADIUS);
-#endif
-
- /* angle2 is tied to tangle */
- angle2 = (180.0 - ((30.0 / 90.0) * gp->tangle)) * RADIANS;
-#if 0
- printf("Angle1: %f\tAngle2: %f\n", angle / RADIANS, angle2 / RADIANS);
-#endif
- t[0].x = t_centre_x + t_radius_x * cos(angle2);
- t[0].y = t_centre_y + t_radius_y * sin(angle2);
- t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
- t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
- t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
- t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
-
-#if 0
- printf("texcoords:[%f,%f][%f,%f][%f,%f]\n", t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y);
-#endif
-}
-#endif
-
-static int
-draw_hexagons(ModeInfo *mi, int translucency, texture *texture)
-{
- int polys = 0;
- int i;
- vector2f t[3];
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
-
- calculate_texture_coords(mi, texture, t);
-
- glColor4f(1.0, 1.0, 1.0, (float)translucency / MAX_FADE);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDepthMask(GL_FALSE);
- glBindTexture(GL_TEXTURE_2D, texture->id);
-
- if (gp->list == -1) {
- gp->list = glGenLists(1);
- }
-
- /* compile new list */
- glNewList(gp->list, GL_COMPILE);
- glBegin(GL_TRIANGLES);
-
- /*
- ** six triangles to each hexagon
- */
-
- glTexCoord2f(t[0].x, t[0].y);
- VERTEX0;
- glTexCoord2f(t[1].x, t[1].y);
- VERTEX1;
- glTexCoord2f(t[2].x, t[2].y);
- VERTEX6;
-
- glTexCoord2f(t[0].x, t[0].y);
- VERTEX0;
- glTexCoord2f(t[2].x, t[2].y);
- VERTEX6;
- glTexCoord2f(t[1].x, t[1].y);
- VERTEX5;
-
- glTexCoord2f(t[0].x, t[0].y);
- VERTEX0;
- glTexCoord2f(t[1].x, t[1].y);
- VERTEX5;
- glTexCoord2f(t[2].x, t[2].y);
- VERTEX4;
-
- glTexCoord2f(t[0].x, t[0].y);
- VERTEX0;
- glTexCoord2f(t[2].x, t[2].y);
- VERTEX4;
- glTexCoord2f(t[1].x, t[1].y);
- VERTEX3;
-
- glTexCoord2f(t[0].x, t[0].y);
- VERTEX0;
- glTexCoord2f(t[1].x, t[1].y);
- VERTEX3;
- glTexCoord2f(t[2].x, t[2].y);
- VERTEX2;
-
- glTexCoord2f(t[0].x, t[0].y);
- VERTEX0;
- glTexCoord2f(t[2].x, t[2].y);
- VERTEX2;
- glTexCoord2f(t[1].x, t[1].y);
- VERTEX1;
-
- glEnd();
- glEndList();
-
- /* call the list n times */
- for (i = 0 ; i < sizeof(hex) / sizeof(hex[0]) ; i++) {
-
- glPushMatrix();
-
- glTranslatef(hex[i].x, hex[i].y, 0.0);
- glCallList(gp->list);
- polys += 6;
-
- glPopMatrix();
- }
-
-#ifdef DISPLAY_TEXTURE
- glPushMatrix();
- /* acd debug - display (bigger, centred) texture */
- glScalef(2.0, 2.0, 2.0);
- glTranslatef(-0.5, -0.5, 0.0);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(0.0, 0.0, -0.1);
- glTexCoord2f(1.0, 0.0);
- glVertex3f(1.0, 0.0, -0.1);
- glTexCoord2f(1.0, 1.0);
- glVertex3f(1.0, 1.0, -0.1);
- glTexCoord2f(0.0, 1.0);
- glVertex3f(0.0, 1.0, -0.1);
- polys++;
- glEnd();
- /* acd debug - display texture triangle */
- glColor4f(1.0, 0.5, 1.0, 1.0);
- glBegin(GL_LINE_LOOP);
- glVertex3f(t[0].x, t[0].y, -0.11);
- glVertex3f(t[1].x, t[1].y, -0.11);
- glVertex3f(t[2].x, t[2].y, -0.11);
- polys++;
- glEnd();
- glPopMatrix();
-#endif
-
- glDisable(GL_TEXTURE_2D);
- glDepthMask(GL_TRUE);
- glDisable(GL_BLEND);
- return polys;
-}
-
-/*
- * main rendering loop
- */
-static void
-draw(ModeInfo * mi)
-{
- GLfloat x_angle, y_angle, z_angle;
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- vectorf v1;
-
- mi->polygon_count = 0;
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
-
- gp->tic += 0.005f;
-
- x_angle = gp->cam_x_phase + gp->tic * gp->cam_x_speed;
- y_angle = gp->cam_y_phase + gp->tic * gp->cam_y_speed;
- z_angle = gp->cam_z_phase + gp->tic * gp->cam_z_speed;
-
- if (move) {
- v1.x = 1 * sin(x_angle);
- v1.y = 1 * sin(y_angle);
- } else {
- v1.x = 0;
- v1.y = 0;
- }
-
- /* size is changed in pinit() to be distance from plane */
- gp->size = MI_SIZE(mi);
- if (gp->size > 10) {
- gp->size = 10;
- }
- if (gp->size <= 0) {
- gp->size = 0;
- }
- if (gp->size > 0) {
- /* user defined size */
- v1.z = gp->size;
- } else if (zoom) {
- /* max distance given by adding the constant and the multiplier */
- v1.z = 5.0 + 3.0 * sin(z_angle);
- } else {
- /* default */
- v1.z = 7.0;
- }
-
- /* update rotation angle (but not if mouse button down) */
- if (rotate && !gp->button_down_p)
- {
- float new_rangle_vel = 0.0;
-
- /* update camera rotation angle and velocity */
- gp->rangle += gp->rangle_vel;
- new_rangle_vel = gp->rangle_vel + gp->rangle_acc;
- if (new_rangle_vel > -MAX_ANGLE_VEL && new_rangle_vel < MAX_ANGLE_VEL)
- {
- /* new velocity is within limits */
- gp->rangle_vel = new_rangle_vel;
- }
-
- /* randomly change twisting speed - 3ff = 1024 */
- if ((random() % TWISTING_PROBABILITY) < 1.0) {
- gp->rangle_acc = INITIAL_ANGLE_ACC * frand(1.0);
- if (gp->rangle_vel > 0.0) {
- gp->rangle_acc = -gp->rangle_acc;
- }
- }
- }
-#if 0
- printf("Rangle: %f : %f : %f\n", gp->rangle, gp->rangle_vel, gp->rangle_acc);
- printf("Tangle: %f : %f : %f\n", gp->tangle, gp->tangle_vel, gp->tangle_acc);
-#endif
-
-#ifdef WOBBLE
- /* this makes the image wobble - requires -move and a larger grid */
- gluLookAt(0, 0, v1.z, v1.x, v1.y, 0.0, 0.0, 1.0, 0.0);
-#else
- /* no wobble - camera always perpendicular to grid */
-
- /* rotating camera rather than entire space - smoother */
- gluLookAt(
- v1.x, v1.y, v1.z,
- v1.x, v1.y, 0.0,
- sin((gp->xmouse * M_PI * 2) + gp->rangle * RADIANS),
- cos((gp->xmouse * M_PI * 2) + gp->rangle * RADIANS),
- 0.0);
-#endif
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- if (gp->fade == 0)
- {
- /* not fading */
- mi->polygon_count +=
- draw_hexagons(mi, MAX_FADE, &gp->textures[gp->visible]);
- }
- else
- {
- /* fading - show both textures with alpha
- NB first is always max alpha */
- mi->polygon_count +=
- draw_hexagons(mi, MAX_FADE, &gp->textures[1 - gp->visible]);
- mi->polygon_count +=
- draw_hexagons(mi, MAX_FADE - gp->fade, &gp->textures[gp->visible]);
-
- /* fade some more */
- gp->fade++;
-
- /* have we faded enough? */
- if (gp->fade > MAX_FADE)
- {
- /* stop fading */
- gp->fade = 0;
- gp->visible = 1 - gp->visible;
- }
- }
-
- /* increment texture angle based on time, velocity etc */
- /* but only if button is not down */
- if (!gp->button_down_p)
- {
- float new_tangle_vel = 0.0;
-
- gp->tangle += gp->tangle_vel;
-
- /* work out new texture angle velocity */
- new_tangle_vel = gp->tangle_vel + gp->tangle_acc;
- if (new_tangle_vel > -MAX_ANGLE_VEL && new_tangle_vel < MAX_ANGLE_VEL)
- {
- /* new velocity is inside limits */
- gp->tangle_vel = new_tangle_vel;
- }
-
- /* randomly change twisting speed - 3ff = 1024 */
- if ((random() % TWISTING_PROBABILITY) < 1.0) {
- gp->tangle_acc = INITIAL_ANGLE_ACC * frand(1.0);
- if (gp->tangle_vel > 0.0) {
- gp->tangle_acc = -gp->tangle_acc;
- }
- }
- }
-
- glFlush();
-}
-
-/*
- * new window size or exposure
- */
-ENTRYPOINT void reshape_gleidescope(ModeInfo *mi, int width, int height)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
-
- glViewport(0, y, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(50.0, 1/h, 0.1, 2000.0);
- glMatrixMode (GL_MODELVIEW);
- glLineWidth(1);
- glPointSize(1);
-}
-
-static void
-pinit(ModeInfo * mi)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
-
- /* set start time - star_time = 0 implies non-dynamic texture */
- gp->start_time = (time_t)0;
-
- /* set the texture size to default */
- /*
- gp->max_tx = 1.0;
- gp->max_ty = 1.0;
- */
-
- /* no fading */
- gp->fade = 0;
-
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
-
- /* space for textures */
- glGenTextures(1, &gp->textures[0].id);
- glGenTextures(1, &gp->textures[1].id);
- gp->visible = 0;
-
- setup_texture(mi, &gp->textures[gp->visible]);
-
- /*
- ** want to choose a value for arg randomly if neither -arg nor -no-arg
- ** is specified. xscreensaver libraries don't seem to let you do this -
- ** if something isn't true then it is false (pesky two-state boolean values).
- ** so, i've defined both -arg and -no-arg to arguments and added the
- ** following logic.
- ** (btw if both -arg and -no-arg are defined then arg is set to False)
- */
- if (zoom == False && nozoom == False)
- {
- /* no zoom preference - randomise */
- zoom = (((random() & 0x1) == 0x1) ? True : False);
- }
- else if (nozoom == True)
- {
- /* definately no zoom */
- zoom = False;
- }
-
- if (move == False && nomove == False)
- {
- /* no move preference - randomise */
- move = (((random() & 0x1) == 0x1) ? True : False);
- }
- else if (nomove == True)
- {
- /* definately no move */
- move = False;
- }
-
- if (rotate == False && norotate == False)
- {
- /* no rotate preference - randomise */
- rotate = (((random() & 0x1) == 0x1) ? True : False);
- }
- else if (norotate == True)
- {
- /* definately no rotate */
- rotate = False;
- }
-
- /* define cam variables */
- gp->cam_x_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
- gp->cam_x_phase = random() % 360;
- gp->cam_y_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
- gp->cam_y_phase = random() % 360;
- gp->cam_z_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
- gp->cam_z_phase = random() % 360;
-
- /* initial angular speeds */
- gp->rangle_vel = INITIAL_ANGLE_VEL * frandrange(-.5, 0.5);
- gp->tangle_vel = INITIAL_ANGLE_VEL * frandrange(-.5, 0.5);
- gp->rangle_acc = INITIAL_ANGLE_ACC * frandrange(-.5, 0.5);
- gp->tangle_acc = INITIAL_ANGLE_ACC * frandrange(-.5, 0.5);
-
- /* jwz */
-#if 0
- {
- GLfloat speed = 15;
- gp->rangle_vel *= speed;
- gp->tangle_vel *= speed;
- gp->rangle_acc *= speed;
- gp->tangle_acc *= speed;
- }
-#endif
-
- /* distance is 11 - size */
- if (gp->size != -1) {
- if (zoom) {
- fprintf(stderr, "-size given. ignoring -zoom.\n");
- zoom = False;
- }
- if (gp->size < 1) {
- gp->size = 1;
- } else if (gp->size >= 10) {
- gp->size = 10;
- }
- gp->size = 11 - gp->size;
- }
-
-#ifdef DEBUG
-printf("phases [%d, %d, %d]\n", gp->cam_x_phase, gp->cam_y_phase, gp->cam_z_phase);
-#endif
-}
-
-ENTRYPOINT void
-init_gleidescope(ModeInfo * mi)
-{
- gleidestruct *gp;
- int screen = MI_SCREEN(mi);
-
- MI_INIT(mi, gleidescope);
- gp = &gleidescope[screen];
- gp->window = MI_WINDOW(mi);
- gp->size = -1;
- gp->list = -1;
-
- if ((gp->glx_context = init_GL(mi)) != NULL) {
-
- reshape_gleidescope(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
-
- glDrawBuffer(GL_BACK);
-
- /* do initialisation */
- pinit(mi);
-
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-ENTRYPOINT void
-draw_gleidescope(ModeInfo * mi)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
-
- if (!gp->glx_context)
- return;
-
- /* Just keep running before the texture has come in. */
- /* if (gp->waiting_for_image_p) return; */
-
- glDrawBuffer(GL_BACK);
-
- glXMakeCurrent(display, window, *gp->glx_context);
- draw(mi);
-
- if (mi->fps_p) {
- do_fps (mi);
- }
-
- glFinish();
- glXSwapBuffers(display, window);
-
-#ifdef GRAB
- if (grab) {
- grab_frame(display, window);
- }
-#endif
-
- /* need to change texture? */
- if ((gp->start_time != 0) && (duration != -1) && gp->fade == 0) {
- if (gp->start_time + duration <= time((time_t *)0)) {
-#ifdef DEBUG
- printf("Start Time: %lu - Current Time: %lu\n", (unsigned long)gp->start_time, (unsigned long)time((time_t *)0));
- printf("Changing Texture\n");
-#endif
- /* get new snapshot (into back buffer) and start fade count */
- setup_texture(mi, &gp->textures[1 - gp->visible]);
- /* restart fading */
- gp->fade = 1;
- }
- }
-}
-
-ENTRYPOINT void
-free_gleidescope(ModeInfo * mi)
-{
- gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
- if (!gp->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *gp->glx_context);
- if (glIsList(gp->list)) glDeleteLists(gp->list, 1);
- if (gp->textures[0].id) glDeleteTextures (1, &gp->textures[0].id);
- if (gp->textures[1].id) glDeleteTextures (1, &gp->textures[1].id);
-}
-
-XSCREENSAVER_MODULE ("Gleidescope", gleidescope)
-
-#endif
diff --git a/hacks/glx/gleidescope.man b/hacks/glx/gleidescope.man
deleted file mode 100644
index 726e38f..0000000
--- a/hacks/glx/gleidescope.man
+++ /dev/null
@@ -1,77 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-gleidescope \- a tiled OpenGL kaleidescope
-.SH SYNOPSIS
-.B gleidescope
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[-delay \fInumber\fP]
-[-move]
-[-rotate]
-[-zoom]
-[-image \fIfile\fP]
-[-fps]
-[-size \fInumber\fP]
-[-duration \fInumber\fP]
-.SH DESCRIPTION
-A tiled kaleidescope using OpenGL.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-move
-Move the camera.
-.TP 8
-.B \-rotate
-Rotate the camera.
-.TP 8
-.B \-zoom
-Zoom the camera in and out.
-.TP 8
-.B \-image \fIfile\fP
-The texture map to use at the end of the kaleidescope.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-size \fInumber\fP
-The size of the hexagons being displayed [1(small)-10(large)]
-.TP 8
-.B \-duration \fInumber\fP
-The time in seconds before another image is chosen.
-.TP 8
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Andrew Dean Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Andrew Dean.
diff --git a/hacks/glx/glforestfire.c b/hacks/glx/glforestfire.c
deleted file mode 100644
index 304324a..0000000
--- a/hacks/glx/glforestfire.c
+++ /dev/null
@@ -1,1088 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* fire --- 3D fire or rain landscape */
-
-#if 0
-static const char sccsid[] = "@(#)fire.c 5.02 2001/09/26 xlockmore";
-#endif
-
-/* Copyright (c) E. Lassauge, 2001. */
-
-/*
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * The original code for this mode was written by David Bucciarelli
- * (tech.hmw@plus.it) and could be found in the demo package
- * of Mesa (Mesa-3.2/3Dfx/demos/). This mode is the result of the merge of
- * two of the David's demos (fire and rain).
- *
- * Eric Lassauge (October-10-2000) <lassauge@users.sourceforge.net>
- * http://lassauge.free.fr/linux.html
- *
- * REVISION HISTORY:
- *
- * E.Lassauge - 26-Sep-2001:
- * - add wander option and code
- * - cleanups for xscreensaver
- *
- * E.Lassauge - 09-Mar-2001:
- * - get rid of my framerate options to use showfps
- *
- * E.Lassauge - 12-Jan-2001:
- * - add rain particules, selected if count=0 (no fire means rain !)
- *
- * E.Lassauge - 28-Nov-2000:
- * - modified release part to add freeing of GL objects
- *
- * E.Lassauge - 14-Nov-2000:
- * - use new common xpm_to_ximage function
- *
- * E.Lassauge - 25-Oct-2000:
- * - add the trees (with a new resource '-trees')
- * - corrected handling of color (textured vs untextured)
- * - corrected handling of endiannes for the xpm files
- * - inverted ground pixmap file
- * - use malloc-ed tree array
- *
- * TSchmidt - 23-Oct-2000:
- * - added size option like used in sproingies mode
- *
- * E.Lassauge - 13-Oct-2000:
- * - when trackmouse and window is iconified (login screen): stop tracking
- * - add pure GLX handling of framerate display (erased GLUT stuff)
- * - made count a per screen variable and update it only if framemode
- * - changes for no_texture an wireframe modes
- * - change no_texture color for the ground
- * - add freeing of texture image
- * - misc comments and little tweakings
- *
- * TODO:
- * - perhaps use a user supplied xpm for ground image (or a whatever image
- * file using ImageMagick ?)
- * - random number of trees ? change trees at change_fire ?
- * - fix wireframe mode: it's too CPU intensive.
- * - look how we can get the Wheel events (Button4&5).
- */
-
-
-#ifdef STANDALONE /* xscreensaver mode */
-#define DEFAULTS "*delay: 10000 \n" \
- "*count: 800 \n" \
- "*size: 0 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-#define MODE_fire
-#include "xlockmore.h" /* from the xscreensaver distribution */
-#include "gltrackball.h"
-#else /* !STANDALONE */
-#include "xlock.h" /* from the xlockmore distribution */
-#include "visgl.h"
-#endif /* !STANDALONE */
-
-#ifdef MODE_fire
-
-#define MINSIZE 32
-
-#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined(STANDALONE)
-/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
-#include "ximage-loader.h"
-#define I_HAVE_XPM
-
-#include "images/gen/ground_png.h"
-#include "images/gen/tree_png.h"
-#endif /* HAVE_XPM */
-
-/* vector utility macros */
-#define vinit(a,i,j,k) {\
- (a)[0]=i;\
- (a)[1]=j;\
- (a)[2]=k;\
-}
-
-#define vinit4(a,i,j,k,w) {\
- (a)[0]=i;\
- (a)[1]=j;\
- (a)[2]=k;\
- (a)[3]=w;\
-}
-
-#define vadds(a,dt,b) {\
- (a)[0]+=(dt)*(b)[0];\
- (a)[1]+=(dt)*(b)[1];\
- (a)[2]+=(dt)*(b)[2];\
-}
-
-#define vequ(a,b) {\
- (a)[0]=(b)[0];\
- (a)[1]=(b)[1];\
- (a)[2]=(b)[2];\
-}
-
-#define vinter(a,dt,b,c) {\
- (a)[0]=(dt)*(b)[0]+(1.0-dt)*(c)[0];\
- (a)[1]=(dt)*(b)[1]+(1.0-dt)*(c)[1];\
- (a)[2]=(dt)*(b)[2]+(1.0-dt)*(c)[2];\
-}
-
-#define clamp(a) ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
-
-#define vclamp(v) {\
- (v)[0]=clamp((v)[0]);\
- (v)[1]=clamp((v)[1]);\
- (v)[2]=clamp((v)[2]);\
-}
-
-/* Manage option vars */
-#define DEF_TEXTURE "True"
-#define DEF_FOG "False"
-#define DEF_SHADOWS "True"
-#define DEF_FRAMERATE "False"
-#define DEF_WANDER "True"
-#define DEF_TREES "5"
-#define MAX_TREES 20
-static Bool do_texture;
-static Bool do_fog;
-static Bool do_shadows;
-static Bool do_wander;
-static int num_trees;
-
-static XrmOptionDescRec opts[] = {
- {"-texture", ".fire.texture", XrmoptionNoArg, "on"},
- {"+texture", ".fire.texture", XrmoptionNoArg, "off"},
- {"-fog", ".fire.fog", XrmoptionNoArg, "on"},
- {"+fog", ".fire.fog", XrmoptionNoArg, "off"},
- {"-shadows", ".fire.shadows", XrmoptionNoArg, "on"},
- {"+shadows", ".fire.shadows", XrmoptionNoArg, "off"},
- {"-wander", ".fire.wander", XrmoptionNoArg, "on"},
- {"+wander", ".fire.wander", XrmoptionNoArg, "off"},
- {"-trees", ".fire.trees", XrmoptionSepArg, 0},
- {"-rain", ".fire.count", XrmoptionNoArg, "0"},
-
-};
-
-static argtype vars[] = {
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
- {&do_shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&num_trees, "trees", "Trees", DEF_TREES, t_Int},
-};
-
-static OptionStruct desc[] = {
- {"-/+texture", "turn on/off texturing"},
- {"-/+fog", "turn on/off fog"},
- {"-/+shadows", "turn on/off shadows"},
- {"-/+wander", "turn on/off wandering"},
- {"-trees num", "number of trees (0 disables)"},
-};
-
-ENTRYPOINT ModeSpecOpt fire_opts =
- { sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc };
-
-#ifdef USE_MODULES
-ModStruct fire_description =
- { "fire", "init_fire", "draw_fire", "release_fire",
- "draw_fire", "change_fire", (char *) NULL, &fire_opts,
- 10000, 800, 1, 400, 64, 1.0, "",
- "Shows a 3D fire-like image", 0, NULL
-};
-#endif /* USE_MODULES */
-
-/* misc defines */
-#define TREEINR 2.5 /* tree min distance */
-#define TREEOUTR 8.0 /* tree max distance */
-#define FRAME 50 /* frame count interval */
-#define DIMP 20.0 /* dimension of ground */
-#define DIMTP 16.0 /* dimension of ground texture */
-
-#define RIDCOL 0.4 /* factor for color blending */
-
-#define AGRAV -9.8 /* gravity */
-
-#define NUMPART 7500 /* rain particles */
-
-/* fire particle struct */
-typedef struct {
- int age;
- float p[3][3];
- float v[3];
- float c[3][4];
-} part;
-
-/* rain particle struct */
-typedef struct {
- float age;
- float acc[3];
- float vel[3];
- float pos[3];
- float partLength;
- float oldpos[3];
-} rain;
-
-/* colors */
-static const GLfloat black[3] = { 0.0, 0.0, 0.0 }; /* shadow color */
-static const GLfloat partcol1[3] = { 1.0, 0.2, 0.0 }; /* initial color: red-ish */
-static const GLfloat partcol2[3] = { 1.0, 1.0, 0.0 }; /* blending color: yellow-ish */
-static const GLfloat fogcolor[4] = { 0.9, 0.9, 1.0, 1.0 };
-
-/* ground */
-static const float q[4][3] = {
- {-DIMP, 0.0, -DIMP},
- {DIMP, 0.0, -DIMP},
- {DIMP, 0.0, DIMP},
- {-DIMP, 0.0, DIMP}
-};
-
-/* ground texture */
-static const float qt[4][2] = {
- {-DIMTP, -DIMTP},
- {DIMTP, -DIMTP},
- {DIMTP, DIMTP},
- {-DIMTP, DIMTP}
-};
-
-/* default values for observer */
-static const float DEF_OBS[3] = { 2.0f, 1.0f, 0.0f };
-#define DEV_V 0.0
-#define DEF_ALPHA -90.0
-#define DEF_BETA 90.0
-
-/* tree struct */
-typedef struct {
- float x,y,z;
-} treestruct;
-
-/* the mode struct, contains all per screen variables */
-typedef struct {
- GLint WIDTH, HEIGHT; /* display dimensions */
- GLXContext *glx_context;
-
- int np; /* number of fire particles : set it through 'count' resource */
- float eject_r; /* emission radius */
- float dt, maxage, eject_vy, eject_vl;
- float ridtri; /* fire particle size */
- Bool shadows; /* misc booleans: set them through specific resources */
- Bool fog;
-
- part *p; /* fire particles array */
- rain *r; /* rain particles array */
-
- XImage *gtexture; /* ground texture image bits */
- XImage *ttexture; /* tree texture image bits */
- GLuint groundid; /* ground texture id: GL world */
- GLuint treeid; /* tree texture id: GL world */
-
- int num_trees; /* number of trees: set it through 'trees' resource */
- treestruct *treepos; /* trees positions: float treepos[num_trees][3] */
-
- float min[3]; /* raining area */
- float max[3];
-
- float obs[3]; /* observer coordinates */
- float dir[3]; /* view direction */
- float v; /* observer velocity */
- float alpha; /* observer angles */
- float beta;
-
- trackball_state *trackball;
- Bool button_down_p;
- int frame;
-
-} firestruct;
-
-/* array of firestruct indexed by screen number */
-static firestruct *fire = (firestruct *) NULL;
-
-/*
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- * Misc funcs.
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- */
-
-/* utility function for the rain particles */
-static float gettimerain(void)
-{
-#if 0
- /* Oh yeah, *that's* portable! WTF. */
- /*
- * I really thought clock() was standard ... EL
- * I found this on the net:
- * The clock() function conforms to ISO/IEC 9899:1990 (``ISO C89'')
- * */
-
- static clock_t told= (clock_t)0;
- clock_t tnew,ris;
-
- tnew=clock();
-
- ris=tnew-told;
-
- told=tnew;
-
- return (0.0125 + ris/(float)CLOCKS_PER_SEC);
-#else
- return 0.0150;
-#endif
-}
-
-/* my RAND */
-static float vrnd(void)
-{
- return ((float) LRAND() / (float) MAXRAND);
-}
-
-/* initialise new fire particle */
-static void setnewpart(firestruct * fs, part * p)
-{
- float a, vi[3];
- const float *c;
-
- p->age = 0;
-
- a = vrnd() * M_PI * 2.0;
-
- vinit(vi, sin(a) * fs->eject_r * vrnd(), 0.15, cos(a) * fs->eject_r * vrnd());
- vinit(p->p[0], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
- vinit(p->p[1], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
- vinit(p->p[2], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
-
- vinit(p->v, vi[0] * fs->eject_vl / (fs->eject_r / 2),
- vrnd() * fs->eject_vy + fs->eject_vy / 2,
- vi[2] * fs->eject_vl / (fs->eject_r / 2));
-
- c = partcol1;
-
- vinit4(p->c[0], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
- vinit4(p->c[1], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
- vinit4(p->c[2], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
-}
-
-/* initialise new rain particle */
-static void setnewrain(firestruct * fs, rain * r)
-{
- r->age=0.0f;
-
- vinit(r->acc,0.0f,-0.98f,0.0f);
- vinit(r->vel,0.0f,0.0f,0.0f);
-
- r->partLength=0.2f;
-
- vinit(r->oldpos,fs->min[0]+(fs->max[0]-fs->min[0])*vrnd(),
- fs->max[1]+0.2f*fs->max[1]*vrnd(),
- fs->min[2]+(fs->max[2]-fs->min[2])*vrnd());
- vequ(r->pos,r->oldpos);
- vadds(r->oldpos,-(r->partLength),r->vel);
-
- r->pos[1]=(fs->max[1]-fs->min[1])*vrnd()+fs->min[1];
- r->oldpos[1]=r->pos[1]-r->partLength*r->vel[1];
-}
-
-/* set fire particle values */
-static void setpart(firestruct * fs, part * p)
-{
- float fact;
-
- if (p->p[0][1] < 0.1) {
- setnewpart(fs, p);
- return;
- }
-
- p->v[1] += AGRAV * fs->dt;
-
- vadds(p->p[0], fs->dt, p->v);
- vadds(p->p[1], fs->dt, p->v);
- vadds(p->p[2], fs->dt, p->v);
-
- p->age++;
-
- if ((p->age) > fs->maxage) {
- vequ(p->c[0], partcol2);
- vequ(p->c[1], partcol2);
- vequ(p->c[2], partcol2);
- } else {
- fact = 1.0 / fs->maxage;
- vadds(p->c[0], fact, partcol2);
- vclamp(p->c[0]);
- p->c[0][3] = fact * (fs->maxage - p->age);
-
- vadds(p->c[1], fact, partcol2);
- vclamp(p->c[1]);
- p->c[1][3] = fact * (fs->maxage - p->age);
-
- vadds(p->c[2], fact, partcol2);
- vclamp(p->c[2]);
- p->c[2][3] = fact * (fs->maxage - p->age);
- }
-}
-
-/* set rain particle values */
-static void setpartrain(firestruct * fs, rain * r, float dt)
-{
- r->age += dt;
-
- vadds(r->vel,dt,r->acc);
- vadds(r->pos,dt,r->vel);
-
- if(r->pos[0]<fs->min[0])
- r->pos[0]=fs->max[0]-(fs->min[0]-r->pos[0]);
- if(r->pos[2]<fs->min[2])
- r->pos[2]=fs->max[2]-(fs->min[2]-r->pos[2]);
-
- if(r->pos[0]>fs->max[0])
- r->pos[0]=fs->min[0]+(r->pos[0]-fs->max[0]);
- if(r->pos[2]>fs->max[2])
- r->pos[2]=fs->min[2]+(r->pos[2]-fs->max[2]);
-
- vequ(r->oldpos,r->pos);
- vadds(r->oldpos,-(r->partLength),r->vel);
- if(r->pos[1]<fs->min[1])
- setnewrain(fs, r);
-}
-
-/* draw a tree */
-static int drawtree(float x, float y, float z)
-{
- int polys = 0;
- glBegin(GL_QUADS);
- glTexCoord2f(0.0,0.0);
- glVertex3f(x-1.5,y+0.0,z);
-
- glTexCoord2f(1.0,0.0);
- glVertex3f(x+1.5,y+0.0,z);
-
- glTexCoord2f(1.0,1.0);
- glVertex3f(x+1.5,y+3.0,z);
-
- glTexCoord2f(0.0,1.0);
- glVertex3f(x-1.5,y+3.0,z);
- polys++;
-
-
- glTexCoord2f(0.0,0.0);
- glVertex3f(x,y+0.0,z-1.5);
-
- glTexCoord2f(1.0,0.0);
- glVertex3f(x,y+0.0,z+1.5);
-
- glTexCoord2f(1.0,1.0);
- glVertex3f(x,y+3.0,z+1.5);
-
- glTexCoord2f(0.0,1.0);
- glVertex3f(x,y+3.0,z-1.5);
- polys++;
-
- glEnd();
-
- return polys;
-}
-
-/* calculate observer position : modified only if trackmouse is used */
-static void calcposobs(firestruct * fs)
-{
- fs->dir[0] = sin(fs->alpha * M_PI / 180.0);
- fs->dir[2] =
- cos(fs->alpha * M_PI / 180.0) * sin(fs->beta * M_PI / 180.0);
- fs->dir[1] = cos(fs->beta * M_PI / 180.0);
-
- fs->obs[0] += fs->v * fs->dir[0];
- fs->obs[1] += fs->v * fs->dir[1];
- fs->obs[2] += fs->v * fs->dir[2];
-
- if (!fs->np)
- {
- vinit(fs->min,fs->obs[0]-7.0f,-0.2f,fs->obs[2]-7.0f);
- vinit(fs->max,fs->obs[0]+7.0f,8.0f,fs->obs[2]+7.0f);
- }
-}
-
-
-/* initialise textures */
-static void inittextures(ModeInfo * mi)
-{
- firestruct *fs = &fire[MI_SCREEN(mi)];
-
-#if defined( I_HAVE_XPM )
- if (do_texture) {
-
- glGenTextures(1, &fs->groundid);
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture(GL_TEXTURE_2D, fs->groundid);
-#endif /* HAVE_GLBINDTEXTURE */
-
- if ((fs->gtexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
- ground_png,
- sizeof(ground_png)))
- == None) {
- (void) fprintf(stderr, "Error reading the ground texture.\n");
- glDeleteTextures(1, &fs->groundid);
- do_texture = False;
- fs->groundid = 0;
- fs->treeid = 0;
- return;
- }
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- clear_gl_error();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- fs->gtexture->width, fs->gtexture->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, fs->gtexture->data);
- check_gl_error("texture");
-
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
-
- if (fs->num_trees)
- {
- glGenTextures(1, &fs->treeid);
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture(GL_TEXTURE_2D,fs->treeid);
-#endif /* HAVE_GLBINDTEXTURE */
- if ((fs->ttexture = image_data_to_ximage(MI_DISPLAY(mi),
- MI_VISUAL(mi),
- tree_png,
- sizeof(tree_png)))
- == None) {
- (void)fprintf(stderr,"Error reading tree texture.\n");
- glDeleteTextures(1, &fs->treeid);
- fs->treeid = 0;
- fs->num_trees = 0;
- return;
- }
-
- clear_gl_error();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- fs->ttexture->width, fs->ttexture->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, fs->ttexture->data);
- check_gl_error("texture");
-
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
-
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
-
- glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
- }
- }
- else
- {
- fs->groundid = 0; /* default textures */
- fs->treeid = 0;
- }
-#else /* !I_HAVE_XPM */
- do_texture = False;
- fs->groundid = 0; /* default textures */
- fs->treeid = 0;
-#endif /* !I_HAVE_XPM */
-}
-
-/* init tree array and positions */
-static Bool inittree(ModeInfo * mi)
-{
- firestruct *fs = &fire[MI_SCREEN(mi)];
- int i;
- float dist;
-
- /* allocate treepos array */
- if ((fs->treepos = (treestruct *) malloc(fs->num_trees *
- sizeof(treestruct))) == NULL) {
- return False;
- }
- /* initialise positions */
- for(i=0;i<fs->num_trees;i++) {
- do {
- fs->treepos[i].x =vrnd()*TREEOUTR*2.0-TREEOUTR;
- fs->treepos[i].y =0.0;
- fs->treepos[i].z =vrnd()*TREEOUTR*2.0-TREEOUTR;
- dist = sqrt(fs->treepos[i].x * fs->treepos[i].x +
- fs->treepos[i].z * fs->treepos[i].z);
- } while((dist<TREEINR) || (dist>TREEOUTR));
- }
- return True;
-}
-
-/*
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- * GL funcs.
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void reshape_fire(ModeInfo * mi, int width, int height)
-{
-
- firestruct *fs = &fire[MI_SCREEN(mi)];
- int size = MI_SIZE(mi);
-
- /* Viewport is specified size if size >= MINSIZE && size < screensize */
- if (size <= 1) {
- fs->WIDTH = MI_WIDTH(mi);
- fs->HEIGHT = MI_HEIGHT(mi);
- } else if (size < MINSIZE) {
- fs->WIDTH = MINSIZE;
- fs->HEIGHT = MINSIZE;
- } else {
- fs->WIDTH = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size;
- fs->HEIGHT = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size;
- }
- glViewport((MI_WIDTH(mi) - fs->WIDTH) / 2, (MI_HEIGHT(mi) - fs->HEIGHT) / 2, fs->WIDTH, fs->HEIGHT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(70.0, fs->WIDTH / (float) fs->HEIGHT, 0.1, 30.0);
-
- glMatrixMode(GL_MODELVIEW);
-
-}
-
-static void DrawFire(ModeInfo * mi)
-{
- int j;
- firestruct *fs = &fire[MI_SCREEN(mi)];
- Bool wire = MI_IS_WIREFRAME(mi);
-
- mi->polygon_count = 0;
-
- if (do_wander && !fs->button_down_p)
- {
- GLfloat x, y, z;
-
-# define SINOID(SCALE,SIZE) \
- ((((1 + sin((fs->frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
- x = SINOID(0.031, 0.85);
- y = SINOID(0.017, 0.25);
- z = SINOID(0.023, 0.85);
- fs->frame++;
- fs->obs[0] = x + DEF_OBS[0];
- fs->obs[1] = y + DEF_OBS[1];
- fs->obs[2] = z + DEF_OBS[2];
- fs->dir[1] = y;
- fs->dir[2] = z;
- }
-
- glEnable(GL_DEPTH_TEST);
-
- if (fs->fog)
- glEnable(GL_FOG);
- else
- glDisable(GL_FOG);
-
- glDepthMask(GL_TRUE);
- glClearColor(0.5, 0.5, 0.8, 1.0); /* sky in the distance */
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
- calcposobs(fs);
-
- gltrackball_rotate (fs->trackball);
-
- gluLookAt(fs->obs[0], fs->obs[1], fs->obs[2],
- fs->obs[0] + fs->dir[0],
- fs->obs[1] + fs->dir[1],
- fs->obs[2] + fs->dir[2],
- 0.0, 1.0, 0.0);
-
- glEnable(GL_TEXTURE_2D);
-
- /* draw ground using the computed texture */
- if (do_texture) {
- glColor4f(1.0,1.0,1.0,1.0); /* white to get texture in it's true color */
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture(GL_TEXTURE_2D, fs->groundid);
-#endif /* HAVE_GLBINDTEXTURE */
- }
- else
- glColor4f(0.54, 0.27, 0.07, 1.0); /* untextured ground color */
- glBegin(GL_QUADS);
- glTexCoord2fv(qt[0]);
- glVertex3fv(q[0]);
- glTexCoord2fv(qt[1]);
- glVertex3fv(q[1]);
- glTexCoord2fv(qt[2]);
- glVertex3fv(q[2]);
- glTexCoord2fv(qt[3]);
- glVertex3fv(q[3]);
- mi->polygon_count++;
- glEnd();
-
- glAlphaFunc(GL_GEQUAL, 0.9);
- if (fs->num_trees)
- {
- /* here do_texture IS True - and color used is white */
- glEnable(GL_ALPHA_TEST);
-#ifdef HAVE_GLBINDTEXTURE
- glBindTexture(GL_TEXTURE_2D,fs->treeid);
-#endif /* HAVE_GLBINDTEXTURE */
- for(j=0;j<fs->num_trees;j++)
- mi->polygon_count += drawtree(fs->treepos[j].x ,fs->treepos[j].y ,fs->treepos[j].z );
- glDisable(GL_ALPHA_TEST);
- }
- glDisable(GL_TEXTURE_2D);
- glDepthMask(GL_FALSE);
-
- if (fs->shadows) {
- /* draw shadows with black color */
- glBegin(wire ? GL_LINE_STRIP : GL_TRIANGLES);
- for (j = 0; j < fs->np; j++) {
- glColor4f(black[0], black[1], black[2], fs->p[j].c[0][3]);
- glVertex3f(fs->p[j].p[0][0], 0.1, fs->p[j].p[0][2]);
-
- glColor4f(black[0], black[1], black[2], fs->p[j].c[1][3]);
- glVertex3f(fs->p[j].p[1][0], 0.1, fs->p[j].p[1][2]);
-
- glColor4f(black[0], black[1], black[2], fs->p[j].c[2][3]);
- glVertex3f(fs->p[j].p[2][0], 0.1, fs->p[j].p[2][2]);
- mi->polygon_count++;
- }
- glEnd();
- }
-
- glBegin(wire ? GL_LINE_STRIP : GL_TRIANGLES);
- for (j = 0; j < fs->np; j++) {
- /* draw particles: colors are computed in setpart */
- glColor4fv(fs->p[j].c[0]);
- glVertex3fv(fs->p[j].p[0]);
-
- glColor4fv(fs->p[j].c[1]);
- glVertex3fv(fs->p[j].p[1]);
-
- glColor4fv(fs->p[j].c[2]);
- glVertex3fv(fs->p[j].p[2]);
- mi->polygon_count++;
-
- setpart(fs, &fs->p[j]);
- }
- glEnd();
-
- /* draw rain particles if no fire particles */
- if (!fs->np)
- {
- float timeused = gettimerain();
- glDisable(GL_TEXTURE_2D);
- glShadeModel(GL_SMOOTH);
- glBegin(GL_LINES);
- for (j = 0; j < NUMPART; j++) {
- glColor4f(0.7f,0.95f,1.0f,0.0f);
- glVertex3fv(fs->r[j].oldpos);
- glColor4f(0.3f,0.7f,1.0f,1.0f);
- glVertex3fv(fs->r[j].pos);
- setpartrain(fs, &fs->r[j],timeused);
- mi->polygon_count++;
- }
- glEnd();
- glShadeModel(GL_FLAT);
- }
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_ALPHA_TEST);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_FOG);
-
- /* manage framerate display */
- if (MI_IS_FPS(mi)) do_fps (mi);
- glPopMatrix();
-}
-
-
-static Bool Init(ModeInfo * mi)
-{
- int i;
- firestruct *fs = &fire[MI_SCREEN(mi)];
-
- /* default settings */
- fs->eject_r = 0.1 + NRAND(10) * 0.03;
- fs->dt = 0.015;
- fs->eject_vy = 4;
- fs->eject_vl = 1;
- fs->ridtri = 0.1 + NRAND(10) * 0.005;
- fs->maxage = 1.0 / fs->dt;
- vinit(fs->obs, DEF_OBS[0], DEF_OBS[1], DEF_OBS[2]);
- fs->v = 0.0;
- fs->alpha = DEF_ALPHA;
- fs->beta = DEF_BETA;
-
- /* initialise texture stuff */
- if (do_texture)
- inittextures(mi);
- else
- {
- fs->ttexture = (XImage*) NULL;
- fs->gtexture = (XImage*) NULL;
- }
-
- if (MI_IS_DEBUG(mi)) {
- (void) fprintf(stderr,
- "%s:\n\tnum_part=%d\n\ttrees=%d\n\tfog=%s\n\tshadows=%s\n\teject_r=%.3f\n\tridtri=%.3f\n",
- MI_NAME(mi),
- fs->np,
- fs->num_trees,
- fs->fog ? "on" : "off",
- fs->shadows ? "on" : "off",
- fs->eject_r, fs->ridtri);
- }
-
- /* initialise particles and trees */
- for (i = 0; i < fs->np; i++) {
- setnewpart(fs, &(fs->p[i]));
- }
-
- if (fs->num_trees)
- if (!inittree(mi)) {
- return False;
- }
-
- /* if no fire particles then initialise rain particles */
- if (!fs->np)
- {
- vinit(fs->min,-7.0f,-0.2f,-7.0f);
- vinit(fs->max,7.0f,8.0f,7.0f);
- for (i = 0; i < NUMPART; i++) {
- setnewrain(fs, &(fs->r[i]));
- }
- }
-
- return True;
-}
-
-/*
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- * Xlock hooks.
- *-----------------------------------------------------------------------------
- *-----------------------------------------------------------------------------
- */
-
-
-ENTRYPOINT void
-free_fire(ModeInfo * mi)
-{
- firestruct *fs = &fire[MI_SCREEN(mi)];
-
- if (!fs->glx_context) return;
- glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *fs->glx_context);
-
- if (fs->p != NULL) {
- free(fs->p);
- fs->p = (part *) NULL;
- }
- if (fs->r != NULL) {
- free(fs->r);
- fs->r = (rain *) NULL;
- }
- if (fs->treepos != NULL) {
- free(fs->treepos);
- fs->treepos = (treestruct *) NULL;
- }
- if (fs->ttexture != None) {
- glDeleteTextures(1, &fs->treeid);
- XDestroyImage(fs->ttexture);
- fs->ttexture = None;
- }
- if (fs->gtexture != None) {
- glDeleteTextures(1, &fs->groundid);
- XDestroyImage(fs->gtexture);
- fs->gtexture = None;
- }
-
- if (fs->trackball) gltrackball_free (fs->trackball);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * Initialize fire. Called each time the window changes.
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void
-init_fire(ModeInfo * mi)
-{
- firestruct *fs;
-
- MI_INIT (mi, fire);
- fs = &fire[MI_SCREEN(mi)];
- fs->np = MI_COUNT(mi);
- fs->fog = do_fog;
- fs->shadows = do_shadows;
- /* initialise fire particles if any */
- if ((fs->np)&&(fs->p == NULL)) {
- if ((fs->p = (part *) calloc(fs->np, sizeof(part))) == NULL) {
- free_fire(mi);
- return;
- }
- }
- else if (fs->r == NULL) {
- /* initialise rain particles if no fire particles */
- if ((fs->r = (rain *) calloc(NUMPART, sizeof(part))) == NULL) {
- free_fire(mi);
- return;
- }
- }
-
- /* check tree number */
- if (do_texture)
- fs->num_trees = (num_trees<MAX_TREES)?num_trees:MAX_TREES;
- else
- fs->num_trees = 0;
-
- fs->trackball = gltrackball_init (False);
-
- /* xlock GL stuff */
- if ((fs->glx_context = init_GL(mi)) != NULL) {
-
-#ifndef STANDALONE
- Reshape(mi); /* xlock mode */
-#else
- reshape_fire(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
-#endif
- glDrawBuffer(GL_BACK);
- if (!Init(mi)) {
- free_fire(mi);
- return;
- }
- } else {
- MI_CLEARWINDOW(mi);
- }
-}
-
-/*
- *-----------------------------------------------------------------------------
- * Called by the mainline code periodically to update the display.
- *-----------------------------------------------------------------------------
- */
-ENTRYPOINT void draw_fire(ModeInfo * mi)
-{
- firestruct *fs = &fire[MI_SCREEN(mi)];
-
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- MI_IS_DRAWN(mi) = True;
-
- if (!fs->glx_context)
- return;
-
- glXMakeCurrent(display, window, *fs->glx_context);
-
- glShadeModel(GL_FLAT);
- glEnable(GL_DEPTH_TEST);
-
- /* makes particles blend with background */
- if (!MI_IS_WIREFRAME(mi)||(!fs->np))
- {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- /* fog stuff */
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_EXP);
- glFogfv(GL_FOG_COLOR, fogcolor);
- glFogf(GL_FOG_DENSITY, 0.03);
- glHint(GL_FOG_HINT, GL_NICEST);
-
- glPushMatrix();
- glRotatef(current_device_rotation(), 0, 0, 1);
- DrawFire(mi);
- glPopMatrix();
-#ifndef STANDALONE
- Reshape(mi); /* xlock mode */
-#else
- reshape_fire(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
-#endif
-
- glFinish();
- glXSwapBuffers(display, window);
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * The display is being taken away from us. Free up malloc'ed
- * memory and X resources that we've alloc'ed. Only called
- * once, we must zap everything for every screen.
- *-----------------------------------------------------------------------------
- */
-
-ENTRYPOINT void release_fire(ModeInfo * mi)
-{
- FreeAllGL(mi);
-}
-
-ENTRYPOINT Bool
-fire_handle_event (ModeInfo *mi, XEvent *event)
-{
- firestruct *fs = &fire[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, fs->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &fs->button_down_p))
- return True;
-
- return False;
-}
-
-
-#ifndef STANDALONE
-ENTRYPOINT void change_fire(ModeInfo * mi)
-{
- firestruct *fs = &fire[MI_SCREEN(mi)];
-
- if (!fs->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *fs->glx_context);
-
- /* if available, randomly change some values */
- if (do_fog)
- fs->fog = LRAND() & 1;
- if (do_shadows)
- fs->shadows = LRAND() & 1;
- /* reset observer position */
- frame = 0;
- vinit(fs->obs, DEF_OBS[0], DEF_OBS[1], DEF_OBS[2]);
- fs->v = 0.0;
- /* particle randomisation */
- fs->eject_r = 0.1 + NRAND(10) * 0.03;
- fs->ridtri = 0.1 + NRAND(10) * 0.005;
-
- if (MI_IS_DEBUG(mi)) {
- (void) fprintf(stderr,
- "%s:\n\tnum_part=%d\n\ttrees=%d\n\tfog=%s\n\tshadows=%s\n\teject_r=%.3f\n\tridtri=%.3f\n",
- MI_NAME(mi),
- fs->np,
- fs->num_trees,
- fs->fog ? "on" : "off",
- fs->shadows ? "on" : "off",
- fs->eject_r, fs->ridtri);
- }
-}
-#endif /* !STANDALONE */
-
-XSCREENSAVER_MODULE_2 ("GLForestFire", glforestfire, fire)
-
-#endif /* MODE_fire */
diff --git a/hacks/glx/glforestfire.man b/hacks/glx/glforestfire.man
deleted file mode 100644
index a0d18c7..0000000
--- a/hacks/glx/glforestfire.man
+++ /dev/null
@@ -1,117 +0,0 @@
-.TH XScreenSaver 1 "03-Oct-01" "X Version 11"
-.SH NAME
-glforestfire \- draws a GL animation of sprinkling fire-like 3D triangles
-.SH SYNOPSIS
-.B glforestfire
-[\-display \fIhost:display.screen\fP] [\-window] [\-root]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
-[\-count \fInumber_of_particles\fP]
-[\-trees \fInumber_of_trees\fP]
-[\-size \fIviewport_size\fP]
-[\-texture] [\-no-texture]
-[\-shadows] [\-no-shadows]
-[\-fog] [\-no-fog]
-[\-wireframe] [\-no-wireframe]
-[\-wander] [\-no-wander]
-[\-trackmouse] [\-no-trackmouse]
-[\-fps]
-.SH DESCRIPTION
-The \fIglforestfire\fP program draws an animation of sprinkling fire-like 3D triangles in
-a landscape filled with trees.
-.SH OPTIONS
-.I glforestfire
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-trees \fInumber_of_trees\fP\fP
-Specify how much trees are drawn in the landscape.
-.TP 8
-.B \-count \fInumber_of_particles\fP\fP
-Specify how much fire particles are drawn. A very special case is 0
-wich means that you get
-.B rain
-!
-.TP 8
-.B \-size \fIviewport_size\fP\fP
-Viewport of GL scene is specified size if greater than 32 and less than screensize. Default value is 0, meaning full screensize.
-.TP 8
-.B \-texture
-Show a textured ground and the trees. This is the default.
-.TP 8
-.B \-no\-texture
-Disables texturing the landscape. This implies that no trees are drawn.
-.TP 8
-.B \-shadows
-Show a shadow for each particle on the ground. This is the default.
-.TP 8
-.B \-no\-shadows
-Disables the drawing of the shadows.
-.TP 8
-.B \-fog
-Show a fog in the distance.
-.TP 8
-.B \-no\-fog
-Disables the fog. This is the default.
-.TP 8
-.B \-wander
-Move the observer around the landscape. This is the default.
-.TP 8
-.B \-no\-wander
-Keep the fire centered on the screen.
-.TP 8
-.B \-trackmouse
-Let the mouse be a joystick to change the view of the landscape.
-This implies
-.I \-no\-wander.
-.TP 8
-.B \-no\-trackmouse
-Disables mouse tracking. This is the default.
-.TP 8
-.B \-wire
-Draw a wireframe rendition of the fire: this will consist only of
-single-pixel lines for the triangles.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2001 by Eric Lassauge.
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-
-The original code for this hack was written by David Bucciarelli
-(tech.hmw@plus.it) and could be found in the demo package
-of Mesa (Mesa-3.2/3Dfx/demos/). This hack is the result of the merge of
-two of the David's demos (fire and rain).
-
-.SH AUTHOR
-David Bucciarelli <tech.hmw@plus.it>
-Eric Lassauge <lassauge@mail.dotcom.fr>
diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c
deleted file mode 100644
index b544283..0000000
--- a/hacks/glx/glhanoi.c
+++ /dev/null
@@ -1,2091 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* glhanoi, Copyright (c) 2005, 2009 Dave Atkinson <da@davea.org.uk>
- * except noise function code Copyright (c) 2002 Ken Perlin
- * Modified by Lars Huttar (c) 2010, to generalize to 4 or more poles
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <assert.h>
-
-#include "rotator.h"
-
-#define DEF_LIGHT "True"
-#define DEF_FOG "False"
-#define DEF_TEXTURE "True"
-#define DEF_POLES "0" /* choose random value */
-#define DEF_SPEED "1"
-#define DEF_TRAILS "2"
-
-#define DEFAULTS "*delay: 15000\n" \
- "*count: 0\n" \
- "*showFPS: False\n" \
- "*wireframe: False\n"
-
-# define release_glhanoi 0
-
-/* polygon resolution of poles and disks */
-#define NSLICE 32
-#define NLOOPS 1
-
-/* How long to wait at start and finish (seconds). */
-#define START_DURATION 1.0
-#define FINISH_DURATION 1.0
-#define BASE_LENGTH 30.0
-#define BOARD_SQUARES 8
-
-/* Don't draw trail lines till they're this old (sec).
- Helps trails not be "attached" to the disks. */
-#define TRAIL_START_DELAY 0.1
-
-#define MAX_CAMERA_RADIUS 250.0
-#define MIN_CAMERA_RADIUS 75.0
-
-#define MARBLE_SCALE 1.01
-
-#undef BELLRAND
-/* Return a double precision number in [0...n], with bell curve distribution. */
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-enum {
- MARBLE_TEXURE,
- N_TEXTURES
-};
-
-#define MARBLE_TEXTURE_SIZE 256
-
-#include <math.h>
-#include "xlockmore.h"
-
-#ifdef USE_GL /* whole file */
-
-typedef struct timeval glhtime;
-
-static double getTime(void)
-{
- struct timeval t;
-#ifdef GETTIMEOFDAY_TWO_ARGS
- gettimeofday(&t, NULL);
-#else /* !GETTIMEOFDAY_TWO_ARGS */
- gettimeofday(&t);
-#endif /* !GETTIMEOFDAY_TWO_ARGS */
- return t.tv_sec + t.tv_usec / 1000000.0;
-}
-
-typedef enum {
- START,
- MOVE_DISK,
- MOVE_FINISHED,
- FINISHED,
- MONEY_SHOT,
- INVALID = -1
-} State;
-
-typedef struct {
- int id;
- GLuint displayList;
- GLfloat position[3];
- GLfloat rotation[3];
- GLfloat color[4];
- GLfloat base0;
- GLfloat base1;
- GLfloat height;
- GLfloat xmin, xmax, ymin, zmin, zmax;
- GLfloat u1, u2;
- GLfloat t1, t2;
- GLfloat ucostheta, usintheta;
- GLfloat dx, dz;
- GLdouble rotAngle; /* degree of "flipping" so far, during travel */
- GLdouble phi; /* angle of motion in xz plane */
- GLfloat speed;
- int polys;
-} Disk;
-
-typedef struct {
- Disk **data;
- int count;
- int size;
- GLfloat position[3];
-} Pole;
-
-/* A SubProblem is a recursive subdivision of the problem, and means
- "Move nDisks disks from src pole to dst pole, using the poles indicated in 'available'." */
-typedef struct {
- int nDisks;
- int src, dst;
- unsigned long available; /* a bitmask of poles that have no smaller disks on them */
-} SubProblem;
-
-typedef struct {
- GLfloat position[3];
- double startTime, endTime;
- Bool isEnd;
-} TrailPoint;
-
-typedef struct {
- GLXContext *glx_context;
- State state;
- Bool wire;
- Bool fog;
- Bool light;
- Bool layoutLinear;
- GLfloat trailDuration;
- double startTime;
- double lastTime;
- double duration;
- int numberOfDisks;
- int numberOfPoles;
- int numberOfMoves;
- int maxDiskIdx;
- int magicNumber;
- Disk *currentDisk;
- int move;
- /* src, tmp, dst: index of pole that is source / storage / destination for
- current move */
- int src;
- int tmp;
- int dst;
- int oldsrc;
- int oldtmp;
- int olddst;
- GLfloat speed; /* coefficient for how fast the disks move */
- SubProblem *solveStack;
- int solveStackSize, solveStackIdx;
- Pole *pole;
- float boardSize;
- float baseLength;
- float baseWidth;
- float baseHeight;
- float poleRadius;
- float poleHeight;
- float poleOffset;
- float poleDist; /* distance of poles from center, for round layout */
- float diskHeight;
- float maxDiskRadius;
- float *diskPos; /* pre-computed disk positions on rods */
- Disk *disk;
- GLint floorList;
- GLint baseList;
- GLint poleList;
- int floorpolys, basepolys, polepolys;
- int trailQSize;
- TrailPoint *trailQ;
- int trailQFront, trailQBack;
- GLfloat camera[3];
- GLfloat centre[3];
- rotator *the_rotator;
- Bool button_down_p;
- Bool texture;
- GLuint textureNames[N_TEXTURES];
- int drag_x;
- int drag_y;
- int noise_initted;
- int p[512];
-} glhcfg;
-
-static glhcfg *glhanoi_cfg = NULL;
-static Bool fog;
-static Bool light;
-static Bool texture;
-static GLfloat trails;
-static int poles;
-static GLfloat speed;
-
-static XrmOptionDescRec opts[] = {
- {"-light", ".glhanoi.light", XrmoptionNoArg, "true"},
- {"+light", ".glhanoi.light", XrmoptionNoArg, "false"},
- {"-fog", ".glhanoi.fog", XrmoptionNoArg, "true"},
- {"+fog", ".glhanoi.fog", XrmoptionNoArg, "false"},
- {"-texture", ".glhanoi.texture", XrmoptionNoArg, "true"},
- {"+texture", ".glhanoi.texture", XrmoptionNoArg, "false"},
- {"-trails", ".glhanoi.trails", XrmoptionSepArg, 0},
- {"-poles", ".glhanoi.poles", XrmoptionSepArg, 0 },
- {"-speed", ".glhanoi.speed", XrmoptionSepArg, 0 }
-};
-
-static argtype vars[] = {
- {&light, "light", "Light", DEF_LIGHT, t_Bool},
- {&fog, "fog", "Fog", DEF_FOG, t_Bool},
- {&texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&trails, "trails", "Trails", DEF_TRAILS, t_Float},
- {&poles, "poles", "Poles", DEF_POLES, t_Int},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float}
-};
-
-static OptionStruct desc[] = {
- {"+/-light", "whether to light the scene"},
- {"+/-fog", "whether to apply fog to the scene"},
- {"+/-texture", "whether to apply texture to the scene"},
- {"-trails t", "how long of disk trails to show (sec.)"},
- {"-poles r", "number of poles to move disks between"},
- {"-speed s", "speed multiplier"}
-};
-
-ENTRYPOINT ModeSpecOpt glhanoi_opts = { countof(opts), opts, countof(vars), vars, desc };
-
-#ifdef USE_MODULES
-
-ModStruct glhanoi_description = {
- "glhanoi", "init_glhanoi", "draw_glhanoi", NULL,
- "draw_glhanoi", "init_glhanoi", "free_glhanoi", &glhanoi_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Towers of Hanoi", 0, NULL
-};
-
-#endif
-
-static const GLfloat cBlack[] = { 0.0, 0.0, 0.0, 1.0 };
-static const GLfloat cWhite[] = { 1.0, 1.0, 1.0, 1.0 };
-static const GLfloat poleColor[] = { 0.545, 0.137, 0.137 };
-static const GLfloat baseColor[] = { 0.34, 0.34, 0.48 };
-/* static const GLfloat baseColor[] = { 0.545, 0.137, 0.137 }; */
-static const GLfloat fogcolor[] = { 0.5, 0.5, 0.5 };
-static GLfloat trailColor[] = { 1.0, 1.0, 1.0, 0.5 };
-
-static const float left[] = { 1.0, 0.0, 0.0 };
-static const float up[] = { 0.0, 1.0, 0.0 };
-static const float front[] = { 0.0, 0.0, 1.0 };
-static const float right[] = { -1.0, 0.0, 0.0 };
-static const float down[] = { 0.0, -1.0, 0.0 };
-static const float back[] = { 0.0, 0.0, -1.0 };
-
-static const GLfloat pos0[4] = { 50.0, 50.0, 50.0, 0.0 };
-static const GLfloat amb0[4] = { 0.0, 0.0, 0.0, 1.0 };
-static const GLfloat dif0[4] = { 1.0, 1.0, 1.0, 1.0 };
-static const GLfloat spc0[4] = { 0.0, 1.0, 1.0, 1.0 };
-
-static const GLfloat pos1[4] = { -50.0, 50.0, -50.0, 0.0 };
-static const GLfloat amb1[4] = { 0.0, 0.0, 0.0, 1.0 };
-static const GLfloat dif1[4] = { 1.0, 1.0, 1.0, 1.0 };
-static const GLfloat spc1[4] = { 1.0, 1.0, 1.0, 1.0 };
-
-static float g = 3.0 * 9.80665; /* hmm, looks like we need more gravity, Scotty... */
-
-static void checkAllocAndExit(Bool item, char *descr) {
- if (!item) {
- fprintf(stderr, "%s: unable to allocate memory for %s\n",
- progname, descr);
- exit(EXIT_FAILURE);
- }
-}
-
-#define DOPUSH(X, Y) (((X)->count) >= ((X)->size)) ? NULL : ((X)->data[(X)->count++] = (Y))
-#define DOPOP(X) (X)->count <= 0 ? NULL : ((X)->data[--((X)->count)])
-
-/* push disk d onto pole idx */
-static Disk *push(glhcfg *glhanoi, int idx, Disk * d)
-{
- return DOPUSH(&glhanoi->pole[idx], d);
-}
-
-/* pop the top disk from pole idx */
-static Disk *pop(glhcfg *glhanoi, int idx)
-{
- return DOPOP(&glhanoi->pole[idx]);
-}
-
-static inline void swap(int *x, int *y)
-{
- *x = *x ^ *y;
- *y = *x ^ *y;
- *x = *x ^ *y;
-}
-
-/*
- * magic - it's magic...
- * Return 1 if the number of trailing zeroes on i is even, unless i is 1 or 0.
- */
-static int magic(int i)
-{
- int count = 0;
- if(i <= 1)
- return 0;
- while((i & 0x01) == 0) {
- i >>= 1;
- count++;
- }
- return count % 2 == 0;
-}
-
-static float distance(float *p0, float *p1)
-{
- float x, y, z;
- x = p1[0] - p0[0];
- y = p1[1] - p0[1];
- z = p1[2] - p0[2];
- return (float)sqrt(x * x + y * y + z * z);
-}
-
-/* What is this for?
- = c / (a b - 0.25 (a^2 + 2 a b + b^2) )
- = c / (-0.25 (a^2 - 2 a b + b^2) )
- = c / (-0.25 ((a - b)(a - b)))
- = -4 c / (a - b)^2
-static GLfloat A(GLfloat a, GLfloat b, GLfloat c)
-{
- GLfloat sum = a + b;
- return c / (a * b - 0.25 * sum * sum);
-}
-*/
-
-static void moveSetup(glhcfg *glhanoi, Disk * disk)
-{
- float h, ymax;
- float u;
- int src = glhanoi->src;
- int dst = glhanoi->dst;
- GLfloat theta;
- GLfloat sintheta, costheta;
- double dh;
- double dx, dz; /* total x and z distances from src to dst */
- Pole *poleSrc, *poleDst;
-
- poleSrc = &(glhanoi->pole[src]);
- poleDst = &(glhanoi->pole[dst]);
-
- disk->xmin = poleSrc->position[0];
- /* glhanoi->poleOffset * (src - (glhanoi->numberOfPoles - 1.0f) * 0.5); */
- disk->xmax = poleDst->position[0];
- /* disk->xmax = glhanoi->poleOffset * (dst - (glhanoi->numberOfPoles - 1.0f) * 0.5); */
- disk->ymin = glhanoi->poleHeight;
- disk->zmin = poleSrc->position[2];
- disk->zmax = poleDst->position[2];
-
- dx = disk->xmax - disk->xmin;
- dz = disk->zmax - disk->zmin;
-
- if(glhanoi->state != FINISHED) {
- double xxx = ((dx < 0) ? 180.0 : -180.0);
- if(random() % 6 == 0) {
- disk->rotAngle = xxx * (2 - 2 * random() % 2) * (random() % 3 + 1);
- } else {
- disk->rotAngle = xxx;
- }
- if(random() % 4 == 0) {
- /* Backflip */
- disk->rotAngle = -disk->rotAngle;
- }
- } else {
- disk->rotAngle = -180.0;
- }
-
- disk->base0 = glhanoi->diskPos[poleSrc->count];
- disk->base1 = (glhanoi->state == FINISHED) ?
- disk->base0 : glhanoi->diskPos[poleDst->count];
-
- /* horizontal distance to travel? */
- /* was: absx = sqrt(disk->xmax - disk->xmin); */
- dh = distance(poleSrc->position, poleDst->position);
- /* absx = sqrt(dh); */
- ymax = glhanoi->poleHeight + dh;
- if(glhanoi->state == FINISHED) {
- ymax += dh * (double)(glhanoi->numberOfDisks - disk->id);
- }
- h = ymax - disk->ymin;
- /* A(a, b, c) = -4 c / (a - b)^2 */
- /* theta = atan(4 h / (b - a)) */
- theta = atan(4 * h / dh);
- if(theta < 0.0)
- theta += M_PI;
- costheta = cos(theta);
- sintheta = sin(theta);
- u = (float)
- sqrt(fabs
- (-g /
- /* (2.0 * A(disk->xmin, disk->xmax, h) * costheta * costheta))); */
- (2.0 * -4 * h / (dh * dh) * costheta * costheta)));
- disk->usintheta = u * sintheta;
- disk->ucostheta = u * costheta;
- /* Not to be confused: disk->dx is the per-time-unit portion of dx */
- disk->dx = disk->ucostheta * dx / dh;
- disk->dz = disk->ucostheta * dz / dh;
- disk->t1 =
- (-u + sqrt(u * u + 2.0 * g * fabs(disk->ymin - disk->base0))) / g;
- disk->u1 = u + g * disk->t1;
- disk->t2 = 2.0 * disk->usintheta / g;
- disk->u2 = disk->usintheta - g * disk->t2;
-
- /* Compute direction of travel, in the XZ plane. */
- disk->phi = atan(dz / dx);
- disk->phi *= 180.0 / M_PI; /* convert radians to degrees */
-}
-
-/* For debugging: show a value as a string of ones and zeroes
-static const char *byteToBinary(int x) {
- static char b[9];
- int i, z;
-
- for (z = 128, i = 0; z > 0; z >>= 1, i++) {
- b[i] = ((x & z) == z) ? '1' : '0';
- }
- b[i] = '\0';
-
- return b;
-}
-*/
-
-static void pushMove(glhcfg *glhanoi, int n, int src, int dst, int avail) {
- SubProblem *sp = &(glhanoi->solveStack[glhanoi->solveStackIdx++]);
-
- if (glhanoi->solveStackIdx > glhanoi->solveStackSize) {
- fprintf(stderr, "solveStack overflow: pushed index %d: %d from %d to %d, using %d\n",
- glhanoi->solveStackIdx, n, src, dst, avail);
- exit(EXIT_FAILURE);
- }
-
- sp->nDisks = n;
- sp->src = src;
- sp->dst = dst;
- sp->available = avail & ~((unsigned long)(1 << src))
- & ~((unsigned long)(1 << dst));
- /*
- fprintf(stderr, "Debug: > pushed solveStack %d: %d from %d to %d, using %s\n",
- glhanoi->solveStackIdx - 1, n, src, dst, byteToBinary(sp->available));
- */
-}
-
-static Bool solveStackEmpty(glhcfg *glhanoi) {
- return (glhanoi->solveStackIdx < 1);
-}
-
-static SubProblem *popMove(glhcfg *glhanoi) {
- SubProblem *sp;
- if (solveStackEmpty(glhanoi)) return (SubProblem *)NULL;
- sp = &(glhanoi->solveStack[--glhanoi->solveStackIdx]);
- /* fprintf(stderr, "Debug: < popped solveStack %d: %d from %d to %d, using %s\n",
- glhanoi->solveStackIdx, sp->nDisks, sp->src, sp->dst, byteToBinary(sp->available)); */
- return sp;
-}
-
-/* Return number of bits set in b */
-static int numBits(unsigned long b) {
- int count = 0;
- while (b) {
- count += b & 0x1u;
- b >>= 1;
- }
- return count;
-}
-
-/* Return index (power of 2) of least significant 1 bit. */
-static int bitScan(unsigned long b) {
- int count;
- for (count = 0; b; count++, b >>= 1) {
- if (b & 0x1u) return count;
- }
- return -1;
-}
-
-/* A bit pattern representing all poles */
-#define ALL_POLES ((1 << glhanoi->numberOfPoles) - 1)
-
-#define REMOVE_BIT(a, b) ((a) & ~(1 << (b)))
-#define ADD_BIT(a, b) ((a) | (1 << (b)))
-
-static void makeMove(glhcfg *glhanoi)
-{
- if (glhanoi->numberOfPoles == 3) {
- int fudge = glhanoi->move + 2;
- int magicNumber = magic(fudge);
-
-
- glhanoi->currentDisk = pop(glhanoi, glhanoi->src);
- moveSetup(glhanoi, glhanoi->currentDisk);
- push(glhanoi, glhanoi->dst, glhanoi->currentDisk);
-
- fudge = fudge % 2;
-
- if(fudge == 1 || magicNumber) {
- swap(&glhanoi->src, &glhanoi->tmp);
- }
- if(fudge == 0 || glhanoi->magicNumber) {
- swap(&glhanoi->dst, &glhanoi->tmp);
- }
- glhanoi->magicNumber = magicNumber;
- } else {
- SubProblem sp;
- int tmp = 0;
-
- if (glhanoi->move == 0) {
- /* Initialize the solution stack. Original problem:
- move all disks from pole 0 to furthest pole,
- using all other poles. */
- pushMove(glhanoi, glhanoi->numberOfDisks, 0,
- glhanoi->numberOfPoles - 1,
- REMOVE_BIT(REMOVE_BIT(ALL_POLES, 0), glhanoi->numberOfPoles - 1));
- }
-
- while (!solveStackEmpty(glhanoi)) {
- int k, numAvail;
- sp = *popMove(glhanoi);
-
- if (sp.nDisks == 1) {
- /* We have a single, concrete move to do. */
- /* moveSetup uses glhanoi->src, dst. */
- glhanoi->src = sp.src;
- glhanoi->dst = sp.dst;
- glhanoi->tmp = tmp; /* Probably unnecessary */
-
- glhanoi->currentDisk = pop(glhanoi, sp.src);
- moveSetup(glhanoi, glhanoi->currentDisk);
- push(glhanoi, sp.dst, glhanoi->currentDisk);
-
- return;
- } else {
- /* Divide and conquer, using Frame-Stewart algorithm, until we get to base case */
- if (sp.nDisks == 1) break;
-
- numAvail = numBits(sp.available);
- if (numAvail < 2) k = sp.nDisks - 1;
- else if(numAvail >= sp.nDisks - 2) k = 1;
- /* heuristic for optimal k: sqrt(2n) (see http://www.cs.wm.edu/~pkstoc/boca.pdf) */
- else k = (int)(sqrt(2 * sp.nDisks));
-
- if (k >= sp.nDisks) k = sp.nDisks - 1;
- else if (k < 1) k = 1;
-
- tmp = bitScan(sp.available);
- /* fprintf(stderr, "Debug: k is %d, tmp is %d\n", k, tmp); */
- if (tmp == -1) {
- fprintf(stderr, "Error: n > 1 (%d) and no poles available\n",
- sp.nDisks);
- }
-
- /* Push on moves in reverse order, since this is a stack. */
- pushMove(glhanoi, k, tmp, sp.dst,
- REMOVE_BIT(ADD_BIT(sp.available, sp.src), tmp));
- pushMove(glhanoi, sp.nDisks - k, sp.src, sp.dst,
- REMOVE_BIT(sp.available, tmp));
- pushMove(glhanoi, k, sp.src, tmp,
- REMOVE_BIT(ADD_BIT(sp.available, sp.dst), tmp));
-
- /* Repeat until we've found a move we can make. */
- }
- }
- }
-}
-
-static double lerp(double alpha, double start, double end)
-{
- return start + alpha * (end - start);
-}
-
-static void upfunc(GLdouble t, Disk * d)
-{
- d->position[0] = d->xmin;
- d->position[1] = d->base0 + (d->u1 - 0.5 * g * t) * t;
- d->position[2] = d->zmin;
-
- d->rotation[1] = 0.0;
-}
-
-static void parafunc(GLdouble t, Disk * d)
-{
- /* ##was: d->position[0] = d->xmin + d->ucostheta * t; */
- d->position[0] = d->xmin + d->dx * t;
- d->position[2] = d->zmin + d->dz * t;
- d->position[1] = d->ymin + (d->usintheta - 0.5 * g * t) * t;
-
- d->rotation[1] = d->rotAngle * t / d->t2;
- /* d->rotAngle * (d->position[0] - d->xmin) / (d->xmax - d->xmin); */
-}
-
-static void downfunc(GLdouble t, Disk * d)
-{
- d->position[0] = d->xmax;
- d->position[1] = d->ymin + (d->u2 - 0.5 * g * t) * t;
- d->position[2] = d->zmax;
-
- d->rotation[1] = 0.0;
-}
-
-#define normalizeQ(i) ((i) >= glhanoi->trailQSize ? (i) - glhanoi->trailQSize : (i))
-#define normalizeQNeg(i) ((i) < 0 ? (i) + glhanoi->trailQSize : (i))
-
-/* Add trail point at position posn at time t onto back of trail queue.
- Removes old trails if necessary to make room. */
-static void enQTrail(glhcfg *glhanoi, GLfloat *posn)
-{
- if (glhanoi->trailQSize && glhanoi->state != MONEY_SHOT) {
- TrailPoint *tp = &(glhanoi->trailQ[glhanoi->trailQBack]);
- double t = getTime();
-
- tp->position[0] = posn[0];
- tp->position[1] = posn[1] + glhanoi->diskHeight;
- /* Slight jitter to prevent clashing with other trails */
- tp->position[2] = posn[2] + (glhanoi->move % 23) * 0.01;
- tp->startTime = t + TRAIL_START_DELAY;
- tp->endTime = t + TRAIL_START_DELAY + glhanoi->trailDuration;
- tp->isEnd = False;
-
- /* Update queue back/front indices */
- glhanoi->trailQBack = normalizeQ(glhanoi->trailQBack + 1);
- if (glhanoi->trailQBack == glhanoi->trailQFront)
- glhanoi->trailQFront = normalizeQ(glhanoi->trailQFront + 1);
- }
-}
-
-/* Mark last trailpoint in queue as the end of a trail. */
-/* was: #define endTrail(glh) ((glh)->trailQ[(glh)->trailQBack].isEnd = True) */
-static void endTrail(glhcfg *glhanoi) {
- if (glhanoi->trailQSize)
- glhanoi->trailQ[normalizeQNeg(glhanoi->trailQBack - 1)].isEnd = True;
-}
-
-/* Update disk d's position and rotation based on time t.
- Returns true iff move is finished. */
-static Bool computePosition(glhcfg *glhanoi, GLfloat t, Disk * d)
-{
- Bool finished = False;
-
- if(t < d->t1) {
- upfunc(t, d);
- } else if(t < d->t1 + d->t2) {
- parafunc(t - d->t1, d);
- enQTrail(glhanoi, d->position);
- } else {
- downfunc(t - d->t1 - d->t2, d);
- if(d->position[1] <= d->base1) {
- d->position[1] = d->base1;
- finished = True;
- endTrail(glhanoi);
- }
- }
- return finished;
-}
-
-static void updateView(glhcfg *glhanoi)
-{
- double longitude, latitude, radius;
- double a, b, c, A, B;
-
- get_position(glhanoi->the_rotator, NULL, NULL, &radius,
- !glhanoi->button_down_p);
- get_rotation(glhanoi->the_rotator, &longitude, &latitude, NULL,
- !glhanoi->button_down_p);
- longitude += glhanoi->camera[0];
- latitude += glhanoi->camera[1];
- radius += glhanoi->camera[2];
- /* FUTURE: tweak this to be smooth: */
- longitude = longitude - floor(longitude);
- latitude = latitude - floor(latitude);
- radius = radius - floor(radius);
- if(latitude > 0.5) {
- latitude = 1.0 - latitude;
- }
- if(radius > 0.5) {
- radius = 1.0 - radius;
- }
-
- b = glhanoi->centre[1];
- c = (MIN_CAMERA_RADIUS +
- radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS));
- A = M_PI / 4.0 * (1.0 - latitude);
- a = sqrt(b * b + c * c - 2.0 * b * c * cos(A));
- B = asin(sin(A) * b / a);
- glRotatef(-B * 180 / M_PI, 1.0, 0.0, 0.0);
-
- glTranslatef(0.0f, 0.0f,
- -(MIN_CAMERA_RADIUS +
- radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS)));
- glRotatef(longitude * 360.0, 0.0f, 1.0f, 0.0f);
- glRotatef(latitude * 180.0, cos(longitude * 2.0 * M_PI), 0.0,
- sin(longitude * 2.0 * M_PI));
-}
-
-static void changeState(glhcfg *glhanoi, State state)
-{
- glhanoi->state = state;
- glhanoi->startTime = getTime();
-}
-
-static Bool finishedHanoi(glhcfg *glhanoi) {
- /* use different criteria depending on algorithm */
- return (glhanoi->numberOfPoles == 3 ?
- glhanoi->move >= glhanoi->numberOfMoves :
- solveStackEmpty(glhanoi));
-}
-
-static void update_glhanoi(glhcfg *glhanoi)
-{
- double t = getTime() - glhanoi->startTime;
- int i;
- Bool done;
-
- switch (glhanoi->state) {
- case START:
- if(t < glhanoi->duration) {
- break;
- }
- glhanoi->move = 0;
- if(glhanoi->numberOfDisks % 2 == 0) {
- swap(&glhanoi->tmp, &glhanoi->dst);
- }
- glhanoi->magicNumber = 1;
- makeMove(glhanoi);
- changeState(glhanoi, MOVE_DISK);
- break;
-
- case MOVE_DISK:
- if(computePosition(glhanoi, t * glhanoi->currentDisk->speed, glhanoi->currentDisk)) {
- changeState(glhanoi, MOVE_FINISHED);
- }
- break;
-
- case MOVE_FINISHED:
- ++glhanoi->move;
- if(!finishedHanoi(glhanoi)) {
- makeMove(glhanoi);
- changeState(glhanoi, MOVE_DISK);
- } else {
- glhanoi->duration = FINISH_DURATION;
- changeState(glhanoi, FINISHED);
- }
- break;
-
- case FINISHED:
- if (t < glhanoi->duration)
- break;
- glhanoi->src = glhanoi->olddst;
- glhanoi->dst = glhanoi->oldsrc;
- for(i = 0; i < glhanoi->numberOfDisks; ++i) {
- Disk *disk = pop(glhanoi, glhanoi->src);
- assert(disk != NULL);
- moveSetup(glhanoi, disk);
- }
- for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
- push(glhanoi, glhanoi->dst, &glhanoi->disk[i]);
- }
- changeState(glhanoi, MONEY_SHOT);
- break;
-
- case MONEY_SHOT:
- done = True;
- for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
- double delay = 0.25 * i;
- int finished;
-
- if(t - delay < 0) {
- done = False;
- continue;
- }
-
- finished = computePosition(glhanoi, t - delay, &glhanoi->disk[i]);
- glhanoi->disk[i].rotation[1] = 0.0;
-
- if(!finished) {
- done = False;
- }
- }
- if(done) {
- glhanoi->src = glhanoi->oldsrc;
- glhanoi->tmp = glhanoi->oldtmp;
- glhanoi->dst = glhanoi->olddst;
- changeState(glhanoi, START);
- }
- break;
-
- case INVALID:
- default:
- fprintf(stderr, "Invalid state\n");
- break;
- }
-}
-
-static void HSVtoRGBf(GLfloat h, GLfloat s, GLfloat v,
- GLfloat * r, GLfloat * g, GLfloat * b)
-{
- if(s == 0.0) {
- *r = v;
- *g = v;
- *b = v;
- } else {
- GLfloat i, f, p, q, t;
- if(h >= 360.0) {
- h = 0.0;
- }
- h /= 60.0; /* h now in [0,6). */
- i = floor((double)h); /* i now largest integer <= h */
- f = h - i; /* f is no fractional part of h */
- p = v * (1.0 - s);
- q = v * (1.0 - (s * f));
- t = v * (1.0 - (s * (1.0 - f)));
- switch ((int)i) {
- case 0:
- *r = v;
- *g = t;
- *b = p;
- break;
- case 1:
- *r = q;
- *g = v;
- *b = p;
- break;
- case 2:
- *r = p;
- *g = v;
- *b = t;
- break;
- case 3:
- *r = p;
- *g = q;
- *b = v;
- break;
- case 4:
- *r = t;
- *g = p;
- *b = v;
- break;
- case 5:
- *r = v;
- *g = p;
- *b = q;
- break;
- }
- }
-}
-
-static void HSVtoRGBv(GLfloat * hsv, GLfloat * rgb)
-{
- HSVtoRGBf(hsv[0], hsv[1], hsv[2], &rgb[0], &rgb[1], &rgb[2]);
-}
-
-static void setMaterial(const GLfloat color[3], const GLfloat hlite[3], int shininess)
-{
- glColor3fv(color);
- glMaterialfv(GL_FRONT, GL_SPECULAR, hlite);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
- glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */
-}
-
-/*
- * drawTube: I know all this stuff is available in gluQuadrics
- * but I'd originally intended to texture the poles with a 3D wood
- * texture, but I was having difficulty getting wood... what? Why
- * are all you Amercians laughing..? Anyway, I don't know if enough
- * people's hardware supports 3D textures, so I didn't bother (xorg
- * ATI server doesn't :-( )
- */
-static int drawTube(GLdouble bottomRadius, GLdouble topRadius,
- GLdouble bottomThickness, GLdouble topThickness,
- GLdouble height, GLuint nSlice, GLuint nLoop)
-{
- int polys = 0;
- GLfloat y;
- GLfloat *cosCache = malloc(sizeof(GLfloat) * nSlice);
- GLfloat *sinCache = malloc(sizeof(GLfloat) * nSlice);
- GLint slice;
- GLuint loop;
- GLint lastSlice = nSlice - 1;
- GLfloat radius;
- GLfloat innerRadius;
-
- if(bottomThickness > bottomRadius) {
- bottomThickness = bottomRadius;
- }
- if(topThickness > topRadius) {
- topThickness = topRadius;
- }
- if(bottomThickness < 0.0) {
- bottomThickness = 0.0;
- }
- if(topThickness < 0.0) {
- topThickness = 0.0;
- }
-/* if(topRadius >= bottomRadius) {
- maxRadius = topRadius;
- } else {
- maxRadius = bottomRadius;
- } */
-
- /* bottom */
- y = 0.0;
- radius = bottomRadius;
- innerRadius = bottomRadius - bottomThickness;
- /* innerTexCoordSize = texCoordSize * innerRadius / maxRadius; */
- /* outerTexCoordSize = texCoordSize * radius / maxRadius; */
- /* yTexCoord = minTexCoord; */
-
- glBegin(GL_QUAD_STRIP);
-
- glNormal3f(0.0, -1.0, 0.0);
-
- /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + innerTexCoordSize); */
- glVertex3f(0.0, y, innerRadius);
-
- /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + outerTexCoordSize); */
- glVertex3f(0.0, y, radius);
-
- for(slice = lastSlice; slice >= 0; --slice) {
- GLfloat theta = 2.0 * M_PI * (double)slice / nSlice;
-
- cosCache[slice] = cos(theta);
- sinCache[slice] = sin(theta);
-
- /* glTexCoord3f(midTexCoord + sinCache[slice] * innerTexCoordSize, */
- /* yTexCoord, */
- /* midTexCoord + cosCache[slice] * innerTexCoordSize); */
- glVertex3f(innerRadius * sinCache[slice], y,
- innerRadius * cosCache[slice]);
- /* glTexCoord3f(midTexCoord + sinCache[slice] * outerTexCoordSize, */
- /* yTexCoord, */
- /* midTexCoord + cosCache[slice] * outerTexCoordSize); */
- glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
- polys++;
- }
- glEnd();
-
- /* middle */
- for(loop = 0; loop < nLoop; ++loop) {
- GLfloat lowerRadius =
- bottomRadius + (topRadius -
- bottomRadius) * (float)loop / (nLoop);
- GLfloat upperRadius =
- bottomRadius + (topRadius - bottomRadius) * (float)(loop +
- 1) /
- (nLoop);
- GLfloat lowerY = height * (float)loop / (nLoop);
- GLfloat upperY = height * (float)(loop + 1) / (nLoop);
- GLfloat factor = (topRadius - topThickness) -
- (bottomRadius - bottomThickness);
-
- /* outside */
- glBegin(GL_QUAD_STRIP);
- for(slice = 0; slice < nSlice; ++slice) {
- glNormal3f(sinCache[slice], 0.0, cosCache[slice]);
- glVertex3f(upperRadius * sinCache[slice], upperY,
- upperRadius * cosCache[slice]);
- glVertex3f(lowerRadius * sinCache[slice], lowerY,
- lowerRadius * cosCache[slice]);
- polys++;
- }
- glNormal3f(0.0, 0.0, 1.0);
- glVertex3f(0.0, upperY, upperRadius);
- glVertex3f(0.0, lowerY, lowerRadius);
- polys++;
- glEnd();
-
- /* inside */
- lowerRadius = bottomRadius - bottomThickness +
- factor * (float)loop / (nLoop);
- upperRadius = bottomRadius - bottomThickness +
- factor * (float)(loop + 1) / (nLoop);
-
- glBegin(GL_QUAD_STRIP);
- glNormal3f(0.0, 0.0, -1.0);
- glVertex3f(0.0, upperY, upperRadius);
- glVertex3f(0.0, lowerY, lowerRadius);
- for(slice = lastSlice; slice >= 0; --slice) {
- glNormal3f(-sinCache[slice], 0.0, -cosCache[slice]);
- glVertex3f(upperRadius * sinCache[slice], upperY,
- upperRadius * cosCache[slice]);
- glVertex3f(lowerRadius * sinCache[slice], lowerY,
- lowerRadius * cosCache[slice]);
- polys++;
- }
- glEnd();
- }
-
- /* top */
- y = height;
- radius = topRadius;
- innerRadius = topRadius - topThickness;
-
- glBegin(GL_QUAD_STRIP);
- glNormal3f(0.0, 1.0, 0.0);
- for(slice = 0; slice < nSlice; ++slice) {
- glVertex3f(innerRadius * sinCache[slice], y,
- innerRadius * cosCache[slice]);
-
- glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
- polys++;
- }
- glVertex3f(0.0, y, innerRadius);
- glVertex3f(0.0, y, radius);
- glEnd();
- free (cosCache);
- free (sinCache);
- return polys;
-}
-
-static int drawPole(GLfloat radius, GLfloat length)
-{
- return drawTube(radius, radius, radius, radius, length, NSLICE, NLOOPS);
-}
-
-static int drawDisk3D(GLdouble inner_radius, GLdouble outer_radius,
- GLdouble height)
-{
- return drawTube(outer_radius, outer_radius, outer_radius - inner_radius,
- outer_radius - inner_radius, height, NSLICE, NLOOPS);
-}
-
-/* used for drawing base */
-static int drawCuboid(GLfloat length, GLfloat width, GLfloat height)
-{
- GLfloat xmin = -length / 2.0f;
- GLfloat xmax = length / 2.0f;
- GLfloat zmin = -width / 2.0f;
- GLfloat zmax = width / 2.0f;
- GLfloat ymin = 0.0f;
- GLfloat ymax = height;
- int polys = 0;
-
- glBegin(GL_QUADS);
- /* front */
- glNormal3fv(front);
- glVertex3f(xmin, ymin, zmax); /* 0 */
- glVertex3f(xmax, ymin, zmax); /* 1 */
- glVertex3f(xmax, ymax, zmax); /* 2 */
- glVertex3f(xmin, ymax, zmax); /* 3 */
- polys++;
- /* right */
- glNormal3fv(right);
- glVertex3f(xmax, ymin, zmax); /* 1 */
- glVertex3f(xmax, ymin, zmin); /* 5 */
- glVertex3f(xmax, ymax, zmin); /* 6 */
- glVertex3f(xmax, ymax, zmax); /* 2 */
- polys++;
- /* back */
- glNormal3fv(back);
- glVertex3f(xmax, ymin, zmin); /* 5 */
- glVertex3f(xmin, ymin, zmin); /* 4 */
- glVertex3f(xmin, ymax, zmin); /* 7 */
- glVertex3f(xmax, ymax, zmin); /* 6 */
- polys++;
- /* left */
- glNormal3fv(left);
- glVertex3f(xmin, ymin, zmin); /* 4 */
- glVertex3f(xmin, ymin, zmax); /* 0 */
- glVertex3f(xmin, ymax, zmax); /* 3 */
- glVertex3f(xmin, ymax, zmin); /* 7 */
- polys++;
- /* top */
- glNormal3fv(up);
- glVertex3f(xmin, ymax, zmax); /* 3 */
- glVertex3f(xmax, ymax, zmax); /* 2 */
- glVertex3f(xmax, ymax, zmin); /* 6 */
- glVertex3f(xmin, ymax, zmin); /* 7 */
- polys++;
- /* bottom */
- glNormal3fv(down);
- glVertex3f(xmin, ymin, zmin); /* 4 */
- glVertex3f(xmax, ymin, zmin); /* 5 */
- glVertex3f(xmax, ymin, zmax); /* 1 */
- glVertex3f(xmin, ymin, zmax); /* 0 */
- polys++;
- glEnd();
- return polys;
-}
-
-/* Set normal vector in xz plane, based on rotation around center. */
-static void setNormalV(glhcfg *glhanoi, GLfloat theta, int y1, int y2, int r1) {
- if (y1 == y2) /* up/down */
- glNormal3f(0.0, y1 ? 1.0 : -1.0, 0.0);
- else if (!r1) /* inward */
- glNormal3f(-cos(theta), 0.0, -sin(theta));
- else /* outward */
- glNormal3f(cos(theta), 0.0, sin(theta));
-}
-
-/* y1, r1, y2, r2 are indices into y, r, beg, end */
-static int drawBaseStrip(glhcfg *glhanoi, int y1, int r1, int y2, int r2,
- GLfloat y[2], GLfloat r[2], GLfloat beg[2][2], GLfloat end[2][2]) {
- int i;
- GLfloat theta, costh, sinth, x[2], z[2];
- GLfloat theta1 = (M_PI * 2) / (glhanoi->numberOfPoles + 1);
-
- glBegin(GL_QUAD_STRIP);
-
- /* beginning edge */
- glVertex3f(beg[r1][0], y[y1], beg[r1][1]);
- glVertex3f(beg[r2][0], y[y2], beg[r2][1]);
- setNormalV(glhanoi, theta1, y1, y2, r1);
-
- for (i = 1; i < glhanoi->numberOfPoles; i++) {
- theta = theta1 * (i + 0.5);
- costh = cos(theta);
- sinth = sin(theta);
- x[0] = costh * r[0];
- x[1] = costh * r[1];
- z[0] = sinth * r[0];
- z[1] = sinth * r[1];
-
- glVertex3f(x[r1], y[y1], z[r1]);
- glVertex3f(x[r2], y[y2], z[r2]);
-
- setNormalV(glhanoi, theta1 * (i + 1), y1, y2, r1);
- }
-
- /* end edge */
- glVertex3f(end[r1][0], y[y1], end[r1][1]);
- glVertex3f(end[r2][0], y[y2], end[r2][1]);
- setNormalV(glhanoi, glhanoi->numberOfPoles, y1, y2, r1);
-
- glEnd();
- return glhanoi->numberOfPoles;
-}
-
-/* Draw base such that poles are distributed around a regular polygon. */
-static int drawRoundBase(glhcfg *glhanoi) {
- int polys = 0;
- GLfloat theta, sinth, costh;
-
- /*
- r[0] = (minimum) inner radius of base at vertices
- r[1] = (minimum) outer radius of base at vertices
- y[0] = bottom of base
- y[1] = top of base */
- GLfloat r[2], y[2];
- /* positions of end points: beginning, end.
- beg[0] is inner corner of beginning of base, beg[1] is outer corner.
- beg[i][0] is x, [i][1] is z. */
- GLfloat beg[2][2], end[2][2], begNorm, endNorm;
- /* ratio of radius at base vertices to ratio at poles */
- GLfloat longer = 1.0 / cos(M_PI / (glhanoi->numberOfPoles + 1));
-
- r[0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * longer;
- r[1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * longer;
- y[0] = 0;
- y[1] = glhanoi->baseHeight;
-
- /* compute beg, end. Make the ends square. */
- theta = M_PI * 2 / (glhanoi->numberOfPoles + 1);
-
- costh = cos(theta);
- sinth = sin(theta);
- beg[0][0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * costh +
- glhanoi->maxDiskRadius * sinth;
- beg[1][0] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * costh +
- glhanoi->maxDiskRadius * sinth;
- beg[0][1] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * sinth -
- glhanoi->maxDiskRadius * costh;
- beg[1][1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * sinth -
- glhanoi->maxDiskRadius * costh;
- begNorm = theta - M_PI * 0.5;
-
- theta = M_PI * 2 * glhanoi->numberOfPoles / (glhanoi->numberOfPoles + 1);
-
- costh = cos(theta);
- sinth = sin(theta);
- end[0][0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * costh -
- glhanoi->maxDiskRadius * sinth;
- end[1][0] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * costh -
- glhanoi->maxDiskRadius * sinth;
- end[0][1] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * sinth +
- glhanoi->maxDiskRadius * costh;
- end[1][1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * sinth +
- glhanoi->maxDiskRadius * costh;
- endNorm = theta + M_PI * 0.5;
-
- /* bottom: never seen
- polys = drawBaseStrip(glhanoi, 0, 0, 0, 1, y, r, beg, end); */
- /* outside edge */
- polys += drawBaseStrip(glhanoi, 0, 1, 1, 1, y, r, beg, end);
- /* top */
- polys += drawBaseStrip(glhanoi, 1, 1, 1, 0, y, r, beg, end);
- /* inside edge */
- polys += drawBaseStrip(glhanoi, 1, 0, 0, 0, y, r, beg, end);
-
- /* Draw ends */
- glBegin(GL_QUADS);
-
- glVertex3f(beg[0][0], y[1], beg[0][1]);
- glVertex3f(beg[1][0], y[1], beg[1][1]);
- glVertex3f(beg[1][0], y[0], beg[1][1]);
- glVertex3f(beg[0][0], y[0], beg[0][1]);
- glNormal3f(cos(begNorm), 0, sin(begNorm));
-
- glVertex3f(end[0][0], y[0], end[0][1]);
- glVertex3f(end[1][0], y[0], end[1][1]);
- glVertex3f(end[1][0], y[1], end[1][1]);
- glVertex3f(end[0][0], y[1], end[0][1]);
- glNormal3f(cos(endNorm), 0, sin(endNorm));
-
- polys += 2;
-
- glEnd();
-
- return polys;
-}
-
-static int drawDisks(glhcfg *glhanoi)
-{
- int i;
- int polys = 0;
-
- glPushMatrix();
- glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
- for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
- Disk *disk = &glhanoi->disk[i];
- GLfloat *pos = disk->position;
- GLfloat *rot = disk->rotation;
-
- glPushMatrix();
- glTranslatef(pos[0], pos[1], pos[2]);
- if(rot[1] != 0.0) {
- glTranslatef(0.0, glhanoi->diskHeight / 2.0, 0.0);
- /* rotate around different axis depending on phi */
- if (disk->phi != 0.0)
- glRotatef(-disk->phi, 0.0, 1.0, 0.0);
- glRotatef(rot[1], 0.0, 0.0, 1.0);
- if (disk->phi != 0.0)
- glRotatef(disk->phi, 0.0, 1.0, 0.0);
- glTranslatef(0.0, -glhanoi->diskHeight / 2.0, 0.0);
- }
- glCallList(disk->displayList);
- polys += disk->polys;
- glPopMatrix();
- }
- glPopMatrix();
- return polys;
-}
-
-static GLfloat getDiskRadius(glhcfg *glhanoi, int i)
-{
- GLfloat retVal = glhanoi->maxDiskRadius *
- ((GLfloat) i + 3.0) / (glhanoi->numberOfDisks + 3.0);
- return retVal;
-}
-
-static void initData(glhcfg *glhanoi)
-{
- int i;
- GLfloat sinPiOverNP;
-
- glhanoi->baseLength = BASE_LENGTH;
- if (glhanoi->layoutLinear) {
- glhanoi->maxDiskRadius = glhanoi->baseLength /
- (2 * 0.95 * glhanoi->numberOfPoles);
- } else {
- sinPiOverNP = sin(M_PI / (glhanoi->numberOfPoles + 1));
- glhanoi->maxDiskRadius = (sinPiOverNP * glhanoi->baseLength * 0.5 * 0.95) / (1 + sinPiOverNP);
- }
-
- glhanoi->poleDist = glhanoi->baseLength * 0.5 - glhanoi->maxDiskRadius;
- glhanoi->poleRadius = glhanoi->maxDiskRadius / (glhanoi->numberOfDisks + 3.0);
- /* fprintf(stderr, "Debug: baseL = %f, maxDiskR = %f, poleR = %f\n",
- glhanoi->baseLength, glhanoi->maxDiskRadius, glhanoi->poleRadius); */
- glhanoi->baseWidth = 2.0 * glhanoi->maxDiskRadius;
- glhanoi->poleOffset = 2.0 * getDiskRadius(glhanoi, glhanoi->maxDiskIdx);
- glhanoi->diskHeight = 2.0 * glhanoi->poleRadius;
- glhanoi->baseHeight = 2.0 * glhanoi->poleRadius;
- glhanoi->poleHeight = glhanoi->numberOfDisks *
- glhanoi->diskHeight + glhanoi->poleRadius;
- /* numberOfMoves only applies if numberOfPoles = 3 */
- glhanoi->numberOfMoves = (1 << glhanoi->numberOfDisks) - 1;
- /* use golden ratio */
- glhanoi->boardSize = glhanoi->baseLength * 0.5 * (1.0 + sqrt(5.0));
-
- glhanoi->pole = (Pole *)calloc(glhanoi->numberOfPoles, sizeof(Pole));
- checkAllocAndExit(!!glhanoi->pole, "poles");
-
- for(i = 0; i < glhanoi->numberOfPoles; i++) {
- checkAllocAndExit(
- !!(glhanoi->pole[i].data = calloc(glhanoi->numberOfDisks, sizeof(Disk *))),
- "disk stack");
- glhanoi->pole[i].size = glhanoi->numberOfDisks;
- }
- checkAllocAndExit(
- !!(glhanoi->diskPos = calloc(glhanoi->numberOfDisks, sizeof(float))),
- "diskPos");
-
- if (glhanoi->trailQSize) {
- glhanoi->trailQ = (TrailPoint *)calloc(glhanoi->trailQSize, sizeof(TrailPoint));
- checkAllocAndExit(!!glhanoi->trailQ, "trail queue");
- } else glhanoi->trailQ = (TrailPoint *)NULL;
- glhanoi->trailQFront = glhanoi->trailQBack = 0;
-
- glhanoi->the_rotator = make_rotator(0.1, 0.025, 0, 1, 0.005, False);
- /* or glhanoi->the_rotator = make_rotator(0.025, 0.025, 0.025, 0.5, 0.005, False); */
- glhanoi->button_down_p = False;
-
- glhanoi->src = glhanoi->oldsrc = 0;
- glhanoi->tmp = glhanoi->oldtmp = 1;
- glhanoi->dst = glhanoi->olddst = glhanoi->numberOfPoles - 1;
-
- if (glhanoi->numberOfPoles > 3) {
- glhanoi->solveStackSize = glhanoi->numberOfDisks + 2;
- glhanoi->solveStack = (SubProblem *)calloc(glhanoi->solveStackSize, sizeof(SubProblem));
- checkAllocAndExit(!!glhanoi->solveStack, "solving stack");
- glhanoi->solveStackIdx = 0;
- }
-}
-
-static void initView(glhcfg *glhanoi)
-{
- glhanoi->camera[0] = 0.0;
- glhanoi->camera[1] = 0.0;
- glhanoi->camera[2] = 0.0;
- glhanoi->centre[0] = 0.0;
- glhanoi->centre[1] = glhanoi->poleHeight * 3.0;
- glhanoi->centre[2] = 0.0;
-}
-
-/*
- * noise_improved.c - based on ImprovedNoise.java
- * JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
- */
-static double fade(double t)
-{
- return t * t * t * (t * (t * 6 - 15) + 10);
-}
-
-static double grad(int hash, double x, double y, double z)
-{
- int h = hash & 15; /* CONVERT LO 4 BITS OF HASH CODE */
- double u = h < 8 ? x : y, /* INTO 12 GRADIENT DIRECTIONS. */
- v = h < 4 ? y : h == 12 || h == 14 ? x : z;
- return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
-}
-
-static const int permutation[] = { 151, 160, 137, 91, 90, 15,
- 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142,
- 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26,
- 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237,
- 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
- 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60,
- 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143,
- 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
- 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198,
- 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118,
- 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189,
- 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70,
- 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108,
- 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251,
- 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145,
- 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184,
- 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
- 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61,
- 156, 180
-};
-
-static void initNoise(glhcfg *glhanoi)
-{
- int i;
- for(i = 0; i < 256; i++)
- glhanoi->p[256 + i] = glhanoi->p[i] = permutation[i];
-}
-
-static double improved_noise(glhcfg *glhanoi, double x, double y, double z)
-{
- double u, v, w;
- int A, AA, AB, B, BA, BB;
- int X = (int)floor(x) & 255, /* FIND UNIT CUBE THAT */
- Y = (int)floor(y) & 255, /* CONTAINS POINT. */
- Z = (int)floor(z) & 255;
- if(!glhanoi->noise_initted) {
- initNoise(glhanoi);
- glhanoi->noise_initted = 1;
- }
- x -= floor(x); /* FIND RELATIVE X,Y,Z */
- y -= floor(y); /* OF POINT IN CUBE. */
- z -= floor(z);
- u = fade(x), /* COMPUTE FADE CURVES */
- v = fade(y), /* FOR EACH OF X,Y,Z. */
- w = fade(z);
- A = glhanoi->p[X] + Y;
- AA = glhanoi->p[A] + Z;
- AB = glhanoi->p[A + 1] + Z, /* HASH COORDINATES OF */
- B = glhanoi->p[X + 1] + Y;
- BA = glhanoi->p[B] + Z;
- BB = glhanoi->p[B + 1] + Z; /* THE 8 CUBE CORNERS, */
- return lerp(w, lerp(v, lerp(u, grad(glhanoi->p[AA], x, y, z),/* AND ADD */
- grad(glhanoi->p[BA], x - 1, y, z)),/* BLENDED */
- lerp(u, grad(glhanoi->p[AB], x, y - 1, z),/* RESULTS */
- grad(glhanoi->p[BB], x - 1, y - 1, z))),/* FROM 8 CORNERS */
- lerp(v, lerp(u, grad(glhanoi->p[AA + 1], x, y, z - 1), grad(glhanoi->p[BA + 1], x - 1, y, z - 1)), /* OF CUBE */
- lerp(u, grad(glhanoi->p[AB + 1], x, y - 1, z - 1),
- grad(glhanoi->p[BB + 1], x - 1, y - 1, z - 1))));
-}
-
-/*
- * end noise_improved.c - based on ImprovedNoise.java
- */
-
-struct tex_col_t {
- GLuint *colours;
- /* GLfloat *points; */
- unsigned int ncols;
-};
-typedef struct tex_col_t tex_col_t;
-
-static GLubyte *makeTexture(glhcfg *glhanoi, int x_size, int y_size, int z_size,
- GLuint(*texFunc) (glhcfg *, double, double, double,
- tex_col_t *), tex_col_t * colours)
-{
- int i, j, k;
- GLuint *textureData;
- GLuint *texturePtr;
- double x, y, z;
- double xi, yi, zi;
-
- /* As we use GL_RGBA format, we must assign 4 bytes per element */
- if((textureData =
- calloc(x_size * y_size * z_size, sizeof(*texturePtr))) == NULL) {
- return NULL;
- }
-
- xi = 1.0 / x_size;
- yi = 1.0 / y_size;
- zi = 1.0 / z_size;
-
- z = 0.0;
- texturePtr = textureData;
- for(k = 0; k < z_size; k++, z += zi) {
- y = 0.0;
- for(j = 0; j < y_size; j++, y += yi) {
- x = 0.0;
- for(i = 0; i < x_size; i++, x += xi) {
- *texturePtr = texFunc(glhanoi, x, y, z, colours);
- ++texturePtr;
- }
- }
- }
- return (GLubyte *)textureData;
-}
-
-static void freeTexCols(tex_col_t*p)
-{
- free(p->colours);
- free(p);
-}
-
-static tex_col_t *makeMarbleColours(void)
-{
- tex_col_t *marbleColours;
- int ncols = 2;
-
- marbleColours = malloc(sizeof(tex_col_t));
- if(marbleColours == NULL) return NULL;
- marbleColours->colours = calloc(sizeof(GLuint), ncols);
- if(marbleColours->colours == NULL) return NULL;
- marbleColours->ncols = ncols;
-
- marbleColours->colours[0] = 0x3f3f3f3f;
- marbleColours->colours[1] = 0xffffffff;
-
- return marbleColours;
-}
-
-static double turb(glhcfg *glhanoi, double x, double y, double z, int octaves)
-{
- int oct, freq = 1;
- double r = 0.0;
-
- for(oct = 0; oct < octaves; ++oct) {
- r += fabs(improved_noise(glhanoi, freq * x, freq * y, freq * z)) / freq;
- freq <<= 1;
- }
- return r / 2.0;
-}
-
-static void perturb(glhcfg *glhanoi, double *x, double *y, double *z, double scale)
-{
- double t = scale * turb(glhanoi, *x, *y, *z, 4);
- *x += t;
- *y += t;
- *z += t;
-}
-
-static double f_m(double x, double y, double z)
-{
- return sin(3.0 * M_PI * x);
-}
-
-static GLuint C_m(double x, const tex_col_t * tex_cols)
-{
- int r = tex_cols->colours[0] & 0xff;
- int g = tex_cols->colours[0] >> 8 & 0xff;
- int b = tex_cols->colours[0] >> 16 & 0xff;
- double factor;
- int r1, g1, b1;
- x = x - floor(x);
-
- factor = (1.0 + sin(2.0 * M_PI * x)) / 2.0;
-
- r1 = (tex_cols->colours[1] & 0xff);
- g1 = (tex_cols->colours[1] >> 8 & 0xff);
- b1 = (tex_cols->colours[1] >> 16 & 0xff);
-
- r += (int)(factor * (r1 - r));
- g += (int)(factor * (g1 - g));
- b += (int)(factor * (b1 - b));
-
- return 0xff000000 | (b << 16) | (g << 8) | r;
-}
-
-
-static GLuint makeMarbleTexture(glhcfg *glhanoi, double x, double y, double z, tex_col_t * colours)
-{
- perturb(glhanoi, &x, &y, &z, MARBLE_SCALE);
- return C_m(f_m(x, y, z), colours);
-}
-
-static void setTexture(glhcfg *glhanoi, int n)
-{
- glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[n]);
-}
-
-/* returns 1 on failure, 0 on success */
-static int makeTextures(glhcfg *glhanoi)
-{
- GLubyte *marbleTexture;
- tex_col_t *marbleColours;
-
- glGenTextures(N_TEXTURES, glhanoi->textureNames);
-
- if((marbleColours = makeMarbleColours()) == NULL) {
- return 1;
- }
- if((marbleTexture =
- makeTexture(glhanoi, MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 1,
- makeMarbleTexture, marbleColours)) == NULL) {
- return 1;
- }
-
- glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[0]);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, marbleTexture);
- free(marbleTexture);
- freeTexCols(marbleColours);
-
- return 0;
-}
-
-static void initFloor(glhcfg *glhanoi)
-{
- int i, j;
- float tileSize = glhanoi->boardSize / BOARD_SQUARES;
- float x0, x1, z0, z1;
- float tx0, tx1, tz0, tz1;
- const float *col = cWhite;
- float texIncr = 1.0 / BOARD_SQUARES;
-
- glhanoi->floorpolys = 0;
- checkAllocAndExit(!!(glhanoi->floorList = glGenLists(1)), "floor display list");
- glNewList(glhanoi->floorList, GL_COMPILE);
- x0 = -glhanoi->boardSize / 2.0;
- tx0 = 0.0f;
- setMaterial(col, cWhite, 128);
- setTexture(glhanoi, 0);
- glNormal3fv(up);
- for(i = 0; i < BOARD_SQUARES; i++, x0 += tileSize, tx0 += texIncr) {
- x1 = x0 + tileSize;
- tx1 = tx0 + texIncr;
- z0 = -glhanoi->boardSize / 2.0;
- tz0 = 0.0f;
- for(j = 0; j < BOARD_SQUARES; j++, z0 += tileSize, tz0 += texIncr) {
- int colIndex = (i + j) & 0x1;
-
- z1 = z0 + tileSize;
- tz1 = tz0 + texIncr;
-
- if(colIndex)
- col = cWhite;
- else
- col = cBlack;
-
- setMaterial(col, cWhite, 100);
-
- glBegin(GL_QUADS);
-
- glTexCoord2d(tx0, tz0);
- glVertex3f(x0, 0.0, z0);
-
- glTexCoord2d(tx0, tz1);
- glVertex3f(x0, 0.0, z1);
-
- glTexCoord2d(tx1, tz1);
- glVertex3f(x1, 0.0, z1);
-
- glTexCoord2d(tx1, tz0);
- glVertex3f(x1, 0.0, z0);
- glhanoi->floorpolys++;
- glEnd();
- }
- }
- glEndList();
-}
-
-static void initBase(glhcfg *glhanoi)
-{
- checkAllocAndExit(!!(glhanoi->baseList = glGenLists(1)), "tower bases display list");
-
- glNewList(glhanoi->baseList, GL_COMPILE);
- setMaterial(baseColor, cWhite, 50);
- if (glhanoi->layoutLinear) {
- glhanoi->basepolys = drawCuboid(glhanoi->baseLength, glhanoi->baseWidth,
- glhanoi->baseHeight);
- } else {
- glhanoi->basepolys = drawRoundBase(glhanoi);
- }
- glEndList();
-}
-
-static void initTowers(glhcfg *glhanoi)
-{
- int i;
-
- checkAllocAndExit(!!(glhanoi->poleList = glGenLists(1)), "poles display list\n");
-
- glNewList(glhanoi->poleList, GL_COMPILE);
- /* glTranslatef(-glhanoi->poleOffset * (glhanoi->numberOfPoles - 1.0f) * 0.5f, glhanoi->baseHeight, 0.0f); */
- setMaterial(poleColor, cWhite, 50);
- for (i = 0; i < glhanoi->numberOfPoles; i++) {
- GLfloat *p = glhanoi->pole[i].position;
- GLfloat rad = (M_PI * 2.0 * (i + 1)) / (glhanoi->numberOfPoles + 1);
-
- p[1] = glhanoi->baseHeight;
-
- if (glhanoi->layoutLinear) {
- /* Linear: */
- p[0] = -glhanoi->poleOffset * ((glhanoi->numberOfPoles - 1) * 0.5f - i);
- p[2] = 0.0f;
- } else {
- /* Circular layout: */
- p[0] = cos(rad) * glhanoi->poleDist;
- p[2] = sin(rad) * glhanoi->poleDist;
- }
-
- glPushMatrix();
- glTranslatef(p[0], p[1], p[2]);
- glhanoi->polepolys = drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
- glPopMatrix();
-
- }
- glEndList();
-}
-
-/* Parameterized hue based on input 0.0 - 1.0. */
-static double cfunc(double x)
-{
-#define COMP <
- if(x < 2.0 / 7.0) {
- return (1.0 / 12.0) / (1.0 / 7.0) * x;
- }
- if(x < 3.0 / 7.0) {
- /* (7x - 1) / 6 */
- return (1.0 + 1.0 / 6.0) * x - 1.0 / 6.0;
- }
- if(x < 4.0 / 7.0) {
- return (2.0 + 1.0 / 3.0) * x - 2.0 / 3.0;
- }
- if(x < 5.0 / 7.0) {
- return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
- }
- return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
-}
-
-static void initDisks(glhcfg *glhanoi)
-{
- int i;
- glhanoi->disk = (Disk *) calloc(glhanoi->numberOfDisks, sizeof(Disk));
- checkAllocAndExit(!!glhanoi->disk, "disks");
-
- for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
- GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
- double f = cfunc((GLfloat) i / (GLfloat) glhanoi->numberOfDisks);
- GLfloat diskColor = f * 360.0;
- GLfloat color[3];
- Disk *disk = &glhanoi->disk[i];
-
- disk->id = i;
- disk->position[0] = glhanoi->pole[0].position[0]; /* -glhanoi->poleOffset * (glhanoi->numberOfPoles - 1.0f) * 0.5; */
- disk->position[1] = glhanoi->diskHeight * height;
- disk->position[2] = glhanoi->pole[0].position[2];
- disk->rotation[0] = 0.0;
- disk->rotation[1] = 0.0;
- disk->rotation[2] = 0.0;
- disk->polys = 0;
-
- /* make smaller disks move faster */
- disk->speed = lerp(((double)glhanoi->numberOfDisks - i) / glhanoi->numberOfDisks,
- 1.0, glhanoi->speed);
- /* fprintf(stderr, "disk id: %d, alpha: %0.2f, speed: %0.2f\n", disk->id,
- ((double)(glhanoi->maxDiskIdx - i)) / glhanoi->numberOfDisks, disk->speed); */
-
- color[0] = diskColor;
- color[1] = 1.0f;
- color[2] = 1.0f;
- HSVtoRGBv(color, color);
-
- checkAllocAndExit(!!(disk->displayList = glGenLists(1)), "disk display list");
- glNewList(disk->displayList, GL_COMPILE);
- setMaterial(color, cWhite, 100.0);
- disk->polys += drawDisk3D(glhanoi->poleRadius,
- getDiskRadius(glhanoi, i),
- glhanoi->diskHeight);
- /*fprintf(stderr, "Debug: disk %d has radius %f\n", i,
- getDiskRadius(glhanoi, i)); */
- glEndList();
- }
- for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
- GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
- int h = glhanoi->maxDiskIdx - i;
- glhanoi->diskPos[h] = glhanoi->diskHeight * height;
- push(glhanoi, glhanoi->src, &glhanoi->disk[i]);
- }
-}
-
-static void initLights(Bool state)
-{
- if(state) {
- glLightfv(GL_LIGHT0, GL_POSITION, pos0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
-
- glLightfv(GL_LIGHT1, GL_POSITION, pos1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, amb1);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
- glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- } else {
- glDisable(GL_LIGHTING);
- }
-}
-
-static int drawFloor(glhcfg *glhanoi)
-{
- glCallList(glhanoi->floorList);
- return glhanoi->floorpolys;
-}
-
-static int drawTowers(glhcfg *glhanoi)
-{
- glCallList(glhanoi->baseList);
- glCallList(glhanoi->poleList);
- return glhanoi->basepolys + glhanoi->polepolys;
-}
-
-static int drawTrails1(glhcfg *glhanoi, double t, double thickness, double alpha) {
- int i, prev = -1, lines = 0;
- Bool fresh = False;
- GLfloat trailDurInv = 1.0f / glhanoi->trailDuration;
-
- glLineWidth(thickness);
-
- glBegin(GL_LINES);
-
- for (i = glhanoi->trailQFront;
- i != glhanoi->trailQBack;
- i = normalizeQ(i + 1)) {
- TrailPoint *tqi = &(glhanoi->trailQ[i]);
-
- if (!fresh && t > tqi->endTime) {
- glhanoi->trailQFront = normalizeQ(i + 1);
- } else {
- if (tqi->startTime > t) break;
- /* Found trails that haven't timed out. */
- if (!fresh) fresh = True;
- if (prev > -1) {
- /* Fade to invisible with age */
- trailColor[3] = alpha * (tqi->endTime - t) * trailDurInv;
- /* Can't use setMaterial(trailColor, cBlack, 0) because our color needs an alpha value. */
- glColor4fv(trailColor);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, trailColor);
- /* FUTURE: to really do this right, trails should be drawn in back-to-front
- order, so that blending is done correctly.
- Currently it looks poor when a faded trail is in front of, or coincident with,
- a bright trail but is drawn first.
- I think for now it's good enough to recommend shorter trails so they
- never/rarely overlap.
- A jitter per trail arc would also mitigate this problem, to a lesser degree. */
- glVertex3fv(glhanoi->trailQ[prev].position);
- glVertex3fv(glhanoi->trailQ[i].position);
- lines++;
- }
- if (glhanoi->trailQ[i].isEnd)
- prev = -1;
- else
- prev = i;
- }
- }
-
- glEnd();
-
- return lines;
-}
-
-static int drawTrails(glhcfg *glhanoi) {
- int lines = 0;
- double t = getTime();
-
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glMaterialfv(GL_FRONT, GL_SPECULAR, cBlack);
- glMateriali(GL_FRONT, GL_SHININESS, 0);
-
- /* Draw them twice, with different widths and opacities, to make them smoother. */
- lines = drawTrails1(glhanoi, t, 1.0, 0.75);
- lines += drawTrails1(glhanoi, t, 2.5, 0.5);
-
- glDisable (GL_BLEND);
-
- /* fprintf(stderr, "Drew trails: %d lines\n", lines); */
- return lines;
-}
-
-/* Window management, etc
- */
-ENTRYPOINT void reshape_glhanoi(ModeInfo * mi, int width, int height)
-{
- glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
- double h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *glhanoi->glx_context);
-
- glViewport(0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(30.0, 1/h, 1.0,
- 2 * MAX_CAMERA_RADIUS);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-ENTRYPOINT void init_glhanoi(ModeInfo * mi)
-{
- glhcfg *glhanoi;
- MI_INIT(mi, glhanoi_cfg);
-
- glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
- glhanoi->glx_context = init_GL(mi);
- glhanoi->numberOfDisks = MI_BATCHCOUNT(mi);
-
- if (glhanoi->numberOfDisks <= 1)
- glhanoi->numberOfDisks = 3 + (int) BELLRAND(9);
-
- /* magicnumber is a bitfield, so we can't have more than 31 discs
- on a system with 4-byte ints. */
- if (glhanoi->numberOfDisks >= 8 * sizeof(int))
- glhanoi->numberOfDisks = (8 * sizeof(int)) - 1;
-
- glhanoi->maxDiskIdx = glhanoi->numberOfDisks - 1;
-
- glhanoi->numberOfPoles = get_integer_resource(MI_DISPLAY(mi), "poles", "Integer");
- /* Set a number of poles from 3 to numberOfDisks + 1, biased toward lower values,
- with probability decreasing linearly. */
- if (glhanoi->numberOfPoles <= 2)
- glhanoi->numberOfPoles = 3 +
- (int)((1 - sqrt(frand(1.0))) * (glhanoi->numberOfDisks - 1));
-
- glhanoi->wire = MI_IS_WIREFRAME(mi);
-
-# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
- glhanoi->wire = 0;
-# endif
-
- glhanoi->light = light;
- glhanoi->fog = fog;
- glhanoi->texture = texture;
- glhanoi->speed = speed;
- glhanoi->trailDuration = trails;
- /* set trailQSize based on 60 fps (a maximum, more or less) */
- /* FUTURE: Should clamp framerate to 60 fps? See flurry.c's draw_flurry().
- The only bad effect if we don't is that trail-ends could
- show "unnatural" pauses at high fps. */
- glhanoi->trailQSize = (int)(trails * 60.0);
-
- reshape_glhanoi(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if(glhanoi->wire) {
- glhanoi->light = False;
- glhanoi->fog = False;
- glhanoi->texture = False;
- }
-
- initLights(!glhanoi->wire && glhanoi->light);
- checkAllocAndExit(!makeTextures(glhanoi), "textures\n");
-
- /* Choose linear or circular layout. Could make this a user option. */
- glhanoi->layoutLinear = (glhanoi->numberOfPoles == 3);
-
- initData(glhanoi);
- initView(glhanoi);
- initFloor(glhanoi);
- initBase(glhanoi);
- initTowers(glhanoi);
- initDisks(glhanoi);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
- glShadeModel(GL_SMOOTH);
- if(glhanoi->fog) {
- glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], 1.0);
- glFogi(GL_FOG_MODE, GL_LINEAR);
- glFogfv(GL_FOG_COLOR, fogcolor);
- glFogf(GL_FOG_DENSITY, 0.35f);
- glHint(GL_FOG_HINT, GL_NICEST);
- glFogf(GL_FOG_START, MIN_CAMERA_RADIUS);
- glFogf(GL_FOG_END, MAX_CAMERA_RADIUS / 1.9);
- glEnable(GL_FOG);
- }
-
- glhanoi->duration = START_DURATION;
- changeState(glhanoi, START);
-}
-
-ENTRYPOINT void draw_glhanoi(ModeInfo * mi)
-{
- glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- if(!glhanoi->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *glhanoi->glx_context);
-
- glPolygonMode(GL_FRONT, glhanoi->wire ? GL_LINE : GL_FILL);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- mi->polygon_count = 0;
-
- glLoadIdentity();
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- update_glhanoi(glhanoi);
- updateView(glhanoi);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- if(!glhanoi->wire && glhanoi->texture) {
- glEnable(GL_TEXTURE_2D);
- }
- mi->polygon_count += drawFloor(glhanoi);
- glDisable(GL_TEXTURE_2D);
-
- mi->polygon_count += drawTowers(glhanoi);
- mi->polygon_count += drawDisks(glhanoi);
-
- if (glhanoi->trailQSize) {
- /* No polygons, just lines. So ignore the return count. */
- (void)drawTrails(glhanoi);
- }
-
- if(mi->fps_p) {
- do_fps(mi);
- }
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-ENTRYPOINT Bool glhanoi_handle_event(ModeInfo * mi, XEvent * event)
-{
- glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
-
- /* #### this is all wrong on iOS -- should be using gltrackball. */
-
- if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
- glhanoi->button_down_p = True;
- glhanoi->drag_x = event->xbutton.x;
- glhanoi->drag_y = event->xbutton.y;
- return True;
- } else if(event->xany.type == ButtonRelease
- && event->xbutton.button == Button1) {
- glhanoi->button_down_p = False;
- return True;
- } else if(event->xany.type == ButtonPress &&
- (event->xbutton.button == Button4
- || event->xbutton.button == Button5)) {
- switch (event->xbutton.button) {
- case Button4:
- glhanoi->camera[2] += 0.01;
- break;
- case Button5:
- glhanoi->camera[2] -= 0.01;
- break;
- default:
- fprintf(stderr,
- "glhanoi: unknown button in mousewheel handler\n");
- }
- return True;
- } else if(event->xany.type == MotionNotify
- && glhanoi_cfg->button_down_p) {
- int x_diff, y_diff;
-
- x_diff = event->xbutton.x - glhanoi->drag_x;
- y_diff = event->xbutton.y - glhanoi->drag_y;
-
- glhanoi->camera[0] = (float)x_diff / (float)MI_WIDTH(mi);
- glhanoi->camera[1] = (float)y_diff / (float)MI_HEIGHT(mi);
-
- return True;
- }
-#if 0 /* #### doesn't work */
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- changeState(glhanoi, START);
- return True;
- }
-#endif
- return False;
-}
-
-ENTRYPOINT void free_glhanoi(ModeInfo * mi)
-{
- glhcfg *glh = &glhanoi_cfg[MI_SCREEN(mi)];
- int i;
- int j;
-
- if (!glh->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *glh->glx_context);
-
- free_rotator (glh->the_rotator);
- if (glh->pole) {
- for (i = 0; i < glh->numberOfPoles; i++)
- if (glh->pole[i].data) free (glh->pole[i].data);
- free (glh->pole);
- }
- if (glh->diskPos) free (glh->diskPos);
- if (glh->trailQ) free (glh->trailQ);
- if (glh->solveStack) free (glh->solveStack);
-
- glDeleteLists(glh->floorList, 1);
- glDeleteLists(glh->baseList, 1);
- glDeleteLists(glh->poleList, 1);
- glDeleteLists(glh->textureNames[0], 2);
- for(j = 0; j < glh->numberOfDisks; ++j) {
- glDeleteLists(glh->disk[j].displayList, 1);
- }
- free(glh->disk);
- glDeleteTextures (N_TEXTURES, glh->textureNames);
-}
-
-XSCREENSAVER_MODULE ("GLHanoi", glhanoi)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/glhanoi.man b/hacks/glx/glhanoi.man
deleted file mode 100644
index a1e517a..0000000
--- a/hacks/glx/glhanoi.man
+++ /dev/null
@@ -1,83 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glhanoi \- OpenGL Towers of Hanoi
-.SH SYNOPSIS
-.B glhanoi
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-count \fInumber\fP]
-[\-poles \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-wireframe]
-[\-light]
-[\-texture]
-[\-fog]
-[\-fps]
-.SH DESCRIPTION
-Implementation of Towers of Hanoi in OpenGL
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-count \fInumber\fP
-Number of disks. Default: 7.
-.TP 8
-.B \-poles \fInumber\fP
-Number of poles. Default: random from 3 to disks+1.
-.TP 8
-.B \-speed \fInumber\fP
-Speed multiplier (for smallest disks). Default: 1.
-.TP 8
-.B \-trails \fInumber\fP
-Length of disk trails, in seconds. Default: 2.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fog | \-no-fog
-Render in fog.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-light | -no-light
-Whether the scene is lit.
-.TP 8
-.B \-texture | \-no-texture
-Render with textures instead of solid.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2004 by Dave Atkinson. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Dave Atkinson.
diff --git a/hacks/glx/glknots.c b/hacks/glx/glknots.c
deleted file mode 100644
index 5bcb97f..0000000
--- a/hacks/glx/glknots.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/* glknots, Copyright (c) 2003-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * Generates some 3D knots (closed loops).
- * Inspired by Paul Bourke <pbourke@swin.edu.au> at
- * http://astronomy.swin.edu.au/~pbourke/curves/knot/
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_knot 0
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_SPIN "XYZ"
-#define DEF_WANDER "True"
-#define DEF_SPEED "1.0"
-#define DEF_THICKNESS "0.3"
-#define DEF_SEGMENTS "800"
-#define DEF_DURATION "8"
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
-
- GLuint knot_list;
-
- int ncolors;
- XColor *colors;
- int ccolor;
-
- int mode; /* 0 = normal, 1 = out, 2 = in */
- int mode_tick;
- Bool clear_p;
-
- time_t last_time;
- int draw_tick;
-
-} knot_configuration;
-
-static knot_configuration *bps = NULL;
-
-static char *do_spin;
-static GLfloat speed;
-static Bool do_wander;
-static GLfloat thickness;
-static unsigned int segments;
-static int duration;
-
-static XrmOptionDescRec opts[] = {
- { "-spin", ".spin", XrmoptionSepArg, 0 },
- { "+spin", ".spin", XrmoptionNoArg, "" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-thickness", ".thickness", XrmoptionSepArg, 0 },
- { "-segments", ".segments", XrmoptionSepArg, 0 },
- { "-duration", ".duration", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
- {&segments, "segments", "Segments", DEF_SEGMENTS, t_Int},
- {&duration, "duration", "Duration", DEF_DURATION, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt knot_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static void
-make_knot (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
-
- GLfloat diam = (4 * thickness);
- int faces = (wire ? 3 : 6);
-
- unsigned int i;
- double x, y, z, ox=0, oy=0, oz=0;
- double mu;
-
- double p[9];
-
- Bool blobby_p = (0 == (random() % 5));
- Bool type = (random() % 2);
-
- for (i = 0; i < countof(p); i++)
- {
- p[i] = 1 + (random() % 4);
- if (! (random() % 3))
- p[i] += (random() % 5);
- }
-
- if (type == 1)
- {
- p[0] += 4;
- p[1] *= ((p[0] + p[0]) / 10);
- blobby_p = False;
- }
-
- mi->polygon_count = 0;
-
- for (i = 0; i <= segments; i++)
- {
- if (type == 0)
- {
- mu = i * (M_PI * 2) / segments;
- x = 10 * (cos(mu) + cos(p[0]*mu)) + cos(p[1]*mu) + cos(p[2]*mu);
- y = 6 * sin(mu) + 10 * sin(p[3]*mu);
- z = 16 * sin(p[4]*mu) * sin(p[5]*mu/2) + p[6]*sin(p[7]*mu) -
- 2 * sin(p[8]*mu);
- }
- else if (type == 1)
- {
- mu = i * (M_PI * 2) * p[0] / (double) segments;
- x = 10 * cos(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
- y = 25 * sin(p[1] * mu / p[0]) / 2.0;
- z = 10 * sin(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
- }
- else
- abort();
-
- if (i != 0)
- {
- GLfloat dist = sqrt ((x-ox)*(x-ox) +
- (y-oy)*(y-oy) +
- (z-oz)*(z-oz));
- GLfloat di;
- if (!blobby_p)
- di = diam;
- else
- {
- di = dist * (segments / 500.0);
- di = (di * di * 3);
- }
-
- mi->polygon_count += tube (ox, oy, oz,
- x, y, z,
- di, dist/3,
- faces, True, wire, wire);
- }
-
- ox = x;
- oy = y;
- oz = z;
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_knot (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-new_knot (ModeInfo *mi)
-{
- knot_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
-
- bp->clear_p = !!(random() % 15);
-
- bp->ncolors = 128;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- bp->colors, &bp->ncolors,
- False, 0, False);
-
- for (i = 0; i < bp->ncolors; i++)
- {
- /* make colors twice as bright */
- bp->colors[i].red = (bp->colors[i].red >> 2) + 0x7FFF;
- bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
- bp->colors[i].blue = (bp->colors[i].blue >> 2) + 0x7FFF;
- }
-
- glNewList (bp->knot_list, GL_COMPILE);
- make_knot (mi);
- glEndList ();
-}
-
-
-ENTRYPOINT Bool
-knot_handle_event (ModeInfo *mi, XEvent *event)
-{
- knot_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- bp->last_time = 1;
- return True;
- }
-
- return False;
-}
-
-
-
-ENTRYPOINT void
-init_knot (ModeInfo *mi)
-{
- knot_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- if (thickness <= 0) thickness = 0.001;
- else if (thickness > 1) thickness = 1;
-
- if (segments < 10) segments = 10;
-
- reshape_knot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- if (!wire)
- {
- GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
- GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- {
- Bool spinx=False, spiny=False, spinz=False;
- double spin_speed = 2.0;
- double wander_speed = 0.05;
- double spin_accel = 0.2;
-
- char *s = do_spin;
- while (*s)
- {
- if (*s == 'x' || *s == 'X') spinx = True;
- else if (*s == 'y' || *s == 'Y') spiny = True;
- else if (*s == 'z' || *s == 'Z') spinz = True;
- else if (*s == '0') ;
- else
- {
- fprintf (stderr,
- "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
- progname, do_spin);
- exit (1);
- }
- s++;
- }
-
- bp->rot = make_rotator (spinx ? spin_speed : 0,
- spiny ? spin_speed : 0,
- spinz ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- (spinx && spiny && spinz));
- bp->trackball = gltrackball_init (True);
- }
-
- bp->knot_list = glGenLists (1);
- new_knot(mi);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-ENTRYPOINT void
-draw_knot (ModeInfo *mi)
-{
- knot_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-
- GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
- GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat bshiny = 128.0;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (bp->mode == 0)
- {
- if (bp->draw_tick++ > 10)
- {
- time_t now = time((time_t *) 0);
- if (bp->last_time == 0) bp->last_time = now;
- bp->draw_tick = 0;
- if (!bp->button_down_p &&
- now - bp->last_time >= duration)
- {
- bp->mode = 1; /* go out */
- bp->mode_tick = 10 / speed;
- bp->last_time = now;
- }
- }
- }
- else if (bp->mode == 1) /* out */
- {
- if (--bp->mode_tick <= 0)
- {
- new_knot (mi);
- bp->mode_tick = 10 / speed;
- bp->mode = 2; /* go in */
- }
- }
- else if (bp->mode == 2) /* in */
- {
- if (--bp->mode_tick <= 0)
- bp->mode = 0; /* normal */
- }
- else
- abort();
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- if (bp->clear_p)
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- {
- double x, y, z;
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 15);
-
- gltrackball_rotate (bp->trackball);
-
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
-
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- glRotatef (z * 360, 0.0, 0.0, 1.0);
- }
-
- bcolor[0] = bp->colors[bp->ccolor].red / 65536.0;
- bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
- bcolor[2] = bp->colors[bp->ccolor].blue / 65536.0;
- bp->ccolor++;
- if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
-
- glScalef(0.25, 0.25, 0.25);
-
- if (bp->mode != 0)
- {
- GLfloat s = (bp->mode == 1
- ? bp->mode_tick / (10 / speed)
- : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
- glScalef (s, s, s);
- }
-
- glCallList (bp->knot_list);
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_knot (ModeInfo *mi)
-{
- knot_configuration *bp = &bps[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->trackball) gltrackball_free (bp->trackball);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->colors) free (bp->colors);
- if (glIsList(bp->knot_list)) glDeleteLists(bp->knot_list, 1);
-}
-
-XSCREENSAVER_MODULE_2 ("GLKnots", glknots, knot)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/glknots.man b/hacks/glx/glknots.man
deleted file mode 100644
index 8443963..0000000
--- a/hacks/glx/glknots.man
+++ /dev/null
@@ -1,81 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glknots \- generates some twisting 3d knot patterns
-.SH SYNOPSIS
-.B glknots
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fIfloat\fP]
-[\-segments \fIint\fP]
-[\-thickness \fIfloat\fP]
-[\-duration \fIseconds\fP]
-[\-no-wander]
-[\-spin \fIXYZ\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Generates some twisting 3d knot patterns. Spins 'em around.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
-.TP 8
-.B \-speed \fInumber\fP
-Larger numbers mean run faster. Default: 1.0.
-.TP 8
-.B \-segments \fInumber\fP
-Number of segments in each path. Default 800. Larger numbers make the
-curves smoother, at the expense of a higher polygon count.
-.TP 8
-.B \-thickness \fIfloat\fP
-How thick the tubes should be. Default 0.3.
-.TP 8
-.B \-duration \fIseconds\fP
-How long to leave each knot up. Default 8 seconds.
-.TP 8
-.B \-wander | \-no-wander
-Whether the cubes should wander around the screen.
-.TP 8
-.B \-spin [XYZ] | \-no-spin
-Which axes, if any, to spin around on.
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/gllist.c b/hacks/glx/gllist.c
deleted file mode 100644
index 342e381..0000000
--- a/hacks/glx/gllist.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "gllist.h"
-
-void
-renderList (const struct gllist *list, int wire_p)
-{
- while (list)
- {
- if (!wire_p || list->primitive == GL_LINES ||
- list->primitive == GL_POINTS)
- {
- glInterleavedArrays (list->format, 0, list->data);
- glDrawArrays (list->primitive, 0, list->points);
- }
- else
- {
- /* For wireframe, do it the hard way: treat every tuple of
- points as its own line loop.
- */
- const GLfloat *p = (GLfloat *) list->data;
- int i, j, tick, skip, stride;
-
- switch (list->primitive) {
- case GL_QUADS: tick = 4; break;
- case GL_TRIANGLES: tick = 3; break;
- default: abort(); break; /* write me */
- }
-
- switch (list->format) {
- case GL_C3F_V3F: case GL_N3F_V3F: skip = 3; stride = 6; break;
- default: abort(); break; /* write me */
- }
-
- glBegin (GL_LINE_LOOP);
- for (i = 0, j = skip;
- i < list->points;
- i++, j += stride)
- {
- if (i && !(i % tick))
- {
- glEnd();
- glBegin (GL_LINE_LOOP);
- }
- glVertex3f (p[j], p[j+1], p[j+2]);
- }
- glEnd();
- }
- list = list->next;
- }
-}
-
-
-void
-renderListNormals (const struct gllist *list, GLfloat length, int faces_p)
-{
- while (list)
- {
- const GLfloat *p = (GLfloat *) list->data;
- int i, j, tick, skip, stride;
- GLfloat v[3], n[3];
-
- if (list->primitive == GL_LINES) continue;
-
- if (! faces_p)
- tick = 1;
- else
- switch (list->primitive) {
- case GL_QUADS: tick = 4; break;
- case GL_TRIANGLES: tick = 3; break;
- default: abort(); break; /* write me */
- }
-
- switch (list->format) {
- case GL_N3F_V3F: skip = 0; stride = 6; break;
- case GL_C3F_V3F: continue; break;
- default: abort(); break; /* write me */
- }
-
- v[0] = v[1] = v[2] = 0;
- n[0] = n[1] = n[2] = 0;
-
- for (i = 0, j = skip;
- i <= list->points;
- i++, j += stride)
- {
- if (i && !(i % tick))
- {
- n[0] /= tick;
- n[1] /= tick;
- n[2] /= tick;
- v[0] /= tick;
- v[1] /= tick;
- v[2] /= tick;
- glPushMatrix();
- glTranslatef (v[0], v[1], v[2]);
- glScalef (length, length, length);
- glBegin (GL_LINES);
- glVertex3f (0, 0, 0);
- glVertex3f (n[0], n[1], n[2]);
- glEnd();
- glPopMatrix();
- v[0] = v[1] = v[2] = 0;
- n[0] = n[1] = n[2] = 0;
- }
-
- if (i == list->points) break;
- n[0] += p[j];
- n[1] += p[j+1];
- n[2] += p[j+2];
- v[0] += p[j+3];
- v[1] += p[j+4];
- v[2] += p[j+5];
-
- }
- list = list->next;
- }
-}
diff --git a/hacks/glx/gllist.h b/hacks/glx/gllist.h
deleted file mode 100644
index 3bb2a25..0000000
--- a/hacks/glx/gllist.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* xscreensaver, Copyright (c) 1998-2021 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __GLLIST_H__
-#define __GLLIST_H__
-
-#include "xlockmoreI.h"
-
-struct gllist
-{
- GLenum format;
- GLenum primitive;
- int points;
- const void *data;
- struct gllist *next;
-};
-
-void renderList (const struct gllist *, int wire_p);
-void renderListNormals (const struct gllist *, GLfloat length, int facesp);
-
-#endif /* __GLLIST_H__ */
diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c
deleted file mode 100644
index 4087ec1..0000000
--- a/hacks/glx/glmatrix.c
+++ /dev/null
@@ -1,1076 +0,0 @@
-/* glmatrix, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * GLMatrix -- simulate the text scrolls from the movie "The Matrix".
- *
- * This program does a 3D rendering of the dropping characters that
- * appeared in the title sequences of the movies. See also `xmatrix'
- * for a simulation of what the computer monitors actually *in* the
- * movie did.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-# define release_matrix 0
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-#include "xlockmore.h"
-#include "ximage-loader.h"
-
-#include "images/gen/matrix3_png.h"
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPEED "1.0"
-#define DEF_DENSITY "20"
-#define DEF_CLOCK "False"
-#define DEF_FOG "True"
-#define DEF_WAVES "True"
-#define DEF_ROTATE "True"
-#define DEF_TEXTURE "True"
-#define DEF_MODE "Matrix"
-#define DEF_TIMEFMT " %l%M%p "
-
-
-#define CHAR_COLS 16
-#define CHAR_ROWS 13
-
-static const int matrix_encoding[] = {
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
-# if 0
- 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 201, 202, 203, 204, 205, 206, 207
-# else
- 160, 161, 162, 163, 164, 165, 166, 167,
- 168, 169, 170, 171, 172, 173, 174, 175
-# endif
- };
-static const int decimal_encoding[] = {
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
-static const int hex_encoding[] = {
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 33, 34, 35, 36, 37, 38 };
-static const int binary_encoding[] = { 16, 17 };
-static const int dna_encoding[] = { 33, 35, 39, 52 };
-
-static const unsigned char char_map[256] = {
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 0 */
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 16 */
- 0, 1, 2, 96, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 32 */
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 48 */
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 64 */
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 80 */
- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 96 */
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 112 */
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 128 */
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 144 */
- 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 160 */
- 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 176 */
- 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 192 */
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 208 */
-#if 0
- 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, /* 224 */
- 176,177,178,195,180,181,182,183,184,185,186,187,188,189,190,191 /* 240 */
-#else /* see spank_image() */
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 224 */
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 240 */
-#endif
-};
-
-#define CURSOR_GLYPH 97
-
-/* #define DEBUG */
-
-#define GRID_SIZE 70 /* width and height of the arena */
-#define GRID_DEPTH 35 /* depth of the arena */
-#define WAVE_SIZE 22 /* periodicity of color (brightness) waves */
-#define SPLASH_RATIO 0.7 /* ratio of GRID_DEPTH where chars hit the screen */
-
-static const struct { GLfloat x, y; } nice_views[] = {
- { 0, 0 },
- { 0, -20 }, /* this is a list of viewer rotations that look nice. */
- { 0, 20 }, /* every now and then we switch to a new one. */
- { 25, 0 }, /* (but we only use the first one at start-up.) */
- {-25, 0 },
- { 25, 20 },
- {-25, 20 },
- { 25, -20 },
- {-25, -20 },
-
- { 10, 0 },
- {-10, 0 },
- { 0, 0 }, /* prefer these */
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
-};
-
-
-typedef struct {
- GLfloat x, y, z; /* position of strip */
- GLfloat dx, dy, dz; /* velocity of strip */
-
- Bool erasing_p; /* Whether this strip is on its way out. */
-
- int spinner_glyph; /* the bottommost glyph -- the feeder */
- GLfloat spinner_y; /* where on the strip the bottom glyph is */
- GLfloat spinner_speed; /* how fast the bottom glyph drops */
-
- int glyphs[GRID_SIZE]; /* the other glyphs on the strip, which will be
- revealed by the dropping spinner.
- 0 means no glyph; negative means "spinner".
- If non-zero, real value is abs(G)-1. */
-
- Bool highlight[GRID_SIZE];
- /* some glyphs may be highlighted */
-
- int spin_speed; /* Rotate all spinners every this-many frames */
- int spin_tick; /* frame counter */
-
- int wave_position; /* Waves of brightness wash down the strip. */
- int wave_speed; /* every this-many frames. */
- int wave_tick; /* frame counter. */
-
-} strip;
-
-
-typedef struct {
- GLXContext *glx_context;
- Bool button_down_p;
- GLuint texture;
- int nstrips;
- strip *strips;
- const int *glyph_map;
- int nglyphs;
- GLfloat tex_char_width, tex_char_height;
-
- /* auto-tracking direction of view */
- int last_view, target_view;
- GLfloat view_x, view_y;
- int view_steps, view_tick;
- Bool auto_tracking_p;
- int track_tick;
-
- int real_char_rows;
- GLfloat brightness_ramp[WAVE_SIZE];
-
-} matrix_configuration;
-
-static matrix_configuration *mps = NULL;
-
-static GLfloat speed;
-static GLfloat density;
-static Bool do_clock;
-static char *timefmt;
-static Bool do_fog;
-static Bool do_waves;
-static Bool do_rotate;
-static Bool do_texture;
-static char *mode_str;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-density", ".density", XrmoptionSepArg, 0 },
- { "-mode", ".mode", XrmoptionSepArg, 0 },
- { "-binary", ".mode", XrmoptionNoArg, "binary" },
- { "-hexadecimal", ".mode", XrmoptionNoArg, "hexadecimal" },
- { "-decimal", ".mode", XrmoptionNoArg, "decimal" },
- { "-dna", ".mode", XrmoptionNoArg, "dna" },
- { "-clock", ".clock", XrmoptionNoArg, "True" },
- { "+clock", ".clock", XrmoptionNoArg, "False" },
- { "-timefmt", ".timefmt", XrmoptionSepArg, 0 },
- { "-fog", ".fog", XrmoptionNoArg, "True" },
- { "+fog", ".fog", XrmoptionNoArg, "False" },
- { "-waves", ".waves", XrmoptionNoArg, "True" },
- { "+waves", ".waves", XrmoptionNoArg, "False" },
- { "-rotate", ".rotate", XrmoptionNoArg, "True" },
- { "+rotate", ".rotate", XrmoptionNoArg, "False" },
- {"-texture", ".texture", XrmoptionNoArg, "True" },
- {"+texture", ".texture", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&mode_str, "mode", "Mode", DEF_MODE, t_String},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&density, "density", "Density", DEF_DENSITY, t_Float},
- {&do_clock, "clock", "Clock", DEF_CLOCK, t_Bool},
- {&timefmt, "timefmt", "Timefmt", DEF_TIMEFMT, t_String},
- {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
- {&do_waves, "waves", "Waves", DEF_WAVES, t_Bool},
- {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Re-randomize the state of one strip.
- */
-static void
-reset_strip (ModeInfo *mi, strip *s)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- int i;
- Bool time_displayed_p = False; /* never display time twice in one strip */
-
- memset (s, 0, sizeof(*s));
- s->x = (GLfloat) (frand(GRID_SIZE) - (GRID_SIZE/2));
- s->y = (GLfloat) (GRID_SIZE/2 + BELLRAND(0.5)); /* shift top slightly */
- s->z = (GLfloat) (GRID_DEPTH * 0.2) - frand (GRID_DEPTH * 0.7);
- s->spinner_y = 0;
-
- s->dx = 0;
-/* s->dx = ((BELLRAND(0.01) - 0.005) * speed); */
- s->dy = 0;
- s->dz = (BELLRAND(0.02) * speed);
-
- s->spinner_speed = (BELLRAND(0.3) * speed);
-
- s->spin_speed = (int) BELLRAND(2.0 / speed) + 1;
- s->spin_tick = 0;
-
- s->wave_position = 0;
- s->wave_speed = (int) BELLRAND(3.0 / speed) + 1;
- s->wave_tick = 0;
-
- for (i = 0; i < GRID_SIZE; i++)
- if (do_clock &&
- !time_displayed_p &&
- (i < GRID_SIZE-5) && /* display approx. once per 5 strips */
- !(random() % ((GRID_SIZE-5)*5)))
- {
- int j;
- char text[80];
- time_t now = time ((time_t *) 0);
- struct tm *tm = localtime (&now);
- strftime (text, sizeof(text)-1, timefmt, tm);
-
- /* render time into the strip */
- for (j = 0; j < strlen(text) && i < GRID_SIZE; j++, i++)
- {
- s->glyphs[i] = char_map [((unsigned char *) text)[j]] + 1;
- s->highlight[i] = True;
- }
-
- time_displayed_p = True;
- }
- else
- {
- int draw_p = (random() % 7);
- int spin_p = (draw_p && !(random() % 20));
- int g = (draw_p
- ? mp->glyph_map[(random() % mp->nglyphs)] + 1
- : 0);
- if (spin_p) g = -g;
- s->glyphs[i] = g;
- s->highlight[i] = False;
- }
-
- s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
-}
-
-
-/* Animate the strip one step. Reset if it has reached the bottom.
- */
-static void
-tick_strip (ModeInfo *mi, strip *s)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- int i;
-
- if (mp->button_down_p)
- return;
-
- s->x += s->dx;
- s->y += s->dy;
- s->z += s->dz;
-
- if (s->z > GRID_DEPTH * SPLASH_RATIO) /* splashed into screen */
- {
- reset_strip (mi, s);
- return;
- }
-
- s->spinner_y += s->spinner_speed;
- if (s->spinner_y >= GRID_SIZE)
- {
- if (s->erasing_p)
- {
- reset_strip (mi, s);
- return;
- }
- else
- {
- s->erasing_p = True;
- s->spinner_y = 0;
- s->spinner_speed /= 2; /* erase it slower than we drew it */
- }
- }
-
- /* Spin the spinners. */
- s->spin_tick++;
- if (s->spin_tick > s->spin_speed)
- {
- s->spin_tick = 0;
- s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
- for (i = 0; i < GRID_SIZE; i++)
- if (s->glyphs[i] < 0)
- {
- s->glyphs[i] = -(mp->glyph_map[(random() % mp->nglyphs)] + 1);
- if (! (random() % 800)) /* sometimes they stop spinning */
- s->glyphs[i] = -s->glyphs[i];
- }
- }
-
- /* Move the color (brightness) wave. */
- s->wave_tick++;
- if (s->wave_tick > s->wave_speed)
- {
- s->wave_tick = 0;
- s->wave_position++;
- if (s->wave_position >= WAVE_SIZE)
- s->wave_position = 0;
- }
-}
-
-
-/* Draw a single character at the given position and brightness.
- */
-static void
-draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
- GLfloat x, GLfloat y, GLfloat z,
- GLfloat brightness)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat w = mp->tex_char_width;
- GLfloat h = mp->tex_char_height;
- GLfloat cx = 0, cy = 0;
- GLfloat S = 1;
- Bool spinner_p = (glyph < 0);
-
- if (glyph == 0) abort();
- if (glyph < 0) glyph = -glyph;
-
- if (spinner_p)
- brightness *= 1.5;
-
- if (!do_texture)
- {
- S = 0.8;
- x += 0.1;
- y += 0.1;
- }
- else
- {
- int ccx = ((glyph - 1) % CHAR_COLS);
- int ccy = ((glyph - 1) / CHAR_COLS);
-
- cx = ccx * w;
- cy = (mp->real_char_rows - ccy - 1) * h;
-
- if (do_fog)
- {
- GLfloat depth;
- depth = (z / GRID_DEPTH) + 0.5; /* z ratio from back/front */
- depth = 0.2 + (depth * 0.8); /* scale to range [0.2 - 1.0] */
- brightness *= depth; /* so no row goes all black. */
- }
- }
-
- {
- GLfloat r, g, b, a;
-
- if (highlight)
- brightness *= 2;
-
- if (!do_texture && !spinner_p)
- r = b = 0, g = 1;
- else
- r = g = b = 1;
-
- a = brightness;
-
- /* If the glyph is very close to the screen (meaning it is very large,
- and is about to splash into the screen and vanish) then start fading
- it out, proportional to how close to the glass it is.
- */
- if (z > GRID_DEPTH/2)
- {
- GLfloat ratio = ((z - GRID_DEPTH/2) /
- ((GRID_DEPTH * SPLASH_RATIO) - GRID_DEPTH/2));
- int i = ratio * WAVE_SIZE;
-
- if (i < 0) i = 0;
- else if (i >= WAVE_SIZE) i = WAVE_SIZE-1;
-
- a *= mp->brightness_ramp[i];
- }
-
- glColor4f (r,g,b,a);
- }
-
- glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
- glNormal3f (0, 0, 1);
- glTexCoord2f (cx, cy); glVertex3f (x, y, z);
- glTexCoord2f (cx+w, cy); glVertex3f (x+S, y, z);
- glTexCoord2f (cx+w, cy+h); glVertex3f (x+S, y+S, z);
- glTexCoord2f (cx, cy+h); glVertex3f (x, y+S, z);
- glEnd ();
-
- if (wire && spinner_p)
- {
- glBegin (GL_LINES);
- glVertex3f (x, y, z);
- glVertex3f (x+S, y+S, z);
- glVertex3f (x, y+S, z);
- glVertex3f (x+S, y, z);
- glEnd();
- }
-
- mi->polygon_count++;
-}
-
-
-/* Draw all the visible glyphs in the strip.
- */
-static void
-draw_strip (ModeInfo *mi, strip *s)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < GRID_SIZE; i++)
- {
- int g = s->glyphs[i];
- Bool below_p = (s->spinner_y >= i);
-
- if (s->erasing_p)
- below_p = !below_p;
-
- if (g && below_p) /* don't draw cells below the spinner */
- {
- GLfloat brightness;
- if (!do_waves)
- brightness = 1.0;
- else
- {
- int j = WAVE_SIZE - ((i + (GRID_SIZE - s->wave_position))
- % WAVE_SIZE);
- brightness = mp->brightness_ramp[j];
- }
-
- draw_glyph (mi, g, s->highlight[i],
- s->x, s->y - i, s->z, brightness);
- }
- }
-
- if (!s->erasing_p)
- draw_glyph (mi, s->spinner_glyph, False,
- s->x, s->y - s->spinner_y, s->z, 1.0);
-}
-
-
-/* qsort comparator for sorting strips by z position */
-static int
-cmp_strips (const void *aa, const void *bb)
-{
- const strip *a = *(strip **) aa;
- const strip *b = *(strip **) bb;
- return ((int) (a->z * 10000) -
- (int) (b->z * 10000));
-}
-
-
-/* Auto-tracking
- */
-
-static void
-auto_track_init (ModeInfo *mi)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- mp->last_view = 0;
- mp->target_view = 0;
- mp->view_x = nice_views[mp->last_view].x;
- mp->view_y = nice_views[mp->last_view].y;
- mp->view_steps = 100;
- mp->view_tick = 0;
- mp->auto_tracking_p = False;
-}
-
-
-static void
-auto_track (ModeInfo *mi)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
-
- if (! do_rotate)
- return;
- if (mp->button_down_p)
- return;
-
- /* if we're not moving, maybe start moving. Otherwise, do nothing. */
- if (! mp->auto_tracking_p)
- {
- if (++mp->track_tick < 20/speed) return;
- mp->track_tick = 0;
- if (! (random() % 20))
- mp->auto_tracking_p = True;
- else
- return;
- }
-
-
- {
- GLfloat ox = nice_views[mp->last_view].x;
- GLfloat oy = nice_views[mp->last_view].y;
- GLfloat tx = nice_views[mp->target_view].x;
- GLfloat ty = nice_views[mp->target_view].y;
-
- /* move from A to B with sinusoidal deltas, so that it doesn't jerk
- to a stop. */
- GLfloat th = sin ((M_PI / 2) * (double) mp->view_tick / mp->view_steps);
-
- mp->view_x = (ox + ((tx - ox) * th));
- mp->view_y = (oy + ((ty - oy) * th));
- mp->view_tick++;
-
- if (mp->view_tick >= mp->view_steps)
- {
- mp->view_tick = 0;
- mp->view_steps = (350.0 / speed);
- mp->last_view = mp->target_view;
- mp->target_view = (random() % (countof(nice_views) - 1)) + 1;
- mp->auto_tracking_p = False;
- }
- }
-}
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_matrix (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (80.0, 1/h, 1.0, 100);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 25.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-matrix_handle_event (ModeInfo *mi, XEvent *event)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
-
- if (event->xany.type == ButtonPress &&
- event->xbutton.button == Button1)
- {
- mp->button_down_p = True;
- return True;
- }
- else if (event->xany.type == ButtonRelease &&
- event->xbutton.button == Button1)
- {
- mp->button_down_p = False;
- return True;
- }
-
- return False;
-}
-
-
-#if 0
-static Bool
-bigendian (void)
-{
- union { int i; char c[sizeof(int)]; } u;
- u.i = 1;
- return !u.c[0];
-}
-#endif
-
-
-/* The image with the characters in it is 512x598, meaning that it needs to
- be copied into a 512x1024 texture. But some machines can't handle textures
- that large... And it turns out that we aren't using most of the characters
- in that image anyway, since this program doesn't do anything that makes use
- of the full range of Latin1 characters. So... this function tosses out the
- last 32 of the Latin1 characters, resulting in a 512x506 image, which we
- can then stuff in a 512x512 texture. Voila.
-
- If this hack ever grows into something that displays full Latin1 text,
- well then, Something Else Will Need To Be Done.
-
- Since currently GLMatrix does not run textclient / xscreensaver-text,
- it's not an issue. (XMatrix does that.)
-
- */
-static void
-spank_image (matrix_configuration *mp, XImage *xi)
-{
- int ch = xi->height / CHAR_ROWS;
- int cut = 2;
- unsigned char *bits = (unsigned char *) xi->data;
- unsigned char *from, *to, *s, *end;
- int L = xi->bytes_per_line * ch;
-/* int i;*/
-
- /* Copy row 12 into 10 (which really means, copy 2 into 0,
- since texture data is upside down.).
- */
- to = bits + (L * cut);
- from = bits;
- end = from + L;
- s = from;
- while (s < end)
- *to++ = *s++;
-
- /* Then, pull all the bits down by 2 rows.
- */
- to = bits;
- from = bits + (L * cut);
- end = bits + (L * CHAR_ROWS);
- s = from;
- while (s < end)
- *to++ = *s++;
-
- /* And clear out the rest, for good measure.
- */
- from = bits + (L * (CHAR_ROWS - cut));
- end = bits + (L * CHAR_ROWS);
- s = from;
- while (s < end)
- *s++ = 0;
-
- xi->height -= (cut * ch);
- mp->real_char_rows -= cut;
-
-# if 0
- /* Finally, pull the map indexes back to match the new bits.
- */
- for (i = 0; i < countof(matrix_encoding); i++)
- if (matrix_encoding[i] > (CHAR_COLS * (CHAR_ROWS - cut)))
- matrix_encoding[i] -= (cut * CHAR_COLS);
-# endif
-}
-
-
-static void
-load_textures (ModeInfo *mi, Bool flip_p)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- XImage *xi;
- int x, y;
- int cw, ch;
- int orig_w, orig_h;
-
- /* The Matrix image is 512x598 -- but GL texture sizes must be powers of 2.
- So we waste some padding rows to round up.
- */
- xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
- matrix3_png, sizeof(matrix3_png));
- orig_w = xi->width;
- orig_h = xi->height;
- mp->real_char_rows = CHAR_ROWS;
- spank_image (mp, xi);
-
- if (xi->height != 512 && xi->height != 1024)
- {
- xi->height = (xi->height < 512 ? 512 : 1024);
- xi->data = realloc (xi->data, xi->height * xi->bytes_per_line);
- if (!xi->data)
- {
- fprintf(stderr, "%s: out of memory\n", progname);
- exit(1);
- }
- }
-
- if (xi->width != 512) abort();
- if (xi->height != 512 && xi->height != 1024) abort();
-
- /* char size in pixels */
- cw = orig_w / CHAR_COLS;
- ch = orig_h / CHAR_ROWS;
-
- /* char size in ratio of final (padded) texture size */
- mp->tex_char_width = (GLfloat) cw / xi->width;
- mp->tex_char_height = (GLfloat) ch / xi->height;
-
- /* Flip each character's bits horizontally -- we could also just do this
- by reversing the texture coordinates on the quads, but on some systems
- that slows things down a lot.
- */
- if (flip_p)
- {
- int xx, col;
- unsigned long buf[100];
- for (y = 0; y < xi->height; y++)
- for (col = 0, xx = 0; col < CHAR_COLS; col++, xx += cw)
- {
- for (x = 0; x < cw; x++)
- buf[x] = XGetPixel (xi, xx+x, y);
- for (x = 0; x < cw; x++)
- XPutPixel (xi, xx+x, y, buf[cw-x-1]);
- }
- }
-
- /* The pixmap is a color image with no transparency. Set the texture's
- alpha to be the green channel, and set the green channel to be 100%.
- */
- {
- int rpos, gpos, bpos, apos; /* bitfield positions */
-#if 0
- /* #### Cherub says that the little-endian case must be taken on MacOSX,
- or else the colors/alpha are the wrong way around. How can
- that be the case?
- */
- if (bigendian())
- rpos = 24, gpos = 16, bpos = 8, apos = 0;
- else
-#endif
- rpos = 0, gpos = 8, bpos = 16, apos = 24;
-
- for (y = 0; y < xi->height; y++)
- for (x = 0; x < xi->width; x++)
- {
- unsigned long p = XGetPixel (xi, x, y);
- unsigned char r = (p >> rpos) & 0xFF;
- unsigned char g = (p >> gpos) & 0xFF;
- unsigned char b = (p >> bpos) & 0xFF;
- unsigned char a = g;
- g = 0xFF;
- p = (r << rpos) | (g << gpos) | (b << bpos) | (a << apos);
- XPutPixel (xi, x, y, p);
- }
- }
-
- /* Now load the texture into GL.
- */
- clear_gl_error();
- glGenTextures (1, &mp->texture);
-
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
- /* messes up -fps */
- /* glPixelStorei (GL_UNPACK_ROW_LENGTH, xi->width);*/
- glBindTexture (GL_TEXTURE_2D, mp->texture);
- check_gl_error ("texture init");
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, xi->width, xi->height, 0, GL_RGBA,
- GL_UNSIGNED_BYTE, xi->data);
- {
- char buf[255];
- sprintf (buf, "creating %dx%d texture:", xi->width, xi->height);
- check_gl_error (buf);
- }
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- /* I'd expect CLAMP to be the thing to do here, but oddly, we get a
- faint solid green border around the texture if it is *not* REPEAT!
- */
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- check_gl_error ("texture param");
-
- XDestroyImage (xi);
-}
-
-
-ENTRYPOINT void
-init_matrix (ModeInfo *mi)
-{
- matrix_configuration *mp;
- int wire = MI_IS_WIREFRAME(mi);
- Bool flip_p = 0;
- int i;
-
- if (wire)
- do_texture = False;
-
- MI_INIT (mi, mps);
-
- mp = &mps[MI_SCREEN(mi)];
- mp->glx_context = init_GL(mi);
-
- if (!mode_str || !*mode_str || !strcasecmp(mode_str, "matrix"))
- {
- flip_p = 1;
- mp->glyph_map = matrix_encoding;
- mp->nglyphs = countof(matrix_encoding);
- }
- else if (!strcasecmp (mode_str, "dna"))
- {
- flip_p = 0;
- mp->glyph_map = dna_encoding;
- mp->nglyphs = countof(dna_encoding);
- }
- else if (!strcasecmp (mode_str, "bin") ||
- !strcasecmp (mode_str, "binary"))
- {
- flip_p = 0;
- mp->glyph_map = binary_encoding;
- mp->nglyphs = countof(binary_encoding);
- }
- else if (!strcasecmp (mode_str, "hex") ||
- !strcasecmp (mode_str, "hexadecimal"))
- {
- flip_p = 0;
- mp->glyph_map = hex_encoding;
- mp->nglyphs = countof(hex_encoding);
- }
- else if (!strcasecmp (mode_str, "dec") ||
- !strcasecmp (mode_str, "decimal"))
- {
- flip_p = 0;
- mp->glyph_map = decimal_encoding;
- mp->nglyphs = countof(decimal_encoding);
- }
- else
- {
- fprintf (stderr,
- "%s: `mode' must be matrix, dna, binary, or hex: not `%s'\n",
- progname, mode_str);
- exit (1);
- }
-
- reshape_matrix (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- glShadeModel(GL_SMOOTH);
-
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_CULL_FACE);
- glEnable(GL_NORMALIZE);
-
- if (do_texture)
- load_textures (mi, flip_p);
-
- /* to scale coverage-percent to strips, this number looks about right... */
- mp->nstrips = (int) (density * 2.2);
- if (mp->nstrips < 1) mp->nstrips = 1;
- else if (mp->nstrips > 2000) mp->nstrips = 2000;
-
-
- mp->strips = calloc (mp->nstrips, sizeof(strip));
- for (i = 0; i < mp->nstrips; i++)
- {
- strip *s = &mp->strips[i];
- reset_strip (mi, s);
-
- /* If we start all strips from zero at once, then the first few seconds
- of the animation are much denser than normal. So instead, set all
- the initial strips to erase-mode with random starting positions.
- As these die off at random speeds and are re-created, we'll get a
- more consistent density. */
- s->erasing_p = True;
- s->spinner_y = frand(GRID_SIZE);
- memset (s->glyphs, 0, sizeof(s->glyphs)); /* no visible glyphs */
- }
-
- /* Compute the brightness ramp.
- */
- for (i = 0; i < WAVE_SIZE; i++)
- {
- GLfloat j = ((WAVE_SIZE - i) / (GLfloat) (WAVE_SIZE - 1));
- j *= (M_PI / 2); /* j ranges from 0.0 - PI/2 */
- j = sin (j); /* j ranges from 0.0 - 1.0 */
- j = 0.2 + (j * 0.8); /* j ranges from 0.2 - 1.0 */
- mp->brightness_ramp[i] = j;
- /* printf("%2d %8.2f\n", i, j); */
- }
-
-
- auto_track_init (mi);
-}
-
-
-#ifdef DEBUG
-
-static void
-draw_grid (ModeInfo *mi)
-{
- if (!MI_IS_WIREFRAME(mi))
- {
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- }
- glPushMatrix();
-
- glColor3f(1, 1, 1);
- glBegin(GL_LINES);
- glVertex3f(-GRID_SIZE, 0, 0); glVertex3f(GRID_SIZE, 0, 0);
- glVertex3f(0, -GRID_SIZE, 0); glVertex3f(0, GRID_SIZE, 0);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glEnd();
- glBegin(GL_LINES);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
- glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
- glEnd();
- glPopMatrix();
- if (!MI_IS_WIREFRAME(mi))
- {
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- }
-}
-#endif /* DEBUG */
-
-
-ENTRYPOINT void
-draw_matrix (ModeInfo *mi)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int i;
-
- if (!mp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- if (do_texture)
- {
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
-
- /* Jeff Epler points out:
- By using GL_ONE instead of GL_SRC_ONE_MINUS_ALPHA, glyphs are
- added to each other, so that a bright glyph with a darker one
- in front is a little brighter than the bright glyph alone.
- */
- glBlendFunc (GL_SRC_ALPHA, GL_ONE);
- }
-
- if (do_rotate)
- {
- glRotatef (mp->view_x, 1, 0, 0);
- glRotatef (mp->view_y, 0, 1, 0);
- }
-
-#ifdef DEBUG
-# if 0
- glScalef(0.5, 0.5, 0.5);
-# endif
-# if 0
- glRotatef(-30, 0, 1, 0);
-# endif
- draw_grid (mi);
-#endif
-
- mi->polygon_count = 0;
-
- /* Render (and tick) each strip, starting at the back
- (draw the ones farthest from the camera first, to make
- the alpha transparency work out right.)
- */
- {
- strip **sorted = malloc (mp->nstrips * sizeof(*sorted));
- for (i = 0; i < mp->nstrips; i++)
- sorted[i] = &mp->strips[i];
- qsort (sorted, i, sizeof(*sorted), cmp_strips);
-
- for (i = 0; i < mp->nstrips; i++)
- {
- strip *s = sorted[i];
- tick_strip (mi, s);
- draw_strip (mi, s);
- }
- free (sorted);
- }
-
- auto_track (mi);
-
-#if 0
- glBegin(GL_QUADS);
- glColor3f(1,1,1);
- glTexCoord2f (0,0); glVertex3f(-15,-15,0);
- glTexCoord2f (0,1); glVertex3f(-15,15,0);
- glTexCoord2f (1,1); glVertex3f(15,15,0);
- glTexCoord2f (1,0); glVertex3f(15,-15,0);
- glEnd();
-#endif
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_matrix (ModeInfo *mi)
-{
- matrix_configuration *mp = &mps[MI_SCREEN(mi)];
- if (!mp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *mp->glx_context);
- if (mp->strips) free (mp->strips);
- if (mp->texture) glDeleteTextures (1, &mp->texture);
-}
-
-XSCREENSAVER_MODULE_2 ("GLMatrix", glmatrix, matrix)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/glmatrix.man b/hacks/glx/glmatrix.man
deleted file mode 100644
index 46116f1..0000000
--- a/hacks/glx/glmatrix.man
+++ /dev/null
@@ -1,116 +0,0 @@
-.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
-.SH NAME
-glmatrix \- simulates the title sequence effect of the movie
-.SH SYNOPSIS
-.B glmatrix
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP]
-[\-delay \fIusecs\fP]
-[\-speed \fIratio\fP]
-[\-density \fIpct\fP]
-[\-no\-fog]
-[\-no\-waves]
-[\-no\-rotate]
-[\-binary]
-[\-hexadecimal]
-[\-dna]
-[\-clock]
-[\-timefmt \fIfmt\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIglmatrix\fP program draws the 3D "digital rain" effect, as seen
-in the title sequence of the Wachowski brothers' film, "The Matrix".
-
-Also see
-.BR xmatrix (MANSUFFIX)
-for a 2D rendering of the similar effect that appeared on the
-computer monitors actually \fIin\fP the movie.
-.SH OPTIONS
-.I glmatrix
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-The delay between frames of the animation, in microseconds: default 30000.
-.TP 8
-.B \-speed \fIratio\fP
-How fast the glyphs should move; default 1.0. 2.0 means twice as fast,
-0.5 means half as fast.
-.TP 8
-.B \-density \fIpercentage\fP
-The approximate percentage of the screen that should be filled with
-characters at any given time. Default 20%.
-.TP 8
-.B \-no\-fog
-By default, glyphs are dimmer the farther away they are. This
-argument disables that.
-.TP 8
-.B \-no\-waves
-By default, waves of color roll down the columns of glyphs. This
-argument disables that.
-.TP 8
-.B \-no-rotate\fP
-By default, the scene slowly tilts and rotates. This
-argument disables that.
-.TP 8
-.B \-binary\fP
-Instead of displaying Matrix glyphs, only display ones and zeros.
-.TP 8
-.B \-hexadecimal\fP
-Instead of displaying Matrix glyphs, display hexadecimal digits.
-.TP 8
-.B \-dna\fP
-Instead of displaying Matrix glyphs, display genetic code
-(guanine, adenine, thymine, and cytosine.)
-.TP 8
-.B \-clock\fP
-Hide a clock displaying the current time somewhere in the glyphs.
-.TP 8
-.B \-timefmt\fP \fIstrftime-string\fP
-How to format the clock when \fI\-clock\fP is specified.
-Default "\ %l%M%p\ ".
-.TP 8
-.B \-speed \fIratio\fP
-Less than 1 for slower, greater than 1 for faster. Default 1.
-.TP 8
-.B \-wireframe
-Just draw boxes instead of textured characters.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR xmatrix (MANSUFFIX),
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1999-2003 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 8-Jun-2003.
diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c
deleted file mode 100644
index 2cbe9d5..0000000
--- a/hacks/glx/glplanet.c
+++ /dev/null
@@ -1,1007 +0,0 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-/* glplanet --- 3D rotating planet, e.g., Earth.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation.
- *
- * This file is provided AS IS with no warranties of any kind. The author
- * shall have no liability with respect to the infringement of copyrights,
- * trade secrets or any patents by this file or any part thereof. In no
- * event will the author be liable for any lost revenue or profits or
- * other special, indirect and consequential damages.
- *
- * Revision History:
- *
- * 10-Nov-14: jwz@jwz.org Night map. Better stars.
- * 16-Jan-02: jwz@jwz.org gdk_pixbuf support.
- * 21-Mar-01: jwz@jwz.org Broke sphere routine out into its own file.
- *
- * 9-Oct-98: dek@cgl.ucsf.edu Added stars.
- *
- * 8-Oct-98: jwz@jwz.org Made the 512x512x1 xearth image be built in.
- * Made it possible to load XPM or XBM files.
- * Made the planet bounce and roll around.
- *
- * 8-Oct-98: Released initial version of "glplanet"
- * (David Konerding, dek@cgl.ucsf.edu)
- */
-
-
-#ifdef STANDALONE
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*imageForeground: Green \n" \
- "*imageBackground: Blue \n" \
- "*suppressRotationAnimation: True\n" \
-
-# define release_planet 0
-# include "xlockmore.h" /* from the xscreensaver distribution */
-#else /* !STANDALONE */
-# include "xlock.h" /* from the xlockmore distribution */
-#endif /* !STANDALONE */
-
-#ifdef USE_GL /* whole file */
-
-#include "sphere.h"
-
-#define DEF_ROTATE "True"
-#define DEF_ROLL "True"
-#define DEF_WANDER "True"
-#define DEF_SPIN "1.0"
-#define DEF_TEXTURE "True"
-#define DEF_STARS "True"
-#define DEF_RESOLUTION "128"
-#define DEF_IMAGE "BUILTIN"
-#define DEF_IMAGE2 "BUILTIN"
-#define DEF_MODE "globe"
-
-#define BLENDED_TERMINATOR
-
-#undef BELLRAND
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-
-static int do_rotate;
-static int do_roll;
-static int do_wander;
-static int do_texture;
-static int do_stars;
-static char *which_image;
-static char *which_image2;
-static int resolution;
-static GLfloat spin_arg;
-static char *mode_arg;
-
-static XrmOptionDescRec opts[] = {
- {"-rotate", ".rotate", XrmoptionNoArg, "true" },
- {"+rotate", ".rotate", XrmoptionNoArg, "false" },
- {"-roll", ".roll", XrmoptionNoArg, "true" },
- {"+roll", ".roll", XrmoptionNoArg, "false" },
- {"-wander", ".wander", XrmoptionNoArg, "true" },
- {"+wander", ".wander", XrmoptionNoArg, "false" },
- {"-texture", ".texture", XrmoptionNoArg, "true" },
- {"+texture", ".texture", XrmoptionNoArg, "false" },
- {"-stars", ".stars", XrmoptionNoArg, "true" },
- {"+stars", ".stars", XrmoptionNoArg, "false" },
- {"-spin", ".spin", XrmoptionSepArg, 0 },
- {"-no-spin", ".spin", XrmoptionNoArg, "0" },
- {"-image", ".image", XrmoptionSepArg, 0 },
- {"-image2", ".image2", XrmoptionSepArg, 0 },
- {"-resolution", ".resolution", XrmoptionSepArg, 0 },
- {"-mode", ".mode", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
- {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
- {&do_stars, "stars", "Stars", DEF_STARS, t_Bool},
- {&spin_arg, "spin", "Spin", DEF_SPIN, t_Float},
- {&which_image, "image", "Image", DEF_IMAGE, t_String},
- {&which_image2,"image2", "Image", DEF_IMAGE2, t_String},
- {&mode_arg, "mode" ,"Mode" , DEF_MODE, t_String},
- {&resolution, "resolution","Resolution", DEF_RESOLUTION, t_Int},
-};
-
-ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-#ifdef USE_MODULES
-ModStruct planet_description =
-{"planet", "init_planet", "draw_planet", NULL,
- "draw_planet", "init_planet", "free_planet", &planet_opts,
- 1000, 1, 2, 1, 4, 1.0, "",
- "Animates texture mapped sphere (planet)", 0, NULL};
-#endif
-
-#include "images/gen/earth_png.h"
-#include "images/gen/earth_night_png.h"
-
-#include "ximage-loader.h"
-#include "rotator.h"
-#include "gltrackball.h"
-
-
-/*-
- * slices and stacks are used in the sphere parameterization routine.
- * more slices and stacks will increase the quality of the sphere,
- * at the expense of rendering speed
- */
-
-/* structure for holding the planet data */
-typedef struct {
- GLuint platelist;
- GLuint shadowlist;
- GLuint latlonglist;
- GLuint starlist;
- int starcount;
- int screen_width, screen_height;
- GLXContext *glx_context;
- Window window;
- GLfloat z;
- GLfloat tilt;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
- GLuint tex1, tex2;
- int draw_axis;
- enum { GLOBE, EQUIRECTANGULAR, MERCATOR } mode;
-
-} planetstruct;
-
-
-static planetstruct *planets = NULL;
-
-
-/* Set up and enable texturing on our object */
-static void
-setup_xpm_texture (ModeInfo *mi, const unsigned char *data, unsigned long size)
-{
- XImage *image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
- data, size);
- char buf[1024];
- clear_gl_error();
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- /* iOS invalid enum:
- glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
- */
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- image->width, image->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, image->data);
- sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
- check_gl_error(buf);
- XDestroyImage (image);
-}
-
-
-static Bool
-setup_file_texture (ModeInfo *mi, char *filename)
-{
- Display *dpy = mi->dpy;
- Visual *visual = mi->xgwa.visual;
- char buf[1024];
-
- XImage *image = file_to_ximage (dpy, visual, filename);
- if (!image) return False;
-
- clear_gl_error();
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- image->width, image->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, image->data);
- sprintf (buf, "texture: %.100s (%dx%d)",
- filename, image->width, image->height);
- check_gl_error(buf);
- return True;
-}
-
-
-static void
-setup_texture (ModeInfo * mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
-
- glGenTextures (1, &gp->tex1);
- glBindTexture (GL_TEXTURE_2D, gp->tex1);
-
- /* Must be after glBindTexture */
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- if (!which_image ||
- !*which_image ||
- !strcmp(which_image, "BUILTIN"))
- {
- BUILTIN1:
- setup_xpm_texture (mi, earth_png, sizeof(earth_png));
- }
- else
- {
- if (! setup_file_texture (mi, which_image))
- goto BUILTIN1;
- }
-
- check_gl_error("texture 1 initialization");
-
- glGenTextures (1, &gp->tex2);
- glBindTexture (GL_TEXTURE_2D, gp->tex2);
-
- /* Must be after glBindTexture */
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- if (!which_image2 ||
- !*which_image2 ||
- !strcmp(which_image2, "BUILTIN"))
- {
- BUILTIN2:
- setup_xpm_texture (mi, earth_night_png, sizeof(earth_night_png));
- }
- else
- {
- if (! setup_file_texture (mi, which_image2))
- goto BUILTIN2;
- }
-
- check_gl_error("texture 2 initialization");
-
- /* Need to flip the texture top for bottom for some reason. */
- glMatrixMode (GL_TEXTURE);
- glScalef (1, -1, 1);
- glMatrixMode (GL_MODELVIEW);
-}
-
-
-static void
-unit_mercator (int stacks, int slices, int wire_p, Bool mercp)
-{
- int i, j;
- GLfloat x, y, ty, xs, ys;
- GLfloat lastx = 0, lasty = 0, lastty = 0;
- GLfloat r, north, south;
-
- /* #### TODO: the grid lines are always rendered as Equirectangular,
- not Mercator. */
-
- stacks /= 2;
- xs = 1.0 / slices;
- ys = 1.0 / stacks;
-
- glPushMatrix();
- r = 1.8;
- glScalef (r, r, r);
- glFrontFace(GL_CW);
-
- r = 0.35; /* Grids are roughly square at equator */
-
- if (mercp)
- {
- /* The poles go to infinity. The traditional Mercator projection
- omits the Northern and Southern latitudes asymmetrically to
- move Europe toward the center. How Colonial! */
- north = 85 / 180.0;
- south = -66 / 180.0;
- }
- else
- {
- /* Antarctica should be roughly the same width as North America,
- but even Equirectangular is crazypants here. */
- north = 80 / 180.0;
- south = -north;
- }
-
-
- for (j = 0, y = -0.5, ty = 0; j <= stacks;
- lasty = y, lastty = ty, y += ys, j++)
- {
- GLfloat th;
-
- ty = (0.5 - y) * (south - north) - south;
- ty += 0.5;
-
- th = M_PI * (ty - 0.5); /* latitude in radians */
-
- if (mercp)
- {
- /* Obviously I have no idea what I'm doing here */
- ty = 2 * (atan (pow(M_E, th)) - M_PI/4);
- ty *= 0.41;
- ty += 0.5;
- }
-
- /* Draw the end caps
- */
- if (j == 0 || j == stacks)
- {
- GLfloat xx, yy, lxx, lyy;
- glFrontFace(j == 0 ? GL_CCW : GL_CW);
-
- if (j == stacks && !wire_p) glEnd();
-
- glNormal3f (0, (j == 0 ? -1 : 1), 0);
-
- glBegin (wire_p ? GL_LINE_LOOP : GL_TRIANGLES);
-
- for (i = 0, x = 0, lastx = 0, lxx = 0;
- i <= slices;
- lastx = x, lxx = xx, lyy = yy, x += xs, i++)
- {
- xx = r * cos(M_PI * 2 * x);
- yy = r * sin(M_PI * 2 * x);
- if (i == 0) continue;
-
- glTexCoord2f (x, j == 0 ? 0 : 1);
- glVertex3f (0, y, 0);
- glTexCoord2f (lastx, ty); glVertex3f (lxx, y, lyy);
- glTexCoord2f (x, ty); glVertex3f (xx, y, yy);
- }
- glEnd();
- glFrontFace(GL_CW);
-
- if (!wire_p) glBegin (GL_QUADS);
- }
-
- if (j == 0)
- continue;
-
- /* Draw one ring of quads.
- */
- for (i = 0, x = 0, lastx = 0; i <= slices; lastx = x, x += xs, i++)
- {
- GLfloat xx = r * cos(M_PI * 2 * x);
- GLfloat yy = r * sin(M_PI * 2 * x);
- GLfloat lx = r * cos(M_PI * 2 * lastx);
- GLfloat ly = r * sin(M_PI * 2 * lastx);
- GLfloat y2 = y;
- GLfloat ly2 = lasty;
-
-#if 0
- if (mercp)
- {
- y2 = ty - 0.5;
- ly2 = lastty - 0.5;
- }
-#endif
-
- if (i == 0) continue;
- if (wire_p) glBegin(GL_LINE_LOOP);
- glNormal3f (lx, 0, ly);
- glTexCoord2f (lastx, lastty); glVertex3f (lx, ly2, ly);
- glNormal3f (xx, 0, yy);
- glTexCoord2f (x, lastty); glVertex3f (xx, ly2, yy);
- glNormal3f (xx, 0, yy);
- glTexCoord2f (x, ty); glVertex3f (xx, y2, yy);
- glNormal3f (lx, 0, ly);
- glTexCoord2f (lastx, ty); glVertex3f (lx, y2, ly);
- if (wire_p) glEnd();
- }
- }
-
- if (!wire_p) glEnd();
-
- glPopMatrix();
-}
-
-
-
-static void
-init_stars (ModeInfo *mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- int i, j;
- int width = MI_WIDTH(mi);
- int height = MI_HEIGHT(mi);
- int size = (width > height ? width : height);
- int nstars = size * size / 80;
- int max_size = 3;
- GLfloat inc = 0.5;
- int steps = max_size / inc;
- GLfloat scale = 1;
-
- if (MI_WIDTH(mi) > 2560) { /* Retina displays */
- scale *= 2;
- nstars /= 2;
- }
-
- gp->starlist = glGenLists(1);
- glNewList(gp->starlist, GL_COMPILE);
- for (j = 1; j <= steps; j++)
- {
- glPointSize(inc * j * scale);
- glBegin (GL_POINTS);
- for (i = 0; i < nstars / steps; i++)
- {
- GLfloat d = 0.1;
- GLfloat r = 0.15 + frand(0.3);
- GLfloat g = r + frand(d) - d;
- GLfloat b = r + frand(d) - d;
-
- GLfloat x = frand(1)-0.5;
- GLfloat y = frand(1)-0.5;
- GLfloat z = ((random() & 1)
- ? frand(1)-0.5
- : (BELLRAND(1)-0.5)/12); /* milky way */
- d = sqrt (x*x + y*y + z*z);
- x /= d;
- y /= d;
- z /= d;
- glColor3f (r, g, b);
- glVertex3f (x, y, z);
- gp->starcount++;
- }
- glEnd ();
- }
- glEndList ();
-
- check_gl_error("stars initialization");
-}
-
-
-#ifdef BLENDED_TERMINATOR
-static void
-terminator_tube (ModeInfo *mi, int resolution)
-{
- Bool wire = MI_IS_WIREFRAME(mi);
- GLfloat th;
- GLfloat step = M_PI*2 / resolution;
- GLfloat thickness = 0.1; /* Dusk is about an hour wide. */
- GLfloat c1[] = { 0, 0, 0, 1 };
- GLfloat c2[] = { 0, 0, 0, 0 };
-
- glPushMatrix();
- if (wire)
- {
- c1[0] = c1[1] = 0.5;
- c2[2] = 0.5;
- glLineWidth (4);
- }
- glRotatef (90, 1, 0, 0);
- glScalef (1.02, 1.02, 1.02);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (th = 0; th < M_PI*2 + step; th += step)
- {
- GLfloat x = cos(th);
- GLfloat y = sin(th);
- glColor4fv (c1);
- if (!do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
- glNormal3f (x, y, 0);
- glVertex3f (x, y, thickness);
- glColor4fv (c2);
- if (!do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
- glVertex3f (x, y, -thickness);
- }
- glEnd();
-
- /* There's a bit of a spike in the shading where the tube overlaps
- the sphere, so extend the sphere a lot to try and avoid that. */
-# if 0 /* Nope, that doesn't help. */
- glColor4fv (c1);
- if (!do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (th = 0; th < M_PI*2 + step; th += step)
- {
- GLfloat x = cos(th);
- GLfloat y = sin(th);
- glNormal3f (x, y, 0);
- glVertex3f (x, y, thickness);
- glVertex3f (x, y, thickness + 10);
- }
- glEnd();
-
- glColor4fv (c2);
- if (!do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
- glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
- for (th = 0; th < M_PI*2 + step; th += step)
- {
- GLfloat x = cos(th);
- GLfloat y = sin(th);
- glNormal3f (x, y, 0);
- glVertex3f (x, y, -thickness);
- glVertex3f (x, y, -thickness - 10);
- }
- glEnd();
-# endif /* 0 */
-
- glPopMatrix();
-}
-#endif /* BLENDED_TERMINATOR */
-
-
-ENTRYPOINT void
-reshape_planet (ModeInfo *mi, int width, int height)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- GLfloat h = (GLfloat) height / (GLfloat) width;
-
- glXMakeCurrent(MI_DISPLAY(mi), gp->window, *gp->glx_context);
-
- glViewport(0, 0, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -40);
-
-# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
- {
- int o = (int) current_device_rotation();
- if (o != 0 && o != 180 && o != -180)
- glScalef (h, h, h);
- }
-# endif
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-planet_handle_event (ModeInfo *mi, XEvent *event)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, gp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &gp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_planet (ModeInfo * mi)
-{
- planetstruct *gp;
- int screen = MI_SCREEN(mi);
- Bool wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, planets);
- gp = &planets[screen];
-
- gp->window = MI_WINDOW(mi);
-
- if ((gp->glx_context = init_GL(mi)) != NULL) {
- reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- if (!mode_arg || !*mode_arg || !strcasecmp(mode_arg, "GLOBE"))
- gp->mode = GLOBE;
- else if (!strcasecmp(mode_arg, "EQUIRECTANGULAR"))
- gp->mode = EQUIRECTANGULAR;
- else if (!strcasecmp(mode_arg, "mercator"))
- gp->mode = MERCATOR;
- else
- {
- fprintf (stderr,
- "%s: mode must be 'globe', 'merecator' or 'equirectangular',"
- " not '%s'\n", progname, mode_arg);
- exit (1);
- }
-
- {
- char *f = get_string_resource(mi->dpy, "imageForeground", "Foreground");
- char *b = get_string_resource(mi->dpy, "imageBackground", "Background");
- char *s;
- if (!f) f = strdup("white");
- if (!b) b = strdup("black");
-
- for (s = f + strlen(f)-1; s > f; s--)
- if (*s == ' ' || *s == '\t')
- *s = 0;
- for (s = b + strlen(b)-1; s > b; s--)
- if (*s == ' ' || *s == '\t')
- *s = 0;
-
- free (f);
- free (b);
- }
-
- {
- double spin_speed = 0.1;
- double wander_speed = 0.005;
- gp->rot = make_rotator (do_roll ? spin_speed : 0,
- do_roll ? spin_speed : 0,
- 0, 1,
- do_wander ? wander_speed : 0,
- True);
- gp->z = frand (1.0);
- gp->tilt = frand (23.4);
- gp->trackball = gltrackball_init (True);
- }
-
- if (!wire && !do_texture)
- {
- GLfloat pos[4] = {1, 1, 1, 0};
- GLfloat amb[4] = {0, 0, 0, 1};
- GLfloat dif[4] = {1, 1, 1, 1};
- GLfloat spc[4] = {0, 1, 1, 1};
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- if (wire)
- do_texture = False;
-
- if (do_texture)
- setup_texture (mi);
-
- if (do_stars)
- init_stars (mi);
-
- /* construct the polygons of the planet
- */
- gp->platelist = glGenLists(1);
- glNewList (gp->platelist, GL_COMPILE);
- glFrontFace(GL_CCW);
- glPushMatrix();
- glRotatef (90, 1, 0, 0);
- if (gp->mode == GLOBE)
- unit_sphere (resolution, resolution, wire);
- else
- unit_mercator (resolution, resolution, wire, (gp->mode == MERCATOR));
- glPopMatrix();
- glEndList();
-
- gp->shadowlist = glGenLists(1);
- glNewList (gp->shadowlist, GL_COMPILE);
- glFrontFace(GL_CCW);
-
- if (wire)
- glColor4f (0.5, 0.5, 0, 1);
-# ifdef BLENDED_TERMINATOR
- else
- {
- GLfloat c[] = { 0, 0, 0, 1 };
- glColor4fv (c);
- if (!do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
- }
-# endif
-
- if (gp->mode == GLOBE)
- {
- glPushMatrix();
- glScalef (1.01, 1.01, 1.01);
- unit_dome (resolution, resolution, wire);
-
-# ifdef BLENDED_TERMINATOR
- terminator_tube (mi, resolution);
- if (!wire)
- {
- /* We have to draw the transparent side of the mask too,
- though I'm not sure why. */
- GLfloat c[] = { 0, 0, 0, 0 };
- glColor4fv (c);
- if (!do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
- glRotatef (180, 1, 0, 0);
- unit_dome (resolution, resolution, wire);
- }
-# endif
- }
-
- glPopMatrix();
- glEndList();
-
- /* construct the polygons of the latitude/longitude/axis lines.
- */
- gp->latlonglist = glGenLists(1);
- glNewList (gp->latlonglist, GL_COMPILE);
- glPushMatrix ();
- glRotatef (90, 1, 0, 0); /* unit_sphere is off by 90 */
- glRotatef (8, 0, 1, 0); /* line up the time zones */
- if (gp->mode == GLOBE)
- unit_sphere (12, 24, 1);
- else
- unit_mercator (20, 24, 1, (gp->mode == MERCATOR));
- glBegin(GL_LINES);
- glVertex3f(0, -2, 0);
- glVertex3f(0, 2, 0);
- glEnd();
- glPopMatrix ();
- glEndList();
-}
-
-
-ENTRYPOINT void
-draw_planet (ModeInfo * mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- double x, y, z;
-
- if (!gp->glx_context)
- return;
-
- glDrawBuffer(GL_BACK);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glXMakeCurrent (dpy, window, *gp->glx_context);
-
- mi->polygon_count = 0;
-
- if (gp->button_down_p)
- gp->draw_axis = 60;
- else if (!gp->draw_axis && !(random() % 1000))
- gp->draw_axis = 60 + (random() % 90);
-
- if (do_rotate && !gp->button_down_p)
- {
- int wat = gp->mode == GLOBE ? 1 : -1;
- gp->z -= 0.001 * spin_arg * wat; /* the sun sets in the west */
- if (gp->z < 0) gp->z += 1;
- }
-
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_POINT_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- glPushMatrix();
-
- get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
- x = (x - 0.5) * 6;
- y = (y - 0.5) * 6;
- z = (z - 0.5) * 3;
- glTranslatef(x, y, z);
-
- gltrackball_rotate (gp->trackball);
-
- if (do_roll)
- {
- get_rotation (gp->rot, &x, &y, 0, !gp->button_down_p);
- glRotatef (x * 360, 1.0, 0.0, 0.0);
- glRotatef (y * 360, 0.0, 1.0, 0.0);
- }
- else
- glRotatef (current_device_rotation(), 0, 0, 1);
-
- if (do_stars)
- {
- glDisable(GL_TEXTURE_2D);
- glPushMatrix();
- glScalef (60, 60, 60);
- glRotatef (90, 1, 0, 0);
- glRotatef (35, 1, 0, 0);
- glCallList (gp->starlist);
- mi->polygon_count += gp->starcount;
- glPopMatrix();
- glClear(GL_DEPTH_BUFFER_BIT);
- }
-
- glRotatef (90, 1, 0, 0);
- glRotatef (35, 1, 0, 0);
- glRotatef (10, 0, 1, 0);
- glRotatef (120, 0, 0, 1);
-
- glScalef (3, 3, 3);
-
-# ifdef HAVE_MOBILE
- glScalef (2, 2, 2);
-# endif
-
- if (wire)
- glColor3f (0, 0, 0.5);
- else if (do_texture)
- {
- glColor4f (1, 1, 1, 1);
- glEnable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, gp->tex1);
- }
- else
- {
- GLfloat c[] = { 0, 0.5, 0, 1 };
- glColor4fv (c);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
- }
-
- glPushMatrix();
- glRotatef (gp->z * 360, 0, 0, 1);
- glCallList (gp->platelist);
- mi->polygon_count += resolution*resolution;
- glPopMatrix();
-
- if (wire)
- {
- glPushMatrix();
- glRotatef (gp->tilt, 1, 0, 0);
- glColor3f(1, 0, 0);
- glLineWidth(4);
- glCallList (gp->shadowlist);
- glLineWidth(1);
- mi->polygon_count += resolution*(resolution/2);
- glPopMatrix();
- }
-
- else if (!do_texture || (gp->tex2 && gp->mode == GLOBE))
- {
- /* Originally we just used GL_LIGHT0 to produce the day/night sides of
- the planet, but that always looked crappy, even with a vast number of
- polygons, because the day/night terminator didn't exactly line up with
- the polygon edges.
- */
-
-#ifndef BLENDED_TERMINATOR
-
- /* Method 1, use the depth buffer as a stencil.
-
- - Draw the full "day" sphere;
- - Clear the depth buffer;
- - Draw a rotated/tilted half-sphere into the depth buffer only,
- on the Eastern hemisphere, putting non-zero depth only on the
- sunlit side;
- - Draw the full "night" sphere, which will clip to dark parts only.
-
- That lets us divide the sphere into the two maps, and the dividing
- line can be at any angle, regardless of polygon layout.
-
- The half-sphere is scaled slightly larger to avoid polygon fighting,
- since those triangles won't exactly line up because of the rotation.
-
- The downside of this is that the day/night terminator is 100% sharp.
- */
- glClear (GL_DEPTH_BUFFER_BIT);
- glColorMask (0, 0, 0, 0);
- glDisable (GL_TEXTURE_2D);
- glPushMatrix();
- glRotatef (gp->tilt, 1, 0, 0);
- glScalef (1.01, 1.01, 1.01);
- glCallList (gp->shadowlist); /* Fill in depth on sunlit side */
- mi->polygon_count += resolution*(resolution/2);
- glPopMatrix();
- glColorMask (1, 1, 1, 1);
-
- if (do_texture)
- {
- glEnable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, gp->tex2);
- }
- else
- {
- GLfloat c[] = { 0, 0, 0.5, 1 };
- glColor4fv (c);
- if (! do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
- }
-
- glPushMatrix();
- glRotatef (gp->z * 360, 0, 0, 1);
- glCallList (gp->platelist); /* Fill in color on night side */
- mi->polygon_count += resolution*resolution;
- glPopMatrix();
-
-#else /* BLENDED_TERMINATOR */
-
- /* Method 2, use the alpha buffer as a stencil.
- - Draw the full "day" sphere;
- - Clear the depth buffer;
- - Clear the alpha buffer;
- - Draw a rotated/tilted half-sphere into the alpha buffer only,
- on the Eastern hemisphere, putting non-zero alpha only on the
- sunlit side;
- - Also draw a fuzzy terminator ring into the alpha buffer;
- - Clear the depth buffer again;
- - Draw the full "night" sphere, which will blend to dark parts only.
- */
- glColorMask (0, 0, 0, 1);
- glClear (GL_COLOR_BUFFER_BIT);
- glClear (GL_DEPTH_BUFFER_BIT);
- glDisable (GL_TEXTURE_2D);
-
- glPushMatrix();
- glRotatef (gp->tilt, 1, 0, 0);
- glScalef (1.01, 1.01, 1.01);
- glCallList (gp->shadowlist); /* Fill in alpha on sunlit side */
- mi->polygon_count += resolution*(resolution/2);
- glPopMatrix();
-
- glClear (GL_DEPTH_BUFFER_BIT);
-
- glColorMask (1, 1, 1, 1);
- {
- GLfloat c[] = { 1, 1, 1, 1 };
- glColor4fv (c);
- if (! do_texture)
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
- }
- glEnable (GL_BLEND);
- glBlendFunc (GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
-
- if (do_texture)
- {
- glEnable (GL_TEXTURE_2D);
- glBindTexture (GL_TEXTURE_2D, gp->tex2);
- }
- else
- {
- GLfloat c[] = { 0, 0, 0.5, 1 };
- glColor4fv (c);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
- glEnable (GL_LIGHTING);
- }
-
- glPushMatrix();
- glRotatef (gp->z * 360, 0, 0, 1);
- glCallList (gp->platelist); /* Fill in color on night side */
- mi->polygon_count += resolution*resolution;
- glPopMatrix();
- glDisable (GL_BLEND);
- glBlendFunc (GL_ONE, GL_ZERO);
-
-#endif /* BLENDED_TERMINATOR */
- }
- else if (gp->mode != GLOBE)
- {
- glDisable (GL_LIGHTING);
- glDisable (GL_BLEND);
- }
-
- if (gp->draw_axis)
- {
- glPushMatrix();
- glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
- glScalef (1.02, 1.02, 1.02);
- glDisable (GL_TEXTURE_2D);
- glDisable (GL_LIGHTING);
- glDisable (GL_LINE_SMOOTH);
- glColor3f (0.1, 0.3, 0.1);
- glCallList (gp->latlonglist);
- mi->polygon_count += 24*24;
- glPopMatrix();
- if (!wire && !do_texture)
- glEnable (GL_LIGHTING);
- if (gp->draw_axis) gp->draw_axis--;
- }
- glPopMatrix();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_planet (ModeInfo * mi)
-{
- planetstruct *gp = &planets[MI_SCREEN(mi)];
-
- if (!gp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), gp->window, *gp->glx_context);
-
- if (glIsList(gp->platelist)) glDeleteLists(gp->platelist, 1);
- if (glIsList(gp->shadowlist)) glDeleteLists(gp->shadowlist, 1);
- if (glIsList(gp->latlonglist)) glDeleteLists(gp->latlonglist, 1);
- if (glIsList(gp->starlist)) glDeleteLists(gp->starlist, 1);
- glDeleteTextures(1, &gp->tex1);
- glDeleteTextures(1, &gp->tex2);
-
- if (gp->trackball) gltrackball_free (gp->trackball);
- if (gp->rot) free_rotator (gp->rot);
-}
-
-
-XSCREENSAVER_MODULE_2 ("GLPlanet", glplanet, planet)
-
-#endif
diff --git a/hacks/glx/glplanet.man b/hacks/glx/glplanet.man
deleted file mode 100644
index 26e9d9b..0000000
--- a/hacks/glx/glplanet.man
+++ /dev/null
@@ -1,85 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glplanet \- rotating 3d texture-mapped planet.
-.SH SYNOPSIS
-.B glplanet
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-image \fIfile\fP]
-[\-image2 \fIfile\fP]
-[\-mode \fIstring\fP]
-[\-resolution \fInumber\fP]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-Draws a planet bouncing around in space. The built-in images are day and
-night maps of the Earth, but you can wrap any Equirectangular-projected
-map onto the sphere, e.g., the planetary textures included
-with \fIssystem.\fP
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-image \fIfile\fP
-The day texture map to wrap around the planet's surface.
-.TP 8
-.B \-image2 \fIfile\fP
-The night texture map to wrap around the planet's surface.
-The two will be blended together at the dusk terminator.
-.TP 8
-.B \-mode globe
-All is right with the world.
-.TP 8
-.B \-mode equirectangular
-Wat.
-.TP 8
-.B \-mode mercator
-Good day, Sir. I said GOOD DAY.
-.TP 8
-.B \-resolution
-The resolution of the planetary mesh. Default: 128.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR dymaxionmap (MANSUFFIX)
-.BR ssystem (1)
-.SH COPYRIGHT
-Copyright \(co 2002-2018 by David Konerding and Jamie Zawinski.
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-David Konerding and Jamie Zawinski.
diff --git a/hacks/glx/glschool.c b/hacks/glx/glschool.c
deleted file mode 100644
index 75e40e8..0000000
--- a/hacks/glx/glschool.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/* glschool.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#include "xlockmore.h"
-#include "glschool.h"
-
-#define sws_opts xlockmore_opts
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
-
-#define release_glschool (0)
-#define glschool_handle_event (xlockmore_no_events)
-
-#define DEF_NFISH "100"
-#define DEF_FOG "False"
-#define DEF_DRAWBBOX "True"
-#define DEF_DRAWGOAL "False"
-#define DEF_GOALCHGF "50"
-#define DEF_MAXVEL "7.0"
-#define DEF_MINVEL "1.0"
-#define DEF_ACCLIMIT "8.0"
-#define DEF_DISTEXP "2.2"
-#define DEF_AVOIDFACT "1.5"
-#define DEF_MATCHFACT "0.15"
-#define DEF_CENTERFACT "0.1"
-#define DEF_TARGETFACT "80"
-#define DEF_MINRADIUS "30.0"
-#define DEF_MOMENTUM "0.9"
-#define DEF_DISTCOMP "10.0"
-
-static int NFish;
-static Bool DoFog;
-static Bool DoDrawBBox;
-static Bool DoDrawGoal;
-static int GoalChgFreq;
-static float MinVel;
-static float MaxVel;
-static float DistExp;
-static float AccLimit;
-static float AvoidFact;
-static float MatchFact;
-static float TargetFact;
-static float CenterFact;
-static float MinRadius;
-static float Momentum;
-static float DistComp;
-
-static XrmOptionDescRec opts[] = {
- { "-nfish", ".nfish", XrmoptionSepArg, 0 },
- { "-fog", ".fog", XrmoptionNoArg, "True" },
- { "+fog", ".fog", XrmoptionNoArg, "False" },
- { "-drawgoal", ".drawgoal", XrmoptionNoArg, "True" },
- { "+drawgoal", ".drawgoal", XrmoptionNoArg, "False" },
- { "-drawbbox", ".drawbbox", XrmoptionNoArg, "True" },
- { "+drawbbox", ".drawbbox", XrmoptionNoArg, "False" },
- { "-goalchgf", ".goalchgf", XrmoptionSepArg, 0 },
- { "-maxvel", ".maxvel", XrmoptionSepArg, 0 },
- { "-minvel", ".minvel", XrmoptionSepArg, 0 },
- { "-acclimit", ".acclimit", XrmoptionSepArg, 0 },
- { "-distexp", ".distexp", XrmoptionSepArg, 0 },
- { "-avoidfact", ".avoidfact", XrmoptionSepArg, 0 },
- { "-matchfact", ".matchfact", XrmoptionSepArg, 0 },
- { "-centerfact",".centerfact", XrmoptionSepArg, 0 },
- { "-targetfact",".targetfact", XrmoptionSepArg, 0 },
- { "-minradius", ".minradius", XrmoptionSepArg, 0 },
- { "-distcomp", ".distcomp", XrmoptionSepArg, 0 },
- { "-momentum", ".momentum", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&NFish, "nfish", "NFish", DEF_NFISH, t_Int},
- {&DoFog, "fog", "DoFog", DEF_FOG, t_Bool},
- {&DoDrawBBox, "drawbbox", "DoDrawBBox", DEF_DRAWBBOX, t_Bool},
- {&DoDrawGoal, "drawgoal", "DoDrawGoal", DEF_DRAWGOAL, t_Bool},
- {&GoalChgFreq, "goalchgf", "GoalChgFreq", DEF_GOALCHGF, t_Int},
- {&MaxVel, "maxvel", "MaxVel", DEF_MAXVEL, t_Float},
- {&MinVel, "minvel", "MinVel", DEF_MINVEL, t_Float},
- {&AccLimit, "acclimit", "AccLimit", DEF_ACCLIMIT, t_Float},
- {&DistExp, "distexp", "DistExp", DEF_DISTEXP, t_Float},
- {&AvoidFact, "avoidfact", "AvoidFact", DEF_AVOIDFACT, t_Float},
- {&MatchFact, "matchfact", "MatchFact", DEF_MATCHFACT, t_Float},
- {&CenterFact, "centerfact", "CenterFact", DEF_CENTERFACT, t_Float},
- {&TargetFact, "targetfact", "TargetFact", DEF_TARGETFACT, t_Float},
- {&MinRadius, "minradius", "MinRadius", DEF_MINRADIUS, t_Float},
- {&Momentum, "momentum", "Momentum", DEF_MOMENTUM, t_Float},
- {&DistComp, "distcomp", "DistComp", DEF_DISTCOMP, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt glschool_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-typedef struct {
- int nColors;
- int rotCounter;
- int goalCounter;
- Bool drawGoal;
- Bool drawBBox;
- GLuint bboxList;
- GLuint goalList;
- GLuint fishList;
- int fish_polys, box_polys;
- XColor *colors;
- School *school;
- GLXContext *context;
-} glschool_configuration;
-
-static glschool_configuration *scs = NULL;
-
-ENTRYPOINT void
-reshape_glschool(ModeInfo *mi, int width, int height)
-{
- Bool wire = MI_IS_WIREFRAME(mi);
- double aspect = (double)width/(double)height;
- glschool_configuration *sc = &scs[MI_SCREEN(mi)];
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sc->context);
- if (sc->school != (School *)0) {
- glschool_setBBox(sc->school, -aspect*160, aspect*160, -130, 130, -450, -50.0);
- glDeleteLists(sc->bboxList, 1);
- glschool_createBBoxList(&SCHOOL_BBOX(sc->school),
- &sc->bboxList, wire);
- }
- glschool_reshape(width, height);
-}
-
-ENTRYPOINT void
-init_glschool(ModeInfo *mi)
-{
- int width = MI_WIDTH(mi);
- int height = MI_HEIGHT(mi);
- Bool wire = MI_IS_WIREFRAME(mi);
- glschool_configuration *sc;
-
- MI_INIT (mi, scs);
- sc = &scs[MI_SCREEN(mi)];
-
- sc->drawGoal = DoDrawGoal;
- sc->drawBBox = DoDrawBBox;
-
- sc->nColors = 360;
- sc->context = init_GL(mi);
- sc->colors = (XColor *)calloc(sc->nColors, sizeof(XColor));
- make_color_ramp(0, 0, 0,
- 0.0, 1.0, 1.0,
- 359.0, 1.0, 1.0,
- sc->colors, &sc->nColors,
- False, 0, False);
-
- sc->school = glschool_initSchool(NFish, AccLimit, MaxVel, MinVel, DistExp, Momentum,
- MinRadius, AvoidFact, MatchFact, CenterFact, TargetFact,
- DistComp);
- if (sc->school == (School *)0) {
- fprintf(stderr, "couldn't initialize TheSchool, exiting\n");
- exit(1);
- }
-
- reshape_glschool(mi, width, height);
-
- glschool_initGLEnv(DoFog);
- glschool_initFishes(sc->school);
- glschool_createDrawLists(&SCHOOL_BBOX(sc->school),
- &sc->bboxList, &sc->goalList, &sc->fishList,
- &sc->fish_polys, &sc->box_polys, wire);
- glschool_computeAccelerations(sc->school);
-}
-
-ENTRYPOINT void
-draw_glschool(ModeInfo *mi)
-{
- Window window = MI_WINDOW(mi);
- Display *dpy = MI_DISPLAY(mi);
- glschool_configuration *sc = &scs[MI_SCREEN(mi)];
-
- if (!sc->context) {
- fprintf(stderr, "no context\n");
- return;
- }
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sc->context);
-
- mi->polygon_count = 0;
-
- if ((sc->goalCounter % GoalChgFreq) == 0)
- glschool_newGoal(sc->school);
- sc->goalCounter++;
-
- sc->rotCounter++;
- sc->rotCounter = (sc->rotCounter%360);
-
- glschool_applyMovements(sc->school);
- glschool_drawSchool(sc->colors, sc->school, sc->bboxList,
- sc->goalList, sc->fishList, sc->rotCounter,
- sc->drawGoal, sc->drawBBox,
- sc->fish_polys, sc->box_polys,
- &mi->polygon_count);
- glschool_computeAccelerations(sc->school);
-
- if (mi->fps_p)
- do_fps(mi);
-
- glFinish();
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_glschool(ModeInfo *mi)
-{
- glschool_configuration *sc = &scs[MI_SCREEN(mi)];
-
- if (!sc->context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *sc->context);
-
- if (sc->school) glschool_freeSchool (sc->school);
- if (sc->colors) free (sc->colors);
- if (glIsList(sc->bboxList)) glDeleteLists(sc->bboxList, 1);
- if (glIsList(sc->goalList)) glDeleteLists(sc->goalList, 1);
- if (glIsList(sc->fishList)) glDeleteLists(sc->fishList, 1);
-}
-
-XSCREENSAVER_MODULE("GLSchool", glschool)
diff --git a/hacks/glx/glschool.h b/hacks/glx/glschool.h
deleted file mode 100644
index b6ce7d5..0000000
--- a/hacks/glx/glschool.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* glschool.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#ifndef __GLSCHOOL_H__
-#define __GLSCHOOL_H__
-
-#include "glschool_alg.h"
-#include "glschool_gl.h"
-
-#endif /* __GLSCHOOL_H__ */
diff --git a/hacks/glx/glschool.man b/hacks/glx/glschool.man
deleted file mode 100644
index 676984b..0000000
--- a/hacks/glx/glschool.man
+++ /dev/null
@@ -1,126 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glschool \- a 3D schooling simulation
-.SH SYNOPSIS
-.B glschool
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-wireframe]
-[\-fps]
-[\-delay \fInumber\fP]
-[\-nfish \fInumber\fP]
-[\-maxvel \fInumber\fP]
-[\-minvel \fInumber\fP]
-[\-acclimit \fInumber\fP]
-[\-avoidfact \fInumber\fP]
-[\-matchfact \fInumber\fP]
-[\-centerfact \fInumber\fP]
-[\-targetfact \fInumber\fP]
-[\-minradius \fInumber\fP]
-[\-momentum \fInumber\fP]
-[\-distexp \fInumber\fP]
-[\-goalchgf \fInumber\fP]
-[\-fog]
-[\-drawgoal]
-[\-drawbbox]
-.SH DESCRIPTION
-Uses Craig Reynolds Boids algorithm to simulate a 3d school of
-fish. See <http://www.red3d.com/cwr/boids> for a description
-of the algorithm and the original paper. This is a lightly modified
-version of the algorithm that supports goal attraction.
-
-Many different behaviors are possible by tweaking the parameters. No sanity checking is performed
-on the command line params, so if you want to use negative accelerations or minimum velocity that is
-larger than maximum velocity or that sort of thing, the simulation will try to digest it.
-
-It looks best with the highest number of fish that will give you an FPS of > 25 or so.
-
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.020 seconds.).
-.TP 8
-.B \-wireframe | \-no-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-fog | \-no-fog
- Whether to show foggy (cloudy) water.
-.TP 8
-.B \-drawgoal | \-no-drawgoal
- Whether to show the school's attraction goal.
-.TP 8
-.B \-drawbbox | \-no-drawbbox
- Whether to show the bounding box.
-.TP 8
-.B \-fog | \-no-fog
- Whether to show foggy (cloudy) water.
-.TP 8
-.B \-nfish \fInumber\fP
-Number of fish. Defaults to 100
-.TP 8
-.B \-acclimit \fInumber\fP
-Acceleration limit. Defaults to 8.0
-.TP 8
-.B \-minvel \fInumber\fP
-Minimum velocity. Defaults to 1.0
-.TP 8
-.B \-maxvel \fInumber\fP
-Minimum velocity. Defaults to 7.0
-.TP 8
-.B \-goalchgf \fInumber\fP
-Goal change frequency. Defaults to 50 (frames)
-.TP 8
-.B \-avoidfact \fInumber\fP
-Avoidance acceleration factor. Defaults to 1.5
-.TP 8
-.B \-matchfact \fInumber\fP
-Match avg velocity acceleration factor. Defaults to 0.15
-.TP 8
-.B \-centerfact \fInumber\fP
-School centering acceleration factor. Defaults to 0.1
-.TP 8
-.B \-targetfact \fInumber\fP
-Target attraction acceleration factor. Defaults to 80
-.TP 8
-.B \-distexp \fInumber\fP
-Distance weighting exponent. Defaults to 2.2
-.TP 8
-.B \-momentum \fInumber\fP
-Momentum. Defaults to 0.9
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2005-2006 by David C. Lambert. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-David C. Lambert
diff --git a/hacks/glx/glschool_alg.c b/hacks/glx/glschool_alg.c
deleted file mode 100644
index 09b9e6f..0000000
--- a/hacks/glx/glschool_alg.c
+++ /dev/null
@@ -1,364 +0,0 @@
-/* school_alg.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "yarandom.h"
-#include "glschool_alg.h"
-
-/* for xscreensaver */
-#undef drand48
-#define drand48() frand(1.0)
-
-#define RAD2DEG (180.0 / M_PI)
-
-
-static inline double
-norm(double *dv)
-{
- return sqrt(dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]);
-}
-
-
-static inline void
-addVector(double *v, double *d)
-{
- v[0] += d[0];
- v[1] += d[1];
- v[2] += d[2];
-}
-
-
-static inline void
-clearVector(double *v)
-{
- v[0] = v[1] = v[2] = 0.0;
-}
-
-
-static inline void
-scaleVector(double *v, double s)
-{
- v[0] *= s;
- v[1] *= s;
- v[2] *= s;
-}
-
-
-static inline void
-addScaledVector(double *v, double *d, double s)
-{
- v[0] += d[0]*s;
- v[1] += d[1]*s;
- v[2] += d[2]*s;
-}
-
-
-static inline void
-getDifferenceVector(double *v0, double *v1, double *diff)
-{
- diff[0] = v0[0] - v1[0];
- diff[1] = v0[1] - v1[1];
- diff[2] = v0[2] - v1[2];
-}
-
-
-void
-glschool_initFish(Fish *f, double *mins, double *ranges)
-{
- int i;
-
- for(i = 0; i < 3; i++) {
- FISH_IPOS(f, i) = mins[i] + drand48()*ranges[i];
- FISH_IACC(f, i) = 0.0;
- FISH_IVEL(f, i) = drand48();
- FISH_IMAGIC(f, i) = 0.70 + 0.60*drand48();
- FISH_IOLDVEL(f, i) = 0.0;
- }
-}
-
-
-void
-glschool_initFishes(School *s)
-{
- int i;
- Fish *f = (Fish *)0;
- int nFish = SCHOOL_NFISH(s);
- BBox *bbox = &SCHOOL_BBOX(s);
- double *mins = BBOX_MINS(bbox);
- double *ranges = SCHOOL_BBRANGES(s);
- Fish *theFishes = SCHOOL_FISHES(s);
-
- for(i = 0, f = theFishes; i < nFish; i++, f++)
- glschool_initFish(f, mins, ranges);
-}
-
-
-static void
-applyFishMovements(Fish *f, BBox *bbox, double minVel, double maxVel, double momentum)
-{
- int i;
- int oob = 0;
- double vMag = 0.0;
-
- for(i = 0; i < 3; i++) {
- double pos = FISH_IPOS(f, i);
- oob = (pos > BBOX_IMAX(bbox, i) || pos < BBOX_IMIN(bbox, i));
- if (oob == 0) FISH_IVEL(f, i) += FISH_IACC(f, i) * FISH_IMAGIC(f, i);
- vMag += (FISH_IVEL(f, i) * FISH_IVEL(f, i));
- }
- vMag = sqrt(vMag);
-
- if (vMag > maxVel)
- scaleVector(FISH_VEL(f), maxVel/vMag);
- else if (vMag < minVel)
- scaleVector(FISH_VEL(f), minVel/vMag);
-
- for(i = 0; i < 3; i++) {
- FISH_IVEL(f, i) = momentum * FISH_IOLDVEL(f, i) + (1.0-momentum) * FISH_IVEL(f, i);
- FISH_IPOS(f, i) += FISH_IVEL(f, i);
- FISH_IOLDVEL(f, i) = FISH_IVEL(f, i);
-
- if (FISH_IPOS(f, i) < BBOX_IMIN(bbox, i))
- FISH_IPOS(f, i) = BBOX_IMAX(bbox, i);
- else if (FISH_IPOS(f, i) > BBOX_IMAX(bbox, i))
- FISH_IPOS(f, i) = BBOX_IMIN(bbox, i);
- }
-}
-
-
-void
-glschool_applyMovements(School *s)
-{
- int i = 0;
- Fish *f = (Fish *)0;
- int nFish = SCHOOL_NFISH(s);
- double minVel = SCHOOL_MINVEL(s);
- double maxVel = SCHOOL_MAXVEL(s);
- double momentum = SCHOOL_MOMENTUM(s);
- BBox *bbox = &SCHOOL_BBOX(s);
- Fish *theFishes = SCHOOL_FISHES(s);
-
- for(i = 0, f = theFishes; i < nFish; i++, f++)
- applyFishMovements(f, bbox, minVel, maxVel, momentum);
-}
-
-
-School *
-glschool_initSchool(int nFish, double accLimit, double maxV, double minV, double distExp, double momentum,
- double minRadius, double avoidFact, double matchFact, double centerFact, double targetFact,
- double distComp)
-{
- School *s = (School *)0;
-
- if ((s = (School *)malloc(sizeof(School))) == (School *)0) {
- perror("initSchool School allocation failed: ");
- return s;
- }
-
- if ((SCHOOL_FISHES(s) = (Fish *)malloc(sizeof(Fish)*nFish)) == (Fish *)0) {
- perror("initSchool Fish array allocation failed: ");
- free(s);
- return (School *)0;
- }
-
- SCHOOL_NFISH(s) = nFish;
- SCHOOL_ACCLIMIT(s) = accLimit;
- SCHOOL_MAXVEL(s) = maxV;
- SCHOOL_MINVEL(s) = minV;
- SCHOOL_DISTEXP(s) = distExp;
- SCHOOL_MOMENTUM(s) = momentum;
- SCHOOL_MINRADIUS(s) = minRadius;
- SCHOOL_MINRADIUSEXP(s) = pow(minRadius, distExp);
- SCHOOL_MATCHFACT(s) = matchFact;
- SCHOOL_AVOIDFACT(s) = avoidFact;
- SCHOOL_CENTERFACT(s) = centerFact;
- SCHOOL_TARGETFACT(s) = targetFact;
- SCHOOL_DISTCOMP(s) = distComp;
-
- return s;
-}
-
-void
-glschool_freeSchool(School *s)
-{
- free(SCHOOL_FISHES(s));
- free(s);
-}
-
-void
-glschool_setBBox(School *s, double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
-{
- int i;
- BBox *bbox = &SCHOOL_BBOX(s);
-
- BBOX_XMIN(bbox) = xMin; BBOX_XMAX(bbox) = xMax;
- BBOX_YMIN(bbox) = yMin; BBOX_YMAX(bbox) = yMax;
- BBOX_ZMIN(bbox) = zMin; BBOX_ZMAX(bbox) = zMax;
-
- for(i = 0; i < 3; i++) {
- SCHOOL_IMID(s, i) = BBOX_IMID(bbox, i);
- SCHOOL_IRANGE(s, i) = BBOX_IRANGE(bbox, i);
- }
-}
-
-
-void
-glschool_newGoal(School *s)
-{
- SCHOOL_IGOAL(s,0) = 0.85*(drand48()-0.5)*SCHOOL_IRANGE(s,0) + SCHOOL_IMID(s,0);
- SCHOOL_IGOAL(s,1) = 0.40*(drand48()-0.5)*SCHOOL_IRANGE(s,1) + SCHOOL_IMID(s,1);
- SCHOOL_IGOAL(s,2) = 0.85*(drand48()-0.5)*SCHOOL_IRANGE(s,2) + SCHOOL_IMID(s,2);
-}
-
-
-double
-glschool_computeNormalAndThetaToPlusZ(double *v, double *xV)
-{
- double x1 = 0.0;
- double y1 = 0.0;
- double z1 = 1.0;
- double x2 = v[0];
- double y2 = v[1];
- double z2 = v[2];
- double theta = 0.0;
- double xVNorm = 0.0;
- double sinTheta = 0.0;
- double v2Norm = norm(v);
-
- if (v2Norm == 0.0) {
- xV[1] = 1.0;
- xV[0] = xV[2] = 0.0;
- return theta;
- }
- xV[0] = (y1*z2 - z1*y2);
- xV[1] = -(x1*z2 - z1*x2);
- xV[2] = (x1*y2 - y1*x2);
- xVNorm = norm(xV);
-
- sinTheta = xVNorm/v2Norm;
- return (asin(sinTheta) * RAD2DEG);
-}
-
-
-int
-glschool_computeGroupVectors(School *s, Fish *ref, double *avoidance, double *centroid, double *avgVel)
-{
- int i;
- double dist;
- double adjDist;
- double diffVect[3];
- int neighborCount = 0;
- Fish *test = (Fish *)0;
- int nFish = SCHOOL_NFISH(s);
- double distExp = SCHOOL_DISTEXP(s);
- double distComp = SCHOOL_DISTCOMP(s);
- double minRadiusExp = SCHOOL_MINRADIUSEXP(s);
- Fish *fishes = SCHOOL_FISHES(s);
-
- for(i = 0, test = fishes; i < nFish; i++, test++) {
- if (test == ref) continue;
-
- getDifferenceVector(FISH_POS(ref), FISH_POS(test), diffVect);
-
- dist = norm(diffVect) - distComp;
- if (dist < 0.0) dist = 0.1;
-
- adjDist = pow(dist, distExp);
- if (adjDist > minRadiusExp) continue;
-
- neighborCount++;
-
- addVector(avgVel, FISH_VEL(test));
- addVector(centroid, FISH_POS(test));
-
- addScaledVector(avoidance, diffVect, 1.0/adjDist);
- }
- if (neighborCount > 0) {
- scaleVector(avgVel, 1.0/neighborCount);
- scaleVector(centroid, 1.0/neighborCount);
- }
- return neighborCount;
-}
-
-
-void
-glschool_computeAccelerations(School *s)
-{
- int i;
- int j;
- int neighborCount;
- double dist;
- double adjDist;
- double accMag;
- double avgVel[3];
- double diffVect[3];
- double centroid[3];
- double avoidance[3];
- Fish *ref = (Fish *)0;
- int nFish = SCHOOL_NFISH(s);
- double *goal = SCHOOL_GOAL(s);
- double distExp = SCHOOL_DISTEXP(s);
- double distComp = SCHOOL_DISTCOMP(s);
- double avoidFact = SCHOOL_AVOIDFACT(s);
- double matchFact = SCHOOL_MATCHFACT(s);
- double centerFact = SCHOOL_CENTERFACT(s);
- double targetFact = SCHOOL_TARGETFACT(s);
- double accLimit = SCHOOL_ACCLIMIT(s);
- double minRadius = SCHOOL_MINRADIUS(s);
- Fish *fishes = SCHOOL_FISHES(s);
-
- for(i = 0, ref = fishes; i < nFish; i++, ref++) {
- clearVector(avgVel);
- clearVector(centroid);
- clearVector(avoidance);
- clearVector(FISH_ACC(ref));
- neighborCount = glschool_computeGroupVectors(s, ref, avoidance, centroid, avgVel);
-
- /* avoidanceAccel[] = avoidance[] * AvoidFact */
- scaleVector(avoidance, avoidFact);
- addVector(FISH_ACC(ref), avoidance);
-
- accMag = norm(FISH_ACC(ref));
- if (neighborCount > 0 && accMag < accLimit) {
- for(j = 0; j < 3; j++) {
- FISH_IAVGVEL(ref, j) = avgVel[j];
- FISH_IACC(ref, j) += ((avgVel[j] - FISH_IVEL(ref, j)) * matchFact);
- }
-
- accMag = norm(FISH_ACC(ref));
- if (accMag < accLimit) {
- for(j = 0; j < 3; j++)
- FISH_IACC(ref, j) += ((centroid[j] - FISH_IPOS(ref, j)) * centerFact);
- }
- }
-
- accMag = norm(FISH_ACC(ref));
- if (accMag < accLimit) {
- getDifferenceVector(goal, FISH_POS(ref), diffVect);
-
- dist = norm(diffVect) - distComp;
- if (dist < 0.0) dist = 0.1;
-
- /*adjDist = pow(dist, distExp);*/
- if (dist > minRadius) {
- adjDist = pow(dist, distExp);
- for(j = 0; j < 3; j++)
- FISH_IACC(ref, j) += (diffVect[j]*targetFact/adjDist);
- }
- }
- }
-}
diff --git a/hacks/glx/glschool_alg.h b/hacks/glx/glschool_alg.h
deleted file mode 100644
index 339e778..0000000
--- a/hacks/glx/glschool_alg.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* glschool_alg.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#ifndef __GLSCHOOL_ALG_H__
-#define __GLSCHOOL_ALG_H__
-
-typedef struct {
- double mins[3];
- double maxs[3];
-} BBox;
-
-#define BBOX_XMIN(b) ((b)->mins[0])
-#define BBOX_YMIN(b) ((b)->mins[1])
-#define BBOX_ZMIN(b) ((b)->mins[2])
-#define BBOX_MINS(b) ((b)->mins)
-#define BBOX_IMIN(b, i) ((b)->mins[(i)])
-
-#define BBOX_XMAX(b) ((b)->maxs[0])
-#define BBOX_YMAX(b) ((b)->maxs[1])
-#define BBOX_ZMAX(b) ((b)->maxs[2])
-#define BBOX_MAXS(b) ((b)->maxs)
-#define BBOX_IMAX(b, i) ((b)->maxs[(i)])
-
-#define BBOX_IMID(b, i) (((b)->maxs[(i)] + (b)->mins[(i)])/2.0)
-#define BBOX_IRANGE(b, i) ((b)->maxs[(i)] - (b)->mins[(i)])
-
-typedef struct {
- double pos[3];
- double vel[3];
- double accel[3];
- double oldVel[3];
- double magic[3];
- double avgVel[3];
-} Fish;
-
-#define FISH_POS(f) ((f)->pos)
-#define FISH_X(f) ((f)->pos[0])
-#define FISH_Y(f) ((f)->pos[1])
-#define FISH_Z(f) ((f)->pos[2])
-
-#define FISH_VEL(f) ((f)->vel)
-#define FISH_VX(f) ((f)->vel[0])
-#define FISH_VY(f) ((f)->vel[1])
-#define FISH_VZ(f) ((f)->vel[2])
-
-#define FISH_ACC(f) ((f)->accel)
-#define FISH_MAGIC(f) ((f)->magic)
-#define FISH_OLDVEL(f) ((f)->oldVel)
-#define FISH_AVGVEL(f) ((f)->avgVel)
-#define FISH_IPOS(f, i) ((f)->pos[(i)])
-#define FISH_IVEL(f, i) ((f)->vel[(i)])
-#define FISH_IACC(f, i) ((f)->accel[(i)])
-#define FISH_IMAGIC(f, i) ((f)->magic[(i)])
-#define FISH_IOLDVEL(f, i) ((f)->oldVel[(i)])
-#define FISH_IAVGVEL(f, i) ((f)->avgVel[(i)])
-
-typedef struct {
- int nFish;
- double maxVel;
- double minVel;
- double distExp;
- double momentum;
- double accLimit;
- double minRadius;
- double minRadiusExp;
- double avoidFact;
- double matchFact;
- double centerFact;
- double targetFact;
- double distComp;
- double goal[3];
- double boxMids[3];
- double boxRanges[3];
- BBox theBox;
- Fish *theFish;
-} School;
-
-#define SCHOOL_NFISH(s) ((s)->nFish)
-#define SCHOOL_MAXVEL(s) ((s)->maxVel)
-#define SCHOOL_MINVEL(s) ((s)->minVel)
-#define SCHOOL_DISTEXP(s) ((s)->distExp)
-#define SCHOOL_MOMENTUM(s) ((s)->momentum)
-#define SCHOOL_ACCLIMIT(s) ((s)->accLimit)
-#define SCHOOL_MINRADIUS(s) ((s)->minRadius)
-#define SCHOOL_MINRADIUSEXP(s) ((s)->minRadiusExp)
-#define SCHOOL_MATCHFACT(s) ((s)->matchFact)
-#define SCHOOL_AVOIDFACT(s) ((s)->avoidFact)
-#define SCHOOL_CENTERFACT(s) ((s)->centerFact)
-#define SCHOOL_TARGETFACT(s) ((s)->targetFact)
-#define SCHOOL_DISTCOMP(s) ((s)->distComp)
-#define SCHOOL_GOAL(s) ((s)->goal)
-#define SCHOOL_IGOAL(s,i) ((s)->goal[(i)])
-#define SCHOOL_BBMINS(s) ((s)->bbox.mins)
-#define SCHOOL_BBMAXS(s) ((s)->bbox.maxs)
-#define SCHOOL_BBMIDS(s) ((s)->boxMids)
-#define SCHOOL_IMID(s,i) ((s)->boxMids[(i)])
-#define SCHOOL_BBRANGES(s) ((s)->boxRanges)
-#define SCHOOL_IRANGE(s,i) ((s)->boxRanges[(i)])
-#define SCHOOL_BBOX(s) ((s)->theBox)
-#define SCHOOL_FISHES(s) ((s)->theFish)
-#define SCHOOL_IFISH(s,i) ((s)->theFish[i])
-
-extern void glschool_initFishes(School *);
-extern void glschool_initFish(Fish *, double *, double *);
-
-extern void glschool_applyMovements(School *);
-/* extern void applyFishMovements(Fish *, BBox *, double, double, double); */
-
-extern void glschool_freeSchool(School *);
-extern School *glschool_initSchool(int, double, double, double, double, double, double, double, double, double, double, double);
-
-extern void glschool_newGoal(School *);
-extern void glschool_setBBox(School *, double, double, double, double, double, double);
-
-extern void glschool_computeAccelerations(School *);
-extern double glschool_computeNormalAndThetaToPlusZ(double *, double *);
-int glschool_computeGroupVectors(School *, Fish *, double *, double *, double *);
-
-#endif /* __GLSCHOOL_ALG_H__ */
diff --git a/hacks/glx/glschool_gl.c b/hacks/glx/glschool_gl.c
deleted file mode 100644
index 660580b..0000000
--- a/hacks/glx/glschool_gl.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/* glschool_gl.c, Copyright (c) 2005-2012 David C. Lambert <dcl@panix.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "sphere.h"
-#include "glschool_gl.h"
-#include "sphere.h"
-#include "tube.h"
-
-void
-glschool_drawGoal(double *goal, GLuint goalList)
-{
- glColor3f(1.0, 0.0, 0.0);
- glPushMatrix();
- {
- glTranslatef(goal[0], goal[1], goal[2]);
- glColor3f(1.0, 0.0, 0.0);
- glCallList(goalList);
- }
- glPopMatrix();
-}
-
-int
-glschool_drawBoundingBox(BBox *bbox, Bool wire)
-{
- int polys = 0;
- double xMin = BBOX_XMIN(bbox);
- double yMin = BBOX_YMIN(bbox);
- double zMin = BBOX_ZMIN(bbox);
-
- double xMax = BBOX_XMAX(bbox);
- double yMax = BBOX_YMAX(bbox);
- double zMax = BBOX_ZMAX(bbox);
-
- glFrontFace(GL_CCW);
- if (wire) glLineWidth(5.0);
-
- /* back */
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glColor3f(0.0, 0.0, .15);
- glVertex3f(xMin, yMin, zMin);
- glVertex3f(xMax, yMin, zMin);
- glVertex3f(xMax, yMax, zMin);
- glVertex3f(xMin, yMax, zMin);
- polys++;
- glEnd();
-
- /* left */
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glColor3f(0.0, 0.0, .2);
- glVertex3f(xMin, yMin, zMax);
- glVertex3f(xMin, yMin, zMin);
- glVertex3f(xMin, yMax, zMin);
- glVertex3f(xMin, yMax, zMax);
- polys++;
- glEnd();
-
- /* right */
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glColor3f(0.0, 0.0, .2);
- glVertex3f(xMax, yMin, zMin);
- glVertex3f(xMax, yMin, zMax);
- glVertex3f(xMax, yMax, zMax);
- glVertex3f(xMax, yMax, zMin);
- polys++;
- glEnd();
-
- /* top */
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glColor3f(0.0, 0.0, .1);
- glVertex3f(xMax, yMax, zMax);
- glVertex3f(xMin, yMax, zMax);
- glVertex3f(xMin, yMax, zMin);
- glVertex3f(xMax, yMax, zMin);
- polys++;
- glEnd();
-
- /* bottom */
- glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
- glColor3f(0.0, 0.0, .3);
- glVertex3f(xMin, yMin, zMax);
- glVertex3f(xMax, yMin, zMax);
- glVertex3f(xMax, yMin, zMin);
- glVertex3f(xMin, yMin, zMin);
- polys++;
- glEnd();
-
- if (wire) glLineWidth(1.0);
-
- return polys;
-}
-
-int
-glschool_createBBoxList(BBox *bbox, GLuint *bboxList, int wire)
-{
- int polys = 0;
- *bboxList = glGenLists(1);
- glNewList(*bboxList, GL_COMPILE);
- polys = glschool_drawBoundingBox(bbox, wire);
- glEndList();
- return polys;
-}
-
-void
-glschool_createDrawLists(BBox *bbox, GLuint *bboxList, GLuint *goalList, GLuint *fishList, int *fish_polys, int *box_polys, int wire)
-{
-
- int faces = 16;
-
- *box_polys = 0;
- *fish_polys = 0;
-
- *box_polys += glschool_createBBoxList(bbox, bboxList, wire);
-
- *box_polys = 0;
- *fish_polys = 0;
-
- *goalList = glGenLists(1);
- glNewList(*goalList, GL_COMPILE);
- glScalef (5, 5, 5);
- *box_polys += unit_sphere (10, 10, wire);
- glEndList();
-
- *fishList = glGenLists(1);
- glNewList(*fishList, GL_COMPILE);
- *fish_polys += cone (0, 0, 0,
- 0, 0, 10,
- 2, 0,
- faces, True, (faces <= 3), /* cap */
- wire);
- glTranslatef (0, 0, -0.3);
- glScalef (2, 2, 2);
- glRotatef (90, 1, 0, 0);
- if (faces > 3)
- *fish_polys += unit_sphere (faces, faces, wire);
- glEndList();
-}
-
-
-void
-glschool_initLights(void)
-{
- GLfloat amb[4] = {0.1, 0.1, 0.1, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat pos[4] = {0.0, 50.0, -50.0, 1.0};
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
-
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHTING);
-}
-
-void
-glschool_initFog(void)
-{
- GLfloat fog[4] = {0.0, 0.0, 0.15, 1.0};
-
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_EXP2);
- glFogfv(GL_FOG_COLOR, fog);
- glFogf(GL_FOG_DENSITY, .0025);
- glFogf(GL_FOG_START, -100);
-}
-
-void
-glschool_initGLEnv(Bool doFog)
-{
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glClearDepth(1.0);
- glDepthFunc(GL_LESS);
-
- glEnable(GL_COLOR_MATERIAL);
- glMateriali(GL_FRONT, GL_SHININESS, 128);
- glMaterialfv(GL_FRONT, GL_SPECULAR, spc);
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, spc);
-
- glEnable(GL_NORMALIZE);
- glEnable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glEnable(GL_CULL_FACE);
-
- glschool_initLights();
- if (doFog) glschool_initFog();
-}
-
-void
-glschool_reshape(int width, int height)
-{
- GLfloat h = (GLfloat) width / (GLfloat) height;
-
- glViewport (0, 0, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(60.0, h, 0.1, 451.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-}
-
-void
-glschool_getColorVect(XColor *colors, int index, double *colorVect)
-{
- colorVect[0] = colors[index].red / 65535.0;
- colorVect[1] = colors[index].green / 65535.0;
- colorVect[2] = colors[index].blue / 65535.0;
-}
-
-void
-glschool_drawSchool(XColor *colors, School *s,
- GLuint bboxList, GLuint goalList, GLuint fishList,
- int rotCounter, Bool drawGoal_p, Bool drawBBox_p,
- int fish_polys, int box_polys, unsigned long *polys)
-{
- double xVect[3];
- double colorVect[3];
- int i = 0;
- double rotTheta = 0.0;
- double colTheta = 0.0;
- Fish *f = (Fish *)0;
- int nFish = SCHOOL_NFISH(s);
- Fish *theFishes = SCHOOL_FISHES(s);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- if (drawBBox_p) {
- glDisable(GL_LIGHTING);
- glCallList(bboxList);
- glEnable(GL_LIGHTING);
- *polys += box_polys;
- }
-
- if (drawGoal_p) glschool_drawGoal(SCHOOL_GOAL(s), goalList);
-
- for(i = 0, f = theFishes; i < nFish; i++, f++) {
- colTheta = glschool_computeNormalAndThetaToPlusZ(FISH_AVGVEL(f), xVect);
- rotTheta = glschool_computeNormalAndThetaToPlusZ(FISH_VEL(f), xVect);
-
- if (FISH_IAVGVEL(f,2) < 0.0) colTheta = 180.0 - colTheta;
- if (FISH_VZ(f) < 0.0) rotTheta = 180.0 - rotTheta;
-
- glschool_getColorVect(colors, (int)(colTheta+240)%360, colorVect);
- glColor3f(colorVect[0], colorVect[1], colorVect[2]);
-
- glPushMatrix();
- {
- glTranslatef(FISH_X(f), FISH_Y(f), FISH_Z(f));
- glRotatef(180.0+rotTheta, xVect[0], xVect[1], xVect[2]);
- glCallList(fishList);
- *polys += fish_polys;
- }
- glPopMatrix();
- }
-
- glFinish();
-}
diff --git a/hacks/glx/glschool_gl.h b/hacks/glx/glschool_gl.h
deleted file mode 100644
index 1676643..0000000
--- a/hacks/glx/glschool_gl.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* glschool_gl.h, Copyright (c) 2005-2006, 2021
- * -David C. Lambert <dcl@panix.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-#ifndef __GLSCHOOL_GL_H__
-#define __GLSCHOOL_GL_H__
-
-#include "xlockmoreI.h"
-#include "glschool_alg.h"
-
-extern void glschool_initFog(void);
-extern void glschool_initGLEnv(Bool);
-extern void glschool_initLights(void);
-extern void glschool_reshape(int, int);
-extern void glschool_drawGoal(double *, GLuint);
-extern void glschool_getColorVect(XColor *, int, double *);
-extern int glschool_drawBoundingBox(BBox *, Bool);
-extern int glschool_createBBoxList(BBox *, GLuint *, int);
-extern void glschool_createDrawLists(BBox *, GLuint *, GLuint *, GLuint *, int *, int *, Bool);
-extern void glschool_drawSchool(XColor *, School *, GLuint, GLuint, GLuint, int, Bool, Bool,
- int, int, unsigned long *);
-
-#endif /* __GLSCHOOL_GL_H__ */
diff --git a/hacks/glx/glsl-utils.c b/hacks/glx/glsl-utils.c
deleted file mode 100644
index e4d5d31..0000000
--- a/hacks/glx/glsl-utils.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/* glsl-utils.c --- support functions for GLSL in OpenGL hacks.
- * Copyright (c) 2020-2021 Carsten Steger <carsten@mirsanmir.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhackI.h"
-#include "glsl-utils.h"
-
-#include <math.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#ifdef HAVE_GLSL
-
-extern const char *progname;
-
-/* Copy a 4x4 column-major matrix: c = m. */
-void glsl_CopyMatrix(GLfloat c[16], GLfloat m[16])
-{
- int i, j;
-
- for (j=0; j<4; j++)
- for (i=0; i<4; i++)
- c[GLSL__LINCOOR(i,j,4)] = m[GLSL__LINCOOR(i,j,4)];
-}
-
-
-/* Create a 4x4 column-major identity matrix. */
-void glsl_Identity(GLfloat c[16])
-{
- int i, j;
-
- for (j=0; j<4; j++)
- for (i=0; i<4; i++)
- c[GLSL__LINCOOR(i,j,4)] = (i==j);
-}
-
-
-/* Multiply two 4x4 column-major matrices: c = c*m. */
-void glsl_MultMatrix(GLfloat c[16], GLfloat m[16])
-{
- int i, j;
- GLfloat t[16];
-
- /* Copy c to t. */
- glsl_CopyMatrix(t,c);
- /* Compute c = t*m. */
- for (j=0; j<4; j++)
- for (i=0; i<4; i++)
- c[GLSL__LINCOOR(i,j,4)] =
- (t[GLSL__LINCOOR(i,0,4)]*m[GLSL__LINCOOR(0,j,4)]+
- t[GLSL__LINCOOR(i,1,4)]*m[GLSL__LINCOOR(1,j,4)]+
- t[GLSL__LINCOOR(i,2,4)]*m[GLSL__LINCOOR(2,j,4)]+
- t[GLSL__LINCOOR(i,3,4)]*m[GLSL__LINCOOR(3,j,4)]);
-}
-
-
-/* Multiply a 4x4 column-major matrix by a rotation matrix that rotates
- around the axis (x,y,z) by the angle angle: c = c*r(angle,x,y,z). */
-void glsl_Rotate(GLfloat c[16], GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
- GLfloat l, t, ct, st, omct, n[3], r[16];
-
- l = sqrtf(x*x+y*y+z*z);
- n[0] = x/l;
- n[1] = y/l;
- n[2] = z/l;
- t = angle*180.0f/M_PI;
- ct = cosf(t);
- st = sinf(t);
- omct = 1.0f-ct;
-
- r[GLSL__LINCOOR(0,0,4)] = n[0]*n[0]*omct+ct;
- r[GLSL__LINCOOR(1,0,4)] = n[0]*n[1]*omct+n[2]*st;
- r[GLSL__LINCOOR(2,0,4)] = n[0]*n[2]*omct-n[1]*st;
- r[GLSL__LINCOOR(3,0,4)] = 0.0f;
-
- r[GLSL__LINCOOR(0,1,4)] = n[0]*n[1]*omct-n[2]*st;
- r[GLSL__LINCOOR(1,1,4)] = n[1]*n[1]*omct+ct;
- r[GLSL__LINCOOR(2,1,4)] = n[1]*n[2]*omct+n[0]*st;
- r[GLSL__LINCOOR(3,1,4)] = 0.0f;
-
- r[GLSL__LINCOOR(0,2,4)] = n[0]*n[2]*omct+n[1]*st;
- r[GLSL__LINCOOR(1,2,4)] = n[1]*n[2]*omct-n[0]*st;
- r[GLSL__LINCOOR(2,2,4)] = n[2]*n[2]*omct+ct;
- r[GLSL__LINCOOR(3,2,4)] = 0.0f;
-
- r[GLSL__LINCOOR(0,3,4)] = 0.0f;
- r[GLSL__LINCOOR(1,3,4)] = 0.0f;
- r[GLSL__LINCOOR(2,3,4)] = 0.0f;
- r[GLSL__LINCOOR(3,3,4)] = 1.0f;
-
- glsl_MultMatrix(c,r);
-}
-
-
-/* Multiply a 4x4 column-major matrix by a matrix that stretches, shrinks,
- or reflects an object along the axes: c = c*m(sx,sy,sz). */
-void glsl_Scale(GLfloat c[16], GLfloat sx, GLfloat sy, GLfloat sz)
-{
- int i;
-
- for (i=0; i<4; i++)
- {
- c[GLSL__LINCOOR(i,0,4)] *= sx;
- c[GLSL__LINCOOR(i,1,4)] *= sy;
- c[GLSL__LINCOOR(i,2,4)] *= sz;
- }
-}
-
-
-/* Multiply a 4x4 column-major matrix by a matrix that translates an object
- by a translation vector: c = c*t(tx,ty,tz). */
-void glsl_Translate(GLfloat c[16], GLfloat tx, GLfloat ty, GLfloat tz)
-{
- int i;
-
- for (i=0; i<4; i++)
- {
- c[GLSL__LINCOOR(i,3,4)] = (tx*c[GLSL__LINCOOR(i,0,4)]+
- ty*c[GLSL__LINCOOR(i,1,4)]+
- tz*c[GLSL__LINCOOR(i,2,4)]+
- c[GLSL__LINCOOR(i,3,4)]);
- }
-}
-
-
-/* Add a perspective projection to a 4x4 column-major matrix. */
-void glsl_Perspective(GLfloat c[16], GLfloat fovy, GLfloat aspect,
- GLfloat z_near, GLfloat z_far)
-{
- GLfloat m[16];
- double s, cot, dz;
- double rad;
-
- rad = fovy*(0.5f*(float)M_PI/180.0f);
- dz = z_far-z_near;
- s = sinf(rad);
- if (dz == 0.0f || s == 0.0f || aspect == 0.0f)
- return;
- cot = cosf(rad)/s;
-
- glsl_Identity(m);
- m[GLSL__LINCOOR(0,0,4)] = cot/aspect;
- m[GLSL__LINCOOR(1,1,4)] = cot;
- m[GLSL__LINCOOR(2,2,4)] = -(z_far+z_near)/dz;
- m[GLSL__LINCOOR(3,2,4)] = -1.0f;
- m[GLSL__LINCOOR(2,3,4)] = -2.0f*z_near*z_far/dz;
- m[GLSL__LINCOOR(3,3,4)] = 0.0f;
- glsl_MultMatrix(c,m);
-}
-
-
-/* Add an orthographic projection to a 4x4 column-major matrix. */
-void glsl_Orthographic(GLfloat c[16], GLfloat left, GLfloat right,
- GLfloat bottom, GLfloat top,
- GLfloat nearval, GLfloat farval)
-{
- GLfloat m[16];
-
- if (left == right || bottom == top || nearval == farval)
- return;
-
- glsl_Identity(m);
- m[GLSL__LINCOOR(0,0,4)] = 2.0f/(right-left);
- m[GLSL__LINCOOR(0,3,4)] = -(right+left)/(right-left);
- m[GLSL__LINCOOR(1,1,4)] = 2.0f/(top-bottom);
- m[GLSL__LINCOOR(1,3,4)] = -(top+bottom)/(top-bottom);
- m[GLSL__LINCOOR(2,2,4)] = -2.0f/(farval-nearval);
- m[GLSL__LINCOOR(2,3,4)] = -(farval+nearval)/(farval-nearval);
- glsl_MultMatrix(c,m);
-}
-
-
-/* Get the OpenGL and GLSL versions. */
-GLboolean glsl_GetGlAndGlslVersions(GLint *gl_major, GLint *gl_minor,
- GLint *glsl_major, GLint *glsl_minor,
- GLboolean *gl_gles3)
-{
- const char *gl_version, *glsl_version;
- int n;
- const char *err = 0;
-
- *gl_major = -1;
- *gl_minor = -1;
- *glsl_major = 1;
- *glsl_minor = -1;
- *gl_gles3 = GL_FALSE;
- gl_version = (const char *)glGetString(GL_VERSION);
- glsl_version = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
- if (gl_version == NULL || glsl_version == NULL)
- {
- err = "GL version unknown";
- goto DONE;
- }
- if (!strncmp(gl_version,"OpenGL ES",9))
- {
- if (!strncmp(glsl_version,"OpenGL ES GLSL ES",17))
- *gl_gles3 = GL_TRUE;
- else
- {
- err = "GLSL not supported";
- goto DONE;
- }
- }
- if (*gl_gles3)
- n = sscanf(&gl_version[9],"%d.%d",gl_major,gl_minor);
- else
- n = sscanf(gl_version,"%d.%d",gl_major,gl_minor);
- if (n != 2)
- {
- err = "GL version number unparsable";
- goto DONE;
- }
- if (*gl_gles3)
- n = sscanf(&glsl_version[17],"%d.%d",glsl_major,glsl_minor);
- else
- n = sscanf(glsl_version,"%d.%d",glsl_major,glsl_minor);
- if (n != 2)
- {
- err = "GLSL version number unparsable";
- goto DONE;
- }
-
- DONE:
-
-#if 0/*# ifndef __OPTIMIZE__*/
- if (err)
- fprintf (stderr, "%s: GLSL: %s\n", progname, err);
- else
- fprintf (stderr, "%s: GLSL available: GL=%d.%d, GLSL=%d.%d GLES3=%d\n",
- progname,
- *gl_major, *gl_minor,
- *glsl_major, *glsl_minor,
- *gl_gles3 ? 1 : 0);
-# endif
-
- return (err ? GL_FALSE : GL_TRUE);
-}
-
-
-#define PRINT_ERRORS
-/* #undef PRINT_ERRORS */
-
-#ifdef PRINT_ERRORS
-
-#define PRINT_COMPILE_ERROR(shader) print_compile_error(shader)
-#define PRINT_LINK_ERROR(program) print_link_error(program)
-
-static void print_compile_error(GLuint shader)
-{
- GLint length_log;
- GLsizei length;
- GLchar *log;
-
- glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&length_log);
- if (length_log > 0)
- {
- log = malloc(length_log*sizeof(*log));
- if (log != NULL)
- {
- glGetShaderInfoLog(shader,length_log,&length,log);
- fprintf(stderr,"%s: %s",progname,log);
- }
- free(log);
- }
-}
-
-
-static void print_link_error(GLuint program)
-{
- GLint length_log;
- GLsizei length;
- GLchar *log;
-
- glGetProgramiv(program,GL_INFO_LOG_LENGTH,&length_log);
- if (length_log > 0)
- {
- log = malloc(length_log*sizeof(*log));
- if (log != NULL)
- {
- glGetProgramInfoLog(program,length_log,&length,log);
- fprintf(stderr,"%s: %s",progname,log);
- }
- free(log);
- }
-}
-
-#else
-
-#define PRINT_COMPILE_ERROR(shader)
-#define PRINT_LINK_ERROR(program)
-
-#endif
-
-
-/* Compile and link a vertex and a Fragment shader into a GLSL program. */
-GLboolean glsl_CompileAndLinkShaders(GLsizei vertex_shader_count,
- const GLchar **vertex_shader_source,
- GLsizei fragment_shader_count,
- const GLchar **fragment_shader_source,
- GLuint *shader_program)
-{
- GLuint vertex_shader, fragment_shader;
- GLint status;
- const char *err = 0;
-
- /* Create and compile the vertex shader. */
- vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- if (vertex_shader == 0)
- return GL_FALSE;
- fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
- if (fragment_shader == 0)
- {
- glDeleteShader(vertex_shader);
- err = "unable to create fragment shader";
- goto DONE;
- }
- glShaderSource(vertex_shader,vertex_shader_count,vertex_shader_source,
- NULL);
- glShaderSource(fragment_shader,fragment_shader_count,fragment_shader_source,
- NULL);
- glCompileShader(vertex_shader);
- glGetShaderiv(vertex_shader,GL_COMPILE_STATUS,&status);
- if (status == GL_FALSE)
- {
- PRINT_COMPILE_ERROR(vertex_shader);
- glDeleteShader(vertex_shader);
- glDeleteShader(fragment_shader);
- err = "vertex shader compilation failed";
- goto DONE;
- }
- glCompileShader(fragment_shader);
- glGetShaderiv(fragment_shader,GL_COMPILE_STATUS,&status);
- if (status == GL_FALSE)
- {
- PRINT_COMPILE_ERROR(fragment_shader);
- glDeleteShader(vertex_shader);
- glDeleteShader(fragment_shader);
- err = "fragment shader compilation failed";
- goto DONE;
- }
- *shader_program = glCreateProgram();
- if (*shader_program == 0)
- {
- glDeleteShader(vertex_shader);
- glDeleteShader(fragment_shader);
- err = "shader creation failed";
- goto DONE;
- }
- glAttachShader(*shader_program,vertex_shader);
- glAttachShader(*shader_program,fragment_shader);
- glLinkProgram(*shader_program);
- glGetProgramiv(*shader_program,GL_LINK_STATUS,&status);
- if (status == GL_FALSE)
- {
- PRINT_LINK_ERROR(*shader_program);
- glDeleteProgram(*shader_program);
- glDeleteShader(vertex_shader);
- glDeleteShader(fragment_shader);
- err = "shader attachment failed";
- goto DONE;
- }
- /* Once the shader program has compiled successfully, we can delete the
- vertex and fragment shaders. */
- glDeleteShader(vertex_shader);
- glDeleteShader(fragment_shader);
-
- DONE:
- if (err)
- fprintf (stderr, "%s: GLSL: %s\n", progname, err);
-#if 0/*# ifndef __OPTIMIZE__*/
- else
- fprintf (stderr, "%s: GLSL: shaders initialized\n", progname);
-# endif
-
- return (err ? GL_FALSE : GL_TRUE);
-}
-
-
-#endif /* HAVE_GLSL */
diff --git a/hacks/glx/glsl-utils.h b/hacks/glx/glsl-utils.h
deleted file mode 100644
index 20edc9d..0000000
--- a/hacks/glx/glsl-utils.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* glsl-utils.h --- support functions for GLSL in OpenGL hacks.
- * Copyright (c) 2020-2021 Carsten Steger <carsten@mirsanmir.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-
-#ifndef __GLSL_UTILS_H__
-#define __GLSL_UTILS_H__
-
-#ifdef HAVE_GLSL
-
-
-/* Column-major linearized matrix coordinate */
-#define GLSL__LINCOOR(r,c,h) ((c)*(h)+(r))
-
-
-/* Copy a 4x4 column-major matrix: c = m. */
-extern void glsl_CopyMatrix(GLfloat c[16], GLfloat m[16]);
-
-/* Create a 4x4 column-major identity matrix. */
-extern void glsl_Identity(GLfloat c[16]);
-
-/* Multiply two 4x4 column-major matrices: c = c*m. */
-extern void glsl_MultMatrix(GLfloat c[16], GLfloat m[16]);
-
-/* Multiply a 4x4 column-major matrix by a rotation matrix that rotates
- around the axis (x,y,z) by the angle angle: c = c*r(angle,x,y,z). */
-extern void glsl_Rotate(GLfloat c[16], GLfloat angle, GLfloat x, GLfloat y,
- GLfloat z);
-
-/* Multiply a 4x4 column-major matrix by a matrix that stretches, shrinks,
- or reflects an object along the axes: c = c*s(sx,sy,sz). */
-extern void glsl_Scale(GLfloat c[16], GLfloat sx, GLfloat sy, GLfloat sz);
-
-/* Multiply a 4x4 column-major matrix by a matrix that translates an object
- by a translation vector: c = c*t(tx,ty,tz). */
-extern void glsl_Translate(GLfloat c[16], GLfloat tx, GLfloat ty, GLfloat tz);
-
-/* Add a perspective projection to a 4x4 column-major matrix. */
-extern void glsl_Perspective(GLfloat c[16], GLfloat fovy, GLfloat aspect,
- GLfloat z_near, GLfloat z_far);
-
-/* Add an orthographic projection to a 4x4 column-major matrix. */
-extern void glsl_Orthographic(GLfloat c[16], GLfloat left, GLfloat right,
- GLfloat bottom, GLfloat top,
- GLfloat nearval, GLfloat farval);
-
-/* Get the OpenGL and GLSL versions. */
-extern GLboolean glsl_GetGlAndGlslVersions(GLint *gl_major,
- GLint *gl_minor,
- GLint *glsl_major,
- GLint *glsl_minor,
- GLboolean *gl_gles3);
-
-/* Compile and link a vertex and a Fragment shader into a GLSL program. */
-extern GLboolean glsl_CompileAndLinkShaders(GLsizei vertex_shader_count,
- const GLchar **vertex_shader_source,
- GLsizei fragment_shader_count,
- const GLchar **fragment_shader_source,
- GLuint *shader_program);
-
-
-#endif /* HAVE_GLSL */
-
-
-#endif /* __GLSL_UTILS_H__ */
diff --git a/hacks/glx/glslideshow.c b/hacks/glx/glslideshow.c
deleted file mode 100644
index 88055e3..0000000
--- a/hacks/glx/glslideshow.c
+++ /dev/null
@@ -1,1308 +0,0 @@
-/* glslideshow, Copyright (c) 2003-2020 Jamie Zawinski <jwz@jwz.org>
- * Loads a sequence of images and smoothly pans around them; crossfades
- * when loading new images.
- *
- * Originally written by Mike Oliphant <oliphant@gtk.org> (c) 2002, 2003.
- * Rewritten by jwz, 21-Jun-2003.
- * Rewritten by jwz again, 6-Feb-2005.
- * Modified by Richard Weeks <rtweeks21@gmail.com> Copyright (c) 2020
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- *****************************************************************************
- *
- * Image loading happens in three stages:
- *
- * 1: Fork a process and run xscreensaver-getimage in the background.
- * This writes image data to a server-side X pixmap.
- *
- * 2: When that completes, a callback informs us that the pixmap is ready.
- * We must then download the pixmap data from the server with XGetImage
- * (or XShmGetImage.)
- *
- * 3: Once we have the bits, we must convert them from server-native bitmap
- * layout to 32 bit RGBA in client-endianness, and copy that into an
- * OpenGL texture.
- *
- * The speed of step 1 doesn't really matter, since that happens in the
- * background. Steps 2 and 3 happen in *this* process.
- *
- * Step 2 can't be moved to another process without opening a second
- * connection to the X server, which is pretty heavy-weight. (That would
- * be possible, though; the other process could open an X connection,
- * retrieve the pixmap, and feed it back to us through a pipe or
- * something.)
- *
- * Step 3 is carried out over the course of several animation frames. The
- * bits are processed in "stripes" small enough to complete within a single
- * frame. Each stripe is first converted to a client-endian, 32 bit RGBA
- * XImage, then copied into the partially completed OpenGL texture.
- *
- * This entire process is accomplished via a texture loader created with
- * alloc_texture_loader.
- */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*wireframe: False \n" \
- "*showFPS: False \n" \
- "*fpsSolid: True \n" \
- "*useSHM: True \n" \
- "*titleFont: sans-serif 18\n" \
- "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
- "*grabDesktopImages: False \n" \
- "*chooseRandomImages: True \n"
-
-# define release_slideshow 0
-# include "xlockmore.h"
-
-#ifdef USE_GL
-
-
-# define DEF_FADE_DURATION "2"
-# define DEF_PAN_DURATION "6"
-# define DEF_IMAGE_DURATION "30"
-# define DEF_ZOOM "75"
-# define DEF_FPS_CUTOFF "5"
-# define DEF_TITLES "False"
-# define DEF_LETTERBOX "True"
-# define DEF_DEBUG "False"
-# define DEF_MIPMAP "True"
-
-#include "grab-ximage.h"
-#include "texfont.h"
-
-typedef struct {
- double x, y, w, h;
-} rect;
-
-typedef struct {
- ModeInfo *mi;
- int id; /* unique number for debugging */
- char *title; /* the filename of this image */
- int w, h; /* size in pixels of the image */
- int tw, th; /* size in pixels of the texture */
- XRectangle geom; /* where in the image the bits are */
- Bool loaded_p; /* whether the image has finished loading */
- Bool used_p; /* whether the image has yet appeared
- on screen */
- GLuint texid; /* which texture contains the image */
- int refcount; /* how many sprites refer to this image */
- texture_loader_t *loader; /* asynchronous image loader */
-} image;
-
-
-typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
-
-typedef struct {
- int id; /* unique number for debugging */
- image *img; /* which image this animation displays */
- GLfloat opacity; /* how to render it */
- double start_time; /* when this animation began */
- rect from, to, current; /* the journey this image is taking */
- sprite_state state; /* the state we're in right now */
- sprite_state prev_state; /* the state we were in previously */
- double state_time; /* time of last state change */
- int frame_count; /* frames since last state change */
-} sprite;
-
-
-typedef struct {
- GLXContext *glx_context;
- int nimages; /* how many images are loaded or loading now */
- image *images[10]; /* pointers to the images */
-
- int nsprites; /* how many sprites are animating right now */
- sprite *sprites[10]; /* pointers to the live sprites */
-
- double now; /* current time in seconds */
- double dawn_of_time; /* when the program launched */
- double image_load_time; /* time when we last loaded a new image */
- double prev_frame_time; /* time when we last drew a frame */
-
- Bool awaiting_first_image_p; /* Early in startup: nothing to display yet */
- Bool redisplay_needed_p; /* Sometimes we can get away with not
- re-painting. Tick this if a redisplay
- is required. */
- Bool change_now_p; /* Set when the user clicks to ask for a new
- image right now. */
-
- GLfloat fps; /* approximate frame rate we're achieving */
- GLfloat theoretical_fps; /* maximum frame rate that might be possible */
- Bool checked_fps_p; /* Whether we have checked for a low
- frame rate. */
-
- texture_font_data *font_data; /* for printing image file names */
-
- int sprite_id, image_id; /* debugging id counters */
-
- double time_elapsed;
- int frames_elapsed;
-
-} slideshow_state;
-
-static slideshow_state *sss = NULL;
-
-
-/* Command-line arguments
- */
-static int fade_seconds; /* Duration in seconds of fade transitions.
- If 0, jump-cut instead of fading. */
-static int pan_seconds; /* Duration of each pan through an image. */
-static int image_seconds; /* How many seconds until loading a new image. */
-static int zoom; /* How far in to zoom when panning, in percent of
- image size: that is, 75 means "when zoomed all
- the way in, 75% of the image will be visible."
- */
-static int fps_cutoff; /* If the frame-rate falls below this, turn off
- zooming.*/
-static Bool letterbox_p; /* When a loaded image is not the same aspect
- ratio as the window, whether to display black
- bars.
- */
-static Bool mipmap_p; /* Use mipmaps instead of single textures. */
-static Bool do_titles; /* Display image titles. */
-static Bool debug_p; /* Be loud and do weird things. */
-
-
-static XrmOptionDescRec opts[] = {
- {"-fade", ".fadeDuration", XrmoptionSepArg, 0 },
- {"-pan", ".panDuration", XrmoptionSepArg, 0 },
- {"-duration", ".imageDuration", XrmoptionSepArg, 0 },
- {"-zoom", ".zoom", XrmoptionSepArg, 0 },
- {"-cutoff", ".FPScutoff", XrmoptionSepArg, 0 },
- {"-titles", ".titles", XrmoptionNoArg, "True" },
- {"-letterbox", ".letterbox", XrmoptionNoArg, "True" },
- {"-no-letterbox", ".letterbox", XrmoptionNoArg, "False" },
- {"-clip", ".letterbox", XrmoptionNoArg, "False" },
- {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
- {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
- {"-debug", ".debug", XrmoptionNoArg, "True" },
-};
-
-static argtype vars[] = {
- { &fade_seconds, "fadeDuration", "FadeDuration", DEF_FADE_DURATION, t_Int},
- { &pan_seconds, "panDuration", "PanDuration", DEF_PAN_DURATION, t_Int},
- { &image_seconds, "imageDuration","ImageDuration",DEF_IMAGE_DURATION, t_Int},
- { &zoom, "zoom", "Zoom", DEF_ZOOM, t_Int},
- { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
- { &letterbox_p, "letterbox", "Letterbox", DEF_LETTERBOX, t_Bool},
- { &fps_cutoff, "FPScutoff", "FPSCutoff", DEF_FPS_CUTOFF, t_Int},
- { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
- { &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt slideshow_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-static const char *
-blurb (void)
-{
-# ifdef HAVE_JWXYZ
- return "GLSlideshow";
-# else
- static char buf[255];
- time_t now = time ((time_t *) 0);
- char *ct = (char *) ctime (&now);
- int n = strlen(progname);
- if (n > 100) n = 99;
- strncpy(buf, progname, n);
- buf[n++] = ':';
- buf[n++] = ' ';
- strncpy(buf+n, ct+11, 8);
- strcpy(buf+n+9, ": ");
- return buf;
-# endif
-}
-
-
-/* Returns the current time in seconds as a double.
- */
-static double
-double_time (void)
-{
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- return (now.tv_sec + ((double) now.tv_usec * 0.000001));
-}
-
-
-static void image_loaded_cb (const char *filename, XRectangle *geom,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure);
-
-
-/* Allocate an image structure and start a file loading in the background.
- */
-static image *
-alloc_image (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- image *img = (image *) calloc (1, sizeof (*img));
-
- img->id = ++ss->image_id;
- img->loaded_p = False;
- img->used_p = False;
- img->mi = mi;
-
- glGenTextures (1, &img->texid);
- if (img->texid <= 0) abort();
-
- ss->image_load_time = ss->now;
-
- if (wire)
- image_loaded_cb (0, 0, 0, 0, 0, 0, img);
- else
- load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
- 0, 0, mipmap_p, img->texid, image_loaded_cb, img);
-
- ss->images[ss->nimages++] = img;
- if (ss->nimages >= countof(ss->images)) abort();
-
- return img;
-}
-
-
-/* Allocate an image structure and start asynchronous file loading in the
- background.
-
- The texture_loader_t referenced by *result->loader must be stepped with
- step_texture_loader() until it calls back to the callback function passed
- to it.
- */
-static image *
-alloc_image_incremental (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- image *img = (image *) calloc (1, sizeof (*img));
-
- img->id = ++ss->image_id;
- img->loaded_p = False;
- img->used_p = False;
- img->mi = mi;
-
- glGenTextures (1, &img->texid);
- if (img->texid <= 0) abort();
-
- ss->image_load_time = ss->now;
-
- if (wire)
- image_loaded_cb (0, 0, 0, 0, 0, 0, img);
- else
- img->loader = alloc_texture_loader (mi->xgwa.screen, mi->window,
- *ss->glx_context, 0, 0, mipmap_p,
- img->texid);
-
- ss->images[ss->nimages++] = img;
- if (ss->nimages >= countof(ss->images)) abort();
-
- return img;
-}
-
-
-/* Callback that tells us that the texture has been loaded.
- */
-static void
-image_loaded_cb (const char *filename, XRectangle *geom,
- int image_width, int image_height,
- int texture_width, int texture_height,
- void *closure)
-{
- image *img = (image *) closure;
- ModeInfo *mi = img->mi;
- /* slideshow_state *ss = &sss[MI_SCREEN(mi)]; */
-
- int wire = MI_IS_WIREFRAME(mi);
-
- if (wire)
- {
- img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
- img->h = MI_HEIGHT (mi);
- img->geom.width = img->w;
- img->geom.height = img->h;
- goto DONE;
- }
-
- if (img->loader)
- {
- texture_loader_t *loader = img->loader;
- img->loader = 0;
- free_texture_loader(loader);
- }
-
- if (image_width == 0 || image_height == 0)
- exit (1);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
-
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- img->w = image_width;
- img->h = image_height;
- img->tw = texture_width;
- img->th = texture_height;
- img->geom = *geom;
- img->title = (filename ? strdup (filename) : 0);
-
- /* If the image's width doesn't come back as the width of the screen,
- then the image must have been scaled down (due to insufficient
- texture memory.) Scale up the coordinates to stretch the image
- to fill the window.
- */
- if (img->w != MI_WIDTH(mi))
- {
- double scale = (double) MI_WIDTH(mi) / img->w;
- img->w *= scale;
- img->h *= scale;
- img->tw *= scale;
- img->th *= scale;
- img->geom.x *= scale;
- img->geom.y *= scale;
- img->geom.width *= scale;
- img->geom.height *= scale;
- }
-
- /* xscreensaver-getimage returns paths relative to the image directory
- now, so leave the sub-directory part in. Unless it's an absolute path.
- */
- if (img->title && img->title[0] == '/')
- {
- /* strip filename to part between last "/" and end. */
- /* xscreensaver-getimage has already stripped off the extension. */
- char *s = strrchr (img->title, '/');
- if (s) strcpy (img->title, s+1);
- }
-
- if (debug_p)
- fprintf (stderr, "%s: loaded img %2d: \"%s\"\n",
- blurb(), img->id, (img->title ? img->title : "(null)"));
- DONE:
-
- img->loaded_p = True;
-}
-
-
-
-/* Free the image and texture, after nobody is referencing it.
- */
-static void
-destroy_image (ModeInfo *mi, image *img)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- Bool freed_p = False;
- int i;
-
- if (!img) abort();
- /* if (!img->loaded_p) abort(); */
- /* if (!img->used_p) abort(); */
- if (img->texid <= 0) abort();
- if (img->refcount != 0) abort();
-
- for (i = 0; i < ss->nimages; i++) /* unlink it from the list */
- if (ss->images[i] == img)
- {
- int j;
- for (j = i; j < ss->nimages-1; j++) /* pull remainder forward */
- ss->images[j] = ss->images[j+1];
- ss->images[j] = 0;
- ss->nimages--;
- freed_p = True;
- break;
- }
-
- if (!freed_p) abort();
-
- if (debug_p)
- fprintf (stderr, "%s: unloaded img %2d: \"%s\"\n",
- blurb(), img->id, (img->title ? img->title : "(null)"));
-
- if (img->title) free (img->title);
- glDeleteTextures (1, &img->texid);
- free (img);
-}
-
-
-/* Return an image to use for a sprite.
- If it's time for a new one, get a new one.
- Otherwise, use an old one.
- Might return 0 if the machine is really slow.
- */
-static image *
-get_image (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- image *img = 0;
- double now = ss->now;
- Bool want_new_p = (ss->change_now_p ||
- ss->image_load_time + image_seconds <= now);
- image *new_img = 0;
- image *old_img = 0;
- image *loading_img = 0;
- int i;
-
- for (i = 0; i < ss->nimages; i++)
- {
- image *img2 = ss->images[i];
- if (!img2) abort();
- if (!img2->loaded_p)
- loading_img = img2;
- else if (!img2->used_p)
- new_img = img2;
- else
- old_img = img2;
- }
-
- if (want_new_p && new_img)
- img = new_img, new_img = 0, ss->change_now_p = False;
- else if (old_img)
- img = old_img, old_img = 0;
- else if (new_img)
- img = new_img, new_img = 0, ss->change_now_p = False;
-
- /* Make sure that there is always one unused image in the pipe.
- */
- if (!new_img && !loading_img)
- alloc_image_incremental (mi);
-
- return img;
-}
-
-
-/* Pick random starting and ending positions for the given sprite.
- */
-static void
-randomize_sprite (ModeInfo *mi, sprite *sp)
-{
- int vp_w = MI_WIDTH(mi);
- int vp_h = MI_HEIGHT(mi);
- int img_w = sp->img->geom.width;
- int img_h = sp->img->geom.height;
- int min_w, max_w;
- double ratio = (double) img_h / img_w;
-
- if (letterbox_p)
- {
- min_w = img_w;
- }
- else
- {
- if (img_w < vp_w)
- min_w = vp_w;
- else
- min_w = img_w * (float) vp_h / img_h;
- }
-
- max_w = min_w * 100 / zoom;
-
- sp->from.w = min_w + frand ((max_w - min_w) * 0.4);
- sp->to.w = max_w - frand ((max_w - min_w) * 0.4);
- sp->from.h = sp->from.w * ratio;
- sp->to.h = sp->to.w * ratio;
-
- if (zoom == 100) /* only one box, and it is centered */
- {
- sp->from.x = (sp->from.w > vp_w
- ? -(sp->from.w - vp_w) / 2
- : (vp_w - sp->from.w) / 2);
- sp->from.y = (sp->from.h > vp_h
- ? -(sp->from.h - vp_h) / 2
- : (vp_h - sp->from.h) / 2);
- sp->to = sp->from;
- }
- else /* position both boxes randomly */
- {
- sp->from.x = (sp->from.w > vp_w
- ? -frand (sp->from.w - vp_w)
- : frand (vp_w - sp->from.w));
- sp->from.y = (sp->from.h > vp_h
- ? -frand (sp->from.h - vp_h)
- : frand (vp_h - sp->from.h));
- sp->to.x = (sp->to.w > vp_w
- ? -frand (sp->to.w - vp_w)
- : frand (vp_w - sp->to.w));
- sp->to.y = (sp->to.h > vp_h
- ? -frand (sp->to.h - vp_h)
- : frand (vp_h - sp->to.h));
- }
-
- if (random() & 1)
- {
- rect swap = sp->to;
- sp->to = sp->from;
- sp->from = swap;
- }
-
- /* Make sure the aspect ratios are within 0.001 of each other.
- */
- {
- int r1 = 0.5 + (sp->from.w * 1000 / sp->from.h);
- int r2 = 0.5 + (sp->to.w * 1000 / sp->to.h);
- if (r1 < r2-1 || r1 > r2+1)
- {
- fprintf (stderr,
- "%s: botched aspect: %f x %f (%d) vs %f x %f (%d): %s\n",
- progname,
- sp->from.w, sp->from.h, r1,
- sp->to.w, sp->to.h, r2,
- (sp->img->title ? sp->img->title : "[null]"));
- abort();
- }
- }
-
- sp->from.x /= vp_w;
- sp->from.y /= vp_h;
- sp->from.w /= vp_w;
- sp->from.h /= vp_h;
- sp->to.x /= vp_w;
- sp->to.y /= vp_h;
- sp->to.w /= vp_w;
- sp->to.h /= vp_h;
-}
-
-
-/* Allocate a new sprite and start its animation going.
- */
-static sprite *
-new_sprite (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- image *img = get_image (mi);
- sprite *sp;
-
- if (!img)
- {
- /* Oops, no images yet! The machine is probably hurting bad.
- Let's give it some time before thrashing again. */
- usleep (250000);
- return 0;
- }
-
- sp = (sprite *) calloc (1, sizeof (*sp));
- sp->id = ++ss->sprite_id;
- sp->start_time = ss->now;
- sp->state_time = sp->start_time;
- sp->state = sp->prev_state = NEW;
- sp->img = img;
-
- sp->img->refcount++;
- sp->img->used_p = True;
-
- ss->sprites[ss->nsprites++] = sp;
- if (ss->nsprites >= countof(ss->sprites)) abort();
-
- randomize_sprite (mi, sp);
-
- return sp;
-}
-
-
-/* Free the given sprite, and decrement the reference count on its image.
- */
-static void
-destroy_sprite (ModeInfo *mi, sprite *sp)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- Bool freed_p = False;
- image *img;
- int i;
-
- if (!sp) abort();
- if (sp->state != DEAD) abort();
- img = sp->img;
- if (!img) abort();
- if (!img->loaded_p) abort();
- if (!img->used_p) abort();
- if (img->refcount <= 0) abort();
-
- for (i = 0; i < ss->nsprites; i++) /* unlink it from the list */
- if (ss->sprites[i] == sp)
- {
- int j;
- for (j = i; j < ss->nsprites-1; j++) /* pull remainder forward */
- ss->sprites[j] = ss->sprites[j+1];
- ss->sprites[j] = 0;
- ss->nsprites--;
- freed_p = True;
- break;
- }
-
- if (!freed_p) abort();
- free (sp);
- sp = 0;
-
- img->refcount--;
- if (img->refcount < 0) abort();
- if (img->refcount == 0)
- destroy_image (mi, img);
-}
-
-
-/* Updates the sprite for the current frame of the animation based on
- its creation time compared to the current wall clock.
- */
-static void
-tick_sprite (ModeInfo *mi, sprite *sp)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- image *img = sp->img;
- double now = ss->now;
- double secs;
- double ratio;
- rect prev_rect = sp->current;
- GLfloat prev_opacity = sp->opacity;
-
- if (! sp->img) abort();
- if (! img->loaded_p) abort();
-
- secs = now - sp->start_time;
- ratio = secs / (pan_seconds + fade_seconds);
- if (ratio > 1) ratio = 1;
-
- sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
- sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
- sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
- sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
-
- sp->prev_state = sp->state;
-
- if (secs < fade_seconds)
- {
- sp->state = IN;
- sp->opacity = secs / (GLfloat) fade_seconds;
- }
- else if (secs < pan_seconds)
- {
- sp->state = FULL;
- sp->opacity = 1;
- }
- else if (secs < pan_seconds + fade_seconds)
- {
- sp->state = OUT;
- sp->opacity = 1 - ((secs - pan_seconds) / (GLfloat) fade_seconds);
- }
- else
- {
- sp->state = DEAD;
- sp->opacity = 0;
- }
-
- if (sp->state != sp->prev_state &&
- (sp->prev_state == IN ||
- sp->prev_state == FULL))
- {
- double secs = now - sp->state_time;
-
- if (debug_p)
- fprintf (stderr,
- "%s: %s %3d frames %2.0f sec %5.1f fps (%.1f fps?)\n",
- blurb(),
- (sp->prev_state == IN ? "fade" : "pan "),
- sp->frame_count,
- secs,
- sp->frame_count / secs,
- ss->theoretical_fps);
-
- sp->state_time = now;
- sp->frame_count = 0;
- }
-
- sp->frame_count++;
-
- if (sp->state != DEAD &&
- (prev_rect.x != sp->current.x ||
- prev_rect.y != sp->current.y ||
- prev_rect.w != sp->current.w ||
- prev_rect.h != sp->current.h ||
- prev_opacity != sp->opacity))
- ss->redisplay_needed_p = True;
-}
-
-
-/* Draw the given sprite at the phase of its animation dictated by
- its creation time compared to the current wall clock.
- */
-static void
-draw_sprite (ModeInfo *mi, sprite *sp)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- image *img = sp->img;
-
- if (! sp->img) abort();
- if (! img->loaded_p) abort();
-
- glPushMatrix();
- {
- glTranslatef (sp->current.x, sp->current.y, 0);
- glScalef (sp->current.w, sp->current.h, 1);
-
- if (wire) /* Draw a grid inside the box */
- {
- GLfloat dy = 0.1;
- GLfloat dx = dy * img->w / img->h;
- GLfloat x, y;
-
- if (sp->id & 1)
- glColor4f (sp->opacity, 0, 0, 1);
- else
- glColor4f (0, 0, sp->opacity, 1);
-
- glBegin(GL_LINES);
- glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
-
- for (y = 0; y < 1+dy; y += dy)
- {
- GLfloat yy = (y > 1 ? 1 : y);
- for (x = 0.5; x < 1+dx; x += dx)
- {
- GLfloat xx = (x > 1 ? 1 : x);
- glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
- glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
- }
- for (x = 0.5; x > -dx; x -= dx)
- {
- GLfloat xx = (x < 0 ? 0 : x);
- glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
- glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
- }
- }
- glEnd();
- }
- else /* Draw the texture quad */
- {
- GLfloat texw = img->geom.width / (GLfloat) img->tw;
- GLfloat texh = img->geom.height / (GLfloat) img->th;
- GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
- GLfloat texy1 = img->geom.y / (GLfloat) img->th;
- GLfloat texx2 = texx1 + texw;
- GLfloat texy2 = texy1 + texh;
-
- glBindTexture (GL_TEXTURE_2D, img->texid);
- glColor4f (1, 1, 1, sp->opacity);
- glNormal3f (0, 0, 1);
- glBegin (GL_QUADS);
- glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
- glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
- glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
- glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
- glEnd();
-
- if (debug_p) /* Draw a border around the image */
- {
- if (!wire) glDisable (GL_TEXTURE_2D);
-
- if (sp->id & 1)
- glColor4f (sp->opacity, 0, 0, 1);
- else
- glColor4f (0, 0, sp->opacity, 1);
-
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0);
- glEnd();
-
- if (!wire) glEnable (GL_TEXTURE_2D);
- }
- }
-
-
- if (do_titles &&
- img->title && *img->title &&
- (sp->state == IN || sp->state == FULL))
- {
- glColor4f (1, 1, 1, sp->opacity);
- print_texture_label (mi->dpy, ss->font_data,
- mi->xgwa.width, mi->xgwa.height,
- 1, img->title);
- }
- }
- glPopMatrix();
-
- if (debug_p)
- {
- if (!wire) glDisable (GL_TEXTURE_2D);
-
- if (sp->id & 1)
- glColor4f (1, 0, 0, 1);
- else
- glColor4f (0, 0, 1, 1);
-
- /* Draw the "from" and "to" boxes
- */
- glBegin (GL_LINE_LOOP);
- glVertex3f (sp->from.x, sp->from.y, 0);
- glVertex3f (sp->from.x + sp->from.w, sp->from.y, 0);
- glVertex3f (sp->from.x + sp->from.w, sp->from.y + sp->from.h, 0);
- glVertex3f (sp->from.x, sp->from.y + sp->from.h, 0);
- glEnd();
-
- glBegin (GL_LINE_LOOP);
- glVertex3f (sp->to.x, sp->to.y, 0);
- glVertex3f (sp->to.x + sp->to.w, sp->to.y, 0);
- glVertex3f (sp->to.x + sp->to.w, sp->to.y + sp->to.h, 0);
- glVertex3f (sp->to.x, sp->to.y + sp->to.h, 0);
- glEnd();
-
- if (!wire) glEnable (GL_TEXTURE_2D);
- }
-}
-
-
-static void
-tick_sprites (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- int i;
- for (i = 0; i < ss->nsprites; i++)
- tick_sprite (mi, ss->sprites[i]);
-}
-
-
-static void
-draw_sprites (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- int i;
-
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
-/*
- {
- GLfloat rot = current_device_rotation();
- glTranslatef (0.5, 0.5, 0);
- glRotatef(rot, 0, 0, 1);
- if ((rot > 45 && rot < 135) ||
- (rot < -45 && rot > -135))
- {
- GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
- glScalef (s, 1/s, 1);
- }
- glTranslatef (-0.5, -0.5, 0);
- }
-*/
-
- for (i = 0; i < ss->nsprites; i++)
- draw_sprite (mi, ss->sprites[i]);
- glPopMatrix();
-
- if (debug_p) /* draw a white box (the "screen") */
- {
- int wire = MI_IS_WIREFRAME(mi);
-
- if (!wire) glDisable (GL_TEXTURE_2D);
-
- glColor4f (1, 1, 1, 1);
- glBegin (GL_LINE_LOOP);
- glVertex3f (0, 0, 0);
- glVertex3f (0, 1, 0);
- glVertex3f (1, 1, 0);
- glVertex3f (1, 0, 0);
- glEnd();
-
- if (!wire) glEnable (GL_TEXTURE_2D);
- }
-}
-
-
-ENTRYPOINT void
-reshape_slideshow (ModeInfo *mi, int width, int height)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- GLfloat s;
- glViewport (0, 0, width, height);
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity();
- glRotatef (current_device_rotation(), 0, 0, 1);
- glMatrixMode (GL_MODELVIEW);
- glLoadIdentity();
-
- s = 2;
-
- if (debug_p)
- {
- s *= (zoom / 100.0) * 0.75;
- if (s < 0.1) s = 0.1;
- }
-
- glScalef (s, s, s);
- glTranslatef (-0.5, -0.5, 0);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- ss->redisplay_needed_p = True;
-}
-
-
-ENTRYPOINT Bool
-slideshow_handle_event (ModeInfo *mi, XEvent *event)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
-
- if (event->xany.type == Expose ||
- event->xany.type == GraphicsExpose ||
- event->xany.type == VisibilityNotify)
- {
- ss->redisplay_needed_p = True;
- if (debug_p)
- fprintf (stderr, "%s: exposure\n", blurb());
- return False;
- }
- else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
- {
- ss->change_now_p = True;
- return True;
- }
-
- return False;
-}
-
-
-/* Do some sanity checking on various user-supplied values, and make
- sure they are all internally consistent.
- */
-static void
-sanity_check (ModeInfo *mi)
-{
- if (zoom < 1) zoom = 1; /* zoom is a positive percentage */
- else if (zoom > 100) zoom = 100;
-
- if (zoom == 100) /* with no zooming, there is no panning */
- pan_seconds = 0;
-
- if (pan_seconds < fade_seconds) /* pan is inclusive of fade */
- pan_seconds = fade_seconds;
-
- if (pan_seconds == 0) /* no zero-length cycles, please... */
- pan_seconds = 1;
-
- if (image_seconds < pan_seconds) /* we only change images at fade-time */
- image_seconds = pan_seconds;
-
- /* If we're not panning/zooming within the image, then there's no point
- in crossfading the image with itself -- only do crossfades when changing
- to a new image. */
- if (zoom == 100 && pan_seconds < image_seconds)
- pan_seconds = image_seconds;
-
- /* No need to use mipmaps if we're not changing the image size much */
- if (zoom >= 80) mipmap_p = False;
-
- if (fps_cutoff < 0) fps_cutoff = 0;
- else if (fps_cutoff > 30) fps_cutoff = 30;
-}
-
-
-static void
-check_fps (ModeInfo *mi)
-{
-#ifndef HAVE_JWXYZ /* always assume Cocoa and mobile are fast enough */
-
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
-
- double start_time, end_time, wall_elapsed, frame_duration, fps;
- int i;
-
- start_time = ss->now;
- end_time = double_time();
- frame_duration = end_time - start_time; /* time spent drawing this frame */
- ss->time_elapsed += frame_duration; /* time spent drawing all frames */
- ss->frames_elapsed++;
-
- wall_elapsed = end_time - ss->dawn_of_time;
- fps = ss->frames_elapsed / ss->time_elapsed;
- ss->theoretical_fps = fps;
-
- if (ss->checked_fps_p) return;
-
- if (wall_elapsed <= 8) /* too early to be sure */
- return;
-
- ss->checked_fps_p = True;
-
- if (fps >= fps_cutoff)
- {
- if (debug_p)
- fprintf (stderr,
- "%s: %.1f fps is fast enough (with %d frames in %.1f secs)\n",
- blurb(), fps, ss->frames_elapsed, wall_elapsed);
- return;
- }
-
- fprintf (stderr,
- "%s: only %.1f fps! Turning off pan/fade to compensate...\n",
- blurb(), fps);
- zoom = 100;
- fade_seconds = 0;
-
- sanity_check (mi);
-
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- randomize_sprite (mi, sp);
- sp->state = FULL;
- }
-
- ss->redisplay_needed_p = True;
-
- /* Need this in case zoom changed. */
- reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
-#endif /* HAVE_JWXYZ */
-}
-
-
-/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
- */
-static void
-hack_resources (void)
-{
-#if 0
- char *res = "desktopGrabber";
- char *val = get_string_resource (res, "DesktopGrabber");
- char buf1[255];
- char buf2[255];
- XrmValue value;
- sprintf (buf1, "%.100s.%.100s", progclass, res);
- sprintf (buf2, "%.200s -v", val);
- value.addr = buf2;
- value.size = strlen(buf2);
- XrmPutResource (&db, buf1, "String", &value);
- free (val);
-#endif
-}
-
-
-ENTRYPOINT void
-init_slideshow (ModeInfo *mi)
-{
- int screen = MI_SCREEN(mi);
- slideshow_state *ss;
- int wire = MI_IS_WIREFRAME(mi);
-
- MI_INIT (mi, sss);
- ss = &sss[screen];
-
- if ((ss->glx_context = init_GL(mi)) != NULL) {
- reshape_slideshow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- } else {
- MI_CLEARWINDOW(mi);
- }
-
- if (debug_p)
- fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
- blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
-
- sanity_check(mi);
-
- if (debug_p)
- fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n\n",
- blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
-
- glDisable (GL_LIGHTING);
- glDisable (GL_DEPTH_TEST);
- glDepthMask (GL_FALSE);
- glEnable (GL_CULL_FACE);
- glCullFace (GL_BACK);
-
- if (! wire)
- {
- glEnable (GL_TEXTURE_2D);
- glShadeModel (GL_SMOOTH);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- if (debug_p) glLineWidth (3);
-
- ss->font_data = load_texture_font (mi->dpy, "titleFont");
-
- if (debug_p)
- hack_resources();
-
- ss->now = double_time();
- ss->dawn_of_time = ss->now;
- ss->prev_frame_time = ss->now;
-
- ss->awaiting_first_image_p = True;
- alloc_image (mi);
-}
-
-
-static void
-slideshow_idle (ModeInfo *mi);
-
-
-ENTRYPOINT void
-draw_slideshow (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- int i;
-
- if (!ss->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ss->glx_context);
-
- if (ss->awaiting_first_image_p)
- {
- image *img = ss->images[0];
- if (!img) abort();
- if (!img->loaded_p)
- return;
-
- ss->awaiting_first_image_p = False;
- ss->dawn_of_time = double_time();
-
- /* start the very first sprite fading in */
- new_sprite (mi);
- }
-
- ss->now = double_time();
-
- /* Each sprite has three states: fading in, full, fading out.
- The in/out states overlap like this:
-
- iiiiiiFFFFFFFFFFFFoooooo . . . . . . . . . . . . . . . . .
- . . . . . . . . . iiiiiiFFFFFFFFFFFFoooooo . . . . . . . .
- . . . . . . . . . . . . . . . . . . iiiiiiFFFFFFFFFFFFooooo
-
- So as soon as a sprite goes into the "out" state, we create
- a new sprite (in the "in" state.)
- */
-
- if (ss->nsprites > 2) abort();
-
- /* If a sprite is just entering the fade-out state,
- then add a new sprite in the fade-in state.
- */
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- if (sp->state != sp->prev_state &&
- sp->state == (fade_seconds == 0 ? DEAD : OUT))
- new_sprite (mi);
- }
-
- tick_sprites (mi);
-
- /* Now garbage collect the dead sprites.
- */
- for (i = 0; i < ss->nsprites; i++)
- {
- sprite *sp = ss->sprites[i];
- if (sp->state == DEAD)
- {
- destroy_sprite (mi, sp);
- i--;
- }
- }
-
- /* We can only ever end up with no sprites at all if the machine is
- being really slow and we hopped states directly from FULL to DEAD
- without passing OUT... */
- if (ss->nsprites == 0)
- new_sprite (mi);
-
- if (!ss->redisplay_needed_p)
- /* Nothing to do! Don't bother drawing a texture or even swapping the
- frame buffers. Note that this means that the FPS display will be
- wrong: "Load" will be frozen on whatever it last was, when in
- reality it will be close to 0. */
- {
- slideshow_idle (mi);
- return;
- }
-
- if (debug_p && ss->now - ss->prev_frame_time > 1)
- fprintf (stderr, "%s: static screen for %.1f secs\n",
- blurb(), ss->now - ss->prev_frame_time);
-
- draw_sprites (mi);
-
- if (mi->fps_p) do_fps (mi);
-
- glFinish();
- glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
- ss->prev_frame_time = ss->now;
- ss->redisplay_needed_p = False;
-
- slideshow_idle (mi);
-
- check_fps (mi);
-}
-
-
-ENTRYPOINT void
-free_slideshow (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- /* int i; */
- if (!ss->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *ss->glx_context);
-
- if (ss->font_data) free_texture_font (ss->font_data);
- ss->font_data = 0;
-
-# if 0
- /* The lifetime of these objects is incomprehensible.
- Doing this causes free pointers to be run from the XtInput.
- */
- for (i = ss->nimages-1; i >= 0; i--) {
- if (ss->images[i] && ss->images[i]->refcount == 0)
- destroy_image (mi, ss->images[i]);
- }
-
- for (i = countof(ss->sprites)-1; i >= 0; i--) {
- if (ss->sprites[i])
- destroy_sprite (mi, ss->sprites[i]);
- }
-# endif
-}
-
-
-static void
-slideshow_idle (ModeInfo *mi)
-{
- slideshow_state *ss = &sss[MI_SCREEN(mi)];
- double end_by_time = ss->now + ((double) mi->pause) / 2000000;
- int i;
-
- for (i = 0; i < ss->nimages; i++)
- {
- image *img = ss->images[i];
- if (img->loader)
- {
- if (texture_loader_failed (img->loader))
- abort();
- step_texture_loader (img->loader, end_by_time - double_time(),
- image_loaded_cb, img);
- break; /* only do the first one! */
- }
- }
-}
-
-XSCREENSAVER_MODULE_2 ("GLSlideshow", glslideshow, slideshow)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/glslideshow.man b/hacks/glx/glslideshow.man
deleted file mode 100644
index 98f2b9f..0000000
--- a/hacks/glx/glslideshow.man
+++ /dev/null
@@ -1,131 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-glslideshow \- slideshow of images using smooth zooming and fades
-.SH SYNOPSIS
-.B glslideshow
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-duration \fIseconds\fP]
-[\-zoom \fIpercent\fP]
-[\-pan \fIseconds\fP]
-[\-fade \fIseconds\fP]
-[\-titles]
-[\-letterbox | \-clip]
-[\-delay \fIusecs\fP]
-[\-fps]
-[\-debug]
-[\-wireframe]
-[\-cutoff \fIint\fP]
-.SH DESCRIPTION
-Loads a random sequence of images and smoothly scans and zooms around
-in each, fading from pan to pan.
-
-This program requires a good video card capable of supporting large
-textures.
-
-To specify the directory that images are loaded from, run
-.BR xscreensaver\-settings (1)
-and click on the "Advanced" tab.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-duration \fIseconds\fP
-How long each image will be displayed before loading a new one.
-Default 30 seconds.
-.TP 8
-.B \-pan \fIseconds\fP
-How long each pan-and-zoom should last. Default 6 seconds.
-
-With the default settings of \fI\-pan 6 \-duration 30\fP, each image
-will be displayed five times (30/6), and then a new image will be loaded.
-If you want a new image to be loaded at each fade, then set \fI\-pan\fP
-and \fI\-duration\fP to the same value.
-.TP 8
-.B \-fade \fIseconds\fP
-How long each cross-fade between images should last. Default 2 seconds.
-If set to 0, then no cross-fading will be done (all transitions
-will be jump-cuts.)
-
-Note that fades are included in the pan time, so \fI\-fade\fP cannot
-be larger than \fI\-pan\fP.
-.TP 8
-.B \-zoom \fInumber\fP
-Amount to zoom and pan as a percentage. Default: 75, meaning that
-75% or more of each image will always be visible. If set to 100%,
-then the images will always fill the screen, and no panning or
-zooming will occur. (Images will still smoothly fade from one
-to another if \fI\-fade\fP is non-zero.)
-.TP 8
-.B \-titles
-Whether to print the file name of the current image in the upper left corner.
-.TP 8
-.B \-letterbox
-In "letterbox" mode, when an image is not the same aspect ratio as the screen,
-black bars will appear at the top/bottom or left/right so that the whole
-image can be displayed. This is the default.
-.TP 8
-.B \-clip
-In "clip" mode, when an image is not the same aspect ratio as the screen,
-we will zoom in further until the image takes up the whole screen.
-This is the opposite of \fI\-letterbox\fP.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-cutoff \fInumber\fP
-If the frame rate we are achieving is lower than this, then panning,
-fading, and zooming will be disabled. Default 5 FPS.
-
-The idea here is that if your machine can't maintain a decent frame
-rate, then it must not have fast 3D hardware, so we might as well
-behave in a simpler manner. Set this to 0 to disable this check.
-.TP 8
-.B \-debug
-Prints debugging info to stderr.
-.TP 8
-.B \-wireframe
-Another debug mode.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver\-settings (1),
-.BR xscreensaver\-getimage (MANSUFFIX),
-.BR xscreensaver (1),
-.BR carousel (MANSUFFIX)
-.BR photopile (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2003-2005 by Jamie Zawinski, based on an earlier version
-that was
-Copyright \(co 2002 by Mike Oliphant.
-
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski and Mike Oliphant.
diff --git a/hacks/glx/glsnake.c b/hacks/glx/glsnake.c
deleted file mode 100644
index d7e133e..0000000
--- a/hacks/glx/glsnake.c
+++ /dev/null
@@ -1,2685 +0,0 @@
-/* glsnake.c - OpenGL imitation of Rubik's Snake
- *
- * (c) 2001-2005 Jamie Wilkinson <jaq@spacepants.org>
- * (c) 2001-2003 Andrew Bennetts <andrew@puzzling.org>
- * (c) 2001-2003 Peter Aylett <peter@ylett.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/* HAVE_GLUT defined if we're building a standalone glsnake,
- * and not defined if we're building as an xscreensaver hack */
-#ifdef HAVE_GLUT
-# include <GL/glut.h>
-#else
-# include "xlockmoreI.h"
-# ifndef HAVE_GETTIMEOFDAY
-# define HAVE_GETTIMEOFDAY
-# endif
-#endif
-
-#include <stdio.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* angles */
-#define ZERO 0.0
-#define LEFT 90.0
-#define PIN 180.0
-#define RIGHT 270.0
-
-#ifdef HAVE_GETTIMEOFDAY
-# ifdef GETTIMEOFDAY_TWO_ARGS
-
-# include <sys/time.h>
-# include <time.h>
- typedef struct timeval snaketime;
-# define GETSECS(t) ((t).tv_sec)
-# define GETMSECS(t) ((t).tv_usec/1000)
-
-# else /* !GETTIMEOFDAY_TWO_ARGS */
-
-# include <sys/time.h>
-# include <time.h>
- typedef struct timeval snaketime;
-# define GETSECS(t) ((t).tv_sec)
-# define GETMSECS(t) ((t).tv_usec/1000)
-
-# endif /* GETTIMEOFDAY_TWO_ARGS */
-
-#else /* !HAVE_GETTIMEOFDAY */
-# ifdef HAVE_FTIME
-
-# include <sys/timeb.h>
- typedef struct timeb snaketime;
-# define GETSECS(t) ((long)(t).time)
-# define GETMSECS(t) ((t).millitm/1000)
-
-# endif /* HAVE_FTIME */
-#endif /* HAVE_GETTIMEOFDAY */
-
-#include <math.h>
-
-#ifndef M_SQRT1_2 /* Win32 doesn't have this constant */
-#define M_SQRT1_2 0.70710678118654752440084436210485
-#endif
-
-#define NODE_COUNT 24
-
-#ifdef HAVE_GLUT
-#define DEF_YANGVEL 0.10
-#define DEF_ZANGVEL 0.14
-#define DEF_EXPLODE 0.03
-#define DEF_ANGVEL 1.0
-#define DEF_STATICTIME 5000
-#define DEF_ALTCOLOUR 0
-#define DEF_TITLES 0
-#define DEF_INTERACTIVE 0
-#define DEF_ZOOM 25.0
-#define DEF_WIREFRAME 0
-#define DEF_TRANSPARENT 1
-#else
-/* xscreensaver options doobies prefer strings */
-#define DEF_YANGVEL "0.10"
-#define DEF_ZANGVEL "0.14"
-#define DEF_EXPLODE "0.03"
-#define DEF_ANGVEL "1.0"
-#define DEF_STATICTIME "5000"
-#define DEF_ALTCOLOUR "False"
-#define DEF_TITLES "False"
-#define DEF_INTERACTIVE "False"
-#define DEF_ZOOM "25.0"
-#define DEF_WIREFRAME "False"
-#define DEF_TRANSPARENT "True"
-#endif
-
-/* static variables */
-
-static GLfloat explode;
-static long statictime;
-static GLfloat yspin = 60.0;
-static GLfloat zspin = -45.0;
-static GLfloat yangvel;
-static GLfloat zangvel;
-static Bool altcolour;
-static Bool titles;
-static Bool interactive;
-static Bool wireframe;
-static Bool transparent;
-static GLfloat zoom;
-static GLfloat angvel;
-
-#ifndef HAVE_GLUT
-
-#define glsnake_init init_glsnake
-#define glsnake_display draw_glsnake
-#define glsnake_reshape reshape_glsnake
-#define release_glsnake 0
-#define glsnake_handle_event xlockmore_no_events
-
-/* xscreensaver defaults */
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 30 \n" \
- "*showFPS: False \n" \
- "*suppressRotationAnimation: True\n" \
- "*labelfont: sans-serif 18\n" \
-
-
-#include "xlockmore.h"
-#include "texfont.h"
-
-static XrmOptionDescRec opts[] = {
- { "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
- { "-angvel", ".angvel", XrmoptionSepArg, DEF_ANGVEL },
- { "-statictime", ".statictime", XrmoptionSepArg, DEF_STATICTIME },
- { "-yangvel", ".yangvel", XrmoptionSepArg, DEF_YANGVEL },
- { "-zangvel", ".zangvel", XrmoptionSepArg, DEF_ZANGVEL },
- { "-altcolour", ".altcolour", XrmoptionNoArg, "True" },
- { "-no-altcolour", ".altcolour", XrmoptionNoArg, "False" },
- { "-titles", ".titles", XrmoptionNoArg, "True" },
- { "-no-titles", ".titles", XrmoptionNoArg, "False" },
- { "-zoom", ".zoom", XrmoptionSepArg, DEF_ZOOM },
- { "-wireframe", ".wireframe", XrmoptionNoArg, "true" },
- { "-no-wireframe", ".wireframe", XrmoptionNoArg, "false" },
- { "-transparent", ".transparent", XrmoptionNoArg, "true" },
- { "-no-transparent", ".transparent", XrmoptionNoArg, "false" },
-};
-
-static argtype vars[] = {
- {&explode, "explode", "Explode", DEF_EXPLODE, t_Float},
- {&angvel, "angvel", "Angular Velocity", DEF_ANGVEL, t_Float},
- {&statictime, "statictime", "Static Time", DEF_STATICTIME, t_Int},
- {&yangvel, "yangvel", "Angular Velocity about Y axis", DEF_YANGVEL, t_Float},
- {&zangvel, "zangvel", "Angular Velocity about X axis", DEF_ZANGVEL, t_Float},
- {&interactive, "interactive", "Interactive", DEF_INTERACTIVE, t_Bool},
- {&altcolour, "altcolour", "Alternate Colour Scheme", DEF_ALTCOLOUR, t_Bool},
- {&titles, "titles", "Titles", DEF_TITLES, t_Bool},
- {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
- {&wireframe, "wireframe", "Wireframe", DEF_WIREFRAME, t_Bool},
- {&transparent, "transparent", "Transparent!", DEF_TRANSPARENT, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt glsnake_opts = {countof(opts), opts, countof(vars), vars, NULL};
-#endif
-
-struct model_s {
- const char * name;
- float node[NODE_COUNT];
-};
-
-struct glsnake_cfg {
-#ifndef HAVE_GLUT
- GLXContext * glx_context;
- texture_font_data *font_data;
-#else
- /* font list number */
- int font;
-#endif
-
- /* window id */
- int window;
-
- /* is a morph in progress? */
- int morphing;
-
- /* has the model been paused? */
- int paused;
-
- /* snake metrics */
- int is_cyclic;
- int is_legal;
- float last_turn;
- int debug;
-
- /* the shape of the model */
- float node[NODE_COUNT];
-
- /* currently selected node for interactive mode */
- int selected;
-
- /* models */
- unsigned int prev_model;
- unsigned int next_model;
-
- /* model morphing */
- int new_morph;
-
- /* colours */
- float colour[2][4];
- int next_colour;
- int prev_colour;
-
- /* timing variables */
- snaketime last_iteration;
- snaketime last_morph;
-
- /* window size */
- int width, height;
- int old_width, old_height;
-
- /* the id of the display lists for drawing a node */
- GLuint node_solid, node_wire;
- int node_polys;
-
- /* is the window fullscreen? */
- int fullscreen;
-};
-
-#define COLOUR_CYCLIC 0
-#define COLOUR_ACYCLIC 1
-#define COLOUR_INVALID 2
-#define COLOUR_AUTHENTIC 3
-#define COLOUR_ORIGLOGO 4
-
-static const float colour[][2][4] = {
- /* cyclic - green */
- { { 0.4, 0.8, 0.2, 0.6 },
- { 1.0, 1.0, 1.0, 0.6 } },
- /* acyclic - blue */
- { { 0.3, 0.1, 0.9, 0.6 },
- { 1.0, 1.0, 1.0, 0.6 } },
- /* invalid - grey */
- { { 0.3, 0.1, 0.9, 0.6 },
- { 1.0, 1.0, 1.0, 0.6 } },
- /* authentic - purple and green */
- { { 0.38, 0.0, 0.55, 0.7 },
- { 0.0, 0.5, 0.34, 0.7 } },
- /* old "authentic" colours from the logo */
- { { 171/255.0, 0, 1.0, 1.0 },
- { 46/255.0, 205/255.0, 227/255.0, 1.0 } }
-};
-
-static const struct model_s model[] = {
-#define STRAIGHT_MODEL 0
- { "straight",
- { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO, ZERO }
- },
- /* the models in the Rubik's snake manual */
- { "ball",
- { RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT,
- RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT,
- RIGHT, LEFT, RIGHT, LEFT, ZERO }
- },
-#define START_MODEL 2
- { "snow",
- { RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT,
- RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT,
- RIGHT, LEFT, LEFT, LEFT, ZERO }
- },
- { "propellor",
- { ZERO, ZERO, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO, ZERO,
- ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO, ZERO, ZERO, RIGHT,
- LEFT, RIGHT, ZERO, LEFT }
- },
- { "flamingo",
- { ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, RIGHT, PIN,
- RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, ZERO, ZERO,
- ZERO, PIN, ZERO }
- },
- { "cat",
- { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN,
- ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO }
- },
- { "rooster",
- { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, LEFT, RIGHT, PIN, RIGHT,
- ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, LEFT, ZERO,
- PIN, ZERO }
- },
- /* These models were taken from Andrew and Peter's original snake.c
- * as well as some newer ones made up by Jamie, Andrew and Peter. */
- { "half balls",
- { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT,
- LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT,
- RIGHT, LEFT, LEFT, LEFT, ZERO }
- },
- { "zigzag1",
- { RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT,
- LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT,
- RIGHT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "zigzag2",
- { PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN,
- ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN,
- ZERO }
- },
- { "zigzag3",
- { PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN,
- LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN,
- ZERO }
- },
- { "caterpillar",
- { RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT,
- LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN,
- LEFT, LEFT, ZERO }
- },
- { "bow",
- { RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT,
- LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT,
- RIGHT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "turtle",
- { ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT,
- LEFT, RIGHT, LEFT, LEFT, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT,
- RIGHT, RIGHT, RIGHT, ZERO }
- },
- { "basket",
- { RIGHT, PIN, ZERO, ZERO, PIN, LEFT, ZERO, LEFT, LEFT, ZERO,
- LEFT, PIN, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO,
- PIN, LEFT, ZERO }
- },
- { "thing",
- { PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT,
- LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT,
- RIGHT, LEFT, LEFT, ZERO }
- },
- { "hexagon",
- { ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO,
- ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO,
- LEFT, ZERO, ZERO, RIGHT }
- },
- { "tri1",
- { ZERO, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO, RIGHT, ZERO, ZERO,
- LEFT, RIGHT, ZERO, LEFT, ZERO, RIGHT, ZERO, ZERO, LEFT, RIGHT,
- ZERO, LEFT, ZERO, RIGHT }
- },
- { "triangle",
- { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO,
- ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO, LEFT, RIGHT }
- },
- { "flower",
- { ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT,
- RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN,
- RIGHT, RIGHT, PIN }
- },
- { "crucifix",
- { ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN,
- PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN }
- },
- { "kayak",
- { PIN, RIGHT, LEFT, PIN, LEFT, PIN, ZERO, ZERO, RIGHT, PIN, LEFT,
- ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
- PIN, RIGHT }
- },
- { "bird",
- { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT,
- ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT,
- LEFT, ZERO, PIN, ZERO }
- },
- { "seal",
- { RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO,
- LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, PIN, RIGHT,
- RIGHT, LEFT, ZERO }
- },
- { "dog",
- { ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN,
- ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO }
- },
- { "frog",
- { RIGHT, RIGHT, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, LEFT, PIN,
- RIGHT, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT,
- RIGHT, LEFT, LEFT, ZERO }
- },
- { "quavers",
- { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, ZERO, ZERO,
- RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO, LEFT, LEFT,
- RIGHT, LEFT, RIGHT, RIGHT, ZERO }
- },
- { "fly",
- { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, PIN, ZERO, ZERO,
- LEFT, PIN, RIGHT, ZERO, ZERO, PIN, ZERO, LEFT, LEFT, RIGHT, LEFT,
- RIGHT, RIGHT, ZERO }
- },
- { "puppy",
- { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO,
- RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT,
- LEFT, ZERO, ZERO }
- },
- { "stars",
- { LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT,
- ZERO, ZERO, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN,
- RIGHT, LEFT, ZERO }
- },
- { "mountains",
- { RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN,
- LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT,
- PIN, LEFT, PIN }
- },
- { "quad1",
- { RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN,
- LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT,
- LEFT, PIN, LEFT, PIN }
- },
- { "quad2",
- { ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN,
- ZERO, PIN, ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT,
- PIN, ZERO, PIN }
- },
- { "glasses",
- { ZERO, PIN, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, PIN,
- ZERO, PIN, ZERO, PIN, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO,
- PIN, ZERO, PIN }
- },
- { "em",
- { ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN,
- ZERO, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
- PIN, ZERO, PIN }
- },
- { "quad3",
- { ZERO, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT,
- ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
- LEFT, ZERO, PIN }
- },
- { "vee",
- { ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO,
- ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
- ZERO, ZERO, PIN }
- },
- { "square",
- { ZERO, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, ZERO,
- ZERO, PIN, ZERO, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO,
- ZERO, ZERO, PIN }
- },
- { "eagle",
- { RIGHT, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, ZERO,
- LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT,
- ZERO, ZERO, LEFT, PIN }
- },
- { "volcano",
- { RIGHT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT,
- ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT,
- LEFT, RIGHT, ZERO, LEFT, PIN }
- },
- { "saddle",
- { RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO,
- LEFT, PIN, RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT,
- ZERO, LEFT, PIN }
- },
- { "c3d",
- { ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT, ZERO,
- ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT,
- ZERO, ZERO, PIN }
- },
- { "block",
- { ZERO, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN,
- RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT,
- PIN, RIGHT }
- },
- { "duck",
- { LEFT, PIN, LEFT, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, LEFT,
- PIN, RIGHT, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN,
- LEFT, ZERO }
- },
- { "prayer",
- { RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, ZERO,
- ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, RIGHT, RIGHT, LEFT,
- RIGHT, LEFT, LEFT, LEFT, PIN }
- },
- { "giraffe",
- { ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, RIGHT,
- RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT,
- PIN, LEFT, LEFT, LEFT }
- },
- { "tie fighter",
- { PIN, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, LEFT,
- ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, LEFT, ZERO,
- LEFT, RIGHT, ZERO, ZERO }
- },
- { "Strong Arms",
- { PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, RIGHT,
- RIGHT, PIN, RIGHT, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO,
- ZERO, PIN, PIN, ZERO }
- },
-
- /* the following modesl were created during the slug/compsoc codefest
- * febrray 2003 */
- { "cool looking gegl",
- { PIN, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT,
- ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, ZERO,
- ZERO, ZERO }
- },
- { "knuckledusters",
- { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN,
- PIN, ZERO, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO,
- RIGHT, ZERO }
- },
- { "k's turd",
- { RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT,
- RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN,
- RIGHT, LEFT, RIGHT, PIN, ZERO }
- },
- { "lightsabre",
- { ZERO, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO }
- },
- { "not a stairway",
- { LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO,
- RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT,
- RIGHT, ZERO, LEFT, ZERO }
- },
- { "not very good (but accurate) gegl",
- { ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO,
- PIN, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO, PIN, PIN, ZERO,
- PIN, ZERO }
- },
- { "box",
- { ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO, ZERO }
- },
- { "kissy box",
- { PIN, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
- ZERO, PIN, ZERO }
- },
- { "erect penis", /* thanks benno */
- { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
- PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO }
- },
- { "flaccid penis",
- { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
- PIN, ZERO, ZERO, ZERO, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
- ZERO, ZERO }
- },
- { "vagina",
- { RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO,
- LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT,
- PIN, RIGHT, ZERO }
- },
- { "mask",
- { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN,
- ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO,
- ZERO, ZERO, ZERO }
- },
- { "poles or columns or something",
- { LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
- ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
- ZERO, LEFT, ZERO }
- },
- { "crooked v",
- { ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
- ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
- ZERO, ZERO, ZERO }
- },
- { "dog leg",
- { ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO,
- LEFT, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
- ZERO, ZERO }
- },
- { "scrubby",
- { ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO,
- LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO,
- LEFT, PIN, ZERO, ZERO }
- },
- { "voltron's eyes",
- { ZERO, ZERO, PIN, RIGHT, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO,
- LEFT, PIN, ZERO, ZERO, PIN, ZERO, LEFT, ZERO, RIGHT, LEFT, ZERO,
- RIGHT, ZERO, ZERO }
- },
- { "flying toaster",
- { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
- RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
- PIN, ZERO }
- },
- { "dubbya",
- { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
- ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
- PIN, ZERO }
- },
- { "tap handle",
- { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
- LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
- PIN, ZERO }
- },
- { "wingnut",
- { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
- PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
- PIN, ZERO }
- },
- { "tight twist",
- { RIGHT, ZERO, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT,
- RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT,
- ZERO, ZERO, RIGHT, ZERO }
- },
- { "double helix",
- { RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT,
- ZERO, RIGHT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, ZERO,
- RIGHT, ZERO, RIGHT, ZERO, ZERO }
- },
-
- /* These models come from the website at
- * http://www.geocities.com/stigeide/snake */
-#if 0
- { "Abstract",
- { RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO }
- },
-#endif
- { "toadstool",
- { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, ZERO }
- },
- { "AlanH2",
- { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, ZERO }
- },
- { "AlanH3",
- { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
- },
- { "AlanH4",
- { ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, ZERO, ZERO }
- },
- { "Alien",
- { RIGHT, LEFT, RIGHT, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO, PIN, PIN, ZERO }
- },
- { "Angel",
- { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO }
- },
- { "AnotherFigure",
- { LEFT, PIN, RIGHT, ZERO, ZERO, PIN, RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO }
- },
- { "Ball",
- { LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT , ZERO }
- },
- { "Basket",
- { ZERO, RIGHT, RIGHT, ZERO, RIGHT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, ZERO, LEFT , ZERO }
- },
- { "Beetle",
- { PIN, LEFT, RIGHT, ZERO, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, LEFT, RIGHT, PIN, RIGHT , ZERO }
- },
- { "bone",
- { PIN, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, PIN , ZERO }
- },
- { "Bow",
- { LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT , ZERO }
- },
- { "bra",
- { RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT , ZERO }
- },
- { "bronchosaurus",
- { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, PIN , ZERO }
- },
- { "Cactus",
- { PIN, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, ZERO , ZERO }
- },
- { "Camel",
- { RIGHT, ZERO, PIN, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, ZERO, ZERO, LEFT , ZERO }
- },
- { "Candlestick",
- { LEFT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT , ZERO }
- },
- { "Cat",
- { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO , ZERO }
- },
- { "Cave",
- { RIGHT, ZERO, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO , ZERO }
- },
- { "Chains",
- { PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO , ZERO }
- },
- { "Chair",
- { RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, LEFT, RIGHT, LEFT, LEFT , ZERO }
- },
- { "Chick",
- { RIGHT, RIGHT, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, LEFT, LEFT , ZERO }
- },
- { "Clockwise",
- { RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT , ZERO }
- },
- { "cobra",
- { ZERO, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, LEFT, ZERO, LEFT, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT , ZERO }
- },
-#if 0
- { "Cobra2",
- { LEFT, ZERO, PIN, ZERO, PIN, LEFT, ZERO, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, PIN, ZERO, RIGHT , ZERO }
- },
-#endif
- { "Cobra3",
- { ZERO, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, LEFT , ZERO }
- },
- { "Compact1",
- { ZERO, ZERO, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN , ZERO }
- },
- { "Compact2",
- { LEFT, PIN, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO , ZERO }
- },
- { "Compact3",
- { ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN , ZERO }
- },
- { "Compact4",
- { PIN, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO , ZERO }
- },
- { "Compact5",
- { LEFT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT , ZERO }
- },
- { "Contact",
- { PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN, RIGHT, PIN , ZERO }
- },
- { "Contact2",
- { RIGHT, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, LEFT , ZERO }
- },
- { "Cook",
- { ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO, PIN , ZERO }
- },
- { "Counterclockwise",
- { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT , ZERO }
- },
- { "Cradle",
- { LEFT, LEFT, ZERO, PIN, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, RIGHT, LEFT, LEFT, ZERO, ZERO, RIGHT , ZERO }
- },
- { "Crankshaft",
- { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, PIN, RIGHT , ZERO }
- },
- { "Cross",
- { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN , ZERO }
- },
- { "Cross2",
- { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO , ZERO }
- },
- { "Cross3",
- { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "CrossVersion1",
- { PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
- },
- { "CrossVersion2",
- { RIGHT, LEFT, PIN, LEFT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, LEFT, PIN, LEFT, RIGHT, ZERO }
- },
- { "Crown",
- { LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, PIN, ZERO, ZERO }
- },
- { "DNAStrand",
- { RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, ZERO }
- },
- { "Diamond",
- { ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO }
- },
- { "Dog",
- { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, LEFT, RIGHT, ZERO }
- },
- { "DogFace",
- { ZERO, ZERO, PIN, PIN, ZERO, LEFT, LEFT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
- },
- { "DoublePeak",
- { ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, LEFT, ZERO, PIN, ZERO, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, ZERO }
- },
- { "DoubleRoof",
- { ZERO, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO }
- },
- { "txoboggan",
- { ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO }
- },
- { "Doubled",
- { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
- },
- { "Doubled1",
- { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO, RIGHT, ZERO, RIGHT, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
- },
- { "Doubled2",
- { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, RIGHT, ZERO, RIGHT, LEFT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
- },
- { "DumblingSpoon",
- { PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO }
- },
- { "Embrace",
- { PIN, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO }
- },
- { "EndlessBelt",
- { ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO }
- },
- { "Entrance",
- { LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, ZERO }
- },
- { "Esthetic",
- { LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, ZERO }
- },
- { "Explosion",
- { RIGHT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, ZERO }
- },
- { "F-ZeroXCar",
- { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, ZERO }
- },
- { "Face",
- { ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO }
- },
- { "Fantasy",
- { LEFT, LEFT, RIGHT, PIN, ZERO, RIGHT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, LEFT, ZERO, PIN, LEFT, RIGHT, RIGHT, RIGHT, PIN, ZERO }
- },
- { "Fantasy1",
- { PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
- },
- { "FaserGun",
- { ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, RIGHT, ZERO, PIN, ZERO }
- },
- { "FelixW",
- { ZERO, RIGHT, ZERO, PIN, LEFT, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, RIGHT, PIN, ZERO, LEFT, ZERO, ZERO }
- },
- { "Flamingo",
- { ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, ZERO, ZERO, ZERO, PIN, ZERO }
- },
- { "FlatOnTheTop",
- { ZERO, PIN, PIN, ZERO, PIN, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO }
- },
- { "Fly",
- { ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO }
- },
- { "Fountain",
- { LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO }
- },
- { "Frog",
- { LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, RIGHT, LEFT, RIGHT, RIGHT, ZERO }
- },
- { "Frog2",
- { LEFT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, ZERO, RIGHT, ZERO }
- },
- { "Furby",
- { PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO }
- },
- { "Gate",
- { ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "Ghost",
- { LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO }
- },
- { "Globus",
- { RIGHT, LEFT, ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, LEFT, ZERO, ZERO }
- },
- { "Grotto",
- { PIN, PIN, ZERO, LEFT, RIGHT, LEFT, ZERO, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO }
- },
- { "H",
- { PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "HeadOfDevil",
- { PIN, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
- },
- { "Heart",
- { RIGHT, ZERO, ZERO, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, RIGHT, ZERO, PIN, ZERO, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO, ZERO, ZERO, LEFT, ZERO }
- },
- { "Heart2",
- { ZERO, PIN, ZERO, ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO }
- },
- { "Hexagon",
- { ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO }
- },
- { "HoleInTheMiddle1",
- { ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO }
- },
- { "HoleInTheMiddle2",
- { ZERO, LEFT, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO }
- },
- { "HouseBoat",
- { RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
- },
- { "HouseByHouse",
- { LEFT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, ZERO }
- },
- { "Infinity",
- { LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "Integral",
- { RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "Iron",
- { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO }
- },
- { "just squares",
- { RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, LEFT, ZERO }
- },
- { "Kink",
- { ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "Knot",
- { LEFT, LEFT, PIN, LEFT, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, RIGHT, PIN, RIGHT, RIGHT, LEFT, ZERO }
- },
- { "Leaf",
- { ZERO, PIN, PIN, ZERO, ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO }
- },
- { "LeftAsRight",
- { RIGHT, PIN, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, PIN, LEFT, ZERO }
- },
- { "Long-necked",
- { PIN, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "lunar module",
- { PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, ZERO }
- },
- { "magnifying glass",
- { ZERO, ZERO, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, ZERO }
- },
- { "Mask",
- { ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, ZERO }
- },
- { "Microscope",
- { PIN, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO }
- },
- { "Mirror",
- { PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "MissPiggy",
- { ZERO, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, LEFT, PIN, RIGHT, RIGHT, ZERO, RIGHT, ZERO }
- },
- { "Mole",
- { ZERO, RIGHT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, ZERO, RIGHT, RIGHT, PIN, LEFT, ZERO }
- },
- { "Monk",
- { LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "Mountain",
- { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, LEFT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO }
- },
- { "mountains",
- { ZERO, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO }
- },
- { "MouseWithoutTail",
- { ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "mushroom",
- { PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, ZERO }
- },
- { "necklace",
- { ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO }
- },
- { "NestledAgainst",
- { LEFT, ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, ZERO }
- },
- { "NoClue",
- { ZERO, RIGHT, PIN, LEFT, LEFT, LEFT, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO }
- },
- { "Noname",
- { LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, ZERO }
- },
- { "Obelisk",
- { PIN, ZERO, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO, ZERO, ZERO }
- },
- { "Ostrich",
- { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, ZERO }
- },
- { "Ostrich2",
- { PIN, PIN, ZERO, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
- },
- { "pair of glasses",
- { ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
- },
- { "Parrot",
- { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO }
- },
- { "Penis",
- { PIN, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, PIN, ZERO }
- },
- { "PictureComingSoon",
- { LEFT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, RIGHT, RIGHT, ZERO }
- },
- { "Pitti",
- { LEFT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, ZERO }
- },
- { "Plait",
- { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, ZERO }
- },
- { "Platform",
- { RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO }
- },
- { "PodRacer",
- { ZERO, PIN, ZERO, PIN, RIGHT, PIN, ZERO, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, ZERO, PIN, LEFT, ZERO }
- },
-#if 0
- { "Pokemon",
- { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO }
- },
-#endif
- { "Prawn",
- { RIGHT, PIN, ZERO, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, PIN, ZERO, PIN, LEFT, ZERO }
- },
- { "Propeller",
- { ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, ZERO }
- },
- { "Pyramid",
- { ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, LEFT, ZERO }
- },
- { "QuarterbackTiltedAndReadyToHut",
- { PIN, ZERO, RIGHT, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, LEFT, ZERO, PIN, ZERO }
- },
- { "Ra",
- { PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "Rattlesnake",
- { LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, PIN, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, ZERO }
- },
- { "Revelation",
- { ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, ZERO }
- },
- { "Revolution1",
- { LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, ZERO }
- },
- { "Ribbon",
- { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "Rocket",
- { RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, ZERO }
- },
- { "Roofed",
- { ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO }
- },
- { "Roofs",
- { PIN, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, PIN, ZERO }
- },
- { "RowHouses",
- { RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
- },
- { "Sculpture",
- { RIGHT, LEFT, PIN, ZERO, ZERO, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO }
- },
- { "Seal",
- { LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO }
- },
- { "Seal2",
- { RIGHT, PIN, ZERO, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO }
- },
- { "Sheep",
- { RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, ZERO }
- },
- { "Shelter",
- { LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO }
- },
- { "Ship",
- { PIN, RIGHT, LEFT, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, LEFT, ZERO, PIN, PIN, ZERO }
- },
- { "Shpongle",
- { LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO }
- },
- { "Slide",
- { LEFT, RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, RIGHT, LEFT, ZERO }
- },
- { "SmallShip",
- { ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO }
- },
- { "SnakeReadyToStrike",
- { LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO }
- },
- { "Snakes14",
- { RIGHT, RIGHT, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO }
- },
- { "Snakes15",
- { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO }
- },
- { "Snakes18",
- { PIN, PIN, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
- },
- { "Snowflake",
- { LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, ZERO }
- },
- { "Snowman",
- { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO }
- },
- { "Source",
- { PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, ZERO }
- },
- { "Spaceship",
- { PIN, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, PIN, ZERO }
- },
- { "Spaceship2",
- { PIN, PIN, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, LEFT, LEFT, PIN, PIN, ZERO }
- },
- { "Speedboat",
- { LEFT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, ZERO }
- },
- { "Speedboat2",
- { PIN, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, ZERO, RIGHT, PIN, LEFT, ZERO }
- },
- { "Spider",
- { RIGHT, RIGHT, ZERO, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, RIGHT, LEFT, RIGHT, ZERO, ZERO, LEFT, ZERO }
- },
- { "Spitzbergen",
- { PIN, LEFT, ZERO, RIGHT, RIGHT, LEFT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, LEFT, LEFT, ZERO, ZERO }
- },
- { "Square",
- { ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, ZERO }
- },
- { "SquareHole",
- { PIN, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO }
- },
- { "Stage",
- { RIGHT, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, ZERO }
- },
- { "Stairs",
- { ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO }
- },
- { "Stairs2",
- { ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
- },
- { "Straight",
- { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO }
- },
- { "Swan",
- { ZERO, PIN, ZERO, PIN, LEFT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, ZERO }
- },
- { "Swan2",
- { PIN, ZERO, PIN, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO }
- },
- { "Swan3",
- { PIN, PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO }
- },
- { "Symbol",
- { RIGHT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, RIGHT, ZERO }
- },
- { "Symmetry",
- { RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO }
- },
- { "Symmetry2",
- { ZERO, PIN, LEFT, LEFT, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
- },
- { "TableFireworks",
- { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, RIGHT, PIN, ZERO }
- },
- { "Tapering",
- { ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
- },
- { "TaperingTurned",
- { ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
- },
- { "TeaLightStick",
- { RIGHT, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, ZERO }
- },
- { "thighmaster",
- { RIGHT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO }
- },
- { "Terraces",
- { RIGHT, LEFT, ZERO, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO }
- },
- { "Terrier",
- { PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
- },
- { "Three-Legged",
- { RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, PIN, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO }
- },
- { "ThreePeaks",
- { RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, ZERO }
- },
- { "ToTheFront",
- { ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, LEFT, LEFT, PIN, ZERO, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, ZERO }
- },
- { "Top",
- { PIN, LEFT, LEFT, PIN, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO }
- },
- { "Transport",
- { PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO }
- },
- { "Triangle",
- { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO }
- },
- { "Tripple",
- { PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, ZERO }
- },
-#if 0
- { "Turtle",
- { RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO }
- },
-#endif
- { "Twins",
- { ZERO, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO, ZERO }
- },
- { "TwoSlants",
- { ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, ZERO }
- },
- { "TwoWings",
- { PIN, LEFT, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, ZERO }
- },
- { "UFO",
- { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
- },
- { "USS Enterprise",
- { LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO }
- },
- { "UpAndDown",
- { ZERO, PIN, ZERO, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, ZERO }
- },
- { "Upright",
- { ZERO, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, ZERO }
- },
- { "Upside-down",
- { PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO }
- },
- { "Valley",
- { ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO }
- },
- { "Viaduct",
- { PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO, PIN, RIGHT, ZERO, RIGHT, RIGHT, ZERO, RIGHT, PIN, ZERO, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, ZERO }
- },
- { "View",
- { ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
- },
- { "Waterfall",
- { LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO }
- },
- { "windwheel",
- { PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO }
- },
- { "Window",
- { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
- },
- { "WindowToTheWorld",
- { PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
- },
- { "Windshield",
- { PIN, PIN, ZERO, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, PIN, ZERO }
- },
- { "WingNut",
- { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
- },
- { "Wings2",
- { RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO }
- },
- { "WithoutName",
- { PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, ZERO }
- },
- { "Wolf",
- { ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO }
- },
- { "X",
- { LEFT, ZERO, ZERO, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, ZERO, ZERO, ZERO }
- },
-};
-
-static size_t models = sizeof(model) / sizeof(struct model_s);
-
-#define VOFFSET 0.045
-
-#define X_MASK 1
-#define Y_MASK 2
-#define Z_MASK 4
-
-/* the connecting string that holds the snake together */
-#define MAGICAL_RED_STRING 0
-
-#define GETSCALAR(vec,mask) ((vec)==(mask) ? 1 : ((vec)==-(mask) ? -1 : 0 ))
-
-#ifndef MAX
-# define MAX(x, y) ((x) > (y) ? (x) : (y))
-#endif
-#ifndef MIN
-# define MIN(x, y) ((x) < (y) ? (x) : (y))
-#endif
-
-#define RAND(n) ((random() & 0x7fffffff) % ((long) (n)))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-/* the triangular prism what makes up the basic unit */
-static const float solid_prism_v[][3] = {
- /* first corner, bottom left front */
- { VOFFSET, VOFFSET, 1.0 },
- { VOFFSET, 0.00, 1.0 - VOFFSET },
- { 0.00, VOFFSET, 1.0 - VOFFSET },
- /* second corner, rear */
- { VOFFSET, VOFFSET, 0.00 },
- { VOFFSET, 0.00, VOFFSET },
- { 0.00, VOFFSET, VOFFSET },
- /* third, right front */
- { 1.0 - VOFFSET / M_SQRT1_2, VOFFSET, 1.0 },
- { 1.0 - VOFFSET / M_SQRT1_2, 0.0, 1.0 - VOFFSET },
- { 1.0 - VOFFSET * M_SQRT1_2, VOFFSET, 1.0 - VOFFSET },
- /* fourth, right rear */
- { 1.0 - VOFFSET / M_SQRT1_2, VOFFSET, 0.0 },
- { 1.0 - VOFFSET / M_SQRT1_2, 0.0, VOFFSET },
- { 1.0 - VOFFSET * M_SQRT1_2, VOFFSET, VOFFSET },
- /* fifth, upper front */
- { VOFFSET, 1.0 - VOFFSET / M_SQRT1_2, 1.0 },
- { VOFFSET / M_SQRT1_2, 1.0 - VOFFSET * M_SQRT1_2, 1.0 - VOFFSET },
- { 0.0, 1.0 - VOFFSET / M_SQRT1_2, 1.0 - VOFFSET},
- /* sixth, upper rear */
- { VOFFSET, 1.0 - VOFFSET / M_SQRT1_2, 0.0 },
- { VOFFSET / M_SQRT1_2, 1.0 - VOFFSET * M_SQRT1_2, VOFFSET },
- { 0.0, 1.0 - VOFFSET / M_SQRT1_2, VOFFSET }};
-
-static const float solid_prism_n[][3] = {/* corners */
- { -VOFFSET, -VOFFSET, VOFFSET },
- { VOFFSET, -VOFFSET, VOFFSET },
- { -VOFFSET, VOFFSET, VOFFSET },
- { -VOFFSET, -VOFFSET, -VOFFSET },
- { VOFFSET, -VOFFSET, -VOFFSET },
- { -VOFFSET, VOFFSET, -VOFFSET },
- /* edges */
- { -VOFFSET, 0.0, VOFFSET },
- { 0.0, -VOFFSET, VOFFSET },
- { VOFFSET, VOFFSET, VOFFSET },
- { -VOFFSET, 0.0, -VOFFSET },
- { 0.0, -VOFFSET, -VOFFSET },
- { VOFFSET, VOFFSET, -VOFFSET },
- { -VOFFSET, -VOFFSET, 0.0 },
- { VOFFSET, -VOFFSET, 0.0 },
- { -VOFFSET, VOFFSET, 0.0 },
- /* faces */
- { 0.0, 0.0, 1.0 },
- { 0.0, -1.0, 0.0 },
- { M_SQRT1_2, M_SQRT1_2, 0.0 },
- { -1.0, 0.0, 0.0 },
- { 0.0, 0.0, -1.0 }};
-
-static const float wire_prism_v[][3] = {{ 0.0, 0.0, 1.0 },
- { 1.0, 0.0, 1.0 },
- { 0.0, 1.0, 1.0 },
- { 0.0, 0.0, 0.0 },
- { 1.0, 0.0, 0.0 },
- { 0.0, 1.0, 0.0 }};
-
-/*
-static const float wire_prism_n[][3] = {{ 0.0, 0.0, 1.0},
- { 0.0,-1.0, 0.0},
- { M_SQRT1_2, M_SQRT1_2, 0.0},
- {-1.0, 0.0, 0.0},
- { 0.0, 0.0,-1.0}};
-*/
-
-static struct glsnake_cfg * glc = NULL;
-#ifdef HAVE_GLUT
-# define bp glc
-#endif
-
-typedef float (*morphFunc)(long);
-
-#ifdef HAVE_GLUT
-/* forward definitions for GLUT functions */
-static void calc_rotation();
-static inline void ui_mousedrag();
-#endif
-
-static const GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };
-static const GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
-static const GLfloat mat_specular[] = { 0.1, 0.1, 0.1, 1.0 };
-static const GLfloat mat_shininess[] = { 20.0 };
-
-static void gl_init(
-#ifndef HAVE_GLUT
- ModeInfo * mi
-#endif
- )
-{
- float light_pos[][3] = {{0.0, 10.0, 20.0}, {0.0, 20.0, -1.0}};
- float light_dir[][3] = {{0.0, -10.0,-20.0}, {0.0,-20.0, 1.0}};
-
- glEnable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glCullFace(GL_BACK);
- /*glEnable(GL_CULL_FACE);*/
- glEnable(GL_NORMALIZE);
- if (transparent) {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- }
-
- if (!wireframe) {
- /*glColor4f(1.0, 1.0, 1.0, 1.0);*/
- glLightfv(GL_LIGHT0, GL_POSITION, light_pos[0]);
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir[0]);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
- /*glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);*/
-#if 1
- glLightfv(GL_LIGHT1, GL_POSITION, light_pos[1]);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light_dir[1]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, white_light);
- glLightfv(GL_LIGHT1, GL_SPECULAR, white_light);
-#endif
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- /*glEnable(GL_COLOR_MATERIAL);*/
- }
-}
-
-static void gettime(snaketime *t)
-{
-#ifdef HAVE_GETTIMEOFDAY
-#ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(t, &tzp);
-#else /* !GETTIMEOFDAY_TWO_ARGS */
- gettimeofday(t);
-#endif /* !GETTIMEOFDAY_TWO_ARGS */
-#else /* !HAVE_GETTIMEOFDAY */
-#ifdef HAVE_FTIME
- ftime(t);
-#endif /* HAVE_FTIME */
-#endif /* !HAVE_GETTIMEOFDAY */
-}
-
-
-ENTRYPOINT void glsnake_reshape(
-#ifndef HAVE_GLUT
- ModeInfo * mi,
-#endif
- int w, int h);
-
-static void start_morph(struct glsnake_cfg *,
- unsigned int model_index, int immediate);
-
-/* wot initialises it */
-ENTRYPOINT void glsnake_init(
-#ifndef HAVE_GLUT
-ModeInfo * mi
-#endif
-)
-{
-#ifndef HAVE_GLUT
- struct glsnake_cfg * bp;
-
- /* set up the conf struct and glx contexts */
- MI_INIT(mi, glc);
- bp = &glc[MI_SCREEN(mi)];
-
- if ((bp->glx_context = init_GL(mi)) != NULL) {
- gl_init(mi);
- glsnake_reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-#else
- gl_init();
-#endif
-
- /* initialise conf struct */
- memset(&bp->node, 0, sizeof(float) * NODE_COUNT);
-
- bp->selected = 11;
- bp->is_cyclic = 0;
- bp->is_legal = 1;
- bp->last_turn = -1;
- bp->morphing = 0;
- bp->paused = 0;
- bp->new_morph = 0;
-
- gettime(&bp->last_iteration);
- memcpy(&bp->last_morph, &bp->last_iteration, sizeof(bp->last_morph));
-
- bp->prev_colour = bp->next_colour = COLOUR_ACYCLIC;
- bp->next_model = RAND(models);
- bp->prev_model = START_MODEL;
- start_morph(bp, bp->prev_model, 1);
-
- /* set up a font for the labels */
-#ifndef HAVE_GLUT
- if (titles)
- bp->font_data = load_texture_font (mi->dpy, "labelfont");
-#endif
-
- /* build a solid display list */
- bp->node_solid = glGenLists(1);
- glNewList(bp->node_solid, GL_COMPILE);
- /* corners */
- glBegin(GL_TRIANGLES);
- glNormal3fv(solid_prism_n[0]);
- glVertex3fv(solid_prism_v[0]);
- glVertex3fv(solid_prism_v[2]);
- glVertex3fv(solid_prism_v[1]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[1]);
- glVertex3fv(solid_prism_v[6]);
- glVertex3fv(solid_prism_v[7]);
- glVertex3fv(solid_prism_v[8]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[2]);
- glVertex3fv(solid_prism_v[12]);
- glVertex3fv(solid_prism_v[13]);
- glVertex3fv(solid_prism_v[14]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[3]);
- glVertex3fv(solid_prism_v[3]);
- glVertex3fv(solid_prism_v[4]);
- glVertex3fv(solid_prism_v[5]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[4]);
- glVertex3fv(solid_prism_v[9]);
- glVertex3fv(solid_prism_v[11]);
- glVertex3fv(solid_prism_v[10]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[5]);
- glVertex3fv(solid_prism_v[16]);
- glVertex3fv(solid_prism_v[15]);
- glVertex3fv(solid_prism_v[17]);
- bp->node_polys++;
- glEnd();
-
- /* edges */
- glBegin(GL_QUADS);
- glNormal3fv(solid_prism_n[6]);
- glVertex3fv(solid_prism_v[0]);
- glVertex3fv(solid_prism_v[12]);
- glVertex3fv(solid_prism_v[14]);
- glVertex3fv(solid_prism_v[2]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[7]);
- glVertex3fv(solid_prism_v[0]);
- glVertex3fv(solid_prism_v[1]);
- glVertex3fv(solid_prism_v[7]);
- glVertex3fv(solid_prism_v[6]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[8]);
- glVertex3fv(solid_prism_v[6]);
- glVertex3fv(solid_prism_v[8]);
- glVertex3fv(solid_prism_v[13]);
- glVertex3fv(solid_prism_v[12]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[9]);
- glVertex3fv(solid_prism_v[3]);
- glVertex3fv(solid_prism_v[5]);
- glVertex3fv(solid_prism_v[17]);
- glVertex3fv(solid_prism_v[15]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[10]);
- glVertex3fv(solid_prism_v[3]);
- glVertex3fv(solid_prism_v[9]);
- glVertex3fv(solid_prism_v[10]);
- glVertex3fv(solid_prism_v[4]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[11]);
- glVertex3fv(solid_prism_v[15]);
- glVertex3fv(solid_prism_v[16]);
- glVertex3fv(solid_prism_v[11]);
- glVertex3fv(solid_prism_v[9]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[12]);
- glVertex3fv(solid_prism_v[1]);
- glVertex3fv(solid_prism_v[2]);
- glVertex3fv(solid_prism_v[5]);
- glVertex3fv(solid_prism_v[4]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[13]);
- glVertex3fv(solid_prism_v[8]);
- glVertex3fv(solid_prism_v[7]);
- glVertex3fv(solid_prism_v[10]);
- glVertex3fv(solid_prism_v[11]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[14]);
- glVertex3fv(solid_prism_v[13]);
- glVertex3fv(solid_prism_v[16]);
- glVertex3fv(solid_prism_v[17]);
- glVertex3fv(solid_prism_v[14]);
- bp->node_polys++;
- glEnd();
-
- /* faces */
- glBegin(GL_TRIANGLES);
- glNormal3fv(solid_prism_n[15]);
- glVertex3fv(solid_prism_v[0]);
- glVertex3fv(solid_prism_v[6]);
- glVertex3fv(solid_prism_v[12]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[19]);
- glVertex3fv(solid_prism_v[3]);
- glVertex3fv(solid_prism_v[15]);
- glVertex3fv(solid_prism_v[9]);
- bp->node_polys++;
- glEnd();
-
- glBegin(GL_QUADS);
- glNormal3fv(solid_prism_n[16]);
- glVertex3fv(solid_prism_v[1]);
- glVertex3fv(solid_prism_v[4]);
- glVertex3fv(solid_prism_v[10]);
- glVertex3fv(solid_prism_v[7]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[17]);
- glVertex3fv(solid_prism_v[8]);
- glVertex3fv(solid_prism_v[11]);
- glVertex3fv(solid_prism_v[16]);
- glVertex3fv(solid_prism_v[13]);
- bp->node_polys++;
-
- glNormal3fv(solid_prism_n[18]);
- glVertex3fv(solid_prism_v[2]);
- glVertex3fv(solid_prism_v[14]);
- glVertex3fv(solid_prism_v[17]);
- glVertex3fv(solid_prism_v[5]);
- bp->node_polys++;
- glEnd();
- glEndList();
-
- /* build wire display list */
- bp->node_wire = glGenLists(1);
- glNewList(bp->node_wire, GL_COMPILE);
- glBegin(GL_LINE_STRIP);
- glVertex3fv(wire_prism_v[0]);
- glVertex3fv(wire_prism_v[1]);
- bp->node_polys++;
- glVertex3fv(wire_prism_v[2]);
- glVertex3fv(wire_prism_v[0]);
- bp->node_polys++;
- glVertex3fv(wire_prism_v[3]);
- glVertex3fv(wire_prism_v[4]);
- bp->node_polys++;
- glVertex3fv(wire_prism_v[5]);
- glVertex3fv(wire_prism_v[3]);
- bp->node_polys++;
- glEnd();
- glBegin(GL_LINES);
- glVertex3fv(wire_prism_v[1]);
- glVertex3fv(wire_prism_v[4]);
- bp->node_polys++;
- glVertex3fv(wire_prism_v[2]);
- glVertex3fv(wire_prism_v[5]);
- bp->node_polys++;
- glEnd();
- glEndList();
-
-#ifdef HAVE_GLUT
- /* initialise the rotation */
- calc_rotation();
-#endif
-}
-
-static void draw_title(
-#ifndef HAVE_GLUT
- ModeInfo * mi
-#endif
- )
-{
-#ifndef HAVE_GLUT
- struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
-#endif
-
- /* draw some text */
-
-/* glPushAttrib((GLbitfield) GL_TRANSFORM_BIT | GL_ENABLE_BIT);*/
- glDisable(GL_LIGHTING);
- glDisable(GL_DEPTH_TEST);
- if (transparent) {
- glDisable(GL_BLEND);
- }
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
-#ifdef HAVE_GLUT
- glOrtho((GLdouble) 0., (GLdouble) bp->width, (GLdouble) 0., (GLdouble) bp->height, -1, 1);
-#else
- glOrtho((GLdouble) 0., (GLdouble) mi->xgwa.width, (GLdouble) 0., (GLdouble) mi->xgwa.height, -1, 1);
-#endif
-
- glColor4f(1.0, 1.0, 1.0, 1.0);
- {
- char interactstr[] = "interactive";
- const char * s;
-#ifdef HAVE_GLUT
- int w;
-#endif
-
- if (interactive)
- s = interactstr;
- else
- s = model[bp->next_model].name;
-
-#ifdef HAVE_GLUT
- {
- unsigned int i = 0;
-
- w = glutBitmapLength(GLUT_BITMAP_HELVETICA_12, (const unsigned char *) s);
- glRasterPos2f((GLfloat) (bp->width - w - 3), 4.0);
- while (s[i] != '\0')
- glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i++]);
- }
-#else
- print_texture_label (mi->dpy, bp->font_data,
- mi->xgwa.width, mi->xgwa.height,
- 1, s);
-#endif
- }
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
-
-/* glPopAttrib();*/
-}
-
-/* apply the matrix to the origin and stick it in vec */
-static void matmult_origin(float rotmat[16], float vec[4])
-{
-#if 1
- vec[0] = 0.5 * rotmat[0] + 0.5 * rotmat[4] + 0.5 * rotmat [8] + 1 * rotmat[12];
- vec[1] = 0.5 * rotmat[1] + 0.5 * rotmat[5] + 0.5 * rotmat [9] + 1 * rotmat[13];
- vec[2] = 0.5 * rotmat[2] + 0.5 * rotmat[6] + 0.5 * rotmat[10] + 1 * rotmat[14];
- vec[3] = 0.5 * rotmat[3] + 0.5 * rotmat[7] + 0.5 * rotmat[11] + 1 * rotmat[15];
-#else
- vec[0] = 0 * rotmat [0] + 0 * rotmat [1] + 0 * rotmat [2] + 1 * rotmat [3];
- vec[1] = 0 * rotmat [4] + 0 * rotmat [5] + 0 * rotmat [6] + 1 * rotmat [7];
- vec[2] = 0 * rotmat [8] + 0 * rotmat [9] + 0 * rotmat[10] + 1 * rotmat[11];
- vec[3] = 0 * rotmat[12] + 0 * rotmat[13] + 0 * rotmat[14] + 1 * rotmat[15];
-#endif
- vec[0] /= vec[3];
- vec[1] /= vec[3];
- vec[2] /= vec[3];
- vec[3] = 1.0;
-}
-
-/* wot gets called when the winder is resized */
-ENTRYPOINT void glsnake_reshape(
-#ifndef HAVE_GLUT
- ModeInfo * mi,
-#endif
- int width, int height)
-{
- double h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport(0, y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- /* jwz: 0.05 was too close (left black rectangles) */
- gluPerspective(zoom, 1/h, 1.0, 100.0);
- gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
- glMatrixMode(GL_MODELVIEW);
- /*gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);*/
- glLoadIdentity();
-#ifdef HAVE_GLUT
- bp->width = width;
- bp->height = height;
-#endif
-}
-
-/* Returns the new dst_dir for the given src_dir and dst_dir */
-static int cross_product(int src_dir, int dst_dir)
-{
- return X_MASK*(GETSCALAR(src_dir,Y_MASK) * GETSCALAR(dst_dir,Z_MASK) -
- GETSCALAR(src_dir,Z_MASK) * GETSCALAR(dst_dir,Y_MASK))+
- Y_MASK*(GETSCALAR(src_dir,Z_MASK) * GETSCALAR(dst_dir,X_MASK) -
- GETSCALAR(src_dir,X_MASK) * GETSCALAR(dst_dir,Z_MASK))+
- Z_MASK*(GETSCALAR(src_dir,X_MASK) * GETSCALAR(dst_dir,Y_MASK) -
- GETSCALAR(src_dir,Y_MASK) * GETSCALAR(dst_dir,X_MASK));
-}
-
-/* calculate orthogonal snake metrics
- * is_legal = true if model does not pass through itself
- * is_cyclic = true if last node connects back to first node
- * last_turn = for cyclic snakes, specifes what the 24th turn would be
- */
-static void calc_snake_metrics(struct glsnake_cfg *bp)
-{
- int srcDir, dstDir;
- int i, x, y, z;
- int prevSrcDir = -Y_MASK;
- int prevDstDir = Z_MASK;
- int grid[25][25][25];
-
- /* zero the grid */
- memset(&grid, 0, sizeof(int) * 25*25*25);
-
- bp->is_legal = 1;
- x = y = z = 12;
-
- /* trace path of snake - and keep record for is_legal */
- for (i = 0; i < NODE_COUNT - 1; i++) {
- /*int ang_card;*/ /* cardinal direction of node angle */
- /* establish new state vars */
- srcDir = -prevDstDir;
- x += GETSCALAR(prevDstDir, X_MASK);
- y += GETSCALAR(prevDstDir, Y_MASK);
- z += GETSCALAR(prevDstDir, Z_MASK);
-
- switch ((int) model[bp->next_model].node[i]) {
- case (int) (ZERO):
- dstDir = -prevSrcDir;
- break;
- case (int) (PIN):
- dstDir = prevSrcDir;
- break;
- case (int) (RIGHT):
- case (int) (LEFT):
- dstDir = cross_product(prevSrcDir, prevDstDir);
- if (model[bp->next_model].node[i] == (int) (RIGHT))
- dstDir = -dstDir;
- break;
- default:
- /* Prevent spurious "might be used
- * uninitialised" warnings when compiling
- * with -O2 */
- dstDir = 0;
- break;
- }
-
- if (grid[x][y][z] == 0)
- grid[x][y][z] = srcDir + dstDir;
- else if (grid[x][y][z] + srcDir + dstDir == 0)
- grid[x][y][z] = 8;
- else
- bp->is_legal = 0;
-
- prevSrcDir = srcDir;
- prevDstDir = dstDir;
- }
-
- /* determine if the snake is cyclic */
- bp->is_cyclic = (dstDir == Y_MASK && x == 12 && y == 11 && z == 12);
-
- /* determine last_turn */
- bp->last_turn = -1;
- if (bp->is_cyclic)
- switch (srcDir) {
- case -Z_MASK: bp->last_turn = ZERO; break;
- case Z_MASK: bp->last_turn = PIN; break;
- case X_MASK: bp->last_turn = LEFT; break;
- case -X_MASK: bp->last_turn = RIGHT; break;
- }
-}
-
-/* work out how far through the current morph we are */
-static float morph_percent(struct glsnake_cfg *bp)
-{
- float retval;
- int i;
-
- /* extend this function later with a case statement for each of the
- * morph schemes */
-
- /* when morphing all nodes at once, the longest morph will be the node
- * that needs to rotate 180 degrees. For each node, work out how far it
- * has to go, and store the maximum rotation and current largest angular
- * difference, returning the angular difference over the maximum. */
- {
- float rot_max = 0.0, ang_diff_max = 0.0;
-
- for (i = 0; i < NODE_COUNT - 1; i++) {
- float rot, ang_diff;
-
- /* work out the maximum rotation this node has to go through
- * from the previous to the next model, taking into account that
- * the snake always morphs through the smaller angle */
- rot = fabs(model[bp->prev_model].node[i] -
- model[bp->next_model].node[i]);
- if (rot > 180.0) rot = 180.0 - rot;
- /* work out the difference between the current position and the
- * target */
- ang_diff = fabs(bp->node[i] -
- model[bp->next_model].node[i]);
- if (ang_diff > 180.0) ang_diff = 180.0 - ang_diff;
- /* if it's the biggest so far, record it */
- if (rot > rot_max) rot_max = rot;
- if (ang_diff > ang_diff_max) ang_diff_max = ang_diff;
- }
-
- /* ang_diff / rot approaches 0, we want the complement */
- retval = 1.0 - (ang_diff_max / rot_max);
- /* protect against naan */
-
-/* Apparently some systems (Solaris) don't have isinf() */
-#undef isinf
-#define isinf(x) (((x) > 999999999999.9) || ((x) < -999999999999.9))
-
- if (isnan(retval) || isinf(retval)) retval = 1.0;
- }
- /*printf("morph_pct = %f\n", retval);*/
- return retval;
-}
-
-static void morph_colour(struct glsnake_cfg *bp)
-{
- float percent, compct; /* complement of percentage */
-
- percent = morph_percent(bp);
- compct = 1.0 - percent;
-
- bp->colour[0][0] = colour[bp->prev_colour][0][0] * compct + colour[bp->next_colour][0][0] * percent;
- bp->colour[0][1] = colour[bp->prev_colour][0][1] * compct + colour[bp->next_colour][0][1] * percent;
- bp->colour[0][2] = colour[bp->prev_colour][0][2] * compct + colour[bp->next_colour][0][2] * percent;
- bp->colour[0][3] = colour[bp->prev_colour][0][3] * compct + colour[bp->next_colour][0][3] * percent;
-
- bp->colour[1][0] = colour[bp->prev_colour][1][0] * compct + colour[bp->next_colour][1][0] * percent;
- bp->colour[1][1] = colour[bp->prev_colour][1][1] * compct + colour[bp->next_colour][1][1] * percent;
- bp->colour[1][2] = colour[bp->prev_colour][1][2] * compct + colour[bp->next_colour][1][2] * percent;
- bp->colour[1][3] = colour[bp->prev_colour][1][3] * compct + colour[bp->next_colour][1][3] * percent;
-}
-
-/* Start morph process to this model */
-static void start_morph(struct glsnake_cfg *bp,
- unsigned int model_index, int immediate)
-{
- /* if immediate, don't bother morphing, go straight to the next model */
- if (immediate) {
- int i;
-
- for (i = 0; i < NODE_COUNT; i++)
- bp->node[i] = model[model_index].node[i];
- }
-
- bp->prev_model = bp->next_model;
- bp->next_model = model_index;
- bp->prev_colour = bp->next_colour;
-
- calc_snake_metrics(bp);
- if (!bp->is_legal)
- bp->next_colour = COLOUR_INVALID;
- else if (altcolour)
- bp->next_colour = COLOUR_AUTHENTIC;
- else if (bp->is_cyclic)
- bp->next_colour = COLOUR_CYCLIC;
- else
- bp->next_colour = COLOUR_ACYCLIC;
-
- if (immediate) {
- bp->colour[0][0] = colour[bp->next_colour][0][0];
- bp->colour[0][1] = colour[bp->next_colour][0][1];
- bp->colour[0][2] = colour[bp->next_colour][0][2];
- bp->colour[0][3] = colour[bp->next_colour][0][3];
- bp->colour[1][0] = colour[bp->next_colour][1][0];
- bp->colour[1][1] = colour[bp->next_colour][1][1];
- bp->colour[1][2] = colour[bp->next_colour][1][2];
- bp->colour[1][3] = colour[bp->next_colour][1][3];
- }
- bp->morphing = 1;
-
- morph_colour(bp);
-}
-
-#if 0
-/* Returns morph progress */
-static float morph(long iter_msec)
-{
- /* work out the maximum angle for this iteration */
- int still_morphing;
- float iter_angle_max, largest_diff, largest_progress;
- int i;
-
- if (bp->new_morph)
- bp->new_morph = 0;
-
- iter_angle_max = 90.0 * (angvel/1000.0) * iter_msec;
-
- still_morphing = 0;
- largest_diff = largest_progress = 0.0;
- for (i = 0; i < NODE_COUNT; i++) {
- float curAngle = bp->node[i];
- float destAngle = model[bp->next_model].node[i];
- if (curAngle != destAngle) {
- still_morphing = 1;
- if (fabs(curAngle-destAngle) <= iter_angle_max)
- bp->node[i] = destAngle;
- else if (fmod(curAngle-destAngle+360,360) > 180)
- bp->node[i] = fmod(curAngle + iter_angle_max, 360);
- else
- bp->node[i] = fmod(curAngle+360 - iter_angle_max, 360);
- largest_diff = MAX(largest_diff, fabs(destAngle-bp->node[i]));
- largest_progress = MAX(largest_diff, fabs(bp->node[i] - model[bp->prev_model].node[i]));
- }
- }
-
- return MIN(largest_diff / largest_progress, 1.0);
-}
-#endif
-
-
-#ifdef HAVE_GLUT
-static void glsnake_idle();
-
-static restore_idle(int v __attribute__((__unused__)))
-{
- glutIdleFunc(glsnake_idle);
-}
-#endif
-
-static void quick_sleep(void)
-{
-#ifdef HAVE_GLUT
- /* By using glutTimerFunc we can keep responding to
- * mouse and keyboard events, unlike using something like
- * usleep. */
- glutIdleFunc(NULL);
- glutTimerFunc(1, restore_idle, 0);
-#else
- usleep(1);
-#endif
-}
-
-static void glsnake_idle(
-#ifndef HAVE_GLUT
- struct glsnake_cfg * bp
-#endif
- )
-{
- /* time since last iteration */
- long iter_msec;
- /* time since the beginning of last morph */
- long morf_msec;
- float iter_angle_max;
- snaketime current_time;
- /* morphFunc transition; */
- int still_morphing;
- int i;
-
- /* Do nothing to the model if we are paused */
- if (bp->paused) {
- /* Avoid busy waiting when nothing is changing */
- quick_sleep();
-#ifdef HAVE_GLUT
- glutSwapBuffers();
- glutPostRedisplay();
-#endif
- return;
- }
-
- /* <spiv> Well, ftime gives time with millisecond resolution.
- * <spiv> (or worse, perhaps... who knows what the OS will do)
- * <spiv> So if no discernable amount of time has passed:
- * <spiv> a) There's no point updating the screen, because
- * it would be the same
- * <spiv> b) The code will divide by zero
- */
- gettime(&current_time);
-
- iter_msec = (long) GETMSECS(current_time) - GETMSECS(bp->last_iteration) +
- ((long) GETSECS(current_time) - GETSECS(bp->last_iteration)) * 1000L;
-
- if (iter_msec) {
- /* save the current time */
- memcpy(&bp->last_iteration, &current_time, sizeof(snaketime));
-
- /* work out if we have to switch models */
- morf_msec = GETMSECS(bp->last_iteration) - GETMSECS(bp->last_morph) +
- ((long) (GETSECS(bp->last_iteration)-GETSECS(bp->last_morph)) * 1000L);
-
- if ((morf_msec > statictime) && !interactive && !bp->morphing) {
- /*printf("starting morph\n");*/
- memcpy(&bp->last_morph, &(bp->last_iteration), sizeof(bp->last_morph));
- start_morph(bp, RAND(models), 0);
- }
-
- if (interactive && !bp->morphing) {
- quick_sleep();
- return;
- }
-
- /* if (!bp->dragging && !bp->interactive) { */
- if (!interactive) {
-
- yspin += 360/((1000/yangvel)/iter_msec);
- zspin += 360/((1000/zangvel)/iter_msec);
- /*
- yspin += 360 * (yangvel/1000.0) * iter_msec;
- zspin += 360 * (zangvel/1000.0) * iter_msec;
- */
-
- /*printf("yspin: %f, zspin: %f\n", yspin, zspin);*/
-
- }
-
- /* work out the maximum angle we could turn this node in this
- * timeslice, iter_msec milliseconds long */
- iter_angle_max = 90.0 * (angvel/1000.0) * iter_msec;
-
- still_morphing = 0;
- for (i = 0; i < NODE_COUNT; i++) {
- float cur_angle = bp->node[i];
- float dest_angle = model[bp->next_model].node[i];
- if (cur_angle != dest_angle) {
- still_morphing = 1;
- if (fabs(cur_angle - dest_angle) <= iter_angle_max)
- bp->node[i] = dest_angle;
- else if (fmod(cur_angle - dest_angle + 360, 360) > 180)
- bp->node[i] = fmod(cur_angle + iter_angle_max, 360);
- else
- bp->node[i] = fmod(cur_angle + 360 - iter_angle_max, 360);
- }
- }
-
- if (!still_morphing)
- bp->morphing = 0;
-
- /* colour cycling */
- morph_colour(bp);
-
-#ifdef HAVE_GLUT
- glutSwapBuffers();
- glutPostRedisplay();
-#endif
- } else {
- /* We are going too fast, so we may as well let the
- * cpu relax a little by sleeping for a millisecond. */
- quick_sleep();
- }
-}
-
-/* wot draws it */
-ENTRYPOINT void glsnake_display(
-#ifndef HAVE_GLUT
- ModeInfo * mi
-#endif
- )
-{
-#ifndef HAVE_GLUT
- struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
- Display * dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
-#endif
-
- int i;
- float ang;
- float positions[NODE_COUNT][4]; /* origin points for each node */
- float com[4]; /* it's the CENTRE of MASS */
-
-#ifndef HAVE_GLUT
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-#endif
-
- gl_init(mi);
-
- /* clear the buffer */
- glClear((GLbitfield) GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- /* go into the modelview stack */
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- /* get the centre of each node, by moving through the snake and
- * performing the rotations, then grabbing the matrix at each point
- * and applying it to the origin */
- glPushMatrix();
-
-#ifdef HAVE_GLUT
- /* apply the mouse drag rotation */
- ui_mousedrag();
-#endif
-
- /* apply the continuous rotation */
- glRotatef(yspin, 0.0, 1.0, 0.0);
- glRotatef(zspin, 0.0, 0.0, 1.0);
-
- com[0] = 0.0;
- com[1] = 0.0;
- com[2] = 0.0;
- com[3] = 0.0;
- for (i = 0; i < NODE_COUNT; i++) {
- float rotmat[16];
-
- ang = bp->node[i];
-
- /*printf("ang = %f\n", ang);*/
-
- glTranslatef(0.5, 0.5, 0.5); /* move to center */
- glRotatef(90.0, 0.0, 0.0, -1.0); /* reorient */
- glTranslatef(1.0 + explode, 0.0, 0.0); /* move to new pos. */
- glRotatef(180.0 + ang, 1.0, 0.0, 0.0); /* pivot to new angle */
- glTranslatef(-0.5, -0.5, -0.5); /* return from center */
-
- glGetFloatv(GL_MODELVIEW_MATRIX, rotmat);
-
- matmult_origin(rotmat, positions[i]);
-
- /*printf("positions %f %f %f %f\n", positions[i][0], positions[i][1], positions[i][2], positions[i][3]);*/
-
- com[0] += positions[i][0];
- com[1] += positions[i][1];
- com[2] += positions[i][2];
- com[3] += positions[i][3];
- }
- glPopMatrix();
- com[0] /= NODE_COUNT;
- com[1] /= NODE_COUNT;
- com[2] /= NODE_COUNT;
- com[3] /= NODE_COUNT;
-
- com[0] /= com[3];
- com[1] /= com[3];
- com[2] /= com[3];
-
- /*printf("com: %f, %f, %f, %f\n", com[0], com[1], com[2], com[3]);*/
-
-#if MAGICAL_RED_STRING
- glPushMatrix();
- glTranslatef(-com[0], -com[1], -com[2]);
-
- glDisable(GL_LIGHTING);
- glColor4f(1.0, 0.0, 0.0, 1.0);
- glBegin(GL_LINE_STRIP);
- for (i = 0; i < NODE_COUNT - 1; i++) {
- glVertex3fv(positions[i]);
- }
- glEnd();
- glEnable(GL_LIGHTING);
- /*glTranslatef(com[0], com[1], com[2]);*/
- glPopMatrix();
-#endif
-
- glPushMatrix();
- glTranslatef(-com[0], -com[1], -com[2]);
-
-#ifdef HAVE_GLUT
- /* apply the mouse drag rotation */
- ui_mousedrag();
-#endif
-
- /* apply the continuous rotation */
- glRotatef(yspin, 0.0, 1.0, 0.0);
- glRotatef(zspin, 0.0, 0.0, 1.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- /* now draw each node along the snake -- this is quite ugly :p */
- mi->polygon_count = 0;
- for (i = 0; i < NODE_COUNT; i++) {
- /* choose a colour for this node */
- if ((i == bp->selected || i == bp->selected+1) && interactive)
- /* yellow */
- glColor4f(1.0, 1.0, 0.0, 1.0);
- else {
- /*glColor4fv(bp->colour[(i+1)%2]);*/
- glMaterialfv(GL_FRONT, GL_AMBIENT, bp->colour[(i+1)%2]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, bp->colour[(i+1)%2]);
- /*glMaterialfv(GL_FRONT, GL_SPECULAR, bp->colour[(i+1)%2]);*/
- }
-
- /* draw the node */
- if (wireframe)
- glCallList(bp->node_wire);
- else
- glCallList(bp->node_solid);
- mi->polygon_count += bp->node_polys;
-
- /* now work out where to draw the next one */
-
- /* Interpolate between models */
- ang = bp->node[i];
-
- glTranslatef(0.5, 0.5, 0.5); /* move to center */
- glRotatef(90.0, 0.0, 0.0, -1.0); /* reorient */
- glTranslatef(1.0 + explode, 0.0, 0.0); /* move to new pos. */
- glRotatef(180.0 + ang, 1.0, 0.0, 0.0); /* pivot to new angle */
- glTranslatef(-0.5, -0.5, -0.5); /* return from center */
- }
-
- glPopMatrix();
-
- if (titles)
-#ifdef HAVE_GLUT
- draw_title();
-#else
- draw_title(mi);
-#endif
-
-#ifndef HAVE_GLUT
- glsnake_idle(bp);
- if (mi->fps_p) do_fps(mi);
-#endif
-
- glFlush();
-#ifdef HAVE_GLUT
- glutSwapBuffers();
-#else
- glXSwapBuffers(dpy, window);
-#endif
-}
-
-
-#ifndef HAVE_GLUT
-ENTRYPOINT void free_glsnake(ModeInfo * mi)
-{
- struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->font_data) free_texture_font (bp->font_data);
- if (glIsList(bp->node_solid)) glDeleteLists(bp->node_solid, 1);
- if (glIsList(bp->node_wire)) glDeleteLists(bp->node_wire, 1);
-}
-#endif
-
-
-#ifdef HAVE_GLUT
-/* anything that needs to be cleaned up goes here */
-static void unmain()
-{
- glutDestroyWindow(bp->window);
- free(bp);
-}
-
-static void ui_init(int *, char **);
-
-int main(int argc, char ** argv)
-{
- bp = malloc(sizeof(struct glsnake_cfg));
- memset(bp, 0, sizeof(struct glsnake_cfg));
-
- bp->width = 640;
- bp->height = 480;
-
- ui_init(&argc, argv);
-
- gettime(&bp->last_iteration);
- memcpy(&bp->last_morph, &bp->last_iteration, sizeof(snaketime));
- srand((unsigned int)GETSECS(bp->last_iteration));
-
- bp->prev_colour = bp->next_colour = COLOUR_ACYCLIC;
- bp->next_model = RAND(models);
- bp->prev_model = 0;
- start_morph(bp->prev_model, 1);
-
- glsnake_init();
-
- atexit(unmain);
- glutSwapBuffers();
- glutMainLoop();
-
- return 0;
-}
-#endif
-
-/*
- * GLUT FUNCTIONS
- */
-
-#ifdef HAVE_GLUT
-
-/* trackball quaternions */
-static float cumquat[4] = {0.0,0.0,0.0,0.0}, oldquat[4] = {0.0,0.0,0.0,0.1};
-
-/* rotation matrix */
-static float rotation[16];
-
-/* mouse drag vectors: start and end */
-static float mouse_start[3], mouse_end[3];
-
-/* dragging boolean */
-static int dragging = 0;
-
-/* this function calculates the rotation matrix based on the quaternions
- * generated from the mouse drag vectors */
-static void calc_rotation()
-{
- double Nq, s;
- double xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
-
- /* this bit ripped from Shoemake's quaternion notes from SIGGRAPH */
- Nq = cumquat[0] * cumquat[0] + cumquat[1] * cumquat[1] +
- cumquat[2] * cumquat[2] + cumquat[3] * cumquat[3];
- s = (Nq > 0.0) ? (2.0 / Nq) : 0.0;
- xs = cumquat[0] * s; ys = cumquat[1] * s; zs = cumquat[2] * s;
- wx = cumquat[3] * xs; wy = cumquat[3] * ys; wz = cumquat[3] * zs;
- xx = cumquat[0] * xs; xy = cumquat[0] * ys; xz = cumquat[0] * zs;
- yy = cumquat[1] * ys; yz = cumquat[1] * zs; zz = cumquat[2] * zs;
-
- rotation[0] = 1.0 - (yy + zz);
- rotation[1] = xy + wz;
- rotation[2] = xz - wy;
- rotation[4] = xy - wz;
- rotation[5] = 1.0 - (xx + zz);
- rotation[6] = yz + wx;
- rotation[8] = xz + wy;
- rotation[9] = yz - wx;
- rotation[10] = 1.0 - (xx + yy);
- rotation[3] = rotation[7] = rotation[11] = 0.0;
- rotation[12] = rotation[13] = rotation[14] = 0.0;
- rotation[15] = 1.0;
-}
-
-static inline void ui_mousedrag()
-{
- glMultMatrixf(rotation);
-}
-
-static void ui_keyboard(unsigned char c, int x__attribute__((__unused__)), int y __attribute__((__unused__)))
-{
- int i;
-
- switch (c) {
- case 27: /* ESC */
- case 'q':
- exit(0);
- break;
- case 'e':
- explode += DEF_EXPLODE;
- glutPostRedisplay();
- break;
- case 'E':
- explode -= DEF_EXPLODE;
- if (explode < 0.0) explode = 0.0;
- glutPostRedisplay();
- break;
- case '.':
- /* next model */
- bp->next_model++;
- bp->next_model %= models;
- start_morph(bp->next_model, 0);
-
- /* Reset last_morph time */
- gettime(&bp->last_morph);
- break;
- case ',':
- /* previous model */
- bp->next_model = (bp->next_model + (int)models - 1) % (int)models;
- start_morph(bp->next_model, 0);
-
- /* Reset bp->last_morph time */
- gettime(&bp->last_morph);
- break;
- case '+':
- angvel += DEF_ANGVEL;
- break;
- case '-':
- if (angvel > DEF_ANGVEL)
- angvel -= DEF_ANGVEL;
- break;
- case 'i':
- if (interactive) {
- /* Reset last_iteration and last_morph time */
- gettime(&bp->last_iteration);
- gettime(&bp->last_morph);
- }
- interactive = 1 - interactive;
- glutPostRedisplay();
- break;
- case 'w':
- wireframe = 1 - wireframe;
- if (wireframe)
- glDisable(GL_LIGHTING);
- else
- glEnable(GL_LIGHTING);
- glutPostRedisplay();
- break;
- case 'a':
- transparent = 1 - transparent;
- if (transparent) {
- glEnable(GL_BLEND);
- } else {
- glDisable(GL_BLEND);
- }
- break;
- case 'p':
- if (bp->paused) {
- /* unpausing, reset last_iteration and last_morph time */
- gettime(&bp->last_iteration);
- gettime(&bp->last_morph);
- }
- bp->paused = 1 - bp->paused;
- break;
- case 'd':
- /* dump the current model so we can add it! */
- printf("# %s\nnoname:\t", model[bp->next_model].name);
- {
- int i;
-
- for (i = 0; i < NODE_COUNT; i++) {
- if (bp->node[i] == ZERO)
- printf("Z");
- else if (bp->node[i] == LEFT)
- printf("L");
- else if (bp->node[i] == PIN)
- printf("P");
- else if (bp->node[i] == RIGHT)
- printf("R");
- /*
- else
- printf("%f", node[i].curAngle);
- */
- if (i < NODE_COUNT - 1)
- printf(" ");
- }
- }
- printf("\n");
- break;
- case 'f':
- bp->fullscreen = 1 - bp->fullscreen;
- if (bp->fullscreen) {
- bp->old_width = bp->width;
- bp->old_height = bp->height;
- glutFullScreen();
- } else {
- glutReshapeWindow(bp->old_width, bp->old_height);
- glutPositionWindow(50,50);
- }
- break;
- case 't':
- titles = 1 - titles;
- if (interactive || bp->paused)
- glutPostRedisplay();
- break;
- case 'c':
- altcolour = 1 - altcolour;
- break;
- case 'z':
- zoom += 1.0;
- glsnake_reshape(bp->width, bp->height);
- break;
- case 'Z':
- zoom -= 1.0;
- glsnake_reshape(bp->width, bp->height);
- break;
- default:
- break;
- }
-}
-
-static void ui_special(int key, int x__attribute__((__unused__)), int y __attribute__((__unused__)))
-{
- float *destAngle = &(model[bp->next_model].node[bp->selected]);
- int unknown_key = 0;
-
- if (interactive) {
- switch (key) {
- case GLUT_KEY_UP:
- bp->selected = (bp->selected + (NODE_COUNT - 2)) % (NODE_COUNT - 1);
- break;
- case GLUT_KEY_DOWN:
- bp->selected = (bp->selected + 1) % (NODE_COUNT - 1);
- break;
- case GLUT_KEY_LEFT:
- *destAngle = fmod(*destAngle+(LEFT), 360);
- bp->morphing = bp->new_morph = 1;
- break;
- case GLUT_KEY_RIGHT:
- *destAngle = fmod(*destAngle+(RIGHT), 360);
- bp->morphing = bp->new_morph = 1;
- break;
- case GLUT_KEY_HOME:
- start_morph(STRAIGHT_MODEL, 0);
- break;
- default:
- unknown_key = 1;
- break;
- }
- }
- calc_snake_metrics();
-
- if (!unknown_key)
- glutPostRedisplay();
-}
-
-static void ui_mouse(int button, int state, int x, int y)
-{
- if (button==0) {
- switch (state) {
- case GLUT_DOWN:
- dragging = 1;
- mouse_start[0] = M_SQRT1_2 *
- (x - (bp->width / 2.0)) / (bp->width / 2.0);
- mouse_start[1] = M_SQRT1_2 *
- ((bp->height / 2.0) - y) / (bp->height / 2.0);
- mouse_start[2] = sqrt((double)(1-(mouse_start[0]*mouse_start[0]+mouse_start[1]*mouse_start[1])));
- break;
- case GLUT_UP:
- dragging = 0;
- oldquat[0] = cumquat[0];
- oldquat[1] = cumquat[1];
- oldquat[2] = cumquat[2];
- oldquat[3] = cumquat[3];
- break;
- default:
- break;
- }
- }
- glutPostRedisplay();
-}
-
-static void ui_motion(int x, int y)
-{
- double norm;
- float q[4];
-
- if (dragging) {
- /* construct the motion end vector from the x,y position on the
- * window */
- mouse_end[0] = M_SQRT1_2 * (x - (bp->width/ 2.0)) / (bp->width / 2.0);
- mouse_end[1] = M_SQRT1_2 * ((bp->height / 2.0) - y) / (bp->height / 2.0);
- /* calculate the normal of the vector... */
- norm = mouse_end[0] * mouse_end[0] + mouse_end[1] * mouse_end[1];
- /* check if norm is outside the sphere and wraparound if necessary */
- if (norm > 1.0) {
- mouse_end[0] = -mouse_end[0];
- mouse_end[1] = -mouse_end[1];
- mouse_end[2] = sqrt(norm - 1);
- } else {
- /* the z value comes from projecting onto an elliptical spheroid */
- mouse_end[2] = sqrt(1 - norm);
- }
-
- /* now here, build a quaternion from mouse_start and mouse_end */
- q[0] = mouse_start[1] * mouse_end[2] - mouse_start[2] * mouse_end[1];
- q[1] = mouse_start[2] * mouse_end[0] - mouse_start[0] * mouse_end[2];
- q[2] = mouse_start[0] * mouse_end[1] - mouse_start[1] * mouse_end[0];
- q[3] = mouse_start[0] * mouse_end[0] + mouse_start[1] * mouse_end[1] + mouse_start[2] * mouse_end[2];
-
- /* new rotation is the product of the new one and the old one */
- cumquat[0] = q[3] * oldquat[0] + q[0] * oldquat[3] +
- q[1] * oldquat[2] - q[2] * oldquat[1];
- cumquat[1] = q[3] * oldquat[1] + q[1] * oldquat[3] +
- q[2] * oldquat[0] - q[0] * oldquat[2];
- cumquat[2] = q[3] * oldquat[2] + q[2] * oldquat[3] +
- q[0] * oldquat[1] - q[1] * oldquat[0];
- cumquat[3] = q[3] * oldquat[3] - q[0] * oldquat[0] -
- q[1] * oldquat[1] - q[2] * oldquat[2];
-
- calc_rotation();
- }
- glutPostRedisplay();
-}
-
-static void ui_init(int * argc, char ** argv)
-{
- glutInit(argc, argv);
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
- glutInitWindowSize(bp->width, bp->height);
- bp->window = glutCreateWindow("glsnake");
-
- glutDisplayFunc(glsnake_display);
- glutReshapeFunc(glsnake_reshape);
- glutIdleFunc(glsnake_idle);
- glutKeyboardFunc(ui_keyboard);
- glutSpecialFunc(ui_special);
- glutMouseFunc(ui_mouse);
- glutMotionFunc(ui_motion);
-
- yangvel = DEF_YANGVEL;
- zangvel = DEF_ZANGVEL;
- explode = DEF_EXPLODE;
- angvel = DEF_ANGVEL;
- statictime = DEF_STATICTIME;
- altcolour = DEF_ALTCOLOUR;
- titles = DEF_TITLES;
- interactive = DEF_INTERACTIVE;
- zoom = DEF_ZOOM;
- wireframe = DEF_WIREFRAME;
- transparent = DEF_TRANSPARENT;
-}
-#endif /* HAVE_GLUT */
-
-XSCREENSAVER_MODULE ("GLSnake", glsnake)
diff --git a/hacks/glx/glsnake.man b/hacks/glx/glsnake.man
deleted file mode 100644
index 063a751..0000000
--- a/hacks/glx/glsnake.man
+++ /dev/null
@@ -1,94 +0,0 @@
-.TH XScreenSaver 1 "January 15, 2001" "X Version 11"
-.SH NAME
-glsnake \- OpenGL enhanced Rubik's Snake cyclewaster.
-.SH SYNOPSIS
-.B glsnake
-[\-display \fIhost:display.screen\fP] [\-window] [\-root]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
-[\-wireframe] [\-altcolour]
-[\-angvel \fIangular\fP]
-[\-explode \fIdistance\fP]
-[\-statictime \fImilliseconds\fP]
-[\-yangvel \fIangle\fP]
-[\-zangvel \fIangle\fP]
-.SH DESCRIPTION
-.PP
-.B glsnake
-is an imitation of Rubiks\' Snake, using OpenGL.
-.SH OPTIONS
-.I glsnake
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-wireframe
-Display the snake in wireframe mode, rather than the default solid mode.
-.TP 8
-.B \-altcolour
-Use the alternate colour scheme for the snake. Shape identification using
-colour will be disabled.
-.TP 8
-.B -angvel \fIangular\fP
-Change the speed at which the snake morphs to a new shape.
-.TP 8
-.B -explode \fIdistance\fP
-Change the distance between the nodes of a snake.
-.TP 8
-.B \-statictime \fImilliseconds\fP
-Change the time between morphs.
-.TP 8
-.B \-yangvel \fIangle\fP
-Change the angle of rotation around the Y axis per frame.
-.TP 8
-.B \-zangvel \fIangle\fP
-Change the angle of rotation around the Z axis per frame.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.PP
-.nf
-.sp
- https://spacepants.org/src/glsnake/
-.sp
-.fi
-.SH BUGS
-The snake will happily intersect itself while morphing (this is not a bug).
-.PP
-The rotation/camera position sucks.
-.SH COPYRIGHT
-Copyright \(co 2001, 2002 by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett.
-.PP
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 of the License, or (at your option) any later
-version.
-.PP
-This program is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-.SH AUTHOR
-Jamie Wilkinson <jaq@spacepants.org>, Andrew Bennetts <andrew@puzzling.org>,
-and Peter Aylett <peter@ylett.com>. Ported to XScreenSaver by Jamie Wilkinson.
diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c
deleted file mode 100644
index 07fd49e..0000000
--- a/hacks/glx/gltext.c
+++ /dev/null
@@ -1,618 +0,0 @@
-/* gltext, Copyright (c) 2001-2021 Jamie Zawinski <jwz@jwz.orgq2
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*wireframe: False \n" \
- "*usePty: False \n" \
-
-# define release_text 0
-#define SMOOTH_TUBE /* whether to have smooth or faceted tubes */
-
-#ifdef SMOOTH_TUBE
-# define TUBE_FACES 12 /* how densely to render tubes */
-#else
-# define TUBE_FACES 8
-#endif
-
-
-#include "xlockmore.h"
-#include "colors.h"
-#include "tube.h"
-#include "sphere.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include "textclient.h"
-#include "utf8wc.h"
-
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-#define DEF_TEXT "(default)"
-#define DEF_PROGRAM "xscreensaver-text --date --cols 20 --lines 3"
-#define DEF_SCALE_FACTOR "0.01"
-#define DEF_WANDER_SPEED "0.02"
-#define DEF_MAX_LINES "8"
-#define DEF_SPIN "XYZ"
-#define DEF_WANDER "True"
-#define DEF_FACE_FRONT "True"
-#define DEF_USE_MONOSPACE "False"
-
-#include "glutstroke.h"
-#include "glut_roman.h"
-#include "glut_mroman.h"
-#define GLUT_VARI_FONT (&glutStrokeRoman)
-#define GLUT_MONO_FONT (&glutStrokeMonoRoman)
-#define GLUT_FONT ((use_monospace) ? GLUT_MONO_FONT : GLUT_VARI_FONT)
-
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot, *rot2;
- trackball_state *trackball;
- Bool button_down_p;
- Bool spinx, spiny, spinz;
-
- GLuint text_list;
-
- int ncolors;
- XColor *colors;
- int ccolor;
-
- char *text;
- int reload;
-
- time_t last_update;
- text_data *tc;
-
-} text_configuration;
-
-static text_configuration *tps = NULL;
-
-static char *text_fmt;
-static char *program_str;
-static float scale_factor;
-static int max_no_lines;
-static float wander_speed;
-static char *do_spin;
-static Bool do_wander;
-static Bool face_front_p;
-static Bool use_monospace;
-
-static XrmOptionDescRec opts[] = {
- { "-text", ".text", XrmoptionSepArg, 0 },
- { "-program", ".program", XrmoptionSepArg, 0 },
- { "-scale", ".scaleFactor", XrmoptionSepArg, 0 },
- { "-maxlines", ".maxLines", XrmoptionSepArg, 0 },
- { "-wander-speed", ".wanderSpeed", XrmoptionSepArg, 0 },
- { "-spin", ".spin", XrmoptionSepArg, 0 },
- { "+spin", ".spin", XrmoptionNoArg, "" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-front", ".faceFront", XrmoptionNoArg, "True" },
- { "+front", ".faceFront", XrmoptionNoArg, "False" },
- { "-mono", ".useMonoSpace", XrmoptionNoArg, "True" },
- { "+mono", ".useMonoSpace", XrmoptionNoArg, "False" }
-};
-
-static argtype vars[] = {
- {&text_fmt, "text", "Text", DEF_TEXT, t_String},
- /* This happens to be what utils/textclient.c reads */
- {&program_str, "program", "Program", DEF_PROGRAM, t_String},
- {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
- {&scale_factor, "scaleFactor", "ScaleFactor", DEF_SCALE_FACTOR, t_Float},
- {&max_no_lines, "maxLines", "MaxLines", DEF_MAX_LINES, t_Int},
- {&wander_speed, "wanderSpeed", "WanderSpeed", DEF_WANDER_SPEED, t_Float},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&face_front_p, "faceFront", "FaceFront", DEF_FACE_FRONT, t_Bool},
- {&use_monospace, "useMonoSpace", "UseMonoSpace", DEF_USE_MONOSPACE, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt text_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_text (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- {
- GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi)
- ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi))
- : 1);
- glScalef (s, s, s);
- }
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-static void
-gl_init (ModeInfo *mi)
-{
- text_configuration *tp = &tps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
-
- static const GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0};
-
- if (!wire)
- {
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glEnable(GL_CULL_FACE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- }
-
- tp->text_list = glGenLists (1);
- glNewList (tp->text_list, GL_COMPILE);
- glEndList ();
-}
-
-
-static void
-parse_text (ModeInfo *mi)
-{
- text_configuration *tp = &tps[MI_SCREEN(mi)];
- char *old = tp->text;
-
- const char *tt =
- (text_fmt && *text_fmt && !!strcmp(text_fmt, "(default)")
- ? text_fmt : 0);
- const char *pr =
- (program_str && *program_str && !!strcmp(program_str, "(default)")
- ? program_str : 0);
-
- /* We used to do some "#ifdef HAVE_UNAME" stuff in here, but
- "xscreensaver-text --date" does a much better job of that
- by reading random files from /etc/ and such.
- */
-
- if (tt && !strchr (tt, '%')) /* Static text with no formatting */
- {
- tp->text = strdup (tt);
- tp->reload = 0;
- }
- else if (tt) /* Format string */
- {
- time_t now = time ((time_t *) 0);
- struct tm *tm = localtime (&now);
- int L = strlen(text_fmt) + 100;
- tp->text = (char *) malloc (L);
- *tp->text = 0;
- strftime (tp->text, L-1, text_fmt, tm);
- if (!*tp->text)
- sprintf (tp->text, "strftime error:\n%s", text_fmt);
- tp->reload = 1; /* Clock ticks every second */
- }
- else if (pr)
- {
- int max_lines = max_no_lines;
- char buf[4096];
- char *p = buf;
- int lines = 0;
-
- if (! tp->tc)
- /* This runs 'pr' because it reads the same "program" resource. */
- tp->tc = textclient_open (mi->dpy);
-
- while (p < buf + sizeof(buf) - 1 &&
- lines < max_lines)
- {
- int c = textclient_getc (tp->tc);
- if (c == '\n')
- lines++;
- if (c > 0)
- *p++ = (char) c;
- else
- break;
- }
- *p = 0;
- if (lines == 0 && buf[0])
- lines++;
-
- tp->text = strdup (buf);
-
- if (!*tp->text)
- tp->reload = 1; /* No output, try again right away */
- else if (!strncmp (pr, "xscreensaver-text --date", 24))
- {
- /* If it's the default, and we have results, there's no need
- to ever reload. */
- tp->reload = 0;
- }
- else
- tp->reload = 7; /* Linger a bit */
- }
- else
- abort();
-
- {
- /* The GLUT font only has ASCII characters. */
- char *s1 = utf8_to_latin1 (tp->text, True);
- free (tp->text);
- tp->text = s1;
- }
-
- /* If we had text before but got no text this time, hold on to the
- old one, to avoid flickering.
- */
- if (old && *old && !*tp->text)
- {
- free (tp->text);
- tp->text = old;
- }
- else if (old)
- free (old);
-}
-
-
-ENTRYPOINT Bool
-text_handle_event (ModeInfo *mi, XEvent *event)
-{
- text_configuration *tp = &tps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, tp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &tp->button_down_p))
- return True;
-
- return False;
-}
-
-
-ENTRYPOINT void
-init_text (ModeInfo *mi)
-{
- text_configuration *tp;
- int i;
-
- MI_INIT (mi, tps);
-
- tp = &tps[MI_SCREEN(mi)];
-
- if ((tp->glx_context = init_GL(mi)) != NULL) {
- gl_init(mi);
- reshape_text (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- }
-
- {
- double spin_speed = 0.5;
- double wander_speed = 0.02;
- double tilt_speed = 0.03;
- double spin_accel = 0.5;
-
- char *s = do_spin;
- while (*s)
- {
- if (*s == 'x' || *s == 'X') tp->spinx = True;
- else if (*s == 'y' || *s == 'Y') tp->spiny = True;
- else if (*s == 'z' || *s == 'Z') tp->spinz = True;
- else if (*s == '0') ;
- else
- {
- fprintf (stderr,
- "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
- progname, do_spin);
- exit (1);
- }
- s++;
- }
-
- tp->rot = make_rotator (tp->spinx ? spin_speed : 0,
- tp->spiny ? spin_speed : 0,
- tp->spinz ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- False);
- tp->rot2 = (face_front_p
- ? make_rotator (0, 0, 0, 0, tilt_speed, True)
- : 0);
- tp->trackball = gltrackball_init (False);
- }
-
- tp->ncolors = 255;
- tp->colors = (XColor *) calloc(tp->ncolors, sizeof(XColor));
- make_smooth_colormap (0, 0, 0,
- tp->colors, &tp->ncolors,
- False, 0, False);
-
- /* brighter colors, please... */
- for (i = 0; i < tp->ncolors; i++)
- {
- tp->colors[i].red = (tp->colors[i].red / 2) + 32767;
- tp->colors[i].green = (tp->colors[i].green / 2) + 32767;
- tp->colors[i].blue = (tp->colors[i].blue / 2) + 32767;
- }
-
- parse_text (mi);
-
-}
-
-
-static int
-fill_character (GLUTstrokeFont font, int c, Bool wire, int *polysP)
-{
- GLfloat tube_width = 10;
-
- const StrokeCharRec *ch;
- const StrokeRec *stroke;
- const CoordRec *coord;
- StrokeFontPtr fontinfo;
- int i, j;
-
- fontinfo = (StrokeFontPtr) font;
-
- if (c < 0 || c >= fontinfo->num_chars)
- return 0;
- ch = &(fontinfo->ch[c]);
- if (ch)
- {
- GLfloat lx=0, ly=0;
- for (i = ch->num_strokes, stroke = ch->stroke;
- i > 0; i--, stroke++) {
- for (j = stroke->num_coords, coord = stroke->coord;
- j > 0; j--, coord++)
- {
-# ifdef SMOOTH_TUBE
- int smooth = True;
-# else
- int smooth = False;
-# endif
-
- if (j != stroke->num_coords)
- *polysP += tube (lx, ly, 0,
- coord->x, coord->y, 0,
- tube_width,
- tube_width * 0.15,
- TUBE_FACES, smooth, False, wire);
- lx = coord->x;
- ly = coord->y;
-
- /* Put a sphere at the endpoint of every line segment. Wasteful
- on curves like "0" but necessary on corners like "4". */
- if (! wire)
- {
- glPushMatrix();
- glTranslatef (lx, ly, 0);
- glScalef (tube_width, tube_width, tube_width);
- *polysP += unit_sphere (TUBE_FACES, TUBE_FACES, wire);
- glPopMatrix();
- }
- }
- }
- return (int) (ch->right + tube_width);
- }
- return 0;
-}
-
-
-static int
-text_extents (const char *string, int *wP, int *hP)
-{
- const char *s, *start;
- int line_height = GLUT_FONT->top - GLUT_FONT->bottom;
- int lines = 0;
- *wP = 0;
- *hP = 0;
- start = string;
- s = start;
- while (1)
- if (*s == '\n' || *s == 0)
- {
- int w = 0;
- while (start < s)
- {
- w += glutStrokeWidth(GLUT_FONT, *start);
- start++;
- }
- start = s+1;
-
- if (w > *wP) *wP = w;
- *hP += line_height;
- lines++;
- if (*s == 0) break;
- s++;
- }
- else
- s++;
-
- return lines;
-}
-
-
-static unsigned long
-fill_string (const char *string, Bool wire)
-{
- int polys = 0;
- const char *s, *start;
- int line_height = GLUT_FONT->top - GLUT_FONT->bottom;
- int off;
- GLfloat x = 0, y = 0;
-
- int ow, oh;
- text_extents (string, &ow, &oh);
-
- y = oh / 2 - line_height;
-
- start = string;
- s = start;
- while (1)
- if (*s == '\n' || *s == 0)
- {
- int line_w = 0;
- const char *s2;
- const char *lstart = start;
- const char *lend = s;
-
- /* strip off whitespace at beginning and end of line
- (since we're centering.) */
- while (lend > lstart && isspace(lend[-1]))
- lend--;
- while (lstart < lend && isspace(*lstart))
- lstart++;
-
- for (s2 = lstart; s2 < lend; s2++)
- line_w += glutStrokeWidth (GLUT_FONT, *s2);
-
- x = (-ow/2) + ((ow-line_w)/2);
- for (s2 = lstart; s2 < lend; s2++)
- {
- glPushMatrix();
- glTranslatef(x, y, 0);
- off = fill_character (GLUT_FONT, *s2, wire, &polys);
- x += off;
- glPopMatrix();
- }
-
- start = s+1;
-
- y -= line_height;
- if (*s == 0) break;
- s++;
- }
- else
- s++;
- return polys;
-}
-
-
-ENTRYPOINT void
-draw_text (ModeInfo *mi)
-{
- text_configuration *tp = &tps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int wire = MI_IS_WIREFRAME(mi);
-
- GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat color[4] = {0.0, 0.0, 0.0, 1.0};
-
- if (!tp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *tp->glx_context);
-
- if (tp->reload)
- {
- if (time ((time_t *) 0) >= tp->last_update + tp->reload)
- {
- parse_text (mi);
- tp->last_update = time ((time_t *) 0);
- }
- }
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
- glScalef(1.1, 1.1, 1.1);
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- {
- double x, y, z;
- get_position (tp->rot, &x, &y, &z, !tp->button_down_p);
- glTranslatef((x - 0.5) * 8,
- (y - 0.5) * 8,
- (z - 0.5) * 8);
-
- gltrackball_rotate (tp->trackball);
-
- if (face_front_p)
- {
- double max = 90;
- get_position (tp->rot2, &x, &y, &z, !tp->button_down_p);
- if (tp->spinx) glRotatef (max/2 - x*max, 1, 0, 0);
- if (tp->spiny) glRotatef (max/2 - y*max, 0, 1, 0);
- if (tp->spinz) glRotatef (max/2 - z*max, 0, 0, 1);
- }
- else
- {
- get_rotation (tp->rot, &x, &y, &z, !tp->button_down_p);
- glRotatef (x * 360, 1, 0, 0);
- glRotatef (y * 360, 0, 1, 0);
- glRotatef (z * 360, 0, 0, 1);
- }
- }
-
-
- glColor4fv (white);
-
- color[0] = tp->colors[tp->ccolor].red / 65536.0;
- color[1] = tp->colors[tp->ccolor].green / 65536.0;
- color[2] = tp->colors[tp->ccolor].blue / 65536.0;
- tp->ccolor++;
- if (tp->ccolor >= tp->ncolors) tp->ccolor = 0;
-
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
-
- glScalef(scale_factor, scale_factor, scale_factor);
-
- mi->polygon_count = fill_string(tp->text, wire);
-
- glPopMatrix ();
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-ENTRYPOINT void
-free_text(ModeInfo * mi)
-{
- text_configuration *tp = &tps[MI_SCREEN(mi)];
-
- if (!tp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *tp->glx_context);
-
- if (tp->tc)
- textclient_close (tp->tc);
- if (tp->text) free (tp->text);
- if (tp->trackball) gltrackball_free (tp->trackball);
- if (tp->rot) free_rotator (tp->rot);
- if (tp->rot2) free_rotator (tp->rot2);
- if (tp->colors) free (tp->colors);
- if (glIsList(tp->text_list)) glDeleteLists(tp->text_list, 1);
-}
-
-
-XSCREENSAVER_MODULE_2 ("GLText", gltext, text)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/gltext.man b/hacks/glx/gltext.man
deleted file mode 100644
index 9d3f462..0000000
--- a/hacks/glx/gltext.man
+++ /dev/null
@@ -1,143 +0,0 @@
-.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
-.SH NAME
-gltext \- draws text spinning around in 3D
-.SH SYNOPSIS
-.B gltext
-[\-display \fIhost:display.screen\fP] [\-window] [\-root]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
-[\-text \fIstring\fP]
-[\-program \fIcommand\fP]
-[\-wander] [\-no-wander]
-[\-spin \fIaxes\fP]
-[\-no-spin]
-[\-front] [\-no\-front]
-[\-wireframe]
-[\-fps]
-.SH DESCRIPTION
-The \fIgltext\fP program draws some text spinning around in 3D, using
-a font that appears to be made of solid tubes.
-.SH OPTIONS
-.I gltext
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-text \fIstring\fP
-The text to display. This may contain newlines, but it shouldn't be
-very long. The default is to display the machine name and OS version.
-
-This may also be a format string acceptable to
-.BR date (1)
-and
-.BR strftime (3) ,
-in which case, it will be updated once a second. So to make this
-program display a spinning digital clock, you could do this:
-.nf
-.sp
- gltext -text "%A%n%d %b %Y%n%l:%M:%S %p"
-.sp
-.fi
-To include a literal `%', you must double it: `%%'.
-
-See the man page for
-.BR strftime (3)
-for more details.
-.TP 8
-.B \-program \fIcommand\fP
-The given program is run, and its output is displayed.
-If specified, this overrides \fI\-text\fP.
-The output of this program will be repeatedely displayed, with new
-pages of text shifting in every few seconds. Lines should be relatively
-short. You might try:
-.nf
-.sp
- -program 'xscreensaver-text --cols 20'
-.sp
-.fi
-.TP 8
-.B \-maxlines
-Set the number of lines of text to display. By default,
-.I gltext
-will print 8 lines of text at a time. Use this option to increase or
-decrease that number. Be aware that
-.I gltext
-is designed to work with a fairly small amount of text, so setting this
-value too high might result in slow performance or strange behaviour
-stemming from buffer overflows. Increase at your own risk.
-.TP 8
-.B \-mono
-Display the text in a monospace font. Default is a variable-width font.
-.TP 8
-.B \-no\-mono
-Display the text in a variable-width font. This is the default.
-.TP 8
-.B \-wander
-Move the text around the screen. This is the default.
-.TP 8
-.B \-no\-wander
-Keep the text centered on the screen.
-.TP 8
-.B \-wander\-speed
-Sets the speed at which the text wanders around. Default is 0.02.
-.TP 8
-.B \-spin
-Which axes around which the text should spin. The default is "XYZ",
-meaning rotate it freely in space. "\fB\-spin Z\fP" would rotate the
-text in the plane of the screen while not rotating it into or out
-of the screen; etc.
-.TP 8
-.B \-no\-spin
-Don't spin the text at all: the same as \fB\-spin ""\fP.
-.TP 8
-.B \-front
-When spinning, never spin all the way around or upside down:
-always face mostly forward so that the text is easily readable.
-.TP 8
-.B \-no\-front
-Allow spins to go all the way around or upside down. This is the default.
-.TP 8
-.B \-wireframe
-Render in wireframe instead of solid.
-.TP 8
-.B \-fps
-Display the current frame rate, CPU load, and polygon count.
-.TP 8
-.B \-scale
-Sets the scale at which the text is rendered. Bigger values will result
-in bigger text; smaller values will result in smaller text. The default
-value is 0.01.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-text (MANSUFFIX)
-.SH COPYRIGHT
-Copyright \(co 2001-2014 by Jamie Zawinski.
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c
deleted file mode 100644
index 7a46f06..0000000
--- a/hacks/glx/gltrackball.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/* gltrackball, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
- * GL-flavored wrapper for trackball.c
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "screenhackI.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-# define Button4 4 /* WTF */
-# define Button5 5
-# define Button6 6
-# define Button7 7
-
-#include "trackball.h"
-#include "gltrackball.h"
-
-#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
- /* Surely this should be defined somewhere more centrally... */
-# define HAVE_MOBILE
-#endif
-
-/* Bah, copied from ../fps.h */
-#ifdef HAVE_MOBILE
- extern double current_device_rotation (void);
-#else
-# define current_device_rotation() (0)
-#endif
-
-
-struct trackball_state {
- int ow, oh;
- double x, y;
- double dx, dy, ddx, ddy;
- GLfloat q[4];
- int button_down_p;
- int ignore_device_rotation_p;
-};
-
-/* Returns a trackball_state object, which encapsulates the stuff necessary
- to make dragging the mouse on the window of a GL program do the right thing.
- */
-trackball_state *
-gltrackball_init (int ignore_device_rotation_p)
-{
- trackball_state *ts = (trackball_state *) calloc (1, sizeof (*ts));
- if (!ts) return 0;
- ts->ignore_device_rotation_p = ignore_device_rotation_p;
- trackball (ts->q, 0, 0, 0, 0);
- return ts;
-}
-
-void
-gltrackball_free (trackball_state *ts)
-{
- free (ts);
-}
-
-
-/* Device rotation interacts very strangely with mouse positions.
- I'm not entirely sure this is the right fix.
- */
-static void
-adjust_for_device_rotation (trackball_state *ts,
- double *x, double *y, double *w, double *h)
-{
- int rot = (int) current_device_rotation();
- int swap;
-
- if (ts->ignore_device_rotation_p) return;
-
- while (rot <= -180) rot += 360;
- while (rot > 180) rot -= 360;
-
- if (rot > 135 || rot < -135) /* 180 */
- {
- *x = *w - *x;
- *y = *h - *y;
- }
- else if (rot > 45) /* 90 */
- {
- swap = *x; *x = *y; *y = swap;
- swap = *w; *w = *h; *h = swap;
- *x = *w - *x;
- }
- else if (rot < -45) /* 270 */
- {
- swap = *x; *x = *y; *y = swap;
- swap = *w; *w = *h; *h = swap;
- *y = *h - *y;
- }
-}
-
-
-/* Begin tracking the mouse: Call this when the mouse button goes down.
- x and y are the mouse position relative to the window.
- w and h are the size of the window.
- */
-void
-gltrackball_start (trackball_state *ts, int x, int y, int w, int h)
-{
- ts->x = x;
- ts->y = y;
- ts->button_down_p = 1;
- ts->dx = ts->ddx = 0;
- ts->dy = ts->ddy = 0;
-}
-
-/* Stop tracking the mouse: Call this when the mouse button goes up.
- */
-void
-gltrackball_stop (trackball_state *ts)
-{
- ts->button_down_p = 0;
-}
-
-static void
-gltrackball_track_1 (trackball_state *ts,
- double x, double y,
- int w, int h,
- int ignore_device_rotation_p)
-{
- double X = x;
- double Y = y;
- double W = w, W2 = w;
- double H = h, H2 = h;
- float q2[4];
- double ox = ts->x;
- double oy = ts->y;
-
- ts->x = x;
- ts->y = y;
-
- if (! ignore_device_rotation_p)
- {
- adjust_for_device_rotation (ts, &ox, &oy, &W, &H);
- adjust_for_device_rotation (ts, &X, &Y, &W2, &H2);
- }
- trackball (q2,
- (2 * ox - W) / W,
- (H - 2 * oy) / H,
- (2 * X - W) / W,
- (H - 2 * Y) / H);
-
- add_quats (q2, ts->q, ts->q);
-}
-
-
-/* Track the mouse: Call this each time the mouse moves with the button down.
- x and y are the new mouse position relative to the window.
- w and h are the size of the window.
- */
-void
-gltrackball_track (trackball_state *ts, int x, int y, int w, int h)
-{
- double dampen = 0.01; /* This keeps it going for about 3 sec */
- ts->dx = x - ts->x;
- ts->dy = y - ts->y;
- ts->ddx = ts->dx * dampen;
- ts->ddy = ts->dy * dampen;
- ts->ow = w;
- ts->oh = h;
- gltrackball_track_1 (ts, x, y, w, h, False);
-}
-
-
-static void
-gltrackball_dampen (double *n, double *dn)
-{
- int pos = (*n > 0);
- *n -= *dn;
- if (pos != (*n > 0))
- *n = *dn = 0;
-}
-
-
-/* Reset the trackball to the default unrotated state,
- plus an optional initial rotation.
- */
-void
-gltrackball_reset (trackball_state *ts, float x, float y)
-{
- int bd = ts->button_down_p;
- int ig = ts->ignore_device_rotation_p;
- memset (ts, 0, sizeof(*ts));
- ts->button_down_p = bd;
- ts->ignore_device_rotation_p = ig;
- trackball (ts->q, 0, 0, x, y);
-}
-
-
-/* Execute the rotations current encapsulated in the trackball_state:
- this does something analogous to glRotatef().
- */
-void
-gltrackball_rotate (trackball_state *ts)
-{
- GLfloat m[4][4];
- if (!ts->button_down_p &&
- (ts->ddx != 0 ||
- ts->ddy != 0))
- {
- /* Apply inertia: keep moving in the same direction as the last move. */
- gltrackball_track_1 (ts,
- ts->x + ts->dx,
- ts->y + ts->dy,
- ts->ow, ts->oh,
- False);
-
- /* Dampen inertia: gradually stop spinning. */
- gltrackball_dampen (&ts->dx, &ts->ddx);
- gltrackball_dampen (&ts->dy, &ts->ddy);
- }
-
- build_rotmatrix (m, ts->q);
- glMultMatrixf (&m[0][0]);
-}
-
-
-/* Call this when a mouse-wheel click is detected.
- Clicks act like horizontal or vertical drags.
- Percent is the length of the drag as a percentage of the screen size.
- Button is 'Button4' or 'Button5' (for the vertical wheel)
- or 'Button5' or 'Button6' (for the horizontal wheel).
- If `flip_p' is true, swap the horizontal and vertical axes.
- */
-void
-gltrackball_mousewheel (trackball_state *ts,
- int button, int percent, int flip_p)
-{
- int up_p;
- int horizontal_p;
- int mx, my, move, scale;
-
-#ifdef HAVE_JWXYZ
- flip_p = 0; /* MacOS has already handled this. */
-#endif
-
- switch (button) {
- case Button4: up_p = 1; horizontal_p = 0; break;
- case Button5: up_p = 0; horizontal_p = 0; break;
- case Button6: up_p = 1; horizontal_p = 1; break;
- case Button7: up_p = 0; horizontal_p = 1; break;
- default: abort(); break;
- }
-
- if (flip_p)
- {
- horizontal_p = !horizontal_p;
- up_p = !up_p;
- }
-
- scale = mx = my = 1000;
- move = (up_p
- ? floor (scale * (1.0 - (percent / 100.0)))
- : ceil (scale * (1.0 + (percent / 100.0))));
- if (horizontal_p) mx = move;
- else my = move;
- gltrackball_start (ts, scale, scale, scale*2, scale*2);
- gltrackball_track (ts, mx, my, scale*2, scale*2);
-}
-
-void
-gltrackball_get_quaternion (trackball_state *ts, float q[4])
-{
- int i;
- for (i=0; i<4; i++)
- q[i] = ts->q[i];
-}
-
-
-/* A utility function for event-handler functions:
- Handles the various motion and click events related to trackballs.
- Returns True if the event was handled.
- */
-Bool
-gltrackball_event_handler (XEvent *event,
- trackball_state *ts,
- int window_width, int window_height,
- Bool *button_down_p)
-{
- if (event->xany.type == ButtonPress &&
- event->xbutton.button == Button1)
- {
- *button_down_p = True;
- gltrackball_start (ts,
- event->xbutton.x, event->xbutton.y,
- window_width, window_height);
- return True;
- }
- else if (event->xany.type == ButtonRelease &&
- event->xbutton.button == Button1)
- {
- *button_down_p = False;
- gltrackball_stop (ts);
- return True;
- }
- else if (event->xany.type == ButtonPress &&
- (event->xbutton.button == Button4 ||
- event->xbutton.button == Button5 ||
- event->xbutton.button == Button6 ||
- event->xbutton.button == Button7))
- {
- gltrackball_mousewheel (ts, event->xbutton.button, 10,
- !!event->xbutton.state);
- return True;
- }
- else if (event->xany.type == MotionNotify &&
- *button_down_p)
- {
- gltrackball_track (ts,
- event->xmotion.x, event->xmotion.y,
- window_width, window_height);
- return True;
- }
-
- return False;
-}
diff --git a/hacks/glx/gltrackball.h b/hacks/glx/gltrackball.h
deleted file mode 100644
index 048747c..0000000
--- a/hacks/glx/gltrackball.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* gltrackball, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
- * GL-flavored wrapper for trackball.c
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __GLTRACKBALL_H__
-#define __GLTRACKBALL_H__
-
-typedef struct trackball_state trackball_state;
-
-/* Returns a trackball_state object, which encapsulates the stuff necessary
- to make dragging the mouse on the window of a GL program do the right thing.
- */
-extern trackball_state *gltrackball_init (int ignore_device_rotation_p);
-extern void gltrackball_free (trackball_state *);
-
-/* Begin tracking the mouse: Call this when the mouse button goes down.
- x and y are the mouse position relative to the window.
- w and h are the size of the window.
- */
-extern void gltrackball_start (trackball_state *, int x, int y, int w, int h);
-
-/* Track the mouse: Call this each time the mouse moves with the button down.
- x and y are the new mouse position relative to the window.
- w and h are the size of the window.
- */
-extern void gltrackball_track (trackball_state *, int x, int y, int w, int h);
-
-/* Stop tracking the mouse: Call this when the mouse button goes up.
- */
-extern void gltrackball_stop (trackball_state *);
-
-/* Execute the rotations current encapsulated in the trackball_state:
- this does something analogous to glRotatef().
- */
-extern void gltrackball_rotate (trackball_state *);
-
-/* Call this when a mouse-wheel click is detected.
- Clicks act like horizontal or vertical drags.
- Percent is the length of the drag as a percentage of the screen size.
- Button is 'Button4' or 'Button5' (for the vertical wheel)
- or 'Button5' or 'Button6' (for the horizontal wheel).
- If `flip_p' is true, swap the horizontal and vertical axes.
- */
-void gltrackball_mousewheel (trackball_state *ts,
- int button, int percent, int flip_p);
-
-/* Return the quaternion encapsulated by the trackball state.
- */
-extern void gltrackball_get_quaternion (trackball_state *ts, float q[4]);
-
-/* Reset the trackball to the default unrotated state,
- plus an optional initial rotation.
- */
-extern void gltrackball_reset (trackball_state *ts, float x, float y);
-
-/* A utility function for event-handler functions:
- Handles the various motion and click events related to trackballs.
- Returns True if the event was handled.
- */
-extern Bool gltrackball_event_handler (XEvent *,
- trackball_state *,
- int window_width, int window_height,
- Bool *button_down_p);
-
-#endif /* __GLTRACKBALL_H__ */
diff --git a/hacks/glx/glut_mroman.h b/hacks/glx/glut_mroman.h
deleted file mode 100644
index 39eb171..0000000
--- a/hacks/glx/glut_mroman.h
+++ /dev/null
@@ -1,2456 +0,0 @@
-/* Roman monospaced simplex stroke font copyright (c) 1989, 1990, 1991
- * by Sun Microsystems, Inc. and the X Consortium.
- * Originally part of the GLUT library by Mark J. Kilgard.
- * I have changed names so that this can be a .h rather than a .c file without
- * causing name clashes with glut_roman.h
- */
-
-#include "glutstroke.h"
-
-/* char: 33 '!' */
-
-static const CoordRec monoChar33_stroke0[] = {
- { 52.381, 100 },
- { 52.381, 33.3333 },
-};
-
-static const CoordRec monoChar33_stroke1[] = {
- { 52.381, 9.5238 },
- { 47.6191, 4.7619 },
- { 52.381, 0 },
- { 57.1429, 4.7619 },
- { 52.381, 9.5238 },
-};
-
-static const StrokeRec monoChar33[] = {
- { 2, monoChar33_stroke0 },
- { 5, monoChar33_stroke1 },
-};
-
-/* char: 34 '"' */
-
-static const CoordRec monoChar34_stroke0[] = {
- { 33.3334, 100 },
- { 33.3334, 66.6667 },
-};
-
-static const CoordRec monoChar34_stroke1[] = {
- { 71.4286, 100 },
- { 71.4286, 66.6667 },
-};
-
-static const StrokeRec monoChar34[] = {
- { 2, monoChar34_stroke0 },
- { 2, monoChar34_stroke1 },
-};
-
-/* char: 35 '#' */
-
-static const CoordRec monoChar35_stroke0[] = {
- { 54.7619, 119.048 },
- { 21.4286, -33.3333 },
-};
-
-static const CoordRec monoChar35_stroke1[] = {
- { 83.3334, 119.048 },
- { 50, -33.3333 },
-};
-
-static const CoordRec monoChar35_stroke2[] = {
- { 21.4286, 57.1429 },
- { 88.0952, 57.1429 },
-};
-
-static const CoordRec monoChar35_stroke3[] = {
- { 16.6667, 28.5714 },
- { 83.3334, 28.5714 },
-};
-
-static const StrokeRec monoChar35[] = {
- { 2, monoChar35_stroke0 },
- { 2, monoChar35_stroke1 },
- { 2, monoChar35_stroke2 },
- { 2, monoChar35_stroke3 },
-};
-
-/* char: 36 '$' */
-
-static const CoordRec monoChar36_stroke0[] = {
- { 42.8571, 119.048 },
- { 42.8571, -19.0476 },
-};
-
-static const CoordRec monoChar36_stroke1[] = {
- { 61.9047, 119.048 },
- { 61.9047, -19.0476 },
-};
-
-static const CoordRec monoChar36_stroke2[] = {
- { 85.7143, 85.7143 },
- { 76.1905, 95.2381 },
- { 61.9047, 100 },
- { 42.8571, 100 },
- { 28.5714, 95.2381 },
- { 19.0476, 85.7143 },
- { 19.0476, 76.1905 },
- { 23.8095, 66.6667 },
- { 28.5714, 61.9048 },
- { 38.0952, 57.1429 },
- { 66.6666, 47.619 },
- { 76.1905, 42.8571 },
- { 80.9524, 38.0952 },
- { 85.7143, 28.5714 },
- { 85.7143, 14.2857 },
- { 76.1905, 4.7619 },
- { 61.9047, 0 },
- { 42.8571, 0 },
- { 28.5714, 4.7619 },
- { 19.0476, 14.2857 },
-};
-
-static const StrokeRec monoChar36[] = {
- { 2, monoChar36_stroke0 },
- { 2, monoChar36_stroke1 },
- { 20, monoChar36_stroke2 },
-};
-
-/* char: 37 '%' */
-
-static const CoordRec monoChar37_stroke0[] = {
- { 95.2381, 100 },
- { 9.5238, 0 },
-};
-
-static const CoordRec monoChar37_stroke1[] = {
- { 33.3333, 100 },
- { 42.8571, 90.4762 },
- { 42.8571, 80.9524 },
- { 38.0952, 71.4286 },
- { 28.5714, 66.6667 },
- { 19.0476, 66.6667 },
- { 9.5238, 76.1905 },
- { 9.5238, 85.7143 },
- { 14.2857, 95.2381 },
- { 23.8095, 100 },
- { 33.3333, 100 },
- { 42.8571, 95.2381 },
- { 57.1428, 90.4762 },
- { 71.4286, 90.4762 },
- { 85.7143, 95.2381 },
- { 95.2381, 100 },
-};
-
-static const CoordRec monoChar37_stroke2[] = {
- { 76.1905, 33.3333 },
- { 66.6667, 28.5714 },
- { 61.9048, 19.0476 },
- { 61.9048, 9.5238 },
- { 71.4286, 0 },
- { 80.9524, 0 },
- { 90.4762, 4.7619 },
- { 95.2381, 14.2857 },
- { 95.2381, 23.8095 },
- { 85.7143, 33.3333 },
- { 76.1905, 33.3333 },
-};
-
-static const StrokeRec monoChar37[] = {
- { 2, monoChar37_stroke0 },
- { 16, monoChar37_stroke1 },
- { 11, monoChar37_stroke2 },
-};
-
-/* char: 38 '&' */
-
-static const CoordRec monoChar38_stroke0[] = {
- { 100, 57.1429 },
- { 100, 61.9048 },
- { 95.2381, 66.6667 },
- { 90.4762, 66.6667 },
- { 85.7143, 61.9048 },
- { 80.9524, 52.381 },
- { 71.4286, 28.5714 },
- { 61.9048, 14.2857 },
- { 52.3809, 4.7619 },
- { 42.8571, 0 },
- { 23.8095, 0 },
- { 14.2857, 4.7619 },
- { 9.5238, 9.5238 },
- { 4.7619, 19.0476 },
- { 4.7619, 28.5714 },
- { 9.5238, 38.0952 },
- { 14.2857, 42.8571 },
- { 47.619, 61.9048 },
- { 52.3809, 66.6667 },
- { 57.1429, 76.1905 },
- { 57.1429, 85.7143 },
- { 52.3809, 95.2381 },
- { 42.8571, 100 },
- { 33.3333, 95.2381 },
- { 28.5714, 85.7143 },
- { 28.5714, 76.1905 },
- { 33.3333, 61.9048 },
- { 42.8571, 47.619 },
- { 66.6667, 14.2857 },
- { 76.1905, 4.7619 },
- { 85.7143, 0 },
- { 95.2381, 0 },
- { 100, 4.7619 },
- { 100, 9.5238 },
-};
-
-static const StrokeRec monoChar38[] = {
- { 34, monoChar38_stroke0 },
-};
-
-/* char: 39 ''' */
-
-static const CoordRec monoChar39_stroke0[] = {
- { 52.381, 100 },
- { 52.381, 66.6667 },
-};
-
-static const StrokeRec monoChar39[] = {
- { 2, monoChar39_stroke0 },
-};
-
-/* char: 40 '(' */
-
-static const CoordRec monoChar40_stroke0[] = {
- { 69.0476, 119.048 },
- { 59.5238, 109.524 },
- { 50, 95.2381 },
- { 40.4762, 76.1905 },
- { 35.7143, 52.381 },
- { 35.7143, 33.3333 },
- { 40.4762, 9.5238 },
- { 50, -9.5238 },
- { 59.5238, -23.8095 },
- { 69.0476, -33.3333 },
-};
-
-static const StrokeRec monoChar40[] = {
- { 10, monoChar40_stroke0 },
-};
-
-/* char: 41 ')' */
-
-static const CoordRec monoChar41_stroke0[] = {
- { 35.7143, 119.048 },
- { 45.2381, 109.524 },
- { 54.7619, 95.2381 },
- { 64.2857, 76.1905 },
- { 69.0476, 52.381 },
- { 69.0476, 33.3333 },
- { 64.2857, 9.5238 },
- { 54.7619, -9.5238 },
- { 45.2381, -23.8095 },
- { 35.7143, -33.3333 },
-};
-
-static const StrokeRec monoChar41[] = {
- { 10, monoChar41_stroke0 },
-};
-
-/* char: 42 '*' */
-
-static const CoordRec monoChar42_stroke0[] = {
- { 52.381, 71.4286 },
- { 52.381, 14.2857 },
-};
-
-static const CoordRec monoChar42_stroke1[] = {
- { 28.5715, 57.1429 },
- { 76.1905, 28.5714 },
-};
-
-static const CoordRec monoChar42_stroke2[] = {
- { 76.1905, 57.1429 },
- { 28.5715, 28.5714 },
-};
-
-static const StrokeRec monoChar42[] = {
- { 2, monoChar42_stroke0 },
- { 2, monoChar42_stroke1 },
- { 2, monoChar42_stroke2 },
-};
-
-/* char: 43 '+' */
-
-static const CoordRec monoChar43_stroke0[] = {
- { 52.3809, 85.7143 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar43_stroke1[] = {
- { 9.5238, 42.8571 },
- { 95.2381, 42.8571 },
-};
-
-static const StrokeRec monoChar43[] = {
- { 2, monoChar43_stroke0 },
- { 2, monoChar43_stroke1 },
-};
-
-/* char: 44 ',' */
-
-static const CoordRec monoChar44_stroke0[] = {
- { 57.1429, 4.7619 },
- { 52.381, 0 },
- { 47.6191, 4.7619 },
- { 52.381, 9.5238 },
- { 57.1429, 4.7619 },
- { 57.1429, -4.7619 },
- { 52.381, -14.2857 },
- { 47.6191, -19.0476 },
-};
-
-static const StrokeRec monoChar44[] = {
- { 8, monoChar44_stroke0 },
-};
-
-/* char: 45 '-' */
-
-static const CoordRec monoChar45_stroke0[] = {
- { 9.5238, 42.8571 },
- { 95.2381, 42.8571 },
-};
-
-static const StrokeRec monoChar45[] = {
- { 2, monoChar45_stroke0 },
-};
-
-/* char: 46 '.' */
-
-static const CoordRec monoChar46_stroke0[] = {
- { 52.381, 9.5238 },
- { 47.6191, 4.7619 },
- { 52.381, 0 },
- { 57.1429, 4.7619 },
- { 52.381, 9.5238 },
-};
-
-static const StrokeRec monoChar46[] = {
- { 5, monoChar46_stroke0 },
-};
-
-/* char: 47 '/' */
-
-static const CoordRec monoChar47_stroke0[] = {
- { 19.0476, -14.2857 },
- { 85.7143, 100 },
-};
-
-static const StrokeRec monoChar47[] = {
- { 2, monoChar47_stroke0 },
-};
-
-/* char: 48 '0' */
-
-static const CoordRec monoChar48_stroke0[] = {
- { 47.619, 100 },
- { 33.3333, 95.2381 },
- { 23.8095, 80.9524 },
- { 19.0476, 57.1429 },
- { 19.0476, 42.8571 },
- { 23.8095, 19.0476 },
- { 33.3333, 4.7619 },
- { 47.619, 0 },
- { 57.1428, 0 },
- { 71.4286, 4.7619 },
- { 80.9524, 19.0476 },
- { 85.7143, 42.8571 },
- { 85.7143, 57.1429 },
- { 80.9524, 80.9524 },
- { 71.4286, 95.2381 },
- { 57.1428, 100 },
- { 47.619, 100 },
-};
-
-static const StrokeRec monoChar48[] = {
- { 17, monoChar48_stroke0 },
-};
-
-/* char: 49 '1' */
-
-static const CoordRec monoChar49_stroke0[] = {
- { 40.4762, 80.9524 },
- { 50, 85.7143 },
- { 64.2857, 100 },
- { 64.2857, 0 },
-};
-
-static const StrokeRec monoChar49[] = {
- { 4, monoChar49_stroke0 },
-};
-
-/* char: 50 '2' */
-
-static const CoordRec monoChar50_stroke0[] = {
- { 23.8095, 76.1905 },
- { 23.8095, 80.9524 },
- { 28.5714, 90.4762 },
- { 33.3333, 95.2381 },
- { 42.8571, 100 },
- { 61.9047, 100 },
- { 71.4286, 95.2381 },
- { 76.1905, 90.4762 },
- { 80.9524, 80.9524 },
- { 80.9524, 71.4286 },
- { 76.1905, 61.9048 },
- { 66.6666, 47.619 },
- { 19.0476, 0 },
- { 85.7143, 0 },
-};
-
-static const StrokeRec monoChar50[] = {
- { 14, monoChar50_stroke0 },
-};
-
-/* char: 51 '3' */
-
-static const CoordRec monoChar51_stroke0[] = {
- { 28.5714, 100 },
- { 80.9524, 100 },
- { 52.3809, 61.9048 },
- { 66.6666, 61.9048 },
- { 76.1905, 57.1429 },
- { 80.9524, 52.381 },
- { 85.7143, 38.0952 },
- { 85.7143, 28.5714 },
- { 80.9524, 14.2857 },
- { 71.4286, 4.7619 },
- { 57.1428, 0 },
- { 42.8571, 0 },
- { 28.5714, 4.7619 },
- { 23.8095, 9.5238 },
- { 19.0476, 19.0476 },
-};
-
-static const StrokeRec monoChar51[] = {
- { 15, monoChar51_stroke0 },
-};
-
-/* char: 52 '4' */
-
-static const CoordRec monoChar52_stroke0[] = {
- { 64.2857, 100 },
- { 16.6667, 33.3333 },
- { 88.0952, 33.3333 },
-};
-
-static const CoordRec monoChar52_stroke1[] = {
- { 64.2857, 100 },
- { 64.2857, 0 },
-};
-
-static const StrokeRec monoChar52[] = {
- { 3, monoChar52_stroke0 },
- { 2, monoChar52_stroke1 },
-};
-
-/* char: 53 '5' */
-
-static const CoordRec monoChar53_stroke0[] = {
- { 76.1905, 100 },
- { 28.5714, 100 },
- { 23.8095, 57.1429 },
- { 28.5714, 61.9048 },
- { 42.8571, 66.6667 },
- { 57.1428, 66.6667 },
- { 71.4286, 61.9048 },
- { 80.9524, 52.381 },
- { 85.7143, 38.0952 },
- { 85.7143, 28.5714 },
- { 80.9524, 14.2857 },
- { 71.4286, 4.7619 },
- { 57.1428, 0 },
- { 42.8571, 0 },
- { 28.5714, 4.7619 },
- { 23.8095, 9.5238 },
- { 19.0476, 19.0476 },
-};
-
-static const StrokeRec monoChar53[] = {
- { 17, monoChar53_stroke0 },
-};
-
-/* char: 54 '6' */
-
-static const CoordRec monoChar54_stroke0[] = {
- { 78.5714, 85.7143 },
- { 73.8096, 95.2381 },
- { 59.5238, 100 },
- { 50, 100 },
- { 35.7143, 95.2381 },
- { 26.1905, 80.9524 },
- { 21.4286, 57.1429 },
- { 21.4286, 33.3333 },
- { 26.1905, 14.2857 },
- { 35.7143, 4.7619 },
- { 50, 0 },
- { 54.7619, 0 },
- { 69.0476, 4.7619 },
- { 78.5714, 14.2857 },
- { 83.3334, 28.5714 },
- { 83.3334, 33.3333 },
- { 78.5714, 47.619 },
- { 69.0476, 57.1429 },
- { 54.7619, 61.9048 },
- { 50, 61.9048 },
- { 35.7143, 57.1429 },
- { 26.1905, 47.619 },
- { 21.4286, 33.3333 },
-};
-
-static const StrokeRec monoChar54[] = {
- { 23, monoChar54_stroke0 },
-};
-
-/* char: 55 '7' */
-
-static const CoordRec monoChar55_stroke0[] = {
- { 85.7143, 100 },
- { 38.0952, 0 },
-};
-
-static const CoordRec monoChar55_stroke1[] = {
- { 19.0476, 100 },
- { 85.7143, 100 },
-};
-
-static const StrokeRec monoChar55[] = {
- { 2, monoChar55_stroke0 },
- { 2, monoChar55_stroke1 },
-};
-
-/* char: 56 '8' */
-
-static const CoordRec monoChar56_stroke0[] = {
- { 42.8571, 100 },
- { 28.5714, 95.2381 },
- { 23.8095, 85.7143 },
- { 23.8095, 76.1905 },
- { 28.5714, 66.6667 },
- { 38.0952, 61.9048 },
- { 57.1428, 57.1429 },
- { 71.4286, 52.381 },
- { 80.9524, 42.8571 },
- { 85.7143, 33.3333 },
- { 85.7143, 19.0476 },
- { 80.9524, 9.5238 },
- { 76.1905, 4.7619 },
- { 61.9047, 0 },
- { 42.8571, 0 },
- { 28.5714, 4.7619 },
- { 23.8095, 9.5238 },
- { 19.0476, 19.0476 },
- { 19.0476, 33.3333 },
- { 23.8095, 42.8571 },
- { 33.3333, 52.381 },
- { 47.619, 57.1429 },
- { 66.6666, 61.9048 },
- { 76.1905, 66.6667 },
- { 80.9524, 76.1905 },
- { 80.9524, 85.7143 },
- { 76.1905, 95.2381 },
- { 61.9047, 100 },
- { 42.8571, 100 },
-};
-
-static const StrokeRec monoChar56[] = {
- { 29, monoChar56_stroke0 },
-};
-
-/* char: 57 '9' */
-
-static const CoordRec monoChar57_stroke0[] = {
- { 83.3334, 66.6667 },
- { 78.5714, 52.381 },
- { 69.0476, 42.8571 },
- { 54.7619, 38.0952 },
- { 50, 38.0952 },
- { 35.7143, 42.8571 },
- { 26.1905, 52.381 },
- { 21.4286, 66.6667 },
- { 21.4286, 71.4286 },
- { 26.1905, 85.7143 },
- { 35.7143, 95.2381 },
- { 50, 100 },
- { 54.7619, 100 },
- { 69.0476, 95.2381 },
- { 78.5714, 85.7143 },
- { 83.3334, 66.6667 },
- { 83.3334, 42.8571 },
- { 78.5714, 19.0476 },
- { 69.0476, 4.7619 },
- { 54.7619, 0 },
- { 45.2381, 0 },
- { 30.9524, 4.7619 },
- { 26.1905, 14.2857 },
-};
-
-static const StrokeRec monoChar57[] = {
- { 23, monoChar57_stroke0 },
-};
-
-/* char: 58 ':' */
-
-static const CoordRec monoChar58_stroke0[] = {
- { 52.381, 66.6667 },
- { 47.6191, 61.9048 },
- { 52.381, 57.1429 },
- { 57.1429, 61.9048 },
- { 52.381, 66.6667 },
-};
-
-static const CoordRec monoChar58_stroke1[] = {
- { 52.381, 9.5238 },
- { 47.6191, 4.7619 },
- { 52.381, 0 },
- { 57.1429, 4.7619 },
- { 52.381, 9.5238 },
-};
-
-static const StrokeRec monoChar58[] = {
- { 5, monoChar58_stroke0 },
- { 5, monoChar58_stroke1 },
-};
-
-/* char: 59 ';' */
-
-static const CoordRec monoChar59_stroke0[] = {
- { 52.381, 66.6667 },
- { 47.6191, 61.9048 },
- { 52.381, 57.1429 },
- { 57.1429, 61.9048 },
- { 52.381, 66.6667 },
-};
-
-static const CoordRec monoChar59_stroke1[] = {
- { 57.1429, 4.7619 },
- { 52.381, 0 },
- { 47.6191, 4.7619 },
- { 52.381, 9.5238 },
- { 57.1429, 4.7619 },
- { 57.1429, -4.7619 },
- { 52.381, -14.2857 },
- { 47.6191, -19.0476 },
-};
-
-static const StrokeRec monoChar59[] = {
- { 5, monoChar59_stroke0 },
- { 8, monoChar59_stroke1 },
-};
-
-/* char: 60 '<' */
-
-static const CoordRec monoChar60_stroke0[] = {
- { 90.4762, 85.7143 },
- { 14.2857, 42.8571 },
- { 90.4762, 0 },
-};
-
-static const StrokeRec monoChar60[] = {
- { 3, monoChar60_stroke0 },
-};
-
-/* char: 61 '=' */
-
-static const CoordRec monoChar61_stroke0[] = {
- { 9.5238, 57.1429 },
- { 95.2381, 57.1429 },
-};
-
-static const CoordRec monoChar61_stroke1[] = {
- { 9.5238, 28.5714 },
- { 95.2381, 28.5714 },
-};
-
-static const StrokeRec monoChar61[] = {
- { 2, monoChar61_stroke0 },
- { 2, monoChar61_stroke1 },
-};
-
-/* char: 62 '>' */
-
-static const CoordRec monoChar62_stroke0[] = {
- { 14.2857, 85.7143 },
- { 90.4762, 42.8571 },
- { 14.2857, 0 },
-};
-
-static const StrokeRec monoChar62[] = {
- { 3, monoChar62_stroke0 },
-};
-
-/* char: 63 '?' */
-
-static const CoordRec monoChar63_stroke0[] = {
- { 23.8095, 76.1905 },
- { 23.8095, 80.9524 },
- { 28.5714, 90.4762 },
- { 33.3333, 95.2381 },
- { 42.8571, 100 },
- { 61.9047, 100 },
- { 71.4285, 95.2381 },
- { 76.1905, 90.4762 },
- { 80.9524, 80.9524 },
- { 80.9524, 71.4286 },
- { 76.1905, 61.9048 },
- { 71.4285, 57.1429 },
- { 52.3809, 47.619 },
- { 52.3809, 33.3333 },
-};
-
-static const CoordRec monoChar63_stroke1[] = {
- { 52.3809, 9.5238 },
- { 47.619, 4.7619 },
- { 52.3809, 0 },
- { 57.1428, 4.7619 },
- { 52.3809, 9.5238 },
-};
-
-static const StrokeRec monoChar63[] = {
- { 14, monoChar63_stroke0 },
- { 5, monoChar63_stroke1 },
-};
-
-/* char: 64 '@' */
-
-static const CoordRec monoChar64_stroke0[] = {
- { 64.2857, 52.381 },
- { 54.7619, 57.1429 },
- { 45.2381, 57.1429 },
- { 40.4762, 47.619 },
- { 40.4762, 42.8571 },
- { 45.2381, 33.3333 },
- { 54.7619, 33.3333 },
- { 64.2857, 38.0952 },
-};
-
-static const CoordRec monoChar64_stroke1[] = {
- { 64.2857, 57.1429 },
- { 64.2857, 38.0952 },
- { 69.0476, 33.3333 },
- { 78.5714, 33.3333 },
- { 83.3334, 42.8571 },
- { 83.3334, 47.619 },
- { 78.5714, 61.9048 },
- { 69.0476, 71.4286 },
- { 54.7619, 76.1905 },
- { 50, 76.1905 },
- { 35.7143, 71.4286 },
- { 26.1905, 61.9048 },
- { 21.4286, 47.619 },
- { 21.4286, 42.8571 },
- { 26.1905, 28.5714 },
- { 35.7143, 19.0476 },
- { 50, 14.2857 },
- { 54.7619, 14.2857 },
- { 69.0476, 19.0476 },
-};
-
-static const StrokeRec monoChar64[] = {
- { 8, monoChar64_stroke0 },
- { 19, monoChar64_stroke1 },
-};
-
-/* char: 65 'A' */
-
-static const CoordRec monoChar65_stroke0[] = {
- { 52.3809, 100 },
- { 14.2857, 0 },
-};
-
-static const CoordRec monoChar65_stroke1[] = {
- { 52.3809, 100 },
- { 90.4762, 0 },
-};
-
-static const CoordRec monoChar65_stroke2[] = {
- { 28.5714, 33.3333 },
- { 76.1905, 33.3333 },
-};
-
-static const StrokeRec monoChar65[] = {
- { 2, monoChar65_stroke0 },
- { 2, monoChar65_stroke1 },
- { 2, monoChar65_stroke2 },
-};
-
-/* char: 66 'B' */
-
-static const CoordRec monoChar66_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar66_stroke1[] = {
- { 19.0476, 100 },
- { 61.9047, 100 },
- { 76.1905, 95.2381 },
- { 80.9524, 90.4762 },
- { 85.7143, 80.9524 },
- { 85.7143, 71.4286 },
- { 80.9524, 61.9048 },
- { 76.1905, 57.1429 },
- { 61.9047, 52.381 },
-};
-
-static const CoordRec monoChar66_stroke2[] = {
- { 19.0476, 52.381 },
- { 61.9047, 52.381 },
- { 76.1905, 47.619 },
- { 80.9524, 42.8571 },
- { 85.7143, 33.3333 },
- { 85.7143, 19.0476 },
- { 80.9524, 9.5238 },
- { 76.1905, 4.7619 },
- { 61.9047, 0 },
- { 19.0476, 0 },
-};
-
-static const StrokeRec monoChar66[] = {
- { 2, monoChar66_stroke0 },
- { 9, monoChar66_stroke1 },
- { 10, monoChar66_stroke2 },
-};
-
-/* char: 67 'C' */
-
-static const CoordRec monoChar67_stroke0[] = {
- { 88.0952, 76.1905 },
- { 83.3334, 85.7143 },
- { 73.8096, 95.2381 },
- { 64.2857, 100 },
- { 45.2381, 100 },
- { 35.7143, 95.2381 },
- { 26.1905, 85.7143 },
- { 21.4286, 76.1905 },
- { 16.6667, 61.9048 },
- { 16.6667, 38.0952 },
- { 21.4286, 23.8095 },
- { 26.1905, 14.2857 },
- { 35.7143, 4.7619 },
- { 45.2381, 0 },
- { 64.2857, 0 },
- { 73.8096, 4.7619 },
- { 83.3334, 14.2857 },
- { 88.0952, 23.8095 },
-};
-
-static const StrokeRec monoChar67[] = {
- { 18, monoChar67_stroke0 },
-};
-
-/* char: 68 'D' */
-
-static const CoordRec monoChar68_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar68_stroke1[] = {
- { 19.0476, 100 },
- { 52.3809, 100 },
- { 66.6666, 95.2381 },
- { 76.1905, 85.7143 },
- { 80.9524, 76.1905 },
- { 85.7143, 61.9048 },
- { 85.7143, 38.0952 },
- { 80.9524, 23.8095 },
- { 76.1905, 14.2857 },
- { 66.6666, 4.7619 },
- { 52.3809, 0 },
- { 19.0476, 0 },
-};
-
-static const StrokeRec monoChar68[] = {
- { 2, monoChar68_stroke0 },
- { 12, monoChar68_stroke1 },
-};
-
-/* char: 69 'E' */
-
-static const CoordRec monoChar69_stroke0[] = {
- { 21.4286, 100 },
- { 21.4286, 0 },
-};
-
-static const CoordRec monoChar69_stroke1[] = {
- { 21.4286, 100 },
- { 83.3334, 100 },
-};
-
-static const CoordRec monoChar69_stroke2[] = {
- { 21.4286, 52.381 },
- { 59.5238, 52.381 },
-};
-
-static const CoordRec monoChar69_stroke3[] = {
- { 21.4286, 0 },
- { 83.3334, 0 },
-};
-
-static const StrokeRec monoChar69[] = {
- { 2, monoChar69_stroke0 },
- { 2, monoChar69_stroke1 },
- { 2, monoChar69_stroke2 },
- { 2, monoChar69_stroke3 },
-};
-
-/* char: 70 'F' */
-
-static const CoordRec monoChar70_stroke0[] = {
- { 21.4286, 100 },
- { 21.4286, 0 },
-};
-
-static const CoordRec monoChar70_stroke1[] = {
- { 21.4286, 100 },
- { 83.3334, 100 },
-};
-
-static const CoordRec monoChar70_stroke2[] = {
- { 21.4286, 52.381 },
- { 59.5238, 52.381 },
-};
-
-static const StrokeRec monoChar70[] = {
- { 2, monoChar70_stroke0 },
- { 2, monoChar70_stroke1 },
- { 2, monoChar70_stroke2 },
-};
-
-/* char: 71 'G' */
-
-static const CoordRec monoChar71_stroke0[] = {
- { 88.0952, 76.1905 },
- { 83.3334, 85.7143 },
- { 73.8096, 95.2381 },
- { 64.2857, 100 },
- { 45.2381, 100 },
- { 35.7143, 95.2381 },
- { 26.1905, 85.7143 },
- { 21.4286, 76.1905 },
- { 16.6667, 61.9048 },
- { 16.6667, 38.0952 },
- { 21.4286, 23.8095 },
- { 26.1905, 14.2857 },
- { 35.7143, 4.7619 },
- { 45.2381, 0 },
- { 64.2857, 0 },
- { 73.8096, 4.7619 },
- { 83.3334, 14.2857 },
- { 88.0952, 23.8095 },
- { 88.0952, 38.0952 },
-};
-
-static const CoordRec monoChar71_stroke1[] = {
- { 64.2857, 38.0952 },
- { 88.0952, 38.0952 },
-};
-
-static const StrokeRec monoChar71[] = {
- { 19, monoChar71_stroke0 },
- { 2, monoChar71_stroke1 },
-};
-
-/* char: 72 'H' */
-
-static const CoordRec monoChar72_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar72_stroke1[] = {
- { 85.7143, 100 },
- { 85.7143, 0 },
-};
-
-static const CoordRec monoChar72_stroke2[] = {
- { 19.0476, 52.381 },
- { 85.7143, 52.381 },
-};
-
-static const StrokeRec monoChar72[] = {
- { 2, monoChar72_stroke0 },
- { 2, monoChar72_stroke1 },
- { 2, monoChar72_stroke2 },
-};
-
-/* char: 73 'I' */
-
-static const CoordRec monoChar73_stroke0[] = {
- { 52.381, 100 },
- { 52.381, 0 },
-};
-
-static const StrokeRec monoChar73[] = {
- { 2, monoChar73_stroke0 },
-};
-
-/* char: 74 'J' */
-
-static const CoordRec monoChar74_stroke0[] = {
- { 76.1905, 100 },
- { 76.1905, 23.8095 },
- { 71.4286, 9.5238 },
- { 66.6667, 4.7619 },
- { 57.1429, 0 },
- { 47.6191, 0 },
- { 38.0953, 4.7619 },
- { 33.3334, 9.5238 },
- { 28.5715, 23.8095 },
- { 28.5715, 33.3333 },
-};
-
-static const StrokeRec monoChar74[] = {
- { 10, monoChar74_stroke0 },
-};
-
-/* char: 75 'K' */
-
-static const CoordRec monoChar75_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar75_stroke1[] = {
- { 85.7143, 100 },
- { 19.0476, 33.3333 },
-};
-
-static const CoordRec monoChar75_stroke2[] = {
- { 42.8571, 57.1429 },
- { 85.7143, 0 },
-};
-
-static const StrokeRec monoChar75[] = {
- { 2, monoChar75_stroke0 },
- { 2, monoChar75_stroke1 },
- { 2, monoChar75_stroke2 },
-};
-
-/* char: 76 'L' */
-
-static const CoordRec monoChar76_stroke0[] = {
- { 23.8095, 100 },
- { 23.8095, 0 },
-};
-
-static const CoordRec monoChar76_stroke1[] = {
- { 23.8095, 0 },
- { 80.9524, 0 },
-};
-
-static const StrokeRec monoChar76[] = {
- { 2, monoChar76_stroke0 },
- { 2, monoChar76_stroke1 },
-};
-
-/* char: 77 'M' */
-
-static const CoordRec monoChar77_stroke0[] = {
- { 14.2857, 100 },
- { 14.2857, 0 },
-};
-
-static const CoordRec monoChar77_stroke1[] = {
- { 14.2857, 100 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar77_stroke2[] = {
- { 90.4762, 100 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar77_stroke3[] = {
- { 90.4762, 100 },
- { 90.4762, 0 },
-};
-
-static const StrokeRec monoChar77[] = {
- { 2, monoChar77_stroke0 },
- { 2, monoChar77_stroke1 },
- { 2, monoChar77_stroke2 },
- { 2, monoChar77_stroke3 },
-};
-
-/* char: 78 'N' */
-
-static const CoordRec monoChar78_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar78_stroke1[] = {
- { 19.0476, 100 },
- { 85.7143, 0 },
-};
-
-static const CoordRec monoChar78_stroke2[] = {
- { 85.7143, 100 },
- { 85.7143, 0 },
-};
-
-static const StrokeRec monoChar78[] = {
- { 2, monoChar78_stroke0 },
- { 2, monoChar78_stroke1 },
- { 2, monoChar78_stroke2 },
-};
-
-/* char: 79 'O' */
-
-static const CoordRec monoChar79_stroke0[] = {
- { 42.8571, 100 },
- { 33.3333, 95.2381 },
- { 23.8095, 85.7143 },
- { 19.0476, 76.1905 },
- { 14.2857, 61.9048 },
- { 14.2857, 38.0952 },
- { 19.0476, 23.8095 },
- { 23.8095, 14.2857 },
- { 33.3333, 4.7619 },
- { 42.8571, 0 },
- { 61.9047, 0 },
- { 71.4286, 4.7619 },
- { 80.9524, 14.2857 },
- { 85.7143, 23.8095 },
- { 90.4762, 38.0952 },
- { 90.4762, 61.9048 },
- { 85.7143, 76.1905 },
- { 80.9524, 85.7143 },
- { 71.4286, 95.2381 },
- { 61.9047, 100 },
- { 42.8571, 100 },
-};
-
-static const StrokeRec monoChar79[] = {
- { 21, monoChar79_stroke0 },
-};
-
-/* char: 80 'P' */
-
-static const CoordRec monoChar80_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar80_stroke1[] = {
- { 19.0476, 100 },
- { 61.9047, 100 },
- { 76.1905, 95.2381 },
- { 80.9524, 90.4762 },
- { 85.7143, 80.9524 },
- { 85.7143, 66.6667 },
- { 80.9524, 57.1429 },
- { 76.1905, 52.381 },
- { 61.9047, 47.619 },
- { 19.0476, 47.619 },
-};
-
-static const StrokeRec monoChar80[] = {
- { 2, monoChar80_stroke0 },
- { 10, monoChar80_stroke1 },
-};
-
-/* char: 81 'Q' */
-
-static const CoordRec monoChar81_stroke0[] = {
- { 42.8571, 100 },
- { 33.3333, 95.2381 },
- { 23.8095, 85.7143 },
- { 19.0476, 76.1905 },
- { 14.2857, 61.9048 },
- { 14.2857, 38.0952 },
- { 19.0476, 23.8095 },
- { 23.8095, 14.2857 },
- { 33.3333, 4.7619 },
- { 42.8571, 0 },
- { 61.9047, 0 },
- { 71.4286, 4.7619 },
- { 80.9524, 14.2857 },
- { 85.7143, 23.8095 },
- { 90.4762, 38.0952 },
- { 90.4762, 61.9048 },
- { 85.7143, 76.1905 },
- { 80.9524, 85.7143 },
- { 71.4286, 95.2381 },
- { 61.9047, 100 },
- { 42.8571, 100 },
-};
-
-static const CoordRec monoChar81_stroke1[] = {
- { 57.1428, 19.0476 },
- { 85.7143, -9.5238 },
-};
-
-static const StrokeRec monoChar81[] = {
- { 21, monoChar81_stroke0 },
- { 2, monoChar81_stroke1 },
-};
-
-/* char: 82 'R' */
-
-static const CoordRec monoChar82_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar82_stroke1[] = {
- { 19.0476, 100 },
- { 61.9047, 100 },
- { 76.1905, 95.2381 },
- { 80.9524, 90.4762 },
- { 85.7143, 80.9524 },
- { 85.7143, 71.4286 },
- { 80.9524, 61.9048 },
- { 76.1905, 57.1429 },
- { 61.9047, 52.381 },
- { 19.0476, 52.381 },
-};
-
-static const CoordRec monoChar82_stroke2[] = {
- { 52.3809, 52.381 },
- { 85.7143, 0 },
-};
-
-static const StrokeRec monoChar82[] = {
- { 2, monoChar82_stroke0 },
- { 10, monoChar82_stroke1 },
- { 2, monoChar82_stroke2 },
-};
-
-/* char: 83 'S' */
-
-static const CoordRec monoChar83_stroke0[] = {
- { 85.7143, 85.7143 },
- { 76.1905, 95.2381 },
- { 61.9047, 100 },
- { 42.8571, 100 },
- { 28.5714, 95.2381 },
- { 19.0476, 85.7143 },
- { 19.0476, 76.1905 },
- { 23.8095, 66.6667 },
- { 28.5714, 61.9048 },
- { 38.0952, 57.1429 },
- { 66.6666, 47.619 },
- { 76.1905, 42.8571 },
- { 80.9524, 38.0952 },
- { 85.7143, 28.5714 },
- { 85.7143, 14.2857 },
- { 76.1905, 4.7619 },
- { 61.9047, 0 },
- { 42.8571, 0 },
- { 28.5714, 4.7619 },
- { 19.0476, 14.2857 },
-};
-
-static const StrokeRec monoChar83[] = {
- { 20, monoChar83_stroke0 },
-};
-
-/* char: 84 'T' */
-
-static const CoordRec monoChar84_stroke0[] = {
- { 52.3809, 100 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar84_stroke1[] = {
- { 19.0476, 100 },
- { 85.7143, 100 },
-};
-
-static const StrokeRec monoChar84[] = {
- { 2, monoChar84_stroke0 },
- { 2, monoChar84_stroke1 },
-};
-
-/* char: 85 'U' */
-
-static const CoordRec monoChar85_stroke0[] = {
- { 19.0476, 100 },
- { 19.0476, 28.5714 },
- { 23.8095, 14.2857 },
- { 33.3333, 4.7619 },
- { 47.619, 0 },
- { 57.1428, 0 },
- { 71.4286, 4.7619 },
- { 80.9524, 14.2857 },
- { 85.7143, 28.5714 },
- { 85.7143, 100 },
-};
-
-static const StrokeRec monoChar85[] = {
- { 10, monoChar85_stroke0 },
-};
-
-/* char: 86 'V' */
-
-static const CoordRec monoChar86_stroke0[] = {
- { 14.2857, 100 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar86_stroke1[] = {
- { 90.4762, 100 },
- { 52.3809, 0 },
-};
-
-static const StrokeRec monoChar86[] = {
- { 2, monoChar86_stroke0 },
- { 2, monoChar86_stroke1 },
-};
-
-/* char: 87 'W' */
-
-static const CoordRec monoChar87_stroke0[] = {
- { 4.7619, 100 },
- { 28.5714, 0 },
-};
-
-static const CoordRec monoChar87_stroke1[] = {
- { 52.3809, 100 },
- { 28.5714, 0 },
-};
-
-static const CoordRec monoChar87_stroke2[] = {
- { 52.3809, 100 },
- { 76.1905, 0 },
-};
-
-static const CoordRec monoChar87_stroke3[] = {
- { 100, 100 },
- { 76.1905, 0 },
-};
-
-static const StrokeRec monoChar87[] = {
- { 2, monoChar87_stroke0 },
- { 2, monoChar87_stroke1 },
- { 2, monoChar87_stroke2 },
- { 2, monoChar87_stroke3 },
-};
-
-/* char: 88 'X' */
-
-static const CoordRec monoChar88_stroke0[] = {
- { 19.0476, 100 },
- { 85.7143, 0 },
-};
-
-static const CoordRec monoChar88_stroke1[] = {
- { 85.7143, 100 },
- { 19.0476, 0 },
-};
-
-static const StrokeRec monoChar88[] = {
- { 2, monoChar88_stroke0 },
- { 2, monoChar88_stroke1 },
-};
-
-/* char: 89 'Y' */
-
-static const CoordRec monoChar89_stroke0[] = {
- { 14.2857, 100 },
- { 52.3809, 52.381 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar89_stroke1[] = {
- { 90.4762, 100 },
- { 52.3809, 52.381 },
-};
-
-static const StrokeRec monoChar89[] = {
- { 3, monoChar89_stroke0 },
- { 2, monoChar89_stroke1 },
-};
-
-/* char: 90 'Z' */
-
-static const CoordRec monoChar90_stroke0[] = {
- { 85.7143, 100 },
- { 19.0476, 0 },
-};
-
-static const CoordRec monoChar90_stroke1[] = {
- { 19.0476, 100 },
- { 85.7143, 100 },
-};
-
-static const CoordRec monoChar90_stroke2[] = {
- { 19.0476, 0 },
- { 85.7143, 0 },
-};
-
-static const StrokeRec monoChar90[] = {
- { 2, monoChar90_stroke0 },
- { 2, monoChar90_stroke1 },
- { 2, monoChar90_stroke2 },
-};
-
-/* char: 91 '[' */
-
-static const CoordRec monoChar91_stroke0[] = {
- { 35.7143, 119.048 },
- { 35.7143, -33.3333 },
-};
-
-static const CoordRec monoChar91_stroke1[] = {
- { 40.4762, 119.048 },
- { 40.4762, -33.3333 },
-};
-
-static const CoordRec monoChar91_stroke2[] = {
- { 35.7143, 119.048 },
- { 69.0476, 119.048 },
-};
-
-static const CoordRec monoChar91_stroke3[] = {
- { 35.7143, -33.3333 },
- { 69.0476, -33.3333 },
-};
-
-static const StrokeRec monoChar91[] = {
- { 2, monoChar91_stroke0 },
- { 2, monoChar91_stroke1 },
- { 2, monoChar91_stroke2 },
- { 2, monoChar91_stroke3 },
-};
-
-/* char: 92 '\' */
-
-static const CoordRec monoChar92_stroke0[] = {
- { 19.0476, 100 },
- { 85.7143, -14.2857 },
-};
-
-static const StrokeRec monoChar92[] = {
- { 2, monoChar92_stroke0 },
-};
-
-/* char: 93 ']' */
-
-static const CoordRec monoChar93_stroke0[] = {
- { 64.2857, 119.048 },
- { 64.2857, -33.3333 },
-};
-
-static const CoordRec monoChar93_stroke1[] = {
- { 69.0476, 119.048 },
- { 69.0476, -33.3333 },
-};
-
-static const CoordRec monoChar93_stroke2[] = {
- { 35.7143, 119.048 },
- { 69.0476, 119.048 },
-};
-
-static const CoordRec monoChar93_stroke3[] = {
- { 35.7143, -33.3333 },
- { 69.0476, -33.3333 },
-};
-
-static const StrokeRec monoChar93[] = {
- { 2, monoChar93_stroke0 },
- { 2, monoChar93_stroke1 },
- { 2, monoChar93_stroke2 },
- { 2, monoChar93_stroke3 },
-};
-
-/* char: 94 '^' */
-
-static const CoordRec monoChar94_stroke0[] = {
- { 52.3809, 109.524 },
- { 14.2857, 42.8571 },
-};
-
-static const CoordRec monoChar94_stroke1[] = {
- { 52.3809, 109.524 },
- { 90.4762, 42.8571 },
-};
-
-static const StrokeRec monoChar94[] = {
- { 2, monoChar94_stroke0 },
- { 2, monoChar94_stroke1 },
-};
-
-/* char: 95 '_' */
-
-static const CoordRec monoChar95_stroke0[] = {
- { 0, -33.3333 },
- { 104.762, -33.3333 },
- { 104.762, -28.5714 },
- { 0, -28.5714 },
- { 0, -33.3333 },
-};
-
-static const StrokeRec monoChar95[] = {
- { 5, monoChar95_stroke0 },
-};
-
-/* char: 96 '`' */
-
-static const CoordRec monoChar96_stroke0[] = {
- { 42.8572, 100 },
- { 66.6667, 71.4286 },
-};
-
-static const CoordRec monoChar96_stroke1[] = {
- { 42.8572, 100 },
- { 38.0953, 95.2381 },
- { 66.6667, 71.4286 },
-};
-
-static const StrokeRec monoChar96[] = {
- { 2, monoChar96_stroke0 },
- { 3, monoChar96_stroke1 },
-};
-
-/* char: 97 'a' */
-
-static const CoordRec monoChar97_stroke0[] = {
- { 80.9524, 66.6667 },
- { 80.9524, 0 },
-};
-
-static const CoordRec monoChar97_stroke1[] = {
- { 80.9524, 52.381 },
- { 71.4285, 61.9048 },
- { 61.9047, 66.6667 },
- { 47.619, 66.6667 },
- { 38.0952, 61.9048 },
- { 28.5714, 52.381 },
- { 23.8095, 38.0952 },
- { 23.8095, 28.5714 },
- { 28.5714, 14.2857 },
- { 38.0952, 4.7619 },
- { 47.619, 0 },
- { 61.9047, 0 },
- { 71.4285, 4.7619 },
- { 80.9524, 14.2857 },
-};
-
-static const StrokeRec monoChar97[] = {
- { 2, monoChar97_stroke0 },
- { 14, monoChar97_stroke1 },
-};
-
-/* char: 98 'b' */
-
-static const CoordRec monoChar98_stroke0[] = {
- { 23.8095, 100 },
- { 23.8095, 0 },
-};
-
-static const CoordRec monoChar98_stroke1[] = {
- { 23.8095, 52.381 },
- { 33.3333, 61.9048 },
- { 42.8571, 66.6667 },
- { 57.1428, 66.6667 },
- { 66.6666, 61.9048 },
- { 76.1905, 52.381 },
- { 80.9524, 38.0952 },
- { 80.9524, 28.5714 },
- { 76.1905, 14.2857 },
- { 66.6666, 4.7619 },
- { 57.1428, 0 },
- { 42.8571, 0 },
- { 33.3333, 4.7619 },
- { 23.8095, 14.2857 },
-};
-
-static const StrokeRec monoChar98[] = {
- { 2, monoChar98_stroke0 },
- { 14, monoChar98_stroke1 },
-};
-
-/* char: 99 'c' */
-
-static const CoordRec monoChar99_stroke0[] = {
- { 80.9524, 52.381 },
- { 71.4285, 61.9048 },
- { 61.9047, 66.6667 },
- { 47.619, 66.6667 },
- { 38.0952, 61.9048 },
- { 28.5714, 52.381 },
- { 23.8095, 38.0952 },
- { 23.8095, 28.5714 },
- { 28.5714, 14.2857 },
- { 38.0952, 4.7619 },
- { 47.619, 0 },
- { 61.9047, 0 },
- { 71.4285, 4.7619 },
- { 80.9524, 14.2857 },
-};
-
-static const StrokeRec monoChar99[] = {
- { 14, monoChar99_stroke0 },
-};
-
-/* char: 100 'd' */
-
-static const CoordRec monoChar100_stroke0[] = {
- { 80.9524, 100 },
- { 80.9524, 0 },
-};
-
-static const CoordRec monoChar100_stroke1[] = {
- { 80.9524, 52.381 },
- { 71.4285, 61.9048 },
- { 61.9047, 66.6667 },
- { 47.619, 66.6667 },
- { 38.0952, 61.9048 },
- { 28.5714, 52.381 },
- { 23.8095, 38.0952 },
- { 23.8095, 28.5714 },
- { 28.5714, 14.2857 },
- { 38.0952, 4.7619 },
- { 47.619, 0 },
- { 61.9047, 0 },
- { 71.4285, 4.7619 },
- { 80.9524, 14.2857 },
-};
-
-static const StrokeRec monoChar100[] = {
- { 2, monoChar100_stroke0 },
- { 14, monoChar100_stroke1 },
-};
-
-/* char: 101 'e' */
-
-static const CoordRec monoChar101_stroke0[] = {
- { 23.8095, 38.0952 },
- { 80.9524, 38.0952 },
- { 80.9524, 47.619 },
- { 76.1905, 57.1429 },
- { 71.4285, 61.9048 },
- { 61.9047, 66.6667 },
- { 47.619, 66.6667 },
- { 38.0952, 61.9048 },
- { 28.5714, 52.381 },
- { 23.8095, 38.0952 },
- { 23.8095, 28.5714 },
- { 28.5714, 14.2857 },
- { 38.0952, 4.7619 },
- { 47.619, 0 },
- { 61.9047, 0 },
- { 71.4285, 4.7619 },
- { 80.9524, 14.2857 },
-};
-
-static const StrokeRec monoChar101[] = {
- { 17, monoChar101_stroke0 },
-};
-
-/* char: 102 'f' */
-
-static const CoordRec monoChar102_stroke0[] = {
- { 71.4286, 100 },
- { 61.9048, 100 },
- { 52.381, 95.2381 },
- { 47.6191, 80.9524 },
- { 47.6191, 0 },
-};
-
-static const CoordRec monoChar102_stroke1[] = {
- { 33.3334, 66.6667 },
- { 66.6667, 66.6667 },
-};
-
-static const StrokeRec monoChar102[] = {
- { 5, monoChar102_stroke0 },
- { 2, monoChar102_stroke1 },
-};
-
-/* char: 103 'g' */
-
-static const CoordRec monoChar103_stroke0[] = {
- { 80.9524, 66.6667 },
- { 80.9524, -9.5238 },
- { 76.1905, -23.8095 },
- { 71.4285, -28.5714 },
- { 61.9047, -33.3333 },
- { 47.619, -33.3333 },
- { 38.0952, -28.5714 },
-};
-
-static const CoordRec monoChar103_stroke1[] = {
- { 80.9524, 52.381 },
- { 71.4285, 61.9048 },
- { 61.9047, 66.6667 },
- { 47.619, 66.6667 },
- { 38.0952, 61.9048 },
- { 28.5714, 52.381 },
- { 23.8095, 38.0952 },
- { 23.8095, 28.5714 },
- { 28.5714, 14.2857 },
- { 38.0952, 4.7619 },
- { 47.619, 0 },
- { 61.9047, 0 },
- { 71.4285, 4.7619 },
- { 80.9524, 14.2857 },
-};
-
-static const StrokeRec monoChar103[] = {
- { 7, monoChar103_stroke0 },
- { 14, monoChar103_stroke1 },
-};
-
-/* char: 104 'h' */
-
-static const CoordRec monoChar104_stroke0[] = {
- { 26.1905, 100 },
- { 26.1905, 0 },
-};
-
-static const CoordRec monoChar104_stroke1[] = {
- { 26.1905, 47.619 },
- { 40.4762, 61.9048 },
- { 50, 66.6667 },
- { 64.2857, 66.6667 },
- { 73.8095, 61.9048 },
- { 78.5715, 47.619 },
- { 78.5715, 0 },
-};
-
-static const StrokeRec monoChar104[] = {
- { 2, monoChar104_stroke0 },
- { 7, monoChar104_stroke1 },
-};
-
-/* char: 105 'i' */
-
-static const CoordRec monoChar105_stroke0[] = {
- { 47.6191, 100 },
- { 52.381, 95.2381 },
- { 57.1429, 100 },
- { 52.381, 104.762 },
- { 47.6191, 100 },
-};
-
-static const CoordRec monoChar105_stroke1[] = {
- { 52.381, 66.6667 },
- { 52.381, 0 },
-};
-
-static const StrokeRec monoChar105[] = {
- { 5, monoChar105_stroke0 },
- { 2, monoChar105_stroke1 },
-};
-
-/* char: 106 'j' */
-
-static const CoordRec monoChar106_stroke0[] = {
- { 57.1429, 100 },
- { 61.9048, 95.2381 },
- { 66.6667, 100 },
- { 61.9048, 104.762 },
- { 57.1429, 100 },
-};
-
-static const CoordRec monoChar106_stroke1[] = {
- { 61.9048, 66.6667 },
- { 61.9048, -14.2857 },
- { 57.1429, -28.5714 },
- { 47.6191, -33.3333 },
- { 38.0953, -33.3333 },
-};
-
-static const StrokeRec monoChar106[] = {
- { 5, monoChar106_stroke0 },
- { 5, monoChar106_stroke1 },
-};
-
-/* char: 107 'k' */
-
-static const CoordRec monoChar107_stroke0[] = {
- { 26.1905, 100 },
- { 26.1905, 0 },
-};
-
-static const CoordRec monoChar107_stroke1[] = {
- { 73.8095, 66.6667 },
- { 26.1905, 19.0476 },
-};
-
-static const CoordRec monoChar107_stroke2[] = {
- { 45.2381, 38.0952 },
- { 78.5715, 0 },
-};
-
-static const StrokeRec monoChar107[] = {
- { 2, monoChar107_stroke0 },
- { 2, monoChar107_stroke1 },
- { 2, monoChar107_stroke2 },
-};
-
-/* char: 108 'l' */
-
-static const CoordRec monoChar108_stroke0[] = {
- { 52.381, 100 },
- { 52.381, 0 },
-};
-
-static const StrokeRec monoChar108[] = {
- { 2, monoChar108_stroke0 },
-};
-
-/* char: 109 'm' */
-
-static const CoordRec monoChar109_stroke0[] = {
- { 0, 66.6667 },
- { 0, 0 },
-};
-
-static const CoordRec monoChar109_stroke1[] = {
- { 0, 47.619 },
- { 14.2857, 61.9048 },
- { 23.8095, 66.6667 },
- { 38.0952, 66.6667 },
- { 47.619, 61.9048 },
- { 52.381, 47.619 },
- { 52.381, 0 },
-};
-
-static const CoordRec monoChar109_stroke2[] = {
- { 52.381, 47.619 },
- { 66.6667, 61.9048 },
- { 76.1905, 66.6667 },
- { 90.4762, 66.6667 },
- { 100, 61.9048 },
- { 104.762, 47.619 },
- { 104.762, 0 },
-};
-
-static const StrokeRec monoChar109[] = {
- { 2, monoChar109_stroke0 },
- { 7, monoChar109_stroke1 },
- { 7, monoChar109_stroke2 },
-};
-
-/* char: 110 'n' */
-
-static const CoordRec monoChar110_stroke0[] = {
- { 26.1905, 66.6667 },
- { 26.1905, 0 },
-};
-
-static const CoordRec monoChar110_stroke1[] = {
- { 26.1905, 47.619 },
- { 40.4762, 61.9048 },
- { 50, 66.6667 },
- { 64.2857, 66.6667 },
- { 73.8095, 61.9048 },
- { 78.5715, 47.619 },
- { 78.5715, 0 },
-};
-
-static const StrokeRec monoChar110[] = {
- { 2, monoChar110_stroke0 },
- { 7, monoChar110_stroke1 },
-};
-
-/* char: 111 'o' */
-
-static const CoordRec monoChar111_stroke0[] = {
- { 45.2381, 66.6667 },
- { 35.7143, 61.9048 },
- { 26.1905, 52.381 },
- { 21.4286, 38.0952 },
- { 21.4286, 28.5714 },
- { 26.1905, 14.2857 },
- { 35.7143, 4.7619 },
- { 45.2381, 0 },
- { 59.5238, 0 },
- { 69.0476, 4.7619 },
- { 78.5714, 14.2857 },
- { 83.3334, 28.5714 },
- { 83.3334, 38.0952 },
- { 78.5714, 52.381 },
- { 69.0476, 61.9048 },
- { 59.5238, 66.6667 },
- { 45.2381, 66.6667 },
-};
-
-static const StrokeRec monoChar111[] = {
- { 17, monoChar111_stroke0 },
-};
-
-/* char: 112 'p' */
-
-static const CoordRec monoChar112_stroke0[] = {
- { 23.8095, 66.6667 },
- { 23.8095, -33.3333 },
-};
-
-static const CoordRec monoChar112_stroke1[] = {
- { 23.8095, 52.381 },
- { 33.3333, 61.9048 },
- { 42.8571, 66.6667 },
- { 57.1428, 66.6667 },
- { 66.6666, 61.9048 },
- { 76.1905, 52.381 },
- { 80.9524, 38.0952 },
- { 80.9524, 28.5714 },
- { 76.1905, 14.2857 },
- { 66.6666, 4.7619 },
- { 57.1428, 0 },
- { 42.8571, 0 },
- { 33.3333, 4.7619 },
- { 23.8095, 14.2857 },
-};
-
-static const StrokeRec monoChar112[] = {
- { 2, monoChar112_stroke0 },
- { 14, monoChar112_stroke1 },
-};
-
-/* char: 113 'q' */
-
-static const CoordRec monoChar113_stroke0[] = {
- { 80.9524, 66.6667 },
- { 80.9524, -33.3333 },
-};
-
-static const CoordRec monoChar113_stroke1[] = {
- { 80.9524, 52.381 },
- { 71.4285, 61.9048 },
- { 61.9047, 66.6667 },
- { 47.619, 66.6667 },
- { 38.0952, 61.9048 },
- { 28.5714, 52.381 },
- { 23.8095, 38.0952 },
- { 23.8095, 28.5714 },
- { 28.5714, 14.2857 },
- { 38.0952, 4.7619 },
- { 47.619, 0 },
- { 61.9047, 0 },
- { 71.4285, 4.7619 },
- { 80.9524, 14.2857 },
-};
-
-static const StrokeRec monoChar113[] = {
- { 2, monoChar113_stroke0 },
- { 14, monoChar113_stroke1 },
-};
-
-/* char: 114 'r' */
-
-static const CoordRec monoChar114_stroke0[] = {
- { 33.3334, 66.6667 },
- { 33.3334, 0 },
-};
-
-static const CoordRec monoChar114_stroke1[] = {
- { 33.3334, 38.0952 },
- { 38.0953, 52.381 },
- { 47.6191, 61.9048 },
- { 57.1429, 66.6667 },
- { 71.4286, 66.6667 },
-};
-
-static const StrokeRec monoChar114[] = {
- { 2, monoChar114_stroke0 },
- { 5, monoChar114_stroke1 },
-};
-
-/* char: 115 's' */
-
-static const CoordRec monoChar115_stroke0[] = {
- { 78.5715, 52.381 },
- { 73.8095, 61.9048 },
- { 59.5238, 66.6667 },
- { 45.2381, 66.6667 },
- { 30.9524, 61.9048 },
- { 26.1905, 52.381 },
- { 30.9524, 42.8571 },
- { 40.4762, 38.0952 },
- { 64.2857, 33.3333 },
- { 73.8095, 28.5714 },
- { 78.5715, 19.0476 },
- { 78.5715, 14.2857 },
- { 73.8095, 4.7619 },
- { 59.5238, 0 },
- { 45.2381, 0 },
- { 30.9524, 4.7619 },
- { 26.1905, 14.2857 },
-};
-
-static const StrokeRec monoChar115[] = {
- { 17, monoChar115_stroke0 },
-};
-
-/* char: 116 't' */
-
-static const CoordRec monoChar116_stroke0[] = {
- { 47.6191, 100 },
- { 47.6191, 19.0476 },
- { 52.381, 4.7619 },
- { 61.9048, 0 },
- { 71.4286, 0 },
-};
-
-static const CoordRec monoChar116_stroke1[] = {
- { 33.3334, 66.6667 },
- { 66.6667, 66.6667 },
-};
-
-static const StrokeRec monoChar116[] = {
- { 5, monoChar116_stroke0 },
- { 2, monoChar116_stroke1 },
-};
-
-/* char: 117 'u' */
-
-static const CoordRec monoChar117_stroke0[] = {
- { 26.1905, 66.6667 },
- { 26.1905, 19.0476 },
- { 30.9524, 4.7619 },
- { 40.4762, 0 },
- { 54.7619, 0 },
- { 64.2857, 4.7619 },
- { 78.5715, 19.0476 },
-};
-
-static const CoordRec monoChar117_stroke1[] = {
- { 78.5715, 66.6667 },
- { 78.5715, 0 },
-};
-
-static const StrokeRec monoChar117[] = {
- { 7, monoChar117_stroke0 },
- { 2, monoChar117_stroke1 },
-};
-
-/* char: 118 'v' */
-
-static const CoordRec monoChar118_stroke0[] = {
- { 23.8095, 66.6667 },
- { 52.3809, 0 },
-};
-
-static const CoordRec monoChar118_stroke1[] = {
- { 80.9524, 66.6667 },
- { 52.3809, 0 },
-};
-
-static const StrokeRec monoChar118[] = {
- { 2, monoChar118_stroke0 },
- { 2, monoChar118_stroke1 },
-};
-
-/* char: 119 'w' */
-
-static const CoordRec monoChar119_stroke0[] = {
- { 14.2857, 66.6667 },
- { 33.3333, 0 },
-};
-
-static const CoordRec monoChar119_stroke1[] = {
- { 52.3809, 66.6667 },
- { 33.3333, 0 },
-};
-
-static const CoordRec monoChar119_stroke2[] = {
- { 52.3809, 66.6667 },
- { 71.4286, 0 },
-};
-
-static const CoordRec monoChar119_stroke3[] = {
- { 90.4762, 66.6667 },
- { 71.4286, 0 },
-};
-
-static const StrokeRec monoChar119[] = {
- { 2, monoChar119_stroke0 },
- { 2, monoChar119_stroke1 },
- { 2, monoChar119_stroke2 },
- { 2, monoChar119_stroke3 },
-};
-
-/* char: 120 'x' */
-
-static const CoordRec monoChar120_stroke0[] = {
- { 26.1905, 66.6667 },
- { 78.5715, 0 },
-};
-
-static const CoordRec monoChar120_stroke1[] = {
- { 78.5715, 66.6667 },
- { 26.1905, 0 },
-};
-
-static const StrokeRec monoChar120[] = {
- { 2, monoChar120_stroke0 },
- { 2, monoChar120_stroke1 },
-};
-
-/* char: 121 'y' */
-
-static const CoordRec monoChar121_stroke0[] = {
- { 26.1905, 66.6667 },
- { 54.7619, 0 },
-};
-
-static const CoordRec monoChar121_stroke1[] = {
- { 83.3334, 66.6667 },
- { 54.7619, 0 },
- { 45.2381, -19.0476 },
- { 35.7143, -28.5714 },
- { 26.1905, -33.3333 },
- { 21.4286, -33.3333 },
-};
-
-static const StrokeRec monoChar121[] = {
- { 2, monoChar121_stroke0 },
- { 6, monoChar121_stroke1 },
-};
-
-/* char: 122 'z' */
-
-static const CoordRec monoChar122_stroke0[] = {
- { 78.5715, 66.6667 },
- { 26.1905, 0 },
-};
-
-static const CoordRec monoChar122_stroke1[] = {
- { 26.1905, 66.6667 },
- { 78.5715, 66.6667 },
-};
-
-static const CoordRec monoChar122_stroke2[] = {
- { 26.1905, 0 },
- { 78.5715, 0 },
-};
-
-static const StrokeRec monoChar122[] = {
- { 2, monoChar122_stroke0 },
- { 2, monoChar122_stroke1 },
- { 2, monoChar122_stroke2 },
-};
-
-/* char: 123 '{' */
-
-static const CoordRec monoChar123_stroke0[] = {
- { 64.2857, 119.048 },
- { 54.7619, 114.286 },
- { 50, 109.524 },
- { 45.2381, 100 },
- { 45.2381, 90.4762 },
- { 50, 80.9524 },
- { 54.7619, 76.1905 },
- { 59.5238, 66.6667 },
- { 59.5238, 57.1429 },
- { 50, 47.619 },
-};
-
-static const CoordRec monoChar123_stroke1[] = {
- { 54.7619, 114.286 },
- { 50, 104.762 },
- { 50, 95.2381 },
- { 54.7619, 85.7143 },
- { 59.5238, 80.9524 },
- { 64.2857, 71.4286 },
- { 64.2857, 61.9048 },
- { 59.5238, 52.381 },
- { 40.4762, 42.8571 },
- { 59.5238, 33.3333 },
- { 64.2857, 23.8095 },
- { 64.2857, 14.2857 },
- { 59.5238, 4.7619 },
- { 54.7619, 0 },
- { 50, -9.5238 },
- { 50, -19.0476 },
- { 54.7619, -28.5714 },
-};
-
-static const CoordRec monoChar123_stroke2[] = {
- { 50, 38.0952 },
- { 59.5238, 28.5714 },
- { 59.5238, 19.0476 },
- { 54.7619, 9.5238 },
- { 50, 4.7619 },
- { 45.2381, -4.7619 },
- { 45.2381, -14.2857 },
- { 50, -23.8095 },
- { 54.7619, -28.5714 },
- { 64.2857, -33.3333 },
-};
-
-static const StrokeRec monoChar123[] = {
- { 10, monoChar123_stroke0 },
- { 17, monoChar123_stroke1 },
- { 10, monoChar123_stroke2 },
-};
-
-/* char: 124 '|' */
-
-static const CoordRec monoChar124_stroke0[] = {
- { 52.381, 119.048 },
- { 52.381, -33.3333 },
-};
-
-static const StrokeRec monoChar124[] = {
- { 2, monoChar124_stroke0 },
-};
-
-/* char: 125 '}' */
-
-static const CoordRec monoChar125_stroke0[] = {
- { 40.4762, 119.048 },
- { 50, 114.286 },
- { 54.7619, 109.524 },
- { 59.5238, 100 },
- { 59.5238, 90.4762 },
- { 54.7619, 80.9524 },
- { 50, 76.1905 },
- { 45.2381, 66.6667 },
- { 45.2381, 57.1429 },
- { 54.7619, 47.619 },
-};
-
-static const CoordRec monoChar125_stroke1[] = {
- { 50, 114.286 },
- { 54.7619, 104.762 },
- { 54.7619, 95.2381 },
- { 50, 85.7143 },
- { 45.2381, 80.9524 },
- { 40.4762, 71.4286 },
- { 40.4762, 61.9048 },
- { 45.2381, 52.381 },
- { 64.2857, 42.8571 },
- { 45.2381, 33.3333 },
- { 40.4762, 23.8095 },
- { 40.4762, 14.2857 },
- { 45.2381, 4.7619 },
- { 50, 0 },
- { 54.7619, -9.5238 },
- { 54.7619, -19.0476 },
- { 50, -28.5714 },
-};
-
-static const CoordRec monoChar125_stroke2[] = {
- { 54.7619, 38.0952 },
- { 45.2381, 28.5714 },
- { 45.2381, 19.0476 },
- { 50, 9.5238 },
- { 54.7619, 4.7619 },
- { 59.5238, -4.7619 },
- { 59.5238, -14.2857 },
- { 54.7619, -23.8095 },
- { 50, -28.5714 },
- { 40.4762, -33.3333 },
-};
-
-static const StrokeRec monoChar125[] = {
- { 10, monoChar125_stroke0 },
- { 17, monoChar125_stroke1 },
- { 10, monoChar125_stroke2 },
-};
-
-/* char: 126 '~' */
-
-static const CoordRec monoChar126_stroke0[] = {
- { 9.5238, 28.5714 },
- { 9.5238, 38.0952 },
- { 14.2857, 52.381 },
- { 23.8095, 57.1429 },
- { 33.3333, 57.1429 },
- { 42.8571, 52.381 },
- { 61.9048, 38.0952 },
- { 71.4286, 33.3333 },
- { 80.9524, 33.3333 },
- { 90.4762, 38.0952 },
- { 95.2381, 47.619 },
-};
-
-static const CoordRec monoChar126_stroke1[] = {
- { 9.5238, 38.0952 },
- { 14.2857, 47.619 },
- { 23.8095, 52.381 },
- { 33.3333, 52.381 },
- { 42.8571, 47.619 },
- { 61.9048, 33.3333 },
- { 71.4286, 28.5714 },
- { 80.9524, 28.5714 },
- { 90.4762, 33.3333 },
- { 95.2381, 47.619 },
- { 95.2381, 57.1429 },
-};
-
-static const StrokeRec monoChar126[] = {
- { 11, monoChar126_stroke0 },
- { 11, monoChar126_stroke1 },
-};
-
-/* char: 127 */
-
-static const CoordRec monoChar127_stroke0[] = {
- { 71.4286, 100 },
- { 33.3333, -33.3333 },
-};
-
-static const CoordRec monoChar127_stroke1[] = {
- { 47.619, 66.6667 },
- { 33.3333, 61.9048 },
- { 23.8095, 52.381 },
- { 19.0476, 38.0952 },
- { 19.0476, 23.8095 },
- { 23.8095, 14.2857 },
- { 33.3333, 4.7619 },
- { 47.619, 0 },
- { 57.1428, 0 },
- { 71.4286, 4.7619 },
- { 80.9524, 14.2857 },
- { 85.7143, 28.5714 },
- { 85.7143, 42.8571 },
- { 80.9524, 52.381 },
- { 71.4286, 61.9048 },
- { 57.1428, 66.6667 },
- { 47.619, 66.6667 },
-};
-
-static const StrokeRec monoChar127[] = {
- { 2, monoChar127_stroke0 },
- { 17, monoChar127_stroke1 },
-};
-
-static const StrokeCharRec monoChars[] = {
- { 0, /* monoChar0 */ 0, 0, 0 },
- { 0, /* monoChar1 */ 0, 0, 0 },
- { 0, /* monoChar2 */ 0, 0, 0 },
- { 0, /* monoChar3 */ 0, 0, 0 },
- { 0, /* monoChar4 */ 0, 0, 0 },
- { 0, /* monoChar5 */ 0, 0, 0 },
- { 0, /* monoChar6 */ 0, 0, 0 },
- { 0, /* monoChar7 */ 0, 0, 0 },
- { 0, /* monoChar8 */ 0, 0, 0 },
- { 0, /* monoChar9 */ 0, 0, 0 },
- { 0, /* monoChar10 */ 0, 0, 0 },
- { 0, /* monoChar11 */ 0, 0, 0 },
- { 0, /* monoChar12 */ 0, 0, 0 },
- { 0, /* monoChar13 */ 0, 0, 0 },
- { 0, /* monoChar14 */ 0, 0, 0 },
- { 0, /* monoChar15 */ 0, 0, 0 },
- { 0, /* monoChar16 */ 0, 0, 0 },
- { 0, /* monoChar17 */ 0, 0, 0 },
- { 0, /* monoChar18 */ 0, 0, 0 },
- { 0, /* monoChar19 */ 0, 0, 0 },
- { 0, /* monoChar20 */ 0, 0, 0 },
- { 0, /* monoChar21 */ 0, 0, 0 },
- { 0, /* monoChar22 */ 0, 0, 0 },
- { 0, /* monoChar23 */ 0, 0, 0 },
- { 0, /* monoChar24 */ 0, 0, 0 },
- { 0, /* monoChar25 */ 0, 0, 0 },
- { 0, /* monoChar26 */ 0, 0, 0 },
- { 0, /* monoChar27 */ 0, 0, 0 },
- { 0, /* monoChar28 */ 0, 0, 0 },
- { 0, /* monoChar29 */ 0, 0, 0 },
- { 0, /* monoChar30 */ 0, 0, 0 },
- { 0, /* monoChar31 */ 0, 0, 0 },
- { 0, /* monoChar32 */ 0, 52.381, 104.762 },
- { 2, monoChar33, 52.381, 104.762 },
- { 2, monoChar34, 52.381, 104.762 },
- { 4, monoChar35, 52.381, 104.762 },
- { 3, monoChar36, 52.381, 104.762 },
- { 3, monoChar37, 52.381, 104.762 },
- { 1, monoChar38, 52.381, 104.762 },
- { 1, monoChar39, 52.381, 104.762 },
- { 1, monoChar40, 52.381, 104.762 },
- { 1, monoChar41, 52.381, 104.762 },
- { 3, monoChar42, 52.381, 104.762 },
- { 2, monoChar43, 52.381, 104.762 },
- { 1, monoChar44, 52.381, 104.762 },
- { 1, monoChar45, 52.381, 104.762 },
- { 1, monoChar46, 52.381, 104.762 },
- { 1, monoChar47, 52.381, 104.762 },
- { 1, monoChar48, 52.381, 104.762 },
- { 1, monoChar49, 52.381, 104.762 },
- { 1, monoChar50, 52.381, 104.762 },
- { 1, monoChar51, 52.381, 104.762 },
- { 2, monoChar52, 52.381, 104.762 },
- { 1, monoChar53, 52.381, 104.762 },
- { 1, monoChar54, 52.381, 104.762 },
- { 2, monoChar55, 52.381, 104.762 },
- { 1, monoChar56, 52.381, 104.762 },
- { 1, monoChar57, 52.381, 104.762 },
- { 2, monoChar58, 52.381, 104.762 },
- { 2, monoChar59, 52.381, 104.762 },
- { 1, monoChar60, 52.381, 104.762 },
- { 2, monoChar61, 52.381, 104.762 },
- { 1, monoChar62, 52.381, 104.762 },
- { 2, monoChar63, 52.381, 104.762 },
- { 2, monoChar64, 52.381, 104.762 },
- { 3, monoChar65, 52.381, 104.762 },
- { 3, monoChar66, 52.381, 104.762 },
- { 1, monoChar67, 52.381, 104.762 },
- { 2, monoChar68, 52.381, 104.762 },
- { 4, monoChar69, 52.381, 104.762 },
- { 3, monoChar70, 52.381, 104.762 },
- { 2, monoChar71, 52.381, 104.762 },
- { 3, monoChar72, 52.381, 104.762 },
- { 1, monoChar73, 52.381, 104.762 },
- { 1, monoChar74, 52.381, 104.762 },
- { 3, monoChar75, 52.381, 104.762 },
- { 2, monoChar76, 52.381, 104.762 },
- { 4, monoChar77, 52.381, 104.762 },
- { 3, monoChar78, 52.381, 104.762 },
- { 1, monoChar79, 52.381, 104.762 },
- { 2, monoChar80, 52.381, 104.762 },
- { 2, monoChar81, 52.381, 104.762 },
- { 3, monoChar82, 52.381, 104.762 },
- { 1, monoChar83, 52.381, 104.762 },
- { 2, monoChar84, 52.381, 104.762 },
- { 1, monoChar85, 52.381, 104.762 },
- { 2, monoChar86, 52.381, 104.762 },
- { 4, monoChar87, 52.381, 104.762 },
- { 2, monoChar88, 52.381, 104.762 },
- { 2, monoChar89, 52.381, 104.762 },
- { 3, monoChar90, 52.381, 104.762 },
- { 4, monoChar91, 52.381, 104.762 },
- { 1, monoChar92, 52.381, 104.762 },
- { 4, monoChar93, 52.381, 104.762 },
- { 2, monoChar94, 52.381, 104.762 },
- { 1, monoChar95, 52.381, 104.762 },
- { 2, monoChar96, 52.381, 104.762 },
- { 2, monoChar97, 52.381, 104.762 },
- { 2, monoChar98, 52.381, 104.762 },
- { 1, monoChar99, 52.381, 104.762 },
- { 2, monoChar100, 52.381, 104.762 },
- { 1, monoChar101, 52.381, 104.762 },
- { 2, monoChar102, 52.381, 104.762 },
- { 2, monoChar103, 52.381, 104.762 },
- { 2, monoChar104, 52.381, 104.762 },
- { 2, monoChar105, 52.381, 104.762 },
- { 2, monoChar106, 52.381, 104.762 },
- { 3, monoChar107, 52.381, 104.762 },
- { 1, monoChar108, 52.381, 104.762 },
- { 3, monoChar109, 52.381, 104.762 },
- { 2, monoChar110, 52.381, 104.762 },
- { 1, monoChar111, 52.381, 104.762 },
- { 2, monoChar112, 52.381, 104.762 },
- { 2, monoChar113, 52.381, 104.762 },
- { 2, monoChar114, 52.381, 104.762 },
- { 1, monoChar115, 52.381, 104.762 },
- { 2, monoChar116, 52.381, 104.762 },
- { 2, monoChar117, 52.381, 104.762 },
- { 2, monoChar118, 52.381, 104.762 },
- { 4, monoChar119, 52.381, 104.762 },
- { 2, monoChar120, 52.381, 104.762 },
- { 2, monoChar121, 52.381, 104.762 },
- { 3, monoChar122, 52.381, 104.762 },
- { 3, monoChar123, 52.381, 104.762 },
- { 1, monoChar124, 52.381, 104.762 },
- { 3, monoChar125, 52.381, 104.762 },
- { 2, monoChar126, 52.381, 104.762 },
- { 2, monoChar127, 52.381, 104.762 },
-};
-
-static
-StrokeFontRec glutStrokeMonoRoman = { "Roman", 128, monoChars, 119.048, -33.3333 };
-
diff --git a/hacks/glx/glut_roman.h b/hacks/glx/glut_roman.h
deleted file mode 100644
index 93f9532..0000000
--- a/hacks/glx/glut_roman.h
+++ /dev/null
@@ -1,2455 +0,0 @@
-/* Roman simplex stroke font copyright (c) 1989, 1990, 1991
- * by Sun Microsystems, Inc. and the X Consortium.
- * Originally part of the GLUT library by Mark J. Kilgard.
- */
-
-#include "glutstroke.h"
-
-/* char: 33 '!' */
-
-static const CoordRec char33_stroke0[] = {
- { 13.3819, 100 },
- { 13.3819, 33.3333 },
-};
-
-static const CoordRec char33_stroke1[] = {
- { 13.3819, 9.5238 },
- { 8.62, 4.7619 },
- { 13.3819, 0 },
- { 18.1438, 4.7619 },
- { 13.3819, 9.5238 },
-};
-
-static const StrokeRec char33[] = {
- { 2, char33_stroke0 },
- { 5, char33_stroke1 },
-};
-
-/* char: 34 '"' */
-
-static const CoordRec char34_stroke0[] = {
- { 4.02, 100 },
- { 4.02, 66.6667 },
-};
-
-static const CoordRec char34_stroke1[] = {
- { 42.1152, 100 },
- { 42.1152, 66.6667 },
-};
-
-static const StrokeRec char34[] = {
- { 2, char34_stroke0 },
- { 2, char34_stroke1 },
-};
-
-/* char: 35 '#' */
-
-static const CoordRec char35_stroke0[] = {
- { 41.2952, 119.048 },
- { 7.9619, -33.3333 },
-};
-
-static const CoordRec char35_stroke1[] = {
- { 69.8667, 119.048 },
- { 36.5333, -33.3333 },
-};
-
-static const CoordRec char35_stroke2[] = {
- { 7.9619, 57.1429 },
- { 74.6286, 57.1429 },
-};
-
-static const CoordRec char35_stroke3[] = {
- { 3.2, 28.5714 },
- { 69.8667, 28.5714 },
-};
-
-static const StrokeRec char35[] = {
- { 2, char35_stroke0 },
- { 2, char35_stroke1 },
- { 2, char35_stroke2 },
- { 2, char35_stroke3 },
-};
-
-/* char: 36 '$' */
-
-static const CoordRec char36_stroke0[] = {
- { 28.6295, 119.048 },
- { 28.6295, -19.0476 },
-};
-
-static const CoordRec char36_stroke1[] = {
- { 47.6771, 119.048 },
- { 47.6771, -19.0476 },
-};
-
-static const CoordRec char36_stroke2[] = {
- { 71.4867, 85.7143 },
- { 61.9629, 95.2381 },
- { 47.6771, 100 },
- { 28.6295, 100 },
- { 14.3438, 95.2381 },
- { 4.82, 85.7143 },
- { 4.82, 76.1905 },
- { 9.5819, 66.6667 },
- { 14.3438, 61.9048 },
- { 23.8676, 57.1429 },
- { 52.439, 47.619 },
- { 61.9629, 42.8571 },
- { 66.7248, 38.0952 },
- { 71.4867, 28.5714 },
- { 71.4867, 14.2857 },
- { 61.9629, 4.7619 },
- { 47.6771, 0 },
- { 28.6295, 0 },
- { 14.3438, 4.7619 },
- { 4.82, 14.2857 },
-};
-
-static const StrokeRec char36[] = {
- { 2, char36_stroke0 },
- { 2, char36_stroke1 },
- { 20, char36_stroke2 },
-};
-
-/* char: 37 '%' */
-
-static const CoordRec char37_stroke0[] = {
- { 92.0743, 100 },
- { 6.36, 0 },
-};
-
-static const CoordRec char37_stroke1[] = {
- { 30.1695, 100 },
- { 39.6933, 90.4762 },
- { 39.6933, 80.9524 },
- { 34.9314, 71.4286 },
- { 25.4076, 66.6667 },
- { 15.8838, 66.6667 },
- { 6.36, 76.1905 },
- { 6.36, 85.7143 },
- { 11.1219, 95.2381 },
- { 20.6457, 100 },
- { 30.1695, 100 },
- { 39.6933, 95.2381 },
- { 53.979, 90.4762 },
- { 68.2648, 90.4762 },
- { 82.5505, 95.2381 },
- { 92.0743, 100 },
-};
-
-static const CoordRec char37_stroke2[] = {
- { 73.0267, 33.3333 },
- { 63.5029, 28.5714 },
- { 58.741, 19.0476 },
- { 58.741, 9.5238 },
- { 68.2648, 0 },
- { 77.7886, 0 },
- { 87.3124, 4.7619 },
- { 92.0743, 14.2857 },
- { 92.0743, 23.8095 },
- { 82.5505, 33.3333 },
- { 73.0267, 33.3333 },
-};
-
-static const StrokeRec char37[] = {
- { 2, char37_stroke0 },
- { 16, char37_stroke1 },
- { 11, char37_stroke2 },
-};
-
-/* char: 38 '&' */
-
-static const CoordRec char38_stroke0[] = {
- { 101.218, 57.1429 },
- { 101.218, 61.9048 },
- { 96.4562, 66.6667 },
- { 91.6943, 66.6667 },
- { 86.9324, 61.9048 },
- { 82.1705, 52.381 },
- { 72.6467, 28.5714 },
- { 63.1229, 14.2857 },
- { 53.599, 4.7619 },
- { 44.0752, 0 },
- { 25.0276, 0 },
- { 15.5038, 4.7619 },
- { 10.7419, 9.5238 },
- { 5.98, 19.0476 },
- { 5.98, 28.5714 },
- { 10.7419, 38.0952 },
- { 15.5038, 42.8571 },
- { 48.8371, 61.9048 },
- { 53.599, 66.6667 },
- { 58.361, 76.1905 },
- { 58.361, 85.7143 },
- { 53.599, 95.2381 },
- { 44.0752, 100 },
- { 34.5514, 95.2381 },
- { 29.7895, 85.7143 },
- { 29.7895, 76.1905 },
- { 34.5514, 61.9048 },
- { 44.0752, 47.619 },
- { 67.8848, 14.2857 },
- { 77.4086, 4.7619 },
- { 86.9324, 0 },
- { 96.4562, 0 },
- { 101.218, 4.7619 },
- { 101.218, 9.5238 },
-};
-
-static const StrokeRec char38[] = {
- { 34, char38_stroke0 },
-};
-
-/* char: 39 ''' */
-
-static const CoordRec char39_stroke0[] = {
- { 4.44, 100 },
- { 4.44, 66.6667 },
-};
-
-static const StrokeRec char39[] = {
- { 2, char39_stroke0 },
-};
-
-/* char: 40 '(' */
-
-static const CoordRec char40_stroke0[] = {
- { 40.9133, 119.048 },
- { 31.3895, 109.524 },
- { 21.8657, 95.2381 },
- { 12.3419, 76.1905 },
- { 7.58, 52.381 },
- { 7.58, 33.3333 },
- { 12.3419, 9.5238 },
- { 21.8657, -9.5238 },
- { 31.3895, -23.8095 },
- { 40.9133, -33.3333 },
-};
-
-static const StrokeRec char40[] = {
- { 10, char40_stroke0 },
-};
-
-/* char: 41 ')' */
-
-static const CoordRec char41_stroke0[] = {
- { 5.28, 119.048 },
- { 14.8038, 109.524 },
- { 24.3276, 95.2381 },
- { 33.8514, 76.1905 },
- { 38.6133, 52.381 },
- { 38.6133, 33.3333 },
- { 33.8514, 9.5238 },
- { 24.3276, -9.5238 },
- { 14.8038, -23.8095 },
- { 5.28, -33.3333 },
-};
-
-static const StrokeRec char41[] = {
- { 10, char41_stroke0 },
-};
-
-/* char: 42 '*' */
-
-static const CoordRec char42_stroke0[] = {
- { 30.7695, 71.4286 },
- { 30.7695, 14.2857 },
-};
-
-static const CoordRec char42_stroke1[] = {
- { 6.96, 57.1429 },
- { 54.579, 28.5714 },
-};
-
-static const CoordRec char42_stroke2[] = {
- { 54.579, 57.1429 },
- { 6.96, 28.5714 },
-};
-
-static const StrokeRec char42[] = {
- { 2, char42_stroke0 },
- { 2, char42_stroke1 },
- { 2, char42_stroke2 },
-};
-
-/* char: 43 '+' */
-
-static const CoordRec char43_stroke0[] = {
- { 48.8371, 85.7143 },
- { 48.8371, 0 },
-};
-
-static const CoordRec char43_stroke1[] = {
- { 5.98, 42.8571 },
- { 91.6943, 42.8571 },
-};
-
-static const StrokeRec char43[] = {
- { 2, char43_stroke0 },
- { 2, char43_stroke1 },
-};
-
-/* char: 44 ',' */
-
-static const CoordRec char44_stroke0[] = {
- { 18.2838, 4.7619 },
- { 13.5219, 0 },
- { 8.76, 4.7619 },
- { 13.5219, 9.5238 },
- { 18.2838, 4.7619 },
- { 18.2838, -4.7619 },
- { 13.5219, -14.2857 },
- { 8.76, -19.0476 },
-};
-
-static const StrokeRec char44[] = {
- { 8, char44_stroke0 },
-};
-
-/* char: 45 '-' */
-
-static const CoordRec char45_stroke0[] = {
- { 7.38, 42.8571 },
- { 93.0943, 42.8571 },
-};
-
-static const StrokeRec char45[] = {
- { 2, char45_stroke0 },
-};
-
-/* char: 46 '.' */
-
-static const CoordRec char46_stroke0[] = {
- { 13.1019, 9.5238 },
- { 8.34, 4.7619 },
- { 13.1019, 0 },
- { 17.8638, 4.7619 },
- { 13.1019, 9.5238 },
-};
-
-static const StrokeRec char46[] = {
- { 5, char46_stroke0 },
-};
-
-/* char: 47 '/' */
-
-static const CoordRec char47_stroke0[] = {
- { 7.24, -14.2857 },
- { 73.9067, 100 },
-};
-
-static const StrokeRec char47[] = {
- { 2, char47_stroke0 },
-};
-
-/* char: 48 '0' */
-
-static const CoordRec char48_stroke0[] = {
- { 33.5514, 100 },
- { 19.2657, 95.2381 },
- { 9.7419, 80.9524 },
- { 4.98, 57.1429 },
- { 4.98, 42.8571 },
- { 9.7419, 19.0476 },
- { 19.2657, 4.7619 },
- { 33.5514, 0 },
- { 43.0752, 0 },
- { 57.361, 4.7619 },
- { 66.8848, 19.0476 },
- { 71.6467, 42.8571 },
- { 71.6467, 57.1429 },
- { 66.8848, 80.9524 },
- { 57.361, 95.2381 },
- { 43.0752, 100 },
- { 33.5514, 100 },
-};
-
-static const StrokeRec char48[] = {
- { 17, char48_stroke0 },
-};
-
-/* char: 49 '1' */
-
-static const CoordRec char49_stroke0[] = {
- { 11.82, 80.9524 },
- { 21.3438, 85.7143 },
- { 35.6295, 100 },
- { 35.6295, 0 },
-};
-
-static const StrokeRec char49[] = {
- { 4, char49_stroke0 },
-};
-
-/* char: 50 '2' */
-
-static const CoordRec char50_stroke0[] = {
- { 10.1819, 76.1905 },
- { 10.1819, 80.9524 },
- { 14.9438, 90.4762 },
- { 19.7057, 95.2381 },
- { 29.2295, 100 },
- { 48.2771, 100 },
- { 57.801, 95.2381 },
- { 62.5629, 90.4762 },
- { 67.3248, 80.9524 },
- { 67.3248, 71.4286 },
- { 62.5629, 61.9048 },
- { 53.039, 47.619 },
- { 5.42, 0 },
- { 72.0867, 0 },
-};
-
-static const StrokeRec char50[] = {
- { 14, char50_stroke0 },
-};
-
-/* char: 51 '3' */
-
-static const CoordRec char51_stroke0[] = {
- { 14.5238, 100 },
- { 66.9048, 100 },
- { 38.3333, 61.9048 },
- { 52.619, 61.9048 },
- { 62.1429, 57.1429 },
- { 66.9048, 52.381 },
- { 71.6667, 38.0952 },
- { 71.6667, 28.5714 },
- { 66.9048, 14.2857 },
- { 57.381, 4.7619 },
- { 43.0952, 0 },
- { 28.8095, 0 },
- { 14.5238, 4.7619 },
- { 9.7619, 9.5238 },
- { 5, 19.0476 },
-};
-
-static const StrokeRec char51[] = {
- { 15, char51_stroke0 },
-};
-
-/* char: 52 '4' */
-
-static const CoordRec char52_stroke0[] = {
- { 51.499, 100 },
- { 3.88, 33.3333 },
- { 75.3086, 33.3333 },
-};
-
-static const CoordRec char52_stroke1[] = {
- { 51.499, 100 },
- { 51.499, 0 },
-};
-
-static const StrokeRec char52[] = {
- { 3, char52_stroke0 },
- { 2, char52_stroke1 },
-};
-
-/* char: 53 '5' */
-
-static const CoordRec char53_stroke0[] = {
- { 62.0029, 100 },
- { 14.3838, 100 },
- { 9.6219, 57.1429 },
- { 14.3838, 61.9048 },
- { 28.6695, 66.6667 },
- { 42.9552, 66.6667 },
- { 57.241, 61.9048 },
- { 66.7648, 52.381 },
- { 71.5267, 38.0952 },
- { 71.5267, 28.5714 },
- { 66.7648, 14.2857 },
- { 57.241, 4.7619 },
- { 42.9552, 0 },
- { 28.6695, 0 },
- { 14.3838, 4.7619 },
- { 9.6219, 9.5238 },
- { 4.86, 19.0476 },
-};
-
-static const StrokeRec char53[] = {
- { 17, char53_stroke0 },
-};
-
-/* char: 54 '6' */
-
-static const CoordRec char54_stroke0[] = {
- { 62.7229, 85.7143 },
- { 57.961, 95.2381 },
- { 43.6752, 100 },
- { 34.1514, 100 },
- { 19.8657, 95.2381 },
- { 10.3419, 80.9524 },
- { 5.58, 57.1429 },
- { 5.58, 33.3333 },
- { 10.3419, 14.2857 },
- { 19.8657, 4.7619 },
- { 34.1514, 0 },
- { 38.9133, 0 },
- { 53.199, 4.7619 },
- { 62.7229, 14.2857 },
- { 67.4848, 28.5714 },
- { 67.4848, 33.3333 },
- { 62.7229, 47.619 },
- { 53.199, 57.1429 },
- { 38.9133, 61.9048 },
- { 34.1514, 61.9048 },
- { 19.8657, 57.1429 },
- { 10.3419, 47.619 },
- { 5.58, 33.3333 },
-};
-
-static const StrokeRec char54[] = {
- { 23, char54_stroke0 },
-};
-
-/* char: 55 '7' */
-
-static const CoordRec char55_stroke0[] = {
- { 72.2267, 100 },
- { 24.6076, 0 },
-};
-
-static const CoordRec char55_stroke1[] = {
- { 5.56, 100 },
- { 72.2267, 100 },
-};
-
-static const StrokeRec char55[] = {
- { 2, char55_stroke0 },
- { 2, char55_stroke1 },
-};
-
-/* char: 56 '8' */
-
-static const CoordRec char56_stroke0[] = {
- { 29.4095, 100 },
- { 15.1238, 95.2381 },
- { 10.3619, 85.7143 },
- { 10.3619, 76.1905 },
- { 15.1238, 66.6667 },
- { 24.6476, 61.9048 },
- { 43.6952, 57.1429 },
- { 57.981, 52.381 },
- { 67.5048, 42.8571 },
- { 72.2667, 33.3333 },
- { 72.2667, 19.0476 },
- { 67.5048, 9.5238 },
- { 62.7429, 4.7619 },
- { 48.4571, 0 },
- { 29.4095, 0 },
- { 15.1238, 4.7619 },
- { 10.3619, 9.5238 },
- { 5.6, 19.0476 },
- { 5.6, 33.3333 },
- { 10.3619, 42.8571 },
- { 19.8857, 52.381 },
- { 34.1714, 57.1429 },
- { 53.219, 61.9048 },
- { 62.7429, 66.6667 },
- { 67.5048, 76.1905 },
- { 67.5048, 85.7143 },
- { 62.7429, 95.2381 },
- { 48.4571, 100 },
- { 29.4095, 100 },
-};
-
-static const StrokeRec char56[] = {
- { 29, char56_stroke0 },
-};
-
-/* char: 57 '9' */
-
-static const CoordRec char57_stroke0[] = {
- { 68.5048, 66.6667 },
- { 63.7429, 52.381 },
- { 54.219, 42.8571 },
- { 39.9333, 38.0952 },
- { 35.1714, 38.0952 },
- { 20.8857, 42.8571 },
- { 11.3619, 52.381 },
- { 6.6, 66.6667 },
- { 6.6, 71.4286 },
- { 11.3619, 85.7143 },
- { 20.8857, 95.2381 },
- { 35.1714, 100 },
- { 39.9333, 100 },
- { 54.219, 95.2381 },
- { 63.7429, 85.7143 },
- { 68.5048, 66.6667 },
- { 68.5048, 42.8571 },
- { 63.7429, 19.0476 },
- { 54.219, 4.7619 },
- { 39.9333, 0 },
- { 30.4095, 0 },
- { 16.1238, 4.7619 },
- { 11.3619, 14.2857 },
-};
-
-static const StrokeRec char57[] = {
- { 23, char57_stroke0 },
-};
-
-/* char: 58 ':' */
-
-static const CoordRec char58_stroke0[] = {
- { 14.0819, 66.6667 },
- { 9.32, 61.9048 },
- { 14.0819, 57.1429 },
- { 18.8438, 61.9048 },
- { 14.0819, 66.6667 },
-};
-
-static const CoordRec char58_stroke1[] = {
- { 14.0819, 9.5238 },
- { 9.32, 4.7619 },
- { 14.0819, 0 },
- { 18.8438, 4.7619 },
- { 14.0819, 9.5238 },
-};
-
-static const StrokeRec char58[] = {
- { 5, char58_stroke0 },
- { 5, char58_stroke1 },
-};
-
-/* char: 59 ';' */
-
-static const CoordRec char59_stroke0[] = {
- { 12.9619, 66.6667 },
- { 8.2, 61.9048 },
- { 12.9619, 57.1429 },
- { 17.7238, 61.9048 },
- { 12.9619, 66.6667 },
-};
-
-static const CoordRec char59_stroke1[] = {
- { 17.7238, 4.7619 },
- { 12.9619, 0 },
- { 8.2, 4.7619 },
- { 12.9619, 9.5238 },
- { 17.7238, 4.7619 },
- { 17.7238, -4.7619 },
- { 12.9619, -14.2857 },
- { 8.2, -19.0476 },
-};
-
-static const StrokeRec char59[] = {
- { 5, char59_stroke0 },
- { 8, char59_stroke1 },
-};
-
-/* char: 60 '<' */
-
-static const CoordRec char60_stroke0[] = {
- { 79.2505, 85.7143 },
- { 3.06, 42.8571 },
- { 79.2505, 0 },
-};
-
-static const StrokeRec char60[] = {
- { 3, char60_stroke0 },
-};
-
-/* char: 61 '=' */
-
-static const CoordRec char61_stroke0[] = {
- { 5.7, 57.1429 },
- { 91.4143, 57.1429 },
-};
-
-static const CoordRec char61_stroke1[] = {
- { 5.7, 28.5714 },
- { 91.4143, 28.5714 },
-};
-
-static const StrokeRec char61[] = {
- { 2, char61_stroke0 },
- { 2, char61_stroke1 },
-};
-
-/* char: 62 '>' */
-
-static const CoordRec char62_stroke0[] = {
- { 2.78, 85.7143 },
- { 78.9705, 42.8571 },
- { 2.78, 0 },
-};
-
-static const StrokeRec char62[] = {
- { 3, char62_stroke0 },
-};
-
-/* char: 63 '?' */
-
-static const CoordRec char63_stroke0[] = {
- { 8.42, 76.1905 },
- { 8.42, 80.9524 },
- { 13.1819, 90.4762 },
- { 17.9438, 95.2381 },
- { 27.4676, 100 },
- { 46.5152, 100 },
- { 56.039, 95.2381 },
- { 60.801, 90.4762 },
- { 65.5629, 80.9524 },
- { 65.5629, 71.4286 },
- { 60.801, 61.9048 },
- { 56.039, 57.1429 },
- { 36.9914, 47.619 },
- { 36.9914, 33.3333 },
-};
-
-static const CoordRec char63_stroke1[] = {
- { 36.9914, 9.5238 },
- { 32.2295, 4.7619 },
- { 36.9914, 0 },
- { 41.7533, 4.7619 },
- { 36.9914, 9.5238 },
-};
-
-static const StrokeRec char63[] = {
- { 14, char63_stroke0 },
- { 5, char63_stroke1 },
-};
-
-/* char: 64 '@' */
-
-static const CoordRec char64_stroke0[] = {
- { 49.2171, 52.381 },
- { 39.6933, 57.1429 },
- { 30.1695, 57.1429 },
- { 25.4076, 47.619 },
- { 25.4076, 42.8571 },
- { 30.1695, 33.3333 },
- { 39.6933, 33.3333 },
- { 49.2171, 38.0952 },
-};
-
-static const CoordRec char64_stroke1[] = {
- { 49.2171, 57.1429 },
- { 49.2171, 38.0952 },
- { 53.979, 33.3333 },
- { 63.5029, 33.3333 },
- { 68.2648, 42.8571 },
- { 68.2648, 47.619 },
- { 63.5029, 61.9048 },
- { 53.979, 71.4286 },
- { 39.6933, 76.1905 },
- { 34.9314, 76.1905 },
- { 20.6457, 71.4286 },
- { 11.1219, 61.9048 },
- { 6.36, 47.619 },
- { 6.36, 42.8571 },
- { 11.1219, 28.5714 },
- { 20.6457, 19.0476 },
- { 34.9314, 14.2857 },
- { 39.6933, 14.2857 },
- { 53.979, 19.0476 },
-};
-
-static const StrokeRec char64[] = {
- { 8, char64_stroke0 },
- { 19, char64_stroke1 },
-};
-
-/* char: 65 'A' */
-
-static const CoordRec char65_stroke0[] = {
- { 40.5952, 100 },
- { 2.5, 0 },
-};
-
-static const CoordRec char65_stroke1[] = {
- { 40.5952, 100 },
- { 78.6905, 0 },
-};
-
-static const CoordRec char65_stroke2[] = {
- { 16.7857, 33.3333 },
- { 64.4048, 33.3333 },
-};
-
-static const StrokeRec char65[] = {
- { 2, char65_stroke0 },
- { 2, char65_stroke1 },
- { 2, char65_stroke2 },
-};
-
-/* char: 66 'B' */
-
-static const CoordRec char66_stroke0[] = {
- { 11.42, 100 },
- { 11.42, 0 },
-};
-
-static const CoordRec char66_stroke1[] = {
- { 11.42, 100 },
- { 54.2771, 100 },
- { 68.5629, 95.2381 },
- { 73.3248, 90.4762 },
- { 78.0867, 80.9524 },
- { 78.0867, 71.4286 },
- { 73.3248, 61.9048 },
- { 68.5629, 57.1429 },
- { 54.2771, 52.381 },
-};
-
-static const CoordRec char66_stroke2[] = {
- { 11.42, 52.381 },
- { 54.2771, 52.381 },
- { 68.5629, 47.619 },
- { 73.3248, 42.8571 },
- { 78.0867, 33.3333 },
- { 78.0867, 19.0476 },
- { 73.3248, 9.5238 },
- { 68.5629, 4.7619 },
- { 54.2771, 0 },
- { 11.42, 0 },
-};
-
-static const StrokeRec char66[] = {
- { 2, char66_stroke0 },
- { 9, char66_stroke1 },
- { 10, char66_stroke2 },
-};
-
-/* char: 67 'C' */
-
-static const CoordRec char67_stroke0[] = {
- { 78.0886, 76.1905 },
- { 73.3267, 85.7143 },
- { 63.8029, 95.2381 },
- { 54.279, 100 },
- { 35.2314, 100 },
- { 25.7076, 95.2381 },
- { 16.1838, 85.7143 },
- { 11.4219, 76.1905 },
- { 6.66, 61.9048 },
- { 6.66, 38.0952 },
- { 11.4219, 23.8095 },
- { 16.1838, 14.2857 },
- { 25.7076, 4.7619 },
- { 35.2314, 0 },
- { 54.279, 0 },
- { 63.8029, 4.7619 },
- { 73.3267, 14.2857 },
- { 78.0886, 23.8095 },
-};
-
-static const StrokeRec char67[] = {
- { 18, char67_stroke0 },
-};
-
-/* char: 68 'D' */
-
-static const CoordRec char68_stroke0[] = {
- { 11.96, 100 },
- { 11.96, 0 },
-};
-
-static const CoordRec char68_stroke1[] = {
- { 11.96, 100 },
- { 45.2933, 100 },
- { 59.579, 95.2381 },
- { 69.1029, 85.7143 },
- { 73.8648, 76.1905 },
- { 78.6267, 61.9048 },
- { 78.6267, 38.0952 },
- { 73.8648, 23.8095 },
- { 69.1029, 14.2857 },
- { 59.579, 4.7619 },
- { 45.2933, 0 },
- { 11.96, 0 },
-};
-
-static const StrokeRec char68[] = {
- { 2, char68_stroke0 },
- { 12, char68_stroke1 },
-};
-
-/* char: 69 'E' */
-
-static const CoordRec char69_stroke0[] = {
- { 11.42, 100 },
- { 11.42, 0 },
-};
-
-static const CoordRec char69_stroke1[] = {
- { 11.42, 100 },
- { 73.3248, 100 },
-};
-
-static const CoordRec char69_stroke2[] = {
- { 11.42, 52.381 },
- { 49.5152, 52.381 },
-};
-
-static const CoordRec char69_stroke3[] = {
- { 11.42, 0 },
- { 73.3248, 0 },
-};
-
-static const StrokeRec char69[] = {
- { 2, char69_stroke0 },
- { 2, char69_stroke1 },
- { 2, char69_stroke2 },
- { 2, char69_stroke3 },
-};
-
-/* char: 70 'F' */
-
-static const CoordRec char70_stroke0[] = {
- { 11.42, 100 },
- { 11.42, 0 },
-};
-
-static const CoordRec char70_stroke1[] = {
- { 11.42, 100 },
- { 73.3248, 100 },
-};
-
-static const CoordRec char70_stroke2[] = {
- { 11.42, 52.381 },
- { 49.5152, 52.381 },
-};
-
-static const StrokeRec char70[] = {
- { 2, char70_stroke0 },
- { 2, char70_stroke1 },
- { 2, char70_stroke2 },
-};
-
-/* char: 71 'G' */
-
-static const CoordRec char71_stroke0[] = {
- { 78.4886, 76.1905 },
- { 73.7267, 85.7143 },
- { 64.2029, 95.2381 },
- { 54.679, 100 },
- { 35.6314, 100 },
- { 26.1076, 95.2381 },
- { 16.5838, 85.7143 },
- { 11.8219, 76.1905 },
- { 7.06, 61.9048 },
- { 7.06, 38.0952 },
- { 11.8219, 23.8095 },
- { 16.5838, 14.2857 },
- { 26.1076, 4.7619 },
- { 35.6314, 0 },
- { 54.679, 0 },
- { 64.2029, 4.7619 },
- { 73.7267, 14.2857 },
- { 78.4886, 23.8095 },
- { 78.4886, 38.0952 },
-};
-
-static const CoordRec char71_stroke1[] = {
- { 54.679, 38.0952 },
- { 78.4886, 38.0952 },
-};
-
-static const StrokeRec char71[] = {
- { 19, char71_stroke0 },
- { 2, char71_stroke1 },
-};
-
-/* char: 72 'H' */
-
-static const CoordRec char72_stroke0[] = {
- { 11.42, 100 },
- { 11.42, 0 },
-};
-
-static const CoordRec char72_stroke1[] = {
- { 78.0867, 100 },
- { 78.0867, 0 },
-};
-
-static const CoordRec char72_stroke2[] = {
- { 11.42, 52.381 },
- { 78.0867, 52.381 },
-};
-
-static const StrokeRec char72[] = {
- { 2, char72_stroke0 },
- { 2, char72_stroke1 },
- { 2, char72_stroke2 },
-};
-
-/* char: 73 'I' */
-
-static const CoordRec char73_stroke0[] = {
- { 10.86, 100 },
- { 10.86, 0 },
-};
-
-static const StrokeRec char73[] = {
- { 2, char73_stroke0 },
-};
-
-/* char: 74 'J' */
-
-static const CoordRec char74_stroke0[] = {
- { 50.119, 100 },
- { 50.119, 23.8095 },
- { 45.3571, 9.5238 },
- { 40.5952, 4.7619 },
- { 31.0714, 0 },
- { 21.5476, 0 },
- { 12.0238, 4.7619 },
- { 7.2619, 9.5238 },
- { 2.5, 23.8095 },
- { 2.5, 33.3333 },
-};
-
-static const StrokeRec char74[] = {
- { 10, char74_stroke0 },
-};
-
-/* char: 75 'K' */
-
-static const CoordRec char75_stroke0[] = {
- { 11.28, 100 },
- { 11.28, 0 },
-};
-
-static const CoordRec char75_stroke1[] = {
- { 77.9467, 100 },
- { 11.28, 33.3333 },
-};
-
-static const CoordRec char75_stroke2[] = {
- { 35.0895, 57.1429 },
- { 77.9467, 0 },
-};
-
-static const StrokeRec char75[] = {
- { 2, char75_stroke0 },
- { 2, char75_stroke1 },
- { 2, char75_stroke2 },
-};
-
-/* char: 76 'L' */
-
-static const CoordRec char76_stroke0[] = {
- { 11.68, 100 },
- { 11.68, 0 },
-};
-
-static const CoordRec char76_stroke1[] = {
- { 11.68, 0 },
- { 68.8229, 0 },
-};
-
-static const StrokeRec char76[] = {
- { 2, char76_stroke0 },
- { 2, char76_stroke1 },
-};
-
-/* char: 77 'M' */
-
-static const CoordRec char77_stroke0[] = {
- { 10.86, 100 },
- { 10.86, 0 },
-};
-
-static const CoordRec char77_stroke1[] = {
- { 10.86, 100 },
- { 48.9552, 0 },
-};
-
-static const CoordRec char77_stroke2[] = {
- { 87.0505, 100 },
- { 48.9552, 0 },
-};
-
-static const CoordRec char77_stroke3[] = {
- { 87.0505, 100 },
- { 87.0505, 0 },
-};
-
-static const StrokeRec char77[] = {
- { 2, char77_stroke0 },
- { 2, char77_stroke1 },
- { 2, char77_stroke2 },
- { 2, char77_stroke3 },
-};
-
-/* char: 78 'N' */
-
-static const CoordRec char78_stroke0[] = {
- { 11.14, 100 },
- { 11.14, 0 },
-};
-
-static const CoordRec char78_stroke1[] = {
- { 11.14, 100 },
- { 77.8067, 0 },
-};
-
-static const CoordRec char78_stroke2[] = {
- { 77.8067, 100 },
- { 77.8067, 0 },
-};
-
-static const StrokeRec char78[] = {
- { 2, char78_stroke0 },
- { 2, char78_stroke1 },
- { 2, char78_stroke2 },
-};
-
-/* char: 79 'O' */
-
-static const CoordRec char79_stroke0[] = {
- { 34.8114, 100 },
- { 25.2876, 95.2381 },
- { 15.7638, 85.7143 },
- { 11.0019, 76.1905 },
- { 6.24, 61.9048 },
- { 6.24, 38.0952 },
- { 11.0019, 23.8095 },
- { 15.7638, 14.2857 },
- { 25.2876, 4.7619 },
- { 34.8114, 0 },
- { 53.859, 0 },
- { 63.3829, 4.7619 },
- { 72.9067, 14.2857 },
- { 77.6686, 23.8095 },
- { 82.4305, 38.0952 },
- { 82.4305, 61.9048 },
- { 77.6686, 76.1905 },
- { 72.9067, 85.7143 },
- { 63.3829, 95.2381 },
- { 53.859, 100 },
- { 34.8114, 100 },
-};
-
-static const StrokeRec char79[] = {
- { 21, char79_stroke0 },
-};
-
-/* char: 80 'P' */
-
-static const CoordRec char80_stroke0[] = {
- { 12.1, 100 },
- { 12.1, 0 },
-};
-
-static const CoordRec char80_stroke1[] = {
- { 12.1, 100 },
- { 54.9571, 100 },
- { 69.2429, 95.2381 },
- { 74.0048, 90.4762 },
- { 78.7667, 80.9524 },
- { 78.7667, 66.6667 },
- { 74.0048, 57.1429 },
- { 69.2429, 52.381 },
- { 54.9571, 47.619 },
- { 12.1, 47.619 },
-};
-
-static const StrokeRec char80[] = {
- { 2, char80_stroke0 },
- { 10, char80_stroke1 },
-};
-
-/* char: 81 'Q' */
-
-static const CoordRec char81_stroke0[] = {
- { 33.8714, 100 },
- { 24.3476, 95.2381 },
- { 14.8238, 85.7143 },
- { 10.0619, 76.1905 },
- { 5.3, 61.9048 },
- { 5.3, 38.0952 },
- { 10.0619, 23.8095 },
- { 14.8238, 14.2857 },
- { 24.3476, 4.7619 },
- { 33.8714, 0 },
- { 52.919, 0 },
- { 62.4429, 4.7619 },
- { 71.9667, 14.2857 },
- { 76.7286, 23.8095 },
- { 81.4905, 38.0952 },
- { 81.4905, 61.9048 },
- { 76.7286, 76.1905 },
- { 71.9667, 85.7143 },
- { 62.4429, 95.2381 },
- { 52.919, 100 },
- { 33.8714, 100 },
-};
-
-static const CoordRec char81_stroke1[] = {
- { 48.1571, 19.0476 },
- { 76.7286, -9.5238 },
-};
-
-static const StrokeRec char81[] = {
- { 21, char81_stroke0 },
- { 2, char81_stroke1 },
-};
-
-/* char: 82 'R' */
-
-static const CoordRec char82_stroke0[] = {
- { 11.68, 100 },
- { 11.68, 0 },
-};
-
-static const CoordRec char82_stroke1[] = {
- { 11.68, 100 },
- { 54.5371, 100 },
- { 68.8229, 95.2381 },
- { 73.5848, 90.4762 },
- { 78.3467, 80.9524 },
- { 78.3467, 71.4286 },
- { 73.5848, 61.9048 },
- { 68.8229, 57.1429 },
- { 54.5371, 52.381 },
- { 11.68, 52.381 },
-};
-
-static const CoordRec char82_stroke2[] = {
- { 45.0133, 52.381 },
- { 78.3467, 0 },
-};
-
-static const StrokeRec char82[] = {
- { 2, char82_stroke0 },
- { 10, char82_stroke1 },
- { 2, char82_stroke2 },
-};
-
-/* char: 83 'S' */
-
-static const CoordRec char83_stroke0[] = {
- { 74.6667, 85.7143 },
- { 65.1429, 95.2381 },
- { 50.8571, 100 },
- { 31.8095, 100 },
- { 17.5238, 95.2381 },
- { 8, 85.7143 },
- { 8, 76.1905 },
- { 12.7619, 66.6667 },
- { 17.5238, 61.9048 },
- { 27.0476, 57.1429 },
- { 55.619, 47.619 },
- { 65.1429, 42.8571 },
- { 69.9048, 38.0952 },
- { 74.6667, 28.5714 },
- { 74.6667, 14.2857 },
- { 65.1429, 4.7619 },
- { 50.8571, 0 },
- { 31.8095, 0 },
- { 17.5238, 4.7619 },
- { 8, 14.2857 },
-};
-
-static const StrokeRec char83[] = {
- { 20, char83_stroke0 },
-};
-
-/* char: 84 'T' */
-
-static const CoordRec char84_stroke0[] = {
- { 35.6933, 100 },
- { 35.6933, 0 },
-};
-
-static const CoordRec char84_stroke1[] = {
- { 2.36, 100 },
- { 69.0267, 100 },
-};
-
-static const StrokeRec char84[] = {
- { 2, char84_stroke0 },
- { 2, char84_stroke1 },
-};
-
-/* char: 85 'U' */
-
-static const CoordRec char85_stroke0[] = {
- { 11.54, 100 },
- { 11.54, 28.5714 },
- { 16.3019, 14.2857 },
- { 25.8257, 4.7619 },
- { 40.1114, 0 },
- { 49.6352, 0 },
- { 63.921, 4.7619 },
- { 73.4448, 14.2857 },
- { 78.2067, 28.5714 },
- { 78.2067, 100 },
-};
-
-static const StrokeRec char85[] = {
- { 10, char85_stroke0 },
-};
-
-/* char: 86 'V' */
-
-static const CoordRec char86_stroke0[] = {
- { 2.36, 100 },
- { 40.4552, 0 },
-};
-
-static const CoordRec char86_stroke1[] = {
- { 78.5505, 100 },
- { 40.4552, 0 },
-};
-
-static const StrokeRec char86[] = {
- { 2, char86_stroke0 },
- { 2, char86_stroke1 },
-};
-
-/* char: 87 'W' */
-
-static const CoordRec char87_stroke0[] = {
- { 2.22, 100 },
- { 26.0295, 0 },
-};
-
-static const CoordRec char87_stroke1[] = {
- { 49.839, 100 },
- { 26.0295, 0 },
-};
-
-static const CoordRec char87_stroke2[] = {
- { 49.839, 100 },
- { 73.6486, 0 },
-};
-
-static const CoordRec char87_stroke3[] = {
- { 97.4581, 100 },
- { 73.6486, 0 },
-};
-
-static const StrokeRec char87[] = {
- { 2, char87_stroke0 },
- { 2, char87_stroke1 },
- { 2, char87_stroke2 },
- { 2, char87_stroke3 },
-};
-
-/* char: 88 'X' */
-
-static const CoordRec char88_stroke0[] = {
- { 2.5, 100 },
- { 69.1667, 0 },
-};
-
-static const CoordRec char88_stroke1[] = {
- { 69.1667, 100 },
- { 2.5, 0 },
-};
-
-static const StrokeRec char88[] = {
- { 2, char88_stroke0 },
- { 2, char88_stroke1 },
-};
-
-/* char: 89 'Y' */
-
-static const CoordRec char89_stroke0[] = {
- { 1.52, 100 },
- { 39.6152, 52.381 },
- { 39.6152, 0 },
-};
-
-static const CoordRec char89_stroke1[] = {
- { 77.7105, 100 },
- { 39.6152, 52.381 },
-};
-
-static const StrokeRec char89[] = {
- { 3, char89_stroke0 },
- { 2, char89_stroke1 },
-};
-
-/* char: 90 'Z' */
-
-static const CoordRec char90_stroke0[] = {
- { 69.1667, 100 },
- { 2.5, 0 },
-};
-
-static const CoordRec char90_stroke1[] = {
- { 2.5, 100 },
- { 69.1667, 100 },
-};
-
-static const CoordRec char90_stroke2[] = {
- { 2.5, 0 },
- { 69.1667, 0 },
-};
-
-static const StrokeRec char90[] = {
- { 2, char90_stroke0 },
- { 2, char90_stroke1 },
- { 2, char90_stroke2 },
-};
-
-/* char: 91 '[' */
-
-static const CoordRec char91_stroke0[] = {
- { 7.78, 119.048 },
- { 7.78, -33.3333 },
-};
-
-static const CoordRec char91_stroke1[] = {
- { 12.5419, 119.048 },
- { 12.5419, -33.3333 },
-};
-
-static const CoordRec char91_stroke2[] = {
- { 7.78, 119.048 },
- { 41.1133, 119.048 },
-};
-
-static const CoordRec char91_stroke3[] = {
- { 7.78, -33.3333 },
- { 41.1133, -33.3333 },
-};
-
-static const StrokeRec char91[] = {
- { 2, char91_stroke0 },
- { 2, char91_stroke1 },
- { 2, char91_stroke2 },
- { 2, char91_stroke3 },
-};
-
-/* char: 92 '\' */
-
-static const CoordRec char92_stroke0[] = {
- { 5.84, 100 },
- { 72.5067, -14.2857 },
-};
-
-static const StrokeRec char92[] = {
- { 2, char92_stroke0 },
-};
-
-/* char: 93 ']' */
-
-static const CoordRec char93_stroke0[] = {
- { 33.0114, 119.048 },
- { 33.0114, -33.3333 },
-};
-
-static const CoordRec char93_stroke1[] = {
- { 37.7733, 119.048 },
- { 37.7733, -33.3333 },
-};
-
-static const CoordRec char93_stroke2[] = {
- { 4.44, 119.048 },
- { 37.7733, 119.048 },
-};
-
-static const CoordRec char93_stroke3[] = {
- { 4.44, -33.3333 },
- { 37.7733, -33.3333 },
-};
-
-static const StrokeRec char93[] = {
- { 2, char93_stroke0 },
- { 2, char93_stroke1 },
- { 2, char93_stroke2 },
- { 2, char93_stroke3 },
-};
-
-/* char: 94 '^' */
-
-static const CoordRec char94_stroke0[] = {
- { 44.0752, 109.524 },
- { 5.98, 42.8571 },
-};
-
-static const CoordRec char94_stroke1[] = {
- { 44.0752, 109.524 },
- { 82.1705, 42.8571 },
-};
-
-static const StrokeRec char94[] = {
- { 2, char94_stroke0 },
- { 2, char94_stroke1 },
-};
-
-/* char: 95 '_' */
-
-static const CoordRec char95_stroke0[] = {
- { -1.1, -33.3333 },
- { 103.662, -33.3333 },
- { 103.662, -28.5714 },
- { -1.1, -28.5714 },
- { -1.1, -33.3333 },
-};
-
-static const StrokeRec char95[] = {
- { 5, char95_stroke0 },
-};
-
-/* char: 96 '`' */
-
-static const CoordRec char96_stroke0[] = {
- { 33.0219, 100 },
- { 56.8314, 71.4286 },
-};
-
-static const CoordRec char96_stroke1[] = {
- { 33.0219, 100 },
- { 28.26, 95.2381 },
- { 56.8314, 71.4286 },
-};
-
-static const StrokeRec char96[] = {
- { 2, char96_stroke0 },
- { 3, char96_stroke1 },
-};
-
-/* char: 97 'a' */
-
-static const CoordRec char97_stroke0[] = {
- { 63.8229, 66.6667 },
- { 63.8229, 0 },
-};
-
-static const CoordRec char97_stroke1[] = {
- { 63.8229, 52.381 },
- { 54.299, 61.9048 },
- { 44.7752, 66.6667 },
- { 30.4895, 66.6667 },
- { 20.9657, 61.9048 },
- { 11.4419, 52.381 },
- { 6.68, 38.0952 },
- { 6.68, 28.5714 },
- { 11.4419, 14.2857 },
- { 20.9657, 4.7619 },
- { 30.4895, 0 },
- { 44.7752, 0 },
- { 54.299, 4.7619 },
- { 63.8229, 14.2857 },
-};
-
-static const StrokeRec char97[] = {
- { 2, char97_stroke0 },
- { 14, char97_stroke1 },
-};
-
-/* char: 98 'b' */
-
-static const CoordRec char98_stroke0[] = {
- { 8.76, 100 },
- { 8.76, 0 },
-};
-
-static const CoordRec char98_stroke1[] = {
- { 8.76, 52.381 },
- { 18.2838, 61.9048 },
- { 27.8076, 66.6667 },
- { 42.0933, 66.6667 },
- { 51.6171, 61.9048 },
- { 61.141, 52.381 },
- { 65.9029, 38.0952 },
- { 65.9029, 28.5714 },
- { 61.141, 14.2857 },
- { 51.6171, 4.7619 },
- { 42.0933, 0 },
- { 27.8076, 0 },
- { 18.2838, 4.7619 },
- { 8.76, 14.2857 },
-};
-
-static const StrokeRec char98[] = {
- { 2, char98_stroke0 },
- { 14, char98_stroke1 },
-};
-
-/* char: 99 'c' */
-
-static const CoordRec char99_stroke0[] = {
- { 62.6629, 52.381 },
- { 53.139, 61.9048 },
- { 43.6152, 66.6667 },
- { 29.3295, 66.6667 },
- { 19.8057, 61.9048 },
- { 10.2819, 52.381 },
- { 5.52, 38.0952 },
- { 5.52, 28.5714 },
- { 10.2819, 14.2857 },
- { 19.8057, 4.7619 },
- { 29.3295, 0 },
- { 43.6152, 0 },
- { 53.139, 4.7619 },
- { 62.6629, 14.2857 },
-};
-
-static const StrokeRec char99[] = {
- { 14, char99_stroke0 },
-};
-
-/* char: 100 'd' */
-
-static const CoordRec char100_stroke0[] = {
- { 61.7829, 100 },
- { 61.7829, 0 },
-};
-
-static const CoordRec char100_stroke1[] = {
- { 61.7829, 52.381 },
- { 52.259, 61.9048 },
- { 42.7352, 66.6667 },
- { 28.4495, 66.6667 },
- { 18.9257, 61.9048 },
- { 9.4019, 52.381 },
- { 4.64, 38.0952 },
- { 4.64, 28.5714 },
- { 9.4019, 14.2857 },
- { 18.9257, 4.7619 },
- { 28.4495, 0 },
- { 42.7352, 0 },
- { 52.259, 4.7619 },
- { 61.7829, 14.2857 },
-};
-
-static const StrokeRec char100[] = {
- { 2, char100_stroke0 },
- { 14, char100_stroke1 },
-};
-
-/* char: 101 'e' */
-
-static const CoordRec char101_stroke0[] = {
- { 5.72, 38.0952 },
- { 62.8629, 38.0952 },
- { 62.8629, 47.619 },
- { 58.101, 57.1429 },
- { 53.339, 61.9048 },
- { 43.8152, 66.6667 },
- { 29.5295, 66.6667 },
- { 20.0057, 61.9048 },
- { 10.4819, 52.381 },
- { 5.72, 38.0952 },
- { 5.72, 28.5714 },
- { 10.4819, 14.2857 },
- { 20.0057, 4.7619 },
- { 29.5295, 0 },
- { 43.8152, 0 },
- { 53.339, 4.7619 },
- { 62.8629, 14.2857 },
-};
-
-static const StrokeRec char101[] = {
- { 17, char101_stroke0 },
-};
-
-/* char: 102 'f' */
-
-static const CoordRec char102_stroke0[] = {
- { 38.7752, 100 },
- { 29.2514, 100 },
- { 19.7276, 95.2381 },
- { 14.9657, 80.9524 },
- { 14.9657, 0 },
-};
-
-static const CoordRec char102_stroke1[] = {
- { 0.68, 66.6667 },
- { 34.0133, 66.6667 },
-};
-
-static const StrokeRec char102[] = {
- { 5, char102_stroke0 },
- { 2, char102_stroke1 },
-};
-
-/* char: 103 'g' */
-
-static const CoordRec char103_stroke0[] = {
- { 62.5029, 66.6667 },
- { 62.5029, -9.5238 },
- { 57.741, -23.8095 },
- { 52.979, -28.5714 },
- { 43.4552, -33.3333 },
- { 29.1695, -33.3333 },
- { 19.6457, -28.5714 },
-};
-
-static const CoordRec char103_stroke1[] = {
- { 62.5029, 52.381 },
- { 52.979, 61.9048 },
- { 43.4552, 66.6667 },
- { 29.1695, 66.6667 },
- { 19.6457, 61.9048 },
- { 10.1219, 52.381 },
- { 5.36, 38.0952 },
- { 5.36, 28.5714 },
- { 10.1219, 14.2857 },
- { 19.6457, 4.7619 },
- { 29.1695, 0 },
- { 43.4552, 0 },
- { 52.979, 4.7619 },
- { 62.5029, 14.2857 },
-};
-
-static const StrokeRec char103[] = {
- { 7, char103_stroke0 },
- { 14, char103_stroke1 },
-};
-
-/* char: 104 'h' */
-
-static const CoordRec char104_stroke0[] = {
- { 9.6, 100 },
- { 9.6, 0 },
-};
-
-static const CoordRec char104_stroke1[] = {
- { 9.6, 47.619 },
- { 23.8857, 61.9048 },
- { 33.4095, 66.6667 },
- { 47.6952, 66.6667 },
- { 57.219, 61.9048 },
- { 61.981, 47.619 },
- { 61.981, 0 },
-};
-
-static const StrokeRec char104[] = {
- { 2, char104_stroke0 },
- { 7, char104_stroke1 },
-};
-
-/* char: 105 'i' */
-
-static const CoordRec char105_stroke0[] = {
- { 10.02, 100 },
- { 14.7819, 95.2381 },
- { 19.5438, 100 },
- { 14.7819, 104.762 },
- { 10.02, 100 },
-};
-
-static const CoordRec char105_stroke1[] = {
- { 14.7819, 66.6667 },
- { 14.7819, 0 },
-};
-
-static const StrokeRec char105[] = {
- { 5, char105_stroke0 },
- { 2, char105_stroke1 },
-};
-
-/* char: 106 'j' */
-
-static const CoordRec char106_stroke0[] = {
- { 17.3876, 100 },
- { 22.1495, 95.2381 },
- { 26.9114, 100 },
- { 22.1495, 104.762 },
- { 17.3876, 100 },
-};
-
-static const CoordRec char106_stroke1[] = {
- { 22.1495, 66.6667 },
- { 22.1495, -14.2857 },
- { 17.3876, -28.5714 },
- { 7.8638, -33.3333 },
- { -1.66, -33.3333 },
-};
-
-static const StrokeRec char106[] = {
- { 5, char106_stroke0 },
- { 5, char106_stroke1 },
-};
-
-/* char: 107 'k' */
-
-static const CoordRec char107_stroke0[] = {
- { 9.6, 100 },
- { 9.6, 0 },
-};
-
-static const CoordRec char107_stroke1[] = {
- { 57.219, 66.6667 },
- { 9.6, 19.0476 },
-};
-
-static const CoordRec char107_stroke2[] = {
- { 28.6476, 38.0952 },
- { 61.981, 0 },
-};
-
-static const StrokeRec char107[] = {
- { 2, char107_stroke0 },
- { 2, char107_stroke1 },
- { 2, char107_stroke2 },
-};
-
-/* char: 108 'l' */
-
-static const CoordRec char108_stroke0[] = {
- { 10.02, 100 },
- { 10.02, 0 },
-};
-
-static const StrokeRec char108[] = {
- { 2, char108_stroke0 },
-};
-
-/* char: 109 'm' */
-
-static const CoordRec char109_stroke0[] = {
- { 9.6, 66.6667 },
- { 9.6, 0 },
-};
-
-static const CoordRec char109_stroke1[] = {
- { 9.6, 47.619 },
- { 23.8857, 61.9048 },
- { 33.4095, 66.6667 },
- { 47.6952, 66.6667 },
- { 57.219, 61.9048 },
- { 61.981, 47.619 },
- { 61.981, 0 },
-};
-
-static const CoordRec char109_stroke2[] = {
- { 61.981, 47.619 },
- { 76.2667, 61.9048 },
- { 85.7905, 66.6667 },
- { 100.076, 66.6667 },
- { 109.6, 61.9048 },
- { 114.362, 47.619 },
- { 114.362, 0 },
-};
-
-static const StrokeRec char109[] = {
- { 2, char109_stroke0 },
- { 7, char109_stroke1 },
- { 7, char109_stroke2 },
-};
-
-/* char: 110 'n' */
-
-static const CoordRec char110_stroke0[] = {
- { 9.18, 66.6667 },
- { 9.18, 0 },
-};
-
-static const CoordRec char110_stroke1[] = {
- { 9.18, 47.619 },
- { 23.4657, 61.9048 },
- { 32.9895, 66.6667 },
- { 47.2752, 66.6667 },
- { 56.799, 61.9048 },
- { 61.561, 47.619 },
- { 61.561, 0 },
-};
-
-static const StrokeRec char110[] = {
- { 2, char110_stroke0 },
- { 7, char110_stroke1 },
-};
-
-/* char: 111 'o' */
-
-static const CoordRec char111_stroke0[] = {
- { 28.7895, 66.6667 },
- { 19.2657, 61.9048 },
- { 9.7419, 52.381 },
- { 4.98, 38.0952 },
- { 4.98, 28.5714 },
- { 9.7419, 14.2857 },
- { 19.2657, 4.7619 },
- { 28.7895, 0 },
- { 43.0752, 0 },
- { 52.599, 4.7619 },
- { 62.1229, 14.2857 },
- { 66.8848, 28.5714 },
- { 66.8848, 38.0952 },
- { 62.1229, 52.381 },
- { 52.599, 61.9048 },
- { 43.0752, 66.6667 },
- { 28.7895, 66.6667 },
-};
-
-static const StrokeRec char111[] = {
- { 17, char111_stroke0 },
-};
-
-/* char: 112 'p' */
-
-static const CoordRec char112_stroke0[] = {
- { 9.46, 66.6667 },
- { 9.46, -33.3333 },
-};
-
-static const CoordRec char112_stroke1[] = {
- { 9.46, 52.381 },
- { 18.9838, 61.9048 },
- { 28.5076, 66.6667 },
- { 42.7933, 66.6667 },
- { 52.3171, 61.9048 },
- { 61.841, 52.381 },
- { 66.6029, 38.0952 },
- { 66.6029, 28.5714 },
- { 61.841, 14.2857 },
- { 52.3171, 4.7619 },
- { 42.7933, 0 },
- { 28.5076, 0 },
- { 18.9838, 4.7619 },
- { 9.46, 14.2857 },
-};
-
-static const StrokeRec char112[] = {
- { 2, char112_stroke0 },
- { 14, char112_stroke1 },
-};
-
-/* char: 113 'q' */
-
-static const CoordRec char113_stroke0[] = {
- { 61.9829, 66.6667 },
- { 61.9829, -33.3333 },
-};
-
-static const CoordRec char113_stroke1[] = {
- { 61.9829, 52.381 },
- { 52.459, 61.9048 },
- { 42.9352, 66.6667 },
- { 28.6495, 66.6667 },
- { 19.1257, 61.9048 },
- { 9.6019, 52.381 },
- { 4.84, 38.0952 },
- { 4.84, 28.5714 },
- { 9.6019, 14.2857 },
- { 19.1257, 4.7619 },
- { 28.6495, 0 },
- { 42.9352, 0 },
- { 52.459, 4.7619 },
- { 61.9829, 14.2857 },
-};
-
-static const StrokeRec char113[] = {
- { 2, char113_stroke0 },
- { 14, char113_stroke1 },
-};
-
-/* char: 114 'r' */
-
-static const CoordRec char114_stroke0[] = {
- { 9.46, 66.6667 },
- { 9.46, 0 },
-};
-
-static const CoordRec char114_stroke1[] = {
- { 9.46, 38.0952 },
- { 14.2219, 52.381 },
- { 23.7457, 61.9048 },
- { 33.2695, 66.6667 },
- { 47.5552, 66.6667 },
-};
-
-static const StrokeRec char114[] = {
- { 2, char114_stroke0 },
- { 5, char114_stroke1 },
-};
-
-/* char: 115 's' */
-
-static const CoordRec char115_stroke0[] = {
- { 57.081, 52.381 },
- { 52.319, 61.9048 },
- { 38.0333, 66.6667 },
- { 23.7476, 66.6667 },
- { 9.4619, 61.9048 },
- { 4.7, 52.381 },
- { 9.4619, 42.8571 },
- { 18.9857, 38.0952 },
- { 42.7952, 33.3333 },
- { 52.319, 28.5714 },
- { 57.081, 19.0476 },
- { 57.081, 14.2857 },
- { 52.319, 4.7619 },
- { 38.0333, 0 },
- { 23.7476, 0 },
- { 9.4619, 4.7619 },
- { 4.7, 14.2857 },
-};
-
-static const StrokeRec char115[] = {
- { 17, char115_stroke0 },
-};
-
-/* char: 116 't' */
-
-static const CoordRec char116_stroke0[] = {
- { 14.8257, 100 },
- { 14.8257, 19.0476 },
- { 19.5876, 4.7619 },
- { 29.1114, 0 },
- { 38.6352, 0 },
-};
-
-static const CoordRec char116_stroke1[] = {
- { 0.54, 66.6667 },
- { 33.8733, 66.6667 },
-};
-
-static const StrokeRec char116[] = {
- { 5, char116_stroke0 },
- { 2, char116_stroke1 },
-};
-
-/* char: 117 'u' */
-
-static const CoordRec char117_stroke0[] = {
- { 9.46, 66.6667 },
- { 9.46, 19.0476 },
- { 14.2219, 4.7619 },
- { 23.7457, 0 },
- { 38.0314, 0 },
- { 47.5552, 4.7619 },
- { 61.841, 19.0476 },
-};
-
-static const CoordRec char117_stroke1[] = {
- { 61.841, 66.6667 },
- { 61.841, 0 },
-};
-
-static const StrokeRec char117[] = {
- { 7, char117_stroke0 },
- { 2, char117_stroke1 },
-};
-
-/* char: 118 'v' */
-
-static const CoordRec char118_stroke0[] = {
- { 1.8, 66.6667 },
- { 30.3714, 0 },
-};
-
-static const CoordRec char118_stroke1[] = {
- { 58.9429, 66.6667 },
- { 30.3714, 0 },
-};
-
-static const StrokeRec char118[] = {
- { 2, char118_stroke0 },
- { 2, char118_stroke1 },
-};
-
-/* char: 119 'w' */
-
-static const CoordRec char119_stroke0[] = {
- { 2.5, 66.6667 },
- { 21.5476, 0 },
-};
-
-static const CoordRec char119_stroke1[] = {
- { 40.5952, 66.6667 },
- { 21.5476, 0 },
-};
-
-static const CoordRec char119_stroke2[] = {
- { 40.5952, 66.6667 },
- { 59.6429, 0 },
-};
-
-static const CoordRec char119_stroke3[] = {
- { 78.6905, 66.6667 },
- { 59.6429, 0 },
-};
-
-static const StrokeRec char119[] = {
- { 2, char119_stroke0 },
- { 2, char119_stroke1 },
- { 2, char119_stroke2 },
- { 2, char119_stroke3 },
-};
-
-/* char: 120 'x' */
-
-static const CoordRec char120_stroke0[] = {
- { 1.66, 66.6667 },
- { 54.041, 0 },
-};
-
-static const CoordRec char120_stroke1[] = {
- { 54.041, 66.6667 },
- { 1.66, 0 },
-};
-
-static const StrokeRec char120[] = {
- { 2, char120_stroke0 },
- { 2, char120_stroke1 },
-};
-
-/* char: 121 'y' */
-
-static const CoordRec char121_stroke0[] = {
- { 6.5619, 66.6667 },
- { 35.1333, 0 },
-};
-
-static const CoordRec char121_stroke1[] = {
- { 63.7048, 66.6667 },
- { 35.1333, 0 },
- { 25.6095, -19.0476 },
- { 16.0857, -28.5714 },
- { 6.5619, -33.3333 },
- { 1.8, -33.3333 },
-};
-
-static const StrokeRec char121[] = {
- { 2, char121_stroke0 },
- { 6, char121_stroke1 },
-};
-
-/* char: 122 'z' */
-
-static const CoordRec char122_stroke0[] = {
- { 56.821, 66.6667 },
- { 4.44, 0 },
-};
-
-static const CoordRec char122_stroke1[] = {
- { 4.44, 66.6667 },
- { 56.821, 66.6667 },
-};
-
-static const CoordRec char122_stroke2[] = {
- { 4.44, 0 },
- { 56.821, 0 },
-};
-
-static const StrokeRec char122[] = {
- { 2, char122_stroke0 },
- { 2, char122_stroke1 },
- { 2, char122_stroke2 },
-};
-
-/* char: 123 '{' */
-
-static const CoordRec char123_stroke0[] = {
- { 31.1895, 119.048 },
- { 21.6657, 114.286 },
- { 16.9038, 109.524 },
- { 12.1419, 100 },
- { 12.1419, 90.4762 },
- { 16.9038, 80.9524 },
- { 21.6657, 76.1905 },
- { 26.4276, 66.6667 },
- { 26.4276, 57.1429 },
- { 16.9038, 47.619 },
-};
-
-static const CoordRec char123_stroke1[] = {
- { 21.6657, 114.286 },
- { 16.9038, 104.762 },
- { 16.9038, 95.2381 },
- { 21.6657, 85.7143 },
- { 26.4276, 80.9524 },
- { 31.1895, 71.4286 },
- { 31.1895, 61.9048 },
- { 26.4276, 52.381 },
- { 7.38, 42.8571 },
- { 26.4276, 33.3333 },
- { 31.1895, 23.8095 },
- { 31.1895, 14.2857 },
- { 26.4276, 4.7619 },
- { 21.6657, 0 },
- { 16.9038, -9.5238 },
- { 16.9038, -19.0476 },
- { 21.6657, -28.5714 },
-};
-
-static const CoordRec char123_stroke2[] = {
- { 16.9038, 38.0952 },
- { 26.4276, 28.5714 },
- { 26.4276, 19.0476 },
- { 21.6657, 9.5238 },
- { 16.9038, 4.7619 },
- { 12.1419, -4.7619 },
- { 12.1419, -14.2857 },
- { 16.9038, -23.8095 },
- { 21.6657, -28.5714 },
- { 31.1895, -33.3333 },
-};
-
-static const StrokeRec char123[] = {
- { 10, char123_stroke0 },
- { 17, char123_stroke1 },
- { 10, char123_stroke2 },
-};
-
-/* char: 124 '|' */
-
-static const CoordRec char124_stroke0[] = {
- { 11.54, 119.048 },
- { 11.54, -33.3333 },
-};
-
-static const StrokeRec char124[] = {
- { 2, char124_stroke0 },
-};
-
-/* char: 125 '}' */
-
-static const CoordRec char125_stroke0[] = {
- { 9.18, 119.048 },
- { 18.7038, 114.286 },
- { 23.4657, 109.524 },
- { 28.2276, 100 },
- { 28.2276, 90.4762 },
- { 23.4657, 80.9524 },
- { 18.7038, 76.1905 },
- { 13.9419, 66.6667 },
- { 13.9419, 57.1429 },
- { 23.4657, 47.619 },
-};
-
-static const CoordRec char125_stroke1[] = {
- { 18.7038, 114.286 },
- { 23.4657, 104.762 },
- { 23.4657, 95.2381 },
- { 18.7038, 85.7143 },
- { 13.9419, 80.9524 },
- { 9.18, 71.4286 },
- { 9.18, 61.9048 },
- { 13.9419, 52.381 },
- { 32.9895, 42.8571 },
- { 13.9419, 33.3333 },
- { 9.18, 23.8095 },
- { 9.18, 14.2857 },
- { 13.9419, 4.7619 },
- { 18.7038, 0 },
- { 23.4657, -9.5238 },
- { 23.4657, -19.0476 },
- { 18.7038, -28.5714 },
-};
-
-static const CoordRec char125_stroke2[] = {
- { 23.4657, 38.0952 },
- { 13.9419, 28.5714 },
- { 13.9419, 19.0476 },
- { 18.7038, 9.5238 },
- { 23.4657, 4.7619 },
- { 28.2276, -4.7619 },
- { 28.2276, -14.2857 },
- { 23.4657, -23.8095 },
- { 18.7038, -28.5714 },
- { 9.18, -33.3333 },
-};
-
-static const StrokeRec char125[] = {
- { 10, char125_stroke0 },
- { 17, char125_stroke1 },
- { 10, char125_stroke2 },
-};
-
-/* char: 126 '~' */
-
-static const CoordRec char126_stroke0[] = {
- { 2.92, 28.5714 },
- { 2.92, 38.0952 },
- { 7.6819, 52.381 },
- { 17.2057, 57.1429 },
- { 26.7295, 57.1429 },
- { 36.2533, 52.381 },
- { 55.301, 38.0952 },
- { 64.8248, 33.3333 },
- { 74.3486, 33.3333 },
- { 83.8724, 38.0952 },
- { 88.6343, 47.619 },
-};
-
-static const CoordRec char126_stroke1[] = {
- { 2.92, 38.0952 },
- { 7.6819, 47.619 },
- { 17.2057, 52.381 },
- { 26.7295, 52.381 },
- { 36.2533, 47.619 },
- { 55.301, 33.3333 },
- { 64.8248, 28.5714 },
- { 74.3486, 28.5714 },
- { 83.8724, 33.3333 },
- { 88.6343, 47.619 },
- { 88.6343, 57.1429 },
-};
-
-static const StrokeRec char126[] = {
- { 11, char126_stroke0 },
- { 11, char126_stroke1 },
-};
-
-/* char: 127 */
-
-static const CoordRec char127_stroke0[] = {
- { 52.381, 100 },
- { 14.2857, -33.3333 },
-};
-
-static const CoordRec char127_stroke1[] = {
- { 28.5714, 66.6667 },
- { 14.2857, 61.9048 },
- { 4.7619, 52.381 },
- { 0, 38.0952 },
- { 0, 23.8095 },
- { 4.7619, 14.2857 },
- { 14.2857, 4.7619 },
- { 28.5714, 0 },
- { 38.0952, 0 },
- { 52.381, 4.7619 },
- { 61.9048, 14.2857 },
- { 66.6667, 28.5714 },
- { 66.6667, 42.8571 },
- { 61.9048, 52.381 },
- { 52.381, 61.9048 },
- { 38.0952, 66.6667 },
- { 28.5714, 66.6667 },
-};
-
-static const StrokeRec char127[] = {
- { 2, char127_stroke0 },
- { 17, char127_stroke1 },
-};
-
-static const StrokeCharRec chars[] = {
- { 0, /* char0 */ 0, 0, 0 },
- { 0, /* char1 */ 0, 0, 0 },
- { 0, /* char2 */ 0, 0, 0 },
- { 0, /* char3 */ 0, 0, 0 },
- { 0, /* char4 */ 0, 0, 0 },
- { 0, /* char5 */ 0, 0, 0 },
- { 0, /* char6 */ 0, 0, 0 },
- { 0, /* char7 */ 0, 0, 0 },
- { 0, /* char8 */ 0, 0, 0 },
- { 0, /* char9 */ 0, 0, 0 },
- { 0, /* char10 */ 0, 0, 0 },
- { 0, /* char11 */ 0, 0, 0 },
- { 0, /* char12 */ 0, 0, 0 },
- { 0, /* char13 */ 0, 0, 0 },
- { 0, /* char14 */ 0, 0, 0 },
- { 0, /* char15 */ 0, 0, 0 },
- { 0, /* char16 */ 0, 0, 0 },
- { 0, /* char17 */ 0, 0, 0 },
- { 0, /* char18 */ 0, 0, 0 },
- { 0, /* char19 */ 0, 0, 0 },
- { 0, /* char20 */ 0, 0, 0 },
- { 0, /* char21 */ 0, 0, 0 },
- { 0, /* char22 */ 0, 0, 0 },
- { 0, /* char23 */ 0, 0, 0 },
- { 0, /* char24 */ 0, 0, 0 },
- { 0, /* char25 */ 0, 0, 0 },
- { 0, /* char26 */ 0, 0, 0 },
- { 0, /* char27 */ 0, 0, 0 },
- { 0, /* char28 */ 0, 0, 0 },
- { 0, /* char29 */ 0, 0, 0 },
- { 0, /* char30 */ 0, 0, 0 },
- { 0, /* char31 */ 0, 0, 0 },
- { 0, /* char32 */ 0, 35, 70 }, /* jwz: changed this to be 'n' width.
- (it was 52.381, 104.762) */
- { 2, char33, 13.3819, 26.6238 },
- { 2, char34, 23.0676, 51.4352 },
- { 4, char35, 36.5333, 79.4886 },
- { 3, char36, 38.1533, 76.2067 },
- { 3, char37, 49.2171, 96.5743 },
- { 1, char38, 53.599, 101.758 },
- { 1, char39, 4.44, 13.62 },
- { 1, char40, 21.8657, 47.1733 },
- { 1, char41, 24.3276, 47.5333 },
- { 3, char42, 30.7695, 59.439 },
- { 2, char43, 48.8371, 97.2543 },
- { 1, char44, 13.5219, 26.0638 },
- { 1, char45, 50.2371, 100.754 },
- { 1, char46, 13.1019, 26.4838 },
- { 1, char47, 40.5733, 82.1067 },
- { 1, char48, 38.3133, 77.0667 },
- { 1, char49, 30.8676, 66.5295 },
- { 1, char50, 38.7533, 77.6467 },
- { 1, char51, 38.3333, 77.0467 },
- { 2, char52, 37.2133, 80.1686 },
- { 1, char53, 38.1933, 77.6867 },
- { 1, char54, 34.1514, 73.8048 },
- { 2, char55, 38.8933, 77.2267 },
- { 1, char56, 38.9333, 77.6667 },
- { 1, char57, 39.9333, 74.0648 },
- { 2, char58, 14.0819, 26.2238 },
- { 2, char59, 12.9619, 26.3038 },
- { 1, char60, 41.1552, 81.6105 },
- { 2, char61, 48.5571, 97.2543 },
- { 1, char62, 40.8752, 81.6105 },
- { 2, char63, 36.9914, 73.9029 },
- { 2, char64, 34.9314, 74.3648 },
- { 3, char65, 40.5952, 80.4905 },
- { 3, char66, 44.7533, 83.6267 },
- { 1, char67, 39.9933, 84.4886 },
- { 2, char68, 45.2933, 85.2867 },
- { 4, char69, 39.9914, 78.1848 },
- { 3, char70, 39.9914, 78.7448 },
- { 2, char71, 40.3933, 89.7686 },
- { 3, char72, 44.7533, 89.0867 },
- { 1, char73, 10.86, 21.3 },
- { 1, char74, 31.0714, 59.999 },
- { 3, char75, 44.6133, 79.3267 },
- { 2, char76, 40.2514, 71.3229 },
- { 4, char77, 48.9552, 97.2105 },
- { 3, char78, 44.4733, 88.8067 },
- { 1, char79, 44.3352, 88.8305 },
- { 2, char80, 45.4333, 85.6667 },
- { 2, char81, 43.3952, 88.0905 },
- { 3, char82, 45.0133, 82.3667 },
- { 1, char83, 41.3333, 80.8267 },
- { 2, char84, 35.6933, 71.9467 },
- { 1, char85, 44.8733, 89.4867 },
- { 2, char86, 40.4552, 81.6105 },
- { 4, char87, 49.839, 100.518 },
- { 2, char88, 35.8333, 72.3667 },
- { 2, char89, 39.6152, 79.6505 },
- { 3, char90, 35.8333, 73.7467 },
- { 4, char91, 22.0657, 46.1133 },
- { 1, char92, 39.1733, 78.2067 },
- { 4, char93, 23.4876, 46.3933 },
- { 2, char94, 44.0752, 90.2305 },
- { 1, char95, 51.281, 104.062 },
- { 2, char96, 42.5457, 83.5714 },
- { 2, char97, 35.2514, 66.6029 },
- { 2, char98, 37.3314, 70.4629 },
- { 1, char99, 34.0914, 68.9229 },
- { 2, char100, 33.2114, 70.2629 },
- { 1, char101, 34.2914, 68.5229 },
- { 2, char102, 14.9657, 38.6552 },
- { 2, char103, 33.9314, 70.9829 },
- { 2, char104, 33.4095, 71.021 },
- { 2, char105, 14.7819, 28.8638 },
- { 2, char106, 17.3876, 36.2314 },
- { 3, char107, 33.4095, 62.521 },
- { 1, char108, 10.02, 19.34 },
- { 3, char109, 61.981, 123.962 },
- { 2, char110, 32.9895, 70.881 },
- { 1, char111, 33.5514, 71.7448 },
- { 2, char112, 38.0314, 70.8029 },
- { 2, char113, 33.4114, 70.7429 },
- { 2, char114, 23.7457, 49.4952 },
- { 1, char115, 28.5095, 62.321 },
- { 2, char116, 14.8257, 39.3152 },
- { 2, char117, 33.2695, 71.161 },
- { 2, char118, 30.3714, 60.6029 },
- { 4, char119, 40.5952, 80.4905 },
- { 2, char120, 25.4695, 56.401 },
- { 2, char121, 35.1333, 66.0648 },
- { 3, char122, 28.2495, 61.821 },
- { 3, char123, 21.6657, 41.6295 },
- { 1, char124, 11.54, 23.78 },
- { 3, char125, 18.7038, 41.4695 },
- { 2, char126, 45.7771, 91.2743 },
- { 2, char127, 33.3333, 66.6667 },
-};
-
-static
-StrokeFontRec glutStrokeRoman = { "Roman", 128, chars, 119.048, -33.3333 };
-
diff --git a/hacks/glx/glut_stroke.c b/hacks/glx/glut_stroke.c
deleted file mode 100644
index 42fd75a..0000000
--- a/hacks/glx/glut_stroke.c
+++ /dev/null
@@ -1,49 +0,0 @@
-
-/* Copyright (c) Mark J. Kilgard, 1994. */
-
-/* This program is freely distributable without licensing fees
- and is provided without guarantee or warrantee expressed or
- implied. This program is -not- in the public domain. */
-
-#if 0 /* for Mesa */
-# include "glutint.h"
-#else /* for xscreensaver */
-# include "screenhackI.h"
-# undef APIENTRY
-# define APIENTRY /**/
-#endif
-
-#include "glutstroke.h"
-
-void APIENTRY
-glutStrokeCharacter(GLUTstrokeFont font, int c)
-{
- const StrokeCharRec *ch;
- const StrokeRec *stroke;
- const CoordRec *coord;
- StrokeFontPtr fontinfo;
- int i, j;
-
-
-#if defined(_WIN32)
- fontinfo = (StrokeFontPtr) __glutFont(font);
-#else
- fontinfo = (StrokeFontPtr) font;
-#endif
-
- if (c < 0 || c >= fontinfo->num_chars)
- return;
- ch = &(fontinfo->ch[c]);
- if (ch) {
- for (i = ch->num_strokes, stroke = ch->stroke;
- i > 0; i--, stroke++) {
- glBegin(GL_LINE_STRIP);
- for (j = stroke->num_coords, coord = stroke->coord;
- j > 0; j--, coord++) {
- glVertex2f(coord->x, coord->y);
- }
- glEnd();
- }
- glTranslatef(ch->right, 0.0, 0.0);
- }
-}
diff --git a/hacks/glx/glut_swidth.c b/hacks/glx/glut_swidth.c
deleted file mode 100644
index 4da6105..0000000
--- a/hacks/glx/glut_swidth.c
+++ /dev/null
@@ -1,65 +0,0 @@
-
-/* Copyright (c) Mark J. Kilgard, 1995. */
-
-/* This program is freely distributable without licensing fees
- and is provided without guarantee or warrantee expressed or
- implied. This program is -not- in the public domain. */
-
-#if 0 /* for Mesa */
-# include "glutint.h"
-#else /* for xscreensaver */
-# include "screenhackI.h"
-# undef APIENTRY
-# define APIENTRY /**/
-#endif
-
-#include "glutstroke.h"
-
-/* CENTRY */
-int APIENTRY
-glutStrokeWidth(GLUTstrokeFont font, int c)
-{
- StrokeFontPtr fontinfo;
- const StrokeCharRec *ch;
-
-#if defined(_WIN32)
- fontinfo = (StrokeFontPtr) __glutFont(font);
-#else
- fontinfo = (StrokeFontPtr) font;
-#endif
-
- if (c < 0 || c >= fontinfo->num_chars)
- return 0;
- ch = &(fontinfo->ch[c]);
- if (ch)
- return ch->right;
- else
- return 0;
-}
-
-int APIENTRY
-glutStrokeLength(GLUTstrokeFont font, const unsigned char *string)
-{
- int c, length;
- StrokeFontPtr fontinfo;
- const StrokeCharRec *ch;
-
-#if defined(_WIN32)
- fontinfo = (StrokeFontPtr) __glutFont(font);
-#else
- fontinfo = (StrokeFontPtr) font;
-#endif
-
- length = 0;
- for (; *string != '\0'; string++) {
- c = *string;
- if (c >= 0 && c < fontinfo->num_chars) {
- ch = &(fontinfo->ch[c]);
- if (ch)
- length += ch->right;
- }
- }
- return length;
-}
-
-/* ENDCENTRY */
diff --git a/hacks/glx/glutstroke.h b/hacks/glx/glutstroke.h
deleted file mode 100644
index 43a645b..0000000
--- a/hacks/glx/glutstroke.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef __glutstroke_h__
-#define __glutstroke_h__
-
-/* Copyright (c) Mark J. Kilgard, 1994. */
-
-/* This program is freely distributable without licensing fees
- and is provided without guarantee or warrantee expressed or
- implied. This program is -not- in the public domain. */
-
-#if defined(_WIN32)
-#pragma warning (disable:4244) /* disable bogus conversion warnings */
-#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
-#endif
-
-typedef struct {
- float x;
- float y;
-} CoordRec, *CoordPtr;
-
-typedef struct {
- int num_coords;
- const CoordRec *coord;
-} StrokeRec, *StrokePtr;
-
-typedef struct {
- int num_strokes;
- const StrokeRec *stroke;
- float center;
- float right;
-} StrokeCharRec, *StrokeCharPtr;
-
-typedef struct {
- const char *name;
- int num_chars;
- const StrokeCharRec *ch;
- float top;
- float bottom;
-} StrokeFontRec, *StrokeFontPtr;
-
-typedef void *GLUTstrokeFont;
-
-/* for xscreensaver */
-extern void glutStrokeCharacter (GLUTstrokeFont font, int c);
-extern int glutStrokeWidth (GLUTstrokeFont font, int c);
-extern int glutStrokeLength (GLUTstrokeFont font, const unsigned char *string);
-
-#endif /* __glutstroke_h__ */
diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c
deleted file mode 100644
index 7675302..0000000
--- a/hacks/glx/grab-ximage.c
+++ /dev/null
@@ -1,1187 +0,0 @@
-/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001-2021 Jamie Zawinski <jwz@jwz.org>
- *
- * Modified by Richard Weeks <rtweeks21@gmail.com> Copyright (c) 2020
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include "xlockmoreI.h"
-#include "grab-ximage.h"
-#include "grabscreen.h"
-#include "pow2.h"
-#include "visual.h"
-#include "xshm.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-
-/* If REFORMAT_IMAGE_DATA is defined, then we convert Pixmaps to textures
- like this:
-
- - get Pixmap as an XImage in whatever form the server hands us;
- - convert that XImage to 32-bit RGBA in client-local endianness;
- - make the texture using RGBA, UNSIGNED_BYTE.
-
- If undefined, we do this:
-
- - get Pixmap as an XImage in whatever form the server hands us;
- - figure out what OpenGL texture packing parameters correspond to
- the image data that the server sent us and use that, e.g.,
- BGRA, INT_8_8_8_8_REV.
-
- You might expect the second method to be faster, since we're not making
- a second copy of the data and iterating each pixel before we hand it
- to GL. But, you'd be wrong. The first method is almost 6x faster.
- I guess GL is reformatting it *again*, and doing it very inefficiently!
-*/
-#define REFORMAT_IMAGE_DATA
-
-#undef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
-
-static int debug_p = 0;
-static double perf = 32768000.0; /* initially assume 2^19 pixels in 1/60/sec */
-
-static Bool
-bigendian (void)
-{
- union { int i; char c[sizeof(int)]; } u;
- u.i = 1;
- return !u.c[0];
-}
-
-#if defined(HAVE_IPHONE) || defined(HAVE_ANDROID)
-# undef GENERATE_MIPMAPS
-#else
-# define GENERATE_MIPMAPS
-#endif
-
-
-#ifdef REFORMAT_IMAGE_DATA
-
-/* Given a bitmask, returns the position and width of the field.
- */
-static void
-decode_mask (unsigned long mask, unsigned long *pos_ret,
- unsigned long *size_ret)
-{
- int i;
- for (i = 0; i < 32; i++)
- if (mask & (1L << i))
- {
- int j = 0;
- *pos_ret = i;
- for (; i < 32; i++, j++)
- if (! (mask & (1L << i)))
- break;
- *size_ret = j;
- return;
- }
-}
-
-
-/* Given a value and a field-width, expands the field to fill out 8 bits.
- */
-static unsigned char
-spread_bits (unsigned char value, unsigned char width)
-{
- switch (width)
- {
- case 8: return value;
- case 7: return (value << 1) | (value >> 6);
- case 6: return (value << 2) | (value >> 4);
- case 5: return (value << 3) | (value >> 2);
- case 4: return (value << 4) | (value);
- case 3: return (value << 5) | (value << 2) | (value >> 2);
- case 2: return (value << 6) | (value << 4) | (value);
- default: abort(); break;
- }
-}
-
-
-static XImage *
-convert_ximage_to_rgba32 (Screen *screen, XImage *image)
-{
- Display *dpy = DisplayOfScreen (screen);
- Visual *visual = DefaultVisualOfScreen (screen);
-
- int x, y;
- unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
- unsigned long srpos=0, sgpos=0, sbpos=0;
- unsigned long srmsk=0, sgmsk=0, sbmsk=0;
- unsigned long srsiz=0, sgsiz=0, sbsiz=0;
- XColor *colors = 0;
- unsigned char spread_map[3][256];
-
- /* Note: height+2 in "to" to work around an array bounds overrun
- in gluBuild2DMipmaps / gluScaleImage.
- */
- XImage *from = image;
- XImage *to = XCreateImage (dpy, visual, 32, /* depth */
- ZPixmap, 0, 0, from->width, from->height,
- 32, /* bitmap pad */
- 0);
- to->data = (char *) calloc (to->height + 2, to->bytes_per_line);
-
- /* Set the bit order in the XImage structure to whatever the
- local host's native bit order is.
- */
- to->bitmap_bit_order =
- to->byte_order =
- (bigendian() ? MSBFirst : LSBFirst);
-
- if (visual_class (screen, visual) == PseudoColor ||
- visual_class (screen, visual) == GrayScale)
- {
- Colormap cmap = DefaultColormapOfScreen (screen);
- int ncolors = visual_cells (screen, visual);
- int i;
- colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
- for (i = 0; i < ncolors; i++)
- colors[i].pixel = i;
- XQueryColors (dpy, cmap, colors, ncolors);
- }
-
- if (colors == 0) /* truecolor */
- {
- srmsk = to->red_mask;
- sgmsk = to->green_mask;
- sbmsk = to->blue_mask;
-
- decode_mask (srmsk, &srpos, &srsiz);
- decode_mask (sgmsk, &sgpos, &sgsiz);
- decode_mask (sbmsk, &sbpos, &sbsiz);
- }
-
- /* Pack things in "RGBA" order in client endianness. */
- if (bigendian())
- crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
- else
- crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
-
- if (colors == 0) /* truecolor */
- {
- int i;
- for (i = 0; i < 256; i++)
- {
- spread_map[0][i] = spread_bits (i, srsiz);
- spread_map[1][i] = spread_bits (i, sgsiz);
- spread_map[2][i] = spread_bits (i, sbsiz);
- }
- }
-
- /* trying to track down an intermittent crash in ximage_putpixel_32 */
- if (to->width < from->width) abort();
- if (to->height < from->height) abort();
-
- for (y = 0; y < from->height; y++)
- for (x = 0; x < from->width; x++)
- {
- unsigned long sp = XGetPixel (from, x, y);
- unsigned char sr, sg, sb;
- unsigned long cp;
-
- if (colors)
- {
- sr = colors[sp].red & 0xFF;
- sg = colors[sp].green & 0xFF;
- sb = colors[sp].blue & 0xFF;
- }
- else
- {
- sr = (sp & srmsk) >> srpos;
- sg = (sp & sgmsk) >> sgpos;
- sb = (sp & sbmsk) >> sbpos;
-
- sr = spread_map[0][sr];
- sg = spread_map[1][sg];
- sb = spread_map[2][sb];
- }
-
- cp = ((sr << crpos) |
- (sg << cgpos) |
- (sb << cbpos) |
- (0xFF << capos));
-
- XPutPixel (to, x, y, cp);
- }
-
- if (colors) free (colors);
-
- return to;
-}
-
-#endif /* REFORMAT_IMAGE_DATA */
-
-/* Shrinks the XImage by a factor of two.
- We use this when mipmapping fails on large textures.
- */
-static void
-halve_image (XImage *ximage, XRectangle *geom)
-{
- int w2 = ximage->width/2;
- int h2 = ximage->height/2;
- int x, y;
- XImage *ximage2;
-
- if (w2 <= 32 || h2 <= 32) /* let's not go crazy here, man. */
- return;
-
- if (debug_p)
- fprintf (stderr, "%s: shrinking image %dx%d -> %dx%d\n",
- progname, ximage->width, ximage->height, w2, h2);
-
- ximage2 = (XImage *) calloc (1, sizeof (*ximage2));
- *ximage2 = *ximage;
- ximage2->width = w2;
- ximage2->height = h2;
- ximage2->bytes_per_line = 0;
- ximage2->data = 0;
- XInitImage (ximage2);
-
- ximage2->data = (char *) calloc (h2, ximage2->bytes_per_line);
- if (!ximage2->data)
- {
- fprintf (stderr, "%s: out of memory (scaling %dx%d image to %dx%d)\n",
- progname, ximage->width, ximage->height, w2, h2);
- exit (1);
- }
-
- for (y = 0; y < h2; y++)
- for (x = 0; x < w2; x++)
- XPutPixel (ximage2, x, y, XGetPixel (ximage, x*2, y*2));
-
- free (ximage->data);
- *ximage = *ximage2;
- ximage2->data = 0;
- XFree (ximage2);
-
- if (geom)
- {
- geom->x /= 2;
- geom->y /= 2;
- geom->width /= 2;
- geom->height /= 2;
- }
-}
-
-
-#ifdef REFORMAT_IMAGE_DATA
-
-/* Pulls the Pixmap bits from the server and returns an XImage
- in some format acceptable to OpenGL.
- */
-static XImage *
-pixmap_to_gl_ximage (Screen *screen, Window window, Pixmap pixmap)
-{
- Display *dpy = DisplayOfScreen (screen);
- Visual *visual = DefaultVisualOfScreen (screen);
- unsigned int width, height, depth;
-
- XShmSegmentInfo shm_info;
-
- XImage *server_ximage = 0;
- XImage *client_ximage = 0;
-
- {
- Window root;
- int x, y;
- unsigned int bw;
- XGetGeometry (dpy, pixmap, &root, &x, &y, &width, &height, &bw, &depth);
- }
-
- if (width < 5 || height < 5) /* something's gone wrong somewhere... */
- return 0;
-
- /* Convert the server-side Pixmap to a client-side GL-ordered XImage.
- */
- server_ximage = create_xshm_image (dpy, visual, depth, ZPixmap, &shm_info,
- width, height);
- get_xshm_image (dpy, pixmap, server_ximage, 0, 0, ~0L, &shm_info);
-
- client_ximage = convert_ximage_to_rgba32 (screen, server_ximage);
-
- destroy_xshm_image (dpy, server_ximage, &shm_info);
-
- return client_ximage;
-}
-
-
-# else /* ! REFORMAT_IMAGE_DATA */
-
-typedef struct {
- unsigned int depth, red_mask, green_mask, blue_mask; /* when this... */
- GLint type, format; /* ...use this. */
-} conversion_table;
-
-/* Abbreviate these so that the table entries all fit on one line...
- */
-#define BYTE GL_UNSIGNED_BYTE
-#define BYTE_2_3_3_REV GL_UNSIGNED_BYTE_2_3_3_REV
-#define BYTE_3_3_2 GL_UNSIGNED_BYTE_3_3_2
-#define INT_10_10_10_2 GL_UNSIGNED_INT_10_10_10_2
-#define INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV
-#define INT_8_8_8_8 GL_UNSIGNED_INT_8_8_8_8
-#define INT_8_8_8_8_REV GL_UNSIGNED_INT_8_8_8_8_REV
-#define SHORT_1_5_5_5_REV GL_UNSIGNED_SHORT_1_5_5_5_REV
-#define SHORT_4_4_4_4 GL_UNSIGNED_SHORT_4_4_4_4
-#define SHORT_4_4_4_4_REV GL_UNSIGNED_SHORT_4_4_4_4_REV
-#define SHORT_5_5_5_1 GL_UNSIGNED_SHORT_5_5_5_1
-#define SHORT_5_6_5 GL_UNSIGNED_SHORT_5_6_5
-#define SHORT_5_6_5_REV GL_UNSIGNED_SHORT_5_6_5_REV
-
-static const conversion_table ctable[] = {
- { 8, 0x000000E0, 0x0000001C, 0x00000003, BYTE_3_3_2, GL_RGB },
- { 8, 0x00000007, 0x00000038, 0x000000C0, BYTE_2_3_3_REV, GL_RGB },
- { 16, 0x0000F800, 0x000007E0, 0x0000001F, SHORT_5_6_5, GL_RGB },
- { 16, 0x0000001F, 0x000007E0, 0x0000F800, SHORT_5_6_5_REV, GL_RGB },
- { 16, 0x0000F000, 0x00000F00, 0x000000F0, SHORT_4_4_4_4, GL_RGBA },
- { 16, 0x000000F0, 0x00000F00, 0x0000F000, SHORT_4_4_4_4, GL_BGRA },
- { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4, GL_ABGR_EXT },
- { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4_REV, GL_RGBA },
- { 16, 0x00000F00, 0x000000F0, 0x0000000F, SHORT_4_4_4_4_REV, GL_BGRA },
- { 16, 0x0000F800, 0x000007C0, 0x0000003E, SHORT_5_5_5_1, GL_RGBA },
- { 16, 0x0000003E, 0x000007C0, 0x0000F800, SHORT_5_5_5_1, GL_BGRA },
- { 16, 0x00000001, 0x0000003E, 0x000007C0, SHORT_5_5_5_1, GL_ABGR_EXT },
- { 16, 0x0000001F, 0x000003E0, 0x00007C00, SHORT_1_5_5_5_REV, GL_RGBA },
- { 16, 0x00007C00, 0x000003E0, 0x0000001F, SHORT_1_5_5_5_REV, GL_BGRA },
- { 32, 0xFF000000, 0x00FF0000, 0x0000FF00, INT_8_8_8_8, GL_RGBA },
- { 32, 0x0000FF00, 0x00FF0000, 0xFF000000, INT_8_8_8_8, GL_BGRA },
- { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8, GL_ABGR_EXT },
- { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8_REV, GL_RGBA },
- { 32, 0x00FF0000, 0x0000FF00, 0x000000FF, INT_8_8_8_8_REV, GL_BGRA },
- { 32, 0xFFC00000, 0x003FF000, 0x00000FFC, INT_10_10_10_2, GL_RGBA },
- { 32, 0x00000FFC, 0x003FF000, 0xFFC00000, INT_10_10_10_2, GL_BGRA },
- { 32, 0x00000003, 0x00000FFC, 0x003FF000, INT_10_10_10_2, GL_ABGR_EXT },
- { 32, 0x000003FF, 0x000FFC00, 0x3FF00000, INT_2_10_10_10_REV, GL_RGBA },
- { 32, 0x3FF00000, 0x000FFC00, 0x000003FF, INT_2_10_10_10_REV, GL_BGRA },
- { 24, 0x000000FF, 0x0000FF00, 0x00FF0000, BYTE, GL_RGB },
- { 24, 0x00FF0000, 0x0000FF00, 0x000000FF, BYTE, GL_BGR },
-};
-
-
-/* Given an XImage, returns the GL settings to use its data as a texture.
- */
-static void
-gl_settings_for_ximage (XImage *image,
- GLint *type_ret, GLint *format_ret, GLint *swap_ret)
-{
- int i;
- for (i = 0; i < countof(ctable); ++i)
- {
- if (image->bits_per_pixel == ctable[i].depth &&
- image->red_mask == ctable[i].red_mask &&
- image->green_mask == ctable[i].green_mask &&
- image->blue_mask == ctable[i].blue_mask)
- {
- *type_ret = ctable[i].type;
- *format_ret = ctable[i].format;
-
- if (image->bits_per_pixel == 24)
- {
- /* don't know how to test this... */
- *type_ret = (ctable[i].type == GL_RGB) ? GL_BGR : GL_RGB;
- *swap_ret = 0;
- }
- else
- {
- *swap_ret = !!(image->byte_order == MSBFirst) ^ !!bigendian();
- }
-
- if (debug_p)
- {
- fprintf (stderr, "%s: using %s %s %d for %d %08lX %08lX %08lX\n",
- progname,
- (*format_ret == GL_RGB ? "RGB" :
- *format_ret == GL_BGR ? "BGR" :
- *format_ret == GL_RGBA ? "RGBA" :
- *format_ret == GL_BGRA ? "BGRA" :
- *format_ret == GL_ABGR_EXT ? "ABGR_EXT" :
- "???"),
- (*type_ret == BYTE ? "BYTE" :
- *type_ret == BYTE_3_3_2 ? "BYTE_3_3_2" :
- *type_ret == BYTE_2_3_3_REV ? "BYTE_2_3_3_REV" :
- *type_ret == INT_8_8_8_8 ? "INT_8_8_8_8" :
- *type_ret == INT_8_8_8_8_REV ? "INT_8_8_8_8_REV" :
- *type_ret == INT_10_10_10_2 ? "INT_10_10_10_2" :
- *type_ret == INT_2_10_10_10_REV ? "INT_2_10_10_10_REV":
- *type_ret == SHORT_4_4_4_4 ? "SHORT_4_4_4_4" :
- *type_ret == SHORT_4_4_4_4_REV ? "SHORT_4_4_4_4_REV" :
- *type_ret == SHORT_5_5_5_1 ? "SHORT_5_5_5_1" :
- *type_ret == SHORT_1_5_5_5_REV ? "SHORT_1_5_5_5_REV" :
- *type_ret == SHORT_5_6_5 ? "SHORT_5_6_5" :
- *type_ret == SHORT_5_6_5_REV ? "SHORT_5_6_5_REV" :
- "???"),
- *swap_ret,
- image->bits_per_pixel,
- image->red_mask, image->green_mask, image->blue_mask);
- }
-
- return;
- }
- }
-
- /* Unknown RGB fields? */
- abort();
-}
-
-#endif /* ! REFORMAT_IMAGE_DATA */
-
-typedef struct {
- GLXContext glx_context;
- Pixmap pixmap;
- int pix_width, pix_height, pix_depth;
- int texid;
- Bool mipmap_p;
- double load_time;
-
- /* Used in async mode
- */
- void (*callback) (const char *filename, XRectangle *geometry,
- int iw, int ih, int tw, int th,
- void *closure);
- void *closure;
-
- /* Used in sync mode
- */
- char **filename_return;
- XRectangle *geometry_return;
- int *image_width_return;
- int *image_height_return;
- int *texture_width_return;
- int *texture_height_return;
-
-} img_closure;
-
-typedef enum { TLP_LOADING = 0, TLP_IMPORTING, TLP_COMPLETE, TLP_ERROR } texture_loader_phase;
-struct texture_loader_t {
- texture_loader_phase phase;
- Screen *screen;
- Window window;
- XShmSegmentInfo shm_info;
- XImage *ximage;
- img_closure load_closure;
- Bool pixmap_valid_p;
- int img_width, img_height, tex_width, tex_height;
- XRectangle geometry;
- int y;
- unsigned int stripe_height;
- char *name;
-
- /* debugging */
- int steps; /* number of calls to step_texture_loader() that loaded part of the texture */
- int stripes; /* number of stripes put into the texture so far */
- double loaded_time, work_seconds;
-};
-
-
-/* Returns the current time in seconds as a double.
- */
-static double
-double_time (void)
-{
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- return (now.tv_sec + ((double) now.tv_usec * 0.000001));
-}
-
-
-/* Loads the given XImage into GL's texture memory.
- The image may be of any size.
- If mipmap_p is true, then make mipmaps instead of just a single texture.
- Writes to stderr and returns False on error.
- */
-static Bool
-ximage_to_texture (XImage *ximage,
- GLint type, GLint format,
- int *width_return,
- int *height_return,
- XRectangle *geometry,
- Bool mipmap_p)
-{
- int max_reduction = 7;
- int err_count = 0;
- GLenum err = 0;
- int orig_width = ximage->width;
- int orig_height = ximage->height;
- GLsizei tex_width = 0;
- GLsizei tex_height = 0;
-
- AGAIN:
-
- if (mipmap_p)
- {
- /* gluBuild2DMipmaps doesn't require textures to be a power of 2. */
- tex_width = ximage->width;
- tex_height = ximage->height;
-
- if (debug_p)
- fprintf (stderr, "%s: mipmap %d x %d\n",
- progname, ximage->width, ximage->height);
-
- gluBuild2DMipmaps (GL_TEXTURE_2D, 3, ximage->width, ximage->height,
- format, type, ximage->data);
- err = glGetError();
- }
- else
- {
- /* glTexImage2D() requires the texture sizes to be powers of 2.
- So first, create a texture of that size (but don't write any
- data into it.)
- */
- tex_width = (GLsizei) to_pow2 (ximage->width);
- tex_height = (GLsizei) to_pow2 (ximage->height);
-
- if (debug_p)
- fprintf (stderr, "%s: texture %d x %d (%d x %d)\n",
- progname, ximage->width, ximage->height,
- tex_width, tex_height);
-
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0,
- format, type, 0);
- err = glGetError();
-
- /* Now load our non-power-of-2 image data into the existing texture. */
- if (!err)
- {
- glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0,
- ximage->width, ximage->height,
- GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
- err = glGetError();
- }
- }
-
- if (err)
- {
- char buf[100];
- const char *s = (char *) gluErrorString (err);
-
- if (!s || !*s)
- {
- sprintf (buf, "unknown error %d", (int) err);
- s = buf;
- }
-
- while (glGetError() != GL_NO_ERROR)
- ; /* clear any lingering errors */
-
- if (++err_count > max_reduction)
- {
- fprintf (stderr,
- "\n"
- "%s: %dx%d texture failed, even after reducing to %dx%d:\n"
- "%s: The error was: \"%s\".\n"
- "%s: probably this means "
- "\"your video card is worthless and weak\"?\n\n",
- progname, orig_width, orig_height,
- ximage->width, ximage->height,
- progname, s,
- progname);
- return False;
- }
- else
- {
- if (debug_p)
- fprintf (stderr, "%s: mipmap error (%dx%d): %s\n",
- progname, ximage->width, ximage->height, s);
- halve_image (ximage, geometry);
- goto AGAIN;
- }
- }
-
- if (width_return) *width_return = tex_width;
- if (height_return) *height_return = tex_height;
- return True;
-}
-
-
-static void load_texture_async_cb (Screen *screen,
- Window window, Drawable drawable,
- const char *name, XRectangle *geometry,
- void *closure);
-
-
-/* Grabs an image of the desktop (or another random image file) and
- loads the image into GL's texture memory.
- When the callback is called, the image data will have been loaded
- into texture number `texid' (via glBindTexture.)
-
- If an error occurred, width/height will be 0.
- */
-void
-load_texture_async (Screen *screen, Window window,
- GLXContext glx_context,
- int desired_width, int desired_height,
- Bool mipmap_p,
- GLuint texid,
- void (*callback) (const char *filename,
- XRectangle *geometry,
- int image_width,
- int image_height,
- int texture_width,
- int texture_height,
- void *closure),
- void *closure)
-{
- Display *dpy = DisplayOfScreen (screen);
- XWindowAttributes xgwa;
- img_closure *data = (img_closure *) calloc (1, sizeof(*data));
-
- if (debug_p)
- data->load_time = double_time();
-
- data->texid = texid;
- data->mipmap_p = mipmap_p;
- data->glx_context = glx_context;
- data->callback = callback;
- data->closure = closure;
-
- XGetWindowAttributes (dpy, window, &xgwa);
- data->pix_width = xgwa.width;
- data->pix_height = xgwa.height;
- data->pix_depth = xgwa.depth;
-
- /* Allow the pixmap to be larger than the window. Esper wants this. */
- if (desired_width /* && desired_width < xgwa.width */)
- data->pix_width = desired_width;
- if (desired_height /* && desired_height < xgwa.height */)
- data->pix_height = desired_height;
-
- data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
- data->pix_depth);
- load_image_async (screen, window, data->pixmap,
- load_texture_async_cb, data);
-}
-
-
-static void incremental_load_texture_async_cb (Screen *screen,
- Window window,
- Drawable drawable,
- const char *name,
- XRectangle *geometry,
- void *closure);
-
-
-/* Allocate a texture loader to grab the image of a Window and load the image
- into GL's texture memory.
-
- The returned texture loader should be stepped with step_texture_loader
- until that function calls the callback function passed to it.
- */
-texture_loader_t*
-alloc_texture_loader (Screen *screen, Window window,
- GLXContext glx_context,
- int desired_width, int desired_height,
- Bool mipmap_p,
- GLuint texid)
-{
- texture_loader_t *loader = (texture_loader_t*) calloc (1, sizeof(*loader));
- Display *dpy = DisplayOfScreen (screen);
- XWindowAttributes xgwa;
- img_closure *data = &loader->load_closure;
-
- if (debug_p)
- data->load_time = double_time();
-
- data->texid = texid;
- data->mipmap_p = mipmap_p;
- data->glx_context = glx_context;
- loader->screen = screen;
- loader->window = window;
-
- XGetWindowAttributes (dpy, window, &xgwa);
- data->pix_width = xgwa.width;
- data->pix_height = xgwa.height;
- data->pix_depth = xgwa.depth;
-
- /* Allow the pixmap to be larger than the window. Esper wants this. */
- if (desired_width /* && desired_width < xgwa.width */)
- data->pix_width = desired_width;
- if (desired_height /* && desired_height < xgwa.height */)
- data->pix_height = desired_height;
-
- data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
- data->pix_depth);
- loader->pixmap_valid_p = True;
- load_image_async (screen, window, data->pixmap,
- incremental_load_texture_async_cb, loader);
-
- return loader;
-}
-
-
-/* Free the texture loader
- */
-void
-free_texture_loader (texture_loader_t *loader)
-{
- Display *dpy = DisplayOfScreen(loader->screen);
-
- /* If the loader is still awaiting asynchronous completion of loading the
- XImage, there is no way to recover from this request.
- */
- if (loader->phase == TLP_LOADING)
- abort();
-
- if (loader->ximage)
- {
- XImage *ximage = loader->ximage;
- loader->ximage = 0;
- destroy_xshm_image (dpy, ximage, &loader->shm_info);
- }
-
- if (loader->pixmap_valid_p)
- {
- loader->pixmap_valid_p = False;
- XFreePixmap (dpy, loader->load_closure.pixmap);
- }
-
- free ((char *) loader->name);
- loader->name = 0;
-
- free (loader);
-}
-
-
-/* Once we have an XImage, this loads it into GL.
- This is used in both synchronous and asynchronous mode.
- */
-static void
-load_texture_async_cb (Screen *screen, Window window, Drawable drawable,
- const char *name, XRectangle *geometry, void *closure)
-{
- Display *dpy = DisplayOfScreen (screen);
- Bool ok;
- XImage *ximage;
- GLint type, format;
- int iw=0, ih=0, tw=0, th=0;
- double cvt_time=0, tex_time=0, done_time=0;
- img_closure *data = (img_closure *) closure;
- /* copy closure data to stack and free the original before running cb */
- img_closure dd = *data;
- memset (data, 0, sizeof (*data));
- free (data);
- data = 0;
-
- if (dd.glx_context)
- glXMakeCurrent (dpy, window, dd.glx_context);
-
- if (geometry->width <= 0 || geometry->height <= 0)
- {
- /* This can happen if an old version of xscreensaver-getimage
- is installed. Or if we have no image (checkerboard). */
- geometry->x = 0;
- geometry->y = 0;
- geometry->width = dd.pix_width;
- geometry->height = dd.pix_height;
- }
-
- if (geometry->width <= 0 || geometry->height <= 0)
- abort();
-
- if (debug_p)
- cvt_time = double_time();
-
-# ifdef REFORMAT_IMAGE_DATA
- ximage = pixmap_to_gl_ximage (screen, window, dd.pixmap);
- format = GL_RGBA;
- type = GL_UNSIGNED_BYTE;
-
-#else /* ! REFORMAT_IMAGE_DATA */
- {
- Visual *visual = DefaultVisualOfScreen (screen);
- GLint swap;
-
- ximage = XCreateImage (dpy, visual, dd.pix_depth, ZPixmap, 0, 0,
- dd.pix_width, dd.pix_height, 32, 0);
-
- /* Note: height+2 in "to" to be to work around an array bounds overrun
- in gluBuild2DMipmaps / gluScaleImage. */
- ximage->data = (char *) calloc (ximage->height+2, ximage->bytes_per_line);
-
- if (!ximage->data ||
- !XGetSubImage (dpy, dd.pixmap, 0, 0, ximage->width, ximage->height,
- ~0L, ximage->format, ximage, 0, 0))
- {
- XDestroyImage (ximage);
- ximage = 0;
- }
-
- gl_settings_for_ximage (ximage, &type, &format, &swap);
- glPixelStorei (GL_UNPACK_SWAP_BYTES, !swap);
- }
-#endif /* REFORMAT_IMAGE_DATA */
-
- XFreePixmap (dpy, dd.pixmap);
- dd.pixmap = 0;
-
- if (debug_p)
- tex_time = double_time();
-
- if (! ximage)
- ok = False;
- else
- {
- iw = ximage->width;
- ih = ximage->height;
- if (dd.texid != -1)
- glBindTexture (GL_TEXTURE_2D, dd.texid);
-
- glPixelStorei (GL_UNPACK_ALIGNMENT, ximage->bitmap_pad / 8);
- ok = ximage_to_texture (ximage, type, format, &tw, &th, geometry,
- dd.mipmap_p);
- if (ok)
- {
- iw = ximage->width; /* in case the image was shrunk */
- ih = ximage->height;
- }
- }
-
- if (ximage) XDestroyImage (ximage);
-
- if (! ok)
- iw = ih = tw = th = 0;
-
- if (debug_p)
- done_time = double_time();
-
- if (debug_p)
- fprintf (stderr,
- /* prints: A + B + C = D
- A = file I/O time (happens in background)
- B = time to pull bits from server (this process)
- C = time to convert bits to GL textures (this process)
- D = total elapsed time from "want image" to "see image"
-
- B+C is responsible for any frame-rate glitches.
- */
- "%s: loading elapsed: %.2f + %.2f + %.2f = %.2f sec\n",
- progname,
- cvt_time - dd.load_time,
- tex_time - cvt_time,
- done_time - tex_time,
- done_time - dd.load_time);
-
- if (dd.callback)
- /* asynchronous mode */
- dd.callback (name, geometry, iw, ih, tw, th, dd.closure);
- else
- {
- /* synchronous mode */
- if (dd.filename_return) *dd.filename_return = (char *) name;
- if (dd.geometry_return) *dd.geometry_return = *geometry;
- if (dd.image_width_return) *dd.image_width_return = iw;
- if (dd.image_height_return) *dd.image_height_return = ih;
- if (dd.texture_width_return) *dd.texture_width_return = tw;
- if (dd.texture_height_return) *dd.texture_height_return = th;
- }
-}
-
-
-/* Once we have a pixmap, this sets us up to step-load it into a GL texture.
- */
-static void
-incremental_load_texture_async_cb (Screen *screen, Window window,
- Drawable drawable, const char *name,
- XRectangle *geometry,
- void *closure)
-{
- texture_loader_t *loader = (texture_loader_t *) closure;
- Display *dpy = DisplayOfScreen (screen);
- img_closure dd = loader->load_closure;
- GLenum err = 0;
- GLsizei tex_width = 0, tex_height = 0;
-
- loader->load_closure.texid = dd.texid;
- loader->phase = TLP_IMPORTING;
-
- if (debug_p)
- loader->loaded_time = double_time();
-
- /* Like load_texture_async_cb() until it calls pixmap_to_gl_ximage() */
-
- if (dd.glx_context)
- glXMakeCurrent (dpy, window, dd.glx_context);
-
- if (geometry->width <= 0 || geometry->height <= 0)
- {
- geometry->x = 0;
- geometry->y = 0;
- geometry->width = dd.pix_width;
- geometry->height = dd.pix_height;
- }
-
- if (geometry->width <= 0 || geometry->height <= 0)
- abort();
-
- loader->geometry = *geometry;
-
- /* Like pixmap_to_gl_ximage(): */
- {
- Visual *visual = DefaultVisualOfScreen (screen);
- unsigned int width, height, depth;
-
- {
- Window root;
- int x, y;
- unsigned int bw;
- XGetGeometry (dpy, dd.pixmap, &root, &x, &y, &width, &height, &bw, &depth);
- }
-
- if (width < 5 || height < 5)
- {
- loader->phase = TLP_ERROR;
- return;
- }
-
- loader->ximage = create_xshm_image (dpy, visual, depth, ZPixmap,
- &loader->shm_info, width, height);
-
- get_xshm_image (dpy, dd.pixmap, loader->ximage, 0, 0, ~0L, &loader->shm_info);
- }
-
- loader->img_width = loader->ximage->width;
- loader->img_height = loader->ximage->height;
- loader->stripe_height = (1 << 19) / loader->img_width;
- if (dd.texid != -1)
- glBindTexture (GL_TEXTURE_2D, dd.texid);
-
- /* as much of ximage_to_texture() functionality as we can precompute */
- tex_width = (GLsizei) to_pow2 (loader->ximage->width);
- tex_height = (GLsizei) to_pow2 (loader->ximage->height);
-
- /* glTexImage2D() to allocate OpenGL texture */
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, 0);
- err = glGetError();
-
- if (err)
- {
- loader->phase = TLP_ERROR;
- loader->img_width = loader->img_height = 0;
- return;
- }
-
- /* Capture texture dimensions and name in loader */
- loader->tex_width = tex_width;
- loader->tex_height = tex_height;
- loader->name = name ? strdup(name) : 0;
-}
-
-
-static void
-advance_texture_loader (texture_loader_t *loader, double allowed_seconds);
-static void
-complete_texture_load (texture_loader_t *loader,
- void (*callback) (const char *filename,
- XRectangle *geometry,
- int image_width,
- int image_height,
- int texture_width,
- int texture_height,
- void *closure),
- void *closure);
-
-
-void
-step_texture_loader (texture_loader_t *loader, double allowed_seconds,
- void (*callback) (const char *filename,
- XRectangle *geometry,
- int image_width,
- int image_height,
- int texture_width,
- int texture_height,
- void *closure),
- void *closure)
-{
- if (loader->phase != TLP_IMPORTING)
- return;
-
- if (loader->y < loader->ximage->height)
- {
- loader->steps++;
- if (loader->steps == 1)
- /* Initial tune on the loader for the number of allowed_seconds */
- loader->stripe_height = ((unsigned int) (perf * allowed_seconds / loader->ximage->width)) / 8 + 1;
- else
- advance_texture_loader (loader, allowed_seconds);
- }
- else
- {
- loader->phase = TLP_COMPLETE;
- complete_texture_load (loader, callback, closure);
- }
-}
-
-
-static unsigned int
-texture_loader_next_stripe_height (texture_loader_t *loader)
-{
- if (loader->y + loader->stripe_height <= loader->img_height)
- return loader->stripe_height;
- else
- return loader->img_height - loader->y;
-}
-
-
-static void
-advance_texture_loader (texture_loader_t *loader, double allowed_seconds)
-{
- Display *dpy = loader->screen ? DisplayOfScreen (loader->screen) : 0;
- double start_time = double_time(), elapsed_seconds = 0;
- double step_end = start_time + allowed_seconds;
- int iter_count = 0;
- unsigned int lines_processed = 0;
-
- if (loader->load_closure.glx_context)
- glXMakeCurrent (dpy, loader->window, loader->load_closure.glx_context);
-
- for (
- ;
- (double_time() < step_end) && (loader->y < loader->img_height);
- loader->y += loader->stripe_height, ++iter_count
- )
- {
- /*
- * Use XSubImage() to extract a section of the shared image
- loader->stripe_height tall
- * Use convert_ximage_to_rgba32() to convert that to the desired format
- * Use XDestroyImage() to free the extracted section of the shared image
- * glBindTexture(GL_TEXTURE_2D, loader->load_closure.texid)
- * Import the data to the next stripe of the texture with glTexSubImage2D()
- * XDestroyImage() to destroy the converted image
- * Increment loader->y by loader->stripe_height
- */
- unsigned int patch_height = texture_loader_next_stripe_height (loader);
- XImage* patch = XSubImage (loader->ximage,
- 0, loader->y,
- loader->img_width, patch_height);
- XImage* cvt_patch = convert_ximage_to_rgba32 (loader->screen, patch);
- Bool use_old_mipmap_p = False;
-# ifdef GENERATE_MIPMAPS
- use_old_mipmap_p = (loader->load_closure.mipmap_p &&
- (loader->y + loader->stripe_height >=
- loader->ximage->height));
-# endif
-
- loader->stripes++;
-
- XDestroyImage (patch);
-
- glBindTexture (GL_TEXTURE_2D, loader->load_closure.texid);
- glPixelStorei (GL_UNPACK_ALIGNMENT, cvt_patch->bitmap_pad / 8);
-
- if (use_old_mipmap_p)
- /* Use old GL_GENERATE_MIPMAP (if before OpenGL 3.0) */
- glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
-
- /* CHECK: loader->y or -loader->y? */
- glTexSubImage2D (GL_TEXTURE_2D, 0, 0, loader->y,
- cvt_patch->width, cvt_patch->height,
- GL_RGBA, GL_UNSIGNED_BYTE, cvt_patch->data);
-
- if (use_old_mipmap_p)
- /* Turn off GL_GENERATE_MIPMAP if we turned it on */
- glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
-
- XDestroyImage (cvt_patch);
-
- lines_processed += patch_height;
- }
-
- if (iter_count == 1 && loader->y < loader->img_height && loader->stripe_height > 1)
- {
- loader->stripe_height >>= 1;
- }
-
- elapsed_seconds = double_time() - start_time;
- /* monitor perf for use setting the next initial stripe_height (px/s) */
- if (elapsed_seconds > 0.001)
- {
- perf = lines_processed * (double) loader->ximage->width / elapsed_seconds;
- if (perf > 2e8)
- perf = 2e8;
- else if (perf < 1e6)
- perf = 1e6;
- }
-
- if (debug_p)
- loader->work_seconds += elapsed_seconds;
-}
-
-
-static void
-complete_texture_load (texture_loader_t *loader,
- void (*callback) (const char *filename,
- XRectangle *geometry,
- int image_width,
- int image_height,
- int texture_width,
- int texture_height,
- void *closure),
- void *closure)
-{
- XImage *ximage = loader->ximage;
- Display *dpy = loader->screen ? DisplayOfScreen (loader->screen) : 0;
- char *name = loader->name;
- XRectangle geometry = loader->geometry;
-
- loader->name = 0;
-
- if (loader->load_closure.glx_context)
- glXMakeCurrent (dpy, loader->window, loader->load_closure.glx_context);
-
- loader->ximage = 0;
- destroy_xshm_image (dpy, ximage, &loader->shm_info);
-
- loader->pixmap_valid_p = False;
- XFreePixmap (dpy, loader->load_closure.pixmap);
-
- if (loader->load_closure.mipmap_p)
- {
- glBindTexture (GL_TEXTURE_2D, loader->load_closure.texid);
-# ifdef GENERATE_MIPMAPS
- glGenerateMipmap (GL_TEXTURE_2D);
-# endif
- }
-
- if (debug_p)
- {
- double done_time = double_time();
- fprintf (stderr,
- "%s: texture loading: [load %.2f sec] [import %.2f sec, %d stripes, %d steps] [elapsed %2.f sec]\n",
- progname,
- loader->loaded_time - loader->load_closure.load_time,
- loader->work_seconds,
- loader->stripes,
- loader->steps,
- done_time - loader->load_closure.load_time);
- }
-
- callback (name, &geometry,
- loader->img_width, loader->img_height,
- loader->tex_width, loader->tex_height,
- closure);
-
- free (name);
-}
-
-Bool texture_loader_failed (texture_loader_t *loader)
-{
- return loader->phase == TLP_ERROR;
-}
diff --git a/hacks/glx/grab-ximage.h b/hacks/glx/grab-ximage.h
deleted file mode 100644
index 22e51d2..0000000
--- a/hacks/glx/grab-ximage.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001-2006 Jamie Zawinski <jwz@jwz.org>
- *
- * Modified by Richard Weeks <rtweeks21@gmail.com> Copyright (c) 2020
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#ifndef __GRAB_XIMAGE_H__
-#define __GRAB_XIMAGE_H__
-
-/* Grabs an image of the desktop (or another random image file) and
- loads the image into GL's texture memory. Most of the work is done
- in the background; when the image has been loaded, a callback is run.
-
- As a side-effect, that image *may* be painted onto the given Window.
-
- If mipmap_p is true, then make mipmaps instead of just a single texture.
-
- If desired_width/height are non-zero, then (if possible) the image
- will be scaled to fit in that rectangle. If they are 0, then the size
- of the window is used. These parameters are so that you can hint to
- the image loader that smaller images are acceptable (if you will never
- be displaying the texture at 100% magnification, you can get away with
- smaller textures.)
-
- Returns the sizes of various things:
-
- texture_width/height: The size of the texture itself, in pixels.
- This will often be larger than the grabbed
- image, since OpenGL sometimes requires texture
- dimensions to be a power of 2.
-
- image_width/height: The size of the image: this will usually be the
- same as the desired_width/height you passed in
- (but may be the size of the Window instead.)
-
- geometry: The position in the texture of the image bits.
- When image files are loaded, they are scaled up
- to the size of the window, but if the image does
- not have the same aspect ratio as the window,
- there will be black bars on the top/bottom or
- left/right. This geometry specification tells
- you where the "real" image bits are.
-
- So, don't use texture coordinates from 0.0 to 1.0. Instead use:
-
- [0.0 - iw/tw] If you want to display a quad that is the same
- [0.0 - ih/th] size as the window; or
-
- [gx/tw - (gx+gw)/tw] If you want to display a quad that is the same
- [gy/th - (gy+gh)/th] size as the loaded image file.
-
- When the callback is called, the image data will have been loaded
- into texture number `texid' (via glBindTexture.)
-
- If an error occurred, width/height will be 0.
- */
-void load_texture_async (Screen *, Window, GLXContext,
- int desired_width, int desired_height,
- Bool mipmap_p,
- GLuint texid,
- void (*callback) (const char *filename,
- XRectangle *geometry,
- int image_width,
- int image_height,
- int texture_width,
- int texture_height,
- void *closure),
- void *closure);
-
-struct texture_loader_t;
-typedef struct texture_loader_t texture_loader_t;
-
-/* Incremental Texture Loading
-
- The process works like load_texture_async, but split into multiple calls
- to facilitate chunks of work fitted to animation idle periods. The
- necessary calls are:
-
- * alloc_texture_loader - one call - allocates texture loader and starts
- background loading of image
- * step_texture_loader - multiple calls - each call processes part of the
- image into an OpenGL texture; calls back to provided function when
- texture is ready with image
- * free_texture_loader - one call - frees the texture loader resources
- and memory
-
- With the exception of the pointer to the loader and the time limit, all
- arguments are the same types as used by load_texture_async.
- */
-texture_loader_t *alloc_texture_loader (Screen *, Window, GLXContext,
- int desired_width, int desired_height,
- Bool mipmap_p,
- GLuint texid);
-
-/* Give an incremental texture loader time to work
-
- The given callback function will be called (with the passed closure) if
- the texture loader completes its work, and this callback will only be
- made once during the lifetime of the texture loader.
-
- This function will return either when all work is complete or when a
- processed "stripe" takes the elapsed time beyond allowed_seconds.
- */
-void step_texture_loader (texture_loader_t *loader,
- double allowed_seconds,
- void (*callback) (const char *filename,
- XRectangle *geometry,
- int image_width,
- int image_height,
- int texture_width,
- int texture_height,
- void *closure),
- void *closure);
-
-Bool texture_loader_failed (texture_loader_t *loader);
-
-void free_texture_loader (texture_loader_t *loader);
-
-#endif /* __GRAB_XIMAGE_H__ */
diff --git a/hacks/glx/gravitywell.c b/hacks/glx/gravitywell.c
deleted file mode 100644
index c41011a..0000000
--- a/hacks/glx/gravitywell.c
+++ /dev/null
@@ -1,769 +0,0 @@
-/* gravitywell, Copyright (c) 2019 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 15 \n" \
- "*gridColor: #00FF00\n" \
- "*gridColor2: #FF0000\n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_gw 0
-
-#define DEF_SPEED "1.0"
-#define DEF_RESOLUTION "1.0"
-#define DEF_GRID_SIZE "1.0"
-
-#include "xlockmore.h"
-#include "gltrackball.h"
-#include "colors.h"
-#include "hsv.h"
-
-#include <ctype.h>
-
-#define ASSERT(x)
-
-#ifdef USE_GL /* whole file */
-
-typedef struct {
- GLfloat mass;
- GLfloat ro2, rm2, ri2; /* outer/middle/inner */
- GLfloat ro, radius;
- GLfloat x, y, dx, dy;
- GLfloat surface_gravity, depth;
-} star;
-
-typedef struct {
- GLXContext *glx_context;
- trackball_state *user_trackball;
- Bool button_down_p;
- int nstars;
- star *stars;
- int grid_w, grid_h;
- GLfloat *grid;
- char *segs;
- GLfloat *vtx, *col;
- GLfloat color[4];
- int ncolors;
- XColor *colors;
-} gw_configuration;
-
-static gw_configuration *bps = NULL;
-
-static GLfloat speed, resolution, grid_size;
-
-#define RESOLUTION_BASE 512
-#define GRID_SIZE_BASE 7
-#define SPEED_BASE 2.5
-#define MASS_EPSILON 0.03
-#define SLOPE_EPSILON 0.06
-#define GRID_SEG 16u /* Power-of-two here is faster. */
-#define MAX_MASS_COLOR 120
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-resolution", ".resolution", XrmoptionSepArg, 0 },
- { "-grid-size", ".gridSize", XrmoptionSepArg, 0 },
-};
-
-static argtype vars[] = {
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Float},
- {&grid_size, "gridSize", "GridSize", DEF_GRID_SIZE, t_Float},
-};
-
-ENTRYPOINT ModeSpecOpt gw_opts = {
- countof(opts), opts, countof(vars), vars, NULL};
-
-
-#define MAX(a,b) ((a)>(b)?(a):(b))
-#define MIN(a,b) ((a)<(b)?(a):(b))
-#define WCLIP(x,hi) MIN(MAX((int)(x),0),(hi))
-
-/* Window management, etc
- */
-ENTRYPOINT void
-reshape_gw (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- if (width > height * 5) { /* tiny window: show middle */
- height = width * 9/16;
- y = -height/2;
- h = height / (GLfloat) width;
- }
-
- glViewport (0, y, width, height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (40, 1/h, 10, 1000);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0, 0, 30,
- 0, 0, 0,
- 0, 1, 0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-gw_handle_event (ModeInfo *mi, XEvent *event)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (gltrackball_event_handler (event, bp->user_trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- return True;
- return False;
-}
-
-
-static void
-parse_color (ModeInfo *mi, char *key, GLfloat color[4])
-{
- XColor xcolor;
- char *string = get_string_resource (mi->dpy, key, "Color");
- if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
- {
- fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
- key, string);
- exit (1);
- }
- free (string);
-
- color[0] = xcolor.red / 65536.0;
- color[1] = xcolor.green / 65536.0;
- color[2] = xcolor.blue / 65536.0;
- color[3] = 1;
-}
-
-
-static void
-new_star (const gw_configuration *bp, star *s)
-{
- int w = bp->grid_w * GRID_SEG;
-
- s->radius = 2 * (2 + frand(3) + frand(3) + frand(3));
- s->mass = s->radius * 150 * (2 + frand(3) + frand(3) + frand(3));
-
- s->ro2 = s->mass / MASS_EPSILON;
- s->ro = sqrt (s->ro2);
- s->rm2 = pow (s->mass * (2.0f / SLOPE_EPSILON), 2.0f / 3.0f);
- s->ri2 = s->radius * s->radius;
- if (s->rm2 < s->ri2)
- s->rm2 = s->ri2;
- if (s->ro2 < s->rm2)
- s->ro2 = s->rm2;
-
- s->x = w * (s == bp->stars ? 0.5 : (0.35 + frand(0.3)));
- s->dx = ((frand(1.0) - 0.5) * 0.1) / resolution;
- s->dy = (0.1 + frand(0.6)) / resolution;
-
- /* What the experienced gravitation would be at the surface of the
- star, were the mass actually held in a singularity at its center.
- */
- s->surface_gravity = s->mass / s->ri2;
- s->depth = s->surface_gravity;
-}
-
-
-static void
-move_stars (ModeInfo *mi)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
- int w = bp->grid_w * GRID_SEG;
- int h = bp->grid_h * GRID_SEG;
- int i;
-
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- /* Move stars off screen until most of their influence fades */
- GLfloat off = speed * SPEED_BASE * resolution;
- s->x += s->dx * off;
- s->y += s->dy * off;
-
- if (s->x < -s->ro ||
- s->y < -s->ro ||
- s->x >= w + s->ro ||
- s->y >= h + s->ro)
- {
- new_star (bp, s);
- s->y = -s->ro;
- }
- }
-}
-
-
-static void
-calc_o (gw_configuration *bp, GLfloat mass, GLfloat cx, GLfloat y02,
- unsigned from, unsigned to)
-{
- GLfloat x0 = cx - from * GRID_SEG;
- GLfloat g0 = mass / (x0*x0 + y02);
- unsigned x;
-
- ASSERT (to <= bp->grid_w || to <= bp->grid_h);
-
- for (x = from; x < to; x++)
- {
- GLfloat *g = &bp->grid[x * GRID_SEG];
- GLfloat g1;
-
- x0 = cx - (x + 1) * GRID_SEG;
- g1 = mass / (x0*x0 + y02);
-
- g[0] += g0;
- if (bp->segs[x])
- {
- GLfloat d = (g1 - g0) / GRID_SEG;
- unsigned i;
- for(i = 1; i != GRID_SEG; i++)
- {
- g0 += d;
- g[i] += g0;
- }
- }
- g0 = g1;
- }
-}
-
-
-static void
-make_hires (gw_configuration *bp, unsigned from, unsigned to, unsigned w)
-{
- unsigned x;
-
- /* One bigger than from/to so that there's a good angle between the middle
- and inner zones.
-
- Don't make the last GRID_SEG high-res. This keeps the length consistent.
- */
- if (from)
- from--;
- from = MIN(from / GRID_SEG, w - 1);
- to = MIN(to / GRID_SEG + 1, w - 1);
-
- ASSERT (to <= bp->grid_w - 1 || to <= bp->grid_h - 1);
-
- for (x = from; x < to; x++)
- {
- if (! bp->segs[x])
- {
- GLfloat *g = &bp->grid[x * GRID_SEG];
- GLfloat g0 = g[0], g1 = g[GRID_SEG];
- GLfloat d = (g1 - g0) / GRID_SEG;
- unsigned i;
- for (i = 1; i != GRID_SEG; i++)
- {
- g0 += d;
- g[i] = g0;
- }
- bp->segs[x] = True;
- }
- }
-}
-
-
-static void
-calc_m (gw_configuration *bp, GLfloat mass, GLfloat cx, GLfloat y02,
- unsigned from, unsigned to)
-{
- GLfloat *gridp = bp->grid;
- unsigned x;
-
- ASSERT (to <= bp->grid_w * GRID_SEG + 1 || to <= bp->grid_h * GRID_SEG + 1);
-
- for (x = from; x < to; x++)
- {
- /* Inverse square of distance from mass as a point source */
- GLfloat x0 = cx - x;
- gridp[x] += mass / (x0*x0 + y02);
- }
-}
-
-
-#define EASE(r) (sin ((r) * M_PI_2))
-
-static void
-draw_row (ModeInfo *mi, int w, int y, Bool swap)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- int x;
- int polys;
- int w2 = w * GRID_SEG;
-
- GLfloat *vtx_x;
- GLfloat *vtx_y;
- GLfloat *gridp = bp->grid;
- memset (gridp, 0, w2 * sizeof(*gridp));
- memset (bp->segs, 0, w);
-
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- GLfloat cx, cy;
- unsigned olo, ohi, mlo, mhi, ilo, ihi;
- GLfloat mass, max;
- /* Move stars off screen until most of their influence fades */
- GLfloat ro, rm, ri;
-
- GLfloat y0;
- GLfloat y02;
-
- if (swap)
- {
- cy = s->x;
- cx = s->y;
- }
- else
- {
- cx = s->x;
- cy = s->y;
- }
- mass = s->mass;
- max = s->surface_gravity;
-
- y0 = cy - y;
- y02 = y0 * y0;
-
- if (y02 > s->ro2) continue;
-
- ro = sqrtf (s->ro2 - y02);
- olo = WCLIP((cx - ro) / GRID_SEG + 1, w); /* GLfloat -> int */
- ohi = WCLIP((cx + ro) / GRID_SEG + 1, w);
-
- rm = s->rm2 > y02 ? sqrtf (s->rm2 - y02) : 0;
- mlo = WCLIP((cx - rm) + 1, w2);
- mhi = WCLIP((cx + rm) + 1, w2);
-
- ASSERT (mlo <= mhi);
-
- if (mlo != mhi)
- {
- ri = s->ri2 > y02 ? sqrtf (s->ri2 - y02) : 0;
- ilo = WCLIP(cx - ri + 1, w2);
- ihi = WCLIP(cx + ri + 1, w2);
-
- mlo -= mlo % GRID_SEG;
- mhi += GRID_SEG - 1;
- mhi -= mhi % GRID_SEG;
-
- /* These go first. */
- make_hires (bp, mlo, ilo, w);
- make_hires (bp, ihi, mhi, w);
-
- calc_m (bp, mass, cx, y02, mlo, ilo);
- calc_m (bp, mass, cx, y02, ihi, mhi);
-
- /* This does a bit more work than it needs to. */
- for (x = ilo; x < ihi; x++)
- gridp[x] += max;
- }
-
- calc_o (bp, mass, cx, y02, olo, mlo / GRID_SEG);
- calc_o (bp, mass, cx, y02, mhi / GRID_SEG, ohi);
- }
-
- if (swap)
- {
- vtx_y = bp->vtx;
- vtx_x = bp->vtx + 1;
- }
- else
- {
- vtx_x = bp->vtx;
- vtx_y = bp->vtx + 1;
- }
-
-# define COLOR_CODE 0
-
-# if COLOR_CODE
- {
- unsigned grid_max = bp->grid_w > bp->grid_h ? bp->grid_w : bp->grid_h;
- GLfloat *color = malloc(sizeof(GLfloat) * 4 * (grid_max * GRID_SEG + 1));
- glEnableClientState (GL_COLOR_ARRAY);
- glColorPointer (4, GL_FLOAT, 0, color);
-# endif
-
- ASSERT (! bp->segs[w - 1]);
-
- polys = 0;
- for (x = 0; x != w; x++)
- {
- if (! bp->segs[x])
- {
- int ci;
- size_t vp = polys * 3;
- size_t cp = polys * 4;
-# if COLOR_CODE
- GLfloat slope = 0;
- if (x != 0)
- slope += fabs(gridp[x * GRID_SEG] - gridp[(x - 1) * GRID_SEG]);
- if (x != w - 1)
- slope += fabs(gridp[(x + 1) * GRID_SEG] - gridp[x * GRID_SEG]);
- slope = 1 - (slope / (SLOPE_EPSILON * 2));
-
- color[cp] = slope;
- color[cp + 1] = slope;
- color[cp + 2] = 1;
- color[cp + 3] = 1;
-# endif
- vtx_x[vp] = x * GRID_SEG;
- bp->vtx[vp + 2] = gridp[x * GRID_SEG];
- polys += 1;
-
- ci = EASE (bp->vtx[vp + 2] / MAX_MASS_COLOR) * bp->ncolors;
- if (ci < 0) ci = 0;
- if (ci >= bp->ncolors) ci = bp->ncolors - 1;
- bp->col[cp] = bp->colors[ci].red / 65536.0;
- bp->col[cp+1] = bp->colors[ci].green / 65536.0;
- bp->col[cp+2] = bp->colors[ci].blue / 65536.0;
- bp->col[cp+3] = 1;
- }
- else
- {
- for(i = 0; i != GRID_SEG; i++)
- {
- int ci;
- size_t vp = (polys + i) * 3;
- size_t cp = (polys + i) * 4;
-# if COLOR_CODE
- color[cp] = 1;
- color[cp + 1] = 0.75;
- color[cp + 2] = 0;
- color[cp + 3] = 1;
-# endif
- vtx_x[vp] = x * GRID_SEG + i;
- bp->vtx[vp + 2] = gridp[x * GRID_SEG + i];
-
- ci = EASE (bp->vtx[vp + 2] / MAX_MASS_COLOR) * bp->ncolors;
- if (ci < 0) ci = 0;
- if (ci >= bp->ncolors) ci = bp->ncolors - 1;
- bp->col[cp] = bp->colors[ci].red / 65536.0;
- bp->col[cp+1] = bp->colors[ci].green / 65536.0;
- bp->col[cp+2] = bp->colors[ci].blue / 65536.0;
- bp->col[cp+3] = 1;
- }
- polys += GRID_SEG;
- }
- }
-
- for (i = 0; i < polys; i++)
- vtx_y[i * 3] = y; /* + random() * (MASS_EPSILON / (MAXRAND)); */
-
- mi->polygon_count += polys;
- glDrawArrays (GL_LINE_STRIP, 0, polys);
-
-# if COLOR_CODE
- glDisableClientState (GL_COLOR_ARRAY);
- free (color);
- }
-# endif
-}
-
-
-ENTRYPOINT void
-init_gw (ModeInfo *mi)
-{
- gw_configuration *bp;
- unsigned grid_max, vtx_max;
- int i;
- MI_INIT (mi, bps);
-
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_gw (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- {
- int h1, h2;
- double s1, v1, s2, v2;
- GLfloat color2[4];
- parse_color (mi, "gridColor", bp->color);
- parse_color (mi, "gridColor2", color2);
- rgb_to_hsv (bp->color[0] * 65536,
- bp->color[1] * 65536,
- bp->color[2] * 65536,
- &h1, &s1, &v1);
- rgb_to_hsv (color2[0] * 65536,
- color2[1] * 65536,
- color2[2] * 65536,
- &h2, &s2, &v2);
- bp->ncolors = 128;
- bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
- make_color_ramp (0, 0, 0,
- h1, s1, v1, h2, s2, v2,
- bp->colors, &bp->ncolors,
- False, 0, False);
- }
-
- bp->user_trackball = gltrackball_init (False);
-
- bp->grid_w = (RESOLUTION_BASE * resolution) / GRID_SEG;
- if (bp->grid_w < 2) bp->grid_w = 2;
- bp->grid_h = bp->grid_w;
-
- grid_max = bp->grid_w > bp->grid_h ? bp->grid_w : bp->grid_h;
- vtx_max = grid_max * GRID_SEG;
- bp->grid = (GLfloat *) calloc (vtx_max, sizeof(*bp->grid));
- bp->vtx = (GLfloat *) calloc (vtx_max * 3, sizeof(*bp->vtx));
- bp->col = (GLfloat *) calloc (vtx_max * 4, sizeof(*bp->col));
- bp->segs = (char *) calloc (grid_max, sizeof(*bp->segs));
- if (! bp->grid || ! bp->vtx || ! bp->col || ! bp->segs) abort();
-
- bp->nstars = MI_COUNT(mi);
- bp->stars = (star *) calloc (bp->nstars, sizeof (star));
-
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- new_star (bp, s);
- s->y = frand(s->ro * 2 + bp->grid_h * GRID_SEG) - s->ro;
- }
-
- /* Let's tilt the floor a little. */
- gltrackball_reset (bp->user_trackball,
- -0.4 + frand(0.8),
- -0.3 + frand(0.2));
-}
-
-
-ENTRYPOINT void
-draw_gw (ModeInfo *mi)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- int gridmod = grid_size * GRID_SIZE_BASE;
- int x, y, i;
- int sample_x, sample_y;
- GLfloat sample_z = -1;
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glRotatef (current_device_rotation(), 0, 0, 1); /* right side up */
-
- gltrackball_rotate (bp->user_trackball);
-
-#if 0
- glScalef(0.05/resolution, 0.05/resolution, 0.05/resolution);
-#endif
-
- glRotatef (90, 1, 0, 0);
- glTranslatef (-bp->grid_w * (GRID_SEG / 2.0f),
- -bp->grid_h * (GRID_SEG * 0.75f),
- 3);
-
-#if 0
- glColor3f(1,0,0);
- glPushMatrix();
- glTranslatef(0,0,0);
- glScalef (bp->grid_w * GRID_SEG,
- bp->grid_w * GRID_SEG,
- bp->grid_w * GRID_SEG);
- glDisable (GL_FOG);
- glBegin(GL_LINE_LOOP);
- glVertex3f(0, 0, 0);
- glVertex3f(1, 0, 0);
- glVertex3f(1, 1, 0);
- glVertex3f(.4, 1, 0);
- glVertex3f(.5, .5, 0);
- glVertex3f(.6, 1, 0);
- glVertex3f(0, 1, 0);
- glEnd();
- glPopMatrix();
- glColor3f(0,1,0);
- if (!wire) glEnable (GL_FOG);
-#endif
-
- if (!wire)
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
-
- glLineWidth (2);
- glEnable (GL_LINE_SMOOTH);
- glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
-
- glFogi (GL_FOG_MODE, GL_EXP2);
- glFogfv (GL_FOG_COLOR, fog_color);
- glFogf (GL_FOG_DENSITY, 0.005);
- glEnable (GL_FOG);
- }
-
- glEnableClientState (GL_COLOR_ARRAY);
- glEnableClientState (GL_VERTEX_ARRAY);
- glColorPointer (4, GL_FLOAT, 0, bp->col);
- glVertexPointer (3, GL_FLOAT, 0, bp->vtx);
-
- /* Somewhere near the midpoint of the view */
- sample_x = ((int) (bp->grid_w * GRID_SEG * 0.5) / gridmod) * gridmod;
- sample_y = ((int) (bp->grid_h * GRID_SEG * 0.75) / GRID_SEG) * GRID_SEG;
-
- /* Find the cumulative gravitational effect at the midpoint of each star,
- for the depth of the foot-circle. This duplicates some of the draw_row()
- logic. */
- for (i = 0; i < bp->nstars; i++)
- {
- star *s0 = &bp->stars[i];
- GLfloat x0 = s0->x;
- GLfloat y0 = s0->y;
- int j;
- s0->depth = s0->surface_gravity;
- for (j = 0; j < bp->nstars; j++)
- {
- star *s1;
- GLfloat x1, y1, d2;
- if (i == j) continue;
- s1 = &bp->stars[j];
- x1 = s1->x;
- y1 = s1->y;
- d2 = (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0);
- s0->depth += s1->mass / d2;
- }
- }
-
- mi->polygon_count = 0;
- for (y = 0; y < (bp->grid_h - 1) * GRID_SEG; y += gridmod)
- draw_row (mi, bp->grid_w, y, False);
- for (x = 0; x < (bp->grid_w - 1) * GRID_SEG; x += gridmod)
- {
- draw_row (mi, bp->grid_h, x, True);
- if (x == sample_x)
- sample_z = bp->grid[sample_y];
- }
-
- if (mi->fps_p)
- {
- /* Mass of Sol is 2x10^30kg, or 332 kilo-Earths.
- But I'm not sure what the funniest number to put here is. */
- /* mi->recursion_depth = (int) sample_z/4; */
- mi->recursion_depth = (int) (sample_z * 30000);
- glColor4fv (bp->color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, bp->color);
- glBegin(GL_LINES);
- glVertex3f (sample_x-0.15, sample_y-0.15, sample_z);
- glVertex3f (sample_x+0.15, sample_y+0.15, sample_z);
- glVertex3f (sample_x-0.15, sample_y+0.15, sample_z);
- glVertex3f (sample_x+0.15, sample_y-0.15, sample_z);
- glEnd();
- }
-
- /* Draw a circle around the "footprint" at the bottom of the gravity well.
- */
- for (i = 0; i < bp->nstars; i++)
- {
- int steps = 16;
- star *s = &bp->stars[i];
- GLfloat th, color[4];
- int ci;
- ci = EASE (s->depth / MAX_MASS_COLOR) * bp->ncolors;
- if (ci < 0) ci = 0;
- if (ci >= bp->ncolors) ci = bp->ncolors - 1;
- color[0] = bp->colors[ci].red / 65536.0;
- color[1] = bp->colors[ci].green / 65536.0;
- color[2] = bp->colors[ci].blue / 65536.0;
- color[3] = 1;
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glPushMatrix();
- glTranslatef (s->x, s->y, 0);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI/steps)
- glVertex3f (s->radius * cos(th), s->radius * sin(th), s->depth);
- glEnd();
- glPopMatrix();
- mi->polygon_count += steps;
- }
-
-#if 0
- {
- for (i = 0; i < bp->nstars; i++)
- {
- star *s = &bp->stars[i];
- GLfloat maxr = sqrt (s->mass / MASS_EPSILON);
- GLfloat th;
- glPushMatrix();
- glTranslatef (s->x, s->y, 0);
- glColor3f(0, 0, 1);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI/32)
- glVertex3f (s->radius * cos(th), s->radius * sin(th), 0);
- glEnd();
- glColor3f(0, 0, 0.5);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI/32)
- glVertex3f (maxr * cos(th), maxr * sin(th), 0);
- glEnd();
- glBegin (GL_LINES);
- glVertex3f ( 3000 * s->dx, 3000 * s->dy, 0);
- glVertex3f (-3000 * s->dx, -3000 * s->dy, 0);
- glEnd();
- glPopMatrix();
- }
- }
-#endif
-
- glPopMatrix ();
-
- if (! bp->button_down_p)
- move_stars (mi);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_gw (ModeInfo *mi)
-{
- gw_configuration *bp = &bps[MI_SCREEN(mi)];
-
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- if (bp->user_trackball) gltrackball_free (bp->user_trackball);
- if (bp->stars) free (bp->stars);
- if (bp->grid) free (bp->grid);
- if (bp->vtx) free (bp->vtx);
- if (bp->col) free (bp->col);
- if (bp->segs) free (bp->segs);
- if (bp->colors) free (bp->colors);
-}
-
-XSCREENSAVER_MODULE_2 ("GravityWell", gravitywell, gw)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/gravitywell.man b/hacks/glx/gravitywell.man
deleted file mode 100644
index 8837072..0000000
--- a/hacks/glx/gravitywell.man
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-gravitywell \- spaaaaace.
-.SH SYNOPSIS
-.B gravitywell
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-delay \fInumber\fP]
-[\-speed \fInumber\fP]
-[\-resolution \fInumber\fP]
-[\-grid-size \fInumber\fP]
-[\-count \fInumber\fP]
-.SH DESCRIPTION
-Massive objects distort space in a two dimensional universe.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
-.TP 8
-.B \-speed \fInumber\fP
-Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
-.TP 8
-.B \-resolution \fInumber\fP
-Density of the underlying universe. Default: 1.0.
-.TP 8
-.B \-grid-size \fInumber\fP
-Grid Size. Smaller values are more dense. Default: 1.0.
-.TP 8
-.B \-count \fInumber\fP
-Number of stars. Default: 15.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2019 by Jamie Zawinski. Permission to use, copy, modify,
-distribute, and sell this software and its documentation for any purpose is
-hereby granted without fee, provided that the above copyright notice appear
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation. No representations are made about the
-suitability of this software for any purpose. It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski.
diff --git a/hacks/glx/handsy.c b/hacks/glx/handsy.c
deleted file mode 100644
index ed21b2d..0000000
--- a/hacks/glx/handsy.c
+++ /dev/null
@@ -1,1173 +0,0 @@
-/* handsy, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#define DEFAULTS "*delay: 30000 \n" \
- "*count: 2 \n" \
- ".foreground: #8888CC" "\n" \
- "*groundColor: #0000FF" "\n" \
- "*showFPS: False \n" \
- "*wireframe: False \n"
-
-# define release_hands 0
-
-#include "xlockmore.h"
-#include "sphere.h"
-#include "tube.h"
-#include "rotator.h"
-#include "gltrackball.h"
-#include "gllist.h"
-#include <ctype.h>
-
-#ifdef USE_GL /* whole file */
-
-
-#define DEF_SPEED "1.0"
-#define DEF_SPIN "XY"
-#define DEF_WANDER "True"
-#define DEF_FACE_FRONT "True"
-#define DEF_DEBUG "False"
-
-extern const struct gllist
- *handsy_model_finger_distal, *handsy_model_finger_intermediate,
- *handsy_model_finger_proximal, *handsy_model_finger_metacarpal,
- *handsy_model_thumb_distal, *handsy_model_thumb_proximal,
- *handsy_model_thumb_metacarpal, *handsy_model_palm;
-static struct gllist *ground = 0;
-
-static const struct gllist * const *all_objs[] = {
- &handsy_model_finger_distal, &handsy_model_finger_intermediate,
- &handsy_model_finger_proximal, &handsy_model_finger_metacarpal,
- &handsy_model_thumb_distal, &handsy_model_thumb_proximal,
- &handsy_model_thumb_metacarpal, &handsy_model_palm,
- (const struct gllist * const *) &ground
-};
-
-#define FINGER_DISTAL 0
-#define FINGER_INTERMEDIATE 1
-#define FINGER_PROXIMAL 2
-#define FINGER_METACARPAL 3
-#define THUMB_DISTAL 4
-#define THUMB_PROXIMAL 5
-#define THUMB_METACARPAL 6
-#define PALM 7
-#define GROUND 8
-
-
-/* 'hand_geom' describes the position and extent of the various joints.
- 'hand' describes the current flexion of the joints in that model.
- 'hand_anim' is a list of positions and timings describing an animation.
- 'hands_configuration' is the usual global state structure.
- */
-
-typedef struct {
- double min, max; /* +- pi */
-} joint;
-
-typedef struct {
- joint bones[4];
- joint base;
-} finger;
-
-typedef struct {
- finger fingers[5];
- joint palm;
- joint wrist1;
- joint wrist2;
-} hand_geom;
-
-static const hand_geom human_hand = {
- {{{{ 0.0, 1.6 }, /* thumb distal */
- { 0.0, 1.6 }, /* thumb proximal */
- { 0.0, 1.6 }, /* thumb metacarpal */
- { 0.0, 0.0 }}, /* none */
- { -1.70, 0.00 }},
- {{{ -0.2, 1.6 }, /* index distal */
- { -0.2, 1.6 }, /* index intermediate */
- { -0.2, 1.6 }, /* index proximal */
- { 0.0, 0.0 }}, /* index metacarpal */
- { -0.25, 0.25 }},
- {{{ -0.2, 1.6 }, /* middle distal */
- { -0.2, 1.6 }, /* middle intermediate */
- { -0.2, 1.6 }, /* middle proximal */
- { 0.0, 0.0 }}, /* middle metacarpal */
- { -0.25, 0.25 }},
- {{{ -0.2, 1.6 }, /* ring distal */
- { -0.2, 1.6 }, /* ring intermediate */
- { -0.2, 1.6 }, /* ring proximal */
- { 0.0, 0.0 }}, /* ring metacarpal */
- { -0.25, 0.25 }},
- {{{ -0.2, 1.6 }, /* pinky distal */
- { -0.2, 1.6 }, /* pinky intermediate */
- { -0.2, 1.6 }, /* pinky proximal */
- { 0.0, 0.0 }}, /* pinky metacarpal */
- { -0.25, 0.25 }}},
- { -0.7, 1.5 }, /* palm (wrist up/down) */
- { -M_PI, M_PI }, /* wrist left/right */
- { -M_PI, M_PI }, /* wrist rotate */
-};
-
-typedef struct {
- double joint[countof(human_hand.fingers)] /* +- pi */
- [countof(human_hand.fingers[0].bones)];
- double base[countof(human_hand.fingers)];
- double wrist[3]; /* up/down, left/right, rotate */
- double pos[3]; /* XYZ */
- Bool sinister;
- double alpha;
-} hand;
-
-typedef struct {
- const hand * const dest;
- double duration, pause;
- double pos[3], rot[3]; /* XYZ */
-} hand_anim;
-
-typedef struct {
- const hand_anim * const pair[2]; /* L/R */
- double delay; /* Delay added to R */
-} hand_anim_pair;
-
-typedef struct {
- GLXContext *glx_context;
- rotator *rot, *rot2;
- trackball_state *trackball;
- Bool spinx, spiny, spinz;
- Bool button_down_p;
-
- const hand_geom *geom;
- GLuint *dlists;
- int nhands;
-
- struct {
- const hand_anim *anim;
- int anim_hands; /* frames in animation */
- int anim_hand; /* pos in anim, L/R */
- double anim_start, anim_time;
- double tick;
- double delay;
- } pair[2];
-
- struct { hand from, to, current; } *hands;
- GLfloat color[4];
- Bool ringp;
-
-} hands_configuration;
-
-#include "handsy_anim.h"
-
-
-static hands_configuration *bps = NULL;
-
-static GLfloat speed;
-static char *do_spin;
-static Bool do_wander;
-static Bool face_front_p;
-static Bool debug_p;
-
-static XrmOptionDescRec opts[] = {
- { "-speed", ".speed", XrmoptionSepArg, 0 },
- { "-spin", ".spin", XrmoptionSepArg, 0 },
- { "+spin", ".spin", XrmoptionNoArg, "" },
- { "-wander", ".wander", XrmoptionNoArg, "True" },
- { "+wander", ".wander", XrmoptionNoArg, "False" },
- { "-front", ".faceFront", XrmoptionNoArg, "True" },
- { "+front", ".faceFront", XrmoptionNoArg, "False" },
- { "-debug", ".debug", XrmoptionNoArg, "True" },
- { "+debug", ".debug", XrmoptionNoArg, "False" },
-};
-
-static argtype vars[] = {
- {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
- {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
- {&face_front_p, "faceFront", "FaceFront", DEF_FACE_FRONT, t_Bool},
- {&speed, "speed", "Speed", DEF_SPEED, t_Float},
- {&debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
-};
-
-ENTRYPOINT ModeSpecOpt hands_opts = {countof(opts), opts, countof(vars), vars, NULL};
-
-
-/* Returns the current time in seconds as a double.
- */
-static double
-double_time (void)
-{
- struct timeval now;
-# ifdef GETTIMEOFDAY_TWO_ARGS
- struct timezone tzp;
- gettimeofday(&now, &tzp);
-# else
- gettimeofday(&now);
-# endif
-
- return (now.tv_sec + ((double) now.tv_usec * 0.000001));
-}
-
-
-static double
-constrain_joint (double v, double min, double max)
-{
- if (v < min) v = min;
- else if (v > max) v = max;
- return v;
-}
-
-
-static void
-draw_hand (ModeInfo *mi, hand *h)
-{
- hands_configuration *bp = &bps[MI_SCREEN(mi)];
- int wire = MI_IS_WIREFRAME(mi);
- int finger;
- int off = h->sinister ? -1 : 1;
- int nfingers = countof (bp->geom->fingers);
- int nbones = countof (bp->geom->fingers[0].bones);
-
- glLineWidth (1);
- glPushMatrix();
-
- glTranslatef (off * h->pos[0], h->pos[1], h->pos[2]);
- glRotatef (h->wrist[1] * 180 / M_PI * -off, 0, 1, 0);
- glRotatef (h->wrist[2] * 180 / M_PI * -off, 0, 0, 1);
- glRotatef (h->wrist[0] * 180 / M_PI, 1, 0, 0);
-
- bp->color[3] = h->alpha;
- glColor4fv (bp->color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, bp->color);
-
- if (!wire) glEnable (GL_BLEND);
-
- glPushMatrix();
- if (h->sinister)
- {
- glScalef (-1, 1, 1);
- glFrontFace (GL_CW);
- }
- else
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[PALM]);
- glPopMatrix();
-
- for (finger = 0; finger < nfingers; finger++)
- {
- int bone = nbones - 2;
- glPushMatrix();
- if (finger == 0) /* thumb */
- {
- glTranslatef (off * 0.113, -0.033, 0.093);
- glRotatef (off * 45, 0, 1, 0);
-
- if (h->sinister)
- glRotatef (180, 0, 0, 1);
-
- glRotatef (off * h->base[finger] * -180 / M_PI, 1, 0, 0);
- bone--;
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[THUMB_METACARPAL]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[THUMB_METACARPAL]);
- glPopMatrix();
-
- glTranslatef (0, 0, 0.1497);
- glRotatef (h->joint[finger][bone] * -180 / M_PI, 0, 1, 0);
- bone--;
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[THUMB_PROXIMAL]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[THUMB_PROXIMAL]);
- glPopMatrix();
-
- glTranslatef (0, 0, 0.1212);
- glRotatef (h->joint[finger][bone] * -180 / M_PI, 0, 1, 0);
- bone--;
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[THUMB_DISTAL]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[THUMB_DISTAL]);
- glPopMatrix();
- }
- else
- {
- switch (finger) {
- case 1: /* index */
- glTranslatef (off * 0.135, 0.004, 0.26835);
- glRotatef (off * 4, 0, 1, 0);
- break;
- case 2: /* middle */
- glTranslatef (off * 0.046, 0.004, 0.27152);
- glRotatef (off * 1, 0, 1, 0);
- break;
- case 3: /* ring */
- glTranslatef (off * -0.046, 0.004, 0.25577);
- glRotatef (off * -1, 0, 1, 0);
- break;
- case 4: /* pinky */
- glTranslatef (off * -0.135, 0.004, 0.22204);
- glRotatef (off * -4, 0, 1, 0);
- break;
- default: abort(); break;
- }
-
- glRotatef (90, 0, 0, 1);
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[FINGER_METACARPAL]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[FINGER_METACARPAL]);
- glPopMatrix();
-
- glTranslatef (0, 0, 0.1155);
- glRotatef (off * h->base[finger] * -180 / M_PI, 1, 0, 0);
- glRotatef (h->joint[finger][bone] * -180 / M_PI, 0, 1, 0);
- bone--;
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[FINGER_PROXIMAL]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[FINGER_PROXIMAL]);
- glPopMatrix();
-
- glTranslatef (0, 0, 0.1815);
- glRotatef (h->joint[finger][bone] * -180 / M_PI, 0, 1, 0);
- bone--;
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[FINGER_INTERMEDIATE]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[FINGER_INTERMEDIATE]);
- glPopMatrix();
-
- glTranslatef (0, 0, 0.1003);
- glRotatef (h->joint[finger][bone] * -180 / M_PI, 0, 1, 0);
- bone--;
-
- glFrontFace (GL_CCW);
- glCallList (bp->dlists[FINGER_DISTAL]);
- glPushMatrix();
- glScalef (1, -1, 1);
- glFrontFace (GL_CW);
- glCallList (bp->dlists[FINGER_DISTAL]);
- glPopMatrix();
- }
- glPopMatrix();
- }
- glPopMatrix();
-
- if (h->sinister && bp->ringp)
- {
- GLfloat color[] = { 1.0, 0.4, 0.4, 1 };
- GLfloat center = 0.4;
- GLfloat th;
- GLfloat r = center - h->pos[0] + 0.1;
- GLfloat min = 0.22;
- if (r < min) r = min;
- glPushMatrix();
- glTranslatef (-center, -0.28, 0.5);
- glRotatef (h->wrist[2] * 180 / M_PI * -off, 0, 0, 1);
- glRotatef (h->wrist[0] * 180 / M_PI, 1, 0, 0);
-
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
- glDisable (GL_LIGHTING);
- glLineWidth (8);
- glBegin (GL_LINE_LOOP);
- for (th = 0; th < M_PI * 2; th += M_PI / 180)
- glVertex3f (r * cos(th), r * sin(th), 0);
- glEnd();
- if (! wire) glEnable (GL_LIGHTING);
- glPopMatrix();
- }
-
- glDisable (GL_BLEND);
-}
-
-
-static void
-parse_color (ModeInfo *mi, char *key, GLfloat color[4])
-{
- XColor xcolor;
- char *string = get_string_resource (mi->dpy, key, "Color");
- if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
- {
- fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
- key, string);
- exit (1);
- }
- free (string);
-
- color[0] = xcolor.red / 65536.0;
- color[1] = xcolor.green / 65536.0;
- color[2] = xcolor.blue / 65536.0;
- color[3] = 1;
-}
-
-
-static int
-draw_ground (ModeInfo *mi)
-{
- int wire = MI_IS_WIREFRAME(mi);
- GLfloat i, j, k;
-
- /* When using fog, iOS apparently doesn't like lines or quads that are
- really long, and extend very far outside of the scene. Maybe? If the
- length of the line (cells * cell_size) is greater than 25 or so, lines
- that are oriented steeply away from the viewer tend to disappear
- (whether implemented as GL_LINES or as GL_QUADS).
-
- So we do a bunch of smaller grids instead of one big one.
- */
- int cells = 30;
- GLfloat cell_size = 0.8;
- int points = 0;
- int grids = 12;
- GLfloat color[4];
-
- if (wire) glLineWidth (1);
-
- parse_color (mi, "groundColor", color);
-
- glPushMatrix();
-
- glScalef (0.2, 0.2, 0.2);
-
- glRotatef (frand(90), 0, 0, 1);
-
- if (!wire)
- {
- GLfloat fog_color[4] = { 0, 0, 0, 1 };
-
- glLineWidth (4);
- glEnable (GL_LINE_SMOOTH);
- glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
-
- glFogi (GL_FOG_MODE, GL_EXP2);
- glFogfv (GL_FOG_COLOR, fog_color);
- glFogf (GL_FOG_DENSITY, 0.015);
- glFogf (GL_FOG_START, -cells/2 * cell_size * grids);
- glEnable (GL_FOG);
- }
-
- glColor4fv (color);
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
-
- glTranslatef (-cells * grids * cell_size / 2,
- -cells * grids * cell_size / 2, 0);
-
- for (j = 0; j < grids; j++)
- {
- glPushMatrix();
- for (k = 0; k < grids; k++)
- {
- glBegin (GL_LINES);
- for (i = -cells/2; i < cells/2; i++)
- {
- GLfloat a = i * cell_size;
- GLfloat b = cells/2 * cell_size;
- glVertex3f (a, -b, 0); glVertex3f (a, b, 0); points++;
- glVertex3f (-b, a, 0); glVertex3f (b, a, 0); points++;
- }
- glEnd();
- glTranslatef (cells * cell_size, 0, 0);
- }
- glPopMatrix();
- glTranslatef (0, cells * cell_size, 0);
- }
-
- if (!wire)
- {
- glDisable (GL_LINE_SMOOTH);
- glDisable (GL_BLEND);
- glDisable (GL_FOG);
- }
-
- glPopMatrix();
-
- return points;
-}
-
-
-ENTRYPOINT void
-reshape_hands (ModeInfo *mi, int width, int height)
-{
- GLfloat h = (GLfloat) height / (GLfloat) width;
- int y = 0;
-
- glViewport (0, y, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective (30.0, 1/h, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt( 0.0, 0.0, 30.0,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
-
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-ENTRYPOINT Bool
-hands_handle_event (ModeInfo *mi, XEvent *event)
-{
- hands_configuration *bp = &bps[MI_SCREEN(mi)];
- Bool ok = False;
-
- if (gltrackball_event_handler (event, bp->trackball,
- MI_WIDTH (mi), MI_HEIGHT (mi),
- &bp->button_down_p))
- ok = True;
- else if (debug_p && event->type == KeyPress)
- {
- int nfingers = countof (bp->geom->fingers);
- int nbones = countof (bp->geom->fingers[0].bones);
- KeySym keysym;
- char c = 0;
- Bool tiltp = False;
- double delta = 0.02;
- double sign = 1;
- int i, j, k;
-
- XLookupString (&event->xkey, &c, 1, &keysym, 0);
-
- for (i = 0; i < bp->nhands; i++)
- {
- hand *h = &bp->hands[i].current;
- Bool modp = !!event->xkey.state;
-
- switch (keysym) {
- case XK_Up: ok = True; h->pos[(modp ? 1 : 2)] += delta; break;
- case XK_Down: ok = True; h->pos[(modp ? 1 : 2)] -= delta; break;
- case XK_Right: ok = True; h->pos[0] += delta; break;
- case XK_Left: ok = True; h->pos[0] -= delta; break;
- default: break;
- }
-
- switch (c) {
- case '?': case '/':
- ok = True;
- fprintf (stderr, "\n"
- " Open fingers: 12345 (1 = pinky, 5 = thumb)\n"
- " Close fingers: QWERT\n"
- " Tilt left: ASDFG\n"
- " Tilt right: ZXCVB\n"
- " Bend wrist: UJ (up/down)\n"
- " Bend wrist: IK (left/right)\n"
- " Rotate wrist: OL\n"
- " Move origin: arrow keys: XZ plane; shift: XY plane\n"
- " Tab: print current state to stdout\n"
- " 0: Reset\n"
- " ?: This\n\n");
- return ok;
- break;
-
-
- case '1': case '!': j = 4; sign = -1; goto FINGER;
- case '2': case '@': j = 3; sign = -1; goto FINGER;
- case '3': case '#': j = 2; sign = -1; goto FINGER;
- case '4': case '$': j = 1; sign = -1; goto FINGER;
- case '5': case '%': j = 0; sign = -1; goto FINGER;
-
- case 'q': case 'Q': j = 4; sign = 1; goto FINGER;
- case 'w': case 'W': j = 3; sign = 1; goto FINGER;
- case 'e': case 'E': j = 2; sign = 1; goto FINGER;
- case 'r': case 'R': j = 1; sign = 1; goto FINGER;
- case 't': case 'T': j = 0; sign = 1; goto FINGER;
-
- case 'a': case 'A': tiltp = True; j = 4; sign = 1; goto FINGER;
- case 's': case 'S': tiltp = True; j = 3; sign = 1; goto FINGER;
- case 'd': case 'D': tiltp = True; j = 2; sign = 1; goto FINGER;
- case 'f': case 'F': tiltp = True; j = 1; sign = 1; goto FINGER;
- case 'g': case 'G': tiltp = True; j = 0; sign = 1; goto FINGER;
-
- case 'z': case 'Z': tiltp = True; j = 4; sign = -1; goto FINGER;
- case 'x': case 'X': tiltp = True; j = 3; sign = -1; goto FINGER;
- case 'c': case 'C': tiltp = True; j = 2; sign = -1; goto FINGER;
- case 'v': case 'V': tiltp = True; j = 1; sign = -1; goto FINGER;
- case 'b': case 'B': tiltp = True; j = 0; sign = -1; goto FINGER;
- FINGER:
- ok = True;
- if (tiltp)
- h->base[j] = constrain_joint (h->base[j] + sign * delta,
- bp->geom->fingers[j].base.min,
- bp->geom->fingers[j].base.max);
- else
- for (k = 0; k < nbones; k++)
- h->joint[j][k] =
- constrain_joint (h->joint[j][k] + sign * delta,
- bp->geom->fingers[j].bones[k].min,
- bp->geom->fingers[j].bones[k].max);
- break;
-
- case 'u': case 'U': ok = True; h->wrist[0] -= delta; break;
- case 'j': case 'J': ok = True; h->wrist[0] += delta; break;
- case 'i': case 'I': ok = True; h->wrist[1] += delta; break;
- case 'k': case 'K': ok = True; h->wrist[1] -= delta; break;
- case 'o': case 'O': ok = True; h->wrist[2] -= delta; break;
- case 'l': case 'L': ok = True; h->wrist[2] += delta; break;
-
- case '0': case ')':
- ok = True;
- for (j = 0; j < nfingers; j++)
- {
- h->base[j] = 0;
- for (k = 0; k < nbones; k++)
- h->joint[j][k] = 0;
- }
- for (j = 0; j < 3; j++)
- h->wrist[j] = 0;
- for (j = 0; j < 3; j++)
- h->pos[j] = 0;
- break;
-
- case '\t':
- ok = True;
- fprintf (stdout, "\nstatic const hand H = {\n {");
- for (i = 0; i < nfingers; i++)
- {
- if (i > 0) fprintf (stdout, " ");
- fprintf (stdout, "{");
- for (j = 0; j < nbones; j++)
- {
- double v = h->joint[i][j];
- if (i == 0 && j == 3) v = 0; /* no thumb intermediate */
- if (j == 0) fprintf (stdout, " ");
- fprintf (stdout, "%.2f", v);
- if (j < nbones-1) fprintf (stdout, ", ");
- }
- fprintf (stdout, " }");
- if (i < nfingers-1) fprintf (stdout, ",\n");
- }
- fprintf (stdout, "},\n { ");
- for (i = 0; i < nfingers; i++)
- {
- fprintf (stdout, "%.2f", h->base[i]);
- if (i < nfingers-1) fprintf (stdout, ", ");
- }
- fprintf (stdout, " },\n");
- fprintf (stdout, " { %.2f, %.2f, %.2f },\n",
- h->wrist[0], h->wrist[1], h->wrist[2]);
- fprintf (stdout, " { %.2f, %.2f, %.2f },\n",
- h->pos[0], h->pos[1], h->pos[2]);
- fprintf (stdout, " True\n};\n\n");
- fflush (stdout);
- return ok;
- break;
-
- default: break;
- }
- }
- }
- return ok;
-}
-
-
-ENTRYPOINT void
-init_hands (ModeInfo *mi)
-{
- hands_configuration *bp;
- int wire = MI_IS_WIREFRAME(mi);
- hand def[2];
- int i;
-
- MI_INIT (mi, bps);
- bp = &bps[MI_SCREEN(mi)];
-
- bp->glx_context = init_GL(mi);
-
- reshape_hands (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-
- bp->pair[0].tick = bp->pair[1].tick = 1.0;
- bp->geom = &human_hand;
- bp->nhands = MI_COUNT(mi);
- if (bp->nhands <= 0) bp->nhands = 1;
-
- if (bp->nhands & 1) bp->nhands++; /* Even number */
-
- if (debug_p)
- {
- bp->nhands = 1;
- do_spin = "";
- do_wander = False;
- }
-
- bp->hands = calloc (bp->nhands, sizeof(*bp->hands));
-
- {
- double spin_speed = 0.5 * speed;
- double wander_speed = 0.005 * speed;
- double tilt_speed = 0.001 * speed;
- double spin_accel = 0.5;
-
- char *s = do_spin;
- while (*s)
- {
- if (*s == 'x' || *s == 'X') bp->spinx = True;
- else if (*s == 'y' || *s == 'Y') bp->spiny = True;
- else if (*s == 'z' || *s == 'Z') bp->spinz = True;
- else if (*s == '0') ;
- else
- {
- fprintf (stderr,
- "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
- progname, do_spin);
- exit (1);
- }
- s++;
- }
-
- bp->rot = make_rotator (bp->spinx ? spin_speed : 0,
- bp->spiny ? spin_speed : 0,
- bp->spinz ? spin_speed : 0,
- spin_accel,
- do_wander ? wander_speed : 0,
- False);
- bp->rot2 = (face_front_p
- ? make_rotator (0, 0, 0, 0, tilt_speed, True)
- : 0);
- bp->trackball = gltrackball_init (False);
- }
-
- /* Set default hand to the last hand in the animation list. */
- for (i = 0; i <= 1; i++)
- {
- int j;
- for (j = 0; ; j++)
- if (!all_hand_anims[j+1].pair[i])
- {
- if (! all_hand_anims[j].pair[i]) abort();
- def[i] = *all_hand_anims[j].pair[i]->dest;
- if (debug_p)
- def[i].alpha = 1;
- else
- {
- def[i].pos[1] = 5; /* off screen */
- def[i].pos[2] = 5;
- }
- break;
- }
- }
-
- for (i = 0; i < bp->nhands; i++)
- {
- int sinister = (i & 1);
- bp->hands[i].to = def[sinister];
- bp->hands[i].to.sinister = sinister;
- bp->hands[i].from = bp->hands[i].to;
- bp->hands[i].current = bp->hands[i].to;
- }
-
- glFrontFace(GL_CW);
- bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
- for (i = 0; i < countof(all_objs); i++)
- bp->dlists[i] = glGenLists (1);
-
- for (i = 0; i < countof(all_objs); i++)
- {
- const struct gllist *gll = *all_objs[i];
- GLfloat s = 0.1;
- glNewList (bp->dlists[i], GL_COMPILE);
- switch (i) {
- case GROUND:
- if (! ground)
- ground = (struct gllist *) calloc (1, sizeof(*ground));
- ground->points = draw_ground (mi);
- break;
- default:
- glPushMatrix();
- glScalef (s, s, s);
- renderList (gll, wire);
- glPopMatrix();
- break;
- }
- glEndList ();
- }
-
- if (!wire)
- {
- GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
- GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
- GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
- GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
- glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
- }
-
- parse_color (mi, "foreground", bp->color);
-}
-
-
-static void
-tick_hands (ModeInfo *mi)
-{
- hands_configuration *bp = &bps[MI_SCREEN(mi)];
- int i, j, k, nfingers, nbones, sinister;
- double now = double_time();
-
- if (debug_p) return;
-
- if (!bp->pair[0].anim && /* Both hands finished. */
- !bp->pair[1].anim) /* Pick a new animation. */
- {
- int nanims = 0;
- while (all_hand_anims[nanims].pair[0] ||
- all_hand_anims[nanims].pair[1])
- nanims++;
- i = random() % nanims;
- for (sinister = 0; sinister <= 1; sinister++)
- {
- bp->pair[sinister].anim = all_hand_anims[i].pair[sinister];
- bp->pair[sinister].anim_hand = 0;
- bp->pair[sinister].anim_hands = 0;
- while (bp->pair[sinister].anim[bp->pair[sinister].anim_hands].dest)
- bp->pair[sinister].anim_hands++;
- bp->pair[sinister].anim_start = now;
- bp->pair[sinister].tick = 0;
-
- if (sinister == 1)
- bp->pair[sinister].delay = all_hand_anims[i].delay;
- }
-
- bp->ringp = (all_hand_anims[i].pair[0] == goatse_anim);
-
- for (i = 0; i < bp->nhands; i++)
- {
- sinister = bp->hands[i].from.sinister;
- bp->hands[i].from = bp->hands[i].current;
- bp->hands[i].to = *bp->pair[sinister].anim->dest;
- bp->hands[i].to.sinister = sinister;
-
- j = bp->pair[sinister].anim_hand;
-
- bp->hands[i].to.alpha =
- (bp->pair[sinister].anim == hidden_anim ? 0 : 1);
-
- /* Anim keyframes can adjust position and rotation */
- for (k = 0; k < 3; k++)
- {
- bp->hands[i].to.wrist[k] +=
- bp->pair[sinister].anim[j].rot[k];
- bp->hands[i].to.pos[k] +=
- bp->pair[sinister].anim[j].pos[k];
- }
- }
- }
-
- for (sinister = 0; sinister <= 1; sinister++)
- {
- const hand_anim *h;
- double elapsed, duration, duration2;
-
- if (! bp->pair[sinister].anim) /* Done with this hand, not the other. */
- continue;
-
- h = &bp->pair[sinister].anim[bp->pair[sinister].anim_hand];
-
- elapsed = now - bp->pair[sinister].anim_start;
- duration = h->duration / speed;
- duration2 = duration + (bp->pair[sinister].delay + h->pause) / speed;
-
- if (elapsed > duration2 && /* Done animating and pausing this hand. */
- bp->pair[sinister].tick >= 1) /* ...and painted final frame. */
- {
- bp->pair[sinister].anim_hand++;
- bp->pair[sinister].tick = 1;
- if (bp->pair[sinister].anim_hand >= bp->pair[sinister].anim_hands)
- {
- /* Done with all steps of this hand's animation. */
- bp->pair[sinister].anim = 0;
- for (i = 0; i < bp->nhands; i++)
- if (bp->hands[i].from.sinister == sinister)
- bp->hands[i].from = bp->hands[i].to = bp->hands[i].current;
- }
- else
- {
- /* Move to next step of animation. */
- for (i = 0; i < bp->nhands; i++)
- {
- if (sinister != bp->hands[i].current.sinister)
- continue;
-
- j = bp->pair[sinister].anim_hand;
- bp->hands[i].from = bp->hands[i].current;
- bp->hands[i].to = *bp->pair[sinister].anim[j].dest;
- bp->hands[i].to.alpha =
- (bp->pair[sinister].anim == hidden_anim ? 0 : 1);
-
- /* Anim keyframes can adjust position and rotation */
- for (k = 0; k < 3; k++)
- {
- bp->hands[i].to.wrist[k] +=
- bp->pair[sinister].anim[j].rot[k];
- bp->hands[i].to.pos[k] +=
- bp->pair[sinister].anim[j].pos[k];
- }
- }
- bp->pair[sinister].anim_start = now;
- bp->pair[sinister].tick = 0;
- bp->pair[sinister].delay = 0;
- }
- }
- else if (elapsed > duration) /* Done animating, still pausing. */
- bp->pair[sinister].tick = 1;
- else /* Still animating. */
- bp->pair[sinister].tick = elapsed / duration;
-
- if (bp->pair[sinister].tick > 1)
- bp->pair[sinister].tick = 1;
-
- /* Move the joints into position:
- compute 'current' between 'from' and 'to' by ratio 'tick'. */
-
- nfingers = countof (bp->geom->fingers);
- nbones = countof (bp->geom->fingers[0].bones);
- for (i = 0; i < bp->nhands; i++)
- {
- if (bp->hands[i].current.sinister != sinister)
- continue;
- for (j = 0; j < nfingers; j++)
- {
- for (k = 0; k < nbones; k++)
- bp->hands[i].current.joint[j][k] =
- constrain_joint (bp->hands[i].from.joint[j][k] +
- bp->pair[sinister].tick
- * (bp->hands[i].to.joint[j][k] -
- bp->hands[i].from.joint[j][k]),
- bp->geom->fingers[j].bones[k].min,
- bp->geom->fingers[j].bones[k].max);
- bp->hands[i].current.base[j] =
- constrain_joint (bp->hands[i].from.base[j] +
- bp->pair[sinister].tick
- * (bp->hands[i].to.base[j] -
- bp->hands[i].from.base[j]),
- bp->geom->fingers[j].base.min,
- bp->geom->fingers[j].base.max);
- }
- j = 0;
- bp->hands[i].current.wrist[j] =
- constrain_joint (bp->hands[i].from.wrist[j] +
- bp->pair[sinister].tick
- * (bp->hands[i].to.wrist[j] -
- bp->hands[i].from.wrist[j]),
- bp->geom->palm.min,
- bp->geom->palm.max);
- j = 1;
- bp->hands[i].current.wrist[j] =
- constrain_joint (bp->hands[i].from.wrist[j] +
- bp->pair[sinister].tick
- * (bp->hands[i].to.wrist[j] -
- bp->hands[i].from.wrist[j]),
- bp->geom->wrist1.min,
- bp->geom->wrist1.max);
- j = 2;
- bp->hands[i].current.wrist[j] =
- constrain_joint (bp->hands[i].from.wrist[j] +
- bp->pair[sinister].tick
- * (bp->hands[i].to.wrist[j] -
- bp->hands[i].from.wrist[j]),
- bp->geom->wrist2.min,
- bp->geom->wrist2.max);
- for (j = 0; j < 3; j++)
- bp->hands[i].current.pos[j] =
- constrain_joint (bp->hands[i].from.pos[j] +
- bp->pair[sinister].tick
- * (bp->hands[i].to.pos[j] -
- bp->hands[i].from.pos[j]),
- -999, 999);
- bp->hands[i].current.alpha =
- bp->hands[i].from.alpha +
- bp->pair[sinister].tick *
- (bp->hands[i].to.alpha - bp->hands[i].from.alpha);
- }
- }
-}
-
-
-ENTRYPOINT void
-draw_hands (ModeInfo *mi)
-{
- hands_configuration *bp = &bps[MI_SCREEN(mi)];
- Display *dpy = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GLfloat s;
- int i;
-
- static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
- static const GLfloat bshiny = 128.0;
- GLfloat bcolor[4] = { 0.7, 0.7, 1.0, 1.0 };
-
- if (!bp->glx_context)
- return;
-
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glEnable(GL_CULL_FACE);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix ();
-
- glRotatef(current_device_rotation(), 0, 0, 1);
-
- s = 10;
- glScalef (s, s, s);
-
- {
- double x, y, z;
-
- gltrackball_rotate (bp->trackball);
-
- if (face_front_p)
- {
- double maxx = 120 / 10.0;
- double maxy = 55 / 10.0;
- double maxz = 40 / 10.0;
- get_position (bp->rot2, &x, &y, &z, !bp->button_down_p);
- if (bp->spinx) glRotatef (maxx/2 - x*maxx, 0, 1, 0);
- if (bp->spiny) glRotatef (maxy/2 - y*maxy, 1, 0, 0);
- if (bp->spinz) glRotatef (maxz/2 - z*maxz, 0, 0, 1);
- }
- else
- {
- get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
- glRotatef (x * 360, 1, 0, 0);
- glRotatef (y * 360, 0, 1, 0);
- glRotatef (z * 360, 0, 0, 1);
- }
-
- glRotatef (-70, 1, 0, 0);
-
- glTranslatef (0, 0, -0.5);
-
- glPushMatrix();
- glRotatef ((bp->spiny ? y : bp->spinx ? x : z) * 90, 0, 0, 1);
- glCallList (bp->dlists[GROUND]);
- glPopMatrix();
-
- get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
- z += 1; /* Origin of hands is 1.0 above floor. */
- glTranslatef((x - 0.5) * 0.8,
- (y - 0.5) * 1.1,
- (z - 0.5) * 0.2);
- }
-
- glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
- glMateriali (GL_FRONT, GL_SHININESS, bshiny);
- glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
-
- {
- /* Lay the pairs out in a square-ish grid, keeping pairs together. */
- int rows = sqrt (bp->nhands / 2);
- int cols;
- int x, y;
-
- cols = ceil (bp->nhands / 2.0 / rows);
-
- if (bp->nhands <= 2)
- rows = cols = 1;
-
- if (MI_WIDTH(mi) < MI_HEIGHT(mi)) /* Portrait */
- {
- s = 0.5;
- glScalef (s, s, s);
- }
-
- if (bp->nhands == 1)
- glScalef (2, 2, 2);
-
- if (cols > 1)
- {
- s = 1.0 / rows;
- glScalef (s, s, s);
- }
-
- if (bp->nhands > 1)
- {
- s = 0.8;
- glTranslatef (-s * rows * 1.5, -s * cols, 0);
- glTranslatef (s, s, 0);
- }
-
- i = 0;
- for (y = 0; y < cols; y++)
- for (x = 0; x < rows; x++)
- {
- glPushMatrix();
- glTranslatef (x * s * 3, y * s * 2, y * s);
- if (i < bp->nhands)
- draw_hand (mi, &bp->hands[i++].current);
- glTranslatef (s, 0, 0);
- if (i < bp->nhands)
- draw_hand (mi, &bp->hands[i++].current);
- glPopMatrix();
- }
- }
- glPopMatrix();
-
- tick_hands (mi);
-
- if (mi->fps_p) do_fps (mi);
- glFinish();
-
- glXSwapBuffers(dpy, window);
-}
-
-
-ENTRYPOINT void
-free_hands (ModeInfo *mi)
-{
- hands_configuration *bp = &bps[MI_SCREEN(mi)];
- int i;
- if (!bp->glx_context) return;
- glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context);
- if (bp->rot) free_rotator (bp->rot);
- if (bp->trackball) gltrackball_free (bp->trackball);
-
- if (bp->dlists) {
- for (i = 0; i < countof(all_objs); i++)
- if (glIsList(bp->dlists[i])) glDeleteLists(bp->dlists[i], 1);
- free (bp->dlists);
- }
-}
-
-XSCREENSAVER_MODULE_2 ("Handsy", handsy, hands)
-
-#endif /* USE_GL */
diff --git a/hacks/glx/handsy.dxf b/hacks/glx/handsy.dxf
deleted file mode 100644
index c455186..0000000
--- a/hacks/glx/handsy.dxf
+++ /dev/null
@@ -1,67706 +0,0 @@
- 0
-SECTION
- 2
-ENTITIES
- 0
-3DFACE
- 8
-finger proximal
-10
--0.18812188165369287
-20
--1.1102230246251565e-15
-30
-2.0022820636598677
-11
--0.1330222582069191
-21
-0.19156135043888822
-31
-2.0445614917581056
-12
--0.18812188165372756
-22
-0.19156135043889155
-32
-2.00228206365989
-13
--0.18812188165372756
-23
-0.19156135043889155
-33
-2.00228206365989
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.1330222582069191
-20
-0.19156135043888822
-30
-2.0445614917581056
-11
--0.18812188165369287
-21
--1.1102230246251565e-15
-31
-2.0022820636598677
-12
--0.13302225820690117
-22
--1.1102230246251565e-15
-32
-2.044561491758081
-13
--0.13302225820690117
-23
--1.1102230246251565e-15
-33
-2.044561491758081
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.23040130975195694
-20
--1.1102230246251565e-15
-30
-1.9471824402131095
-11
-0.188121881653721
-21
-0.19156135043889155
-31
-2.002282063659892
-12
-0.18812188165372434
-22
--2.220446049250313e-15
-32
-2.002282063659901
-13
-0.18812188165372434
-23
--2.220446049250313e-15
-33
-2.002282063659901
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.188121881653721
-20
-0.19156135043889155
-30
-2.002282063659892
-11
-0.23040130975195694
-21
--1.1102230246251565e-15
-31
-1.9471824402131095
-12
-0.2304013097519334
-22
-0.19156135043889155
-32
-1.9471824402130984
-13
-0.2304013097519334
-23
-0.19156135043889155
-33
-1.9471824402130984
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.23040130975190468
-20
--1.1102230246251565e-15
-30
-1.6811379237992659
-11
--0.18812188165372756
-21
-0.19156135043889044
-31
-1.6260383003524492
-12
--0.1881218816537231
-22
--2.220446049250313e-15
-32
-1.626038300352452
-13
--0.1881218816537231
-23
--2.220446049250313e-15
-33
-1.626038300352452
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.18812188165372756
-20
-0.19156135043889044
-30
-1.6260383003524492
-11
--0.23040130975190468
-21
--1.1102230246251565e-15
-31
-1.6811379237992659
-12
--0.23040130975192985
-22
-0.19156135043889155
-32
-1.6811379237992548
-13
--0.23040130975192985
-23
-0.19156135043889155
-33
-1.6811379237992548
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.23040130975192985
-20
-0.19156135043889155
-30
-1.9471824402130984
-11
--0.2569792693466746
-21
--1.1102230246251565e-15
-31
-1.8830175696991678
-12
--0.23040130975189796
-22
--2.220446049250313e-15
-32
-1.947182440213074
-13
--0.23040130975189796
-23
--2.220446049250313e-15
-33
-1.947182440213074
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2569792693466746
-20
--1.1102230246251565e-15
-30
-1.8830175696991678
-11
--0.23040130975192985
-21
-0.19156135043889155
-31
-1.9471824402130984
-12
--0.2569792693467132
-22
-0.19156135043888933
-32
-1.88301756969917
-13
--0.2569792693467132
-23
-0.19156135043888933
-33
-1.88301756969917
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.13302225820690117
-20
--1.1102230246251565e-15
-30
-2.044561491758081
-11
--0.06885738769298949
-21
-0.19156135043889155
-31
-2.0711394513528925
-12
--0.1330222582069191
-22
-0.19156135043888822
-32
-2.0445614917581056
-13
--0.1330222582069191
-23
-0.19156135043888822
-33
-2.0445614917581056
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.06885738769298949
-20
-0.19156135043889155
-30
-2.0711394513528925
-11
--0.13302225820690117
-21
--1.1102230246251565e-15
-31
-2.044561491758081
-12
--0.06885738769298727
-22
-0.0
-32
-2.0711394513528703
-13
--0.06885738769298727
-23
-0.0
-33
-2.0711394513528703
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-1.7763568394002505e-15
-20
--2.220446049250313e-15
-30
-2.0802046984199913
-11
-0.06885738769298744
-21
-0.19156135043889044
-31
-2.0711394513528925
-12
--9.992007221626409e-16
-22
-0.19156135043889155
-32
-2.08020469842002
-13
--9.992007221626409e-16
-23
-0.19156135043889155
-33
-2.08020469842002
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.06885738769298744
-20
-0.19156135043889044
-30
-2.0711394513528925
-11
-1.7763568394002505e-15
-21
--2.220446049250313e-15
-31
-2.0802046984199913
-12
-0.06885738769298966
-22
--1.1102230246251565e-15
-32
-2.071139451352888
-13
-0.06885738769298966
-23
--1.1102230246251565e-15
-33
-2.071139451352888
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2660445164138411
-20
-0.19156135043889155
-30
-1.8141601820061808
-11
--0.25697926934668525
-21
--1.1102230246251565e-15
-31
-1.745302794313192
-12
--0.26604451641381477
-22
--2.220446049250313e-15
-32
-1.8141601820061808
-13
--0.26604451641381477
-23
--2.220446049250313e-15
-33
-1.8141601820061808
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.25697926934668525
-20
--1.1102230246251565e-15
-30
-1.745302794313192
-11
--0.2660445164138411
-21
-0.19156135043889155
-31
-1.8141601820061808
-12
--0.2569792693467132
-22
-0.19156135043889155
-32
-1.745302794313181
-13
--0.2569792693467132
-23
-0.19156135043889155
-33
-1.745302794313181
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2569792693466746
-20
--1.1102230246251565e-15
-30
-1.8830175696991678
-11
--0.2660445164138411
-21
-0.19156135043889155
-31
-1.8141601820061808
-12
--0.26604451641381477
-22
--2.220446049250313e-15
-32
-1.8141601820061808
-13
--0.26604451641381477
-23
--2.220446049250313e-15
-33
-1.8141601820061808
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2660445164138411
-20
-0.19156135043889155
-30
-1.8141601820061808
-11
--0.2569792693466746
-21
--1.1102230246251565e-15
-31
-1.8830175696991678
-12
--0.2569792693467132
-22
-0.19156135043888933
-32
-1.88301756969917
-13
--0.2569792693467132
-23
-0.19156135043888933
-33
-1.88301756969917
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2569792693467132
-20
-0.19156135043889155
-30
-1.745302794313181
-11
--0.23040130975190468
-21
--1.1102230246251565e-15
-31
-1.6811379237992659
-12
--0.25697926934668525
-22
--1.1102230246251565e-15
-32
-1.745302794313192
-13
--0.25697926934668525
-23
--1.1102230246251565e-15
-33
-1.745302794313192
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.23040130975190468
-20
--1.1102230246251565e-15
-30
-1.6811379237992659
-11
--0.2569792693467132
-21
-0.19156135043889155
-31
-1.745302794313181
-12
--0.23040130975192985
-22
-0.19156135043889155
-32
-1.6811379237992548
-13
--0.23040130975192985
-23
-0.19156135043889155
-33
-1.6811379237992548
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.06885738769298966
-20
--1.1102230246251565e-15
-30
-2.071139451352888
-11
-0.13302225820692148
-21
-0.19156135043888933
-31
-2.0445614917581056
-12
-0.06885738769298744
-22
-0.19156135043889044
-32
-2.0711394513528925
-13
-0.06885738769298744
-23
-0.19156135043889044
-33
-2.0711394513528925
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.13302225820692148
-20
-0.19156135043888933
-30
-2.0445614917581056
-11
-0.06885738769298966
-21
--1.1102230246251565e-15
-31
-2.071139451352888
-12
-0.1330222582069237
-22
--1.1102230246251565e-15
-32
-2.044561491758108
-13
-0.1330222582069237
-23
--1.1102230246251565e-15
-33
-2.044561491758108
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.1330222582069237
-20
--1.1102230246251565e-15
-30
-2.044561491758108
-11
-0.188121881653721
-21
-0.19156135043889155
-31
-2.002282063659892
-12
-0.13302225820692148
-22
-0.19156135043888933
-32
-2.0445614917581056
-13
-0.13302225820692148
-23
-0.19156135043888933
-33
-2.0445614917581056
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.188121881653721
-20
-0.19156135043889155
-30
-2.002282063659892
-11
-0.1330222582069237
-21
--1.1102230246251565e-15
-31
-2.044561491758108
-12
-0.18812188165372434
-22
--2.220446049250313e-15
-32
-2.002282063659901
-13
-0.18812188165372434
-23
--2.220446049250313e-15
-33
-2.002282063659901
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.06885738769298727
-20
-0.0
-30
-2.0711394513528703
-11
--9.992007221626409e-16
-21
-0.19156135043889155
-31
-2.08020469842002
-12
--0.06885738769298949
-22
-0.19156135043889155
-32
-2.0711394513528925
-13
--0.06885738769298949
-23
-0.19156135043889155
-33
-2.0711394513528925
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--9.992007221626409e-16
-20
-0.19156135043889155
-30
-2.08020469842002
-11
--0.06885738769298727
-21
-0.0
-31
-2.0711394513528703
-12
-1.7763568394002505e-15
-22
--2.220446049250313e-15
-32
-2.0802046984199913
-13
-1.7763568394002505e-15
-23
--2.220446049250313e-15
-33
-2.0802046984199913
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.26604451641384186
-20
-0.19156135043889044
-30
-1.8141601820061786
-11
-0.25697926934670945
-21
--1.1102230246251565e-15
-31
-1.8830175696991722
-12
-0.2660445164138424
-22
--2.220446049250313e-15
-32
-1.814160182006172
-13
-0.2660445164138424
-23
--2.220446049250313e-15
-33
-1.814160182006172
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.25697926934670945
-20
--1.1102230246251565e-15
-30
-1.8830175696991722
-11
-0.26604451641384186
-21
-0.19156135043889044
-31
-1.8141601820061786
-12
-0.2569792693467089
-22
-0.19156135043889155
-32
-1.88301756969917
-13
-0.2569792693467089
-23
-0.19156135043889155
-33
-1.88301756969917
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2569792693467089
-20
-0.19156135043889155
-30
-1.88301756969917
-11
-0.23040130975195694
-21
--1.1102230246251565e-15
-31
-1.9471824402131095
-12
-0.25697926934670945
-22
--1.1102230246251565e-15
-32
-1.8830175696991722
-13
-0.25697926934670945
-23
--1.1102230246251565e-15
-33
-1.8830175696991722
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.23040130975195694
-20
--1.1102230246251565e-15
-30
-1.9471824402131095
-11
-0.2569792693467089
-21
-0.19156135043889155
-31
-1.88301756969917
-12
-0.2304013097519334
-22
-0.19156135043889155
-32
-1.9471824402130984
-13
-0.2304013097519334
-23
-0.19156135043889155
-33
-1.9471824402130984
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.18812188165369287
-20
--1.1102230246251565e-15
-30
-2.0022820636598677
-11
--0.23040130975192985
-21
-0.19156135043889155
-31
-1.9471824402130984
-12
--0.23040130975189796
-22
--2.220446049250313e-15
-32
-1.947182440213074
-13
--0.23040130975189796
-23
--2.220446049250313e-15
-33
-1.947182440213074
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.23040130975192985
-20
-0.19156135043889155
-30
-1.9471824402130984
-11
--0.18812188165369287
-21
--1.1102230246251565e-15
-31
-2.0022820636598677
-12
--0.18812188165372756
-22
-0.19156135043889155
-32
-2.00228206365989
-13
--0.18812188165372756
-23
-0.19156135043889155
-33
-2.00228206365989
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.23040130975192985
-20
-0.19156135043889155
-30
-1.6811379237992548
-11
-6.661338147750939e-16
-21
-0.19156135043889155
-31
-1.8141601820061741
-12
--0.18812188165372756
-22
-0.19156135043889044
-32
-1.6260383003524492
-13
--0.18812188165372756
-23
-0.19156135043889044
-33
-1.6260383003524492
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-6.661338147750939e-16
-20
-0.19156135043889155
-30
-1.8141601820061741
-11
--0.23040130975192985
-21
-0.19156135043889155
-31
-1.6811379237992548
-12
--0.2569792693467132
-22
-0.19156135043889155
-32
-1.745302794313181
-13
--0.2569792693467132
-23
-0.19156135043889155
-33
-1.745302794313181
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-6.661338147750939e-16
-20
-0.19156135043889155
-30
-1.8141601820061741
-11
--0.2569792693467132
-21
-0.19156135043889155
-31
-1.745302794313181
-12
--0.2660445164138411
-22
-0.19156135043889155
-32
-1.8141601820061808
-13
--0.2660445164138411
-23
-0.19156135043889155
-33
-1.8141601820061808
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-6.661338147750939e-16
-20
-0.19156135043889155
-30
-1.8141601820061741
-11
--0.2660445164138411
-21
-0.19156135043889155
-31
-1.8141601820061808
-12
-0.26604451641384186
-22
-0.19156135043889044
-32
-1.8141601820061786
-13
-0.26604451641384186
-23
-0.19156135043889044
-33
-1.8141601820061786
-70
-15
- 0
-3DFACE
- 8
-finger proximal
-10
-0.26604451641384186
-20
-0.19156135043889044
-30
-1.8141601820061786
-11
--0.2660445164138411
-21
-0.19156135043889155
-31
-1.8141601820061808
-12
-0.2569792693467089
-22
-0.19156135043889155
-32
-1.88301756969917
-13
-0.2569792693467089
-23
-0.19156135043889155
-33
-1.88301756969917
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2569792693467089
-20
-0.19156135043889155
-30
-1.88301756969917
-11
--0.2660445164138411
-21
-0.19156135043889155
-31
-1.8141601820061808
-12
--0.2569792693467132
-22
-0.19156135043888933
-32
-1.88301756969917
-13
--0.2569792693467132
-23
-0.19156135043888933
-33
-1.88301756969917
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2569792693467089
-20
-0.19156135043889155
-30
-1.88301756969917
-11
--0.2569792693467132
-21
-0.19156135043888933
-31
-1.88301756969917
-12
--0.23040130975192985
-22
-0.19156135043889155
-32
-1.9471824402130984
-13
--0.23040130975192985
-23
-0.19156135043889155
-33
-1.9471824402130984
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2569792693467089
-20
-0.19156135043889155
-30
-1.88301756969917
-11
--0.23040130975192985
-21
-0.19156135043889155
-31
-1.9471824402130984
-12
-0.2304013097519334
-22
-0.19156135043889155
-32
-1.9471824402130984
-13
-0.2304013097519334
-23
-0.19156135043889155
-33
-1.9471824402130984
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2304013097519334
-20
-0.19156135043889155
-30
-1.9471824402130984
-11
--0.23040130975192985
-21
-0.19156135043889155
-31
-1.9471824402130984
-12
--0.18812188165372756
-22
-0.19156135043889155
-32
-2.00228206365989
-13
--0.18812188165372756
-23
-0.19156135043889155
-33
-2.00228206365989
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2304013097519334
-20
-0.19156135043889155
-30
-1.9471824402130984
-11
--0.18812188165372756
-21
-0.19156135043889155
-31
-2.00228206365989
-12
-0.188121881653721
-22
-0.19156135043889155
-32
-2.002282063659892
-13
-0.188121881653721
-23
-0.19156135043889155
-33
-2.002282063659892
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.188121881653721
-20
-0.19156135043889155
-30
-2.002282063659892
-11
--0.18812188165372756
-21
-0.19156135043889155
-31
-2.00228206365989
-12
--0.1330222582069191
-22
-0.19156135043888822
-32
-2.0445614917581056
-13
--0.1330222582069191
-23
-0.19156135043888822
-33
-2.0445614917581056
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.188121881653721
-20
-0.19156135043889155
-30
-2.002282063659892
-11
--0.1330222582069191
-21
-0.19156135043888822
-31
-2.0445614917581056
-12
-0.13302225820692148
-22
-0.19156135043888933
-32
-2.0445614917581056
-13
-0.13302225820692148
-23
-0.19156135043888933
-33
-2.0445614917581056
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.13302225820692148
-20
-0.19156135043888933
-30
-2.0445614917581056
-11
--0.1330222582069191
-21
-0.19156135043888822
-31
-2.0445614917581056
-12
--0.06885738769298949
-22
-0.19156135043889155
-32
-2.0711394513528925
-13
--0.06885738769298949
-23
-0.19156135043889155
-33
-2.0711394513528925
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.13302225820692148
-20
-0.19156135043888933
-30
-2.0445614917581056
-11
--0.06885738769298949
-21
-0.19156135043889155
-31
-2.0711394513528925
-12
-0.06885738769298744
-22
-0.19156135043889044
-32
-2.0711394513528925
-13
-0.06885738769298744
-23
-0.19156135043889044
-33
-2.0711394513528925
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.06885738769298744
-20
-0.19156135043889044
-30
-2.0711394513528925
-11
--0.06885738769298949
-21
-0.19156135043889155
-31
-2.0711394513528925
-12
--9.992007221626409e-16
-22
-0.19156135043889155
-32
-2.08020469842002
-13
--9.992007221626409e-16
-23
-0.19156135043889155
-33
-2.08020469842002
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.26604451641384186
-20
-0.19156135043889044
-30
-1.8141601820061786
-11
-0.261211438220872
-21
-0.19156135043889044
-31
-1.777449308444807
-12
-6.661338147750939e-16
-22
-0.19156135043889155
-32
-1.8141601820061741
-13
-6.661338147750939e-16
-23
-0.19156135043889155
-33
-1.8141601820061741
-70
-12
- 0
-3DFACE
- 8
-finger proximal
-10
--0.18812188165372756
-20
-0.19156135043889044
-30
-1.6260383003524492
-11
--0.3424871358064196
-21
--2.220446049250313e-15
-31
-1.4716730461997534
-12
--0.1881218816537231
-22
--2.220446049250313e-15
-32
-1.626038300352452
-13
--0.1881218816537231
-23
--2.220446049250313e-15
-33
-1.626038300352452
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.3424871358064196
-20
--2.220446049250313e-15
-30
-1.4716730461997534
-11
--0.18812188165372756
-21
-0.19156135043889044
-31
-1.6260383003524492
-12
--0.33052374502961596
-22
-0.08856357055999653
-32
-1.4836364369765538
-13
--0.33052374502961596
-23
-0.08856357055999653
-33
-1.4836364369765538
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.33052374502961596
-20
-0.08856357055999653
-30
-1.4836364369765538
-11
--0.18812188165372756
-21
-0.19156135043889044
-31
-1.6260383003524492
-12
--0.2955708619933719
-22
-0.1706479167364875
-32
-1.518589320012799
-13
--0.2955708619933719
-23
-0.1706479167364875
-33
-1.518589320012799
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2955708619933719
-20
-0.1706479167364875
-30
-1.518589320012799
-11
--0.18812188165372756
-21
-0.19156135043889044
-31
-1.6260383003524492
-12
--0.24034094956198906
-22
-0.2403409495619936
-32
-1.5738192324441853
-13
--0.24034094956198906
-23
-0.2403409495619936
-33
-1.5738192324441853
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.24034094956198906
-20
-0.2403409495619936
-30
-1.5738192324441853
-11
--0.18812188165372756
-21
-0.19156135043889044
-31
-1.6260383003524492
-12
-6.661338147750939e-16
-22
-0.19156135043889155
-32
-1.8141601820061741
-13
-6.661338147750939e-16
-23
-0.19156135043889155
-33
-1.8141601820061741
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.24034094956198906
-20
-0.2403409495619936
-30
-1.5738192324441853
-11
-6.661338147750939e-16
-21
-0.19156135043889155
-31
-1.8141601820061741
-12
-1.1102230246251565e-16
-22
-0.33379067100000304
-32
-1.8141601820061741
-13
-1.1102230246251565e-16
-23
-0.33379067100000304
-33
-1.8141601820061741
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.24034094956198906
-20
-0.2403409495619936
-30
-1.5738192324441853
-11
-1.1102230246251565e-16
-21
-0.33379067100000304
-31
-1.8141601820061741
-12
--0.16904149407111246
-22
-0.2927884563185241
-32
-1.645118687935059
-13
--0.16904149407111246
-23
-0.2927884563185241
-33
-1.645118687935059
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.16904149407111246
-20
-0.2927884563185241
-30
-1.645118687935059
-11
-1.1102230246251565e-16
-21
-0.33379067100000304
-31
-1.8141601820061741
-12
--0.08696289916304184
-22
-0.32454995804996933
-32
-1.7271972828431308
-13
--0.08696289916304184
-23
-0.32454995804996933
-33
-1.7271972828431308
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.33052374502961596
-20
-0.08856357055999653
-30
-1.4836364369765538
-11
--0.36643493196576155
-21
-6.894044639604857e-07
-31
-0.36643493196577
-12
--0.3424871358064196
-22
--2.220446049250313e-15
-32
-1.4716730461997534
-13
--0.3424871358064196
-23
--2.220446049250313e-15
-33
-1.4716730461997534
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.36643493196576155
-20
-6.894044639604857e-07
-30
-0.36643493196577
-11
--0.33052374502961596
-21
-0.08856357055999653
-31
-1.4836364369765538
-12
--0.3541898489439894
-22
-0.09490488399184593
-32
-0.3541898489439996
-13
--0.3541898489439894
-23
-0.09490488399184593
-33
-0.3541898489439996
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2955708619933719
-20
-0.1706479167364875
-30
-1.518589320012799
-11
--0.3541898489439894
-21
-0.09490488399184593
-31
-0.3541898489439996
-12
--0.33052374502961596
-22
-0.08856357055999653
-32
-1.4836364369765538
-13
--0.33052374502961596
-23
-0.08856357055999653
-33
-1.4836364369765538
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.3541898489439894
-20
-0.09490488399184593
-30
-0.3541898489439996
-11
--0.2955708619933719
-21
-0.1706479167364875
-31
-1.518589320012799
-12
--0.34654102806927234
-22
-0.11372420208085299
-32
-0.34654102806927917
-13
--0.34654102806927234
-23
-0.11372420208085299
-33
-0.34654102806927917
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.31821039848923144
-20
-0.18371885922669984
-30
-0.31821039848924043
-11
--0.34654102806927234
-21
-0.11372420208085299
-31
-0.34654102806927917
-12
--0.2955708619933719
-22
-0.1706479167364875
-32
-1.518589320012799
-13
--0.2955708619933719
-23
-0.1706479167364875
-33
-1.518589320012799
-70
-0
- 0
-3DFACE
- 8
-finger proximal
-10
--0.24034094956198906
-20
-0.2403409495619936
-30
-1.5738192324441853
-11
--0.31821039848923144
-21
-0.18371885922669984
-31
-0.31821039848924043
-12
--0.2955708619933719
-22
-0.1706479167364875
-32
-1.518589320012799
-13
--0.2955708619933719
-23
-0.1706479167364875
-33
-1.518589320012799
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.31821039848923144
-20
-0.18371885922669984
-30
-0.31821039848924043
-11
--0.24034094956198906
-21
-0.2403409495619936
-31
-1.5738192324441853
-12
--0.30780841448952007
-22
-0.1975803495231122
-32
-0.30780841448952795
-13
--0.30780841448952007
-23
-0.1975803495231122
-33
-0.30780841448952795
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.24034094956198906
-20
-0.2403409495619936
-30
-1.5738192324441853
-11
--0.2885829061834132
-21
-0.22332138636309273
-31
-0.28858290618342114
-12
--0.30780841448952007
-22
-0.1975803495231122
-32
-0.30780841448952795
-13
--0.30780841448952007
-23
-0.1975803495231122
-33
-0.30780841448952795
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.2885829061834132
-20
-0.22332138636309273
-30
-0.28858290618342114
-11
--0.24034094956198906
-21
-0.2403409495619936
-31
-1.5738192324441853
-12
--0.2606802535046579
-22
-0.26068025350466195
-32
-0.2606802535046641
-13
--0.2606802535046579
-23
-0.26068025350466195
-33
-0.2606802535046641
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.24034094956198906
-20
-0.2403409495619936
-30
-1.5738192324441853
-11
--0.19372715732247747
-21
-0.3138879622371804
-31
-0.19372715732248486
-12
--0.2606802535046579
-22
-0.26068025350466195
-32
-0.2606802535046641
-13
--0.2606802535046579
-23
-0.26068025350466195
-33
-0.2606802535046641
-70
-0
- 0
-3DFACE
- 8
-finger proximal
-10
--0.19372715732247747
-20
-0.3138879622371804
-30
-0.19372715732248486
-11
--0.16904149407111246
-21
-0.2927884563185241
-31
-1.645118687935059
-12
--0.18514211013161566
-22
-0.3206755413684731
-32
-0.1851421101316219
-13
--0.18514211013161566
-23
-0.3206755413684731
-33
-0.1851421101316219
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.16904149407111246
-20
-0.2927884563185241
-30
-1.645118687935059
-11
--0.19372715732247747
-21
-0.3138879622371804
-31
-0.19372715732248486
-12
--0.24034094956198906
-22
-0.2403409495619936
-32
-1.5738192324441853
-13
--0.24034094956198906
-23
-0.2403409495619936
-33
-1.5738192324441853
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.16904149407111246
-20
-0.2927884563185241
-30
-1.645118687935059
-11
--0.1013377420365758
-21
-0.3573720124041593
-31
-0.1013377420365838
-12
--0.18514211013161566
-22
-0.3206755413684731
-32
-0.1851421101316219
-13
--0.18514211013161566
-23
-0.3206755413684731
-33
-0.1851421101316219
-70
-0
- 0
-3DFACE
- 8
-finger proximal
-10
--0.1013377420365758
-20
-0.3573720124041593
-30
-0.1013377420365838
-11
--0.08696289916304184
-21
-0.32454995804996933
-31
-1.7271972828431308
-12
--0.09633958547085791
-22
-0.3595442277573727
-32
-0.09633958547086535
-13
--0.09633958547085791
-23
-0.3595442277573727
-33
-0.09633958547086535
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.08696289916304184
-20
-0.32454995804996933
-30
-1.7271972828431308
-11
--0.1013377420365758
-21
-0.3573720124041593
-31
-0.1013377420365838
-12
--0.16904149407111246
-22
-0.2927884563185241
-32
-1.645118687935059
-13
--0.16904149407111246
-23
-0.2927884563185241
-33
-1.645118687935059
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.08696289916304184
-20
-0.32454995804996933
-30
-1.7271972828431308
-11
-1.1102230246251565e-16
-21
-0.37319459270527366
-31
-0.05244907956522271
-12
--0.002638372221004881
-22
-0.3728562895769836
-32
-0.05240153416118987
-13
--0.002638372221004881
-23
-0.3728562895769836
-33
-0.05240153416118987
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-1.1102230246251565e-16
-20
-0.37319459270527366
-30
-0.05244907956522271
-11
--0.08696289916304184
-21
-0.32454995804996933
-31
-1.7271972828431308
-12
-1.1102230246251565e-16
-22
-0.33379067100000304
-32
-1.8141601820061741
-13
-1.1102230246251565e-16
-23
-0.33379067100000304
-33
-1.8141601820061741
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.09660018260574987
-20
-0.36051678950509547
-30
-0.050667330521278475
-11
-0.16715806244605846
-21
-0.28952625705134216
-31
-1.7906676483827717
-12
-0.18667566717603135
-22
-0.3233317400856974
-32
-0.04544131263742729
-13
-0.18667566717603135
-23
-0.3233317400856974
-33
-0.04544131263742729
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.16715806244605846
-20
-0.28952625705134216
-30
-1.7906676483827717
-11
-0.09660018260574987
-21
-0.36051678950509547
-31
-0.050667330521278475
-12
-0.08646172679066877
-22
-0.3226795572929172
-32
-1.8020087787532109
-13
-0.08646172679066877
-23
-0.3226795572929172
-33
-1.8020087787532109
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.3731945927052738
-20
-1.1102230246251565e-15
-30
-0.05244907956522721
-11
-0.32339898045021165
-21
-0.08665449564468308
-31
-1.7687094193518036
-12
-0.334843235733576
-22
-0.0
-32
-1.7671010341617321
-13
-0.334843235733576
-23
-0.0
-33
-1.7671010341617321
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.32339898045021165
-20
-0.08665449564468308
-30
-1.7687094193518036
-11
-0.3731945927052738
-21
-1.1102230246251565e-15
-31
-0.05244907956522721
-12
-0.360516789505095
-22
-0.09660018260575365
-32
-0.050667330521278475
-13
-0.360516789505095
-23
-0.09660018260575365
-33
-0.050667330521278475
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.3233317400856941
-20
-0.18667566717602557
-30
-0.04544131263742618
-11
-0.23655144370181413
-21
-0.23655144370181402
-31
-1.7809150446582704
-12
-0.28986029081458276
-22
-0.16735091692918358
-32
-1.773422974788019
-13
-0.28986029081458276
-23
-0.16735091692918358
-33
-1.773422974788019
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.23655144370181413
-20
-0.23655144370181402
-30
-1.7809150446582704
-11
-0.3233317400856941
-21
-0.18667566717602557
-31
-0.04544131263742618
-12
-0.2800330587934533
-22
-0.24332527544562987
-32
-0.0393560798271011
-13
-0.2800330587934533
-23
-0.24332527544562987
-33
-0.0393560798271011
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.23655144370181413
-20
-0.23655144370181402
-30
-1.7809150446582704
-11
-0.2800330587934533
-21
-0.24332527544562987
-31
-0.0393560798271011
-12
-0.2641308495701662
-22
-0.26413084957016775
-32
-0.037121170069247644
-13
-0.2641308495701662
-23
-0.26413084957016775
-33
-0.037121170069247644
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.18667566717603135
-20
-0.3233317400856974
-30
-0.04544131263742729
-11
-0.23655144370181413
-21
-0.23655144370181402
-31
-1.7809150446582704
-12
-0.2641308495701662
-22
-0.26413084957016775
-32
-0.037121170069247644
-13
-0.2641308495701662
-23
-0.26413084957016775
-33
-0.037121170069247644
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.23655144370181413
-20
-0.23655144370181402
-30
-1.7809150446582704
-11
-0.18667566717603135
-21
-0.3233317400856974
-31
-0.04544131263742729
-12
-0.16715806244605846
-22
-0.28952625705134216
-32
-1.7906676483827717
-13
-0.16715806244605846
-23
-0.28952625705134216
-33
-1.7906676483827717
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.360516789505095
-20
-0.09660018260575365
-30
-0.050667330521278475
-11
-0.28986029081458276
-21
-0.16735091692918358
-31
-1.773422974788019
-12
-0.32339898045021165
-22
-0.08665449564468308
-32
-1.7687094193518036
-13
-0.32339898045021165
-23
-0.08665449564468308
-33
-1.7687094193518036
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.28986029081458276
-20
-0.16735091692918358
-30
-1.773422974788019
-11
-0.360516789505095
-21
-0.09660018260575365
-31
-0.050667330521278475
-12
-0.3233317400856941
-22
-0.18667566717602557
-32
-0.04544131263742618
-13
-0.3233317400856941
-23
-0.18667566717602557
-33
-0.04544131263742618
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.03798528133991513
-20
-0.3682094062559258
-30
-0.051748457300486994
-11
-0.08646172679066877
-21
-0.3226795572929172
-31
-1.8020087787532109
-12
-0.09660018260574987
-22
-0.36051678950509547
-32
-0.050667330521278475
-13
-0.09660018260574987
-23
-0.36051678950509547
-33
-0.050667330521278475
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.08646172679066877
-20
-0.3226795572929172
-30
-1.8020087787532109
-11
-0.03798528133991513
-21
-0.3682094062559258
-31
-0.051748457300486994
-12
-1.1102230246251565e-16
-22
-0.37319459270527366
-32
-0.05244907956522271
-13
-1.1102230246251565e-16
-23
-0.37319459270527366
-33
-0.05244907956522271
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.08646172679066877
-20
-0.3226795572929172
-30
-1.8020087787532109
-11
-1.1102230246251565e-16
-21
-0.37319459270527366
-31
-0.05244907956522271
-12
-1.1102230246251565e-16
-22
-0.33379067100000304
-32
-1.8141601820061741
-13
-1.1102230246251565e-16
-23
-0.33379067100000304
-33
-1.8141601820061741
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.26121143822087256
-20
-0.0
-30
-1.7774493084448049
-11
-0.26604451641384186
-21
-0.19156135043889044
-31
-1.8141601820061786
-12
-0.2660445164138424
-22
--2.220446049250313e-15
-32
-1.814160182006172
-13
-0.2660445164138424
-23
--2.220446049250313e-15
-33
-1.814160182006172
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.26604451641384186
-20
-0.19156135043889044
-30
-1.8141601820061786
-11
-0.26121143822087256
-21
-0.0
-31
-1.7774493084448049
-12
-0.261211438220872
-22
-0.19156135043889044
-32
-1.777449308444807
-13
-0.261211438220872
-23
-0.19156135043889044
-33
-1.777449308444807
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-6.661338147750939e-16
-20
-0.19156135043889155
-30
-1.8141601820061741
-11
-0.08646172679066877
-21
-0.3226795572929172
-31
-1.8020087787532109
-12
-1.1102230246251565e-16
-22
-0.33379067100000304
-32
-1.8141601820061741
-13
-1.1102230246251565e-16
-23
-0.33379067100000304
-33
-1.8141601820061741
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.08646172679066877
-20
-0.3226795572929172
-30
-1.8020087787532109
-11
-6.661338147750939e-16
-21
-0.19156135043889155
-31
-1.8141601820061741
-12
-0.261211438220872
-22
-0.19156135043889044
-32
-1.777449308444807
-13
-0.261211438220872
-23
-0.19156135043889044
-33
-1.777449308444807
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.08646172679066877
-20
-0.3226795572929172
-30
-1.8020087787532109
-11
-0.261211438220872
-21
-0.19156135043889044
-31
-1.777449308444807
-12
-0.16715806244605846
-22
-0.28952625705134216
-32
-1.7906676483827717
-13
-0.16715806244605846
-23
-0.28952625705134216
-33
-1.7906676483827717
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.16715806244605846
-20
-0.28952625705134216
-30
-1.7906676483827717
-11
-0.261211438220872
-21
-0.19156135043889044
-31
-1.777449308444807
-12
-0.23655144370181413
-22
-0.23655144370181402
-32
-1.7809150446582704
-13
-0.23655144370181413
-23
-0.23655144370181402
-33
-1.7809150446582704
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.23655144370181413
-20
-0.23655144370181402
-30
-1.7809150446582704
-11
-0.261211438220872
-21
-0.19156135043889044
-31
-1.777449308444807
-12
-0.28986029081458276
-22
-0.16735091692918358
-32
-1.773422974788019
-13
-0.28986029081458276
-23
-0.16735091692918358
-33
-1.773422974788019
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.28986029081458276
-20
-0.16735091692918358
-30
-1.773422974788019
-11
-0.261211438220872
-21
-0.19156135043889044
-31
-1.777449308444807
-12
-0.26121143822087256
-22
-0.0
-32
-1.7774493084448049
-13
-0.26121143822087256
-23
-0.0
-33
-1.7774493084448049
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.28986029081458276
-20
-0.16735091692918358
-30
-1.773422974788019
-11
-0.26121143822087256
-21
-0.0
-31
-1.7774493084448049
-12
-0.334843235733576
-22
-0.0
-32
-1.7671010341617321
-13
-0.334843235733576
-23
-0.0
-33
-1.7671010341617321
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.28986029081458276
-20
-0.16735091692918358
-30
-1.773422974788019
-11
-0.334843235733576
-21
-0.0
-31
-1.7671010341617321
-12
-0.32339898045021165
-22
-0.08665449564468308
-32
-1.7687094193518036
-13
-0.32339898045021165
-23
-0.08665449564468308
-33
-1.7687094193518036
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.09633958547085791
-20
-0.3595442277573727
-30
-0.09633958547086535
-11
--0.002638372221004881
-21
-0.3728562895769836
-31
-0.05240153416118987
-12
--0.051500277979212306
-22
-0.3664435186276659
-32
-0.05150027797922019
-13
--0.051500277979212306
-23
-0.3664435186276659
-33
-0.05150027797922019
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.002638372221004881
-20
-0.3728562895769836
-30
-0.05240153416118987
-11
--0.09633958547085791
-21
-0.3595442277573727
-31
-0.09633958547086535
-12
--0.08696289916304184
-22
-0.32454995804996933
-32
-1.7271972828431308
-13
--0.08696289916304184
-23
-0.32454995804996933
-33
-1.7271972828431308
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.36643493196576155
-20
-6.894044639604857e-07
-30
-0.36643493196577
-11
--0.1844404161195001
-21
-0.049420660550877904
-31
-0.1844404161195074
-12
--0.18812185528866687
-22
-3.539292661169924e-07
-32
-0.18812185528867426
-13
--0.18812185528866687
-23
-3.539292661169924e-07
-33
-0.18812185528867426
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.1844404161195001
-20
-0.049420660550877904
-30
-0.1844404161195074
-11
--0.36643493196576155
-21
-6.894044639604857e-07
-31
-0.36643493196577
-12
--0.3541898489439894
-22
-0.09490488399184593
-32
-0.3541898489439996
-13
--0.3541898489439894
-23
-0.09490488399184593
-33
-0.3541898489439996
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.1844404161195001
-20
-0.049420660550877904
-30
-0.1844404161195074
-11
--0.3541898489439894
-21
-0.09490488399184593
-31
-0.3541898489439996
-12
--0.17298028978074165
-22
-0.09987021686940978
-32
-0.17298028978074903
-13
--0.17298028978074165
-23
-0.09987021686940978
-33
-0.17298028978074903
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.17298028978074165
-20
-0.09987021686940978
-30
-0.17298028978074903
-11
--0.3541898489439894
-21
-0.09490488399184593
-31
-0.3541898489439996
-12
--0.34654102806927234
-22
-0.11372420208085299
-32
-0.34654102806927917
-13
--0.34654102806927234
-23
-0.11372420208085299
-33
-0.34654102806927917
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.17298028978074165
-20
-0.09987021686940978
-30
-0.17298028978074903
-11
--0.34654102806927234
-21
-0.11372420208085299
-31
-0.34654102806927917
-12
--0.15240279554847375
-22
-0.15240279554847047
-32
-0.15240279554848163
-13
--0.15240279554847375
-23
-0.15240279554847047
-33
-0.15240279554848163
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.15240279554847375
-20
-0.15240279554847047
-30
-0.15240279554848163
-11
--0.34654102806927234
-21
-0.11372420208085299
-31
-0.34654102806927917
-12
--0.31821039848923144
-22
-0.18371885922669984
-32
-0.31821039848924043
-13
--0.31821039848923144
-23
-0.18371885922669984
-33
-0.31821039848924043
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.15240279554847375
-20
-0.15240279554847047
-30
-0.15240279554848163
-11
--0.31821039848923144
-21
-0.18371885922669984
-31
-0.31821039848924043
-12
--0.1330222582069191
-22
-0.18585839010548322
-32
-0.13302225820692531
-13
--0.1330222582069191
-23
-0.18585839010548322
-33
-0.13302225820692531
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.1330222582069191
-20
-0.18585839010548322
-30
-0.13302225820692531
-11
--0.31821039848923144
-21
-0.18371885922669984
-31
-0.31821039848924043
-12
--0.30780841448952007
-22
-0.1975803495231122
-32
-0.30780841448952795
-13
--0.30780841448952007
-23
-0.1975803495231122
-33
-0.30780841448952795
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.1330222582069191
-20
-0.18585839010548322
-30
-0.13302225820692531
-11
--0.30780841448952007
-21
-0.1975803495231122
-31
-0.30780841448952795
-12
--0.11825835860108969
-22
-0.2048294855167876
-32
-0.11825835860109529
-13
--0.11825835860108969
-23
-0.2048294855167876
-33
-0.11825835860109529
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.11825835860108969
-20
-0.2048294855167876
-30
-0.11825835860109529
-11
--0.30780841448952007
-21
-0.1975803495231122
-31
-0.30780841448952795
-12
--0.2885829061834132
-22
-0.22332138636309273
-32
-0.28858290618342114
-13
--0.2885829061834132
-23
-0.22332138636309273
-33
-0.28858290618342114
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.11825835860108969
-20
-0.2048294855167876
-30
-0.11825835860109529
-11
--0.2885829061834132
-21
-0.22332138636309273
-31
-0.28858290618342114
-12
--0.06885738769298949
-22
-0.2472510609542653
-32
-0.06885738769299571
-13
--0.06885738769298949
-23
-0.2472510609542653
-33
-0.06885738769299571
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.06885738769298949
-20
-0.2472510609542653
-30
-0.06885738769299571
-11
--0.2885829061834132
-21
-0.22332138636309273
-31
-0.28858290618342114
-12
--0.2606802535046579
-22
-0.26068025350466195
-32
-0.2606802535046641
-13
--0.2606802535046579
-23
-0.26068025350466195
-33
-0.2606802535046641
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.06885738769298949
-20
-0.2472510609542653
-30
-0.06885738769299571
-11
--0.2606802535046579
-21
-0.26068025350466195
-31
-0.2606802535046641
-12
--0.06658844156786636
-22
-0.24851144712811246
-32
-0.06658844156787258
-13
--0.06658844156786636
-23
-0.24851144712811246
-33
-0.06658844156787258
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.06658844156786636
-20
-0.24851144712811246
-30
-0.06658844156787258
-11
--0.2606802535046579
-21
-0.26068025350466195
-31
-0.2606802535046641
-12
--0.03605586729290833
-22
-0.25655082645025573
-32
-0.036055867292911215
-13
--0.03605586729290833
-23
-0.25655082645025573
-33
-0.036055867292911215
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.03605586729290833
-20
-0.25655082645025573
-30
-0.036055867292911215
-11
--0.2606802535046579
-21
-0.26068025350466195
-31
-0.2606802535046641
-12
--0.051500277979212306
-22
-0.3664435186276659
-32
-0.05150027797922019
-13
--0.051500277979212306
-23
-0.3664435186276659
-33
-0.05150027797922019
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
--0.051500277979212306
-20
-0.3664435186276659
-30
-0.05150027797922019
-11
--0.2606802535046579
-21
-0.26068025350466195
-31
-0.2606802535046641
-12
--0.19372715732247747
-22
-0.3138879622371804
-32
-0.19372715732248486
-13
--0.19372715732247747
-23
-0.3138879622371804
-33
-0.19372715732248486
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.051500277979212306
-20
-0.3664435186276659
-30
-0.05150027797922019
-11
--0.19372715732247747
-21
-0.3138879622371804
-31
-0.19372715732248486
-12
--0.18514211013161566
-22
-0.3206755413684731
-32
-0.1851421101316219
-13
--0.18514211013161566
-23
-0.3206755413684731
-33
-0.1851421101316219
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.051500277979212306
-20
-0.3664435186276659
-30
-0.05150027797922019
-11
--0.18514211013161566
-21
-0.3206755413684731
-31
-0.1851421101316219
-12
--0.1013377420365758
-22
-0.3573720124041593
-32
-0.1013377420365838
-13
--0.1013377420365758
-23
-0.3573720124041593
-33
-0.1013377420365838
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
--0.051500277979212306
-20
-0.3664435186276659
-30
-0.05150027797922019
-11
--0.1013377420365758
-21
-0.3573720124041593
-31
-0.1013377420365838
-12
--0.09633958547085791
-22
-0.3595442277573727
-32
-0.09633958547086535
-13
--0.09633958547085791
-23
-0.3595442277573727
-33
-0.09633958547086535
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.002638372221004881
-20
-0.3728562895769836
-30
-0.05240153416118987
-11
--0.03605586729290833
-21
-0.25655082645025573
-31
-0.036055867292911215
-12
--0.051500277979212306
-22
-0.3664435186276659
-32
-0.05150027797922019
-13
--0.051500277979212306
-23
-0.3664435186276659
-33
-0.05150027797922019
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
--0.03605586729290833
-20
-0.25655082645025573
-30
-0.036055867292911215
-11
--0.002638372221004881
-21
-0.3728562895769836
-31
-0.05240153416118987
-12
-1.2212453270876722e-15
-22
-0.2612114382208691
-32
-0.036710873561378254
-13
-1.2212453270876722e-15
-23
-0.2612114382208691
-33
-0.036710873561378254
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-1.2212453270876722e-15
-20
-0.2612114382208691
-30
-0.036710873561378254
-11
--0.002638372221004881
-21
-0.3728562895769836
-31
-0.05240153416118987
-12
-1.1102230246251565e-16
-22
-0.37319459270527366
-32
-0.05244907956522271
-13
-1.1102230246251565e-16
-23
-0.37319459270527366
-33
-0.05244907956522271
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-1.2212453270876722e-15
-20
-0.2612114382208691
-30
-0.036710873561378254
-11
-1.1102230246251565e-16
-21
-0.37319459270527366
-31
-0.05244907956522271
-12
-0.03798528133991513
-22
-0.3682094062559258
-32
-0.051748457300486994
-13
-0.03798528133991513
-23
-0.3682094062559258
-33
-0.051748457300486994
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-1.2212453270876722e-15
-20
-0.2612114382208691
-30
-0.036710873561378254
-11
-0.03798528133991513
-21
-0.3682094062559258
-31
-0.051748457300486994
-12
-0.0676483697554201
-22
-0.2524671529764305
-32
-0.03548194441425151
-13
-0.0676483697554201
-23
-0.2524671529764305
-33
-0.03548194441425151
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.0676483697554201
-20
-0.2524671529764305
-30
-0.03548194441425151
-11
-0.03798528133991513
-21
-0.3682094062559258
-31
-0.051748457300486994
-12
-0.09660018260574987
-22
-0.36051678950509547
-32
-0.050667330521278475
-13
-0.09660018260574987
-23
-0.36051678950509547
-33
-0.050667330521278475
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.0676483697554201
-20
-0.2524671529764305
-30
-0.03548194441425151
-11
-0.09660018260574987
-21
-0.36051678950509547
-31
-0.050667330521278475
-12
-0.1309243680317843
-22
-0.2267676573798948
-32
-0.031870115851683534
-13
-0.1309243680317843
-23
-0.2267676573798948
-33
-0.031870115851683534
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.1309243680317843
-20
-0.2267676573798948
-30
-0.031870115851683534
-11
-0.09660018260574987
-21
-0.36051678950509547
-31
-0.050667330521278475
-12
-0.18667566717603135
-22
-0.3233317400856974
-32
-0.04544131263742729
-13
-0.18667566717603135
-23
-0.3233317400856974
-33
-0.04544131263742729
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.1309243680317843
-20
-0.2267676573798948
-30
-0.031870115851683534
-11
-0.18667566717603135
-21
-0.3233317400856974
-31
-0.04544131263742729
-12
-0.18569241579901274
-22
-0.18569241579901485
-32
-0.026097367114300607
-13
-0.18569241579901274
-23
-0.18569241579901485
-33
-0.026097367114300607
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.18569241579901274
-20
-0.18569241579901485
-30
-0.026097367114300607
-11
-0.18667566717603135
-21
-0.3233317400856974
-31
-0.04544131263742729
-12
-0.2641308495701662
-22
-0.26413084957016775
-32
-0.037121170069247644
-13
-0.2641308495701662
-23
-0.26413084957016775
-33
-0.037121170069247644
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2641308495701662
-20
-0.26413084957016775
-30
-0.037121170069247644
-11
-0.22676765737989824
-21
-0.13092436803178253
-31
-0.03187011585168126
-12
-0.18569241579901274
-22
-0.18569241579901485
-32
-0.026097367114300607
-13
-0.18569241579901274
-23
-0.18569241579901485
-33
-0.026097367114300607
-70
-1
- 0
-3DFACE
- 8
-finger proximal
-10
-0.22676765737989824
-20
-0.13092436803178253
-30
-0.03187011585168126
-11
-0.2641308495701662
-21
-0.26413084957016775
-31
-0.037121170069247644
-12
-0.25246715297643174
-22
-0.06764836975541832
-32
-0.03548194441424812
-13
-0.25246715297643174
-23
-0.06764836975541832
-33
-0.03548194441424812
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.25246715297643174
-20
-0.06764836975541832
-30
-0.03548194441424812
-11
-0.2641308495701662
-21
-0.26413084957016775
-31
-0.037121170069247644
-12
-0.2612114382208709
-22
-2.220446049250313e-15
-32
-0.036710873561377144
-13
-0.2612114382208709
-23
-2.220446049250313e-15
-33
-0.036710873561377144
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.2612114382208709
-20
-2.220446049250313e-15
-30
-0.036710873561377144
-11
-0.2641308495701662
-21
-0.26413084957016775
-31
-0.037121170069247644
-12
-0.3731945927052738
-22
-1.1102230246251565e-15
-32
-0.05244907956522721
-13
-0.3731945927052738
-23
-1.1102230246251565e-15
-33
-0.05244907956522721
-70
-3
- 0
-3DFACE
- 8
-finger proximal
-10
-0.3731945927052738
-20
-1.1102230246251565e-15
-30
-0.05244907956522721
-11
-0.2641308495701662
-21
-0.26413084957016775
-31
-0.037121170069247644
-12
-0.2800330587934533
-22
-0.24332527544562987
-32
-0.0393560798271011
-13
-0.2800330587934533
-23
-0.24332527544562987
-33
-0.0393560798271011
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.3731945927052738
-20
-1.1102230246251565e-15
-30
-0.05244907956522721
-11
-0.2800330587934533
-21
-0.24332527544562987
-31
-0.0393560798271011
-12
-0.3233317400856941
-22
-0.18667566717602557
-32
-0.04544131263742618
-13
-0.3233317400856941
-23
-0.18667566717602557
-33
-0.04544131263742618
-70
-13
- 0
-3DFACE
- 8
-finger proximal
-10
-0.3731945927052738
-20
-1.1102230246251565e-15
-30
-0.05244907956522721
-11
-0.3233317400856941
-21
-0.18667566717602557
-31
-0.04544131263742618
-12
-0.360516789505095
-22
-0.09660018260575365
-32
-0.050667330521278475
-13
-0.360516789505095
-23
-0.09660018260575365
-33
-0.050667330521278475
-70
-1
- 0
-LINE
- 8
-finger proximal
-10
-2.886579864025407e-15
-20
-1.1102230246251565e-15
-30
-6.716849298982197e-15
-11
-3.4416913763379853e-15
-21
-1.1102230246251565e-15
-31
-0.036055867292914545
- 0
-LINE
- 8
-finger proximal
-10
-2.886579864025407e-15
-20
-1.1102230246251565e-15
-30
-6.716849298982197e-15
-11
-2.886579864025407e-15
-21
-0.37319459270527366
-31
-5.6066262743570405e-15
- 0
-LINE
- 8
-finger proximal
-10
-2.886579864025407e-15
-20
-1.1102230246251565e-15
-30
-6.716849298982197e-15
-11
-0.37319459270527433
-21
-0.0
-31
-4.496403249731884e-15
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06818492398575215
-20
-0.017821605409913677
-30
-1.4094380312409234
-11
--0.11687444975825895
-21
-0.06651113118242014
-31
-1.3828600716461388
-12
--0.13016342955565008
-22
-0.03442869592545578
-32
-1.3828600716461388
-13
--0.13016342955565008
-23
-0.03442869592545578
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.11687444975825895
-20
-0.06651113118242014
-30
-1.3828600716461388
-11
--0.06818492398575215
-21
-0.017821605409913677
-31
-1.4094380312409234
-12
--0.06130604186265742
-22
-0.034428695925455444
-32
-1.4094380312409234
-13
--0.06130604186265742
-23
-0.034428695925455444
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-2.078959449036688e-09
-30
-1.4185032783080505
-11
--0.05036332065479815
-21
-0.048689527851465464
-31
-1.4094380312409234
-12
--0.06130604186265742
-22
-0.034428695925455444
-32
-1.4094380312409234
-13
--0.06130604186265742
-23
-0.034428695925455444
-33
-1.4094380312409234
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.05795845209807354
-20
-0.034428695925455666
-30
-1.4094380312409234
-11
-0.09238714594456965
-21
-0.09406094290582162
-31
-1.3828600716461388
-12
-0.047015730890213825
-22
-0.04868952785146535
-32
-1.4094380312409234
-13
-0.047015730890213825
-23
-0.04868952785146535
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09238714594456965
-20
-0.09406094290582162
-30
-1.3828600716461388
-11
-0.05795845209807354
-21
-0.034428695925455666
-31
-1.4094380312409234
-12
-0.11352685999367468
-22
-0.06651113118242036
-32
-1.3828600716461388
-13
-0.11352685999367468
-23
-0.06651113118242036
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2586530642290084
-20
-0.06885738977195188
-30
-1.1524587618942086
-11
--0.2299631369342784
-21
-0.13180291516579612
-31
-1.133935070472781
-12
--0.25742830375937065
-22
-0.06852921619319091
-32
-1.1428276089410967
-13
--0.25742830375937065
-23
-0.06852921619319091
-33
-1.1428276089410967
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2299631369342784
-20
-0.13180291516579612
-30
-1.133935070472781
-11
--0.2586530642290084
-21
-0.06885738977195188
-31
-1.1524587618942086
-12
--0.23207510463422537
-22
-0.13302226028588032
-32
-1.1524587618942086
-13
--0.23207510463422537
-23
-0.13302226028588032
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18736621068130693
-20
-0.18569241787797425
-30
-1.1263613947799127
-11
--0.1346960530892126
-21
-0.2304013118308924
-31
-1.1524587618942086
-12
--0.13259816291407706
-22
-0.22676765945885902
-32
-1.1205886460425298
-13
--0.13259816291407706
-23
-0.22676765945885902
-33
-1.1205886460425298
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892126
-20
-0.2304013118308924
-30
-1.1524587618942086
-11
--0.18736621068130693
-21
-0.18569241787797425
-31
-1.1263613947799127
-12
--0.18979567653601576
-22
-0.18812188373268263
-32
-1.1524587618942086
-13
--0.18979567653601576
-23
-0.18812188373268263
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021466
-20
-0.16291833059881372
-30
-1.2854810201011309
-11
--0.22422437038251308
-21
-0.12848963675231756
-31
-1.221316149587198
-12
--0.2012071821926738
-22
-0.11520065695492604
-32
-1.2854810201011309
-13
--0.2012071821926738
-23
-0.11520065695492604
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251308
-20
-0.12848963675231756
-30
-1.221316149587198
-11
--0.1645921234021466
-21
-0.16291833059881372
-31
-1.2854810201011309
-12
--0.18338557886171938
-22
-0.18171178605838728
-32
-1.221316149587198
-13
--0.18338557886171938
-23
-0.18171178605838728
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.23207510463422537
-20
-0.13302226028588032
-30
-1.1524587618942086
-11
--0.18736621068130693
-21
-0.18569241787797425
-31
-1.1263613947799127
-12
--0.2299631369342784
-22
-0.13180291516579612
-32
-1.133935070472781
-13
--0.2299631369342784
-23
-0.13180291516579612
-33
-1.133935070472781
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18736621068130693
-20
-0.18569241787797425
-30
-1.1263613947799127
-11
--0.23207510463422537
-21
-0.13302226028588032
-31
-1.1524587618942086
-12
--0.18979567653601576
-22
-0.18812188373268263
-32
-1.1524587618942086
-13
--0.18979567653601576
-23
-0.18812188373268263
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.016147808448662315
-20
-0.06651113118241958
-30
-1.4094380312409234
-11
--0.001673794882292523
-21
-0.06885738977195172
-31
-1.4094380312409234
-12
--0.0016737948822921345
-22
-2.078959449036688e-09
-32
-1.4185032783080505
-13
--0.0016737948822921345
-23
-2.078959449036688e-09
-33
-1.4185032783080505
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13016342955565008
-20
-0.03442869592545578
-30
-1.3828600716461388
-11
--0.1645921234021454
-21
-0.09406094290582062
-31
-1.3405806435479293
-12
--0.18338557886171858
-22
-0.048689527851465464
-32
-1.3405806435479293
-13
--0.18338557886171858
-23
-0.048689527851465464
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021454
-20
-0.09406094290582062
-30
-1.3405806435479293
-11
--0.13016342955565008
-21
-0.03442869592545578
-31
-1.3828600716461388
-12
--0.11687444975825895
-22
-0.06651113118242014
-32
-1.3828600716461388
-13
--0.11687444975825895
-23
-0.06651113118242014
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021462
-20
-0.1629183305988131
-30
-1.0194365036872854
-11
--0.17465408466303567
-21
-0.099870218948371
-31
-0.9794784721134615
-12
--0.20120718219267303
-22
-0.11520065695492587
-32
-1.0194365036872854
-13
--0.20120718219267303
-23
-0.11520065695492587
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.17465408466303567
-20
-0.099870218948371
-30
-0.9794784721134615
-11
--0.1645921234021462
-21
-0.1629183305988131
-31
-1.0194365036872854
-12
--0.16443652005322085
-22
-0.12595478545169825
-32
-0.9896960367232768
-13
--0.16443652005322085
-23
-0.12595478545169825
-33
-0.9896960367232768
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.16443652005322085
-20
-0.12595478545169825
-30
-0.9896960367232768
-11
--0.1645921234021462
-21
-0.1629183305988131
-31
-1.0194365036872854
-12
--0.1540765904307652
-22
-0.1524027976274323
-32
-1.0000559663457305
-13
--0.1540765904307652
-23
-0.1524027976274323
-33
-1.0000559663457305
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18979567653601495
-20
-2.078959449036688e-09
-30
-1.3405806435479293
-11
--0.22422437038251186
-21
-0.059632249059325015
-31
-1.2854810201011309
-12
--0.23207510463422537
-22
-2.078959449036688e-09
-32
-1.2854810201011309
-13
--0.23207510463422537
-23
-2.078959449036688e-09
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251186
-20
-0.059632249059325015
-30
-1.2854810201011309
-11
--0.18979567653601495
-21
-2.078959449036688e-09
-31
-1.3405806435479293
-12
--0.18338557886171858
-22
-0.048689527851465464
-32
-1.3405806435479293
-13
--0.18338557886171858
-23
-0.048689527851465464
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251186
-20
-0.12848963675231756
-30
-1.083601374201211
-11
--0.1645921234021462
-21
-0.1629183305988131
-31
-1.0194365036872854
-12
--0.20120718219267303
-22
-0.11520065695492587
-32
-1.0194365036872854
-13
--0.20120718219267303
-23
-0.11520065695492587
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021462
-20
-0.1629183305988131
-30
-1.0194365036872854
-11
--0.22422437038251186
-21
-0.12848963675231756
-31
-1.083601374201211
-12
--0.18338557886171938
-22
-0.18171178605838667
-32
-1.083601374201211
-13
--0.18338557886171938
-23
-0.18171178605838667
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-2.078959449036688e-09
-30
-1.4185032783080505
-11
--0.036102488728788296
-21
-0.05963224905932479
-31
-1.4094380312409234
-12
--0.05036332065479815
-22
-0.048689527851465464
-32
-1.4094380312409234
-13
--0.05036332065479815
-23
-0.048689527851465464
-33
-1.4094380312409234
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06685541923193933
-20
-0.2557545109560382
-30
-1.1428276089410931
-11
-0.13134846332462868
-21
-0.23040131183089219
-31
-1.1524587618942086
-12
-0.13012911820454431
-22
-0.22828934413094437
-32
-1.133935070472775
-13
-0.13012911820454431
-23
-0.22828934413094437
-33
-1.133935070472775
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.13134846332462868
-20
-0.23040131183089219
-30
-1.1524587618942086
-11
-0.06685541923193933
-21
-0.2557545109560382
-31
-1.1428276089410931
-12
-0.06718359281070013
-22
-0.25697927142567467
-32
-1.1524587618942086
-13
-0.06718359281070013
-23
-0.25697927142567467
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.25697927142567634
-30
-1.221316149587198
-11
-0.06718359281070013
-21
-0.25697927142567467
-31
-1.1524587618942086
-12
--0.001673794882292523
-22
-0.2660445184928011
-32
-1.1524587618942086
-13
--0.001673794882292523
-23
-0.2660445184928011
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06718359281070013
-20
-0.25697927142567467
-30
-1.1524587618942086
-11
--0.001673794882292523
-21
-0.25697927142567634
-31
-1.221316149587198
-12
-0.06483733422116866
-22
-0.2482229151618479
-32
-1.221316149587198
-13
-0.06483733422116866
-23
-0.2482229151618479
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.047015730890213825
-20
-0.1817117860583855
-30
-1.3405806435479293
-11
--0.0016737948822921345
-21
-0.23040131183089285
-31
-1.2854810201011309
-12
--0.0016737948822921345
-22
-0.18812188373268185
-32
-1.3405806435479293
-13
--0.0016737948822921345
-23
-0.18812188373268185
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-0.23040131183089285
-30
-1.2854810201011309
-11
-0.047015730890213825
-21
-0.1817117860583855
-31
-1.3405806435479293
-12
-0.05795845209807354
-22
-0.22255057757917918
-32
-1.2854810201011309
-13
-0.05795845209807354
-23
-0.22255057757917918
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.03275489896420397
-20
-0.12848963675231745
-30
-1.3828600716461388
-11
--0.0016737948822921345
-21
-0.18812188373268185
-31
-1.3405806435479293
-12
--0.001673794882292523
-22
-0.1330222602858806
-32
-1.3828600716461388
-13
--0.001673794882292523
-23
-0.1330222602858806
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-0.18812188373268185
-30
-1.3405806435479293
-11
-0.03275489896420397
-21
-0.12848963675231745
-31
-1.3828600716461388
-12
-0.047015730890213825
-22
-0.1817117860583855
-32
-1.3405806435479293
-13
-0.047015730890213825
-23
-0.1817117860583855
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.016147808448662315
-20
-0.06651113118241958
-30
-1.4094380312409234
-11
--0.001673794882292523
-21
-0.1330222602858806
-31
-1.3828600716461388
-12
--0.001673794882292523
-22
-0.06885738977195172
-32
-1.4094380312409234
-13
--0.001673794882292523
-23
-0.06885738977195172
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.1330222602858806
-30
-1.3828600716461388
-11
-0.016147808448662315
-21
-0.06651113118241958
-31
-1.4094380312409234
-12
-0.03275489896420397
-22
-0.12848963675231745
-32
-1.3828600716461388
-13
-0.03275489896420397
-23
-0.12848963675231745
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-0.23040131183089285
-30
-1.2854810201011309
-11
-0.06483733422116866
-21
-0.2482229151618479
-31
-1.221316149587198
-12
--0.001673794882292523
-22
-0.25697927142567634
-32
-1.221316149587198
-13
--0.001673794882292523
-23
-0.25697927142567634
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06483733422116866
-20
-0.2482229151618479
-30
-1.221316149587198
-11
--0.0016737948822921345
-21
-0.23040131183089285
-31
-1.2854810201011309
-12
-0.05795845209807354
-22
-0.22255057757917918
-32
-1.2854810201011309
-13
-0.05795845209807354
-23
-0.22255057757917918
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.03275489896420397
-20
-0.05963224905932468
-30
-1.4094380312409234
-11
-0.016147808448662315
-21
-0.06651113118241958
-31
-1.4094380312409234
-12
--0.0016737948822921345
-22
-2.078959449036688e-09
-32
-1.4185032783080505
-13
--0.0016737948822921345
-23
-2.078959449036688e-09
-33
-1.4185032783080505
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021454
-20
-0.09406094290582062
-30
-1.3405806435479293
-11
--0.1645921234021466
-21
-0.16291833059881372
-31
-1.2854810201011309
-12
--0.2012071821926738
-22
-0.11520065695492604
-32
-1.2854810201011309
-13
--0.2012071821926738
-23
-0.11520065695492604
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021466
-20
-0.16291833059881372
-30
-1.2854810201011309
-11
--0.1645921234021454
-21
-0.09406094290582062
-31
-1.3405806435479293
-12
--0.1346960530892126
-22
-0.1330222602858796
-32
-1.3405806435479293
-13
--0.1346960530892126
-23
-0.1330222602858796
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892106
-20
-0.1858583921844445
-30
-1.0194365036872854
-11
--0.1540765904307652
-21
-0.1524027976274323
-31
-1.0000559663457305
-12
--0.1645921234021462
-22
-0.1629183305988131
-32
-1.0194365036872854
-13
--0.1645921234021462
-23
-0.1629183305988131
-33
-1.0194365036872854
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06483733422116866
-20
-0.2482229151618479
-30
-1.221316149587198
-11
-0.13134846332462868
-21
-0.23040131183089219
-31
-1.1524587618942086
-12
-0.06718359281070013
-22
-0.25697927142567467
-32
-1.1524587618942086
-13
-0.06718359281070013
-23
-0.25697927142567467
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.13134846332462868
-20
-0.23040131183089219
-30
-1.1524587618942086
-11
-0.06483733422116866
-21
-0.2482229151618479
-31
-1.221316149587198
-12
-0.1268158397910666
-22
-0.22255057757917973
-32
-1.221316149587198
-13
-0.1268158397910666
-23
-0.22255057757917973
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.05795845209807354
-20
-0.22255057757917918
-30
-1.2854810201011309
-11
-0.1268158397910666
-21
-0.22255057757917973
-31
-1.221316149587198
-12
-0.06483733422116866
-22
-0.2482229151618479
-32
-1.221316149587198
-13
-0.06483733422116866
-23
-0.2482229151618479
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.1268158397910666
-20
-0.22255057757917973
-30
-1.221316149587198
-11
-0.05795845209807354
-21
-0.22255057757917918
-31
-1.2854810201011309
-12
-0.11352685999367468
-22
-0.19953338938934095
-32
-1.2854810201011309
-13
-0.11352685999367468
-23
-0.19953338938934095
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171938
-20
-0.18171178605838667
-30
-1.083601374201211
-11
--0.1346960530892106
-21
-0.1858583921844445
-31
-1.0194365036872854
-12
--0.1645921234021462
-22
-0.1629183305988131
-32
-1.0194365036872854
-13
--0.1645921234021462
-23
-0.1629183305988131
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892106
-20
-0.1858583921844445
-30
-1.0194365036872854
-11
--0.18338557886171938
-21
-0.18171178605838667
-31
-1.083601374201211
-12
--0.11993215348338515
-22
-0.20482948759574693
-32
-1.0342004032931107
-13
--0.11993215348338515
-23
-0.20482948759574693
-33
-1.0342004032931107
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.11993215348338515
-20
-0.20482948759574693
-30
-1.0342004032931107
-11
--0.18338557886171938
-21
-0.18171178605838667
-31
-1.083601374201211
-12
--0.13016342955565008
-22
-0.2225505775791794
-32
-1.083601374201211
-13
--0.13016342955565008
-23
-0.2225505775791794
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.07053118257528401
-20
-2.0789595045478393e-09
-30
-1.4094380312409234
-11
--0.13016342955565008
-21
-0.03442869592545578
-31
-1.3828600716461388
-12
--0.1346960530892126
-22
-2.078959449036688e-09
-32
-1.3828600716461388
-13
--0.1346960530892126
-23
-2.078959449036688e-09
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13016342955565008
-20
-0.03442869592545578
-30
-1.3828600716461388
-11
--0.07053118257528401
-21
-2.0789595045478393e-09
-31
-1.4094380312409234
-12
--0.06818492398575215
-22
-0.017821605409913677
-32
-1.4094380312409234
-13
--0.06818492398575215
-23
-0.017821605409913677
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09238714594456926
-20
-0.16291833059881272
-30
-1.3405806435479293
-11
-0.05795845209807354
-21
-0.22255057757917918
-31
-1.2854810201011309
-12
-0.047015730890213825
-22
-0.1817117860583855
-32
-1.3405806435479293
-13
-0.047015730890213825
-23
-0.1817117860583855
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.05795845209807354
-20
-0.22255057757917918
-30
-1.2854810201011309
-11
-0.09238714594456926
-21
-0.16291833059881272
-31
-1.3405806435479293
-12
-0.11352685999367468
-22
-0.19953338938934095
-32
-1.2854810201011309
-13
-0.11352685999367468
-23
-0.19953338938934095
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06483733422116827
-20
-0.11520065695492626
-30
-1.3828600716461388
-11
-0.047015730890213825
-21
-0.1817117860583855
-31
-1.3405806435479293
-12
-0.03275489896420397
-22
-0.12848963675231745
-32
-1.3828600716461388
-13
-0.03275489896420397
-23
-0.12848963675231745
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.047015730890213825
-20
-0.1817117860583855
-30
-1.3405806435479293
-11
-0.06483733422116827
-21
-0.11520065695492626
-31
-1.3828600716461388
-12
-0.09238714594456926
-22
-0.16291833059881272
-32
-1.3405806435479293
-13
-0.09238714594456926
-23
-0.16291833059881272
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-2.078959449036688e-09
-30
-1.4185032783080505
-11
--0.06130604186265742
-21
-0.034428695925455444
-31
-1.4094380312409234
-12
--0.06818492398575215
-22
-0.017821605409913677
-32
-1.4094380312409234
-13
--0.06818492398575215
-23
-0.017821605409913677
-33
-1.4094380312409234
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251308
-20
-0.12848963675231756
-30
-1.221316149587198
-11
--0.2586530642290084
-21
-0.06885738977195188
-31
-1.1524587618942086
-12
--0.249896707965181
-22
-0.06651113118242025
-32
-1.221316149587198
-13
--0.249896707965181
-23
-0.06651113118242025
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2586530642290084
-20
-0.06885738977195188
-30
-1.1524587618942086
-11
--0.22422437038251308
-21
-0.12848963675231756
-31
-1.221316149587198
-12
--0.23207510463422537
-22
-0.13302226028588032
-32
-1.1524587618942086
-13
--0.23207510463422537
-23
-0.13302226028588032
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.05036332065479854
-20
-0.1817117860583855
-30
-1.3405806435479293
-11
--0.0016737948822921345
-21
-0.23040131183089285
-31
-1.2854810201011309
-12
--0.06130604186265742
-22
-0.22255057757917918
-32
-1.2854810201011309
-13
--0.06130604186265742
-23
-0.22255057757917918
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-0.23040131183089285
-30
-1.2854810201011309
-11
--0.05036332065479854
-21
-0.1817117860583855
-31
-1.3405806435479293
-12
--0.0016737948822921345
-22
-0.18812188373268185
-32
-1.3405806435479293
-13
--0.0016737948822921345
-23
-0.18812188373268185
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.05036332065479815
-20
-0.048689527851465464
-30
-1.4094380312409234
-11
--0.06818492398575215
-21
-0.11520065695492637
-31
-1.3828600716461388
-12
--0.09573473570915433
-22
-0.09406094290582112
-32
-1.3828600716461388
-13
--0.09573473570915433
-23
-0.09406094290582112
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06818492398575215
-20
-0.11520065695492637
-30
-1.3828600716461388
-11
--0.05036332065479815
-21
-0.048689527851465464
-31
-1.4094380312409234
-12
--0.036102488728788296
-22
-0.05963224905932479
-32
-1.4094380312409234
-13
--0.036102488728788296
-23
-0.05963224905932479
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.047015730890213825
-20
-0.04868952785146535
-30
-1.4094380312409234
-11
-0.03275489896420397
-21
-0.05963224905932468
-31
-1.4094380312409234
-12
--0.0016737948822921345
-22
-2.078959449036688e-09
-32
-1.4185032783080505
-13
--0.0016737948822921345
-23
-2.078959449036688e-09
-33
-1.4185032783080505
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1645921234021466
-20
-0.16291833059881372
-30
-1.2854810201011309
-11
--0.13016342955565008
-21
-0.22255057757917995
-31
-1.221316149587198
-12
--0.18338557886171938
-22
-0.18171178605838728
-32
-1.221316149587198
-13
--0.18338557886171938
-23
-0.18171178605838728
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13016342955565008
-20
-0.22255057757917995
-30
-1.221316149587198
-11
--0.1645921234021466
-21
-0.16291833059881372
-31
-1.2854810201011309
-12
--0.11687444975825895
-22
-0.19953338938934106
-32
-1.2854810201011309
-13
--0.11687444975825895
-23
-0.19953338938934106
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06718359281069974
-20
-2.078959393525537e-09
-30
-1.4094380312409234
-11
-0.1268158397910666
-21
-0.03442869592545589
-31
-1.3828600716461388
-12
-0.06483733422116789
-22
-0.01782160540991351
-32
-1.4094380312409234
-13
-0.06483733422116789
-23
-0.01782160540991351
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.1268158397910666
-20
-0.03442869592545589
-30
-1.3828600716461388
-11
-0.06718359281069974
-21
-2.078959393525537e-09
-31
-1.4094380312409234
-12
-0.1313484633246299
-22
-2.078959449036688e-09
-32
-1.3828600716461388
-13
-0.1313484633246299
-23
-2.078959449036688e-09
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18644808677143027
-20
-2.078959393525537e-09
-30
-1.3405806435479293
-11
-0.2208767806179276
-21
-0.059632249059325015
-31
-1.2854810201011309
-12
-0.18003798909713392
-22
-0.0486895278514653
-32
-1.3405806435479293
-13
-0.18003798909713392
-23
-0.0486895278514653
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2208767806179276
-20
-0.059632249059325015
-30
-1.2854810201011309
-11
-0.18644808677143027
-21
-2.078959393525537e-09
-31
-1.3405806435479293
-12
-0.22872751486964182
-22
-2.078959393525537e-09
-32
-1.2854810201011309
-13
-0.22872751486964182
-23
-2.078959393525537e-09
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.16124453363756153
-20
-0.09406094290582073
-30
-1.3405806435479293
-11
-0.16124453363756192
-21
-0.162918330598814
-31
-1.2854810201011309
-12
-0.13134846332462868
-22
-0.13302226028588
-32
-1.3405806435479293
-13
-0.13134846332462868
-23
-0.13302226028588
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.16124453363756192
-20
-0.162918330598814
-30
-1.2854810201011309
-11
-0.16124453363756153
-21
-0.09406094290582073
-31
-1.3405806435479293
-12
-0.19785959242808948
-22
-0.11520065695492626
-32
-1.2854810201011309
-13
-0.19785959242808948
-23
-0.11520065695492626
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2553054744644233
-20
-0.06885738977195177
-30
-1.1524587618942086
-11
-0.2553054744644241
-21
-2.078959393525537e-09
-31
-1.221316149587198
-12
-0.2643707215315495
-22
-2.078959393525537e-09
-32
-1.1524587618942086
-13
-0.2643707215315495
-23
-2.078959393525537e-09
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2553054744644241
-20
-2.078959393525537e-09
-30
-1.221316149587198
-11
-0.2553054744644233
-21
-0.06885738977195177
-31
-1.1524587618942086
-12
-0.24654911820059633
-22
-0.06651113118241986
-32
-1.221316149587198
-13
-0.24654911820059633
-23
-0.06651113118241986
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.11352685999367468
-20
-0.06651113118242036
-30
-1.3828600716461388
-11
-0.13134846332462868
-21
-0.13302226028588
-31
-1.3405806435479293
-12
-0.09238714594456965
-22
-0.09406094290582162
-32
-1.3828600716461388
-13
-0.09238714594456965
-23
-0.09406094290582162
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.13134846332462868
-20
-0.13302226028588
-30
-1.3405806435479293
-11
-0.11352685999367468
-21
-0.06651113118242036
-31
-1.3828600716461388
-12
-0.16124453363756153
-22
-0.09406094290582073
-32
-1.3405806435479293
-13
-0.16124453363756153
-23
-0.09406094290582073
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06483733422116789
-20
-0.01782160540991351
-30
-1.4094380312409234
-11
-0.05795845209807354
-21
-0.034428695925455666
-31
-1.4094380312409234
-12
--0.0016737948822921345
-22
-2.078959449036688e-09
-32
-1.4185032783080505
-13
--0.0016737948822921345
-23
-2.078959449036688e-09
-33
-1.4185032783080505
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.047015730890213825
-20
-0.04868952785146535
-30
-1.4094380312409234
-11
-0.06483733422116827
-21
-0.11520065695492626
-31
-1.3828600716461388
-12
-0.03275489896420397
-22
-0.05963224905932468
-32
-1.4094380312409234
-13
-0.03275489896420397
-23
-0.05963224905932468
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06483733422116827
-20
-0.11520065695492626
-30
-1.3828600716461388
-11
-0.047015730890213825
-21
-0.04868952785146535
-31
-1.4094380312409234
-12
-0.09238714594456965
-22
-0.09406094290582162
-32
-1.3828600716461388
-13
-0.09238714594456965
-23
-0.09406094290582162
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.1313484633246299
-20
-2.078959449036688e-09
-30
-1.3828600716461388
-11
-0.18003798909713392
-21
-0.0486895278514653
-31
-1.3405806435479293
-12
-0.1268158397910666
-22
-0.03442869592545589
-32
-1.3828600716461388
-13
-0.1268158397910666
-23
-0.03442869592545589
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18003798909713392
-20
-0.0486895278514653
-30
-1.3405806435479293
-11
-0.1313484633246299
-21
-2.078959449036688e-09
-31
-1.3828600716461388
-12
-0.18644808677143027
-22
-2.078959393525537e-09
-32
-1.3405806435479293
-13
-0.18644808677143027
-23
-2.078959393525537e-09
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.05795845209807354
-20
-0.034428695925455666
-30
-1.4094380312409234
-11
-0.047015730890213825
-21
-0.04868952785146535
-31
-1.4094380312409234
-12
--0.0016737948822921345
-22
-2.078959449036688e-09
-32
-1.4185032783080505
-13
--0.0016737948822921345
-23
-2.078959449036688e-09
-33
-1.4185032783080505
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.11352685999367468
-20
-0.19953338938934095
-30
-1.2854810201011309
-11
-0.18003798909713586
-21
-0.18171178605838728
-31
-1.221316149587198
-12
-0.1268158397910666
-22
-0.22255057757917973
-32
-1.221316149587198
-13
-0.1268158397910666
-23
-0.22255057757917973
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18003798909713586
-20
-0.18171178605838728
-30
-1.221316149587198
-11
-0.11352685999367468
-21
-0.19953338938934095
-31
-1.2854810201011309
-12
-0.16124453363756192
-22
-0.162918330598814
-32
-1.2854810201011309
-13
-0.16124453363756192
-23
-0.162918330598814
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.24654911820059633
-20
-0.06651113118241986
-30
-1.221316149587198
-11
-0.19785959242808948
-21
-0.11520065695492626
-31
-1.2854810201011309
-12
-0.2208767806179276
-22
-0.059632249059325015
-32
-1.2854810201011309
-13
-0.2208767806179276
-23
-0.059632249059325015
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.19785959242808948
-20
-0.11520065695492626
-30
-1.2854810201011309
-11
-0.24654911820059633
-21
-0.06651113118241986
-31
-1.221316149587198
-12
-0.22087678061792837
-22
-0.12848963675231756
-32
-1.221316149587198
-13
-0.22087678061792837
-23
-0.12848963675231756
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.03275489896420397
-20
-0.05963224905932468
-30
-1.4094380312409234
-11
-0.03275489896420397
-21
-0.12848963675231745
-31
-1.3828600716461388
-12
-0.016147808448662315
-22
-0.06651113118241958
-32
-1.4094380312409234
-13
-0.016147808448662315
-23
-0.06651113118241958
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.03275489896420397
-20
-0.12848963675231745
-30
-1.3828600716461388
-11
-0.03275489896420397
-21
-0.05963224905932468
-31
-1.4094380312409234
-12
-0.06483733422116827
-22
-0.11520065695492626
-32
-1.3828600716461388
-13
-0.06483733422116827
-23
-0.11520065695492626
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251108
-20
-0.05963224905932479
-30
-1.0194365036872854
-11
--0.18979567653601576
-21
-2.0789595045478393e-09
-31
-0.9643368802404846
-12
--0.23207510463422495
-22
-2.078959449036688e-09
-32
-1.0194365036872854
-13
--0.23207510463422495
-23
-2.078959449036688e-09
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18979567653601576
-20
-2.0789595045478393e-09
-30
-0.9643368802404846
-11
--0.22422437038251108
-21
-0.05963224905932479
-31
-1.0194365036872854
-12
--0.1861142110017942
-22
-0.049420662629840184
-32
-0.9680183457747035
-13
--0.1861142110017942
-23
-0.049420662629840184
-33
-0.9680183457747035
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.258653064229008
-20
-2.0789595045478393e-09
-30
-1.083601374201211
-11
--0.22422437038251108
-21
-0.05963224905932479
-31
-1.0194365036872854
-12
--0.23207510463422495
-22
-2.078959449036688e-09
-32
-1.0194365036872854
-13
--0.23207510463422495
-23
-2.078959449036688e-09
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251108
-20
-0.05963224905932479
-30
-1.0194365036872854
-11
--0.258653064229008
-21
-2.0789595045478393e-09
-31
-1.083601374201211
-12
--0.2498967079651798
-22
-0.06651113118242008
-32
-1.083601374201211
-13
--0.2498967079651798
-23
-0.06651113118242008
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251186
-20
-0.059632249059325015
-30
-1.2854810201011309
-11
--0.2586530642290092
-21
-2.078959449036688e-09
-31
-1.221316149587198
-12
--0.23207510463422537
-22
-2.078959449036688e-09
-32
-1.2854810201011309
-13
--0.23207510463422537
-23
-2.078959449036688e-09
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2586530642290092
-20
-2.078959449036688e-09
-30
-1.221316149587198
-11
--0.22422437038251186
-21
-0.059632249059325015
-31
-1.2854810201011309
-12
--0.249896707965181
-22
-0.06651113118242025
-32
-1.221316149587198
-13
--0.249896707965181
-23
-0.06651113118242025
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13259816291407706
-20
-0.22676765945885902
-30
-1.1205886460425298
-11
--0.0705311825752852
-21
-0.2569792714256749
-31
-1.1524587618942086
-12
--0.06932216463771257
-22
-0.2524671550553943
-32
-1.1169768174799652
-13
--0.06932216463771257
-23
-0.2524671550553943
-33
-1.1169768174799652
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0705311825752852
-20
-0.2569792714256749
-30
-1.1524587618942086
-11
--0.13259816291407706
-21
-0.22676765945885902
-31
-1.1205886460425298
-12
--0.1346960530892126
-22
-0.2304013118308924
-32
-1.1524587618942086
-13
--0.1346960530892126
-23
-0.2304013118308924
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2012071821926738
-20
-0.11520065695492604
-30
-1.2854810201011309
-11
--0.249896707965181
-21
-0.06651113118242025
-31
-1.221316149587198
-12
--0.22422437038251186
-22
-0.059632249059325015
-32
-1.2854810201011309
-13
--0.22422437038251186
-23
-0.059632249059325015
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.249896707965181
-20
-0.06651113118242025
-30
-1.221316149587198
-11
--0.2012071821926738
-21
-0.11520065695492604
-31
-1.2854810201011309
-12
--0.22422437038251308
-22
-0.12848963675231756
-32
-1.221316149587198
-13
--0.22422437038251308
-23
-0.12848963675231756
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171858
-20
-0.048689527851465464
-30
-1.3405806435479293
-11
--0.2012071821926738
-21
-0.11520065695492604
-31
-1.2854810201011309
-12
--0.22422437038251186
-22
-0.059632249059325015
-32
-1.2854810201011309
-13
--0.22422437038251186
-23
-0.059632249059325015
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2012071821926738
-20
-0.11520065695492604
-30
-1.2854810201011309
-11
--0.18338557886171858
-21
-0.048689527851465464
-31
-1.3405806435479293
-12
--0.1645921234021454
-22
-0.09406094290582062
-32
-1.3405806435479293
-13
--0.1645921234021454
-23
-0.09406094290582062
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892126
-20
-0.1330222602858796
-30
-1.3405806435479293
-11
--0.11687444975825895
-21
-0.19953338938934106
-31
-1.2854810201011309
-12
--0.1645921234021466
-22
-0.16291833059881372
-32
-1.2854810201011309
-13
--0.1645921234021466
-23
-0.16291833059881372
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.11687444975825895
-20
-0.19953338938934106
-30
-1.2854810201011309
-11
--0.1346960530892126
-21
-0.1330222602858796
-31
-1.3405806435479293
-12
--0.09573473570915275
-22
-0.162918330598813
-32
-1.3405806435479293
-13
--0.09573473570915275
-23
-0.162918330598813
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171938
-20
-0.18171178605838728
-30
-1.221316149587198
-11
--0.1346960530892126
-21
-0.2304013118308924
-31
-1.1524587618942086
-12
--0.18979567653601576
-22
-0.18812188373268263
-32
-1.1524587618942086
-13
--0.18979567653601576
-23
-0.18812188373268263
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892126
-20
-0.2304013118308924
-30
-1.1524587618942086
-11
--0.18338557886171938
-21
-0.18171178605838728
-31
-1.221316149587198
-12
--0.13016342955565008
-22
-0.22255057757917995
-32
-1.221316149587198
-13
--0.13016342955565008
-23
-0.22255057757917995
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09573473570915433
-20
-0.09406094290582112
-30
-1.3828600716461388
-11
--0.09573473570915275
-21
-0.162918330598813
-31
-1.3405806435479293
-12
--0.1346960530892126
-22
-0.1330222602858796
-32
-1.3405806435479293
-13
--0.1346960530892126
-23
-0.1330222602858796
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09573473570915275
-20
-0.162918330598813
-30
-1.3405806435479293
-11
--0.09573473570915433
-21
-0.09406094290582112
-31
-1.3828600716461388
-12
--0.06818492398575215
-22
-0.11520065695492637
-32
-1.3828600716461388
-13
--0.06818492398575215
-23
-0.11520065695492637
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.20120718219267303
-20
-0.11520065695492587
-30
-1.0194365036872854
-11
--0.1861142110017942
-21
-0.049420662629840184
-31
-0.9680183457747035
-12
--0.22422437038251108
-22
-0.05963224905932479
-32
-1.0194365036872854
-13
--0.22422437038251108
-23
-0.05963224905932479
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1861142110017942
-20
-0.049420662629840184
-30
-0.9680183457747035
-11
--0.20120718219267303
-21
-0.11520065695492587
-31
-1.0194365036872854
-12
--0.17465408466303567
-22
-0.099870218948371
-32
-0.9794784721134615
-13
--0.17465408466303567
-23
-0.099870218948371
-33
-0.9794784721134615
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06130604186265742
-20
-0.034428695925455444
-30
-1.4094380312409234
-11
--0.09573473570915433
-21
-0.09406094290582112
-31
-1.3828600716461388
-12
--0.11687444975825895
-22
-0.06651113118242014
-32
-1.3828600716461388
-13
--0.11687444975825895
-23
-0.06651113118242014
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09573473570915433
-20
-0.09406094290582112
-30
-1.3828600716461388
-11
--0.06130604186265742
-21
-0.034428695925455444
-31
-1.4094380312409234
-12
--0.05036332065479815
-22
-0.048689527851465464
-32
-1.4094380312409234
-13
--0.05036332065479815
-23
-0.048689527851465464
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.11687444975825895
-20
-0.06651113118242014
-30
-1.3828600716461388
-11
--0.1346960530892126
-21
-0.1330222602858796
-31
-1.3405806435479293
-12
--0.1645921234021454
-22
-0.09406094290582062
-32
-1.3405806435479293
-13
--0.1645921234021454
-23
-0.09406094290582062
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892126
-20
-0.1330222602858796
-30
-1.3405806435479293
-11
--0.11687444975825895
-21
-0.06651113118242014
-31
-1.3828600716461388
-12
--0.09573473570915433
-22
-0.09406094290582112
-32
-1.3828600716461388
-13
--0.09573473570915433
-23
-0.09406094290582112
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2498967079651798
-20
-0.06651113118242008
-30
-1.083601374201211
-11
--0.20120718219267303
-21
-0.11520065695492587
-31
-1.0194365036872854
-12
--0.22422437038251108
-22
-0.05963224905932479
-32
-1.0194365036872854
-13
--0.22422437038251108
-23
-0.05963224905932479
-33
-1.0194365036872854
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.20120718219267303
-20
-0.11520065695492587
-30
-1.0194365036872854
-11
--0.2498967079651798
-21
-0.06651113118242008
-31
-1.083601374201211
-12
--0.22422437038251186
-22
-0.12848963675231756
-32
-1.083601374201211
-13
--0.22422437038251186
-23
-0.12848963675231756
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1346960530892126
-20
-2.078959449036688e-09
-30
-1.3828600716461388
-11
--0.18338557886171858
-21
-0.048689527851465464
-31
-1.3405806435479293
-12
--0.18979567653601495
-22
-2.078959449036688e-09
-32
-1.3405806435479293
-13
--0.18979567653601495
-23
-2.078959449036688e-09
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171858
-20
-0.048689527851465464
-30
-1.3405806435479293
-11
--0.1346960530892126
-21
-2.078959449036688e-09
-31
-1.3828600716461388
-12
--0.13016342955565008
-22
-0.03442869592545578
-32
-1.3828600716461388
-13
--0.13016342955565008
-23
-0.03442869592545578
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171938
-20
-0.18171178605838728
-30
-1.221316149587198
-11
--0.23207510463422537
-21
-0.13302226028588032
-31
-1.1524587618942086
-12
--0.22422437038251308
-22
-0.12848963675231756
-32
-1.221316149587198
-13
--0.22422437038251308
-23
-0.12848963675231756
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.23207510463422537
-20
-0.13302226028588032
-30
-1.1524587618942086
-11
--0.18338557886171938
-21
-0.18171178605838728
-31
-1.221316149587198
-12
--0.18979567653601576
-22
-0.18812188373268263
-32
-1.1524587618942086
-13
--0.18979567653601576
-23
-0.18812188373268263
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.036102488728788684
-20
-0.12848963675231756
-30
-1.3828600716461388
-11
--0.0016737948822921345
-21
-0.18812188373268185
-31
-1.3405806435479293
-12
--0.05036332065479854
-22
-0.1817117860583855
-32
-1.3405806435479293
-13
--0.05036332065479854
-23
-0.1817117860583855
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-0.18812188373268185
-30
-1.3405806435479293
-11
--0.036102488728788684
-21
-0.12848963675231756
-31
-1.3828600716461388
-12
--0.001673794882292523
-22
-0.1330222602858806
-32
-1.3828600716461388
-13
--0.001673794882292523
-23
-0.1330222602858806
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06130604186265742
-20
-0.22255057757917918
-30
-1.2854810201011309
-11
--0.001673794882292523
-21
-0.25697927142567634
-31
-1.221316149587198
-12
--0.06818492398575296
-22
-0.24822291516184813
-32
-1.221316149587198
-13
--0.06818492398575296
-23
-0.24822291516184813
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.25697927142567634
-30
-1.221316149587198
-11
--0.06130604186265742
-21
-0.22255057757917918
-31
-1.2854810201011309
-12
--0.0016737948822921345
-22
-0.23040131183089285
-32
-1.2854810201011309
-13
--0.0016737948822921345
-23
-0.23040131183089285
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06818492398575296
-20
-0.24822291516184813
-30
-1.221316149587198
-11
--0.001673794882292523
-21
-0.2660445184928011
-31
-1.1524587618942086
-12
--0.0705311825752852
-22
-0.2569792714256749
-32
-1.1524587618942086
-13
--0.0705311825752852
-23
-0.2569792714256749
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.2660445184928011
-30
-1.1524587618942086
-11
--0.06818492398575296
-21
-0.24822291516184813
-31
-1.221316149587198
-12
--0.001673794882292523
-22
-0.25697927142567634
-32
-1.221316149587198
-13
--0.001673794882292523
-23
-0.25697927142567634
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.036102488728788296
-20
-0.05963224905932479
-30
-1.4094380312409234
-11
--0.036102488728788684
-21
-0.12848963675231756
-31
-1.3828600716461388
-12
--0.06818492398575215
-22
-0.11520065695492637
-32
-1.3828600716461388
-13
--0.06818492398575215
-23
-0.11520065695492637
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.036102488728788684
-20
-0.12848963675231756
-30
-1.3828600716461388
-11
--0.036102488728788296
-21
-0.05963224905932479
-31
-1.4094380312409234
-12
--0.019495398213246973
-22
-0.06651113118241969
-32
-1.4094380312409234
-13
--0.019495398213246973
-23
-0.06651113118241969
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06818492398575215
-20
-0.11520065695492637
-30
-1.3828600716461388
-11
--0.05036332065479854
-21
-0.1817117860583855
-31
-1.3405806435479293
-12
--0.09573473570915275
-22
-0.162918330598813
-32
-1.3405806435479293
-13
--0.09573473570915275
-23
-0.162918330598813
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.05036332065479854
-20
-0.1817117860583855
-30
-1.3405806435479293
-11
--0.06818492398575215
-21
-0.11520065695492637
-31
-1.3828600716461388
-12
--0.036102488728788684
-22
-0.12848963675231756
-32
-1.3828600716461388
-13
--0.036102488728788684
-23
-0.12848963675231756
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09573473570915275
-20
-0.162918330598813
-30
-1.3405806435479293
-11
--0.06130604186265742
-21
-0.22255057757917918
-31
-1.2854810201011309
-12
--0.11687444975825895
-22
-0.19953338938934106
-32
-1.2854810201011309
-13
--0.11687444975825895
-23
-0.19953338938934106
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06130604186265742
-20
-0.22255057757917918
-30
-1.2854810201011309
-11
--0.09573473570915275
-21
-0.162918330598813
-31
-1.3405806435479293
-12
--0.05036332065479854
-22
-0.1817117860583855
-32
-1.3405806435479293
-13
--0.05036332065479854
-23
-0.1817117860583855
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-2.078959449036688e-09
-30
-1.4185032783080505
-11
--0.001673794882292523
-21
-0.06885738977195172
-31
-1.4094380312409234
-12
--0.019495398213246973
-22
-0.06651113118241969
-32
-1.4094380312409234
-13
--0.019495398213246973
-23
-0.06651113118241969
-33
-1.4094380312409234
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-2.078959449036688e-09
-30
-1.4185032783080505
-11
--0.019495398213246973
-21
-0.06651113118241969
-31
-1.4094380312409234
-12
--0.036102488728788296
-22
-0.05963224905932479
-32
-1.4094380312409234
-13
--0.036102488728788296
-23
-0.05963224905932479
-33
-1.4094380312409234
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.07053118257528798
-20
-0.24725106303322575
-30
-1.083601374201211
-11
--0.11993215348338515
-21
-0.20482948759574693
-31
-1.0342004032931107
-12
--0.13016342955565008
-22
-0.2225505775791794
-32
-1.083601374201211
-13
--0.13016342955565008
-23
-0.2225505775791794
-33
-1.083601374201211
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016737948822921345
-20
-2.078959449036688e-09
-30
-1.4185032783080505
-11
--0.06818492398575215
-21
-0.017821605409913677
-31
-1.4094380312409234
-12
--0.07053118257528401
-22
-2.0789595045478393e-09
-32
-1.4094380312409234
-13
--0.07053118257528401
-23
-2.0789595045478393e-09
-33
-1.4094380312409234
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06932216463771257
-20
-0.2524671550553943
-30
-1.1169768174799652
-11
--0.001673794882292523
-21
-0.2660445184928011
-31
-1.1524587618942086
-12
--0.0377296621751953
-22
-0.2565508285292213
-32
-1.1164028946013032
-13
--0.0377296621751953
-23
-0.2565508285292213
-33
-1.1164028946013032
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.2660445184928011
-30
-1.1524587618942086
-11
--0.06932216463771257
-21
-0.2524671550553943
-31
-1.1169768174799652
-12
--0.0705311825752852
-22
-0.2569792714256749
-32
-1.1524587618942086
-13
--0.0705311825752852
-23
-0.2569792714256749
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.11687444975825895
-20
-0.19953338938934106
-30
-1.2854810201011309
-11
--0.06818492398575296
-21
-0.24822291516184813
-31
-1.221316149587198
-12
--0.13016342955565008
-22
-0.22255057757917995
-32
-1.221316149587198
-13
--0.13016342955565008
-23
-0.22255057757917995
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06818492398575296
-20
-0.24822291516184813
-30
-1.221316149587198
-11
--0.11687444975825895
-21
-0.19953338938934106
-31
-1.2854810201011309
-12
--0.06130604186265742
-22
-0.22255057757917918
-32
-1.2854810201011309
-13
--0.06130604186265742
-23
-0.22255057757917918
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13016342955565008
-20
-0.22255057757917995
-30
-1.221316149587198
-11
--0.0705311825752852
-21
-0.2569792714256749
-31
-1.1524587618942086
-12
--0.1346960530892126
-22
-0.2304013118308924
-32
-1.1524587618942086
-13
--0.1346960530892126
-23
-0.2304013118308924
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0705311825752852
-20
-0.2569792714256749
-30
-1.1524587618942086
-11
--0.13016342955565008
-21
-0.22255057757917995
-31
-1.221316149587198
-12
--0.06818492398575296
-22
-0.24822291516184813
-32
-1.221316149587198
-13
--0.06818492398575296
-23
-0.24822291516184813
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.1268158397910666
-20
-0.22255057757917973
-30
-1.221316149587198
-11
-0.18644808677143104
-21
-0.18812188373268263
-31
-1.1524587618942086
-12
-0.13134846332462868
-22
-0.23040131183089219
-32
-1.1524587618942086
-13
-0.13134846332462868
-23
-0.23040131183089219
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18644808677143104
-20
-0.18812188373268263
-30
-1.1524587618942086
-11
-0.1268158397910666
-21
-0.22255057757917973
-31
-1.221316149587198
-12
-0.18003798909713586
-22
-0.18171178605838728
-32
-1.221316149587198
-13
-0.18003798909713586
-23
-0.18171178605838728
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2553054744644233
-20
-0.06885738977195177
-30
-1.1524587618942086
-11
-0.2643707215315495
-21
-2.078959393525537e-09
-31
-1.1524587618942086
-12
-0.2540807139947864
-22
-0.06852921619319102
-32
-1.1428276089410956
-13
-0.2540807139947864
-23
-0.06852921619319102
-33
-1.1428276089410956
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06718359281069974
-20
-2.078959393525537e-09
-30
-1.4094380312409234
-11
-0.06483733422116789
-21
-0.01782160540991351
-31
-1.4094380312409234
-12
--0.0016737948822921345
-22
-2.078959449036688e-09
-32
-1.4185032783080505
-13
--0.0016737948822921345
-23
-2.078959449036688e-09
-33
-1.4185032783080505
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18401862091672266
-20
-0.18569241787797314
-30
-1.1263613947799103
-11
-0.2287275148696407
-21
-0.1330222602858802
-31
-1.1524587618942086
-12
-0.22661554716969412
-22
-0.13180291516579662
-32
-1.133935070472775
-13
-0.22661554716969412
-23
-0.13180291516579662
-33
-1.133935070472775
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2287275148696407
-20
-0.1330222602858802
-30
-1.1524587618942086
-11
-0.18401862091672266
-21
-0.18569241787797314
-31
-1.1263613947799103
-12
-0.18644808677143104
-22
-0.18812188373268263
-32
-1.1524587618942086
-13
-0.18644808677143104
-23
-0.18812188373268263
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06718359281070013
-20
-0.25697927142567467
-30
-1.1524587618942086
-11
-0.06685541923193933
-21
-0.2557545109560382
-31
-1.1428276089410931
-12
--0.001673794882292523
-22
-0.2660445184928011
-32
-1.1524587618942086
-13
--0.001673794882292523
-23
-0.2660445184928011
-33
-1.1524587618942086
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.019495398213246973
-20
-0.06651113118241969
-30
-1.4094380312409234
-11
--0.001673794882292523
-21
-0.1330222602858806
-31
-1.3828600716461388
-12
--0.036102488728788684
-22
-0.12848963675231756
-32
-1.3828600716461388
-13
--0.036102488728788684
-23
-0.12848963675231756
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.1330222602858806
-30
-1.3828600716461388
-11
--0.019495398213246973
-21
-0.06651113118241969
-31
-1.4094380312409234
-12
--0.001673794882292523
-22
-0.06885738977195172
-32
-1.4094380312409234
-13
--0.001673794882292523
-23
-0.06885738977195172
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.13012911820454431
-20
-0.22828934413094437
-30
-1.133935070472775
-11
-0.18644808677143104
-21
-0.18812188373268263
-31
-1.1524587618942086
-12
-0.18401862091672266
-22
-0.18569241787797314
-32
-1.1263613947799103
-13
-0.18401862091672266
-23
-0.18569241787797314
-33
-1.1263613947799103
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18644808677143104
-20
-0.18812188373268263
-30
-1.1524587618942086
-11
-0.13012911820454431
-21
-0.22828934413094437
-31
-1.133935070472775
-12
-0.13134846332462868
-22
-0.23040131183089219
-32
-1.1524587618942086
-13
-0.13134846332462868
-23
-0.23040131183089219
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2287275148696407
-20
-0.1330222602858802
-30
-1.1524587618942086
-11
-0.18003798909713586
-21
-0.18171178605838728
-31
-1.221316149587198
-12
-0.22087678061792837
-22
-0.12848963675231756
-32
-1.221316149587198
-13
-0.22087678061792837
-23
-0.12848963675231756
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18003798909713586
-20
-0.18171178605838728
-30
-1.221316149587198
-11
-0.2287275148696407
-21
-0.1330222602858802
-31
-1.1524587618942086
-12
-0.18644808677143104
-22
-0.18812188373268263
-32
-1.1524587618942086
-13
-0.18644808677143104
-23
-0.18812188373268263
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09238714594456965
-20
-0.09406094290582162
-30
-1.3828600716461388
-11
-0.09238714594456926
-21
-0.16291833059881272
-31
-1.3405806435479293
-12
-0.06483733422116827
-22
-0.11520065695492626
-32
-1.3828600716461388
-13
-0.06483733422116827
-23
-0.11520065695492626
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09238714594456926
-20
-0.16291833059881272
-30
-1.3405806435479293
-11
-0.09238714594456965
-21
-0.09406094290582162
-31
-1.3828600716461388
-12
-0.13134846332462868
-22
-0.13302226028588
-32
-1.3405806435479293
-13
-0.13134846332462868
-23
-0.13302226028588
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22087678061792837
-20
-0.12848963675231756
-30
-1.221316149587198
-11
-0.16124453363756192
-21
-0.162918330598814
-31
-1.2854810201011309
-12
-0.19785959242808948
-22
-0.11520065695492626
-32
-1.2854810201011309
-13
-0.19785959242808948
-23
-0.11520065695492626
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.16124453363756192
-20
-0.162918330598814
-30
-1.2854810201011309
-11
-0.22087678061792837
-21
-0.12848963675231756
-31
-1.221316149587198
-12
-0.18003798909713586
-22
-0.18171178605838728
-32
-1.221316149587198
-13
-0.18003798909713586
-23
-0.18171178605838728
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2553054744644233
-20
-0.06885738977195177
-30
-1.1524587618942086
-11
-0.22087678061792837
-21
-0.12848963675231756
-31
-1.221316149587198
-12
-0.24654911820059633
-22
-0.06651113118241986
-32
-1.221316149587198
-13
-0.24654911820059633
-23
-0.06651113118241986
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22087678061792837
-20
-0.12848963675231756
-30
-1.221316149587198
-11
-0.2553054744644233
-21
-0.06885738977195177
-31
-1.1524587618942086
-12
-0.2287275148696407
-22
-0.1330222602858802
-32
-1.1524587618942086
-13
-0.2287275148696407
-23
-0.1330222602858802
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22661554716969412
-20
-0.13180291516579662
-30
-1.133935070472775
-11
-0.2553054744644233
-21
-0.06885738977195177
-31
-1.1524587618942086
-12
-0.2540807139947864
-22
-0.06852921619319102
-32
-1.1428276089410956
-13
-0.2540807139947864
-23
-0.06852921619319102
-33
-1.1428276089410956
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2553054744644233
-20
-0.06885738977195177
-30
-1.1524587618942086
-11
-0.22661554716969412
-21
-0.13180291516579662
-31
-1.133935070472775
-12
-0.2287275148696407
-22
-0.1330222602858802
-32
-1.1524587618942086
-13
-0.2287275148696407
-23
-0.1330222602858802
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18003798909713392
-20
-0.0486895278514653
-30
-1.3405806435479293
-11
-0.19785959242808948
-21
-0.11520065695492626
-31
-1.2854810201011309
-12
-0.16124453363756153
-22
-0.09406094290582073
-32
-1.3405806435479293
-13
-0.16124453363756153
-23
-0.09406094290582073
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.19785959242808948
-20
-0.11520065695492626
-30
-1.2854810201011309
-11
-0.18003798909713392
-21
-0.0486895278514653
-31
-1.3405806435479293
-12
-0.2208767806179276
-22
-0.059632249059325015
-32
-1.2854810201011309
-13
-0.2208767806179276
-23
-0.059632249059325015
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.13134846332462868
-20
-0.13302226028588
-30
-1.3405806435479293
-11
-0.11352685999367468
-21
-0.19953338938934095
-31
-1.2854810201011309
-12
-0.09238714594456926
-22
-0.16291833059881272
-32
-1.3405806435479293
-13
-0.09238714594456926
-23
-0.16291833059881272
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.11352685999367468
-20
-0.19953338938934095
-30
-1.2854810201011309
-11
-0.13134846332462868
-21
-0.13302226028588
-31
-1.3405806435479293
-12
-0.16124453363756192
-22
-0.162918330598814
-32
-1.2854810201011309
-13
-0.16124453363756192
-23
-0.162918330598814
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.1268158397910666
-20
-0.03442869592545589
-30
-1.3828600716461388
-11
-0.16124453363756153
-21
-0.09406094290582073
-31
-1.3405806435479293
-12
-0.11352685999367468
-22
-0.06651113118242036
-32
-1.3828600716461388
-13
-0.11352685999367468
-23
-0.06651113118242036
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.16124453363756153
-20
-0.09406094290582073
-30
-1.3405806435479293
-11
-0.1268158397910666
-21
-0.03442869592545589
-31
-1.3828600716461388
-12
-0.18003798909713392
-22
-0.0486895278514653
-32
-1.3405806435479293
-13
-0.18003798909713392
-23
-0.0486895278514653
-33
-1.3405806435479293
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06483733422116789
-20
-0.01782160540991351
-30
-1.4094380312409234
-11
-0.11352685999367468
-21
-0.06651113118242036
-31
-1.3828600716461388
-12
-0.05795845209807354
-22
-0.034428695925455666
-32
-1.4094380312409234
-13
-0.05795845209807354
-23
-0.034428695925455666
-33
-1.4094380312409234
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.11352685999367468
-20
-0.06651113118242036
-30
-1.3828600716461388
-11
-0.06483733422116789
-21
-0.01782160540991351
-31
-1.4094380312409234
-12
-0.1268158397910666
-22
-0.03442869592545589
-32
-1.3828600716461388
-13
-0.1268158397910666
-23
-0.03442869592545589
-33
-1.3828600716461388
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.24654911820059633
-20
-0.06651113118241986
-30
-1.221316149587198
-11
-0.22872751486964182
-21
-2.078959393525537e-09
-31
-1.2854810201011309
-12
-0.2553054744644241
-22
-2.078959393525537e-09
-32
-1.221316149587198
-13
-0.2553054744644241
-23
-2.078959393525537e-09
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22872751486964182
-20
-2.078959393525537e-09
-30
-1.2854810201011309
-11
-0.24654911820059633
-21
-0.06651113118241986
-31
-1.221316149587198
-12
-0.2208767806179276
-22
-0.059632249059325015
-32
-1.2854810201011309
-13
-0.2208767806179276
-23
-0.059632249059325015
-33
-1.2854810201011309
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.30905309760007
-20
-0.08235659503094556
-30
--0.029987258687029512
-11
--0.001695615174016285
-21
-2.078961613971586e-09
-31
--0.029987258687029512
-12
--0.3198956001177664
-22
-3.9221799974509253e-07
-32
--0.029987258687029512
-13
--0.3198956001177664
-23
-3.9221799974509253e-07
-33
--0.029987258687029512
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001695615174016285
-20
-2.078961613971586e-09
-30
--0.029987258687029512
-11
--0.30905309760007
-21
-0.08235659503094556
-31
--0.029987258687029512
-12
--0.27726469062630743
-22
-0.15910033213491825
-32
--0.029987258687029512
-13
--0.27726469062630743
-23
-0.15910033213491825
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001695615174016285
-20
-2.078961613971586e-09
-30
--0.029987258687029512
-11
--0.27726469062630743
-21
-0.15910033213491825
-31
--0.029987258687029512
-12
--0.226696706598913
-22
-0.2250016446713048
-32
--0.029987258687029512
-13
--0.226696706598913
-23
-0.2250016446713048
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001695615174016285
-20
-2.078961613971586e-09
-30
--0.029987258687029512
-11
--0.226696706598913
-21
-0.2250016446713048
-31
--0.029987258687029512
-12
--0.16079527006181052
-22
-0.2755694670978184
-32
--0.029987258687029512
-13
--0.16079527006181052
-23
-0.2755694670978184
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001695615174016285
-20
-2.078961613971586e-09
-30
--0.029987258687029512
-11
--0.16079527006181052
-21
-0.2755694670978184
-31
--0.029987258687029512
-12
--0.08405145500772823
-22
-0.30735768588336976
-32
--0.029987258687029512
-13
--0.08405145500772823
-23
-0.30735768588336976
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001695615174016285
-20
-2.078961613971586e-09
-30
--0.029987258687029512
-11
--0.08405145500772823
-21
-0.30735768588336976
-31
--0.029987258687029512
-12
--0.001695225607451445
-22
-0.31819998645023906
-32
--0.029987258687029512
-13
--0.001695225607451445
-23
-0.31819998645023906
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001695615174016285
-20
-2.078961613971586e-09
-30
--0.029987258687029512
-11
--0.001695225607451445
-21
-0.31819998645023906
-31
--0.029987258687029512
-12
--0.0015797266903812557
-22
-1.936872939811707e-09
-32
--0.029987258687029512
-13
--0.0015797266903812557
-23
-1.936872939811707e-09
-33
--0.029987258687029512
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0015797266903812557
-20
-1.936872939811707e-09
-30
--0.029987258687029512
-11
--0.001695225607451445
-21
-0.31819998645023906
-31
--0.029987258687029512
-12
-0.08066097720549281
-22
-0.30735748393254325
-32
--0.029987258687029512
-13
-0.08066097720549281
-23
-0.30735748393254325
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0015797266903812557
-20
-1.936872939811707e-09
-30
--0.029987258687029512
-11
-0.08066097720549281
-21
-0.30735748393254325
-31
--0.029987258687029512
-12
-1.2212453270876722e-15
-22
--3.885780586188048e-16
-32
--0.029987258687029512
-13
-1.2212453270876722e-15
-23
--3.885780586188048e-16
-33
--0.029987258687029512
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
-1.2212453270876722e-15
-20
--3.885780586188048e-16
-30
--0.029987258687029512
-11
-0.08066097720549281
-21
-0.30735748393254325
-31
--0.029987258687029512
-12
-0.3165043686247876
-22
--3.880600751848817e-07
-32
--0.029987258687029512
-13
-0.3165043686247876
-23
--3.880600751848817e-07
-33
--0.029987258687029512
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3165043686247876
-20
--3.880600751848817e-07
-30
--0.029987258687029512
-11
-0.08066097720549281
-21
-0.30735748393254325
-31
--0.029987258687029512
-12
-0.1574047143094663
-22
-0.27556907695878063
-32
--0.029987258687029512
-13
-0.1574047143094663
-23
-0.27556907695878063
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3165043686247876
-20
--3.880600751848817e-07
-30
--0.029987258687029512
-11
-0.1574047143094663
-21
-0.27556907695878063
-31
--0.029987258687029512
-12
-0.22330602684585132
-22
-0.2250010929313866
-32
--0.029987258687029512
-13
-0.22330602684585132
-23
-0.2250010929313866
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3165043686247876
-20
--3.880600751848817e-07
-30
--0.029987258687029512
-11
-0.22330602684585132
-21
-0.2250010929313866
-31
--0.029987258687029512
-12
-0.2738738492723656
-22
-0.1590996563942833
-32
--0.029987258687029512
-13
-0.2738738492723656
-23
-0.1590996563942833
-33
--0.029987258687029512
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3165043686247876
-20
--3.880600751848817e-07
-30
--0.029987258687029512
-11
-0.2738738492723656
-21
-0.1590996563942833
-31
--0.029987258687029512
-12
-0.3056620680579174
-22
-0.08235584134020102
-32
--0.029987258687029512
-13
-0.3056620680579174
-23
-0.08235584134020102
-33
--0.029987258687029512
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.249896707965181
-20
-0.06651113118242025
-30
-1.221316149587198
-11
--0.26771831129613466
-21
-2.078959449036688e-09
-31
-1.1524587618942086
-12
--0.2586530642290092
-22
-2.078959449036688e-09
-32
-1.221316149587198
-13
--0.2586530642290092
-23
-2.078959449036688e-09
-33
-1.221316149587198
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.26771831129613466
-20
-2.078959449036688e-09
-30
-1.1524587618942086
-11
--0.249896707965181
-21
-0.06651113118242025
-31
-1.221316149587198
-12
--0.2586530642290084
-22
-0.06885738977195188
-32
-1.1524587618942086
-13
--0.2586530642290084
-23
-0.06885738977195188
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2586530642290084
-20
-0.06885738977195188
-30
-1.1524587618942086
-11
--0.25742830375937065
-21
-0.06852921619319091
-31
-1.1428276089410967
-12
--0.26771831129613466
-22
-2.078959449036688e-09
-32
-1.1524587618942086
-13
--0.26771831129613466
-23
-2.078959449036688e-09
-33
-1.1524587618942086
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06685541923193933
-20
-0.2557545109560382
-30
-1.1428276089410931
-11
-0.12925057314949195
-21
-0.22676765945885802
-31
-1.1205886460425298
-12
-0.06597457487312747
-22
-0.25246715505539363
-32
-1.1169768174799652
-13
-0.06597457487312747
-23
-0.25246715505539363
-33
-1.1169768174799652
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.12925057314949195
-20
-0.22676765945885802
-30
-1.1205886460425298
-11
-0.06685541923193933
-21
-0.2557545109560382
-31
-1.1428276089410931
-12
-0.13012911820454431
-22
-0.22828934413094437
-32
-1.133935070472775
-13
-0.13012911820454431
-23
-0.22828934413094437
-33
-1.133935070472775
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.13012911820454431
-20
-0.22828934413094437
-30
-1.133935070472775
-11
-0.18401862091672266
-21
-0.18569241787797314
-31
-1.1263613947799103
-12
-0.12925057314949195
-22
-0.22676765945885802
-32
-1.1205886460425298
-13
-0.12925057314949195
-23
-0.22676765945885802
-33
-1.1205886460425298
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.2660445184928011
-30
-1.1524587618942086
-11
--0.001673794882292523
-21
-0.2612114402998337
-31
-1.1157478883328396
-12
--0.0377296621751953
-22
-0.2565508285292213
-32
-1.1164028946013032
-13
--0.0377296621751953
-23
-0.2565508285292213
-33
-1.1164028946013032
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.001673794882292523
-20
-0.2660445184928011
-30
-1.1524587618942086
-11
-0.06597457487312747
-21
-0.25246715505539363
-31
-1.1169768174799652
-12
--0.001673794882292523
-22
-0.2612114402998337
-32
-1.1157478883328396
-13
--0.001673794882292523
-23
-0.2612114402998337
-33
-1.1157478883328396
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.06597457487312747
-20
-0.25246715505539363
-30
-1.1169768174799652
-11
--0.001673794882292523
-21
-0.2660445184928011
-31
-1.1524587618942086
-12
-0.06685541923193933
-22
-0.2557545109560382
-32
-1.1428276089410931
-13
-0.06685541923193933
-23
-0.2557545109560382
-33
-1.1428276089410931
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18401862091672266
-20
-0.18569241787797314
-30
-1.1263613947799103
-11
-0.22661554716969412
-21
-0.13180291516579662
-31
-1.133935070472775
-12
-0.22509386249760543
-22
-0.13092437011074415
-32
-1.1205886460425298
-13
-0.22509386249760543
-23
-0.13092437011074415
-33
-1.1205886460425298
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13227951399272905
-20
-0.2262157433373062
-30
-1.1157478883328396
-11
--0.07053118257528798
-21
-0.24725106303322575
-31
-1.083601374201211
-12
--0.13016342955565008
-22
-0.2225505775791794
-32
-1.083601374201211
-13
--0.13016342955565008
-23
-0.2225505775791794
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.07053118257528798
-20
-0.24725106303322575
-30
-1.083601374201211
-11
--0.13227951399272905
-21
-0.2262157433373062
-31
-1.1157478883328396
-12
--0.06826223645016033
-22
-0.2485114492070778
-32
-1.085870320326334
-13
--0.06826223645016033
-23
-0.2485114492070778
-33
-1.085870320326334
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06826223645016033
-20
-0.2485114492070778
-30
-1.085870320326334
-11
--0.13227951399272905
-21
-0.2262157433373062
-31
-1.1157478883328396
-12
--0.06928028989247559
-22
-0.2523108763786134
-32
-1.1157478883328396
-13
--0.06928028989247559
-23
-0.2523108763786134
-33
-1.1157478883328396
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06928028989247559
-20
-0.2523108763786134
-30
-1.1157478883328396
-11
--0.13227951399272905
-21
-0.2262157433373062
-31
-1.1157478883328396
-12
--0.13259816291407706
-22
-0.22676765945885902
-32
-1.1205886460425298
-13
--0.13259816291407706
-23
-0.22676765945885902
-33
-1.1205886460425298
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06928028989247559
-20
-0.2523108763786134
-30
-1.1157478883328396
-11
--0.13259816291407706
-21
-0.22676765945885902
-31
-1.1205886460425298
-12
--0.06932216463771257
-22
-0.2524671550553943
-32
-1.1169768174799652
-13
--0.06932216463771257
-23
-0.2524671550553943
-33
-1.1169768174799652
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18637817417176358
-20
-0.1847043813684307
-30
-1.1157478883328396
-11
--0.13016342955565008
-21
-0.2225505775791794
-31
-1.083601374201211
-12
--0.18338557886171938
-22
-0.18171178605838667
-32
-1.083601374201211
-13
--0.18338557886171938
-23
-0.18171178605838667
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13016342955565008
-20
-0.2225505775791794
-30
-1.083601374201211
-11
--0.18637817417176358
-21
-0.1847043813684307
-31
-1.1157478883328396
-12
--0.13227951399272905
-22
-0.2262157433373062
-32
-1.1157478883328396
-13
--0.13227951399272905
-23
-0.2262157433373062
-33
-1.1157478883328396
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13227951399272905
-20
-0.2262157433373062
-30
-1.1157478883328396
-11
--0.18637817417176358
-21
-0.1847043813684307
-31
-1.1157478883328396
-12
--0.18736621068130693
-22
-0.18569241787797425
-32
-1.1263613947799127
-13
--0.18736621068130693
-23
-0.18569241787797425
-33
-1.1263613947799127
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.13227951399272905
-20
-0.2262157433373062
-30
-1.1157478883328396
-11
--0.18736621068130693
-21
-0.18569241787797425
-31
-1.1263613947799127
-12
--0.13259816291407706
-22
-0.22676765945885902
-32
-1.1205886460425298
-13
--0.13259816291407706
-23
-0.22676765945885902
-33
-1.1205886460425298
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2539846691819466
-20
-0.06760649708914246
-30
-1.1157478883328396
-11
--0.22422437038251186
-21
-0.12848963675231756
-31
-1.083601374201211
-12
--0.2498967079651798
-22
-0.06651113118242008
-32
-1.083601374201211
-13
--0.2498967079651798
-23
-0.06651113118242008
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251186
-20
-0.12848963675231756
-30
-1.083601374201211
-11
--0.2539846691819466
-21
-0.06760649708914246
-31
-1.1157478883328396
-12
--0.25742830375937065
-22
-0.06852921619319091
-32
-1.1428276089410967
-13
--0.25742830375937065
-23
-0.06852921619319091
-33
-1.1428276089410967
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251186
-20
-0.12848963675231756
-30
-1.083601374201211
-11
--0.25742830375937065
-21
-0.06852921619319091
-31
-1.1428276089410967
-12
--0.2299631369342784
-22
-0.13180291516579612
-32
-1.133935070472781
-13
--0.2299631369342784
-23
-0.13180291516579612
-33
-1.133935070472781
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.22422437038251186
-20
-0.12848963675231756
-30
-1.083601374201211
-11
--0.2299631369342784
-21
-0.13180291516579612
-31
-1.133935070472781
-12
--0.2278895361406395
-22
-0.13060572118939684
-32
-1.1157478883328396
-13
--0.2278895361406395
-23
-0.13060572118939684
-33
-1.1157478883328396
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.25742830375937065
-20
-0.06852921619319091
-30
-1.1428276089410967
-11
--0.26288523310316675
-21
-2.078959449036688e-09
-31
-1.1157478883328396
-12
--0.26771831129613466
-22
-2.078959449036688e-09
-32
-1.1524587618942086
-13
--0.26771831129613466
-23
-2.078959449036688e-09
-33
-1.1524587618942086
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.26288523310316675
-20
-2.078959449036688e-09
-30
-1.1157478883328396
-11
--0.25742830375937065
-21
-0.06852921619319091
-31
-1.1428276089410967
-12
--0.258653064229008
-22
-2.0789595045478393e-09
-32
-1.083601374201211
-13
--0.258653064229008
-23
-2.0789595045478393e-09
-33
-1.083601374201211
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.258653064229008
-20
-2.0789595045478393e-09
-30
-1.083601374201211
-11
--0.25742830375937065
-21
-0.06852921619319091
-31
-1.1428276089410967
-12
--0.2498967079651798
-22
-0.06651113118242008
-32
-1.083601374201211
-13
--0.2498967079651798
-23
-0.06651113118242008
-33
-1.083601374201211
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2498967079651798
-20
-0.06651113118242008
-30
-1.083601374201211
-11
--0.25742830375937065
-21
-0.06852921619319091
-31
-1.1428276089410967
-12
--0.2539846691819466
-22
-0.06760649708914246
-32
-1.1157478883328396
-13
--0.2539846691819466
-23
-0.06760649708914246
-33
-1.1157478883328396
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22509386249760543
-20
-0.13092437011074415
-30
-1.1205886460425298
-11
-0.2626308843757006
-21
-0.26432585403041065
-31
-1.1153131616555407
-12
-0.18401862091672266
-22
-0.18569241787797314
-32
-1.1263613947799103
-13
-0.18401862091672266
-23
-0.18569241787797314
-33
-1.1263613947799103
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2626308843757006
-20
-0.26432585403041065
-30
-1.1153131616555407
-11
-0.22509386249760543
-21
-0.13092437011074415
-31
-1.1205886460425298
-12
-0.25079335809414127
-22
-0.06764837183437955
-32
-1.1169768174799628
-13
-0.25079335809414127
-23
-0.06764837183437955
-33
-1.1169768174799628
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2626308843757006
-20
-0.26432585403041065
-30
-1.1153131616555407
-11
-0.25079335809414127
-21
-0.06764837183437955
-31
-1.1169768174799628
-12
-0.2595376433385824
-22
-2.078959393525537e-09
-32
-1.1157478883328396
-13
-0.2595376433385824
-23
-2.078959393525537e-09
-33
-1.1157478883328396
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2626308843757006
-20
-0.26432585403041065
-30
-1.1153131616555407
-11
-0.2595376433385824
-21
-2.078959393525537e-09
-31
-1.1157478883328396
-12
-0.3718950373839425
-22
-2.0789609478377713e-09
-32
-1.0999570863887107
-13
-0.3718950373839425
-23
-2.0789609478377713e-09
-33
-1.0999570863887107
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2626308843757006
-20
-0.26432585403041065
-30
-1.1153131616555407
-11
-0.3718950373839425
-21
-2.0789609478377713e-09
-31
-1.0999570863887107
-12
-0.3219319512611786
-22
-0.1868459359501376
-32
-1.1069789402167114
-13
-0.3219319512611786
-23
-0.1868459359501376
-33
-1.1069789402167114
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3219319512611786
-20
-0.1868459359501376
-30
-1.1069789402167114
-11
-0.3718950373839425
-21
-2.0789609478377713e-09
-31
-1.0999570863887107
-12
-0.3591904613034176
-22
-0.09669866074029804
-32
-1.1017425981156106
-13
-0.3591904613034176
-23
-0.09669866074029804
-33
-1.1017425981156106
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2278895361406395
-20
-0.13060572118939684
-30
-1.1157478883328396
-11
--0.18338557886171938
-21
-0.18171178605838667
-31
-1.083601374201211
-12
--0.22422437038251186
-22
-0.12848963675231756
-32
-1.083601374201211
-13
--0.22422437038251186
-23
-0.12848963675231756
-33
-1.083601374201211
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171938
-20
-0.18171178605838667
-30
-1.083601374201211
-11
--0.2278895361406395
-21
-0.13060572118939684
-31
-1.1157478883328396
-12
--0.2299631369342784
-22
-0.13180291516579612
-32
-1.133935070472781
-13
--0.2299631369342784
-23
-0.13180291516579612
-33
-1.133935070472781
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171938
-20
-0.18171178605838667
-30
-1.083601374201211
-11
--0.2299631369342784
-21
-0.13180291516579612
-31
-1.133935070472781
-12
--0.18736621068130693
-22
-0.18569241787797425
-32
-1.1263613947799127
-13
--0.18736621068130693
-23
-0.18569241787797425
-33
-1.1263613947799127
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18338557886171938
-20
-0.18171178605838667
-30
-1.083601374201211
-11
--0.18736621068130693
-21
-0.18569241787797425
-31
-1.1263613947799127
-12
--0.18637817417176358
-22
-0.1847043813684307
-32
-1.1157478883328396
-13
--0.18637817417176358
-23
-0.1847043813684307
-33
-1.1157478883328396
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.25079335809414127
-20
-0.06764837183437955
-30
-1.1169768174799628
-11
-0.2643707215315495
-21
-2.078959393525537e-09
-31
-1.1524587618942086
-12
-0.2595376433385824
-22
-2.078959393525537e-09
-32
-1.1157478883328396
-13
-0.2595376433385824
-23
-2.078959393525537e-09
-33
-1.1157478883328396
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2643707215315495
-20
-2.078959393525537e-09
-30
-1.1524587618942086
-11
-0.25079335809414127
-21
-0.06764837183437955
-31
-1.1169768174799628
-12
-0.2540807139947864
-22
-0.06852921619319102
-32
-1.1428276089410956
-13
-0.2540807139947864
-23
-0.06852921619319102
-33
-1.1428276089410956
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.18979567653601576
-20
-2.0789595045478393e-09
-30
-0.9643368802404846
-11
--0.35829150997042125
-21
-0.09555005256687987
-31
-0.7958410468060751
-12
--0.3706909491339097
-22
-4.544972251330215e-07
-32
-0.7834416076425874
-13
--0.3706909491339097
-23
-4.544972251330215e-07
-33
-0.7834416076425874
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.35829150997042125
-20
-0.09555005256687987
-30
-0.7958410468060751
-11
--0.18979567653601576
-21
-2.0789595045478393e-09
-31
-0.9643368802404846
-12
--0.32186859092445047
-22
-0.18485247889635142
-32
-0.8322639658520461
-13
--0.32186859092445047
-23
-0.18485247889635142
-33
-0.8322639658520461
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.32186859092445047
-20
-0.18485247889635142
-30
-0.8322639658520461
-11
--0.18979567653601576
-21
-2.0789595045478393e-09
-31
-0.9643368802404846
-12
--0.29191131237938345
-22
-0.22460181803280632
-32
-0.8622212443971131
-13
--0.29191131237938345
-23
-0.22460181803280632
-33
-0.8622212443971131
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.29191131237938345
-20
-0.22460181803280632
-30
-0.8622212443971131
-11
--0.18979567653601576
-21
-2.0789595045478393e-09
-31
-0.9643368802404846
-12
--0.2637126619050216
-22
-0.26201769074666237
-32
-0.890419894871474
-13
--0.2637126619050216
-23
-0.26201769074666237
-33
-0.890419894871474
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2637126619050216
-20
-0.26201769074666237
-30
-0.890419894871474
-11
--0.18979567653601576
-21
-2.0789595045478393e-09
-31
-0.9643368802404846
-12
--0.1875225673732847
-22
-0.3218626350699233
-32
-0.9666099894032089
-13
--0.1875225673732847
-23
-0.3218626350699233
-33
-0.9666099894032089
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1875225673732847
-20
-0.3218626350699233
-30
-0.9666099894032089
-11
--0.18979567653601576
-21
-2.0789595045478393e-09
-31
-0.9643368802404846
-12
--0.1861142110017942
-22
-0.049420662629840184
-32
-0.9680183457747035
-13
--0.1861142110017942
-23
-0.049420662629840184
-33
-0.9680183457747035
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1875225673732847
-20
-0.3218626350699233
-30
-0.9666099894032089
-11
--0.1861142110017942
-21
-0.049420662629840184
-31
-0.9680183457747035
-12
--0.17465408466303567
-22
-0.099870218948371
-32
-0.9794784721134615
-13
--0.17465408466303567
-23
-0.099870218948371
-33
-0.9794784721134615
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1875225673732847
-20
-0.3218626350699233
-30
-0.9666099894032089
-11
--0.17465408466303567
-21
-0.099870218948371
-31
-0.9794784721134615
-12
--0.09822205169936674
-22
-0.36024333207843495
-32
-1.05591050507713
-13
--0.09822205169936674
-23
-0.36024333207843495
-33
-1.05591050507713
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.17465408466303567
-21
-0.099870218948371
-31
-0.9794784721134615
-12
--0.16443652005322085
-22
-0.12595478545169825
-32
-0.9896960367232768
-13
--0.16443652005322085
-23
-0.12595478545169825
-33
-0.9896960367232768
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.16443652005322085
-21
-0.12595478545169825
-31
-0.9896960367232768
-12
--0.1540765904307652
-22
-0.1524027976274323
-32
-1.0000559663457305
-13
--0.1540765904307652
-23
-0.1524027976274323
-33
-1.0000559663457305
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.1540765904307652
-21
-0.1524027976274323
-31
-1.0000559663457305
-12
--0.1346960530892106
-22
-0.1858583921844445
-32
-1.0194365036872854
-13
--0.1346960530892106
-23
-0.1858583921844445
-33
-1.0194365036872854
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.1346960530892106
-21
-0.1858583921844445
-31
-1.0194365036872854
-12
--0.11993215348338515
-22
-0.20482948759574693
-32
-1.0342004032931107
-13
--0.11993215348338515
-23
-0.20482948759574693
-33
-1.0342004032931107
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.11993215348338515
-21
-0.20482948759574693
-31
-1.0342004032931107
-12
--0.07053118257528798
-22
-0.24725106303322575
-32
-1.083601374201211
-13
--0.07053118257528798
-23
-0.24725106303322575
-33
-1.083601374201211
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.07053118257528798
-21
-0.24725106303322575
-31
-1.083601374201211
-12
--0.053235390890986944
-22
-0.3668191518579341
-32
-1.1009056923994525
-13
--0.053235390890986944
-23
-0.3668191518579341
-33
-1.1009056923994525
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.053235390890986944
-20
-0.3668191518579341
-30
-1.1009056923994525
-11
--0.07053118257528798
-21
-0.24725106303322575
-31
-1.083601374201211
-12
--0.06826223645016033
-22
-0.2485114492070778
-32
-1.085870320326334
-13
--0.06826223645016033
-23
-0.2485114492070778
-33
-1.085870320326334
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.053235390890986944
-20
-0.3668191518579341
-30
-1.1009056923994525
-11
--0.06826223645016033
-21
-0.2485114492070778
-31
-1.085870320326334
-12
--0.0377296621751953
-22
-0.2565508285292213
-32
-1.1164028946013032
-13
--0.0377296621751953
-23
-0.2565508285292213
-33
-1.1164028946013032
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22509386249760543
-20
-0.13092437011074415
-30
-1.1205886460425298
-11
-0.2540807139947864
-21
-0.06852921619319102
-31
-1.1428276089410956
-12
-0.25079335809414127
-22
-0.06764837183437955
-32
-1.1169768174799628
-13
-0.25079335809414127
-23
-0.06764837183437955
-33
-1.1169768174799628
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2540807139947864
-20
-0.06852921619319102
-30
-1.1428276089410956
-11
-0.22509386249760543
-21
-0.13092437011074415
-31
-1.1205886460425298
-12
-0.22661554716969412
-22
-0.13180291516579662
-32
-1.133935070472775
-13
-0.22661554716969412
-23
-0.13180291516579662
-33
-1.133935070472775
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.06928028989247559
-20
-0.2523108763786134
-30
-1.1157478883328396
-11
--0.0377296621751953
-21
-0.2565508285292213
-31
-1.1164028946013032
-12
--0.06826223645016033
-22
-0.2485114492070778
-32
-1.085870320326334
-13
--0.06826223645016033
-23
-0.2485114492070778
-33
-1.085870320326334
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0377296621751953
-20
-0.2565508285292213
-30
-1.1164028946013032
-11
--0.06928028989247559
-21
-0.2523108763786134
-31
-1.1157478883328396
-12
--0.06932216463771257
-22
-0.2524671550553943
-32
-1.1169768174799652
-13
--0.06932216463771257
-23
-0.2524671550553943
-33
-1.1169768174799652
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0377296621751953
-20
-0.2565508285292213
-30
-1.1164028946013032
-11
--0.0016951576939718827
-21
-0.37359067095576093
-31
-1.0999540174532403
-12
--0.053235390890986944
-22
-0.3668191518579341
-32
-1.1009056923994525
-13
--0.053235390890986944
-23
-0.3668191518579341
-33
-1.1009056923994525
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016951576939718827
-20
-0.37359067095576093
-30
-1.0999540174532403
-11
--0.0377296621751953
-21
-0.2565508285292213
-31
-1.1164028946013032
-12
--0.001673794882292523
-22
-0.2612114402998337
-32
-1.1157478883328396
-13
--0.001673794882292523
-23
-0.2612114402998337
-33
-1.1157478883328396
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016951576939718827
-20
-0.37359067095576093
-30
-1.0999540174532403
-11
--0.001673794882292523
-21
-0.2612114402998337
-31
-1.1157478883328396
-12
-0.09500391648962592
-22
-0.3608857995504491
-32
-1.1017395706853292
-13
-0.09500391648962592
-23
-0.3608857995504491
-33
-1.1017395706853292
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09500391648962592
-20
-0.3608857995504491
-30
-1.1017395706853292
-11
--0.001673794882292523
-21
-0.2612114402998337
-31
-1.1157478883328396
-12
-0.06597457487312747
-22
-0.25246715505539363
-32
-1.1169768174799652
-13
-0.06597457487312747
-23
-0.25246715505539363
-33
-1.1169768174799652
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09500391648962592
-20
-0.3608857995504491
-30
-1.1017395706853292
-11
-0.06597457487312747
-21
-0.25246715505539363
-31
-1.1169768174799652
-12
-0.12925057314949195
-22
-0.22676765945885802
-32
-1.1205886460425298
-13
-0.12925057314949195
-23
-0.22676765945885802
-33
-1.1205886460425298
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09500391648962592
-20
-0.3608857995504491
-30
-1.1017395706853292
-11
-0.12925057314949195
-21
-0.22676765945885802
-31
-1.1205886460425298
-12
-0.18515108995501323
-22
-0.32362707322580364
-32
-1.1069759431829398
-13
-0.18515108995501323
-23
-0.32362707322580364
-33
-1.1069759431829398
-70
-3
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18515108995501323
-20
-0.32362707322580364
-30
-1.1069759431829398
-11
-0.12925057314949195
-21
-0.22676765945885802
-31
-1.1205886460425298
-12
-0.18401862091672266
-22
-0.18569241787797314
-32
-1.1263613947799103
-13
-0.18401862091672266
-23
-0.18569241787797314
-33
-1.1263613947799103
-70
-13
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18515108995501323
-20
-0.32362707322580364
-30
-1.1069759431829398
-11
-0.18401862091672266
-21
-0.18569241787797314
-31
-1.1263613947799103
-12
-0.2626308843757006
-22
-0.26432585403041065
-32
-1.1153131616555407
-13
-0.2626308843757006
-23
-0.26432585403041065
-33
-1.1153131616555407
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.30905309760007
-20
-0.08235659503094556
-30
--0.029987258687029512
-11
--0.3198956001177664
-21
-3.9221799974509253e-07
-31
--0.029987258687029512
-12
--0.3706909491339097
-22
-4.544972251330215e-07
-32
-0.7834416076425874
-13
--0.3706909491339097
-23
-4.544972251330215e-07
-33
-0.7834416076425874
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.35829150997042125
-20
-0.09555005256687987
-30
-0.7958410468060751
-11
--0.30905309760007
-21
-0.08235659503094556
-31
--0.029987258687029512
-12
--0.3706909491339097
-22
-4.544972251330215e-07
-32
-0.7834416076425874
-13
--0.3706909491339097
-23
-4.544972251330215e-07
-33
-0.7834416076425874
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.2637126619050216
-20
-0.26201769074666237
-30
-0.890419894871474
-11
--0.16079527006181052
-21
-0.2755694670978184
-31
--0.029987258687029512
-12
--0.226696706598913
-22
-0.2250016446713048
-32
--0.029987258687029512
-13
--0.226696706598913
-23
-0.2250016446713048
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1875225673732847
-20
-0.3218626350699233
-30
-0.9666099894032089
-11
--0.16079527006181052
-21
-0.2755694670978184
-31
--0.029987258687029512
-12
--0.2637126619050216
-22
-0.26201769074666237
-32
-0.890419894871474
-13
--0.2637126619050216
-23
-0.26201769074666237
-33
-0.890419894871474
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.1875225673732847
-20
-0.3218626350699233
-30
-0.9666099894032089
-11
--0.08405145500772823
-21
-0.30735768588336976
-31
--0.029987258687029512
-12
--0.16079527006181052
-22
-0.2755694670978184
-32
--0.029987258687029512
-13
--0.16079527006181052
-23
-0.2755694670978184
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.08405145500772823
-21
-0.30735768588336976
-31
--0.029987258687029512
-12
--0.1875225673732847
-22
-0.3218626350699233
-32
-0.9666099894032089
-13
--0.1875225673732847
-23
-0.3218626350699233
-33
-0.9666099894032089
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.27726469062630743
-20
-0.15910033213491825
-30
--0.029987258687029512
-11
--0.30905309760007
-21
-0.08235659503094556
-31
--0.029987258687029512
-12
--0.35829150997042125
-22
-0.09555005256687987
-32
-0.7958410468060751
-13
--0.35829150997042125
-23
-0.09555005256687987
-33
-0.7958410468060751
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.32186859092445047
-20
-0.18485247889635142
-30
-0.8322639658520461
-11
--0.27726469062630743
-21
-0.15910033213491825
-31
--0.029987258687029512
-12
--0.35829150997042125
-22
-0.09555005256687987
-32
-0.7958410468060751
-13
--0.35829150997042125
-23
-0.09555005256687987
-33
-0.7958410468060751
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.22330602684585132
-20
-0.2250010929313866
-30
--0.029987258687029512
-11
-0.3219319512611786
-21
-0.1868459359501376
-31
-1.1069789402167114
-12
-0.2738738492723656
-22
-0.1590996563942833
-32
--0.029987258687029512
-13
-0.2738738492723656
-23
-0.1590996563942833
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2626308843757006
-20
-0.26432585403041065
-30
-1.1153131616555407
-11
-0.3219319512611786
-21
-0.1868459359501376
-31
-1.1069789402167114
-12
-0.22330602684585132
-22
-0.2250010929313866
-32
--0.029987258687029512
-13
-0.22330602684585132
-23
-0.2250010929313866
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.226696706598913
-20
-0.2250016446713048
-30
--0.029987258687029512
-11
--0.27726469062630743
-21
-0.15910033213491825
-31
--0.029987258687029512
-12
--0.32186859092445047
-22
-0.18485247889635142
-32
-0.8322639658520461
-13
--0.32186859092445047
-23
-0.18485247889635142
-33
-0.8322639658520461
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18515108995501323
-20
-0.32362707322580364
-30
-1.1069759431829398
-11
-0.22330602684585132
-21
-0.2250010929313866
-31
--0.029987258687029512
-12
-0.1574047143094663
-22
-0.27556907695878063
-32
--0.029987258687029512
-13
-0.1574047143094663
-23
-0.27556907695878063
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2626308843757006
-20
-0.26432585403041065
-30
-1.1153131616555407
-11
-0.22330602684585132
-21
-0.2250010929313866
-31
--0.029987258687029512
-12
-0.18515108995501323
-22
-0.32362707322580364
-32
-1.1069759431829398
-13
-0.18515108995501323
-23
-0.32362707322580364
-33
-1.1069759431829398
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.09822205169936674
-20
-0.36024333207843495
-30
-1.05591050507713
-11
--0.001695225607451445
-21
-0.31819998645023906
-31
--0.029987258687029512
-12
--0.08405145500772823
-22
-0.30735768588336976
-32
--0.029987258687029512
-13
--0.08405145500772823
-23
-0.30735768588336976
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016951576939718827
-20
-0.37359067095576093
-30
-1.0999540174532403
-11
--0.001695225607451445
-21
-0.31819998645023906
-31
--0.029987258687029512
-12
--0.09822205169936674
-22
-0.36024333207843495
-32
-1.05591050507713
-13
--0.09822205169936674
-23
-0.36024333207843495
-33
-1.05591050507713
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.053235390890986944
-20
-0.3668191518579341
-30
-1.1009056923994525
-11
--0.0016951576939718827
-21
-0.37359067095576093
-31
-1.0999540174532403
-12
--0.09822205169936674
-22
-0.36024333207843495
-32
-1.05591050507713
-13
--0.09822205169936674
-23
-0.36024333207843495
-33
-1.05591050507713
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.29191131237938345
-20
-0.22460181803280632
-30
-0.8622212443971131
-11
--0.226696706598913
-21
-0.2250016446713048
-31
--0.029987258687029512
-12
--0.32186859092445047
-22
-0.18485247889635142
-32
-0.8322639658520461
-13
--0.32186859092445047
-23
-0.18485247889635142
-33
-0.8322639658520461
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.226696706598913
-20
-0.2250016446713048
-30
--0.029987258687029512
-11
--0.29191131237938345
-21
-0.22460181803280632
-31
-0.8622212443971131
-12
--0.2637126619050216
-22
-0.26201769074666237
-32
-0.890419894871474
-13
--0.2637126619050216
-23
-0.26201769074666237
-33
-0.890419894871474
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
--0.0016951576939718827
-20
-0.37359067095576093
-30
-1.0999540174532403
-11
-0.08066097720549281
-21
-0.30735748393254325
-31
--0.029987258687029512
-12
--0.001695225607451445
-22
-0.31819998645023906
-32
--0.029987258687029512
-13
--0.001695225607451445
-23
-0.31819998645023906
-33
--0.029987258687029512
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.08066097720549281
-20
-0.30735748393254325
-30
--0.029987258687029512
-11
--0.0016951576939718827
-21
-0.37359067095576093
-31
-1.0999540174532403
-12
-0.09500391648962592
-22
-0.3608857995504491
-32
-1.1017395706853292
-13
-0.09500391648962592
-23
-0.3608857995504491
-33
-1.1017395706853292
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.2738738492723656
-20
-0.1590996563942833
-30
--0.029987258687029512
-11
-0.3591904613034176
-21
-0.09669866074029804
-31
-1.1017425981156106
-12
-0.3056620680579174
-22
-0.08235584134020102
-32
--0.029987258687029512
-13
-0.3056620680579174
-23
-0.08235584134020102
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3219319512611786
-20
-0.1868459359501376
-30
-1.1069789402167114
-11
-0.3591904613034176
-21
-0.09669866074029804
-31
-1.1017425981156106
-12
-0.2738738492723656
-22
-0.1590996563942833
-32
--0.029987258687029512
-13
-0.2738738492723656
-23
-0.1590996563942833
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.09500391648962592
-20
-0.3608857995504491
-30
-1.1017395706853292
-11
-0.1574047143094663
-21
-0.27556907695878063
-31
--0.029987258687029512
-12
-0.08066097720549281
-22
-0.30735748393254325
-32
--0.029987258687029512
-13
-0.08066097720549281
-23
-0.30735748393254325
-33
--0.029987258687029512
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.18515108995501323
-20
-0.32362707322580364
-30
-1.1069759431829398
-11
-0.1574047143094663
-21
-0.27556907695878063
-31
--0.029987258687029512
-12
-0.09500391648962592
-22
-0.3608857995504491
-32
-1.1017395706853292
-13
-0.09500391648962592
-23
-0.3608857995504491
-33
-1.1017395706853292
-70
-0
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3056620680579174
-20
-0.08235584134020102
-30
--0.029987258687029512
-11
-0.3718950373839425
-21
-2.0789609478377713e-09
-31
-1.0999570863887107
-12
-0.3165043686247876
-22
--3.880600751848817e-07
-32
--0.029987258687029512
-13
-0.3165043686247876
-23
--3.880600751848817e-07
-33
--0.029987258687029512
-70
-1
- 0
-3DFACE
- 8
-finger metacarpal
-10
-0.3718950373839425
-20
-2.0789609478377713e-09
-30
-1.0999570863887107
-11
-0.3056620680579174
-21
-0.08235584134020102
-31
--0.029987258687029512
-12
-0.3591904613034176
-22
-0.09669866074029804
-32
-1.1017425981156106
-13
-0.3591904613034176
-23
-0.09669866074029804
-33
-1.1017425981156106
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.296250080065389
-20
-0.05625570433824323
-30
-0.6644157568117056
-11
-0.2555856897176694
-21
-0.0770228110613641
-31
-0.7375987435993245
-12
-0.25907879909916354
-22
-0.0425646293072397
-32
-0.7311194193909711
-13
-0.25907879909916354
-23
-0.0425646293072397
-33
-0.7311194193909711
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2555856897176694
-20
-0.0770228110613641
-30
-0.7375987435993245
-11
-0.296250080065389
-21
-0.05625570433824323
-31
-0.6644157568117056
-12
-0.2902821751225073
-22
-0.10111068285304725
-32
-0.67540282766255
-13
-0.2902821751225073
-23
-0.10111068285304725
-33
-0.67540282766255
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.296250080065389
-20
-0.05625570433824323
-30
-0.6644157568117056
-11
-0.26337177035066883
-21
-0.00021611756771083845
-31
-0.7232330781817133
-12
-0.30144711598939
-22
-1.3877787807814457e-15
-32
-0.6548478762140961
-13
-0.30144711598939
-23
-1.3877787807814457e-15
-33
-0.6548478762140961
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.26337177035066883
-20
-0.00021611756771083845
-30
-0.7232330781817133
-11
-0.296250080065389
-21
-0.05625570433824323
-31
-0.6644157568117056
-12
-0.25907879909916354
-22
-0.0425646293072397
-32
-0.7311194193909711
-13
-0.25907879909916354
-23
-0.0425646293072397
-33
-0.7311194193909711
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.08597126774640101
-20
-0.305931990758305
-30
-1.1950892539563733
-11
-0.14591265330279257
-21
-0.30907788121177326
-31
-1.1068841952682413
-12
-0.09248182231156576
-22
-0.34122279747238193
-32
-1.1068841952682413
-13
-0.09248182231156576
-23
-0.34122279747238193
-33
-1.1068841952682413
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.30907788121177326
-30
-1.1068841952682413
-11
-0.08597126774640101
-21
-0.305931990758305
-31
-1.1950892539563733
-12
-0.14591265330279257
-22
-0.2927773222601686
-32
-1.1435553817691761
-13
-0.14591265330279257
-23
-0.2927773222601686
-33
-1.1435553817691761
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.2927773222601686
-30
-1.1435553817691761
-11
-0.08597126774640101
-21
-0.305931990758305
-31
-1.1950892539563733
-12
-0.13856428289474443
-22
-0.2742911190654399
-32
-1.1950892539563733
-13
-0.13856428289474443
-23
-0.2742911190654399
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17315837194884964
-20
-0.31485375811798544
-30
-0.8910308472281347
-11
-0.16483919203682462
-21
-0.3090020498238778
-31
-0.9060890011061947
-12
-0.17165022633163995
-22
-0.2974743709819362
-32
-0.8934201589578008
-13
-0.17165022633163995
-23
-0.2974743709819362
-33
-0.8934201589578008
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.16483919203682462
-20
-0.3090020498238778
-30
-0.9060890011061947
-11
-0.1624333997344558
-21
-0.32322972405982175
-31
-0.9107758047501918
-12
-0.16148066621521584
-22
-0.30464032797763685
-32
-0.9121263906088999
-13
-0.16148066621521584
-23
-0.30464032797763685
-33
-0.9121263906088999
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1624333997344558
-20
-0.32322972405982175
-30
-0.9107758047501918
-11
-0.16483919203682462
-21
-0.3090020498238778
-31
-0.9060890011061947
-12
-0.17315837194884964
-22
-0.31485375811798544
-32
-0.8910308472281347
-13
-0.17315837194884964
-23
-0.31485375811798544
-33
-0.8910308472281347
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.18260248174312899
-20
-0.22232457698922659
-30
-1.198099275585573
-11
-0.11855648811852992
-21
-0.22395776089577168
-31
-1.2708326549933064
-12
-0.15543163413708405
-22
-0.1828607460436268
-32
-1.2708326549933064
-13
-0.15543163413708405
-23
-0.1828607460436268
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.11855648811852992
-20
-0.22395776089577168
-30
-1.2708326549933064
-11
-0.18260248174312899
-21
-0.22232457698922659
-31
-1.198099275585573
-12
-0.17760884479078798
-22
-0.2307763099490301
-32
-1.1950892539563756
-13
-0.17760884479078798
-23
-0.2307763099490301
-33
-1.1950892539563756
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.11855648811852992
-20
-0.22395776089577168
-30
-1.2708326549933064
-11
-0.17760884479078798
-21
-0.2307763099490301
-31
-1.1950892539563756
-12
-0.13856428289474443
-22
-0.2742911190654399
-32
-1.1950892539563733
-13
-0.13856428289474443
-23
-0.2742911190654399
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21079763456608602
-20
-0.15200255171741062
-30
-1.2116649767211727
-11
-0.15543163413708405
-21
-0.1828607460436268
-31
-1.2708326549933064
-12
-0.18372692886278563
-22
-0.12930207354027978
-32
-1.2708326549933064
-13
-0.18372692886278563
-23
-0.12930207354027978
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.15543163413708405
-20
-0.1828607460436268
-30
-1.2708326549933064
-11
-0.21079763456608602
-21
-0.15200255171741062
-31
-1.2116649767211727
-12
-0.19513291276861866
-22
-0.20111681641123347
-32
-1.1960904299564608
-13
-0.19513291276861866
-23
-0.20111681641123347
-33
-1.1960904299564608
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.15543163413708405
-20
-0.1828607460436268
-30
-1.2708326549933064
-11
-0.19513291276861866
-21
-0.20111681641123347
-31
-1.1960904299564608
-12
-0.18260248174312899
-22
-0.22232457698922659
-32
-1.198099275585573
-13
-0.18260248174312899
-23
-0.22232457698922659
-33
-1.198099275585573
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.22483831324751347
-20
-0.1079802180841335
-30
-1.3469345417672878
-11
-0.22607406136431274
-21
-0.10410572475522972
-31
-1.2088129668204062
-12
-0.22607406136431385
-22
-0.1041057247552285
-32
-1.347444628490924
-13
-0.22607406136431385
-23
-0.1041057247552285
-33
-1.347444628490924
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.22607406136431274
-20
-0.10410572475522972
-30
-1.2088129668204062
-11
-0.22483831324751347
-21
-0.1079802180841335
-31
-1.3469345417672878
-12
-0.21079763456608602
-22
-0.15200255171741062
-32
-1.2116649767211727
-13
-0.21079763456608602
-23
-0.15200255171741062
-33
-1.2116649767211727
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21079763456608602
-20
-0.15200255171741062
-30
-1.2116649767211727
-11
-0.22483831324751347
-21
-0.1079802180841335
-31
-1.3469345417672878
-12
-0.19513291276861866
-22
-0.20111681641123635
-32
-1.3083560995869057
-13
-0.19513291276861866
-23
-0.20111681641123635
-33
-1.3083560995869057
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21079763456608602
-20
-0.15200255171741062
-30
-1.2116649767211727
-11
-0.19513291276861866
-21
-0.20111681641123635
-31
-1.3083560995869057
-12
-0.19513291276861866
-22
-0.20111681641123347
-32
-1.1960904299564608
-13
-0.19513291276861866
-23
-0.20111681641123347
-33
-1.1960904299564608
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.26337177035066883
-20
-0.00021611756771083845
-30
-0.7232330781817133
-11
-0.263393678712192
-21
-1.9984014443252818e-15
-31
-1.3611504071680836
-12
-0.263393678712192
-22
-6.106226635438361e-16
-32
-0.7231946266820767
-13
-0.263393678712192
-23
-6.106226635438361e-16
-33
-0.7231946266820767
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.263393678712192
-20
-1.9984014443252818e-15
-30
-1.3611504071680836
-11
-0.26337177035066883
-21
-0.00021611756771083845
-31
-0.7232330781817133
-12
-0.2524474623535692
-22
-0.10798021808412805
-32
-1.3469345417672878
-13
-0.2524474623535692
-23
-0.10798021808412805
-33
-1.3469345417672878
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2524474623535692
-20
-0.10798021808412805
-30
-1.3469345417672878
-11
-0.26337177035066883
-21
-0.00021611756771083845
-31
-0.7232330781817133
-12
-0.25907879909916354
-22
-0.0425646293072397
-32
-0.7311194193909711
-13
-0.25907879909916354
-23
-0.0425646293072397
-33
-0.7311194193909711
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2524474623535692
-20
-0.10798021808412805
-30
-1.3469345417672878
-11
-0.25907879909916354
-21
-0.0425646293072397
-31
-0.7311194193909711
-12
-0.2555856897176694
-22
-0.0770228110613641
-32
-0.7375987435993245
-13
-0.2555856897176694
-23
-0.0770228110613641
-33
-0.7375987435993245
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2524474623535692
-20
-0.10798021808412805
-30
-1.3469345417672878
-11
-0.2555856897176694
-21
-0.0770228110613641
-31
-0.7375987435993245
-12
-0.25192819408071887
-22
-0.11310260005700445
-32
-0.7446065308916078
-13
-0.25192819408071887
-23
-0.11310260005700445
-33
-0.7446065308916078
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2524474623535692
-20
-0.10798021808412805
-30
-1.3469345417672878
-11
-0.25192819408071887
-21
-0.11310260005700445
-31
-0.7446065308916078
-12
-0.25192819408071765
-22
-0.11310260005700845
-32
-1.3448127816824647
-13
-0.25192819408071765
-23
-0.11310260005700845
-33
-1.3448127816824647
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.274037280744151
-20
-0.15716672872113313
-30
-0.7053101078903244
-11
-0.23789809216172886
-21
-0.15709177191973378
-31
-0.7705295873705995
-12
-0.2480027252213851
-22
-0.12541028857502534
-32
-0.7518189517863902
-13
-0.2480027252213851
-23
-0.12541028857502534
-33
-0.7518189517863902
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.23789809216172886
-20
-0.15709177191973378
-30
-0.7705295873705995
-11
-0.274037280744151
-21
-0.15716672872113313
-31
-0.7053101078903244
-12
-0.2591667482690694
-22
-0.19321003684080962
-32
-0.7326871515023154
-13
-0.2591667482690694
-23
-0.19321003684080962
-33
-0.7326871515023154
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2591667482690694
-20
-0.19321003684080962
-30
-0.7326871515023154
-11
-0.21954103663658775
-21
-0.21464742440548745
-31
-0.8047207977789652
-12
-0.23789809216172886
-22
-0.15709177191973378
-32
-0.7705295873705995
-13
-0.23789809216172886
-23
-0.15709177191973378
-33
-0.7705295873705995
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21954103663658775
-20
-0.21464742440548745
-30
-0.8047207977789652
-11
-0.2591667482690694
-21
-0.19321003684080962
-31
-0.7326871515023154
-12
-0.23066726183653696
-22
-0.24695009092044307
-32
-0.7851554598356051
-13
-0.23066726183653696
-23
-0.24695009092044307
-33
-0.7851554598356051
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.214135315851808
-20
-0.2688995990817393
-30
-0.8155912096632217
-11
-0.17165022633163995
-21
-0.2974743709819362
-31
-0.8934201589578008
-12
-0.20642658047224793
-22
-0.2386153747599219
-32
-0.8289927497633759
-13
-0.20642658047224793
-23
-0.2386153747599219
-33
-0.8289927497633759
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17165022633163995
-20
-0.2974743709819362
-30
-0.8934201589578008
-11
-0.214135315851808
-21
-0.2688995990817393
-31
-0.8155912096632217
-12
-0.17315837194884964
-22
-0.31485375811798544
-32
-0.8910308472281347
-13
-0.17315837194884964
-23
-0.31485375811798544
-33
-0.8910308472281347
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.22876729304572974
-20
-0.07753802914401464
-30
-1.217426749765848
-11
-0.18372692886278563
-21
-0.12930207354027978
-31
-1.2708326549933064
-12
-0.20151409472026383
-22
-0.06693167840694275
-32
-1.2708326549933064
-13
-0.20151409472026383
-23
-0.06693167840694275
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.18372692886278563
-20
-0.12930207354027978
-30
-1.2708326549933064
-11
-0.22876729304572974
-21
-0.07753802914401464
-31
-1.217426749765848
-12
-0.22607406136431274
-22
-0.10410572475522972
-32
-1.2088129668204062
-13
-0.22607406136431274
-23
-0.10410572475522972
-33
-1.2088129668204062
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.18372692886278563
-20
-0.12930207354027978
-30
-1.2708326549933064
-11
-0.22607406136431274
-21
-0.10410572475522972
-31
-1.2088129668204062
-12
-0.21079763456608602
-22
-0.15200255171741062
-32
-1.2116649767211727
-13
-0.21079763456608602
-23
-0.15200255171741062
-33
-1.2116649767211727
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.22876729304572974
-20
-0.07753802914401464
-30
-1.217426749765848
-11
-0.20758096575101137
-21
-2.7755575615628914e-16
-31
-1.2708326549933064
-12
-0.23662751094573675
-22
--2.7755575615628914e-16
-32
-1.2158519800606344
-13
-0.23662751094573675
-23
--2.7755575615628914e-16
-33
-1.2158519800606344
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.20758096575101137
-20
-2.7755575615628914e-16
-30
-1.2708326549933064
-11
-0.22876729304572974
-21
-0.07753802914401464
-31
-1.217426749765848
-12
-0.20151409472026383
-22
-0.06693167840694275
-32
-1.2708326549933064
-13
-0.20151409472026383
-23
-0.06693167840694275
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.23662751094573675
-20
-1.8318679906315083e-15
-30
-1.3611504071680836
-11
-0.22876729304572974
-21
-0.07753802914401464
-31
-1.217426749765848
-12
-0.23662751094573675
-22
--2.7755575615628914e-16
-32
-1.2158519800606344
-13
-0.23662751094573675
-23
--2.7755575615628914e-16
-33
-1.2158519800606344
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.22876729304572974
-20
-0.07753802914401464
-30
-1.217426749765848
-11
-0.23662751094573675
-21
-1.8318679906315083e-15
-31
-1.3611504071680836
-12
-0.22607406136431385
-22
-0.1041057247552285
-32
-1.347444628490924
-13
-0.22607406136431385
-23
-0.1041057247552285
-33
-1.347444628490924
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.22876729304572974
-20
-0.07753802914401464
-30
-1.217426749765848
-11
-0.22607406136431385
-21
-0.1041057247552285
-31
-1.347444628490924
-12
-0.22607406136431274
-22
-0.10410572475522972
-32
-1.2088129668204062
-13
-0.22607406136431274
-23
-0.10410572475522972
-33
-1.2088129668204062
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.26337177035066883
-20
-0.00021611756771083845
-30
-0.7232330781817133
-11
-0.263393678712192
-21
-6.106226635438361e-16
-31
-0.7231946266820767
-12
-0.30144711598939
-22
-1.3877787807814457e-15
-32
-0.6548478762140961
-13
-0.30144711598939
-23
-1.3877787807814457e-15
-33
-0.6548478762140961
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.296250080065389
-20
-0.05625570433824323
-30
-0.6644157568117056
-11
-0.30144711598939
-21
-1.3877787807814457e-15
-31
-0.6548478762140961
-12
-0.42920423721993983
-22
-2.7755575615628914e-15
-32
-0.0
-13
-0.42920423721993983
-23
-2.7755575615628914e-15
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21831309401632604
-20
-0.21849744483100497
-30
-1.2976625093750926
-11
-0.1907104937441224
-21
-0.2086017627515685
-31
-1.3052557332991035
-12
-0.19513291276861866
-22
-0.20111681641123635
-32
-1.3083560995869057
-13
-0.19513291276861866
-23
-0.20111681641123635
-33
-1.3083560995869057
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09327307500958115
-20
-0.34551182473544184
-30
-1.0731565574038182
-11
-0.14591265330279257
-21
-0.3224508871153656
-31
-1.0122285079127469
-12
-0.1060148804133424
-22
-0.3464540804912427
-32
-1.0122285079127469
-13
-0.1060148804133424
-23
-0.3464540804912427
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.3224508871153656
-30
-1.0122285079127469
-11
-0.09327307500958115
-21
-0.34551182473544184
-31
-1.0731565574038182
-12
-0.14591265330279257
-22
-0.30907788121177326
-32
-1.1068841952682413
-13
-0.14591265330279257
-23
-0.30907788121177326
-33
-1.1068841952682413
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.30907788121177326
-30
-1.1068841952682413
-11
-0.09327307500958115
-21
-0.34551182473544184
-31
-1.0731565574038182
-12
-0.09248182231156576
-22
-0.34122279747238193
-32
-1.1068841952682413
-13
-0.09248182231156576
-23
-0.34122279747238193
-33
-1.1068841952682413
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21831309401632715
-20
-0.21849744483100653
-30
-0.8070247740079369
-11
-0.17310779103353768
-21
-0.29500744201820384
-31
-1.2389543236831635
-12
-0.21831309401632604
-22
-0.21849744483100497
-32
-1.2976625093750926
-13
-0.21831309401632604
-23
-0.21849744483100497
-33
-1.2976625093750926
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17310779103353768
-20
-0.29500744201820384
-30
-1.2389543236831635
-11
-0.21831309401632715
-21
-0.21849744483100653
-31
-0.8070247740079369
-12
-0.20642658047224793
-22
-0.2386153747599219
-32
-0.8289927497633759
-13
-0.20642658047224793
-23
-0.2386153747599219
-33
-0.8289927497633759
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17310779103353768
-20
-0.29500744201820384
-30
-1.2389543236831635
-11
-0.20642658047224793
-21
-0.2386153747599219
-31
-0.8289927497633759
-12
-0.17165022633163995
-22
-0.2974743709819362
-32
-0.8934201589578008
-13
-0.17165022633163995
-23
-0.2974743709819362
-33
-0.8934201589578008
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17310779103353768
-20
-0.29500744201820384
-30
-1.2389543236831635
-11
-0.17165022633163995
-21
-0.2974743709819362
-31
-0.8934201589578008
-12
-0.1648391920368235
-22
-0.309002049823879
-32
-1.2207161957078443
-13
-0.1648391920368235
-23
-0.309002049823879
-33
-1.2207161957078443
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1648391920368235
-20
-0.309002049823879
-30
-1.2207161957078443
-11
-0.17165022633163995
-21
-0.2974743709819362
-31
-0.8934201589578008
-12
-0.16483919203682462
-22
-0.3090020498238778
-32
-0.9060890011061947
-13
-0.16483919203682462
-23
-0.3090020498238778
-33
-0.9060890011061947
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305396
-30
-1.0876716112414513
-11
-0.14591265330279257
-21
-0.2927773222601686
-31
-1.1435553817691761
-12
-0.14591265330279146
-22
-0.28442212939005906
-32
-1.159696374922908
-13
-0.14591265330279146
-23
-0.28442212939005906
-33
-1.159696374922908
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.2927773222601686
-30
-1.1435553817691761
-11
-0.14628261733798686
-21
-0.28490260216305396
-31
-1.0876716112414513
-12
-0.14591265330279257
-22
-0.30907788121177326
-32
-1.1068841952682413
-13
-0.14591265330279257
-23
-0.30907788121177326
-33
-1.1068841952682413
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2480027252213851
-20
-0.12541028857502534
-30
-0.7518189517863902
-11
-0.25192819408071765
-21
-0.11310260005700845
-31
-1.3448127816824647
-12
-0.25192819408071887
-22
-0.11310260005700445
-32
-0.7446065308916078
-13
-0.25192819408071887
-23
-0.11310260005700445
-33
-0.7446065308916078
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.25192819408071765
-20
-0.11310260005700845
-30
-1.3448127816824647
-11
-0.2480027252213851
-21
-0.12541028857502534
-31
-0.7518189517863902
-12
-0.21831309401632604
-22
-0.21849744483100497
-32
-1.2976625093750926
-13
-0.21831309401632604
-23
-0.21849744483100497
-33
-1.2976625093750926
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21831309401632604
-20
-0.21849744483100497
-30
-1.2976625093750926
-11
-0.2480027252213851
-21
-0.12541028857502534
-31
-0.7518189517863902
-12
-0.23789809216172886
-22
-0.15709177191973378
-32
-0.7705295873705995
-13
-0.23789809216172886
-23
-0.15709177191973378
-33
-0.7705295873705995
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21831309401632604
-20
-0.21849744483100497
-30
-1.2976625093750926
-11
-0.23789809216172886
-21
-0.15709177191973378
-31
-0.7705295873705995
-12
-0.21954103663658775
-22
-0.21464742440548745
-32
-0.8047207977789652
-13
-0.21954103663658775
-23
-0.21464742440548745
-33
-0.8047207977789652
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21831309401632604
-20
-0.21849744483100497
-30
-1.2976625093750926
-11
-0.21954103663658775
-21
-0.21464742440548745
-31
-0.8047207977789652
-12
-0.21831309401632715
-22
-0.21849744483100653
-32
-0.8070247740079369
-13
-0.21831309401632715
-23
-0.21849744483100653
-33
-0.8070247740079369
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.23662751094573675
-20
-1.8318679906315083e-15
-30
-1.3611504071680836
-11
-0.2524474623535692
-21
-0.10798021808412805
-31
-1.3469345417672878
-12
-0.22607406136431385
-22
-0.1041057247552285
-32
-1.347444628490924
-13
-0.22607406136431385
-23
-0.1041057247552285
-33
-1.347444628490924
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2524474623535692
-20
-0.10798021808412805
-30
-1.3469345417672878
-11
-0.23662751094573675
-21
-1.8318679906315083e-15
-31
-1.3611504071680836
-12
-0.263393678712192
-22
-1.9984014443252818e-15
-32
-1.3611504071680836
-13
-0.263393678712192
-23
-1.9984014443252818e-15
-33
-1.3611504071680836
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2902821751225073
-20
-0.10111068285304725
-30
-0.67540282766255
-11
-0.25192819408071887
-21
-0.11310260005700445
-31
-0.7446065308916078
-12
-0.2555856897176694
-22
-0.0770228110613641
-32
-0.7375987435993245
-13
-0.2555856897176694
-23
-0.0770228110613641
-33
-0.7375987435993245
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.25192819408071887
-20
-0.11310260005700445
-30
-0.7446065308916078
-11
-0.2902821751225073
-21
-0.10111068285304725
-31
-0.67540282766255
-12
-0.274037280744151
-22
-0.15716672872113313
-32
-0.7053101078903244
-13
-0.274037280744151
-23
-0.15716672872113313
-33
-0.7053101078903244
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.25192819408071887
-20
-0.11310260005700445
-30
-0.7446065308916078
-11
-0.274037280744151
-21
-0.15716672872113313
-31
-0.7053101078903244
-12
-0.2480027252213851
-22
-0.12541028857502534
-32
-0.7518189517863902
-13
-0.2480027252213851
-23
-0.12541028857502534
-33
-0.7518189517863902
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.25192819408071765
-20
-0.11310260005700845
-30
-1.3448127816824647
-11
-0.19513291276861866
-21
-0.20111681641123635
-31
-1.3083560995869057
-12
-0.22483831324751347
-22
-0.1079802180841335
-32
-1.3469345417672878
-13
-0.22483831324751347
-23
-0.1079802180841335
-33
-1.3469345417672878
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.19513291276861866
-20
-0.20111681641123635
-30
-1.3083560995869057
-11
-0.18260248174312899
-21
-0.22232457698922659
-31
-1.198099275585573
-12
-0.19513291276861866
-22
-0.20111681641123347
-32
-1.1960904299564608
-13
-0.19513291276861866
-23
-0.20111681641123347
-33
-1.1960904299564608
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.18260248174312899
-20
-0.22232457698922659
-30
-1.198099275585573
-11
-0.19513291276861866
-21
-0.20111681641123635
-31
-1.3083560995869057
-12
-0.1907104937441224
-22
-0.2086017627515685
-32
-1.3052557332991035
-13
-0.1907104937441224
-23
-0.2086017627515685
-33
-1.3052557332991035
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.18260248174312899
-20
-0.22232457698922659
-30
-1.198099275585573
-11
-0.1907104937441224
-21
-0.2086017627515685
-31
-1.3052557332991035
-12
-0.17760884479078798
-22
-0.2307763099490301
-32
-1.1950892539563756
-13
-0.17760884479078798
-23
-0.2307763099490301
-33
-1.1950892539563756
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1907104937441224
-20
-0.2086017627515685
-30
-1.3052557332991035
-11
-0.15406334402645439
-21
-0.2950074420182055
-31
-1.238954323683159
-12
-0.14628261733798686
-22
-0.28490260216305374
-32
-1.2467080400132249
-13
-0.14628261733798686
-23
-0.28490260216305374
-33
-1.2467080400132249
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.15406334402645439
-20
-0.2950074420182055
-30
-1.238954323683159
-11
-0.1907104937441224
-21
-0.2086017627515685
-31
-1.3052557332991035
-12
-0.17310779103353768
-22
-0.29500744201820384
-32
-1.2389543236831635
-13
-0.17310779103353768
-23
-0.29500744201820384
-33
-1.2389543236831635
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17310779103353768
-20
-0.29500744201820384
-30
-1.2389543236831635
-11
-0.1907104937441224
-21
-0.2086017627515685
-31
-1.3052557332991035
-12
-0.21831309401632604
-22
-0.21849744483100497
-32
-1.2976625093750926
-13
-0.21831309401632604
-23
-0.21849744483100497
-33
-1.2976625093750926
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.2524474623535692
-20
-0.10798021808412805
-30
-1.3469345417672878
-11
-0.25192819408071765
-21
-0.11310260005700845
-31
-1.3448127816824647
-12
-0.22607406136431385
-22
-0.1041057247552285
-32
-1.347444628490924
-13
-0.22607406136431385
-23
-0.1041057247552285
-33
-1.347444628490924
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.23066726183653696
-20
-0.24695009092044307
-30
-0.7851554598356051
-11
-0.2591667482690694
-21
-0.19321003684080962
-31
-0.7326871515023154
-12
-0.37170177284439176
-22
-0.21460211860997003
-32
-0.0
-13
-0.37170177284439176
-23
-0.21460211860997003
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.25192819408071765
-20
-0.11310260005700845
-30
-1.3448127816824647
-11
-0.22483831324751347
-21
-0.1079802180841335
-31
-1.3469345417672878
-12
-0.22607406136431385
-22
-0.1041057247552285
-32
-1.347444628490924
-13
-0.22607406136431385
-23
-0.1041057247552285
-33
-1.347444628490924
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.274037280744151
-20
-0.15716672872113313
-30
-0.7053101078903244
-11
-0.2902821751225073
-21
-0.10111068285304725
-31
-0.67540282766255
-12
-0.41457945748344094
-22
-0.11108623083122104
-32
-0.0
-13
-0.41457945748344094
-23
-0.11108623083122104
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.0862196570520593
-20
-0.3424202262257874
-30
-1.1068841952682413
-11
-0.09327307500958115
-21
-0.34551182473544184
-31
-1.0731565574038182
-12
-1.7763568394002505e-15
-22
-0.3532598344360507
-32
-1.1068841952682391
-13
-1.7763568394002505e-15
-23
-0.3532598344360507
-33
-1.1068841952682391
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.3532598344360507
-30
-1.1068841952682391
-11
-0.09327307500958115
-21
-0.34551182473544184
-31
-1.0731565574038182
-12
-0.09465568735549401
-22
-0.353259834436051
-32
-1.0122285079127469
-13
-0.09465568735549401
-23
-0.353259834436051
-33
-1.0122285079127469
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.3532598344360507
-30
-1.1068841952682391
-11
-0.09465568735549401
-21
-0.353259834436051
-31
-1.0122285079127469
-12
-1.7763568394002505e-15
-22
-0.365721492087253
-32
-1.0122285079127469
-13
-1.7763568394002505e-15
-23
-0.365721492087253
-33
-1.0122285079127469
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.25192819408071765
-20
-0.11310260005700845
-30
-1.3448127816824647
-11
-0.21831309401632604
-21
-0.21849744483100497
-31
-1.2976625093750926
-12
-0.19513291276861866
-22
-0.20111681641123635
-32
-1.3083560995869057
-13
-0.19513291276861866
-23
-0.20111681641123635
-33
-1.3083560995869057
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17310779103353768
-20
-0.29500744201820384
-30
-1.2389543236831635
-11
-0.1648391920368235
-21
-0.309002049823879
-31
-1.2207161957078443
-12
-0.15406334402645439
-22
-0.2950074420182055
-32
-1.238954323683159
-13
-0.15406334402645439
-23
-0.2950074420182055
-33
-1.238954323683159
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.17315837194884964
-20
-0.31485375811798544
-30
-0.8910308472281347
-11
-0.214135315851808
-21
-0.2688995990817393
-31
-0.8155912096632217
-12
-0.30349322665222
-22
-0.303493226652219
-32
-0.0
-13
-0.30349322665222
-23
-0.303493226652219
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1060148804133424
-20
-0.3464540804912427
-30
-1.0122285079127469
-11
-0.21460211860997136
-21
-0.3717017728443903
-31
-0.0
-12
-0.1110862308312226
-22
-0.4145794574834395
-32
-0.0
-13
-0.1110862308312226
-23
-0.4145794574834395
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.051933324443145024
-20
-0.25432064826909484
-30
-1.270832654993302
-11
-1.7763568394002505e-15
-21
-0.25860414708055923
-31
-1.2708326549933042
-12
-0.03977877210196379
-22
-0.18090139708368969
-32
-1.3289526107702627
-13
-0.03977877210196379
-23
-0.18090139708368969
-33
-1.3289526107702627
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06777344544969494
-20
-0.30941171298926207
-30
-1.1950892539563756
-11
-0.0862196570520593
-21
-0.3424202262257874
-31
-1.1068841952682413
-12
-1.7763568394002505e-15
-22
-0.31672410285751074
-32
-1.1950892539563733
-13
-1.7763568394002505e-15
-23
-0.31672410285751074
-33
-1.1950892539563733
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.03977877210196379
-20
-0.18090139708368969
-30
-1.3289526107702627
-11
-1.7763568394002505e-15
-21
-0.182860746043627
-31
-1.328952610770256
-12
-0.03213810108186088
-22
-0.09415736007026898
-32
-1.3654883423488011
-13
-0.03213810108186088
-23
-0.09415736007026898
-33
-1.3654883423488011
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.3305275449199734
-30
-0.9357778285299473
-11
-0.14628261733798686
-21
-0.2849026021630544
-31
-0.9336709982866838
-12
-0.14628261733798686
-22
-0.3305275449199734
-32
-0.9336709982866838
-13
-0.14628261733798686
-23
-0.3305275449199734
-33
-0.9336709982866838
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.25860414708055923
-30
-1.2708326549933042
-11
-0.06777344544969494
-21
-0.30941171298926207
-31
-1.1950892539563756
-12
-1.7763568394002505e-15
-22
-0.31672410285751074
-32
-1.1950892539563733
-13
-1.7763568394002505e-15
-23
-0.31672410285751074
-33
-1.1950892539563733
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.25860414708055923
-30
-1.2708326549933042
-11
-0.051933324443145024
-21
-0.25432064826909484
-31
-1.270832654993302
-12
-0.06777344544969494
-22
-0.30941171298926207
-32
-1.1950892539563756
-13
-0.06777344544969494
-23
-0.30941171298926207
-33
-1.1950892539563756
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.03977877210196379
-20
-0.18090139708368969
-30
-1.3289526107702627
-11
-1.7763568394002505e-15
-21
-0.25860414708055923
-31
-1.2708326549933042
-12
-1.7763568394002505e-15
-22
-0.182860746043627
-32
-1.328952610770256
-13
-1.7763568394002505e-15
-23
-0.182860746043627
-33
-1.328952610770256
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.03213810108186088
-20
-0.09415736007026898
-30
-1.3654883423488011
-11
-1.7763568394002505e-15
-21
-0.182860746043627
-31
-1.328952610770256
-12
-1.7763568394002505e-15
-22
-0.09465568735549279
-32
-1.3654883423487965
-13
-1.7763568394002505e-15
-23
-0.09465568735549279
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.31672410285751074
-30
-1.1950892539563733
-11
-0.0862196570520593
-21
-0.3424202262257874
-31
-1.1068841952682413
-12
-1.7763568394002505e-15
-22
-0.3532598344360507
-32
-1.1068841952682391
-13
-1.7763568394002505e-15
-23
-0.3532598344360507
-33
-1.1068841952682391
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.20151409472026383
-20
-0.06693167840694275
-30
-1.2708326549933064
-11
-0.13856428289474554
-21
-0.09143037302181356
-31
-1.3289526107702583
-12
-0.15114170849065778
-22
-0.04732784367774656
-32
-1.3289526107702583
-13
-0.15114170849065778
-23
-0.04732784367774656
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.13856428289474554
-20
-0.09143037302181356
-30
-1.3289526107702583
-11
-0.20151409472026383
-21
-0.06693167840694275
-31
-1.2708326549933064
-12
-0.18372692886278563
-22
-0.12930207354027978
-32
-1.2708326549933064
-13
-0.18372692886278563
-23
-0.12930207354027978
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.029532010486047477
-20
-2.7755575615628914e-16
-30
-1.37795
-11
--0.08197422986253194
-21
-0.047327843677746395
-31
-1.3654883423487965
-12
--0.09143037302181262
-22
-0.024498694614871808
-32
-1.3654883423487965
-13
--0.09143037302181262
-23
-0.024498694614871808
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.08597126774640212
-20
-0.04732784367774656
-30
-1.3654883423487987
-11
-0.11855648811852992
-21
-0.12930207354027978
-31
-1.3289526107702583
-12
-0.07561447106922731
-22
-0.06693167840694275
-32
-1.3654883423487987
-13
-0.07561447106922731
-23
-0.06693167840694275
-33
-1.3654883423487987
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.11855648811852992
-20
-0.12930207354027978
-30
-1.3289526107702583
-11
-0.08597126774640212
-21
-0.04732784367774656
-31
-1.3654883423487987
-12
-0.13856428289474554
-22
-0.09143037302181356
-32
-1.3289526107702583
-13
-0.13856428289474554
-23
-0.09143037302181356
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.13856428289474554
-20
-0.09143037302181356
-30
-1.3289526107702583
-11
-0.15543163413708405
-21
-0.1828607460436268
-31
-1.2708326549933064
-12
-0.11855648811852992
-22
-0.12930207354027978
-32
-1.3289526107702583
-13
-0.11855648811852992
-23
-0.12930207354027978
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.15543163413708405
-20
-0.1828607460436268
-30
-1.2708326549933064
-11
-0.13856428289474554
-21
-0.09143037302181356
-31
-1.3289526107702583
-12
-0.18372692886278563
-22
-0.12930207354027978
-32
-1.2708326549933064
-13
-0.18372692886278563
-23
-0.12930207354027978
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.08597126774640212
-20
-0.04732784367774656
-30
-1.3654883423487987
-11
-0.07561447106922731
-21
-0.06693167840694275
-31
-1.3654883423487987
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.07561447106922731
-20
-0.06693167840694275
-30
-1.3654883423487987
-11
-0.06211723085817539
-21
-0.08197422986253433
-31
-1.3654883423487987
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.07561447106922731
-20
-0.06693167840694275
-30
-1.3654883423487987
-11
-0.09248182231156576
-21
-0.1583620514287558
-31
-1.3289526107702583
-12
-0.06211723085817539
-22
-0.08197422986253433
-32
-1.3654883423487987
-13
-0.06211723085817539
-23
-0.08197422986253433
-33
-1.3654883423487987
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09248182231156576
-20
-0.1583620514287558
-30
-1.3289526107702583
-11
-0.07561447106922731
-21
-0.06693167840694275
-31
-1.3654883423487987
-12
-0.11855648811852992
-22
-0.12930207354027978
-32
-1.3289526107702583
-13
-0.11855648811852992
-23
-0.12930207354027978
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09470245123030319
-20
-3.885780586188048e-16
-30
-1.3654883423487987
-11
-0.09248182231156576
-21
-0.024498694614871863
-31
-1.3654883423487987
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.11855648811852992
-20
-0.12930207354027978
-30
-1.3289526107702583
-11
-0.11855648811852992
-21
-0.22395776089577168
-31
-1.2708326549933064
-12
-0.09248182231156576
-22
-0.1583620514287558
-32
-1.3289526107702583
-13
-0.09248182231156576
-23
-0.1583620514287558
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.11855648811852992
-20
-0.22395776089577168
-30
-1.2708326549933064
-11
-0.11855648811852992
-21
-0.12930207354027978
-31
-1.3289526107702583
-12
-0.15543163413708405
-22
-0.1828607460436268
-32
-1.2708326549933064
-13
-0.15543163413708405
-23
-0.1828607460436268
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.2927773222601686
-30
-1.1435553817691761
-11
-0.13856428289474443
-21
-0.2742911190654399
-31
-1.1950892539563733
-12
-0.14591265330279146
-22
-0.28442212939005906
-32
-1.159696374922908
-13
-0.14591265330279146
-23
-0.28442212939005906
-33
-1.159696374922908
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.09143037302181262
-20
-0.024498694614871808
-30
-1.3654883423487965
-11
--0.15836205142875398
-21
-0.09143037302181356
-31
-1.328952610770256
-12
--0.1766299172180231
-22
-0.04732784367774656
-32
-1.328952610770256
-13
--0.1766299172180231
-23
-0.04732784367774656
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.15836205142875398
-20
-0.09143037302181356
-30
-1.328952610770256
-11
--0.09143037302181262
-21
-0.024498694614871808
-31
-1.3654883423487965
-12
--0.08197422986253194
-22
-0.047327843677746395
-32
-1.3654883423487965
-13
--0.08197422986253194
-23
-0.047327843677746395
-33
-1.3654883423487965
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06211723085817539
-20
-0.08197422986253433
-30
-1.3654883423487987
-11
-0.04639936172838599
-21
-0.09143037302181423
-31
-1.3654883423487987
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.15836205142875398
-20
-0.09143037302181356
-30
-1.328952610770256
-11
--0.18286074604362482
-21
-0.18286074604362668
-31
-1.2708326549933042
-12
--0.22395776089577035
-22
-0.12930207354027978
-32
-1.2708326549933042
-13
--0.22395776089577035
-23
-0.12930207354027978
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.18286074604362482
-20
-0.18286074604362668
-30
-1.2708326549933042
-11
--0.15836205142875398
-21
-0.09143037302181356
-31
-1.328952610770256
-12
--0.12930207354027806
-22
-0.12930207354027967
-32
-1.328952610770256
-13
--0.12930207354027806
-23
-0.12930207354027967
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06211723085817539
-20
-0.08197422986253433
-30
-1.3654883423487987
-11
-0.06211723085817539
-21
-0.176629917218026
-31
-1.3289526107702583
-12
-0.04639936172838599
-22
-0.09143037302181423
-32
-1.3654883423487987
-13
-0.04639936172838599
-23
-0.09143037302181423
-33
-1.3654883423487987
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06211723085817539
-20
-0.176629917218026
-30
-1.3289526107702583
-11
-0.06211723085817539
-21
-0.08197422986253433
-31
-1.3654883423487987
-12
-0.09248182231156576
-22
-0.1583620514287558
-32
-1.3289526107702583
-13
-0.09248182231156576
-23
-0.1583620514287558
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1766299172180231
-20
-0.04732784367774656
-30
-1.328952610770256
-11
--0.22395776089577035
-21
-0.12930207354027978
-31
-1.2708326549933042
-12
--0.24979242445056726
-22
-0.06693167840694259
-32
-1.2708326549933042
-13
--0.24979242445056726
-23
-0.06693167840694259
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.22395776089577035
-20
-0.12930207354027978
-30
-1.2708326549933042
-11
--0.1766299172180231
-21
-0.04732784367774656
-31
-1.328952610770256
-12
--0.15836205142875398
-22
-0.09143037302181356
-32
-1.328952610770256
-13
--0.15836205142875398
-23
-0.09143037302181356
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.07561447106922731
-20
-0.24979242445056904
-30
-1.2708326549933064
-11
-0.13856428289474443
-21
-0.2742911190654399
-31
-1.1950892539563733
-12
-0.08597126774640101
-22
-0.305931990758305
-32
-1.1950892539563733
-13
-0.08597126774640101
-23
-0.305931990758305
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.13856428289474443
-20
-0.2742911190654399
-30
-1.1950892539563733
-11
-0.07561447106922731
-21
-0.24979242445056904
-31
-1.2708326549933064
-12
-0.11855648811852992
-22
-0.22395776089577168
-32
-1.2708326549933064
-13
-0.11855648811852992
-23
-0.22395776089577168
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09248182231156576
-20
-0.1583620514287558
-30
-1.3289526107702583
-11
-0.07561447106922731
-21
-0.24979242445056904
-31
-1.2708326549933064
-12
-0.06211723085817539
-22
-0.176629917218026
-32
-1.3289526107702583
-13
-0.06211723085817539
-23
-0.176629917218026
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.07561447106922731
-20
-0.24979242445056904
-30
-1.2708326549933064
-11
-0.09248182231156576
-21
-0.1583620514287558
-31
-1.3289526107702583
-12
-0.11855648811852992
-22
-0.22395776089577168
-32
-1.2708326549933064
-13
-0.11855648811852992
-23
-0.22395776089577168
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.18286074604362482
-20
-0.18286074604362668
-30
-1.2708326549933042
-11
--0.2742911190654381
-21
-0.15836205142875548
-31
-1.1950892539563733
-12
--0.22395776089577035
-22
-0.12930207354027978
-32
-1.2708326549933042
-13
--0.22395776089577035
-23
-0.12930207354027978
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2742911190654381
-20
-0.15836205142875548
-30
-1.1950892539563733
-11
--0.18286074604362482
-21
-0.18286074604362668
-31
-1.2708326549933042
-12
--0.22395776089576924
-22
-0.22395776089577124
-32
-1.1950892539563733
-13
--0.22395776089576924
-23
-0.22395776089577124
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305374
-30
-1.2467080400132249
-11
-0.17760884479078798
-21
-0.2307763099490301
-31
-1.1950892539563756
-12
-0.1907104937441224
-22
-0.2086017627515685
-32
-1.3052557332991035
-13
-0.1907104937441224
-23
-0.2086017627515685
-33
-1.3052557332991035
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09327307500958115
-20
-0.34551182473544184
-30
-1.0731565574038182
-11
-0.1060148804133424
-21
-0.3464540804912427
-31
-1.0122285079127469
-12
-0.09465568735549401
-22
-0.353259834436051
-32
-1.0122285079127469
-13
-0.09465568735549401
-23
-0.353259834436051
-33
-1.0122285079127469
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.22395776089576924
-20
-0.22395776089577124
-30
-1.1950892539563733
-11
--0.3059319907583018
-21
-0.17662991721802546
-31
-1.1068841952682391
-12
--0.2742911190654381
-22
-0.15836205142875548
-32
-1.1950892539563733
-13
--0.2742911190654381
-23
-0.15836205142875548
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3059319907583018
-20
-0.17662991721802546
-30
-1.1068841952682391
-11
--0.22395776089576924
-21
-0.22395776089577124
-31
-1.1950892539563733
-12
--0.24979242445056726
-22
-0.24979242445056848
-32
-1.1068841952682391
-13
--0.24979242445056726
-23
-0.24979242445056848
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.08197422986253194
-20
-0.047327843677746395
-30
-1.3654883423487965
-11
--0.12930207354027806
-21
-0.12930207354027967
-31
-1.328952610770256
-12
--0.15836205142875398
-22
-0.09143037302181356
-32
-1.328952610770256
-13
--0.15836205142875398
-23
-0.09143037302181356
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.12930207354027806
-20
-0.12930207354027967
-30
-1.328952610770256
-11
--0.08197422986253194
-21
-0.047327843677746395
-31
-1.3654883423487965
-12
--0.0669316784069407
-22
-0.06693167840694259
-32
-1.3654883423487965
-13
--0.0669316784069407
-23
-0.06693167840694259
-33
-1.3654883423487965
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.03213810108186088
-20
-0.09415736007026898
-30
-1.3654883423488011
-11
-1.7763568394002505e-15
-21
-0.09465568735549279
-31
-1.3654883423487965
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.029532010486047477
-20
-2.7755575615628914e-16
-30
-1.37795
-11
-1.7763568394002505e-15
-21
-0.09465568735549279
-31
-1.3654883423487965
-12
--0.024498694614870198
-22
-0.09143037302181412
-32
-1.3654883423487965
-13
--0.024498694614870198
-23
-0.09143037302181412
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.22395776089577035
-20
-0.12930207354027978
-30
-1.2708326549933042
-11
--0.3059319907583018
-21
-0.081974229862534
-31
-1.1950892539563733
-12
--0.24979242445056726
-22
-0.06693167840694259
-32
-1.2708326549933042
-13
--0.24979242445056726
-23
-0.06693167840694259
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3059319907583018
-20
-0.081974229862534
-30
-1.1950892539563733
-11
--0.22395776089577035
-21
-0.12930207354027978
-31
-1.2708326549933042
-12
--0.2742911190654381
-22
-0.15836205142875548
-32
-1.1950892539563733
-13
--0.2742911190654381
-23
-0.15836205142875548
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.024498694614870198
-20
-0.09143037302181412
-30
-1.3654883423487965
-11
-1.7763568394002505e-15
-21
-0.182860746043627
-31
-1.328952610770256
-12
--0.04732784367774434
-22
-0.1766299172180259
-32
-1.328952610770256
-13
--0.04732784367774434
-23
-0.1766299172180259
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.182860746043627
-30
-1.328952610770256
-11
--0.024498694614870198
-21
-0.09143037302181412
-31
-1.3654883423487965
-12
-1.7763568394002505e-15
-22
-0.09465568735549279
-32
-1.3654883423487965
-13
-1.7763568394002505e-15
-23
-0.09465568735549279
-33
-1.3654883423487965
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.04732784367774434
-20
-0.1766299172180259
-30
-1.328952610770256
-11
-1.7763568394002505e-15
-21
-0.25860414708055923
-31
-1.2708326549933042
-12
--0.06693167840693953
-22
-0.24979242445056893
-32
-1.2708326549933042
-13
--0.06693167840693953
-23
-0.24979242445056893
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.25860414708055923
-30
-1.2708326549933042
-11
--0.04732784367774434
-21
-0.1766299172180259
-31
-1.328952610770256
-12
-1.7763568394002505e-15
-22
-0.182860746043627
-32
-1.328952610770256
-13
-1.7763568394002505e-15
-23
-0.182860746043627
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.06693167840693953
-20
-0.24979242445056893
-30
-1.2708326549933042
-11
-1.7763568394002505e-15
-21
-0.31672410285751074
-31
-1.1950892539563733
-12
--0.08197422986253078
-22
-0.3059319907583048
-32
-1.1950892539563733
-13
--0.08197422986253078
-23
-0.3059319907583048
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.31672410285751074
-30
-1.1950892539563733
-11
--0.06693167840693953
-21
-0.24979242445056893
-31
-1.2708326549933042
-12
-1.7763568394002505e-15
-22
-0.25860414708055923
-32
-1.2708326549933042
-13
-1.7763568394002505e-15
-23
-0.25860414708055923
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.08197422986253078
-20
-0.3059319907583048
-30
-1.1950892539563733
-11
-1.7763568394002505e-15
-21
-0.3532598344360507
-31
-1.1068841952682391
-12
--0.0914303730218115
-22
-0.3412227974723816
-32
-1.1068841952682391
-13
--0.0914303730218115
-23
-0.3412227974723816
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.3532598344360507
-30
-1.1068841952682391
-11
--0.08197422986253078
-21
-0.3059319907583048
-31
-1.1950892539563733
-12
-1.7763568394002505e-15
-22
-0.31672410285751074
-32
-1.1950892539563733
-13
-1.7763568394002505e-15
-23
-0.31672410285751074
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.0914303730218115
-20
-0.3412227974723816
-30
-1.1068841952682391
-11
-1.7763568394002505e-15
-21
-0.365721492087253
-31
-1.0122285079127469
-12
--0.09465568735549051
-22
-0.3532598344360508
-32
-1.0122285079127469
-13
--0.09465568735549051
-23
-0.3532598344360508
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.365721492087253
-30
-1.0122285079127469
-11
--0.0914303730218115
-21
-0.3412227974723816
-31
-1.1068841952682391
-12
-1.7763568394002505e-15
-22
-0.3532598344360507
-32
-1.1068841952682391
-13
-1.7763568394002505e-15
-23
-0.3532598344360507
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2742911190654381
-20
-0.15836205142875548
-30
-1.1950892539563733
-11
--0.34122279747237944
-21
-0.09143037302181367
-31
-1.1068841952682391
-12
--0.3059319907583018
-22
-0.081974229862534
-32
-1.1950892539563733
-13
--0.3059319907583018
-23
-0.081974229862534
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.34122279747237944
-20
-0.09143037302181367
-30
-1.1068841952682391
-11
--0.2742911190654381
-21
-0.15836205142875548
-31
-1.1950892539563733
-12
--0.3059319907583018
-22
-0.17662991721802546
-32
-1.1068841952682391
-13
--0.3059319907583018
-23
-0.17662991721802546
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09248182231156576
-20
-0.024498694614871863
-30
-1.3654883423487987
-11
-0.08597126774640212
-21
-0.04732784367774656
-31
-1.3654883423487987
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.24979242445056726
-20
-0.24979242445056848
-30
-1.1068841952682391
-11
--0.3167241028575086
-21
-0.18286074604362668
-31
-1.0122285079127469
-12
--0.3059319907583018
-22
-0.17662991721802546
-32
-1.1068841952682391
-13
--0.3059319907583018
-23
-0.17662991721802546
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3167241028575086
-20
-0.18286074604362668
-30
-1.0122285079127469
-11
--0.24979242445056726
-21
-0.24979242445056848
-31
-1.1068841952682391
-12
--0.2586041470805568
-22
-0.2586041470805588
-32
-1.0122285079127469
-13
--0.2586041470805568
-23
-0.2586041470805588
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.15836205142875287
-20
-0.27429111906544
-30
-1.1950892539563733
-11
--0.0914303730218115
-21
-0.3412227974723816
-31
-1.1068841952682391
-12
--0.1766299172180231
-22
-0.305931990758305
-32
-1.1068841952682391
-13
--0.1766299172180231
-23
-0.305931990758305
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.0914303730218115
-20
-0.3412227974723816
-30
-1.1068841952682391
-11
--0.15836205142875287
-21
-0.27429111906544
-31
-1.1950892539563733
-12
--0.08197422986253078
-22
-0.3059319907583048
-32
-1.1950892539563733
-13
--0.08197422986253078
-23
-0.3059319907583048
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1766299172180231
-20
-0.305931990758305
-30
-1.1068841952682391
-11
--0.09465568735549051
-21
-0.3532598344360508
-31
-1.0122285079127469
-12
--0.1828607460436237
-22
-0.31672410285751096
-32
-1.0122285079127469
-13
--0.1828607460436237
-23
-0.31672410285751096
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.09465568735549051
-20
-0.3532598344360508
-30
-1.0122285079127469
-11
--0.1766299172180231
-21
-0.305931990758305
-31
-1.1068841952682391
-12
--0.0914303730218115
-22
-0.3412227974723816
-32
-1.1068841952682391
-13
--0.0914303730218115
-23
-0.3412227974723816
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.029532010486047477
-20
-2.7755575615628914e-16
-30
-1.37795
-11
--0.024498694614870198
-21
-0.09143037302181412
-31
-1.3654883423487965
-12
--0.04732784367774434
-22
-0.08197422986253444
-32
-1.3654883423487965
-13
--0.04732784367774434
-23
-0.08197422986253444
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.04732784367774434
-20
-0.08197422986253444
-30
-1.3654883423487965
-11
--0.04732784367774434
-21
-0.1766299172180259
-31
-1.328952610770256
-12
--0.0914303730218115
-22
-0.15836205142875603
-32
-1.328952610770256
-13
--0.0914303730218115
-23
-0.15836205142875603
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.04732784367774434
-20
-0.1766299172180259
-30
-1.328952610770256
-11
--0.04732784367774434
-21
-0.08197422986253444
-31
-1.3654883423487965
-12
--0.024498694614870198
-22
-0.09143037302181412
-32
-1.3654883423487965
-13
--0.024498694614870198
-23
-0.09143037302181412
-33
-1.3654883423487965
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.0914303730218115
-20
-0.15836205142875603
-30
-1.328952610770256
-11
--0.06693167840693953
-21
-0.24979242445056893
-31
-1.2708326549933042
-12
--0.12930207354027695
-22
-0.2239577608957718
-32
-1.2708326549933042
-13
--0.12930207354027695
-23
-0.2239577608957718
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.06693167840693953
-20
-0.24979242445056893
-30
-1.2708326549933042
-11
--0.0914303730218115
-21
-0.15836205142875603
-31
-1.328952610770256
-12
--0.04732784367774434
-22
-0.1766299172180259
-32
-1.328952610770256
-13
--0.04732784367774434
-23
-0.1766299172180259
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.029532010486047477
-20
-2.7755575615628914e-16
-30
-1.37795
-11
--0.04732784367774434
-21
-0.08197422986253444
-31
-1.3654883423487965
-12
--0.0669316784069407
-22
-0.06693167840694259
-32
-1.3654883423487965
-13
--0.0669316784069407
-23
-0.06693167840694259
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.12930207354027695
-20
-0.2239577608957718
-30
-1.2708326549933042
-11
--0.08197422986253078
-21
-0.3059319907583048
-31
-1.1950892539563733
-12
--0.15836205142875287
-22
-0.27429111906544
-32
-1.1950892539563733
-13
--0.15836205142875287
-23
-0.27429111906544
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.08197422986253078
-20
-0.3059319907583048
-30
-1.1950892539563733
-11
--0.12930207354027695
-21
-0.2239577608957718
-31
-1.2708326549933042
-12
--0.06693167840693953
-22
-0.24979242445056893
-32
-1.2708326549933042
-13
--0.06693167840693953
-23
-0.24979242445056893
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.24979242445056726
-20
-0.06693167840694259
-30
-1.2708326549933042
-11
--0.3167241028575086
-21
-3.885780586188048e-16
-31
-1.1950892539563733
-12
--0.2586041470805568
-22
-3.885780586188048e-16
-32
-1.2708326549933042
-13
--0.2586041470805568
-23
-3.885780586188048e-16
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3167241028575086
-20
-3.885780586188048e-16
-30
-1.1950892539563733
-11
--0.24979242445056726
-21
-0.06693167840694259
-31
-1.2708326549933042
-12
--0.3059319907583018
-22
-0.081974229862534
-32
-1.1950892539563733
-13
--0.3059319907583018
-23
-0.081974229862534
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.0669316784069407
-20
-0.06693167840694259
-30
-1.3654883423487965
-11
--0.0914303730218115
-21
-0.15836205142875603
-31
-1.328952610770256
-12
--0.12930207354027806
-22
-0.12930207354027967
-32
-1.328952610770256
-13
--0.12930207354027806
-23
-0.12930207354027967
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.0914303730218115
-20
-0.15836205142875603
-30
-1.328952610770256
-11
--0.0669316784069407
-21
-0.06693167840694259
-31
-1.3654883423487965
-12
--0.04732784367774434
-22
-0.08197422986253444
-32
-1.3654883423487965
-13
--0.04732784367774434
-23
-0.08197422986253444
-33
-1.3654883423487965
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09248182231156576
-20
-0.024498694614871863
-30
-1.3654883423487987
-11
-0.13856428289474554
-21
-0.09143037302181356
-31
-1.3289526107702583
-12
-0.08597126774640212
-22
-0.04732784367774656
-32
-1.3654883423487987
-13
-0.08597126774640212
-23
-0.04732784367774656
-33
-1.3654883423487987
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.13856428289474554
-20
-0.09143037302181356
-30
-1.3289526107702583
-11
-0.09248182231156576
-21
-0.024498694614871863
-31
-1.3654883423487987
-12
-0.15114170849065778
-22
-0.04732784367774656
-32
-1.3289526107702583
-13
-0.15114170849065778
-23
-0.04732784367774656
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.12930207354027806
-20
-0.12930207354027967
-30
-1.328952610770256
-11
--0.12930207354027695
-21
-0.2239577608957718
-31
-1.2708326549933042
-12
--0.18286074604362482
-22
-0.18286074604362668
-32
-1.2708326549933042
-13
--0.18286074604362482
-23
-0.18286074604362668
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.12930207354027695
-20
-0.2239577608957718
-30
-1.2708326549933042
-11
--0.12930207354027806
-21
-0.12930207354027967
-31
-1.328952610770256
-12
--0.0914303730218115
-22
-0.15836205142875603
-32
-1.328952610770256
-13
--0.0914303730218115
-23
-0.15836205142875603
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.18286074604362482
-20
-0.18286074604362668
-30
-1.2708326549933042
-11
--0.15836205142875287
-21
-0.27429111906544
-31
-1.1950892539563733
-12
--0.22395776089576924
-22
-0.22395776089577124
-32
-1.1950892539563733
-13
--0.22395776089576924
-23
-0.22395776089577124
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.15836205142875287
-20
-0.27429111906544
-30
-1.1950892539563733
-11
--0.18286074604362482
-21
-0.18286074604362668
-31
-1.2708326549933042
-12
--0.12930207354027695
-22
-0.2239577608957718
-32
-1.2708326549933042
-13
--0.12930207354027695
-23
-0.2239577608957718
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.22395776089576924
-20
-0.22395776089577124
-30
-1.1950892539563733
-11
--0.1766299172180231
-21
-0.305931990758305
-31
-1.1068841952682391
-12
--0.24979242445056726
-22
-0.24979242445056848
-32
-1.1068841952682391
-13
--0.24979242445056726
-23
-0.24979242445056848
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1766299172180231
-20
-0.305931990758305
-30
-1.1068841952682391
-11
--0.22395776089576924
-21
-0.22395776089577124
-31
-1.1950892539563733
-12
--0.15836205142875287
-22
-0.27429111906544
-32
-1.1950892539563733
-13
--0.15836205142875287
-23
-0.27429111906544
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.029532010486047477
-20
-2.7755575615628914e-16
-30
-1.37795
-11
--0.0669316784069407
-21
-0.06693167840694259
-31
-1.3654883423487965
-12
--0.08197422986253194
-22
-0.047327843677746395
-32
-1.3654883423487965
-13
--0.08197422986253194
-23
-0.047327843677746395
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.24979242445056726
-20
-0.24979242445056848
-30
-1.1068841952682391
-11
--0.1828607460436237
-21
-0.31672410285751096
-31
-1.0122285079127469
-12
--0.2586041470805568
-22
-0.2586041470805588
-32
-1.0122285079127469
-13
--0.2586041470805568
-23
-0.2586041470805588
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1828607460436237
-20
-0.31672410285751096
-30
-1.0122285079127469
-11
--0.24979242445056726
-21
-0.24979242445056848
-31
-1.1068841952682391
-12
--0.1766299172180231
-22
-0.305931990758305
-32
-1.1068841952682391
-13
--0.1766299172180231
-23
-0.305931990758305
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.20151409472026383
-20
-0.06693167840694275
-30
-1.2708326549933064
-11
-0.15543163413708405
-21
-3.885780586188048e-16
-31
-1.3289526107702583
-12
-0.20758096575101137
-22
-2.7755575615628914e-16
-32
-1.2708326549933064
-13
-0.20758096575101137
-23
-2.7755575615628914e-16
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.15543163413708405
-20
-3.885780586188048e-16
-30
-1.3289526107702583
-11
-0.20151409472026383
-21
-0.06693167840694275
-31
-1.2708326549933064
-12
-0.15114170849065778
-22
-0.04732784367774656
-32
-1.3289526107702583
-13
-0.15114170849065778
-23
-0.04732784367774656
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3059319907583018
-20
-0.17662991721802546
-30
-1.1068841952682391
-11
--0.3532598344360491
-21
-0.09465568735549246
-31
-1.0122285079127469
-12
--0.34122279747237944
-22
-0.09143037302181367
-32
-1.1068841952682391
-13
--0.34122279747237944
-23
-0.09143037302181367
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3532598344360491
-20
-0.09465568735549246
-30
-1.0122285079127469
-11
--0.3059319907583018
-21
-0.17662991721802546
-31
-1.1068841952682391
-12
--0.3167241028575086
-22
-0.18286074604362668
-32
-1.0122285079127469
-13
--0.3167241028575086
-23
-0.18286074604362668
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.029532010486047477
-20
-2.7755575615628914e-16
-30
-1.37795
-11
--0.09143037302181262
-21
-0.024498694614871808
-31
-1.3654883423487965
-12
--0.09465568735549051
-22
-3.3306690738754696e-16
-32
-1.3654883423487965
-13
--0.09465568735549051
-23
-3.3306690738754696e-16
-33
-1.3654883423487965
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.09465568735549051
-20
-3.3306690738754696e-16
-30
-1.3654883423487965
-11
--0.1766299172180231
-21
-0.04732784367774656
-31
-1.328952610770256
-12
--0.18286074604362482
-22
-3.885780586188048e-16
-32
-1.328952610770256
-13
--0.18286074604362482
-23
-3.885780586188048e-16
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1766299172180231
-20
-0.04732784367774656
-30
-1.328952610770256
-11
--0.09465568735549051
-21
-3.3306690738754696e-16
-31
-1.3654883423487965
-12
--0.09143037302181262
-22
-0.024498694614871808
-32
-1.3654883423487965
-13
--0.09143037302181262
-23
-0.024498694614871808
-33
-1.3654883423487965
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.18286074604362482
-20
-3.885780586188048e-16
-30
-1.328952610770256
-11
--0.24979242445056726
-21
-0.06693167840694259
-31
-1.2708326549933042
-12
--0.2586041470805568
-22
-3.885780586188048e-16
-32
-1.2708326549933042
-13
--0.2586041470805568
-23
-3.885780586188048e-16
-33
-1.2708326549933042
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.24979242445056726
-20
-0.06693167840694259
-30
-1.2708326549933042
-11
--0.18286074604362482
-21
-3.885780586188048e-16
-31
-1.328952610770256
-12
--0.1766299172180231
-22
-0.04732784367774656
-32
-1.328952610770256
-13
--0.1766299172180231
-23
-0.04732784367774656
-33
-1.328952610770256
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3059319907583018
-20
-0.081974229862534
-30
-1.1950892539563733
-11
--0.3532598344360491
-21
-3.885780586188048e-16
-31
-1.1068841952682391
-12
--0.3167241028575086
-22
-3.885780586188048e-16
-32
-1.1950892539563733
-13
--0.3167241028575086
-23
-3.885780586188048e-16
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3532598344360491
-20
-3.885780586188048e-16
-30
-1.1068841952682391
-11
--0.3059319907583018
-21
-0.081974229862534
-31
-1.1950892539563733
-12
--0.34122279747237944
-22
-0.09143037302181367
-32
-1.1068841952682391
-13
--0.34122279747237944
-23
-0.09143037302181367
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.34122279747237944
-20
-0.09143037302181367
-30
-1.1068841952682391
-11
--0.3657214920872503
-21
-3.885780586188048e-16
-31
-1.0122285079127469
-12
--0.3532598344360491
-22
-3.885780586188048e-16
-32
-1.1068841952682391
-13
--0.3532598344360491
-23
-3.885780586188048e-16
-33
-1.1068841952682391
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3657214920872503
-20
-3.885780586188048e-16
-30
-1.0122285079127469
-11
--0.34122279747237944
-21
-0.09143037302181367
-31
-1.1068841952682391
-12
--0.3532598344360491
-22
-0.09465568735549246
-32
-1.0122285079127469
-13
--0.3532598344360491
-23
-0.09465568735549246
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09470245123030319
-20
-3.885780586188048e-16
-30
-1.3654883423487987
-11
-0.15114170849065778
-21
-0.04732784367774656
-31
-1.3289526107702583
-12
-0.09248182231156576
-22
-0.024498694614871863
-32
-1.3654883423487987
-13
-0.09248182231156576
-23
-0.024498694614871863
-33
-1.3654883423487987
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.15114170849065778
-20
-0.04732784367774656
-30
-1.3289526107702583
-11
-0.09470245123030319
-21
-3.885780586188048e-16
-31
-1.3654883423487987
-12
-0.15543163413708405
-22
-3.885780586188048e-16
-32
-1.3289526107702583
-13
-0.15543163413708405
-23
-3.885780586188048e-16
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06211723085817539
-20
-0.176629917218026
-30
-1.3289526107702583
-11
-0.051933324443145024
-21
-0.25432064826909484
-31
-1.270832654993302
-12
-0.03977877210196379
-22
-0.18090139708368969
-32
-1.3289526107702627
-13
-0.03977877210196379
-23
-0.18090139708368969
-33
-1.3289526107702627
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.051933324443145024
-20
-0.25432064826909484
-30
-1.270832654993302
-11
-0.06211723085817539
-21
-0.176629917218026
-31
-1.3289526107702583
-12
-0.07561447106922731
-22
-0.24979242445056904
-32
-1.2708326549933064
-13
-0.07561447106922731
-23
-0.24979242445056904
-33
-1.2708326549933064
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06777344544969494
-20
-0.30941171298926207
-30
-1.1950892539563756
-11
-0.09248182231156576
-21
-0.34122279747238193
-31
-1.1068841952682413
-12
-0.0862196570520593
-22
-0.3424202262257874
-32
-1.1068841952682413
-13
-0.0862196570520593
-23
-0.3424202262257874
-33
-1.1068841952682413
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09248182231156576
-20
-0.34122279747238193
-30
-1.1068841952682413
-11
-0.06777344544969494
-21
-0.30941171298926207
-31
-1.1950892539563756
-12
-0.08597126774640101
-22
-0.305931990758305
-32
-1.1950892539563733
-13
-0.08597126774640101
-23
-0.305931990758305
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1060148804133424
-20
-0.3464540804912427
-30
-1.0122285079127469
-11
-0.1110862308312226
-21
-0.4145794574834395
-31
-0.0
-12
-0.09465568735549401
-22
-0.353259834436051
-32
-1.0122285079127469
-13
-0.09465568735549401
-23
-0.353259834436051
-33
-1.0122285079127469
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.06777344544969494
-20
-0.30941171298926207
-30
-1.1950892539563756
-11
-0.07561447106922731
-21
-0.24979242445056904
-31
-1.2708326549933064
-12
-0.08597126774640101
-22
-0.305931990758305
-32
-1.1950892539563733
-13
-0.08597126774640101
-23
-0.305931990758305
-33
-1.1950892539563733
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.07561447106922731
-20
-0.24979242445056904
-30
-1.2708326549933064
-11
-0.06777344544969494
-21
-0.30941171298926207
-31
-1.1950892539563756
-12
-0.051933324443145024
-22
-0.25432064826909484
-32
-1.270832654993302
-13
-0.051933324443145024
-23
-0.25432064826909484
-33
-1.270832654993302
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.16148066621521584
-20
-0.30464032797763685
-30
-0.9121263906088999
-11
-0.14628261733798686
-21
-0.3305275449199734
-31
-0.9336709982866838
-12
-0.14628261733798686
-22
-0.2849026021630544
-32
-0.9336709982866838
-13
-0.14628261733798686
-23
-0.2849026021630544
-33
-0.9336709982866838
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.3305275449199734
-30
-0.9336709982866838
-11
-0.16148066621521584
-21
-0.30464032797763685
-31
-0.9121263906088999
-12
-0.1624333997344558
-22
-0.32322972405982175
-32
-0.9107758047501918
-13
-0.1624333997344558
-23
-0.32322972405982175
-33
-0.9107758047501918
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.04639936172838599
-20
-0.09143037302181423
-30
-1.3654883423487987
-11
-0.03977877210196379
-21
-0.18090139708368969
-31
-1.3289526107702627
-12
-0.03213810108186088
-22
-0.09415736007026898
-32
-1.3654883423488011
-13
-0.03213810108186088
-23
-0.09415736007026898
-33
-1.3654883423488011
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.03977877210196379
-20
-0.18090139708368969
-30
-1.3289526107702627
-11
-0.04639936172838599
-21
-0.09143037302181423
-31
-1.3654883423487987
-12
-0.06211723085817539
-22
-0.176629917218026
-32
-1.3289526107702583
-13
-0.06211723085817539
-23
-0.176629917218026
-33
-1.3289526107702583
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.04639936172838599
-20
-0.09143037302181423
-30
-1.3654883423487987
-11
-0.03213810108186088
-21
-0.09415736007026898
-31
-1.3654883423488011
-12
-0.029532010486047477
-22
-2.7755575615628914e-16
-32
-1.37795
-13
-0.029532010486047477
-23
-2.7755575615628914e-16
-33
-1.37795
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.09248182231156576
-20
-0.34122279747238193
-30
-1.1068841952682413
-11
-0.09327307500958115
-21
-0.34551182473544184
-31
-1.0731565574038182
-12
-0.0862196570520593
-22
-0.3424202262257874
-32
-1.1068841952682413
-13
-0.0862196570520593
-23
-0.3424202262257874
-33
-1.1068841952682413
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.23066726183653696
-20
-0.24695009092044307
-30
-0.7851554598356051
-11
-0.21831309401632715
-21
-0.21849744483100653
-31
-0.8070247740079369
-12
-0.21954103663658775
-22
-0.21464742440548745
-32
-0.8047207977789652
-13
-0.21954103663658775
-23
-0.21464742440548745
-33
-0.8047207977789652
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.21831309401632715
-20
-0.21849744483100653
-30
-0.8070247740079369
-11
-0.23066726183653696
-21
-0.24695009092044307
-31
-0.7851554598356051
-12
-0.20642658047224793
-22
-0.2386153747599219
-32
-0.8289927497633759
-13
-0.20642658047224793
-23
-0.2386153747599219
-33
-0.8289927497633759
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.20642658047224793
-20
-0.2386153747599219
-30
-0.8289927497633759
-11
-0.23066726183653696
-21
-0.24695009092044307
-31
-0.7851554598356051
-12
-0.214135315851808
-22
-0.2688995990817393
-32
-0.8155912096632217
-13
-0.214135315851808
-23
-0.2688995990817393
-33
-0.8155912096632217
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305374
-30
-1.2467080400132249
-11
-0.14591265330279146
-21
-0.28442212939005906
-31
-1.159696374922908
-12
-0.13856428289474443
-22
-0.2742911190654399
-32
-1.1950892539563733
-13
-0.13856428289474443
-23
-0.2742911190654399
-33
-1.1950892539563733
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.41457945748344094
-20
-0.11108623083122104
-30
-0.0
-11
-0.2902821751225073
-21
-0.10111068285304725
-31
-0.67540282766255
-12
-0.296250080065389
-22
-0.05625570433824323
-32
-0.6644157568117056
-13
-0.296250080065389
-23
-0.05625570433824323
-33
-0.6644157568117056
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1624333997344558
-20
-0.32322972405982175
-30
-0.9107758047501918
-11
-0.17315837194884964
-21
-0.31485375811798544
-31
-0.8910308472281347
-12
-0.30349322665222
-22
-0.303493226652219
-32
-0.0
-13
-0.30349322665222
-23
-0.303493226652219
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305374
-30
-1.2467080400132249
-11
-0.14628261733798686
-21
-0.28490260216305396
-31
-1.0876716112414513
-12
-0.14591265330279146
-22
-0.28442212939005906
-32
-1.159696374922908
-13
-0.14591265330279146
-23
-0.28442212939005906
-33
-1.159696374922908
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305396
-30
-1.0876716112414513
-11
-0.14628261733798686
-21
-0.28490260216305374
-31
-1.2467080400132249
-12
-0.15406334402645439
-22
-0.2950074420182055
-32
-1.238954323683159
-13
-0.15406334402645439
-23
-0.2950074420182055
-33
-1.238954323683159
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305396
-30
-1.0876716112414513
-11
-0.15406334402645439
-21
-0.2950074420182055
-31
-1.238954323683159
-12
-0.14628261733798686
-22
-0.2849026021630544
-32
-0.9336709982866838
-13
-0.14628261733798686
-23
-0.2849026021630544
-33
-0.9336709982866838
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.2849026021630544
-30
-0.9336709982866838
-11
-0.15406334402645439
-21
-0.2950074420182055
-31
-1.238954323683159
-12
-0.16148066621521584
-22
-0.30464032797763685
-32
-0.9121263906088999
-13
-0.16148066621521584
-23
-0.30464032797763685
-33
-0.9121263906088999
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.16148066621521584
-20
-0.30464032797763685
-30
-0.9121263906088999
-11
-0.15406334402645439
-21
-0.2950074420182055
-31
-1.238954323683159
-12
-0.1648391920368235
-22
-0.309002049823879
-32
-1.2207161957078443
-13
-0.1648391920368235
-23
-0.309002049823879
-33
-1.2207161957078443
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.16148066621521584
-20
-0.30464032797763685
-30
-0.9121263906088999
-11
-0.1648391920368235
-21
-0.309002049823879
-31
-1.2207161957078443
-12
-0.16483919203682462
-22
-0.3090020498238778
-32
-0.9060890011061947
-13
-0.16483919203682462
-23
-0.3090020498238778
-33
-0.9060890011061947
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.37170177284439176
-20
-0.21460211860997003
-30
-0.0
-11
-0.2591667482690694
-21
-0.19321003684080962
-31
-0.7326871515023154
-12
-0.274037280744151
-22
-0.15716672872113313
-32
-0.7053101078903244
-13
-0.274037280744151
-23
-0.15716672872113313
-33
-0.7053101078903244
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.28490260216305374
-30
-1.2467080400132249
-11
-0.13856428289474443
-21
-0.2742911190654399
-31
-1.1950892539563733
-12
-0.17760884479078798
-22
-0.2307763099490301
-32
-1.1950892539563756
-13
-0.17760884479078798
-23
-0.2307763099490301
-33
-1.1950892539563756
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.37170177284439176
-20
-0.21460211860997003
-30
-0.0
-11
-0.274037280744151
-21
-0.15716672872113313
-31
-0.7053101078903244
-12
-0.41457945748344094
-22
-0.11108623083122104
-32
-0.0
-13
-0.41457945748344094
-23
-0.11108623083122104
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.30349322665222
-20
-0.303493226652219
-30
-0.0
-11
-0.214135315851808
-21
-0.2688995990817393
-31
-0.8155912096632217
-12
-0.23066726183653696
-22
-0.24695009092044307
-32
-0.7851554598356051
-13
-0.23066726183653696
-23
-0.24695009092044307
-33
-0.7851554598356051
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1624333997344558
-20
-0.32322972405982175
-30
-0.9107758047501918
-11
-0.30349322665222
-21
-0.303493226652219
-31
-0.0
-12
-0.21460211860997136
-22
-0.3717017728443903
-32
-0.0
-13
-0.21460211860997136
-23
-0.3717017728443903
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.30349322665222
-20
-0.303493226652219
-30
-0.0
-11
-0.23066726183653696
-21
-0.24695009092044307
-31
-0.7851554598356051
-12
-0.37170177284439176
-22
-0.21460211860997003
-32
-0.0
-13
-0.37170177284439176
-23
-0.21460211860997003
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.41457945748344094
-20
-0.11108623083122104
-30
-0.0
-11
-0.296250080065389
-21
-0.05625570433824323
-31
-0.6644157568117056
-12
-0.42920423721993983
-22
-2.7755575615628914e-15
-32
-0.0
-13
-0.42920423721993983
-23
-2.7755575615628914e-15
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.3305275449199734
-30
-0.9357778285299473
-11
-0.14591265330279257
-21
-0.30907788121177326
-31
-1.1068841952682413
-12
-0.14628261733798686
-22
-0.2849026021630544
-32
-0.9336709982866838
-13
-0.14628261733798686
-23
-0.2849026021630544
-33
-0.9336709982866838
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.30907788121177326
-30
-1.1068841952682413
-11
-0.14591265330279257
-21
-0.3305275449199734
-31
-0.9357778285299473
-12
-0.14591265330279257
-22
-0.3224508871153656
-32
-1.0122285079127469
-13
-0.14591265330279257
-23
-0.3224508871153656
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.30907788121177326
-30
-1.1068841952682413
-11
-0.14628261733798686
-21
-0.28490260216305396
-31
-1.0876716112414513
-12
-0.14628261733798686
-22
-0.2849026021630544
-32
-0.9336709982866838
-13
-0.14628261733798686
-23
-0.2849026021630544
-33
-0.9336709982866838
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14628261733798686
-20
-0.3305275449199734
-30
-0.9336709982866838
-11
-0.1624333997344558
-21
-0.32322972405982175
-31
-0.9107758047501918
-12
-0.21460211860997136
-22
-0.3717017728443903
-32
-0.0
-13
-0.21460211860997136
-23
-0.3717017728443903
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1060148804133424
-20
-0.3464540804912427
-30
-1.0122285079127469
-11
-0.14628261733798686
-21
-0.3305275449199734
-31
-0.9336709982866838
-12
-0.21460211860997136
-22
-0.3717017728443903
-32
-0.0
-13
-0.21460211860997136
-23
-0.3717017728443903
-33
-0.0
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1060148804133424
-20
-0.3464540804912427
-30
-1.0122285079127469
-11
-0.14591265330279257
-21
-0.3305275449199734
-31
-0.9357778285299473
-12
-0.14628261733798686
-22
-0.3305275449199734
-32
-0.9336709982866838
-13
-0.14628261733798686
-23
-0.3305275449199734
-33
-0.9336709982866838
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.14591265330279257
-20
-0.3305275449199734
-30
-0.9357778285299473
-11
-0.1060148804133424
-21
-0.3464540804912427
-31
-1.0122285079127469
-12
-0.14591265330279257
-22
-0.3224508871153656
-32
-1.0122285079127469
-13
-0.14591265330279257
-23
-0.3224508871153656
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2586041470805568
-20
-0.2586041470805588
-30
-1.0122285079127469
-11
--0.35104895415806886
-21
-0.20267820818189808
-31
-0.3510489541580695
-12
--0.3167241028575086
-22
-0.18286074604362668
-32
-1.0122285079127469
-13
--0.3167241028575086
-23
-0.18286074604362668
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.35104895415806886
-20
-0.20267820818189808
-30
-0.3510489541580695
-11
--0.2586041470805568
-21
-0.2586041470805588
-31
-1.0122285079127469
-12
--0.34136914729025525
-22
-0.2162382106052272
-32
-0.3413691472902548
-13
--0.34136914729025525
-23
-0.2162382106052272
-33
-0.3413691472902548
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2586041470805568
-20
-0.2586041470805588
-30
-1.0122285079127469
-11
--0.31956463959574843
-21
-0.24729676227526276
-31
-0.319564639595748
-12
--0.34136914729025525
-22
-0.2162382106052272
-32
-0.3413691472902548
-13
--0.34136914729025525
-23
-0.2162382106052272
-33
-0.3413691472902548
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.31956463959574843
-20
-0.24729676227526276
-30
-0.319564639595748
-11
--0.2586041470805568
-21
-0.2586041470805588
-31
-1.0122285079127469
-12
--0.28975619668604413
-22
-0.28975619668604524
-32
-0.2897561966860459
-13
--0.28975619668604413
-23
-0.28975619668604524
-33
-0.2897561966860459
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3167241028575086
-20
-0.18286074604362668
-30
-1.0122285079127469
-11
--0.38891611994706954
-21
-0.10420976026326378
-31
-0.3889161199470702
-12
--0.3532598344360491
-22
-0.09465568735549246
-32
-1.0122285079127469
-13
--0.3532598344360491
-23
-0.09465568735549246
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.38891611994706954
-20
-0.10420976026326378
-30
-0.3889161199470702
-11
--0.3167241028575086
-21
-0.18286074604362668
-31
-1.0122285079127469
-12
--0.3824872047423873
-22
-0.12071693477296785
-32
-0.38248720474238906
-13
--0.3824872047423873
-23
-0.12071693477296785
-33
-0.38248720474238906
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.35104895415806886
-20
-0.20267820818189808
-30
-0.3510489541580695
-11
--0.3824872047423873
-21
-0.12071693477296785
-31
-0.38248720474238906
-12
--0.3167241028575086
-22
-0.18286074604362668
-32
-1.0122285079127469
-13
--0.3167241028575086
-23
-0.18286074604362668
-33
-1.0122285079127469
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.3532598344360491
-20
-0.09465568735549246
-30
-1.0122285079127469
-11
--0.4017178381596732
-21
-3.885780586188048e-16
-31
-0.4017178381596739
-12
--0.3657214920872503
-22
-3.885780586188048e-16
-32
-1.0122285079127469
-13
--0.3657214920872503
-23
-3.885780586188048e-16
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.4017178381596732
-20
-3.885780586188048e-16
-30
-0.4017178381596739
-11
--0.3532598344360491
-21
-0.09465568735549246
-31
-1.0122285079127469
-12
--0.39943530308125597
-22
-0.018359816733039713
-32
-0.39943530308125774
-13
--0.39943530308125597
-23
-0.018359816733039713
-33
-0.39943530308125774
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.38891611994706954
-20
-0.10420976026326378
-30
-0.3889161199470702
-11
--0.39943530308125597
-21
-0.018359816733039713
-31
-0.39943530308125774
-12
--0.3532598344360491
-22
-0.09465568735549246
-32
-1.0122285079127469
-13
--0.3532598344360491
-23
-0.09465568735549246
-33
-1.0122285079127469
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1828607460436237
-20
-0.31672410285751096
-30
-1.0122285079127469
-11
--0.20785502656237878
-21
-0.3600154666146186
-31
-0.2078550265623772
-12
--0.2778969996485491
-22
-0.2997598063673419
-32
-0.27789699964855086
-13
--0.2778969996485491
-23
-0.2997598063673419
-33
-0.27789699964855086
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.28975619668604413
-20
-0.28975619668604524
-30
-0.2897561966860459
-11
--0.1828607460436237
-21
-0.31672410285751096
-31
-1.0122285079127469
-12
--0.2778969996485491
-22
-0.2997598063673419
-32
-0.27789699964855086
-13
--0.2778969996485491
-23
-0.2997598063673419
-33
-0.27789699964855086
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.1828607460436237
-20
-0.31672410285751096
-30
-1.0122285079127469
-11
--0.28975619668604413
-21
-0.28975619668604524
-31
-0.2897561966860459
-12
--0.2586041470805568
-22
-0.2586041470805588
-32
-1.0122285079127469
-13
--0.2586041470805568
-23
-0.2586041470805588
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.09465568735549051
-20
-0.3532598344360508
-30
-1.0122285079127469
-11
--0.10931187503979845
-21
-0.4079574715191584
-31
-0.10931187503979797
-12
--0.19486138979903292
-22
-0.36626416358485825
-32
-0.1948613897990347
-13
--0.19486138979903292
-23
-0.36626416358485825
-33
-0.1948613897990347
-70
-0
- 0
-3DFACE
- 8
-thumb distal
-10
--0.20785502656237878
-20
-0.3600154666146186
-30
-0.2078550265623772
-11
--0.09465568735549051
-21
-0.3532598344360508
-31
-1.0122285079127469
-12
--0.19486138979903292
-22
-0.36626416358485825
-32
-0.1948613897990347
-13
--0.19486138979903292
-23
-0.36626416358485825
-33
-0.1948613897990347
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.09465568735549051
-20
-0.3532598344360508
-30
-1.0122285079127469
-11
--0.20785502656237878
-21
-0.3600154666146186
-31
-0.2078550265623772
-12
--0.1828607460436237
-22
-0.31672410285751096
-32
-1.0122285079127469
-13
--0.1828607460436237
-23
-0.31672410285751096
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.365721492087253
-30
-1.0122285079127469
-11
-0.1110862308312226
-21
-0.4145794574834395
-31
-0.0
-12
-1.7763568394002505e-15
-22
-0.4292042372199397
-32
-0.0
-13
-1.7763568394002505e-15
-23
-0.4292042372199397
-33
-0.0
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.1110862308312226
-20
-0.4145794574834395
-30
-0.0
-11
-1.7763568394002505e-15
-21
-0.365721492087253
-31
-1.0122285079127469
-12
-0.09465568735549401
-22
-0.353259834436051
-32
-1.0122285079127469
-13
-0.09465568735549401
-23
-0.353259834436051
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.10931187503979845
-20
-0.4079574715191584
-30
-0.10931187503979797
-11
-1.7763568394002505e-15
-21
-0.365721492087253
-31
-1.0122285079127469
-12
-1.7763568394002505e-15
-22
-0.4292042372199397
-32
-0.0
-13
-1.7763568394002505e-15
-23
-0.4292042372199397
-33
-0.0
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.365721492087253
-30
-1.0122285079127469
-11
--0.10931187503979845
-21
-0.4079574715191584
-31
-0.10931187503979797
-12
--0.09465568735549051
-22
-0.3532598344360508
-32
-1.0122285079127469
-13
--0.09465568735549051
-23
-0.3532598344360508
-33
-1.0122285079127469
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
-0.3562827519999995
-21
-0.21460211860996914
-31
--2.220446049250313e-15
-12
--1.609823385706477e-15
-22
-0.2146021186099698
-32
-0.0
-13
--1.609823385706477e-15
-23
-0.2146021186099698
-33
-0.0
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
-0.3562827519999995
-20
-0.21460211860996914
-30
--2.220446049250313e-15
-11
-1.7763568394002505e-15
-21
-0.4292042372199397
-31
-0.0
-12
-0.1110862308312226
-22
-0.4145794574834395
-32
-0.0
-13
-0.1110862308312226
-23
-0.4145794574834395
-33
-0.0
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.3562827519999995
-20
-0.21460211860996914
-30
--2.220446049250313e-15
-11
-0.1110862308312226
-21
-0.4145794574834395
-31
-0.0
-12
-0.21460211860997136
-22
-0.3717017728443903
-32
-0.0
-13
-0.21460211860997136
-23
-0.3717017728443903
-33
-0.0
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.3562827519999995
-20
-0.21460211860996914
-30
--2.220446049250313e-15
-11
-0.21460211860997136
-21
-0.3717017728443903
-31
-0.0
-12
-0.30349322665222
-22
-0.303493226652219
-32
-0.0
-13
-0.30349322665222
-23
-0.303493226652219
-33
-0.0
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.3562827519999995
-20
-0.21460211860996914
-30
--2.220446049250313e-15
-11
-0.30349322665222
-21
-0.303493226652219
-31
-0.0
-12
-0.37170177284439176
-22
-0.21460211860997003
-32
-0.0
-13
-0.37170177284439176
-23
-0.21460211860997003
-33
-0.0
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-0.3562827519999995
-20
-0.21460211860996914
-30
--2.220446049250313e-15
-11
-0.37170177284439176
-21
-0.21460211860997003
-31
-0.0
-12
-0.3562827519999995
-22
-2.1649348980190553e-15
-32
--2.220446049250313e-15
-13
-0.3562827519999995
-23
-2.1649348980190553e-15
-33
--2.220446049250313e-15
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.3562827519999995
-20
-2.1649348980190553e-15
-30
--2.220446049250313e-15
-11
-0.37170177284439176
-21
-0.21460211860997003
-31
-0.0
-12
-0.42920423721993983
-22
-2.7755575615628914e-15
-32
-0.0
-13
-0.42920423721993983
-23
-2.7755575615628914e-15
-33
-0.0
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-0.42920423721993983
-20
-2.7755575615628914e-15
-30
-0.0
-11
-0.37170177284439176
-21
-0.21460211860997003
-31
-0.0
-12
-0.41457945748344094
-22
-0.11108623083122104
-32
-0.0
-13
-0.41457945748344094
-23
-0.11108623083122104
-33
-0.0
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.39943530308125597
-20
-0.018359816733039713
-30
-0.39943530308125774
-11
--0.2519299499590043
-21
-1.0547118733938987e-15
-31
-0.2519299499590027
-12
--0.4017178381596732
-22
-3.885780586188048e-16
-32
-0.4017178381596739
-13
--0.4017178381596732
-23
-3.885780586188048e-16
-33
-0.4017178381596739
-70
-1
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2519299499590043
-20
-1.0547118733938987e-15
-30
-0.2519299499590027
-11
--0.39943530308125597
-21
-0.018359816733039713
-31
-0.39943530308125774
-12
--0.2519299499590054
-22
-0.21460211860996914
-32
-0.2519299499590072
-13
--0.2519299499590054
-23
-0.21460211860996914
-33
-0.2519299499590072
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2519299499590054
-20
-0.21460211860996914
-30
-0.2519299499590072
-11
--0.39943530308125597
-21
-0.018359816733039713
-31
-0.39943530308125774
-12
--0.38891611994706954
-22
-0.10420976026326378
-32
-0.3889161199470702
-13
--0.38891611994706954
-23
-0.10420976026326378
-33
-0.3889161199470702
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2519299499590054
-20
-0.21460211860996914
-30
-0.2519299499590072
-11
--0.38891611994706954
-21
-0.10420976026326378
-31
-0.3889161199470702
-12
--0.3824872047423873
-22
-0.12071693477296785
-32
-0.38248720474238906
-13
--0.3824872047423873
-23
-0.12071693477296785
-33
-0.38248720474238906
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2519299499590054
-20
-0.21460211860996914
-30
-0.2519299499590072
-11
--0.3824872047423873
-21
-0.12071693477296785
-31
-0.38248720474238906
-12
--0.35104895415806886
-22
-0.20267820818189808
-32
-0.3510489541580695
-13
--0.35104895415806886
-23
-0.20267820818189808
-33
-0.3510489541580695
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2519299499590054
-20
-0.21460211860996914
-30
-0.2519299499590072
-11
--0.35104895415806886
-21
-0.20267820818189808
-31
-0.3510489541580695
-12
--0.34136914729025525
-22
-0.2162382106052272
-32
-0.3413691472902548
-13
--0.34136914729025525
-23
-0.2162382106052272
-33
-0.3413691472902548
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
--0.2519299499590054
-20
-0.21460211860996914
-30
-0.2519299499590072
-11
--0.34136914729025525
-21
-0.2162382106052272
-31
-0.3413691472902548
-12
--1.609823385706477e-15
-22
-0.2146021186099698
-32
-0.0
-13
--1.609823385706477e-15
-23
-0.2146021186099698
-33
-0.0
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
--1.609823385706477e-15
-20
-0.2146021186099698
-30
-0.0
-11
--0.34136914729025525
-21
-0.2162382106052272
-31
-0.3413691472902548
-12
-1.7763568394002505e-15
-22
-0.4292042372199397
-32
-0.0
-13
-1.7763568394002505e-15
-23
-0.4292042372199397
-33
-0.0
-70
-3
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
--0.34136914729025525
-21
-0.2162382106052272
-31
-0.3413691472902548
-12
--0.31956463959574843
-22
-0.24729676227526276
-32
-0.319564639595748
-13
--0.31956463959574843
-23
-0.24729676227526276
-33
-0.319564639595748
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
--0.31956463959574843
-21
-0.24729676227526276
-31
-0.319564639595748
-12
--0.28975619668604413
-22
-0.28975619668604524
-32
-0.2897561966860459
-13
--0.28975619668604413
-23
-0.28975619668604524
-33
-0.2897561966860459
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
--0.28975619668604413
-21
-0.28975619668604524
-31
-0.2897561966860459
-12
--0.2778969996485491
-22
-0.2997598063673419
-32
-0.27789699964855086
-13
--0.2778969996485491
-23
-0.2997598063673419
-33
-0.27789699964855086
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
--0.2778969996485491
-21
-0.2997598063673419
-31
-0.27789699964855086
-12
--0.20785502656237878
-22
-0.3600154666146186
-32
-0.2078550265623772
-13
--0.20785502656237878
-23
-0.3600154666146186
-33
-0.2078550265623772
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
--0.20785502656237878
-21
-0.3600154666146186
-31
-0.2078550265623772
-12
--0.19486138979903292
-22
-0.36626416358485825
-32
-0.1948613897990347
-13
--0.19486138979903292
-23
-0.36626416358485825
-33
-0.1948613897990347
-70
-13
- 0
-3DFACE
- 8
-thumb distal
-10
-1.7763568394002505e-15
-20
-0.4292042372199397
-30
-0.0
-11
--0.19486138979903292
-21
-0.36626416358485825
-31
-0.1948613897990347
-12
--0.10931187503979845
-22
-0.4079574715191584
-32
-0.10931187503979797
-13
--0.10931187503979845
-23
-0.4079574715191584
-33
-0.10931187503979797
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.19123308709410364
-20
-0.15899592086427866
-30
-0.8885515077908579
-11
-2.220446049250313e-15
-21
-0.15899592086427866
-31
-1.0007956832333833
-12
--0.15693817501863377
-22
-0.15899592086427866
-32
-0.8438575082147479
-13
--0.15693817501863377
-23
-0.15899592086427866
-33
-0.8438575082147479
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
--0.19123308709410364
-21
-0.15899592086427866
-31
-0.8885515077908579
-12
--0.21329279355777295
-22
-0.15899592086427866
-32
-0.9418083503174176
-13
--0.21329279355777295
-23
-0.15899592086427866
-33
-0.9418083503174176
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
--0.21329279355777295
-21
-0.15899592086427866
-31
-0.9418083503174176
-12
--0.2208169486234871
-22
-0.15899592086427866
-32
-0.9989599821026028
-13
--0.2208169486234871
-23
-0.15899592086427866
-33
-0.9989599821026028
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
--0.2208169486234871
-21
-0.15899592086427866
-31
-0.9989599821026028
-12
--0.21329279355777295
-22
-0.15899592086427866
-32
-1.056111613887788
-13
--0.21329279355777295
-23
-0.15899592086427866
-33
-1.056111613887788
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
--0.21329279355777295
-21
-0.15899592086427866
-31
-1.056111613887788
-12
-0.22057527398480187
-22
-0.15899592086427866
-32
-1.0007956832333833
-13
-0.22057527398480187
-23
-0.15899592086427866
-33
-1.0007956832333833
-70
-15
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.22057527398480187
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
--0.21329279355777295
-21
-0.15899592086427866
-31
-1.056111613887788
-12
-0.21329279355777625
-22
-0.15899592086427866
-32
-1.056111613887788
-13
-0.21329279355777625
-23
-0.15899592086427866
-33
-1.056111613887788
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.21329279355777625
-20
-0.15899592086427866
-30
-1.056111613887788
-11
--0.21329279355777295
-21
-0.15899592086427866
-31
-1.056111613887788
-12
--0.19123308709410364
-22
-0.15899592086427866
-32
-1.1093684564143456
-13
--0.19123308709410364
-23
-0.15899592086427866
-33
-1.1093684564143456
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.21329279355777625
-20
-0.15899592086427866
-30
-1.056111613887788
-11
--0.19123308709410364
-21
-0.15899592086427866
-31
-1.1093684564143456
-12
-0.19123308709410575
-22
-0.15899592086427866
-32
-1.1093684564143456
-13
-0.19123308709410575
-23
-0.15899592086427866
-33
-1.1093684564143456
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.19123308709410575
-20
-0.15899592086427866
-30
-1.1093684564143456
-11
--0.19123308709410364
-21
-0.15899592086427866
-31
-1.1093684564143456
-12
--0.15614116177258947
-22
-0.15899592086427866
-32
-1.1551011438751944
-13
--0.15614116177258947
-23
-0.15899592086427866
-33
-1.1551011438751944
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.19123308709410575
-20
-0.15899592086427866
-30
-1.1093684564143456
-11
--0.15614116177258947
-21
-0.15899592086427866
-31
-1.1551011438751944
-12
-0.15614116177259163
-22
-0.15899592086427866
-32
-1.1551011438751944
-13
-0.15614116177259163
-23
-0.15899592086427866
-33
-1.1551011438751944
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.15614116177259163
-20
-0.15899592086427866
-30
-1.1551011438751944
-11
--0.15614116177258947
-21
-0.15899592086427866
-31
-1.1551011438751944
-12
--0.15510247388785273
-22
-0.15899592086427866
-32
-1.1558981571212381
-13
--0.15510247388785273
-23
-0.15899592086427866
-33
-1.1558981571212381
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.15614116177259163
-20
-0.15899592086427866
-30
-1.1551011438751944
-11
--0.15510247388785273
-21
-0.15899592086427866
-31
-1.1558981571212381
-12
-0.110408474311746
-22
-0.15899592086427866
-32
-1.1901930691967098
-13
-0.110408474311746
-23
-0.15899592086427866
-33
-1.1901930691967098
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.110408474311746
-20
-0.15899592086427866
-30
-1.1901930691967098
-11
--0.15510247388785273
-21
-0.15899592086427866
-31
-1.1558981571212381
-12
--0.11040847431174272
-22
-0.15899592086427866
-32
-1.1901930691967098
-13
--0.11040847431174272
-23
-0.15899592086427866
-33
-1.1901930691967098
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.110408474311746
-20
-0.15899592086427866
-30
-1.1901930691967098
-11
--0.11040847431174272
-21
-0.15899592086427866
-31
-1.1901930691967098
-12
--0.0571516317851824
-22
-0.15899592086427866
-32
-1.2122527756603774
-13
--0.0571516317851824
-23
-0.15899592086427866
-33
-1.2122527756603774
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.110408474311746
-20
-0.15899592086427866
-30
-1.1901930691967098
-11
--0.0571516317851824
-21
-0.15899592086427866
-31
-1.2122527756603774
-12
-0.057151631785184565
-22
-0.15899592086427866
-32
-1.2122527756603774
-13
-0.057151631785184565
-23
-0.15899592086427866
-33
-1.2122527756603774
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.057151631785184565
-20
-0.15899592086427866
-30
-1.2122527756603774
-11
--0.0571516317851824
-21
-0.15899592086427866
-31
-1.2122527756603774
-12
-1.0547118733938987e-15
-22
-0.15899592086427866
-32
-1.2197769307260904
-13
-1.0547118733938987e-15
-23
-0.15899592086427866
-33
-1.2197769307260904
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.22057527398480187
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
-0.2165682094492341
-21
-0.15899592086427866
-31
-0.9703590063073866
-12
-2.220446049250313e-15
-22
-0.15899592086427866
-32
-1.0007956832333833
-13
-2.220446049250313e-15
-23
-0.15899592086427866
-33
-1.0007956832333833
-70
-12
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.15693817501863658
-20
--1.887379141862766e-15
-30
-0.8438575082147456
-11
--0.2931142709759422
-21
-0.07853973219804244
-31
-0.7076814122574394
-12
--0.30391732134661864
-22
--2.3314683517128287e-15
-32
-0.696878361886763
-13
--0.30391732134661864
-23
--2.3314683517128287e-15
-33
-0.696878361886763
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2931142709759422
-20
-0.07853973219804244
-30
-0.7076814122574394
-11
--0.15693817501863658
-21
--1.887379141862766e-15
-31
-0.8438575082147456
-12
--0.2616302453704491
-22
-0.1510522925927807
-32
-0.7391654378629331
-13
--0.2616302453704491
-23
-0.1510522925927807
-33
-0.7391654378629331
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2616302453704491
-20
-0.1510522925927807
-30
-0.7391654378629331
-11
--0.15693817501863658
-21
--1.887379141862766e-15
-31
-0.8438575082147456
-12
--0.21211943838078534
-22
-0.21211943838079228
-32
-0.788676244852598
-13
--0.21211943838078534
-23
-0.21211943838079228
-33
-0.788676244852598
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.21211943838078534
-20
-0.21211943838079228
-30
-0.788676244852598
-11
--0.15693817501863658
-21
--1.887379141862766e-15
-31
-0.8438575082147456
-12
--0.15693817501863377
-22
-0.15899592086427866
-32
-0.8438575082147479
-13
--0.15693817501863377
-23
-0.15899592086427866
-33
-0.8438575082147479
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.21211943838078534
-20
-0.21211943838079228
-30
-0.788676244852598
-11
--0.15693817501863377
-21
-0.15899592086427866
-31
-0.8438575082147479
-12
--0.1486302864960926
-22
-0.25743520775475925
-32
-0.8521653967372884
-13
--0.1486302864960926
-23
-0.25743520775475925
-33
-0.8521653967372884
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.1486302864960926
-20
-0.25743520775475925
-30
-0.8521653967372884
-11
--0.15693817501863377
-21
-0.15899592086427866
-31
-0.8438575082147479
-12
-2.220446049250313e-15
-22
-0.15899592086427866
-32
-1.0007956832333833
-13
-2.220446049250313e-15
-23
-0.15899592086427866
-33
-1.0007956832333833
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.1486302864960926
-20
-0.25743520775475925
-30
-0.8521653967372884
-11
-2.220446049250313e-15
-21
-0.15899592086427866
-31
-1.0007956832333833
-12
--0.07613234059483498
-22
-0.2841297631990751
-32
-0.9246633426385472
-13
--0.07613234059483498
-23
-0.2841297631990751
-33
-0.9246633426385472
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.07613234059483498
-20
-0.2841297631990751
-30
-0.9246633426385472
-11
-2.220446049250313e-15
-21
-0.15899592086427866
-31
-1.0007956832333833
-12
-2.220446049250313e-15
-22
-0.2908891820000008
-32
-1.0007956832333833
-13
-2.220446049250313e-15
-23
-0.2908891820000008
-33
-1.0007956832333833
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2931142709759422
-20
-0.07853973219804244
-30
-0.7076814122574394
-11
--0.32007010417162757
-21
--2.220446049250313e-15
-31
-0.3200701041716287
-12
--0.30391732134661864
-22
--2.3314683517128287e-15
-32
-0.696878361886763
-13
--0.30391732134661864
-23
--2.3314683517128287e-15
-33
-0.696878361886763
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.32007010417162757
-20
--2.220446049250313e-15
-30
-0.3200701041716287
-11
--0.2931142709759422
-21
-0.07853973219804244
-31
-0.7076814122574394
-12
--0.3095976113128597
-22
-0.08295642992988683
-32
-0.30959761131286023
-13
--0.3095976113128597
-23
-0.08295642992988683
-33
-0.30959761131286023
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.16339321594943848
-20
-0.2830053516365104
-30
-0.16339321594944067
-11
--0.07613234059483498
-21
-0.2841297631990751
-31
-0.9246633426385472
-12
--0.0854433972629631
-22
-0.3188790997566827
-32
-0.08544339726296475
-13
--0.0854433972629631
-23
-0.3188790997566827
-33
-0.08544339726296475
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.07613234059483498
-20
-0.2841297631990751
-30
-0.9246633426385472
-11
--0.16339321594943848
-21
-0.2830053516365104
-31
-0.16339321594944067
-12
--0.1486302864960926
-22
-0.25743520775475925
-32
-0.8521653967372884
-13
--0.1486302864960926
-23
-0.25743520775475925
-33
-0.8521653967372884
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2616302453704491
-20
-0.1510522925927807
-30
-0.7391654378629331
-11
--0.3095976113128597
-21
-0.08295642992988683
-31
-0.30959761131286023
-12
--0.2931142709759422
-22
-0.07853973219804244
-32
-0.7076814122574394
-13
--0.2931142709759422
-23
-0.07853973219804244
-33
-0.7076814122574394
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.3095976113128597
-20
-0.08295642992988683
-30
-0.30959761131286023
-11
--0.2616302453704491
-21
-0.1510522925927807
-31
-0.7391654378629331
-12
--0.27872379164223104
-22
-0.16092125613419955
-32
-0.27872379164223327
-13
--0.27872379164223104
-23
-0.16092125613419955
-33
-0.27872379164223327
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.21211943838078534
-20
-0.21211943838079228
-30
-0.788676244852598
-11
--0.27872379164223104
-21
-0.16092125613419955
-31
-0.27872379164223327
-12
--0.2616302453704491
-22
-0.1510522925927807
-32
-0.7391654378629331
-13
--0.2616302453704491
-23
-0.1510522925927807
-33
-0.7391654378629331
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.27872379164223104
-20
-0.16092125613419955
-30
-0.27872379164223327
-11
--0.21211943838078534
-21
-0.21211943838079228
-31
-0.788676244852598
-12
--0.22908176290007004
-22
-0.22908176290007598
-32
-0.22908176290007168
-13
--0.22908176290007004
-23
-0.22908176290007598
-33
-0.22908176290007168
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.3095976113128597
-20
-0.08295642992988683
-30
-0.30959761131286023
-11
--0.18812188165369356
-21
--1.887379141862766e-15
-31
-0.1881218816536935
-12
--0.32007010417162757
-22
--2.220446049250313e-15
-32
-0.3200701041716287
-13
--0.32007010417162757
-23
--2.220446049250313e-15
-33
-0.3200701041716287
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.18812188165369356
-20
--1.887379141862766e-15
-30
-0.1881218816536935
-11
--0.3095976113128597
-21
-0.08295642992988683
-31
-0.30959761131286023
-12
--0.18812188165372323
-22
-0.1915613504388899
-32
-0.18812188165372262
-13
--0.18812188165372323
-23
-0.1915613504388899
-33
-0.18812188165372262
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.18812188165372323
-20
-0.1915613504388899
-30
-0.18812188165372262
-11
--0.3095976113128597
-21
-0.08295642992988683
-31
-0.30959761131286023
-12
--0.27872379164223104
-22
-0.16092125613419955
-32
-0.27872379164223327
-13
--0.27872379164223104
-23
-0.16092125613419955
-33
-0.27872379164223327
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.18812188165372323
-20
-0.1915613504388899
-30
-0.18812188165372262
-11
--0.27872379164223104
-21
-0.16092125613419955
-31
-0.27872379164223327
-12
--0.22908176290007004
-22
-0.22908176290007598
-32
-0.22908176290007168
-13
--0.22908176290007004
-23
-0.22908176290007598
-33
-0.22908176290007168
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.18812188165372323
-20
-0.1915613504388899
-30
-0.18812188165372262
-11
--0.22908176290007004
-21
-0.22908176290007598
-31
-0.22908176290007168
-12
-1.6653345369377348e-15
-22
-0.19156135043889
-32
-0.0
-13
-1.6653345369377348e-15
-23
-0.19156135043889
-33
-0.0
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-1.6653345369377348e-15
-20
-0.19156135043889
-30
-0.0
-11
--0.22908176290007004
-21
-0.22908176290007598
-31
-0.22908176290007168
-12
-2.220446049250313e-15
-22
-0.33379067100000115
-32
--2.2379254005500117e-15
-13
-2.220446049250313e-15
-23
-0.33379067100000115
-33
--2.2379254005500117e-15
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.33379067100000115
-30
--2.2379254005500117e-15
-11
--0.22908176290007004
-21
-0.22908176290007598
-31
-0.22908176290007168
-12
--0.16339321594943848
-22
-0.2830053516365104
-32
-0.16339321594944067
-13
--0.16339321594943848
-23
-0.2830053516365104
-33
-0.16339321594944067
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.33379067100000115
-30
--2.2379254005500117e-15
-11
--0.16339321594943848
-21
-0.2830053516365104
-31
-0.16339321594944067
-12
--0.0854433972629631
-22
-0.3188790997566827
-32
-0.08544339726296475
-13
--0.0854433972629631
-23
-0.3188790997566827
-33
-0.08544339726296475
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.22908176290007004
-20
-0.22908176290007598
-30
-0.22908176290007168
-11
--0.1486302864960926
-21
-0.25743520775475925
-31
-0.8521653967372884
-12
--0.16339321594943848
-22
-0.2830053516365104
-32
-0.16339321594944067
-13
--0.16339321594943848
-23
-0.2830053516365104
-33
-0.16339321594944067
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.1486302864960926
-20
-0.25743520775475925
-30
-0.8521653967372884
-11
--0.22908176290007004
-21
-0.22908176290007598
-31
-0.22908176290007168
-12
--0.21211943838078534
-22
-0.21211943838079228
-32
-0.788676244852598
-13
--0.21211943838078534
-23
-0.21211943838079228
-33
-0.788676244852598
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.19123308709410364
-20
-0.15899592086427866
-30
-0.8885515077908579
-11
--0.15693817501863658
-21
--1.887379141862766e-15
-31
-0.8438575082147456
-12
--0.19123308709410083
-22
--1.887379141862766e-15
-32
-0.8885515077908601
-13
--0.19123308709410083
-23
--1.887379141862766e-15
-33
-0.8885515077908601
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.15693817501863658
-20
--1.887379141862766e-15
-30
-0.8438575082147456
-11
--0.19123308709410364
-21
-0.15899592086427866
-31
-0.8885515077908579
-12
--0.15693817501863377
-22
-0.15899592086427866
-32
-0.8438575082147479
-13
--0.15693817501863377
-23
-0.15899592086427866
-33
-0.8438575082147479
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.11040847431174217
-20
--1.887379141862766e-15
-30
-1.1901930691967075
-11
--0.0571516317851824
-21
-0.15899592086427866
-31
-1.2122527756603774
-12
--0.11040847431174272
-22
-0.15899592086427866
-32
-1.1901930691967098
-13
--0.11040847431174272
-23
-0.15899592086427866
-33
-1.1901930691967098
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.0571516317851824
-20
-0.15899592086427866
-30
-1.2122527756603774
-11
--0.11040847431174217
-21
--1.887379141862766e-15
-31
-1.1901930691967075
-12
--0.0571516317851824
-22
--1.887379141862766e-15
-32
-1.212252775660373
-13
--0.0571516317851824
-23
--1.887379141862766e-15
-33
-1.212252775660373
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2208169486234871
-20
-0.15899592086427866
-30
-0.9989599821026028
-11
--0.2132927935577707
-21
--1.887379141862766e-15
-31
-0.9418083503174198
-12
--0.22081694862348375
-22
--1.887379141862766e-15
-32
-0.9989599821026028
-13
--0.22081694862348375
-23
--1.887379141862766e-15
-33
-0.9989599821026028
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2132927935577707
-20
--1.887379141862766e-15
-30
-0.9418083503174198
-11
--0.2208169486234871
-21
-0.15899592086427866
-31
-0.9989599821026028
-12
--0.21329279355777295
-22
-0.15899592086427866
-32
-0.9418083503174176
-13
--0.21329279355777295
-23
-0.15899592086427866
-33
-0.9418083503174176
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.21329279355777295
-20
-0.15899592086427866
-30
-0.9418083503174176
-11
--0.19123308709410083
-21
--1.887379141862766e-15
-31
-0.8885515077908601
-12
--0.2132927935577707
-22
--1.887379141862766e-15
-32
-0.9418083503174198
-13
--0.2132927935577707
-23
--1.887379141862766e-15
-33
-0.9418083503174198
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.19123308709410083
-20
--1.887379141862766e-15
-30
-0.8885515077908601
-11
--0.21329279355777295
-21
-0.15899592086427866
-31
-0.9418083503174176
-12
--0.19123308709410364
-22
-0.15899592086427866
-32
-0.8885515077908579
-13
--0.19123308709410364
-23
-0.15899592086427866
-33
-0.8885515077908579
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.21329279355777295
-20
-0.15899592086427866
-30
-1.056111613887788
-11
--0.22057527398479468
-21
--1.3877787807814457e-15
-31
-1.0007956832333833
-12
--0.21329279355776792
-22
--1.887379141862766e-15
-32
-1.0561116138877857
-13
--0.21329279355776792
-23
--1.887379141862766e-15
-33
-1.0561116138877857
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.22057527398479468
-20
--1.3877787807814457e-15
-30
-1.0007956832333833
-11
--0.2208169486234871
-21
-0.15899592086427866
-31
-0.9989599821026028
-12
--0.22081694862348375
-22
--1.887379141862766e-15
-32
-0.9989599821026028
-13
--0.22081694862348375
-23
--1.887379141862766e-15
-33
-0.9989599821026028
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.2208169486234871
-20
-0.15899592086427866
-30
-0.9989599821026028
-11
--0.22057527398479468
-21
--1.3877787807814457e-15
-31
-1.0007956832333833
-12
--0.21329279355777295
-22
-0.15899592086427866
-32
-1.056111613887788
-13
--0.21329279355777295
-23
-0.15899592086427866
-33
-1.056111613887788
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.15614116177258947
-20
-0.15899592086427866
-30
-1.1551011438751944
-11
--0.19123308709409917
-21
--1.887379141862766e-15
-31
-1.1093684564143433
-12
--0.15614116177258947
-22
--1.887379141862766e-15
-32
-1.1551011438751921
-13
--0.15614116177258947
-23
--1.887379141862766e-15
-33
-1.1551011438751921
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.19123308709409917
-20
--1.887379141862766e-15
-30
-1.1093684564143433
-11
--0.15614116177258947
-21
-0.15899592086427866
-31
-1.1551011438751944
-12
--0.19123308709410364
-22
-0.15899592086427866
-32
-1.1093684564143456
-13
--0.19123308709410364
-23
-0.15899592086427866
-33
-1.1093684564143456
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.11040847431174217
-20
--1.887379141862766e-15
-30
-1.1901930691967075
-11
--0.15614116177258947
-21
-0.15899592086427866
-31
-1.1551011438751944
-12
--0.15614116177258947
-22
--1.887379141862766e-15
-32
-1.1551011438751921
-13
--0.15614116177258947
-23
--1.887379141862766e-15
-33
-1.1551011438751921
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.15614116177258947
-20
-0.15899592086427866
-30
-1.1551011438751944
-11
--0.11040847431174217
-21
--1.887379141862766e-15
-31
-1.1901930691967075
-12
--0.15510247388785273
-22
-0.15899592086427866
-32
-1.1558981571212381
-13
--0.15510247388785273
-23
-0.15899592086427866
-33
-1.1558981571212381
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.15510247388785273
-20
-0.15899592086427866
-30
-1.1558981571212381
-11
--0.11040847431174217
-21
--1.887379141862766e-15
-31
-1.1901930691967075
-12
--0.11040847431174272
-22
-0.15899592086427866
-32
-1.1901930691967098
-13
--0.11040847431174272
-23
-0.15899592086427866
-33
-1.1901930691967098
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.19123308709410364
-20
-0.15899592086427866
-30
-1.1093684564143456
-11
--0.21329279355776792
-21
--1.887379141862766e-15
-31
-1.0561116138877857
-12
--0.19123308709409917
-22
--1.887379141862766e-15
-32
-1.1093684564143433
-13
--0.19123308709409917
-23
--1.887379141862766e-15
-33
-1.1093684564143433
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.21329279355776792
-20
--1.887379141862766e-15
-30
-1.0561116138877857
-11
--0.19123308709410364
-21
-0.15899592086427866
-31
-1.1093684564143456
-12
--0.21329279355777295
-22
-0.15899592086427866
-32
-1.056111613887788
-13
--0.21329279355777295
-23
-0.15899592086427866
-33
-1.056111613887788
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.21329279355777625
-20
-0.15899592086427866
-30
-1.056111613887788
-11
-0.1912330870941092
-21
--1.887379141862766e-15
-31
-1.10936845641435
-12
-0.21329279355777625
-22
--1.887379141862766e-15
-32
-1.0561116138877857
-13
-0.21329279355777625
-23
--1.887379141862766e-15
-33
-1.0561116138877857
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.1912330870941092
-20
--1.887379141862766e-15
-30
-1.10936845641435
-11
-0.21329279355777625
-21
-0.15899592086427866
-31
-1.056111613887788
-12
-0.19123308709410575
-22
-0.15899592086427866
-32
-1.1093684564143456
-13
-0.19123308709410575
-23
-0.15899592086427866
-33
-1.1093684564143456
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-1.6653345369377348e-15
-20
--1.887379141862766e-15
-30
-1.2197769307260882
-11
-0.057151631785184565
-21
-0.15899592086427866
-31
-1.2122527756603774
-12
-1.0547118733938987e-15
-22
-0.15899592086427866
-32
-1.2197769307260904
-13
-1.0547118733938987e-15
-23
-0.15899592086427866
-33
-1.2197769307260904
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.057151631785184565
-20
-0.15899592086427866
-30
-1.2122527756603774
-11
-1.6653345369377348e-15
-21
--1.887379141862766e-15
-31
-1.2197769307260882
-12
-0.057151631785183454
-22
--1.887379141862766e-15
-32
-1.2122527756603774
-13
-0.057151631785183454
-23
--1.887379141862766e-15
-33
-1.2122527756603774
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.11040847431174489
-20
--1.887379141862766e-15
-30
-1.1901930691967098
-11
-0.057151631785184565
-21
-0.15899592086427866
-31
-1.2122527756603774
-12
-0.057151631785183454
-22
--1.887379141862766e-15
-32
-1.2122527756603774
-13
-0.057151631785183454
-23
--1.887379141862766e-15
-33
-1.2122527756603774
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.057151631785184565
-20
-0.15899592086427866
-30
-1.2122527756603774
-11
-0.11040847431174489
-21
--1.887379141862766e-15
-31
-1.1901930691967098
-12
-0.110408474311746
-22
-0.15899592086427866
-32
-1.1901930691967098
-13
-0.110408474311746
-23
-0.15899592086427866
-33
-1.1901930691967098
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.22057527398480187
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
-0.21329279355777625
-21
--1.887379141862766e-15
-31
-1.0561116138877857
-12
-0.22057527398480187
-22
--1.887379141862766e-15
-32
-1.0007956832333833
-13
-0.22057527398480187
-23
--1.887379141862766e-15
-33
-1.0007956832333833
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.21329279355777625
-20
--1.887379141862766e-15
-30
-1.0561116138877857
-11
-0.22057527398480187
-21
-0.15899592086427866
-31
-1.0007956832333833
-12
-0.21329279355777625
-22
-0.15899592086427866
-32
-1.056111613887788
-13
-0.21329279355777625
-23
-0.15899592086427866
-33
-1.056111613887788
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-1.6653345369377348e-15
-20
--1.887379141862766e-15
-30
-1.2197769307260882
-11
--0.0571516317851824
-21
-0.15899592086427866
-31
-1.2122527756603774
-12
--0.0571516317851824
-22
--1.887379141862766e-15
-32
-1.212252775660373
-13
--0.0571516317851824
-23
--1.887379141862766e-15
-33
-1.212252775660373
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
--0.0571516317851824
-20
-0.15899592086427866
-30
-1.2122527756603774
-11
-1.6653345369377348e-15
-21
--1.887379141862766e-15
-31
-1.2197769307260882
-12
-1.0547118733938987e-15
-22
-0.15899592086427866
-32
-1.2197769307260904
-13
-1.0547118733938987e-15
-23
-0.15899592086427866
-33
-1.2197769307260904
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.15614116177259496
-20
--1.887379141862766e-15
-30
-1.1551011438751944
-11
-0.110408474311746
-21
-0.15899592086427866
-31
-1.1901930691967098
-12
-0.11040847431174489
-22
--1.887379141862766e-15
-32
-1.1901930691967098
-13
-0.11040847431174489
-23
--1.887379141862766e-15
-33
-1.1901930691967098
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.110408474311746
-20
-0.15899592086427866
-30
-1.1901930691967098
-11
-0.15614116177259496
-21
--1.887379141862766e-15
-31
-1.1551011438751944
-12
-0.15614116177259163
-22
-0.15899592086427866
-32
-1.1551011438751944
-13
-0.15614116177259163
-23
-0.15899592086427866
-33
-1.1551011438751944
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.19123308709410575
-20
-0.15899592086427866
-30
-1.1093684564143456
-11
-0.15614116177259496
-21
--1.887379141862766e-15
-31
-1.1551011438751944
-12
-0.1912330870941092
-22
--1.887379141862766e-15
-32
-1.10936845641435
-13
-0.1912330870941092
-23
--1.887379141862766e-15
-33
-1.10936845641435
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.15614116177259496
-20
--1.887379141862766e-15
-30
-1.1551011438751944
-11
-0.19123308709410575
-21
-0.15899592086427866
-31
-1.1093684564143456
-12
-0.15614116177259163
-22
-0.15899592086427866
-32
-1.1551011438751944
-13
-0.15614116177259163
-23
-0.15899592086427866
-33
-1.1551011438751944
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.33379067100000115
-30
--2.2379254005500117e-15
-11
-0.26121143822087073
-21
-0.19156135043888944
-31
-0.036710873561373786
-12
-1.6653345369377348e-15
-22
-0.19156135043889
-32
-0.0
-13
-1.6653345369377348e-15
-23
-0.19156135043889
-33
-0.0
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-0.19156135043888944
-30
-0.036710873561373786
-11
-2.220446049250313e-15
-21
-0.33379067100000115
-31
--2.2379254005500117e-15
-12
-0.08625688360556105
-22
-0.3219150721185059
-32
-0.012122614420753606
-13
-0.08625688360556105
-23
-0.3219150721185059
-33
-0.012122614420753606
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-0.19156135043888944
-30
-0.036710873561373786
-11
-0.08625688360556105
-21
-0.3219150721185059
-31
-0.012122614420753606
-12
-0.1663941050906908
-22
-0.28820304409702857
-32
-0.023385166419002953
-13
-0.1663941050906908
-23
-0.28820304409702857
-33
-0.023385166419002953
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-0.19156135043888944
-30
-0.036710873561373786
-11
-0.1663941050906908
-21
-0.28820304409702857
-31
-0.023385166419002953
-12
-0.23502443164595715
-22
-0.235024431645955
-32
-0.03303052979897671
-13
-0.23502443164595715
-23
-0.235024431645955
-33
-0.03303052979897671
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-0.19156135043888944
-30
-0.036710873561373786
-11
-0.23502443164595715
-21
-0.235024431645955
-31
-0.03303052979897671
-12
-0.2491438361672455
-22
-0.21648512794230157
-32
-0.035014882695901035
-13
-0.2491438361672455
-23
-0.21648512794230157
-33
-0.035014882695901035
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-0.19156135043888944
-30
-0.036710873561373786
-11
-0.2491438361672455
-21
-0.21648512794230157
-31
-0.035014882695901035
-12
-0.2875708080778629
-22
-0.16602908345483203
-32
-0.04041544140330445
-13
-0.2875708080778629
-23
-0.16602908345483203
-33
-0.04041544140330445
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-0.19156135043888944
-30
-0.036710873561373786
-11
-0.2875708080778629
-21
-0.16602908345483203
-31
-0.04041544140330445
-12
-0.26121143822087073
-22
-1.1102230246251565e-16
-32
-0.036710873561373786
-13
-0.26121143822087073
-23
-1.1102230246251565e-16
-33
-0.036710873561373786
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.26121143822087073
-20
-1.1102230246251565e-16
-30
-0.036710873561373786
-11
-0.2875708080778629
-21
-0.16602908345483203
-31
-0.04041544140330445
-12
-0.3317917526381973
-22
-4.440892098500626e-16
-32
-0.046630289863139704
-13
-0.3317917526381973
-23
-4.440892098500626e-16
-33
-0.046630289863139704
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.3317917526381973
-20
-4.440892098500626e-16
-30
-0.046630289863139704
-11
-0.2875708080778629
-21
-0.16602908345483203
-31
-0.04041544140330445
-12
-0.32055163282900784
-22
-0.08589155114901104
-32
-0.045050594043002004
-13
-0.32055163282900784
-23
-0.08589155114901104
-33
-0.045050594043002004
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.07540523862764037
-20
-0.28141618171520544
-30
-0.9901981680557236
-11
-0.1663941050906908
-21
-0.28820304409702857
-31
-0.023385166419002953
-12
-0.08625688360556105
-22
-0.3219150721185059
-32
-0.012122614420753606
-13
-0.08625688360556105
-23
-0.3219150721185059
-33
-0.012122614420753606
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.1663941050906908
-20
-0.28820304409702857
-30
-0.023385166419002953
-11
-0.07540523862764037
-21
-0.28141618171520544
-31
-0.9901981680557236
-12
-0.14588403875819583
-22
-0.25267856714253933
-32
-0.9802930186565522
-13
-0.14588403875819583
-23
-0.25267856714253933
-33
-0.9802930186565522
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.2875708080778629
-20
-0.16602908345483203
-30
-0.04041544140330445
-11
-0.20656971000640417
-21
-0.20656971000640245
-31
-0.9717642037648546
-12
-0.25323868698207214
-22
-0.14620742409832682
-32
-0.9652053067859873
-13
-0.25323868698207214
-23
-0.14620742409832682
-33
-0.9652053067859873
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.20656971000640417
-20
-0.20656971000640245
-30
-0.9717642037648546
-11
-0.2875708080778629
-21
-0.16602908345483203
-31
-0.04041544140330445
-12
-0.2491438361672455
-22
-0.21648512794230157
-32
-0.035014882695901035
-13
-0.2491438361672455
-23
-0.21648512794230157
-33
-0.035014882695901035
-70
-13
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.20656971000640417
-20
-0.20656971000640245
-30
-0.9717642037648546
-11
-0.2491438361672455
-21
-0.21648512794230157
-31
-0.035014882695901035
-12
-0.23502443164595715
-22
-0.235024431645955
-32
-0.03303052979897671
-13
-0.23502443164595715
-23
-0.235024431645955
-33
-0.03303052979897671
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.3317917526381973
-20
-4.440892098500626e-16
-30
-0.046630289863139704
-11
-0.2826220454264932
-21
-0.07572834883526192
-31
-0.9610757450638483
-12
-0.2926523001357429
-22
-3.885780586188048e-16
-32
-0.9596660846947334
-13
-0.2926523001357429
-23
-3.885780586188048e-16
-33
-0.9596660846947334
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.2826220454264932
-20
-0.07572834883526192
-30
-0.9610757450638483
-11
-0.3317917526381973
-21
-4.440892098500626e-16
-31
-0.046630289863139704
-12
-0.32055163282900784
-22
-0.08589155114901104
-32
-0.045050594043002004
-13
-0.32055163282900784
-23
-0.08589155114901104
-33
-0.045050594043002004
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.14588403875819583
-20
-0.25267856714253933
-30
-0.9802930186565522
-11
-0.23502443164595715
-21
-0.235024431645955
-31
-0.03303052979897671
-12
-0.1663941050906908
-22
-0.28820304409702857
-32
-0.023385166419002953
-13
-0.1663941050906908
-23
-0.28820304409702857
-33
-0.023385166419002953
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.23502443164595715
-20
-0.235024431645955
-30
-0.03303052979897671
-11
-0.14588403875819583
-21
-0.25267856714253933
-31
-0.9802930186565522
-12
-0.20656971000640417
-22
-0.20656971000640245
-32
-0.9717642037648546
-13
-0.20656971000640417
-23
-0.20656971000640245
-33
-0.9717642037648546
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.32055163282900784
-20
-0.08589155114901104
-30
-0.045050594043002004
-11
-0.25323868698207214
-21
-0.14620742409832682
-31
-0.9652053067859873
-12
-0.2826220454264932
-22
-0.07572834883526192
-32
-0.9610757450638483
-13
-0.2826220454264932
-23
-0.07572834883526192
-33
-0.9610757450638483
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.25323868698207214
-20
-0.14620742409832682
-30
-0.9652053067859873
-11
-0.32055163282900784
-21
-0.08589155114901104
-31
-0.045050594043002004
-12
-0.2875708080778629
-22
-0.16602908345483203
-32
-0.04041544140330445
-13
-0.2875708080778629
-23
-0.16602908345483203
-33
-0.04041544140330445
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.2165682094492341
-20
--8.326672684688674e-16
-30
-0.9703590063073866
-11
-0.22057527398480187
-21
-0.15899592086427866
-31
-1.0007956832333833
-12
-0.22057527398480187
-22
--1.887379141862766e-15
-32
-1.0007956832333833
-13
-0.22057527398480187
-23
--1.887379141862766e-15
-33
-1.0007956832333833
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.22057527398480187
-20
-0.15899592086427866
-30
-1.0007956832333833
-11
-0.2165682094492341
-21
--8.326672684688674e-16
-31
-0.9703590063073866
-12
-0.2165682094492341
-22
-0.15899592086427866
-32
-0.9703590063073866
-13
-0.2165682094492341
-23
-0.15899592086427866
-33
-0.9703590063073866
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.2926523001357429
-20
-3.885780586188048e-16
-30
-0.9596660846947334
-11
-0.2165682094492341
-21
-0.15899592086427866
-31
-0.9703590063073866
-12
-0.2165682094492341
-22
--8.326672684688674e-16
-32
-0.9703590063073866
-13
-0.2165682094492341
-23
--8.326672684688674e-16
-33
-0.9703590063073866
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.2165682094492341
-20
-0.15899592086427866
-30
-0.9703590063073866
-11
-0.2926523001357429
-21
-3.885780586188048e-16
-31
-0.9596660846947334
-12
-0.25323868698207214
-22
-0.14620742409832682
-32
-0.9652053067859873
-13
-0.25323868698207214
-23
-0.14620742409832682
-33
-0.9652053067859873
-70
-15
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.25323868698207214
-20
-0.14620742409832682
-30
-0.9652053067859873
-11
-0.2926523001357429
-21
-3.885780586188048e-16
-31
-0.9596660846947334
-12
-0.2826220454264932
-22
-0.07572834883526192
-32
-0.9610757450638483
-13
-0.2826220454264932
-23
-0.07572834883526192
-33
-0.9610757450638483
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.2165682094492341
-20
-0.15899592086427866
-30
-0.9703590063073866
-11
-2.220446049250313e-15
-21
-0.2908891820000008
-31
-1.0007956832333833
-12
-2.220446049250313e-15
-22
-0.15899592086427866
-32
-1.0007956832333833
-13
-2.220446049250313e-15
-23
-0.15899592086427866
-33
-1.0007956832333833
-70
-1
- 0
-3DFACE
- 8
-finger intermediate
-10
-2.220446049250313e-15
-20
-0.2908891820000008
-30
-1.0007956832333833
-11
-0.2165682094492341
-21
-0.15899592086427866
-31
-0.9703590063073866
-12
-0.07540523862764037
-22
-0.28141618171520544
-32
-0.9901981680557236
-13
-0.07540523862764037
-23
-0.28141618171520544
-33
-0.9901981680557236
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.07540523862764037
-20
-0.28141618171520544
-30
-0.9901981680557236
-11
-0.2165682094492341
-21
-0.15899592086427866
-31
-0.9703590063073866
-12
-0.14588403875819583
-22
-0.25267856714253933
-32
-0.9802930186565522
-13
-0.14588403875819583
-23
-0.25267856714253933
-33
-0.9802930186565522
-70
-3
- 0
-3DFACE
- 8
-finger intermediate
-10
-0.14588403875819583
-20
-0.25267856714253933
-30
-0.9802930186565522
-11
-0.2165682094492341
-21
-0.15899592086427866
-31
-0.9703590063073866
-12
-0.20656971000640417
-22